語言真是不重要的嗎?談語言的*層次*與技術的三六九等
關注——或“專注”于多語言編程之后,老趙對于語言的關注也越來越多,對于語言在編程中所帶來的“美感”也有了越來越深的體會,還在博客的標題中加上“追求編程之美”。關注語言多了,關注純粹的編程實踐多了,自會有所比較,然后寫出了引人注目的《為啥老趙不喜歡Java*語言*》。這篇文章所得到的負面評論的確也和想象中差不多,大部分朋友的觀點是“語言不是關鍵”或類似說法,似乎對語言的討論和比較非常沒有必要。有個朋友說的更是直接:“在看到這些文章之前,我還是比較敬重老趙的,不過現在發現你也就這點高度”。老趙認為,這是對這方面的誤解,而有這種誤解無論是對于社區還是個人的發展都是沒有益處的,因此單獨開篇,討論一下這個問題1。
“高度”,是個多么“發人深省”的名詞,往往直接就將事物分了三六九等。封建社會將人認為三六九等即從“出身”或“行業”決定了一個人的社會地位高低,例如,即使是“戲子”或“工匠”等下等職業,就算成就再高也被主流社會所排斥,大部分人依舊從心底里瞧不起那些人。不知道您對這樣的劃分有什么看法,老趙對此沒有看出任何科學性,也沒有任何好感。不過現在國內“主流”觀點也在技術方向分了三六九等,例如以下便是一個典型:
- 上等:系統架構
- 中等:框架設計
- 下等:語言實現
為了證明自己的“高度”,為了避免接下去討論的內容把老趙“下等人”的老底給顯露出來,老趙先用一段話為自己披上“上等人”的外衣:
“如果要實現一個‘高性能’、‘大并發’的網站,前端使用4層7層負載均衡,如果不用F5等商業產品可以先用Nginx等做反向代理。后臺實現要對系統作劃分,避免單點失敗,也可以作獨立優化。系統之間可以用異步消息傳遞來降低耦合;系統中不采用二段式提交或分布式事務,CAP原則中的“一致性”往往需要做出讓步,而采用‘最終一致’策略。數據存儲方面可以做橫向或縱向的劃分,或者構建查詢表。合理使用Schemaless的設計方式或如何MemcacheDB或Tokyo Cabinet等Key-Value存儲方式可以帶來更好的伸縮性。除此之外,系統中還需要部署Memcached集群作為緩存。靜態文件可以使用Squid或Varnish作為緩存,避免所有IO都直接落到文件存儲上……”
其實老趙只是把大腦皮層最表面的某些“知識”給傾倒出來一些,我不知道這些內容給您感覺是什么,是不是會覺得很有“高度”。但是老趙覺得,這些東西看起來可能會“過癮”,但是卻毫無營養。其實所謂我們很多草根人士平時在談論“系統架構”的時候,往往就是把各種產品,原理,實踐進行組合拼接,其實說起來和看著市場上產品報價然后攢出一臺電腦沒有本質的區別。因此老趙現在看到這些東西已經不太感冒了,目前一直在設法研究從某個細節方面真正有效地提高“某個參數”,而不是從一個非常高屋建瓴的方面對整體提出一個所謂的“指導”。
不是每個人都有能力和條件成為鄧爺爺那樣偉大的改革開放總架構師的。
作為一個普通人,我們很容易對自己不太了解的東西產生一種崇敬之情。例如搞.NET編程的,往往會對“操作系統”,“線程調度”,“文件系統”,“匯編”等名詞望眼欲穿,覺得那些才是真正有“技術含量”的東西。其實每個人的工作都是建立在另一批人的抽象之上,然后再這個抽象上產生更多的價值,如果因此對自己產生懷疑,硬要分個高低貴賤三六九等,這估計可以算作一種“妄自菲薄”。而“語言”作為我們技術人員每天都會接觸的事物,似乎人人都會,人人都懂,談了再多也只是一種“低級”的問題。如果還在專注,還在比較,那么“你也只能算是這點高度了”。
我們每個人從接受計算機教育的一開始似乎都會被告知一個正確的道理:“語言只是工具,重要的是能力與思想”。這句話本沒有錯,但是一句正確的話被強調過渡了可能也會成為一種錯誤。例如KISS原則的本意是要避免“過渡設計”,而老趙不止一次發現它已經被某些朋友用作“不設計”的理由。語言之余技術人員,就好比兵器之于武林人士。強調“能力”好比強調“武功內力”這不會有錯,但是根據老趙多年閱讀的沒有上百也有數十本武俠小說中,的確沒有發現武林人士對神兵利器的品評與追求體現出嗤之以鼻的態度。
很多朋友認為,高手是不會介意語言的選擇,而語言也不會影響高手的能力。老趙并不同意這個看法。老趙同意“對于同樣的工具來說,能力決定了生產力”,卻不同意“有了能力,工具對于生產力的作用微不足道”。在TL上有朋友說了一句老趙認為非常有道理的話:有些武功也必須是有特定的兵器才能修煉的。如果只有匯編語言,那么大部分人都無法突破“子過程”這個抽象級別,更別說“面向對象”了。因為“語言”往往會對“設計”有巨大影響,所以Linus會炮轟C++,Anders Hejlsberg和James Gosling會對語言設計中是否應該有Checked Exception持不同意見。
看大師爭論很過癮,那些總不會是“低層次”的爭論吧!
“圖靈完備”已經從理論上保證了語言的能力“足夠”表現出任何邏輯,但是世界上還是有各種各樣的語言層出不窮,在一個又一個地方放出不同光輝。而由于一般的“通用語言”在表現某個特定問題的時候會顯得比較“嘈雜(Noise)”,因此現在DSL的概念也愈發蓬勃了起來。老趙懷疑,高手的能力真能忽略語言的特性的不同,得到同樣高度的生產力嗎?如果真是這樣的話,老趙現在所追求的“混合編程”的意義又在哪里?老趙不知道Martin Fowler為什么會說“People may say that Ruby is less noisy than Java, or that external DSLs are less noisy than internal DSLs”。不過我懷疑小李探花手持天機棍2后是否還能在兵器譜上排名第三。
誠然,高手超能力的作用無法被忽視,他們也可以用Java寫出流暢的API(fluent interface),正如jMock在為Java平臺帶來了一股清新的空氣。但是Moq使用C# 3.0中引入了Lambda表達式之后,從Rhino Mocks(與jMock的語法類似)手中搶走了大量的市場份額,迫使它也不得不使用Lambda表達式應戰。同樣,即使C#的擴展方法特性可以在一定程度上改進單元測試的語義,如果您把它和Scala實現的specs,或者F#實現的FsUnit相較“Behavior-Driven Development”,高下立判。今后老趙也會給出自己在混合編程上的探索,您一定可以更明顯地發現不同語言在解決相同問題時產生的區別。
“語言只是工具,重要的是能力與思想”。這句話本沒有錯,但是如果把它作為“輕視語言”的理由,認為“語言”是低層次的東西,那只能說是一種誤用了。
最后,老趙再稍微談一下對另一個觀點的看法:“一個好的程序員應該兼容并包,不該有門戶之見”。老趙舉雙手雙腳同意這個看法,這也是老趙推崇“混合編程”的原因。但是老趙認為這不代表不能“批評”一個語言,“兼容并包”講究的是“各取所長”而并非是“各護其短”。老趙不搞“平衡論”,不代表老趙有“門戶之見”,不是嗎?
就用“門戶之見”來結束這篇文章吧:有錯誤的是“重語言而輕其他”,或者僅從語言來說明事物(例如通過語言來說明程序員能力高低,項目好壞等等)。而研究語言,比較語言,思考語言,談不上所謂層次淺,高度低——“層次”所指的是“怎么搞”,而不是“搞什么”。否則,不也是一種“門戶之見”嗎?
注1:這篇文章的內容原本屬于《老趙看“偽專業”》一文,但是在寫作過程中發現這一塊可能是誤解最深,也最難以被人識破的觀念,因此單獨成文,想把這個問題說明清楚。
注2:在白曉生“兵器譜”排名中,“天機棍”排名第一,而“小李飛刀”李尋歡排第三。