第一篇:INTEL 80386 程序員參考手冊(第一章)
第一章 80386介紹
80386是一款32位處理器,為多任務操作系統作了優化,為需要很高性能的應用程序而設計。32位寄存器和數據通道支持32位地址和數據原型。處理器可以尋址4G物理存儲器和64T(264 字節)虛擬存儲器。片上儲存期管理部件包括地址轉換寄存器,高級多任務固件,保護機制,以及頁虛擬存儲器。專用的調試寄存器即使在ROM程序中也能夠提供數據和代碼中斷點。
1.1 該手冊的組織結構
該書從5個方面闡述了80386的體系結構:
第I部分
- 應用程序 第II部分 - 系統編程 第III部分 - 兼容性 第IV部分 - 指令集 附錄
上面的分類一方面取決于體系結構本身,一方面取決于使用這本書的不同方式。入下表所示,后面的2部分旨在作為參考手冊來幫組那些致力于在80386上開發軟件的程序員。前面的3部分則是理論說明,它們說明體系結構的用途,解釋術語和概念,描述那些或與專屬用途相關,或與專屬體系結構相關的指令。
解釋說明
第I部分
- 應用程序
第II部分 - 系統編程 第III部分 - 兼容性
參考 第IV部分 附錄
- 指令集
前面的3部分陳述了80386 CPU的執行模式和保護特性。應用特性和系統特性的區別由80386的保護機制決定。保護機制的主要用意在于是操作系統免于應用的干擾;因此,處理器使得一些寄存器和和指令不能被應用程序訪問。第I部分討論的是可以被應用訪問的特性;第II部分討論的特性只能由授權的系統軟件或在非保護模式下訪問。
80386的處理模式同樣控制著可訪問的特性。80386有3種處理模式:
1. 保護模式。2. 實地址模式。3. 虛擬8086模式。保護模式是80386處理器的正常的32位環境。在這種模式下,所有的指令和特性均可使用。
上電后處理器即進入實地址模式(經常簡稱為“實模式”)。實地址模式下,80386看起來像是一個更快速的,增加了一些新指令的8086。大多數80386軟件在實地址模式下只是進行一些初始化操作。
虛擬8086模式(也常被稱作“V86模式”)是一種動態模式,在這種意思上說,處理器可以頻繁,快速的在V86模式和保護模式之間切換。CPU從保護模式進入V86模式去執行8086程序,然后再離開V86模式,進入保護模式繼續執行原來的80386程序。
在保護模式下可使用的任何特性在V86模式下對于所有程序來說是一樣的。這些特性構成了第I部分。在保護模式下系統軟件可以使用的其他一些特性組成了第II部分。第III部分闡述了實地址模式和V86模式,也包括如何執行一個32位和16位的混合程序。
所有模式下可使用
第I部分-應用程序 只能在保護模式下使用 第II部分-系統編程 兼容模式
第III部分-兼容性
1.1.1 第I部分-應用編程
這部分呈現的是通常被應用程序員使用的特性。
第2章-基本編程模型:介紹了存儲器的組織結構模型。定義數據類型。列舉應用程序使用的寄存器集合。介紹堆棧。說明字符串操作。定義指令的組成。解釋了地址計算。介紹應用程序可能用到的阿中斷和異常。
第3章-應用指令集:縱覽應用程序經常使用的指令。將指令按照功能分組;例如,字符串指令被分在一組,控制-傳輸指令被分在另一組。解釋指令的概念。關于單個指令的詳細介紹被放到了第IV部分,指令集參考。
1.1.2 第II部分-系統編程
這部分闡述的特性通常被下面的人使用:寫操作系統,設備驅動,調試器以及為80386保護模式下應用程序提供支持的其他軟件的人。
第4章-系統架構:縱覽系統程序員使用的各項特性。介紹在第I部分沒有提及的寄存器和數據結構。介紹面向系統的指令以及它們支持的寄存器和數據結構上下文。指出在在哪些章節可以找到寄存器,數據結構以及指令的詳細信息。
第5章-內存管理:闡述了支持虛擬存儲器的數據結構,寄存器以及指令的詳細結構,以及段和頁的概念。解釋了設計者怎樣選擇存儲器的組織模型,從完全線性(“平坦模式”)到使用頁和段。
第6章-保護:展開存儲器管理特性,包括它應用與斷和頁時的保護。說明了特權等級,堆棧切換,指針檢查以及用戶和超級用戶模式的實現。多任務的保護被推遲到后面的章節。
第7章-多任務:闡述了硬件如何通過上下文切換和任務間保護來支持多任務。
第8章-輸入/輸出:揭示I/O特性,包括I/O指令,I/O的保護,以及I/O許可映射。
第9章-異常和中斷:解釋了80386中斷的基本運行機制。中斷和異常怎樣和保護相聯系。討論了所有可能的異常,列舉了觸發條件和需要處理的信息,以及異常的恢復。
第10章-初始化:定義了處理器在復位或上電后的狀態。說明了為實地址模式和保護模式設置寄存器,標志位以及數據結構。包含一個初始化示例。
第11章-協處理和多處理:解釋了支持數字協處理器和共享存儲器的多CPU的指令。
第12章-調試:告訴我們怎樣使用調試寄存器。
1.1.3 第III部分-兼容性
本書的其他章節基本上把處理器看作是32位機器,為了簡單而省略了16操作部件。確實,80386是32位機器,但是它的設計完全支持16位的操作數和尋址。這部分通過對在32位程序中支持16位程序和16位操作數的說明完整的描述了80386的結構特性。所有的3種模式均可執行16位程序:保護模式可以直接執行80286保護模式下的16位程序,實地址模式執行8086程序和80286實地址模式程序,虛擬8086模式在多任務環境下和其他80386保護模式程序一起執行8086程序。另外,32位和16位模塊可以在保護模式下與32位和16位操作混合使用。
第13章-執行80286保護模式代碼:在保護模式下,80386完全可以執行80286保護模式代碼,因為80286是80386的子集。
第14章-80386實地址模式:說明80386的實地址模式。在這種模式下,80386看起來更像是一個快速的實地址模式下的80286,或增加了新指令的快速8086。
第15章-虛擬8086模式:80386能夠快速的在保護模式和虛擬8086模式之間切換。這使其有能力在32位“本地模式”程序之間執行8086的多道程序。
第16章-混合16位和32位編碼:即使在同一個程序或任務內,80386也能夠混合16位和32位編碼。而且,任何給定的模塊可以同時使用16位和32位操作數和地址。1.1.4 第IV部分-指令集
第I,II,III部分給出了指令和體系結構特定細節相關的總體描述,這部分用字母序列出了指令集,為匯編程序員,編寫調試器,編譯器,操作系統的人等提供了具體細節。指令介紹包括操作的邏輯描述,對標志位的影響,設置標志位的影響,操作數或地址長度屬性的影響,處理器模式的影響以及可能產生的異常。
1.1.5 附錄
附錄給出了編碼表和其他細節,它們被組織成了可以被匯編程序員和系統程序員快速索引的形式。
1.2 其他文獻
下面的書籍包含有關80386的其他資料。
● Introduction to the 80386, order number 231252 ● 80386 Hardware Reference Manual, order number 231732 ● 80386 System Software Writer's Guide, order number 231499 ● 80386 High Performance 32-bit Microprocessor with Integrated Memory Management(Data Sheet), order number 231630
1.3 符號轉換
本手冊在描述數據結構,指令助記符,十六進制數以及上標和下標時用了特殊的符號。下標用{}括起來,例如10{2} = 10 以2為基。上標用()加上前面的^來表示,例如,10^(3)= 10的3次冪。復習這些符號有助于以后的閱讀。
1.3.1 數據結構格式
在內存數據結構的示例圖中,低位地址出現在圖示的右邊;地址從右至左,從下往上遞增。位從右向左依次編號。圖1-1舉例說明了這種慣例。1.3.2 未定義位和軟件兼容性
在許多寄存器和存儲器的布局圖中,一些位被標記為未定義。當位標記為未定義(如圖1-1所示)時,將來的軟件將這些位按未定義來處理對于軟件兼容性非常重要。在處理未定義位時軟件應該遵循下列規則:
? 在測試含有未定義位的寄存器時,不要依賴這些位的狀態。在測試前要屏蔽掉這些未定義位。
? 在將寄存器的值拷貝到另一個寄存器時,不要依賴這些位。? 不要依賴于保留在已寫入未定義位的信息。? 裝載寄存器時,要始終把未定義位按0載入,或以之前存在寄存器中的值重新載入。
注意: 依賴于寄存器中的未定義位將導致軟件依賴于80386在處理這些位時的未指定的處理方式。如果將來的處理器使用了未定義位,那么依賴于這些位的軟件有不兼容的風險。任何軟件都要避免依賴于未定義的80386寄存器位。
1.3.3 指令操作數
當用符號表示指令時,你正在使用的是80386匯編指令集。在這個集合中,指令遵循下面的格式:
標號:前綴 助記符 參數1,參數2,參數3
這里: ? ? ? ? 標號是指令的標識符,后面跟冒號。前綴是一條指令前綴的可選保留名字。
助記符暗示指令執行的操作,操作碼中的一個保留字。
操作數參數1,參數2,參數3為可選項。可以有0-3個參數,取決于指令碼。當含有參數時,它們或者是立即數,或者是數據項的標識符。操作數標識符可以是寄存器的保留字,或者在其他程序中聲明(在例子中可能沒有這種形式),指向數據項。當修改數據的指令中含有兩個操作數時,右邊的是源操作數,左邊的是目的操作數。
例子:
LOADREG: MOV EAX, SUBTOTAL
本例中,LOADREG是標號,MOV是操作碼指令助記符,EAX是目的操作數,SUBTOTAL是源操作數。
1.3.4 十六進制數
十六進制數字后面加上H的字符串表示以16為基的數字。十六進制數字從下面的集合中選取(0,1,2,3,4,5,6,7,8,9, A, B, C, D, E, F)。某些情況下,特別是在程序語法例子中,一個前導零會被加在A-F前面。例如,0FH等于十進制的15。
1.3.5 上標和下標
本手冊使用特殊的符號來表示上標和下標。下標用{}括起來,例如10{2} = 10 以2為基。上標用()加上前面的^來表示,例如,10^(3)= 10的3次冪。
編者注:本手冊在適當的地方用實際形式來表示上標和下標。
第二篇:程序員入門進階手冊
這篇文章,我主要是讓你成為更為專業的入門程序員。請注意,此時,你可能需要讀一些比較枯燥的書,但我想說,這些是非常非常重要的。你一定要堅持住。
編程技能
在系統地學習編程技能之前,我希望你能先看一下 “ The Key To Accelerating Your Coding Skills”,這篇文章會告訴你如何有效地快速提高自己的編程能力。然后接下來是下面幾大塊內容,但還只是入門級的。
編程技巧方面這個階段,你可以開始了解一下 Java 語言了,我個人覺得 Java 是世界上目前為止綜合排名最好的語言。你一定要學好這門語言。推薦《Java 核心技術(卷 1)》,除了讓你了解 Java 的語法,它還會讓你了解面向對象編程是個什么概念(如果你覺得這本書有點深,那么,你可以降低難度看更為基礎的《Head First Java》)。然后,既然開始學習Java 了,那就一定要學 Spring,推薦看看《Spring in Action》或是直接從最新的 Spring Boot 開始,推薦看看《Spring Boot 實戰》。關于 Spring 的這兩本書,里面可能會有很多你從來沒有聽說過的東西,比如,IoC 和 AOP 之類的東西,能看懂多少就看懂多少,沒事兒。?
操作系統。這里你可以看看《鳥哥的 Linux 私房菜》,這本書會讓你對計算機和操作系統,以及 Linux 有一個非常全面的了解,并能夠管理或是操作好一個 Linux 系統。當然,這本書有很多比較專業的知識,你可能會看不懂,沒關系,就暫時略過就好了。這本書的確并不適合初學者,你能看多少就看多少吧。
? 網絡協議你需要系統地了解一下數據庫設計中的那些東西,這里推薦慕課網的一個在線課程--“數據庫設計的那些事”。每個小課程不過 5-6 分鐘,全部不到 2 個小時,我相信你一定能跟下來。你需要搞清楚數據的那幾個范式,還有 SQL 語句的一些用法。當然,你還要學習和使用一下數據庫,這里推薦學習開源的 MySQL。你可以看官方文檔,也可以看一下這本書《MySQL 必知必會》。? 前端方面在你處理中文時有時會發現有亂碼出現,此時需要了解 ASCII 和 Unicode 這樣的字符編碼。這里推薦一篇文章Character encoding。還有 Github 上的這兩個 Awesome 倉庫:Awesome Unicode 和 Awesome Code Points。?
為什么轉成 Java 語言?
相信你可能會問,為什么之前學習的 Python 和 JavaScript 不接著學,而是直接切到 Java 語言上來,這樣會不會切得太快了。這是一個好問題,這里需要說明一下,為什么我會切到 Java 這個語言上來,主要是有以下幾方面考慮。1.Java 是所有語言里面綜合實力最強的,這也是為什么幾乎所有大型的互聯網或是分布式架構基本上都是 Java 技術棧。所以,這是一個工業級的編程語言(Python 和 JavaScript 還達不到這樣的水準)。
2.之所以,沒有用 Java 來做入門語言而是用了 Python,這是因為編程是一件比較費腦子的事,一開始學習時,興趣的培養很重要。Python 比較簡單,容易上手,能夠比較容易地提起興趣,而用 Java 則可能比較難。3.在你有了一些編程語言的基礎后,有了一些代碼的邏輯后,切到工業級的編程語言上來,更為專業地學習編程,是非常有幫助的。像 Python 和 JavaScript 這樣的動態語言用著是很爽,但是,只有像 C、C++ 和 Java 這樣的靜態語言才可以讓你真正地進階。
4.對于一個合格的程序員,掌握幾門語言是非常正常的事情。一方面,這會讓你對不同的語言進行比較,讓你有更多的思考。另一方面,這也是一種學習能力的培養,會讓你對于未來的新技術學習得更快。很多時候,一些程序員只在自己熟悉的技術而不是合適的技術上工作,這其實并不好,這會讓你的視野受限,而視野會決定你的高度。綜上所述,這就是在入門的時候我故意讓你多學幾門語言的原因。
編程工具
編程工具方面,你需要開始學習使用下面這些工具了。
? 編程的 IDE。傳統一點的,你可以使用 Eclipse。當然,我推薦你使用 Intellij IDEA。這兩個工具都可以開發各種語言,但是主要用在 Java。如果你想玩得更時髦一些的話,使用 Visual Studio Code 也不錯,這個工具潛力十足,用其開發 Python、JavaScript、Java、Go、C 和 C++ 都能得心應手(教程-本文發布時還基本沒怎么翻譯完)。
? 版本管理工具。版本管理工具是非常重要的編程工具。傳統的有 P4、SVN、CVS 等,但都會被 Git 取代,所以,你就只用學習Git 就好了。學習Git 的教程網上有很多,這里我推薦非常系統的 Pro Git 第二版(如 果你覺得 Pro Git 比較枯燥的話,備選猴子都能懂的 Git 入門),然后你要學會使用 GitHub。關于一些 Git 環境安裝和準備以及 GitHub 使用,你可以自行 Google(比如:這篇Github and Git 圖文教程 或是這篇Git 圖文教程及詳解)。
? 調試前端程序。你需要學會使用 Chrome 調試前端程序,Google 一下會有很多文章,你可以看看 超完整的 Chrome 瀏覽器客戶端調試大全。? 數據庫設計工具。你需要學會使用 MySQL WorkBench,這個工具很容易使用。相關的手冊,你可以看一下官方文檔。
實踐項目
這回我們需要設計一個投票系統的項目。業務上的需求如下:
? ? ? ? ? 用戶只有在登錄后,才可以生成投票表單。投票項可以單選,可以多選。
其它用戶投票后顯示當前投票結果(但是不能刷票)。投票有相應的時間,頁面上需要出現倒計時。
投票結果需要用不同顏色不同長度的橫條,并顯示百分比和人數。
技術上的需求如下:
這回要用 Java Spring Boot 來實現了,然后,后端不返回任何的 HTML,只返回 JSon 數據給前端。
? 由前端的 JQuery 來處理并操作相關的 HTML 動態生成在前端展示的頁面。
? 前端的頁面還要是響應式的,也就是可以在手機端和電腦端有不同的呈現。這個可以用 Bootstrap 來完成。?
如果你有興趣,還可以挑戰以下這些功能。
在微信中,通過微信授權后記錄用戶信息,以防止刷票。? 可以不用刷頁面,就可以動態地看到投票結果的變化。
? Google 一些畫圖表的 JavaScript 庫,然后把圖片表得風騷一些。?
小結 上面那些書和知識你要看完,還要能理解并掌握,我估計你最少也要花 1-2 年左右的時間。如果你能夠走到這里,把前面的那些知識都了解了,不用精通,能獨立地做出上面的那些實踐項目,那么,你就算是真正的入門了。
而且,你已經是一個 “ 全棧工程師 ” 的樣子了,在這里我要給你一個大大的贊。如果這個時候,你對編程還有很大的熱情,那么我要恭喜你了,你可能會是一個非常不錯的程序員。加油啊!
上面的那些技術已經算是比較專業的了。如果你已經大致掌握了,我相信你可以找到至少年薪 20 萬以上的工作了,而且你的知識面算是有不錯的廣度了。但是深度還不夠,這個時候,是一個比較關鍵點了。
你可能已經沉醉在沾沾自喜的驕傲的情緒中,那么你也可以就此止步,加入一些公司,在那里按部就班地完成一些功能性的開發,成為一個搬磚的碼農。你也可以開始選擇一個方向開始深入。
我給你的建議是選擇一個方向開始深入。因為你并不知道你未來會有多大的可能性,也不知道你會成為什么樣的人,所以為什么不再更努力一把呢?
后面,我們就開始非常專業的程序員之路了。這也是一般程序員和高級程序員的分水嶺了,能不能過去就看你的了。
第三篇:FastReport 4程序員手冊
FastReport 程序員手冊
一、使用TfrxReport 組件工作
1、加載并存儲報表
默認情況下,報表窗體同項目窗體構存儲在同一個DFM文件中。多數情況下,無須再操作,因而你就不必采用特殊方法加載報表。如果你決定在文件中存儲報表窗體或者是數據庫的Blob字段(他提供了非常大的彈性,你能夠在非編譯程序中修改),你必須使用“TfrxReport”提供的加載和存儲方法。
function LoadFromFile(const FileName: String;ExceptionIfNotFound: Boolean = False): Boolean;從一個給定名字文件中加載報表。如果第二個參數等于“True”并且文件沒找到,那么他會觸發一個異常。如果文件加載成功,他返回“True”。
procedure LoadFromStream(Stream: TStream);從流中加載報表。
procedure SaveToFile(const FileName: String);用特殊名稱文件存儲報表。
procedure SaveToStream(Stream: TStream);把報表存在流中。
例如: Pascal: frxReport1.LoadFromFile('c:1.fr3');frxReport1.SaveToFile('c:2.fr3');C++: frxReport1->LoadFromFile(“c:1.fr3”);
frxReport1->SaveToFile(“c:2.fr3”);
2.設計報表
通過“TfrxReport.DesignReport”方法調用報表設計器。你必須在你的項目中包含報表設計器(必要條件是:要么使用“TfrxDesigner”組件,要么增加“frxDesgn”單元到uses列表)“DesigReport”方法接受兩個默認參數:
procedure DesignReport(Modal: Boolean = True;MDIChild: Boolean = False);Modal參數決定設計器是否被模態,MDIChild參數允許把設計器窗體作為一個MDI子窗體。
例如:
frxReport1.DesignReport;
3.運行報表
應用下面兩個“TfrxReport”方法中的一個啟動報表: procedure ShowReport(ClearLastReport: Boolean = True);啟動報表并在預覽窗體中顯示。如果“ClearLastReport”參數等于“False”,報表將會增加先前的一個報表結果,否則清除前一個報表結構。
function PrepareReport(ClearLastReport: Boolean = True): Boolean;啟動報表,沒有打開預覽窗體,參數賦值與“ShowReport”方法同名。如果報表構造成功,他返回“True”。
多數情況下,使用第一種方法更為方便一些。在報表被構造的同時,他會立刻顯示一個預覽窗體。
當需要增加另一個報表到前一個報表中的時候,“ClearLastReport”參數顯得方便些。(此類技術用于批量報表打印)。
例如:
frxReport1.ShowReport;
4.預覽報表
使用兩種途徑顯示一個報表是可能的:兩者都是調用“TfrxReport.ShowReport”方法(先前描述過了),或者使用“TfrxReport.ShowPreparedReport”方法來幫助實現。在第二種情況下,報表構造沒有被執行,但顯示了一個完成的報表。也就是說,你要么在“PreparedReport”方法幫助下構造他,要么在構造前從文件中加載報表(查看“加載/存儲完成的報表”)
例如:
Pascal: if frxReport1.PrepareReport then frxReport1.ShowPreparedReport;C++:
if(frxReport1->PrepareReport(true))frxReport1->ShowPreparedReport();
在這種情況下,報表構造器先被完成了,并顯示在預覽窗體中。構造一個龐大的報表可能要花費很多時間,那就是為什么使用“ShowReport”非等時同步方法會好于
“PrepareReport/ShowPreparedReport”方法。你可以通過“TfrxReport.PreviewOptions”屬的缺省值設定預覽參數值。(這句翻譯的不夠好,請參考原文)
原文參考:In this case, report construction is finished first, and after that it is displayed in the preview window.Construction of a large report can take
a lot of time, and that is why it is better to use the “ShowReport anisochronous” method, than the “PrepareReport/ShowPreparedReport” one.One can assign
preview settings by default via the “TfrxReport.PreviewOptions” property.[SPAN]
5、打印報表大多數情況下,你可以從預覽窗體打印報表。要人工打印報表,你應該使用“TfrxReport.Print”方法,例如:
frxReport1.LoadFromFile(...);
frxReport1.PrepareReport;
frxReport1.Print;
同時,你可以在顯示的打印對話框中設置打印參數,你也可以使用默認設定值。取消打印對話框,請參考“TfrxReport.PrintOptions”屬性幫助
6.載入并存儲報表
這個功能可以在預覽窗口中執行。也可以使用手工方法執行,幫助參考“TfrxReport.PreviewPages”方法:
function LoadFromFile(const FileName: String;ExceptionIfNotFound: Boolean = False): Boolean;
procedure SaveToFile(const FileName: String);
procedure LoadFromStream(Stream: TStream);
procedure SaveToStream(Stream: TStream);賦值和參數化類似與TfrxReport相應的方法。文件包含了完成的報表,默認情況下以“FP3”為擴展名。
例如: Pascal: frxReport1.PreviewPages.LoadFromFile('c:1.fp3');frxReport1.ShowPreparedReport;
C++: frxReport1->PreviewPages->LoadFromFile(“c:1.fp3”);frxReport1->ShowPreparedReport();
注意,完成的報表加載完畢后,預覽方法是通過“ShowPreparedReport” 方法執行的。
7.導出報表
他可以從預覽窗口中執行。也可以手動操作,通過“FfrxReport.Export”方法,及這個方法中的參數,你可以導出你想要導出的文件類型:
frxReport1.Export(frxHTMLExport1);
導出過濾組件必須是有效的(你必須把他們放到你項目中的窗體上)并調整正確。
The export filter component must be available(you must put it on the form of your project)and be adjusted correctly.8.創建自定義預覽窗體
FastReport在標準的預覽窗口中顯示報表。如果因為某些原因而不適合你,你可以創建一個自定義預覽窗體。為了這個目的,需要設計FastReport組件面板中的“TfrxReport”組件。要顯示報表,TfrxReport.Preview方法應該連接到這個組件。
在使用TfrxPreview組件的時候,有兩個典型的問題。他不會處理按鍵(箭頭,PgUp,PgDown等等)和鼠標滾輪(如果有的話)。要讓TfrxPreview同按鍵工作,設置焦點給他(他是可以做到的,例如,在窗體的OnShow事件句柄中)
frxPreview.SetFocus;
要讓TfrxPreview同鼠標滾輪工作,你必須創建OnMouseWheel事件句柄,并且調用TfrxPreview.MouseWheelScroll方法。
procedure TForm1.FormMouseWheel(Sender: TObject;Shift: TShiftState;WheelDelta: Integer;MousePos: TPoint;var Handled: Boolean);begin frxPreview1.MouseWheelScroll(WheelDelta);end;
9.建立復合報表(批量打印)
在某些情況下,需要立刻組織幾個報表打印,或者在一個打印預覽窗體中封裝并呈現幾個報表。要執行這些,在FastReport中有些工具能夠允許建立一個新的報表附加在一個已經存在的報表上。“TfrxReport.PrepareReport”方法中有一個選項“ClearLasReport”布爾類型參數,默認情況下他等于True,這個參數定義了是否有必要在建立報表時清除前一個報表。下面的方法展示了如何從兩個報表中建立一個批量報表: Pascal:
frxReport1.LoadFromFile('1.fr3');frxReport1.PrepareReport;frxReport1.LoadFromFile('2.fr3');frxReport1.PrepareReport(False);frxReport1.ShowPreparedReport;
C++:
frxReport1->LoadFromFile(“1.fr3”);frxReport1->PrepareReport(true);frxReport1->LoadFromFile(“2.fr3”);frxReport1->PrepareReport(false);frxReport1->ShowPreparedReport();我們加載并建立第一個報表,但并沒有顯示他。然后我們加載第二個報表到同一個TfrxReport對象,并使用“ClearLastReport”參數,讓他等于False。這就允許第二個報表附加在先前建立的報表之后。接下來,我們在預覽窗口中顯示一個完成的報表。
9.1 復合報表中的頁數
你可以使用“Page”,“Page#”,“TotalPages”和“TotalPages#”系統變量顯示頁數或總頁數,在復合報表中,這些變量以下面的方式工作: Page批量報表頁數
TotalPages批量報表總頁數
9.2 合并符合報表頁數
正如上面所說的,報表設計頁中的“PrintOnPrevousPage”方法讓你在打印報表的時候使用前一頁的剩余空間接合報表。在復合報表中,允許你在前一個報表的最后一頁的剩余空間創建一個新的報表。要執行這個,要使能每一個連續報表的第一個設計頁“PrintOnPreviousePage”屬性[SPAN]10.交互報表
在交互報表中,你可以在預覽窗口定義任意報表對象的鼠標單擊反應。例如,一個用戶能夠單擊數據線,結果運行一個帶有選擇線的明細數據。
任何報表都能交互。要執行他,你僅僅需要創建TfrxReport.OnClickObject事件句柄。下面代碼是這個事件句柄的示例:
Pascal:
procedure TForm1.frxReport1ClickObject(Page: TfrxPage;View: TfrxView;Button: TMouseButton;Shift: TShiftState;var Modified: Boolean);begin if View.Name = 'Memo1' then ShowMessage('Memo1 contents:' + #13#10 + TfrxMemoView(View).Text);if View.Name = 'Memo2' then begin TfrxMemoView(View).Text := InputBox('Edit', 'Edit Memo2 text:', TfrxMemoView(View).Text);Modified := True;end;end;C++: void __fastcall TForm1::frxReport1ClickObject(TfrxView *Sender, TMouseButton Button, TShiftState Shift, bool &Modified){ TfrxMemoView * Memo;if(Memo = dynamic_cast
在對象的單擊事件句柄上,你可以做如下事情:
-修改一個對象或頁的內容,傳遞句柄(結果,被修改的將被特殊標記,因此修改的內容應該引起重視);
-由于使用重構或重新建立報表,調用TfrxReport.PrepareReport方法
在此例中,點擊名字為memo1對象的結果顯示這個對象內容的消息。當點擊memo2是顯示一個對話框,這個對象的內容可能被修改。設置Modified標志為True,允許保持和顯示變更。
同樣的方法,單擊事件可以被定義成不同的響應。例如,運行一個新報表。如下注釋是必要的。在FastReport3版本中,一個報表組件可以在一個預覽窗口中顯示唯一的報表(不像FastReport2.x版本)。那就是為什么一個報表預覽窗也會在分開的對象中運行一個報表,或者是同一個對象,但當前報表必須被抹除。
關于給終端用戶一個可單擊對象提示定位,在預覽窗口中,鼠標經過一個可單擊對象的時候,我們可以修改鼠標的光標。要做到這些,在報表設計器上選擇一個要設計的對象并設置他的cursor屬性為不同于crDefault的某個值。
更多的細節涉及到定義的單擊對象。在簡單報表中,可以依照對象的名字或他的內容來定義。然而,這就不能更多的執行可修改的事例。例如,一個明細報表應當在一個數據選擇行被創建。一個用戶單擊了內容為12的memo1對象。數據行讓這個對象參考什么?那就是為什么你應當知道主鍵了,主鍵用于明確的標識這一行。FastReport能夠賦值一個字串,包含任意數據(在我們的事例主鍵數據中),對于每個報表對象,這個字串存儲在TagStr屬性中。
讓我們來通過一個報表的例子來舉例說明,這個報表包含在FastReportDemo.exe-'Simple list'示例中。這是一個公司的客戶列表,包含諸如客戶名稱,地址,聯系人等數據。數據源是來自DBDEMOS演示數據庫的Customer.db表。這個表有一個主鍵,CustNO字段,他沒有出現在報表中。我們的任務是終止他通過參考單擊完成報表上的任意對象記錄他,這就意味著要獲取主鍵的值,要執行此項操作,就要為所有對象的TagStr屬性加入值,依賴于主數據欄: [Customers.“CustNo”]
在報表建立期間,使用相同的方法計算TagStr屬性內容,同時計算文本對象的內容;這就意味著變量值會替代所有變量的位置。變量細節使用方括號括起來。那就是為什么行值是'1005', '2112'等類似值了。在報表建立后,包含TagStr屬性對象的類型取決與主數據欄。一個簡單的從字串到整形的轉換就會提供給我們一個主鍵的值,這也是所需記錄能夠找到的主鍵。
如果主鍵是復合的(包含多個字段),TagStr屬性的內容可能是如下值: [Table1.“Field1”];[Table1.“Field2”]
在構造一個報表完成后,TagStr屬性包含“1000;1”類型值, 此值不同比相同要好。
11.從代碼中存取報表對象 報表對象(例如:report page, band, memo-object)是不能在你的代碼中直接存取的。這就意味著你不能通過名字尋址對象。例如,當你在你的窗體上尋址一個按鈕。要尋址一個對象,在TfrxReport.FindObject方法中找到幫助:
Pascal: var Memo1: TfrxMemoView;Memo1 := frxReport1.FindObject('Memo1')as TfrxMemoView;C++: TfrxMemoView * Memo =
dynamic_cast
Pascal: var Page1: TfrxReportPage;Page1 := frxReport1.Pages[1] as TfrxReportPage;C++: TfrxReportPage * Page1 = dynamic_cast
12.從代碼中創建報表
作為一項規則,你將在設計器中創建多數報表。然而,在某些情況下(例如,當報表窗體未知的時候),使用代碼手工創建一個報表是是十分必要的。想要手工創建一個報表,你需要執行下面的順序步驟:添加數據源添加報表頁-添加欄頁
-設置欄屬性,接著把他們同數據相連
-在每個欄上加入對象
-設置對象屬性,接著把他們同數據相連
讓我們來檢查一下創建一個簡單報表的類型列表。假設我們擁有如下組件:frxReport1: TfrxReport and frxDBDataSet1: TfrxDBDataSet(最后一個連接到DBDEMOS數據,Customer.db表)。我們的報表將包含一個帶有報表標題和主數據欄的頁。在報表標題欄上有一個帶有“Hellow FastReport”文本的對象,主數據欄包含一個帶有連接到“CustNo”字段的對象。
Pascal: var DataPage: TfrxDataPage;Page: TfrxReportPage;Band: TfrxBand;DataBand: TfrxMasterData;Memo: TfrxMemoView;
{ 清除報表 } frxReport1.Clear;{ 為報表添加數據集到可存取的列表中 } frxReport1.DataSets.Add(frxDBDataSet1);
{ 添加“Data”頁 } DataPage := TfrxDataPage.Create(frxReport1);
{ 添加頁 } Page := TfrxReportPage.Create(frxReport1);{ 創建唯一名稱 } Page.CreateUniqueName;{ 設置默認字段大小, 紙張和打印方向 } Page.SetDefaults;{ 修改紙張方向 } Page.Orientation := poLandscape;
{ 添加一個報表標題欄 } Band := TfrxReportTitle.Create(Page);Band.CreateUniqueName;{ it is sufficient to set the ?Top? coordinate and height for a band } { both coordinates are in pixels } Band.Top := 0;Band.Height := 20;
{ 為標題欄添加一個對象 }
Memo := TfrxMemoView.Create(Band);Memo.CreateUniqueName;Memo.Text := 'Hello FastReport!';Memo.Height := 20;{ 這個對象將伸展坐標到欄的寬度 } Memo.Align := baWidth;
{ 添加主數據欄 } DataBand := TfrxMasterData.Create(Page);DataBand.CreateUniqueName;DataBand.DataSet := frxDBDataSet1;{ 頂端的調整應當比先前加入欄的頂部+高度大一些 } DataBand.Top := 100;DataBand.Height := 20;
{ 在主數據欄上添加一個對象 } Memo := TfrxMemoView.Create(DataBand);Memo.CreateUniqueName;{ 連接數據 } Memo.DataSet := frxDBDataSet1;Memo.DataField := 'CustNo';Memo.SetBounds(0, 0, 100, 20);{ 調整文本到右側的對象邊緣 } Memo.HAlign := haRight;
{ 顯示報表 } frxReport1.ShowReport;
C++:
TfrxDataPage * DataPage;TfrxReportPage * Page;TfrxBand * Band;TfrxMasterData * DataBand;TfrxMemoView * Memo;
// 清除報表
frxReport1->Clear();
// 在報表上添加一個數據集到數據集存取列表 frxReport1->DataSets->Add(frxDBDataset1);
// 添加“數據”頁
DataPage = new TfrxDataPage(frxReport1);// 添加一頁
Page = new TfrxReportPage(frxReport1);
// 創建一個不重復的名稱 Page->CreateUniqueName();
// 設置域大小, 紙張和默認的打印方向 Page->SetDefaults();
// 修改紙張的打印方向
Page->Orientation = poLandscape;
// 增加一個報表標題欄
Band = new TfrxReportTitle(Page);Band->CreateUniqueName();
// 為欄充分設置頂部坐標和高度 // 在像素上包含坐標 Band->Top = 0;Band->Height = 20;
// 在報表標題欄加入一個對象 Memo = new TfrxMemoView(Band);Memo->CreateUniqueName();Memo->Text = “Hello FastReport!”;Memo->Height = 20;
// 此對象將會被按照欄的寬度延展 Memo->Align = baWidth;
// 添加主數據欄
DataBand = new TfrxMasterData(Page);DataBand->CreateUniqueName();
DataBand->DataSet = frxDBDataset1;// 頂部坐標應該大于前邊添加欄的頂部坐標+高度 DataBand->Top = 100;DataBand->Height = 20;
// 主數據上加入一個對象
Memo = new TfrxMemoView(DataBand);Memo->CreateUniqueName();// 連接到數據
Memo->DataSet = frxDBDataset1;Memo->DataField = “CustNo”;Memo->SetBounds(0, 0, 100, 20);
// 調整文本到右側對象的空白 Memo->HAlign = haRight;// 顯示報表
frxReport1->ShowReport(true);
讓我們來解釋一些細節:
所有在報表中使用的數據集都必須添加到數據源列表中,在我們示例中,是用frxReport1.DataSets.Add(frxDBDataSet1)這一行執行的。否則,報表就不會工作。
數據頁對于插入內部數據集是必要的,例如TfrxADOTable。這些數據集只能放在數據頁。
調用Page.SetDefaults不是必須的,因為在這個案例中頁A4紙張設置和頁邊距都是0毫米。默認值設置10毫米頁邊距,并捕獲打印機頁大小和對齊方式。
在增加欄到頁面的同時,你要確認他們沒有互相重疊在一起。要執行他,頂部和高度的坐標是相似的。總是要在設計器中定位相同的位置的。
對象的坐標和大小是以像素為單位的,因為所有對象的left, Top, Width和Height屬性都擁有擴展類型,你能夠指出非整形值。下面常量用于轉化像素到厘米和英寸:
fr01cm = 3.77953;fr1cm = 37.7953;fr01in = 9.6;fr1in = 96;
例如,一個欄的高度等于5毫米如下設定: Band.Height := fr01cm * 5;Band.Height := fr1cm * 0.5;
12.代碼中創建對話框 我們知道,報表可以包含對話框窗體。下面的例子展示了如何創建一個帶有OK按鈕的對話框窗體:
Pascal:
{ for working with dialogue objects the following unit should be used }
uses frxDCtrl;var Page: TfrxDialogPage;Button: TfrxButtonControl;
{ 添加頁 } Page := TfrxDialogPage.Create(frxReport1);{ 創建唯一名稱 } Page.CreateUniqueName;{ 設置大小 } Page.Width := 200;Page.Height := 200;{ 設定位置 } Page.Position := poScreenCenter;
{ 添加一個按鈕 } Button := TfrxButtonControl.Create(Page);Button.CreateUniqueName;Button.Caption := 'OK';Button.ModalResult := mrOk;Button.SetBounds(60, 140, 75, 25);
{ 顯示報表 } frxReport1.ShowReport;C++:
//使用對話框對象工作,會用到下面的單元
#include “frxDCtrl.hpp”
TfrxDialogPage * Page;TfrxButtonControl * Button;
//添加一頁
Page = new TfrxDialogPage(frxReport1);
//創建唯一名稱
Page->CreateUniqueName();
//設置大小 Page->Width = 200;Page->Height = 200;
//設定位置
Page->Position = poScreenCenter;
// 添加一個按鈕
Button = new TfrxButtonControl(Page);Button->CreateUniqueName();Button->Caption = “OK”;Button->ModalResult = mrOk;Button->SetBounds(60, 140, 75, 25);
//顯示報表
frxReport1->ShowReport(true);
第四篇:《程序員崗前培訓手冊》
程序員崗前培訓手冊
北京應用技術大學
目錄(CONTENTS)
前言
面試是雙向選擇
軟件公司研發技術崗位掃描與崗位職責
如何快速融入技術團隊(程序員入崗的注意事項)優秀程序員應具有的品質與習慣 談談學習方法
外包軟件、商品軟件、項目軟件簡介
前言
同學們經過在北京應用技術大學兩年的學習,都滿懷憧憬地向往程序人生的開始,也對即將走上的工作崗位和環境充滿了期待,期待通過程序來證明自我的價值。程序員,相信在很多同學眼中是一個有趣、特別、高薪、充滿艱辛而又非常神秘的職業,因為手下那一行行跳動的代碼不僅實現了生動的功能,同時也表達著程序員對人生的理解和追求。當程序員實現了一個獨到的創意之后準備熄燈休息時,天已蒙蒙亮…..當程序員看著用戶熟練地操作自己的軟件解決一個個復雜事件時,臉上那寫滿成就的微笑…..的確在這個行業里出現了太多的英雄人物和企業,而每一個英雄的事跡和成就都足以讓我們熱血沸騰、摩拳擦掌……
在同學們即將步入程序員崗位之前,需要對軟件研發相關職位的職責范圍與工作特點有所了解,掌握一些入職的基本技巧和注意事項,檢查自己的技能與行為習慣,有的放矢,提高面試和就業的成功率。入職后能盡快地融入到技術團隊,近而快速成長,成為團隊技術骨干和最優秀的職員。在工作中養成積極而良好的行為習慣和職業素養,為自己的職業發展創造一個良好的開端。
本手冊從面試、技術崗位職責、如何快速融入技術團隊、優秀程序員的品質與習慣、學習方法、外包軟件/商業軟件/項目軟件簡介等幾個方面闡述了同學們在踏入工作崗位之前應該了解的知識和注意事項。
面試是雙向選擇
一般同學都會誤認為面試時應聘者處于弱勢,要接受招聘者的挑選,從而從心理上承受很大的壓力,而影響自己正常的發揮和才能展示。其實大可不必,因為面試是雙向的,選人和擇業是平等的。況且現在市面上的用人單位或招聘崗位也是良莠不齊,甚至還有一些騙子公司,這就要求同學們在應聘時擦亮眼睛,注意分辨。當然大多數公司都是良性的,他們要么是已具規模,各部門及崗位功能分工很明確,他們會根據業務的發展或作為人才儲備而有針對性的招聘相關技術人員,而有的公司可能是剛剛成立,業務與核心技術還未形成,他們需要招聘到能為他們提供解決方案或創意的技術人員,所以對于這些類型的公司,他們對人才的渴求也都不亞于同學們對工作崗位的渴求,若是聘到一個優秀的技術人員對業務或項目的推進將會使公司獲得更大的利益,或者使公司的發展少走彎路甚至能改變一個公司的命運。相反,如果招不到合適的人才或者使用一個較差的技術人才,不但不能推進項目的進展,還要花費幾個月的培養時間和費用,甚至阻礙業務開拓甚至項目擱淺。所以當同學們想得到一個工作崗位的同時,也要看到企業更需要一個優秀的員工,二者是平等的。在面試時,同學們在一種非常平和的心態下,充分發揮,盡可能地展示自己已經掌握的技能,展示學習能力和發展潛能;另一方面也要盡可能地提前了解公司的背景和業務以及應聘崗位的職能,從而加以辨別和選擇。一旦本次面試不能成功,表明要么崗位不適合你,要么你不適合崗位,或者因為你本次的表現不佳,這都是很正常的,一定不要有挫敗感,要及時總結面試時的表現方式以及溝通技巧,若感覺自己的確能夠勝任該崗位,只是因為自己的臨場發揮不佳而沒有展示出自己的實際水平,也可及時和招聘公司聯系,經詢問確認對方沒有找到合適人選的情況下,表明誠意,請求復試機會。總之,若本次失敗,一定不要影響下一次的面試,要積極總結,為一下次面試作準備。
正常運營的公司因業務的不斷發展,人才需要不斷的更新、補充和儲備,所以他們一直都需要人才,況且公司每次組織招聘都會花費一大筆費用,也希望能夠找到合適的人才,所以公司面試時一般不會出太吊鉆的問題來為難你,同學們也不要過分擔心。
另一方面,同學們在堅信“天生我才必有用”的同時,也要正確看待現在的就業形勢,對第一份工作也不要過于理想化,要擺正心態,堅持從基層做起,先就業再擇業,職場上“騎驢找馬”也未必不是一種現實的理性選擇。
總之,面試是雙向性的,是招聘單位與同學們相互展示、相互認識、互相挑選的一次溝通過程。同學們 在求職的過程中,要正確看待面試,放下思想包袱,充分重視,充分準備,從容應對。
軟件公司研發技術崗位掃描與崗位職責
一般中小型軟件公司設置的技術崗位有:研發總監、項目經理、需求分析人員、系統架構與分析人員、數據庫設計人員、程序員、項目助理與文檔專員、測試人員、技術支持(售前/售后)、美工或網站前臺人員等,這些職位的工作聯系非常密切,根據公司規模的大小,以上職位可由一人或多人兼任,比如一個小型的軟件公司可能只有一個人完成軟件的總體設計、架構、編碼、測試、文檔等工作。這些崗位的職責范圍大致是:
研發總監:全面負責研發及技術部門的整體工作。
項目經理:在整個項目開發過程中組織項目所需的各項資源,對項目的范圍、項目的質量、項目時間以及項目成本進行管理與控制。根據項目范圍、質量、時間與成本的綜合因素的考慮,進行項目的總體規劃與階段計劃,保證項目組目標明確且理解一致;在項目生命周期的各個階段,跟蹤、檢查項目組成員的工作質量;保證項目在預算成本范圍內按規定的質量和進度達到項目目標。
需求分析人員:項目前期與客戶方打交道最多的人,對于客戶來說,他可以代表整個項目組,對于項目組成員來說他的意見可以代表客戶方的意見,項目組內所有與客戶需求相關的事情必需得到他的認可。他的工作主要是:
1、在項目前期根據《需求調研計劃》對客戶進行需求調研。
2、收集整理客戶需求,負責編寫《用戶需求說明書》。
3、代表項目組與用戶溝通與項目需求有關的所有事項。
4、代表客戶與項目組成員溝通項目需求有關的所有事項。
5、負責《用戶需求說明書》得到用戶的認可與簽字。
6、負責將完成的項目模塊給客戶做演示,并收集對完成模塊的意見。
7、完成《需求變更說明書》,并得到用戶的認可與簽字。
8、協助項目組有關人員對需求進行理解。
系統架構與分析人員:是項目的總體設計師,組織構建新產品的開發與集成、新技術體系等,也可以理解為技術總監。是在技術上對所有重要事情做出決定的人。系統架構在整個軟件開發過程中都起著非常重要的作用,并隨著開發進程的推進而其職責或關注點不斷地變化。
1、在需求階段,負責理解和管理非功能性系統需求,比如軟件的可維護性、性能、復用性、可靠性、有效性和可測試性等。審查客戶和市場人員所提出的需求,確認開發團隊所提出的設計;組織開發團隊成員和開發過程的定義;協助需求分析師完成《用戶需求說明書》、《需求變更說明書》等。
2、在設計階段,負責對整個軟件架構、關鍵模塊、接口的設計。對系統進行分析與建模,完成《系統架構說明書》、《系統概要設計說明書》、《系統詳細設計說明書》。
3、編碼階段,成為程序員的顧問,負責重點代碼檢查,并且經常性地要舉行一些技術研討會、技術培訓班等;
4、測試及實施階段,隨著軟件開始測試、集成和交付,集成和測試支持將成為工作重點;
數據庫設計人員:根據《系統架構說明書》負責進行數據庫選型與建模。由于數據庫是整個系統運行的核心,數據庫設計的好差直接影響著整個系統的開發效率和系統運行的優劣。他是項目組中唯一能對數據庫進行直接操作的人,對數據庫結構的每一次改動都要得到他的認可。主要職責:
1、根據數據庫建模結果,繪制數據庫關系圖。進行數據庫建庫以及數據庫進行初始化操作。
2、對數據庫進行維護、備份、恢復、同步。
3、負責客戶數據的導入導出。
4、根據《系統詳細設計說明書》編寫對應的視圖、存儲過程、函數、觸發器等。
5、對項目組其它成員進行SQL方面的指導。
6、為測試建立相關測試數據。
程序員:負責系統的最終代碼實現。主要職責:
1、參與需求調研、項目可行性分析、技術可行性分析和需求分析。
2、協助完成《系統詳細設計說明書》,并根據《系統詳細設計說明書》進行編碼實現;
3、對自己代碼進行復查,并進行簡單的測試。
4、撰寫相關技術實現或功能描述文檔。
5、負責向項目經理及時反饋軟件開發中的情況,并根據實際情況提出改進建議。
6、參與軟件開發和維護過程中重大技術問題的解決。
項目助理或文檔專員:協助項目經理在項目日常管理和數據分析方面的工作,進行與項目有關的協調工作,編寫項目進度報表,參與組織項目協調會,組織項目非技術文檔的編寫、傳遞與歸檔,以及與市場人員或其他部門的日常溝通,協助項目資源協調工作。跟蹤項目進展。項目或軟件包的打包、發布以及授權鎖的制作等工作。
測試員:負責實施軟件測試。測試是整個項目系統中非常重要的一個環節,項目質量的保證,他的主要工作就是找到項目中存在的不合理、不合格的部份,并要求項目其它成員按其給定的項目質量完成項目。保證了系統功能實現是否與功能設計和需求定義一致。主要職責:
1、根據軟件項目規范編寫測試計劃,設計測試數據和測試用例。
2、采用合適的測試方法實施軟件測試,形成各階段的測試報告,并對軟件問題進行跟蹤分析和反饋,推動測試中發現問題及時合理地解決。
3、完成對產品的集成測試與系統測試,對產品的功能、性能及其他方面的測試負責。
4、協助程序員進行軟件代碼檢查,提出對軟件的進一步改進的要求。
技術支持人員:主要負責軟件產品或項目在技術層面上與客戶的交流,根據工作重點分為售前支持和售后支持。
? 售前支持:是銷售人員和開發人員的橋梁,協調銷售人員、用戶、開發人員的關系,制作產品功能演示PPT文檔或多媒體資料,將公司的技術實力向用戶展示,技術標書的撰寫,定期采集、分析和整理用戶的需求,配合銷售制訂產品銷售策略,從技術上支持市場銷售業務等。
? 售后支持:負責編寫《用戶手冊》、《操作手冊》,制作系統操作視頻教程等多媒體培訓教材;負責系統實施(包括系統安裝、用戶培訓、系統試運行等),協助用戶進行“用戶確認測試”和編寫《確認測試報告》;通過電話、網絡、及時通訊等多種渠道解答用戶在使用中的問題,提供售后服務。收集、整理用戶的建議等。
美工或網站前臺人員:負責完成軟件設計師安排的功能界面設計和簡單網站的設計。
1、負責對項目整體色彩的調配。
2、向系統分析師提出項目美化的建議。
3、為BS 項目提供一套或幾套CSS樣式表及HTML結構表
4、為CS項目提供符合項目內容的靜態、動態圖片。
5、并為程序員提供界面指導。
如何快速融入技術團隊
——程序員入崗的注意事項
同學們剛剛結束學校的集體生活,面對新的工作環境、新領導、新同事、新任務、新的制度、新的生活節奏,很多的變化需要你盡快適應,很多的事情需要你獨擋一面,而又有許多事情需要你與同事通力協作來完成…… 以下是新程序員入職后盡快融入技術團隊應注意的事項:
1、認真學習公司的發展背景與歷程、主營業務以及規章制度。
進入公司前可能對公司已經有了一些了解,入職后,相關人力資源管理部門會組織培訓,解讀公司文化,介紹公司發展背景、主要職能部門以及主要業務特點,學習公司考勤、人事、辦公等管理規定和規章制度。有些新入職的程序員或技術人員,認為這些不含技術成分沒有必要花精力去學習,其實這種認識是錯誤的,公司文化及各種制度是整個公司的靈魂,是公司正常經營活動保障和員工行為的一種約定,新職員只有對公司的發展背景和經營狀態有充分的了解,接受公司文化,高度認同公司的核心價值觀,嚴格遵守各種規章制度,才能自覺地規范自己的行為習慣,在工作學習中才有主動性,遇到工作壓力時也能坦然地接受,不會有抵觸心理,從而能更快地推動自己的工作。
2、積極學習業務知識、類庫及現有程序資源,把握學習的技術方向。
程序員入職后,若有一個成熟的開發團隊,一般都會有一個老職員來帶領學習,這一階段主要有三個方面的學習任務,第一是公司業務知識,因為程序員只有對業務知識熟悉了,才能更好的理解和把握功能需求,比如做通信方面的軟件,你要學習一些通信行業知識;若做財務軟件,你要了解一些財務知識。第二,現有的類庫是公司開發部門積累的程序資源,學習和使用它可以規范統一程序的風格,提高開發的速度,掌握并能使用這些資源,可使你盡快與老職員有程序上的共同語言。第三,學習并加強在此領域的編程技能,因為在學校學習的是通用的知識,掌握的是一種知識導入與學習的方法,那么在公司應用方面也許要求你某一個方面很精通,比如網站的前臺、數據庫、圖形處理、多媒體、網絡編程等某些方面的技能需要強化。案例:
小張(男)和小胡(女)是同一個大學畢業的應屆生,在2005年4月份同時進入公司做技術支持,當時兩人的工資都是每月1500元,而兩年后的今天小胡已是研發部的一個程序員,工資是每月4300元,而且是公司重點培養的對象之一。小張現在還是在做技術支持,工資是每月2600元,他們兩人可以說是起點相同,但兩年的發展卻讓他們有了明顯的差距,小胡比較愛學習,工作非常踏實,對業務知識也掌握得非常精通,而且在做技術支持工作的時候,業余時間學習編程,由于做技術支持與程序員交流比較多,小胡抓住了這個學習編程的機會,但她從不在公司上班時間學習程序,在做技術支持工作時,她上班時間鉆研業務知識、軟件需求、學習程序實現的思想,業余時間練習代碼。在做技術支持一年后,她通過了研發部的考核,進入研發部開始做編程。而小張與她對比就不同了,他只是做好本質工作,沒有潛心學習,對業務知識、軟件知識只是一般了解,工作上很業績平平,總體上不出色也沒出大的差錯。工資漲得當然也慢,小張和小胡的起點相同,但小胡比較主動學習,很明顯他們兩個在職場上的差距就拉開了。
3、展示進步,創新思考,體現價值。
入職之初,通過積極的學習與適應,應該說進步是非常快的,要及時的總結,并把工作學習的總結和進步程度及時向主管匯報(口頭、郵件、書面),階段工作總結應包括以下幾點:已經完成的工作、技術上的進步、業務上的進步、從學生到職員心態上的轉變、八小時之外的學習狀態等。這樣一方面可以疏理一下知識結構,把握自己的學習階段,一方面讓主管根據你的知識結構和技能狀態有針對性地給你分配合適的任務。
另外在工作當中也要注重思考,對工作進行適當的改進,并提出改進意見,這樣能更快是體現出你的進步和工作價值。
4、積極參加團隊活動,適應團隊文化,創造與團隊成員友好而積極的協作氛圍。
能盡快適應團隊文化,與同事友好溝通是任何崗位都需要的職業素質,只是在研發團隊里要顯得尤為重要,由于研發工作的重要與特殊性,若在軟件商品化和產品化的開發階段,不良的溝通協作可能導致項目的流產。另外,部分程序員寫程序久了都會很注重與機器或代碼交流,有的不容易與新職員交流,有的他們因有大量的工作任務而顧不上,有的是因為他們有太多的思想與創意,和一個新來的職員沒有共同語言,有的是人為設置“技術壁壘”(因擔心新職員威脅到自己的崗位,而不愿傳授一些知識)。那么新職員一定不要因為他們沒有主動與你交流而放棄交流,或者認為自己被冷落而與逐漸遠離團隊,而是要在適當的時間與他們主動交流,主動向他們請教,積極參加團隊的集體活動,創造與同事交流合作的良好氛圍。要盡可能地為團隊多做貢獻,不要因為多干一些工作或多加一點班,就有不良的情緒,從而影響正常的溝通與交流。另外,在研發團隊里的溝通與協作,還體現在代碼上,自己設計的功能模塊是否能為別人提供良好的說明和程序接口。總之,與同事友好愉快的協作,盡快融入研發團隊,是新入職的程序員技術快速進步和穩定職位的重要因素。
5、正確面對工作壓力,學會釋放“厭職”情緒。
許多同學進入一個新的工作環境,面對的是很多新事物,感覺工作節奏太快,工作壓力太大。其實新職員有工作壓力也是正常的,從職業生涯發展的角度來看,這種工作壓力是非常必要的。同學們在進入公司后,要勇于接受工作壓力,把這種壓力作為進入初職鍛煉的良好機會,樹立良好的心態,不要逃避,更不要產生“厭職”情緒,公司還正在培養你,你卻選擇退縮而自炒“魷魚”。工作中要學會積極與同學溝通,注意工作方法,釋放和減輕壓力。其實我發現一些新職員說工作壓力大,做事不順心,仔細分析之后可以發現他們感覺的工作壓力大與“不合群”有很大的關系。有些同學到公司后,一坐下就是八小時,語言和行為與同事格格不入導致他不敢言語不敢行動,下班時間到了,其實他不是工作學習本身的累,他們感到更累的是“心”。這些新職員在工作中總是希望別人主動接近自己,自己卻不會主動與人交流,時間長了,同事覺得他“不愛說話”,也就逐漸放棄了與他的交往,這時他又會感到被排擠,感到孤獨,心理壓力就會增大。另外技術上單打獨斗,不能利用別人的資源,因此完成相同的工作,付出的努力和壓力就要比其他同事大得多。所以新職員在入職之初,一定要正確看待工作上正常的工作壓力,學會與團隊成員友好相處,創造一種“如魚得水”的工作氛圍,那么真正技術上的壓力都不會成為問題的。
如果公司還沒有成熟的開發團隊,需要你一個人承擔開發項目,著手組建開發團隊,那么就要求你充分一切時間,利用網絡資源,有技術難點及時到網絡上尋求幫助,同時與相關部門人員密切合作,保持動態及時的溝通,及時報告工作進度,爭取盡快擬出解決方案或產品。
優秀程序員應具有的品質與習慣
? 善于理解與把握需求
程序員的勞動成果就是滿足需求的程序,那么在動手寫代碼之前,只有完整地理解一個模塊的需求才能做出好的程序,優秀的程序員在分析需求的基礎上,應該能抓住問題的關鍵技術,從而能夠建立合適的數據模型,盡量在代碼中少走“彎路”。? 善于學習與總結
當然善于學習,是對任何行業任何職業的最根本的要求,對于程序員,這種要求就更加高了。其實研發部門招聘程序員,其實并不一定注重你現在能做什么,而更注重的是你的學習能力、你的編程潛力,因為程序員是很容易被淘汰,很容易落伍的職業,一種技術可能僅僅在三兩年內具有領先性,若你不能跟進新的技術,不學習新的技能,那么不斷出現的新技術會使你顯得非常笨拙。善于總結,也是學習能力的一種體現,每次完成一個研發任務,完成一段代碼,都應當有目的的跟蹤該程序的應用狀況和用戶反饋,隨時總結,找到自己的不足,這樣逐步提高,才能成長起來。
? 規范化的編碼習慣
養成良好的編碼習慣,比如:變量命名清晰,語句嵌套明確,函數具有獨立功能,適當注釋等等,因為這些不但有助于代碼的移植和糾錯,也有助于不同人員之間的協作。? 良好的文檔習慣
良好的文檔是正規研發流程中非常重要的環節,作為代碼程序員,30%的工作時間寫技術文檔是很正常的,而作為高級程序員和系統分析員,這個比例還要高很多。缺乏文檔,一個軟件系統就缺乏生命力,在未來的查錯,升級以及模塊的復用時就都會遇到極大的麻煩。? 代碼復用性,模塊化思維能力
復用性設計,模塊化思維就是要程序員在完成任何一個功能模塊或函數的時候,要多想一些,不要局限在完成當前任務的簡單思路上,想想看該模塊是否可以脫離這個系統存在,是否可以通過簡單的修改參數的方式在其他系統和應用環境下直接引用,這樣就能極大避免重復性的開發工作,如果一個軟件研發單位和工作組能夠在每一次研發過程中都考慮到這些問題,那么程序員就不會在重復性的工作中耽誤太多時間,就會有更多時間和精力投入到創新的代碼工作中去。? 團隊精神與溝通協作能力
這是程序員應該具備的最基本的,也是最重要的安身立命之本。軟件或項目的各模塊功能需求的理解準確,一個功能實現的修定,是否會影響其他模塊等,沒有充分及時的協作對一個項目來說幾乎是不可想象的。我做了幾年開發,感覺溝通真的太重要了,其實軟件研發過程中最重要的不是技術問題,而是管理中的溝通問題,比如初級程序員或許是礙于面子或其他原因,不懂的問題也不想問,總是把問題掖著藏著,而高級程序員又不理解初級程序員的開發任務總是完不成,其實可能是高級程序員不了解初級程序員的真正困難,或者沒有把要實現的邏輯和思路講解清楚。合作起來總會有一些不透徹,要么一個問題討論多次依然是問題沒有結果,要么是有些問題根本不反映,大家都掖著藏著,報喜不報憂,待到問題暴露已無法挽回,嚴重的阻礙了項目的進度。所以我最好的建議就是,高級程序員應該把問題講到明白為止,初級程序員應該把問題問到明白為止,并且不僅僅是口頭上講明白、聽明白,還一定要形成文字,現在網絡非常方便,公司都會有企業郵箱,把問題的討論過程通過mail的形式記錄保存,明確確認,這樣障礙才能去除,項目才能得以順利進展。
案例1:
陳某是北京某重點大學自動化專業的畢業生,編程基礎知識非常扎實,在學校學習期間也有許多代碼積累,從技術上說應該是很有潛力的,但他性格有點孤僻,不太容易與同事溝通,當時錄用他時公司是看在他的編程基礎很好,以為在研發部大家多帶動他,應該會好些的。進公司有兩個多月了,一次在做某油田項目中負責其中一個小模塊的開發,在開發過程中我經常詢問他有沒什么問題,他每次都有些含糊地說沒有。可當項目交付的時候,發現他做的某一功能與當初功能定義不符,客戶就抓住這一點說與合同中需求描述不符,由此延期支付28萬的余款,使該項目后期維護起來非常被動。而導致這一結果就是陳某在做程序時有問題自己繞過去了,沒有及時與項目組成員交流,而獨自采用了他熟悉的一種解決辦法。項目匯報會剛結束,人事部門就通知陳某交接工作,到財務結算工資…..文摘:下面這故事《請按一下九層》我一直和我的同事們分享。是《讀者》中的一篇文章: 這是全市最忙的一部電梯,上下班高峰時期,和公共汽車差不多,人挨著人。上電梯前和公司的人力資源總監相遇,說笑間,電梯來了,我們隨人群一擁而進。每個人轉轉身子,做一小小的調整,找到了一種相對融洽的關系。這時,一只胳膊從人逢中穿過來,出現在我的鼻子前頭。我扭頭望去,一個小伙子隔著好幾個人,伸手企圖按電鈕。他夠得很辛苦,好幾個人剛剛站踏實的身子不得不前挺后撅,發生了一陣小小的騷動。
那個人力資源總監問道:“你要去哪一層?”“九層。”有人抬起一個手指頭立刻幫他按好了。沒有謝謝。
下午在樓道里又碰到那個人力資源總監。“還記得早上電梯里那個要去九層的小伙子嗎?”她問我。
“記得呀,是來應聘的吧?”九層,人力資源部所在地。“沒錯,挺好的小伙子,可我沒要他。”“為什么?”
“缺少合作精神。”她露出一副專業HR的神情,“開口請求正當的幫助對他來說是件很困難的事情,得到幫助也不懂得感激。這種人很難讓別人與他合作。”
我點頭稱是。如果那個小伙子坦然而自信地說一句“請按一下九層”,結果會怎樣呢?大家不但不會反感他的打擾,而且幫助他的人還會心生助人的快樂,最后他也能得到想要的工作。
這個故事表明,良好溝通不僅僅體現在禮貌地說聲“請”、“謝謝”,而是一個職員能夠創造愉快、高效、和諧工作氛圍的素質和習慣。
? 時刻修定自己的認識和行為與公司的核心價值觀(短期目標、長期目標)保持一致
公司或研發團隊在什么時段做什么樣的項目,或者根據項目進度的計劃,在什么時間做什么功能模塊,作為程序員要高度地與這些目標保持一致,不要在關鍵時刻“掉鏈子”,這是最重要的。
案例:
小張是公司里的轉正不久的程序員,很聰明,對新技術接受很快,缺點就是非常的貪玩,對項目組的事缺乏主動性和責任心,平時的工作中主管已經提醒過他多次要注意工作的責任心,但他都不太放在心上,對事依然是敷衍。一次在做上海鐵通的項目中,小張負責項目中的一個模塊,當軟件架構出來以后,需要出差上海為客戶現場演示和進一步確認需求,由于合同還沒有正式簽下來,所以此行的技術交流對公司能不能簽下這個項目至關重要,公司派由我和小張在內的項目組4人出差上海,臨行前我們多次開會研究方案,確保拿下這個項目,下午到了上海之后約好第二天上午與客戶見面,正當大家為第二天的交流捏一把汗,積極準備的時候,小張卻說是第一次到上海,要求先去外灘看夜景,在得到項目組的否定之后,小張竟一個人偷偷到外灘看夜景至到深夜才回到賓館。第二天的技術交流會上,小張負責的模塊問題最多,雖然最后整個項目的交流還算成功,公司總算簽下了這個項目,但小張也被辭退了。原因很簡單,小張一直沒有把公司的事放在心上,項目組出差第一目標是與客戶交流好,拿下項目,而小張出差上海的第一目標是看一下外灘。所以象小張這樣的技術上不管有多么出色,但總在公司的關鍵時刻“掉鏈子”,被公司辭退也是早晚的事。就在寫此案例的前幾天,在地鐵上我偶遇小張,談話中得知他被辭退后半年內又經歷了一家公司。而此刻他又在匆匆地找工作。
談談學習方法
說起學習的方法,其實每個人都有自己的學習方法,也許這種方法對我來說有用,但不見得就對所有的人有用。所以,不要盲目的跟著別人的學習方法學習,要思考屬于自己的學習方法。但以下幾個原則是要遵守的: ? 堅持學習。首先要有毅力,對編程的狂熱也可以在一定程度上起到幫助。學習編程應該說要經歷好奇——困難——容易——郁悶——成就感——困惑——輕松的幾個階段的循回,不管哪個階段都需要天天學習,堅持每天都要進步,不能半途而廢,培養一種堅持克服困難的毅力。案例: 記得開發團隊里有一個基礎不是太好的程序員,剛入職兩個多月,表現一般,有一天早上他眉飛色舞地在講述昨天電視中的一個情節,我聽到后就說了一句:“你還好意思說你看電視?”。他立刻明白了,就沒說什么。從此他的進步是可以說是突飛猛進的,代碼的質量和工作效率明顯上了一個臺階,對項目的推動也是有目共睹的。幾個月后的一次公司慶典上,他被評為“進步最快員工獎”,獎金3000元。獎后在他給我的Mail中發現了這句話:“你說我看電視的那句話改變了我的學習狀態….我現在是馬桶上、公交車上都在看書或筆記。”
? 堅持實踐。當你學到了一種新的技術或知識時,多實踐是鞏固學習的一種最好最有效的方法。這個實踐不是照著書上的例子做一遍,而是根據自己的能力,給自己出題,然后去完成它。只有這樣,你才能發現自己的不足,同時又增加了編程經驗。要成為合格的程序員,光會寫代碼是遠遠不夠的,更重要的是在實踐中思考創新。實踐的多少決定著“高手”和一般程序員界線,高手們并不是天才,他們是在無數個日日夜夜中磨煉出來的。成功能給我們帶來無比的喜悅,但實踐的過程卻是無比的枯燥乏味。
? 掌握編程思想。學一門語言,不能僅僅是語言,還要注重語言背后的思想方法,獲得提出問題,分析問題,解決問題的能力,不是為編程而學習,因為編程語言和我們日常所說的語言一樣,日常所說的語言是一種思想的表達,而編程語言是一種功能的實現。要學習它是如何來解決某一問題的,為什么要這樣去做,他總是要符合客觀事實的,存在某種邏輯,數據的組織,信息的傳遞,然后看該怎么樣用編程語言來表達自己的想法。
? 多問、多總結、多記筆記。“三人行必有我師”,也許在一次和別人不經意的談話中,就可以迸出靈感的火花。著名的交換蘋果理論說的是:“你有一個蘋果,我有一個蘋果,當我們互相交換蘋果后,我們仍然互得一個蘋果;你有一個想法,我有一個想法,當我們互相交換想法,我們則互得兩個想法”。遇到問題,上網查看一些技術論壇,看看別人對同一問題的看法,會給你很大的啟發。在這個網絡時代,資料到處都有,無論什么先進的技術,你可以問身邊的高手,問網上的同仁,只要查到資料,快的學上幾天慢的一兩個月也能學會,學會后總結出技術要點記下來,可寫在本子上也可寫在Blog上,編程技能的提高靠的是代碼的積累,把所有自己的代碼保存起來,并附有適當的筆記,這樣,到用到時才能信手拈來,才能獲得踏踏實實的進步。所以現在已沒有寫不出的程序了,寫不出不是因為不夠聰明,而是因為你沒有耐心和找 BUG 的細心。
? 不鉆“牛角尖”,只抓主要問題,一些不影響工作的難點只要會用就行,這也體現了OOP的思想,你只要知道一個技術能完成什么功能就可以,至于它是如何實現的可暫時放一放,有時回過頭來再看就不是什么難點了。當你遇到技術障礙的時候,不妨暫時遠離電腦,看看窗外的風景,聽聽輕音樂,和朋友聊聊天。當重新開始工作的時候,我會發現那些難題現在竟然可以迎刃而解。
外包軟件、商品軟件、項目軟件的操作模式簡介
軟件外包
就是一些發達國家的軟件公司將他們的一些非核心的軟件項目通過外包的形式交給人力資源成本相對較低的國家的公司開發,以達到降低軟件開發成本的目的。因為軟件開發的成本中70%是人力資源成本,所以,降低人力資源成本將有效地降低軟件開發的成本。軟件外包已經成為發達國家的軟件公司降低成本的一種重要的手段。軟件外包的大幅度增長為人力資源成本相對較低的印度和中國帶來了新的發展機會。企業與企業之間的外包就是:企業(A)為了專注核心競爭力業務和降低軟件項目成本,將軟件項目中的全部或部分工作發包給提供企業(B)完成; 商業軟件 商業軟件(又叫“商品軟件”)就是由商業公司在調研大多數行業用戶的需求上開發的軟件,該軟件基本上能滿足這些用戶的需求,而且它的功能不會因個別或少數用戶的要求而改動。隨著互聯網的興起和軟件授權銷售方式的普及,商品軟件的銷售可軟件公司直銷、代理銷售、專業下載網站銷售等多種渠道,軟件授權許可的銷售模式往往是根據使用商品軟件的用戶數和安裝該軟件的計算機數來收取許可費用。項目軟件 就是軟件公司專門為某個客戶開發的軟件系統,該系統由委托開發的客戶配合調研需求,“量體裁衣”,在關鍵階段雙方可派技術人員互相“滲透”,密切合作,共同完成系統的開發和實施以及運行。項目軟件與外包軟件的操作模式有相同性也有不同性。產品經理與項目經理
簡單地說,產品經理是做正確的事,其所領導的產品是否符合市場的需求,是否能給公司帶來利潤的。而項目經理是把事情做正確,把事情作得完美,在時間,成本和資源約束的條件下完成目標。項目經理要對某個產品進行開發的管理,負責開發的進度,開發過程中的協調等有關開發方面的問題,他最大的目標是時間第一、立項目標達成第一。并不會很尊重產品本身的市場需求以及業務邏輯的問題。
而產品經理是橫向管理的,也就是說他將負責某個產品或者某個產品線從商業計劃市場競爭開發需求推廣方案渠道策略等各個方面。產品經理一個產品線從頭到尾的重要參與人。
第五篇:intel筆試題
intel筆試真題一:
intel筆試共10題,1個小時,前6題智力題,第7題為設計一個高效率的內存管理,第9題關于intel的一段中文描述寫出150~200字的英 文摘要,第10題寫出150~200字關于你在5~10年內對IT的一些看法和自身的發展。下面列舉這次intel筆試精華:
intel筆試(1)編譯中的問題:全局變量如int i=5;int*(pf)()=foo;分別在何時被初始化?設計時候如何具體的實現。
intel筆試(2)OS相關的問題,內存訪問,cache等(包括cache在整個系統中的位置,畫出來,并解釋)
intel筆試(3)解釋例如mov ax,100H 這樣一條指令的cpu, os, memory等都完成了什么樣的工作。
intel筆試(4)Strlen()的C語言實現,不能使用任何變量。
intel筆試(5)編譯中display表的一些問題
intel筆試(6)一個hash函數,輸入隨機,現發生沖突,如數據集中在某幾條中,問怎樣處理hash函數保證高效的訪問,怎樣實現?
intel筆試(7)把Switch()case…語句翻譯成三元組。
intel筆試(8)一個byte(用C語言實現計數其中1的個數),給出最高效的實現方法。
intel筆試(9)上海有多少個加油站?你是怎樣解決這一問題?
intel筆試(10)C語言參數的入棧順序?為什么這么實現?
intel筆試(11)C語言中字符串的翻轉,最高效率(時間和空間)的實現?
intel筆試(12)你的最大的優點和缺點分別是什么?
intel筆試(13)你解決問題和分析問題的能力如何?請給出一個具體的例子來證明你的這種能力?
intel筆試總結:編譯原理、操作系統和數據結構等基礎知識比較重要,感觸頗深,自己的基礎不夠扎實,一些問題沒有很好的答出來,或者解釋的不對,各位同學努力吧~
intel筆試真題二:
intel筆試1:概率題。x,y為隨機變量,聯合概率密度 f(x,y)= intig(0,1)*dx*intig(0,x)*k*d
y,k為常數,求k=? E(xy)=?注:intig(a,b)為a到b的定積分。
intel筆試2:概率題。A,B為隨機事件,以下哪個正確
A.P(A U B)*p(AB)<= P(A)P(B)
B.P(A U B)*p(AB)>= P(A)P(B)
C.P(A U B)*p(AB)<= P(A)P(B)
D.P(A U B)*p(AB)>= P(A)P(B)
intel筆試3: 信道帶寬200kHz,信噪比10dB,求信道波特率=?
intel筆試4:以下代碼運行結果是什么int main(){int a,b,c,abc = 0;a=b=c=40;if(c){int abc;abc = a*b c;}printf(“%d,%d”, abc, c);return 0;}
intel筆試5:給出了從紐約出發和到達落山雞的各種航班信息,寫出找到一條從紐約到落山雞的最短距離的航班組合的代碼。
intel筆試6:從計算機圖形上截取某個物體邊緣的若干個坐標,求這個物體面積,并跟判斷是方形還是圓形,為啥。(坐標不記得,大概是個圓)。
intel筆試7:離散卷機與DFT的區別與關系。快速求不滿足2^N長度的離散傅立葉變換的方法有哪些 ?如何用fft求N*M點的離散卷機?
intel筆試8:給出fir和iir的優缺點。
intel筆試9:如何計算線性標量量化器的量化噪聲?需要那些假設?
intel筆試真題三:
向大家介紹intel筆試分三部分,第一部分考IQ,第二部分考編程,第三部分考英語論文!
第一部分 智力題 大概5,6道
intel筆試1.有5*5表格中找規律填數字
intel筆試2.在3個飛標得99分的投法,標盤有數字
intel筆試3.三角形各角有數字,找規律填上最后一個三角形一角上的數字
intel筆試4.表格中有字母右面對應數字,找到規律(其實就是字母表位置號)填上一個字母旁的數字
第二部分 技術題
intel筆試1 給出至少兩種方法實現系統存儲器管理 比如虛存 ……有點忘了
intel筆試2 程序實現八個皇后問題(經典數據結構算法)覺得滿bt的第三部分 翻譯
intel筆試1.給一段300字icsc的介紹性e文,寫sunmmary
intel筆試2.寫短文表達一下如何contribute ICSC
感覺intel筆試拉不出什么檔次,不過考試1個小時時間很緊,基本功需要扎實