池建強:程式設計師如何選擇技術方向

edithfang發表於2014-11-27
最近寫了「當程式設計師老去」「程式設計師真正的價值」兩篇文章,傳播甚廣,今天是第三篇:「程式設計師如何選擇技術方向」,史稱「程式設計師三部曲」。
那之前寫的幾篇程式設計師文章算什麼呢?算前傳吧。以後再寫程式設計師文章算什麼呢?算後記吧。


2008 年秋天的一個午後,溫暖的陽光透過落地窗落在我面前這個長長的寫字桌上,桌子對面坐的是一個瘦小的程式設計師,他的名字叫小明,小明有些茫然,他看著我,不知道該說些什麼。

程式設計師都是很嚴謹的,我不得不首先發出一個 System Call:

你在客戶現場這半年做什麼工作?
寫單元測試。
還有呢?
沒了,就一直寫 JUnit。
別人也寫單元測試麼?
沒人願意寫單元測試,只有我寫。
  ……
你為什麼想來研究院呢?
我想寫一些真正的程式。
什麼是真正的程式?
比如 Java,比如物件導向程式設計,你總要寫一些類和各種各樣的方法,而不是一直寫 Test Case。
好的,沿著這個樓梯上三樓,那裡有一群和你一樣的程式設計師,他們不僅寫 Java,還寫 JavaEE 相關的各種程式,你會找到自己需要的東西。
真的麼?
真的


那時候我風華正茂,沒有現在這麼老成持重,陽光照在我的翹著二郎腿的腳面上,一切都顯得十分虛幻,在小明的眼裡,那時的我估計很像「黑客帝國」裡的墨菲斯,但是他不能確定自己是不是「The One」。小明疑惑的看了我一會,最終還是上樓了。至此,他完成了第一次技術方向的選擇。在三樓,他碰到了一群同樣嚴謹的程式設計師,他不僅學會了寫真正的 Java 程式,而且掌握了部分 Web 程式設計和伺服器端程式設計,包括 JavaScript、JQuery、Spring、Hibernate、JMX、Web Service 等等。小明變得快樂起來,漸漸擺脫了註定孤獨一生的陰影。

過了一段時間以後,小明已經不滿足只寫 Java 相關的程式了。有一天他看到我手裡的 iPhone 和 Mac,彷彿見到了初戀的情人,眼中重新燃起了綠油油的光芒,他知道了 iOS 開發者這回事。很快,他花掉了所有的銀子購買了 Mac 和 iPhone,開始日夜兼程,學習 iOS 開發。他在寫 Java 的間隙編寫 Objective-C 程式碼,在編譯 Web App 的同時構建 IPA,在清晨的微光中除錯程式,在每個夜晚與模擬器竊竊私語……他完成了第二個階段的技術方向選擇。

終於到了離別的時候,他要去尋找更大的夢想,經年以後,在南方的某個城市,他成了一個知名公司的 iOS 主程,並開發出了多個著名的 iOS 應用,比如「丁香醫生」「用藥助手」「家庭用藥」等等,難以想象,如果沒有小明,張老師怎麼去見小姨子,馮老師何以拯救網際網路,二爺怎麼鑑書,西湖何以養醋魚!

第一個故事講完了,主角小明利用兩次主動的技術方向選擇,完成了從小球到小牛的逆襲,以至於現在連女朋友都有了。

這時候就有讀者要問了,那些大牛是如何做技術選擇呢?

大牛不需要做技術方向的選擇,他們需要什麼就學什麼,學什麼就成什麼。他們就象掌握了「九陽神功」的張無忌,各種型別的技術和程式到了他們的手裡都能發揮出巨大的威力。技術,是他們生命中最重要的組成部分。

如果你們以為我在吹牛我就給你舉個例子。我在《MacTalk·人生超程式設計》中寫過一個技術高手,他的名字叫做攀攀。很長一段時間我都不知道他掌握了哪些技術,因為他的技術是我們很多人的超集,我們遇到的所有問題都可以在他那裡得到解決,他只是叼著煙翹著腿敲下幾行程式碼而已。後來我才知道,他在高中的時候已經痴迷於計算機了,大學時代自學了大量的計算機相關的知識,作業系統、資料結構、演算法在他大學畢業之後就已瞭然於胸。

