那些年,我追過的語言
作者:陳天
程序君也年輕過,年輕的代價就是盲目追隨。
從 MS-DOS6.0 開始,程序君就是微軟的狂熱擁躉。
這種狂熱自 win95 走上高潮(有誰還記得 win95 光盤里帶的 Good Times 的 MV,請舉手),歷經《未來之路》,windows2000,最后在 dotnet 發布后到達頂峰。
那段時間,只要微軟反對的,就是我反對的。
不喜歡 Netscape Navigator,只因為 IE;詛咒過 SUN,對 Java 深惡痛絕,因為 NC 是 PC 的死敵,SUN 妄圖革微軟的命;使用 Visual Basic,啃 MFC,不為別的,就因為 powered by Microsoft。
但 VB 功能太弱(其實還是我水平太差),MFC 太亂,以至于大二時,我在給人打工做軟件的時候無奈地選擇了 Delphi。
雖然不怎么喜歡嚴謹的 pascal,但 Delphi 有讓我不得不用的理由。用它寫代碼清新明快,效率上甩了笨重的 MFC 幾條街,速度上讓 VB 相形見拙。在那個 Wake On LAN 才興起不久的年代,我用 dephi 做的印象最深刻的一個小 feature,是通過一臺電腦打開(或者關閉)局域網內幾十臺電腦。看著自己的軟件能『神奇』地喚醒機房里的一群電腦,別提多自豪了。
在我上大學的期間,做客戶端軟件(或者C/S結構的軟件)雖然能賺錢,但已經漸漸不酷了,ASP 的出現,讓我的興趣移師到 web(那時時髦的叫法是:B/S)。ChinaRen 的崛起讓我萌生了做自己的班級主頁的想法,但做出來的東西只能躺在硬盤上,在參加比賽的時候演示兩下 —— 那時幾乎沒有免費的提供 MSSQL 的服務器,而我做的『網站』,無一不基于 MSSQL 或者其簡化版。我像一只把頭埋在沙子里的鴕鳥,把自己限制在自己構筑的程序世界。
后來 DotNet 帶著微軟的萬千寵愛出爐,我第一時間接受了它。我一邊玩著 C# 代碼,一邊繼續無視如日中天的 Java 2 及 NB 哄哄的 J2EE。C#很迷人,一下子讓我有種想要扔掉 delphi 的趕腳,但無奈 dotnet framework 太大(而且相對較慢,當時),還在使用賽揚的客戶無法接受。
程序員在世最痛苦的莫過于最愛的語言(C#)賺不了錢,不喜歡的語言(Pascal)卻為你解決生計問題。
C#無法在我的兼職生涯中施展拳腳,只能作為又一個參賽語言或者研究院語言,被我拿著招搖撞騙(那時講 dotnet 就好比現在的云計算,大數據,很容易把不懂的人侃暈),寫著連我自己也不相信的虛擬企業信息集成系統,混各種核心期刊論文。
畢業后,本來想找份 C# 相關的工作,卻陰差陽錯地做了通訊領域,讓C取代C#,成了我的主流語言。大學時我的C也就是個習題水平,做過最難的習題不過實現 inode 模擬一個簡單的 unix 文件系統,然后提供幾個 shell 命令能創建目錄,創建和修改文件。到了工作崗位,socket,timer,hash table,ring 才真正走出教科書;而伴隨著通訊領域的工作,Linux 則正式走入我的生活。
認識到了 linux 的強大和從骨子里透出來的美感,我從此與微軟的技術漸行漸遠,也離開了混跡多年的 codeproject。
寫C的日子是枯燥的,尤其是用C寫 protocol。完整寫過的 IGMPv3,大部分代碼幾乎都是不用太動腦子的從協議語言到C的翻譯。
那兩年正是互聯網方興未艾的時候。google 正飛速發展,百度從新浪的搜索提供商(2B)開始尋求面向大眾(2C),3721 是瀏覽器的標配,而 mediaWiki 也隨著 wikipedia 的走紅而走紅。寫出 mediaWiki 的 php,成了我閑暇研究的對象。那時 LAMP 開始成為時髦詞匯,WAMP/Apache Friends 為還在使用 windows 的人們上提供全套互聯網開發環境。
后來我在做一個自動化測試系統時感受到了 php 的力不從心 —— 我缺一門好的膠水語言,在 web 和 system 間游刃。正巧坊間一直流傳『真正的程序員用C,聰明的程序員用 python』的偈子,于是我又學習了 python。這下拼圖完成了:我用 php 在前端接受用戶提交的任務,用 python 讀出任務,從 clearcase 中 checkout 對應的全套路由器代碼,編譯出 image,然后使用 pyserial(一個串口庫,可以連路由器的串口)和 pyexpect(expect 的 python 封裝)連上測試環境中的路由器加載編好的 image,然后調用測試團隊提供的自動測試腳本測試。
那時沒有 rabbitMQ 這樣的殺器,php 和 python 之間的任務同步做得很土:php 把任務插入到數據庫,python 程序死循環每 30s 從數據庫中讀任務。
后來我換到了現在所在的外企,很快在同事的推薦下小試了一陣 QT,QT 的 slot 和 signal 做得真心漂亮 —— 可惜那時客戶端軟件徹底從我的技能清單里被移除,我也就沒有繼續在 QT 上發力。
那段時間,C讓我糊口,php 讓我保持和 web 的連接,而 python,一直是我做各種小工具的最愛。
期間玩過 drupal,symfony。看 symfony 的作者的 screencast,才知道有種開發神器叫 TextMate,有個程序員的電腦叫 macbook。
symfony 對我而言是個很好的布道師,它讓我認識了 Ruby on Rails 和 django(源自 symfony 和二者的對比)。
它的一個聯系項目 jobeet 還為我日后為創業項目起名提供了思路 —— 對,toureet 就是這么出來的,而且 07 年前后這個名字就橫亙在我的腦海。這不算個很接地氣的名字,但就像初戀一樣讓人揮之不去。
知道了 Ruby on Rails 后,我才意識到如今已經是 RoR 橫掃一切的時代,幾乎是個創業公司就在用 RoR。JavaEye 的 Robin 稱自己幾天就搭了 JavaEye 出來,我雖然不怎么混 JavaEye,但這還是大大刺激了我一下,讓我對 Robin 和 RoR 好頓膜拜。
但那時 RoR 內部分裂了有一段時間,社區正在開始思考如何讓分裂的兩個分支摒棄前嫌,在 RoR3.0 大一統。這讓我好生郁悶:究竟是等還是不等那遙遙無期的 RoR3?畢竟,之前 symfony2 已經狠狠地擺了我一道 —— 我在 1.x 上寫的代碼在 2 里無法運行,而且 2 的改動之大讓我一時間無法適應。如果現在入手學習 RoR2.x,會不會重蹈覆轍?
兩權相害取其輕,我最終選擇了 django。
然后機緣巧合加各種必然,我走向了創業之路。
等我『畢』業時,我已經算是 django 和 javascript 的熟手。
javascript 是個很有意思的存在。我大概在 2000 年左右抄(對,抄的)的第一段 js 是一個問候的代碼,大致是檢查當前時間,然后提供不同的問候語。很傻很天真。
那時的 javascript 惡名遠揚。除了好玩,沒人嚴肅看待它。
直到幾年后 prototype.js 和 http://script.aculo.us 出現(誰還記得你們呢?sigh),javascript 才開始自我正名。
然后是神一樣的 jquery。
接下來羽翼豐滿的 javascript 開始玩 MVC,代表作是 backbone.js。
還玩函數式編程,如 underscore.js。
總之到我創業時,javascript 的生態圈已經無比繁榮。途客圈的第一個產品的計劃編輯器使用了 backbone.js,第二個產品前端全面采用 ember.js,而且用 coffeescript 撰寫。
我寫了個 makefile 把所有的 coffeescript 整合編譯打包。
我好像沒提 makefile 吧?程序員最好會 makefile,減輕很多事務性工作。
然后 javascript 在 V8 的基礎上開啟了 nodejs 時代,nodejs 讓 javascript 登堂入室,成為后端的一股勁旅。
從此前端工程師開始屌絲逆襲,成了香餑餑。會 Python 的不見得敢寫前段代碼,但會 javascript 的已經在后端開疆拓土。
笨重的 XML 此時已經向 JSON 讓路,前后兩端的數據通訊被 javascript 把持。
mongodb 的出現進一步助長了 javascript 的氣焰 —— 連數據庫都是 JSON(BSON)存儲,javascript 作為存儲過程(這么說好理解些),javascript 還有什么不可以?
幾乎在一兩年間,LAMP 改朝換代成了 MEAN(MongoDB,Express,Angular,Nodejs/Nginx),nodejs 大有當初 RoR 橫掃一切之勢。
構建在 nodejs 上,提倡 react 的 meteor.js 向整個互聯網刮了一陣清風 —— 原來網站的代碼還能這么輕巧地讓一切動起來!草草學習了花了幾個晚上,我寫了 teamspark,成為了途客圈團隊內部的標準溝通工具。可惜不知怎么的,meteor.js 的發展漸漸受到瓶頸,打下的良好用戶和市場基礎在這兩年的緩慢更迭中一點點被消磨。
后來我從互聯網回到了通訊領域,趁著一段難得的清閑,好好研究了下 concurrency。concurrency 自然少不了 Joe Amstrong 的 erlang。erlang 相對于我理解的那些語言,有點不食人間煙火的意味。
在 erlang 身上我貪婪地攫取了很多知識。erlang 適應起來很難,尤其你想表達 x=x+1 時會感覺那么地痛苦與無助。我頗花了一些時間才搞明白 atoi () 在 erlang 中究竟怎么實現。
盡管我尚未用 erlang 寫過什么像樣的系統,但它對我思想的沖擊是巨大的。
最終,我從 erlang 延伸到了 go。go 是門優點與缺點同樣突出的語言。本來我正是把它當作一個帶并發支持的"modern C"來看的,但深入下去后發現,go 和C是兩個世界的人。go 只能在某些場景下替換C,但無法取代C。soft realtime 是個魔咒,把幾乎一切有 GC 支持的語言擋在了C的另一側。現在看來,也許只有 rust 能從理論上取代c/c++。
go 已經發展到 1.2 版本,但依舊任重道遠。首先,它的編譯速度比宣稱的慢不少,執行速度更是比C差了不少,很多場景下(尤其 GC 相關),要比 JVM 下的語言(如 scala)差。
go 也有不少 bug,連我都能發現一個嚴重的導致可執行文件好幾百兆的問題(沒處理好 bss 段)。
但 go 精巧的語法,簡潔的思想,語言內置的并發支持,讓它還是我不斷學習的對象。
人的精力畢竟是有限的。很多語言看了看思想,寫了寫簡單的例子(上百行代碼)就擱在一邊了。在此鳴 謝:ruby,elixir,io,emacslisp,scala,nimrod,rust,clojure,lua,我從你們那里吸收了不少有意思的 知識,卻淺嘗輒止,沒有深入和你們互動下去。
也許你會問:一門語言究竟多久能掌握?
學精一門語言,也許需要花上三五年的功夫,也許還要更長。
但學精了一門語言后,學第二門一周也就該能入門了(erlang, haskell, lisp 除外)。
現在我不再會對某個公司的技術有特殊的偏見。我擁抱一切能提高生產力的技術。
也許你會問:學那么多語言有什么用?
如果用來養活自己,一門學精了就足夠。其它的沒什么用,也就消遣消遣。我看中語言背后的思想,會比較用不同語言開發的樂趣。另外,當你喜愛的語 言添加了新的特性(或者你用到了某個高級特性),你可以一下子就想到了背后的邏輯:啊,原來這是 xxx 的思想。于是,你對這兩門語言的掌握又加深了一層。
我目前最大的遺憾,是沒有靜下心來好好看看 java。
雖說對技術沒有偏見,但我依然痛恨惡心的 IE6/7;同時,我打心底喜歡一樣東西:MAC。
如果說對程序員有什么忠告,那就是:Every programmer should use MAC。
$ brew install nimrod
愿每個程序員都成為人生的好獵手!
^_^
<span id="shareA4" class="fl"> </span>
</div>