30虛歲了。這一、兩年,有事沒事之中口中經常念著李商隱那首《錦瑟》:
錦瑟無端五十弦,一弦一柱思華年。莊生曉夢迷蝴蝶;望帝春心托杜鵑。滄海月明珠有淚;藍田日暖玉生煙。此情可待成追憶,只是當時已惘然。
此情可待成追憶,只是當時已惘然。回首過去的十年,堪稱快意,十年里,領略了很多領域:新材料、寫作、技術管理、企業分析、軟件開發等等,都留下了不深不淺的腳印:材料學是我本來的專業,很順利的拿到碩士學位;其它成績也不平凡,小說發表過,書籍出版過,項目主持過,公司成立過,可算豐碩。而今回想,卻只有一個詞:浮躁。
以開發而言,起始于1997年mud程序開發,起步于網絡浪潮階段,asp呵呵。后來自然就過度到asp.net,C#。隨著項目需要,C++,java,Tcl,Python……用過的也不少。也曾經癡迷過模式,那段時間買書都是從amazon上買,一個月幾千的書錢。而今回頭看,大浪淘沙,所余有價值東西不多,卻忽略了很多重要的東西,可見當年的浮躁。
一、先談忽略的東西。
(1)英語。
十年前,那時SQL Server 還是 7.0,純英文的,找不到一個漢字。有一天,我要備份數據庫,一看上面選項:Backup……Restore……。當時英語是三級左右,不認識啊,我就猜:Store不是存儲嗎,Restore……再存儲不就是備份嗎?up不是起來嗎,Backup不就是把后面的東西拎上來嗎?于是,Restore被我理解成了備份,Backup被我理解成了恢復。結果:幾天的數據頓時灰飛煙滅。
英語的重要性怎么強調都不過分。第一點,就開發而言,大部分技術文檔都是英文的,讀英文能夠更加精確的掌握API,要盡可能的看英文文檔而不是翻譯過來的文檔。第二點,就需求而言,一美元在老外眼中和一人民幣在我們心中的地位差不多,好幾倍的差距啊,英語好能夠更好的和他們溝通,賺這些票票。
哎,可憐我的啞巴英語。
(2)數學
只能以“當時已惘然”來形容。
微積分、線性代數、概率論/隨機數學、數值分析這些大學數學的重頭戲,當初年少輕狂,以為今后不會再用到就沒怎么認真學。
隨機數學是后來最先用到的,做論文時,我用基本的隨機數學工具結合一系列簡單的表征巧妙的得到了材料的一些特性,于此體會到數學工具的威力。一年后,做離散事件仿真,也是隨機數學大放異彩。
最近在CSDN上看到了一個圖像識別項目,很快的我就做出原型出來,到后來,識別率卻上不去。要讓識別率上去,需要用到神經網絡、Hough變換等數學工具。《模式分類》一書看了大半,就把在我大腦中昏睡十年的微積分、線性代數、數值分析都喚醒了。暈倒,什么神經網絡,搞過來搞過去還不就是求極值,當初大學的《數值分析》換了個馬甲而已。
(3)執著
擅長十件事情不如只擅長一件事情。回想十年,我的另一大失策便是擅長的事情太多。別人只用把精力放在一件事情之上,我卻需要將它放在多件事情之上。當初大家都處于差不多同一起跑線上,而今,大學同學差不多已步入職業生涯的上升期,堅持創業的狐朋狗友也有小成,堅持寫作的狐朋狗友也成了知名作家,而多條腿走路的我卻離起點并不太遠。用軍事話語說,就是犯了分兵之大忌。
(4)規范
學習規范是最廉價的學習方式,關注于工具,忽略規范往往會付出很大的成本。以我自身的例子來說,我開發了很長時間的Spider,卻沒有閱讀過Html規范,最近將html 1.1規范打印出來再看,發現自己之前對html有很多的誤解,有很多bug源于這些誤解。
從北京回到我現在的城市,關于.net的電腦書,我只帶了一本,就是《.net程序設計規范》,而在這之前,規范卻是我一直忽略的。
二、再談體會。
(1)價值
無論做什么事情,腦中都要有這個詞——價值。沒有價值的東西,易變,不易把握,不易長久。追逐技術,需要考慮價值問題。我們是為了實現價值去學習技術,而不是單純的為了技術而技術。
技術的價值體現在:
·解決問題。如,實現一個功能。
·提高生產力。如,實現同樣的功能,引入框架可以縮短開發周期,提高質量。
·提供良好的產品或體驗。如,Ajax。
能夠有效的解決問題的人是領域專家。能夠提供足夠的生產力的人是技術專家。能夠提供良好的產品或體驗的人是產品專家。
可以經常問問自己:
(a)有哪些待解決的問題呢?
技術的發展是對生活的解構與重構。計算機技術的發展成功的解構與重構了印刷術,避孕技術的發展成功實現了做愛與生殖的分離。
我們能否通過技術將美味與美味的載體分離呢?能否有可編程美味芯片呢?
這個問題很有意思,不過太大了,在短期十年二十年可能都不會實現。
換個小點的。以股市為例。股民的預期對股市價格有很大影響,而股民的輿論可以在某些方面反映股民的預期,互聯網是一個很大的輿論平臺。如果能夠發現股市輿論和未來股價之間的關聯,并且通過網絡輿論監測和數據挖掘來測量股民的輿論,這樣的系統是有價值的。
(b)有哪些提高生產力的方法呢?
影響軟件生產力的有幾個因素,人力是一個因素,開發過程是一個因素,技術的基礎設施是一個因素,需要綜合考慮來進行技術決策,而并非盲目的學習新技術,學習新方法。
(c)如何提高用戶體驗?
有時候,我們拿到新工具了,卻往往忘了我們為什么要用該工具。以ajax為例,ajax通常能夠提高用戶體驗,但它也能夠破壞用戶體驗。比如,我的gmail信箱經常登陸不上去,必需清空歷史數據,清空里面的js緩存才能夠正常登錄。再比如,前一段時間的china-pub搜索功能80%情況下用不了。這樣,就違背了它本欲實現的價值。
順便罵一下csdn,怎么看怎么像雜貨鋪。
技術這東東只能是媒介,可能變動很快,但是價值卻很少發生變化,就如男男女女,花里胡哨的,無非就那點事情,換換馬甲而已。
(2)競爭力
嘿嘿,有價值的東西未必有競爭力,比如,水,生命中不可缺少,卻是超級的便宜。無它,易得而已。同質的東西多了,競爭力就下來了。
就做技術的人來說,競爭力主要集中于:
·深入??? 一件事情做得比其他人都好,弄的透徹,自然就具有競爭力。走這條路需要的是耐心。
·細分 把一件事情做出花樣出來,在滿足客戶基本需求基礎之上,同時相比其它競爭者,能夠更好的滿足客戶的其它需求。走這條路需要的是對需求的研究和掌握。
·前瞻 在未來的事情發生之前,便弄一些東東等在那里。放眼天下:舍我其誰。這條路需要的是洞察力和毅力,還有很大的運氣成分。
最近在網上接活,有個很有意思的發現。
感覺活分兩種:
一種活你干的時間越長,單位時間里得到的報酬越少,因為這些活不急又具備很強的競爭性,發布者在心理上是按著市場價進行定位的。
一種活你干的時間越短,你的總報酬就越多,因為這些活又急,能做的人又不多,或者能做的人雖多,但是能在短時間內做出來的人極少。你做的越快,得的錢越多。發布者根據心理價進行定位的。
你適合干哪種活呢?作為技術人員,我們需要經常思考自己的競爭力。
(3)靜下心來時看看毛選
三、對一些技術的評價(個人立場)
(a).Net 3.5/VS 2008
感覺最爽的是屬性那一塊不用寫具體的get, set了,使代碼一下子清潔了很多。
擴展方法是個好禮物:它可以使我們的關注點更好的集中在對象上。沒有它,之前要寫很多很多helper類,而到具體用時,要去仔細去翻這些helper類,浪費時間,浪費腦細胞。尤其是和ActiveRecord結合在一起用真是順暢啊。
Linq:怎么看怎么像馬甲。目前還沒發現需要用到它的地方。
Lambda:C#下不能自動推導類型,用處僅限于節省點語句,解決一個問題(少寫語句)的同時又引入新問題(多掌握一點語法),毛用沒有。
Silverlight:沒興趣。
SOA:沒興趣。
(b)OO
DP:忘記差不多了,心中只記得一條,就是策略模式。話說編程時間長了,這玩意就是水一樣的存在,寫代碼自然而然就那樣子了。反而是OO設計的那幾條準則是時間越久,記憶越深刻,體會越多。
UML:不做大項目的話,毛用沒有。
四、我心目中的優秀程序員:
(1)有1-2個自己擅長的領域。比如Web前端開發,就得擅長html,css,js那些東東。偏業務的,就得擅長需求分析、建模、溝通。
(2)掌握一種適合自己又能被團隊/公司/客戶接受的軟件開發過程。
(3)熟悉相關的技術基礎設施(基本工具,基本框架)