直到最近,我才從網路上拿到一份他幾年前的簡介,那個時候,他的履歷是這樣的:

ID :攀攀
性別:男
師門:電子科技大學 98 年計算機系
職業:網路引擎設計者
人物背景:精通 C, C++, Java , Pascal, Basic, Fortran, Cobol, PL/M, Perl, Python, Lisp, Prolog, Smalltalk 、 bind 、 Ldap 、 PVM 、 MPI 、程式設計自動化、 Linux 核心程式碼, JDK 原始碼, GLibc 原始碼, Apache 原始碼、常見的網路協議內部實現、網路通訊……是真的精通
武學造詣:決不要把計算機強加給人們的限制認為理所當然,人不是機器的奴隸,把了解機器的限制作為通曉計算機的標準只能是自欺欺人
遊戲感言:IP 路由和認證的雙重功能將是未來網路遊戲發展的障礙,今後的網路應該是以分散式目錄服務為基礎的,以網路裝置為中心,與具體無機無關。整合了廣泛的認證與授權能力的網路(全公司上下沒有人能聽得懂他在說什麼,好在大夥兒都已經習慣了)。


都是 98 年畢業的,人和人的差距怎麼那麼大呢?無語淚千行!

兩個故事講完了,究竟如何做技術方向的選擇呢?答案就飄在風裡……

1、作業系統、資料結構、演算法、網路等基礎技術應該在大學時代深入學習,如果畢業了你還沒有掌握這些內容,那就隨用隨學好了。學習這些基礎理論極為枯燥,只有實際工作中的需求才能給你最大的學習動力去掌握這些艱深的內容。

2、至少要掌握一門靜態語言,比如 C、C++、Java、C#、Objective-C 等。至少掌握一門動態語言,比如 Python、Ruby、PHP 等。

3、推薦學習一些同時具備動態語言和靜態語言的特性語言,比如 Go、Swift、Scala 等。這樣你會對物件導向程式設計、程式導向程式設計、編譯型、解釋型語言有更深入的瞭解。

4、系統的構建自己的知識體系,而不是侷限在某個點上。經常有讀者問我,我前幾年一直在寫 VBA/ActionScript/Delphi/SQL ……現在專案組突然不再採用這些語言了,怎麼辦?很多人難以預料未來技術的走向,但是你至少要構建自己的技術壁壘和平臺。學習 Java,就應該構建你自己的 JavaEE 平臺;Objective-C 對應 iOS/OS X 開發平臺;C#,對應 .Net 平臺,SQL,對應資料庫平臺。如果你在用 ActionScript,那你不應該侷限在 Flex 上,你對應的是整個前端平臺。

立足平臺,你會站得很穩。立足一個點,你可能摔的很慘,就是這樣。

5、主動選擇技術方向比被動等待好。根據自己的興趣和技術的發展主動選擇,就像小明一樣,有時候放棄也意味著得到。

6、不要過於追新,不要每出一門「顛覆性」的語言或技術都投入精力物力。追新的後果很可能是該學的沒學會,不該學的學完也忘了。我有一哥們,我們都在寫 JavaScript 的時候,他認為 Java 新推出的 JavaFX 才是前端的未來……然後就沒有然後了。我們都用 Java 的時候,他認為 ERlang 是才是程式語言的未來……然後就沒有然後了,可謂一步早,步步早,讓人扼腕嘆息。

7、也不要過於保守,比如 Go、Swift、Docker 等技術,我個人以為是值得投入時間和精力的技術。

沒有 8 了,寫到這裡,冬夜已經黑的不像樣子。站在陽臺望出去,彷彿看著某個巨大 IDE 的黑色編碼主題,我想起了某位大牛的一句話:我不是懂得多,我只是學的快而已。
相關閱讀
評論(1)

相關文章