坂本龍馬曾經對土佐勤王黨成員檜垣直治說:“今后在室內亂打亂斗的情況會多起來。我喜歡小太刀,小太刀靈活,比太刀實用〔當時流行太刀〕。”之后直治帶了小太刀再見龍馬,他卻掏出來一柄手槍:“這個比小太刀更具威力。”坂本龍馬拜勝海舟為師后,直治帶了槍再見龍馬,這次龍馬掏出的是一部《萬國公法》(一本國際法方面的書):“手槍只能殺傷敵人,此書可以振興日本!”西鄉隆盛曾對坂本龍馬說:“你前天所說的和今天所說的不一樣,這樣你怎么能取信于我呢。你作為天下名士必須有堅定的信念!”坂本說:“不是這樣的。孔子說過,君子從時。時間在推移,社會形勢在天天變化。因此,順應時代潮流才是君子之道!西鄉,你一旦決定一件事之后,就想貫徹始終。但這么做,將來你會落后于時代的。”
上面這段話,摘自維基百科關于“坂本龍馬”的條目。這段話給我很大的震撼:那可是明治維新時代啊!只有思想家才有這樣的見識和洞察力。可為什么說起他?因為在跟群內的朋友聊最近發生的“格斗狂人20秒KO太極高手”的事情。我提到,李連杰的經典電影《精武門》里面的高手船越跟陳真有過一段精彩的對話:
船越:中國人的武功是強調個人的修為,而不注重實戰。
陳真:技擊的目標是講求擊倒對方。
船越:你完全錯了,年輕人我告訴你,要擊倒對方最好的方法就是用手~槍。練武的目標是要將人的體能推到最高極限。
這段話,是影片的精彩之筆。然后朋友告訴我,這來源于坂本龍馬,遂查詢到坂本龍馬的資料。
鋪陳了這么多,我到底要說什么?其實很簡單:人要與時俱進,順應時代潮流。
這對于技術也是一樣的道理。即不要固守既有的東西,不要永遠抓著一個東西不放,僅僅因為你過去對它很熟悉。對于Windows開發、.Net、C++語言,我也持這個態度 –它們過時了,已經不能代表產業的潮流。當然,這并不是說它們沒用,而是說,當你有機會做選擇的時候,可能在大部分場合都不會選擇它們。因為總有更佳的方案可以替代。
我以為整個產業的重點,早已從單機模式轉向移動設備及其相關聯的互聯網服務上。而且還會有進一步的發展和轉移,比如智能設備。
微軟公司沒有抓住機會并順應這一潮流,這是它們喪掉信息技術浪潮之巔的根本原因。它在Internet剛興起的時候就錯過一次,而且連帶著缺乏革新的C++一起衰落了。要知道,多年以來Windows上核心的開發技術,都是以C++為主的,要使用Visual C++工具包。程序員里面,能熟練使用C/C++開發的,那真的是有相當不錯技術功底的。在“程序員鄙視鏈”中,位于頂層。不是因為語言太難學 – 這是一部分因素,核心原因是因為缺乏高度抽象、優秀的封裝,開發者不得不親自對OS的API接口進行操作,學習操作系統底層的設計、準確理解各種重要概念、精確操作各種進程、線程、同步接口等等。這些東西不是朝夕之功,需要很長時間的積累。
Web時代來臨,單機操作系統的重要性大大下降。因為信息需求的本質,是要傳播。這個時候,單機就成了生產力工具了。
Web就是OS。你可以根據這個論斷,映射一下:
應用程序 – 網站;操作協議 – HTTP;文件系統 – 數據庫/分布式;打開網站 – DNS;檢索信息 – 搜索引擎;這種類比有一大串。
Web開發迅速改進、革新,發展速度比起傳統單機軟件開發模式,感覺快了10倍。10多年前的網站開發還很原始簡陋,現在你再看看?翻天覆地。而你再看看Windows單機軟件的開發,甚至連畫個圖片按鈕都得自己從頭來,這什么年代了?這充分反應了社會需求。
移動互聯網興起10年,人類真正實現了“信息在指尖”的夢想。Web其實是跟著移動開發一起進步的,并未衰落。因為移動設備后面,可全是一套套的Web技術在支撐服務啊。它們是互補融合的。
而在這些一套套的技術里面,C++已經給逼到了墻角,基本沒什么位置了。或者從另外一個角度說,C/C++已經變成基礎工具構件,專門用于系統、其它工具的開發。比如用C/C++實現其它語言的引擎。但是具體的應用級工作,大半退位給其它選項。你會用C++去開發web應用么?除非去開發服務器擴展,否則不會。因為那是自尋煩惱,系統的瓶頸是I/O,不是CPU,用腳本性能足夠好了,而且開發速度快得多,維護也容易的多。
另外,語言之爭,已經演化為社區之爭。典型表現就是分發系統。各種流行的腳本語言,都有自己設定的打包分發系統。如PHP的Composer,Javascript的npm,Python的pip等等。社區設定標準,只要符合標準就可以上傳分發,下載使用。這種模式下,開發跟搭積木無異,要什么功能?直接找個實現的最好的包,拿來用就是了。除非你覺得不滿意,無法滿足自己的需求,想重搞一個。否則沒理由重新發明輪子。你告訴我C++的代碼咋分發?一套C++ Class發過來,連編譯都無法跨平臺。在語言實現上,Python/PHP/JS這類語言有天然的優勢。這種開發效率,比C++快了N倍。
過去,C++開發有個比較強的需求:客戶端。操作高效、使用流暢的客戶端還是有它的應用場景的。但這個需求在減弱。
一是移動端、Web端在侵蝕,對Windows客戶端需求不再那么強烈了。筆記本、臺式機廠商的日子比較難過。
二是其它語言特別是用Html5/JS/CSS技術實現的客戶端,日益成熟。早晚會吞噬C++ UI開發的大部分市場。早期的HTML界面實現很弱,缺陷很多,特別是性能。但是基于高效的V8 JS引擎、webkit引擎內核技術的新開發模式,已經脫胎換骨。因為并不調用什么IE接口,沒有那么多跨進程的COM調用消耗,所以性能好得多。
三是實現效果大相徑庭。基于新一代CSS技術的UI,效果絢麗,個性化突出,這些完全是C++ UI開發望塵莫及的。C++想實現出來?累死你。而且這也不是業務邏輯,做它又覺得虧。
眼下多語言競爭、分割應用需求是大趨勢,每個語言占據各自的山頭,再向外延伸。PHP專注于WEB開發、Java做后端應用、Python做網絡、數據分析、JS做前端應用,如此等等。這種條塊分割,也逼著你要多學點不同的編程語言了。
對C++熟悉的人,優點是基礎好,缺點是思維往往被微軟那一套模式束縛了,學的越是好,擺脫起來越是難。但是如果確實擺脫了,功力又確實比只會腳本的深。出個什么狀況,可以一口氣扎進去,翻看源代碼,追蹤系統調用,徹底理解并解決問題。遇到腳本的性能瓶頸,用C/C++做個擴展模塊,性能如飛。
所以各位如果碰見好的C++開發,盡量別錯過,拉進來,讓他轉型。技術水平上有很大把握優于直接從腳本開發入行的人。
只會C++開發的朋友,也關注點新發展吧,堅守沒有意義。順應時代潮流才是君子之道。