天天看點

想象5年後的你-----寫給對程式迷茫的人

想象5年後的你-----寫給對程式迷茫的人

釋出于:2012-9-7 17:14:47   以前寫的了

想起《想象5年後的你》這篇文章,源于到現在正好工作五年了,不短也不長,最近一起工作的同僚剛剛學校畢業,實戰經驗不足,上手工作稍顯吃力,但是當被問及三年之後的目标時,無獨有偶統一的回答都是:“三年之後希望能獨立設計完成某個子產品的功能,希望能獨擋一面”,每個人都迫切地希望實作自己的價值。

如果你希望三年之後能獨擋一面,獨立完成某個功能子產品的設計,編碼,測試和維護,必須對從開始建立工程到程式的運作過程了如指掌。

獨立完成功能子產品,你需要知道的東西:

1.       代碼工程的組織和配置

工程有exe,lib,dll等類型,需要的檔案有頭檔案(.h),源檔案(.cpp),靜态庫檔案,靜态庫的頭檔案,動态庫檔案,動态庫的頭檔案等。各種檔案在不同的目錄内,怎樣配置工程去正确的目錄尋找檔案編譯連結,工程尋找需要的檔案時的路徑查找順序。工程的自動編譯腳本,工程的輸出檔案路徑是否設定正确。

2.       線程模型和線程通信

功能子產品是否需要開啟一直新的線程來完成工作?功能線程和主線程的關系是通信還是互斥通路?通信還有何種方式osp消息,windows消息,自定義的socket消息,管道,郵箱?如果是互斥,通過何種機制完成互斥的,關鍵區域,信号量還是事件?采用基本的API等待和釋放事件還是采用C++的類方式完成信号的自動釋放?有沒有死鎖?發生死鎖怎麼辦?線程的優先級,作業系統怎麼排程線程的?線程數量是不是越多越好?

3.       記憶體模型和資料存儲

完成某個功能需要哪些資料,不同種類的資料配置設定的位置,是全局的,棧内的,還是堆上的?程式啟動時資料的配置設定和初始化順序,不同位置的資料其最大長度是否不同,棧内配置設定了一兆的資料是否會棧溢出?批量的資料怎麼存儲,使用數組,還是STL的array,list,map?批量資料是否需要查找,如何查找?資料是固定的長度,還是可變的長度?是否有記憶體的洩漏?頻繁地在堆上配置設定釋放的資料,是否有碎片,是否需要使用記憶體池?記憶體洩漏了怎麼辦?

4.       程式啟動處理和退出的流程

有了線程和資料存儲,還要過一遍資料的處理過程。程式啟動時開啟了哪些線程,線程的啟動順序是否會造成業務錯誤,使用者的資料從哪裡輸入,網絡,使用者界面,檔案還是資料庫?資料如何處理的?輸入資料錯誤怎麼處理?同一段資料處理需不需要多線程互斥通路?資料結果如何輸出?展示給使用者界面,網絡發送,還是寫檔案資料庫?程式如何退出?線程的關閉順序,如果某個線程阻塞,如何讓其快速退出?請求的資料是否都已經正确釋放?

5.       元件庫

元件庫的接口定義是初學者的一個難點。其實并不複雜,依照上面的4條原則分析,工程如何組織,lib還是dll?需不需要依賴其他的lib和dll?lib庫内部需不需要再開啟業務線程?業務線程和調用者線程怎麼互動?兩隻線程如何互斥通路資料,或者如何通信?資料從哪裡輸入,怎麼儲存?資料的處理邏輯是怎麼樣的?處理完的資料如何輸出?内部的全局資料和業務線程如何初始化和啟動,配置設定的資料和業務線程如何釋放退出?需不需要提供庫的初始化和銷毀函數?這一系列走下來基本上調用者群組件庫的邊界清晰明了,接口八九不離十。元件庫需要額外考慮一個問題:庫的API被重複調用或者錯誤調用時,怎麼防錯?  

偶爾還會出現程式崩潰,死鎖,死循環,堆棧溢出,記憶體覆寫等問題,你需要找到解決問題的手段。

三年之内要掌握的東西很多,但是這點東西對年輕人的沖勁來講,真的是微不足道。

繼續閱讀