從程式設計師到軟體工程師[1]

才智咖 人氣:3.24W

看了程式設計師系列文章,頗多同感。做為一個從業13年,一直做軟體開發的人,我想給那些已經、將要和有志於走上這條路的朋友一點點忠告。

從程式設計師到軟體工程師[1]

首先,說說程式設計師和軟體工程師。雖說都是程式設計的幹活,但是還是有一點高下區別。

主要說來區別是程式設計師programmer是將程式(已經有流程,虛擬碼或設計模板)寫成程式碼;需要熟練掌握至少一門程式語言。而軟體工程師則要將目的描述成程式語言並實現的能力。例如將數學演算法、自然語言、思維模式描述成程式演算法,程式流程/類或/和人工智慧,並寫成程式碼的能力。

對初入行的人,當然重在語言,要做一個合格的程式設計師,首先要熟練掌握語言。包括語言特性和實現的能力。例如使用盡量中文說的面試題,就要求面試物件掌握C++中的類的封裝;建構函式的過載和運算子過載。

做過一兩年後,要想繼續吃這碗飯就必須提高自己,首先當然是深入瞭解語言,特別是語言的思維方式,編譯器的工作方式和常用設計模板。就拿C++的多型性來說,很多公司面試就會問什麼是虛擬函式/純虛擬函式(思維方式)?用C如何實現函式過載(函式指標和了解編譯過程)?介面類/工具類/工廠類和 Sigleton類的實現(常用設計模板)。另外還有一大塊就是記憶體管理了。

如果能做到深入瞭解語言本身,那麼恭喜你,你現在Title至少是高階程式設計師了。

在對自己的語言有信心後,下一步就想一想自己要想哪方面發展。是管理方面(專案經理)還是技術方面(軟體工程師)。既然這裡討論程式設計,我們就先不考慮專案經理。想發展為一個軟體工程師其實也有兩條路。一條是走系統軟體工程師或者叫架構工程師的路;另一條就是演算法工程師。

在國內的朋友我建議走架構工程師的路。要求就是知識面廣,對整個系統熟悉,能很快了解和分析客戶/設計需求,很快估計工作量、風險和所需要的資源(承擔相當部分專案經理的任務),能根據現有技術人員儲備提供一個解決方案。當然還需要一定的表達能力和文件寫作能力。例如我當年走訪某省農行,和對方聊了銀行卡和醫院醫療卡的聯網,當天晚上就和市場部的人合作,搞了一個通宵,寫出了60頁的技術方案和外加40頁的基於此方案的標書。

一般來講,要做到對整體系統的深入瞭解,沒有兩三年的時間是做不到的'。所以給國內程式設計師的建議是不要頻繁跳槽,尤其是不要頻繁跨行業跳槽。踏踏實實地將本行業的軟體吃透,最好每個部門或模組都工作過。如果有這個想法,一般情況下你可以和專案經理溝通,通常他們會鼓勵你這樣到各個部門/模組工作。

我出國後,發現情況有點變化,由於語言和文化的區別,對自己走系統工程師的路沒有很大的信心。只好轉向走演算法工程師的路了。

確定了這條路後,突然發現自己的數學能力太差了。不得不重新惡補線性代數,概率和數理統計等高等數學。同時將《資料結構與演算法:C++版》好好從頭到尾讀了一遍。然後終於矇混到了一個職位。

當時第一個任務就是在一個嵌入系統中寫一段程式將bmp壓縮為jpg。各位可能會問了,這個在網上滿大街都是原始碼,為啥還要自己寫呢?其實這就是我不太建議國內工程師走演算法這條路的原因。除非你是數學大牛,有自己原創的演算法。否則在國內實在沒有演算法工程師很大的生存空間。但是在國外有很大的不同,稍正式的公司基本上都禁止使用open source。因為open source也是有版權的,有的是不能商用,更有的copy left是那些公司碰都不敢碰的。因為copy left要求你使用了他的程式碼,你也必須公開你的程式碼。

當然,我們可以看那些open source,然後自己重寫。不過相信我,通常情況下如果你不是想簡單做些變數替換就交差的話,看原始碼不如看這個演算法文件本身。