2012 不宜進入的三個技術點
2012 不宜進入的三個技術點(上)
賴勇浩(http://laiyonghao.com)
其實寫這篇博 客的想法在年前已經有了,但一直在猶豫要不要寫,一是因為寫出來肯定會有人罵的了,剛過完春節的,在自己地頭找罵,實在是晦氣;二是因為我對行業趨勢的眼 光向來不準,估計今天的想法也是十有八九會錯,錯了日後自己的看著也不爽。但是又覺得如果心裡有想法,不記錄下來,思緒就飄遠了,年代久了之後,都忘記自 己曾經也有過“看法”,應該會為自己的庸碌後悔吧?所以還是寫了。寫了歸寫了,請各位看官往下讀之前,先整理好心情,做到:一是自己對世界有自己的看法; 二是認同別人的看法可以跟自己不同;三是對別人的看法跟自己不同時不要生氣因為氣的是你自己別人替不了。如果做到了這三點,再往下讀,因為下文的觀點會很 偏激、很有態度,我歡迎你留言討論、發表不同的見解,如果純粹是謾罵(或有很多髒詞),建議你自己開一篇部落格或發到你的微博,不要評論本文,因為我會刪除 “純粹是謾罵(或有很多髒詞)”的評論。
ActionScript/MXML其實就是說 Adobe Flash 平臺不值得進入。在 2011 年,Flash 終於能夠開發 iOS/Android 應用,再加上網頁遊戲市場火爆,估計很多人會想要進入這個平臺。但我有不同的看法,列幾點理由:
1、 Adobe 是市場導向的,沒有技術領袖氣質。視訊網站興起後,Flash Player 的新版本就加強視訊播放;網頁遊戲興起後,新版本就加強圖形渲染;移動裝置開發興起後,新版本就是能夠執行在更多的平臺上。一直在跟隨,從來不能領導;選 擇 Flash 平臺就意味著你永遠都不能走在時代前緣,只能吃別人吃剩下的;選擇 Flash 平臺就意味著你最急切的需求無法滿足,比如最近他們都在忙著支援移動裝置,我們做網頁遊戲的希望他們加強實時性小資料包網路傳輸的需求就根本沒有人理會。
2、 HTML5 出來以後,Adobe 這個本來也沒有多少技術人員的公司還分心去支援它,出把 swf 轉為 html+js+css 工具,出圖形化 html5+css3+js 程式設計的工具。它樂於革掉自己的命,因為它只是個賣工具的,支援 html5 就像是 photoshop 支援多一種影像格式;但是程式設計師你呢,你被革命後你的未來在哪裡,見過當年的“中年下崗工人”不?
3、從 ActionScript 3 釋出之後,這門語言基本上沒有什麼變化。你看從 Flash Player 9 釋出 AS3 以來,連 C++、C 語言都出了新的標準,java/c# 這類有大公司支援的語言變化巨大,甚至 python 也出了 python 3,更別提 google 公司新出的 go 和 dart 兩門優秀的語言。AS3 作為 ECMAScript 的一種方言,現在 ECMA-262 都發布到 5.1 版本了,它仍然沒有想要跟進的樣子。
4、Flex SDK 類庫狗血地照抄了早期版本的 java 類庫的設計,連缺陷也照抄不誤。你有多少次為了擷取 Array 的一部分元素而去看它的手冊的?這也就算了,還有一堆的 bugs。你知不知道 Application.application 是會變的?
5、 虛擬機器方面,javascript 都有了 V8 引擎,而 AVM 還是那個 AVM,無數使用者抱怨它慢都沒有用的,優先順序高的需求永遠是更能夠直接賺錢的特性。選擇 Flash 就好像你是一個賽車手選了一輛小馬力的車,雖然你彎道轉得很好,也從不撞車,但可能一輛大馬力的車還是從容地超越你。js 有了 V8 後開發出了 Node.js 從前端轉到後端,擴充了更加廣闊的應用領域,AS 在可以預見的未來,還是逃脫不了“寫點小動畫”的命運。
6、Stage 3D 不是救世主。不要忘記“low-level”這個定語,如果你直接使用 Stage 3D APIs 來編寫程式,你知道那得多麼痛苦。選擇 A3D、Away3D 能夠減輕一定的工作量,但使用開源引擎支援較差、特性較少。客觀地說,寫 3D 應用現在應該選擇 Unity3D 或 Unrel Engine 3,反正它們也能編譯成 swf 了。
7、2012 年,網頁遊戲的冬天不來,起碼也是秋天。網頁遊戲的增長將會放緩,其實從 2011 年第四季度可以看到各大公司都開始壓縮產品線,開始不再大量招工,而是轉向消化之前已經招到的技術人員。在 2012 年,將會有更多的頁遊創業公司倒閉或轉向移動裝置遊戲開發,AS 開發人員將會過剩,薪資下降。如果你在 2012 年上半年開始進入 AS 領域,那麼下半年剛有所成的時候,就會遇到一大批剛下崗的競爭者,高薪夢肯定要落空。
8、移動裝置應用或遊戲開發在 2012 年還會受到資本的熱捧,但 AS 在這個領域的競爭力我心存疑慮。Flash 優勢就是跨平臺,而 Unity3D 和 UDK 同樣可以跨平臺,同樣可以使用指令碼語言開發,而且效能、效果都更加優秀。隨著 Unity3D 和 UDK 可以編譯成 swf 在 Flash Player 上執行,學習 AS 的必要性進一步降低。
綜上 8 點,可以看到沒有技術基因的 Adobe 公司引導下的 Flash 開發路線圖缺乏方向,前景模糊,再加上 ActionScript 和 Flex SDK 本身的缺陷,又遇上 Unity3D 和 UDK 這樣的強勁外敵,再加上網頁遊戲大盤下滑,內憂外患之下,實在不是明智之選。Adobe Flash 當然不會死掉,也不會在 2012 年大量失去市場份額,但 Flash 程式設計師的 2012 不好過,想活得輕鬆點,注意距離。
2012 不宜進入的三個技術點(中)
執行緒是指程式中的一個單一順序的控制流,是作業系統能夠排程的最小單位,一個程式中可以有多條執行緒,分別執行不同的任務。執行緒有核心執行緒和使用者執行緒之分,但在本文中僅指核心執行緒。在軟體開發中,使用執行緒有以下好處:
1、在多核或多路 CPU 的機器上多執行緒程式能夠併發執行,提高運算速度;
2、把 I/O,人機互動等與密集運算部分分離,提升 I/O 吞吐量和增進使用者體驗。
執行緒的缺點也很明顯:
1、建立一條執行緒需要較大的記憶體開銷,導致不能建立海量的執行緒;
2、執行緒由作業系統排程(分配時間片),執行緒切換的 CPU 成本比較高,導致大量執行緒存在時大量 CPU 資源消耗線上程切換上;
3、同一程式的多條執行緒共享全部系統資源,在多執行緒間共享資源需要進入加鎖,大量的鎖開銷不提,重要的是加大了編寫程式的複雜性,這一點你看看有多少書名含有“多執行緒”三個字就明白寫個多執行緒應用有多難了;
4、
I/O 方面,多執行緒幫助有限,以 TCP Socket Server 為例,如果每一個 client connection
由一條專屬的執行緒服務,那麼這個 server 可能併發量很難超過 1000。為了進一步解決併發帶來的問題,現代伺服器都使用
event-driven i/o 了。
event-driven i/o
解決了併發量的問題,但引入了“程式碼被回撥函式分割得零零碎碎”的問題。特別是當 event-driven i/o 跟
multi-threading
結合在一起的時候,麻煩就倍增了。解決這個問題的辦法就使用綠色執行緒,綠色執行緒可以在同一個程式中成千上萬地存在,從而可以在非同步 I/O
上封裝出同步的 APIs,典型的就是用基於 greenlet + libevent 開發的 python 庫
gevent。綠色執行緒的缺陷在於作業系統不知道它的存在,需要使用者進行排程,也就無法利用到多核或多路 CPU
了。為了解決這個問題,很多大牛都做出了巨大的努力,並且成果斐然,scala、google go 和 rust 都較好地解決了問題,下文以
rust 的併發模型為例講一下。
rust 提出一個 Task 的概念,Task
有一個入口函式,也有自己的棧,並擁有程式堆記憶體的一部分,為方便理解,你可以把它看作一條綠色執行緒。rust 程式可以建立成千上萬個
Tasks,它們由內建的排程器進行排程,因為 Tasks 之間並不共享資料,只通過 channels/ports
通訊,所以它們是可並行程度很高。rust 程式啟動時會生成若干條(數量由 CPU 核數決定或執行時指定)執行緒,這些執行緒並行執行
Tasks,從而利用多個 CPU 核心。
如
上圖,rust 應用程式不停地 spawn 出一個又一個 Tasks,它們由 tasks 排程器管理,在適當的時機,排程器會把某一個 Task
分配給原生執行緒執行,如果這個 Task 進入 I/O 等待或主動讓出 CPU(sleep),那麼這個 Task
會被交回給排程器,而相應的原生執行緒會執行另一個新分派的 Task。儘管使用 rust 程式語言是不能建立執行緒的(直接呼叫 C 函式不算),但
rust 應用程式實際上是多執行緒的(一般情況下),它能夠充分地利用多核或多路 CPU。
綜上,類似 rust 的 Task
的概念是比執行緒更好的併發模型,更安全,編寫的程式碼也更加容易維護(關於維護性,我相信寫過 gevent 程度或 go
程式的同學會認同的)。執行緒當然不會消亡,但隨著 scala/go/rust
的成熟,在可以預見的將來,執行緒會退到它呆著的角落:遠離普通程式設計師,只有少數人需要了解它的細節。
C++
C++
在 2011 年其實風頭甚勁,C++2011 標準出臺,gcc/msvc/clang
都很快速地支援了許多新特性,新興的移動裝置的效能較差,更是 C++ 的新舞臺,在這個時候唱衰 C++,壓力很大。我使用 C++
年頭不少,但除了在校的時候寫過兩個小遊戲參加過兩個比賽(分別是面向社會和麵向大學生的)弄些證照好找工作以外,在工作中只用過大概不到一年半,做《斬
魂》(http://zh.163.com)的早期版本,寫了伺服器端的幾條程式和客戶端的 GameAI
部分。經驗少,而且寫得不好,所以基本上有人在 weibo 上問我 C++ 的問題,我都是轉發給 @bnu_chenshuo 和 @miloyip 等真正的行家去回答的。所以實際上今天寫這一篇,我底氣很是不足,但是朋友們給前兩篇很大面子,弄得我騎虎難下,只好硬著頭皮寫了。
前
文提到 C++ 的新標準,很有必要提一下標準化對 C++ 的影響。首先我們要肯定標準定製對 C++
的積極作用,但標準化過程中的超長流程,一次次將 C++ 推向深淵。C++ 的第一個標準是 1998 年的 ISO/IEC
14882:1998,距離整個 90 年代最流行的 C++ 程式庫 MFC(Microsoft Foundation Class
Library)的第一個版本發行時間已經整整 6 年。1998 年,MFC 版本號為 6.0,與其一起釋出的 Visual C++ 6.0
佔有了巨大的市場。因為 MFC 釋出得標準制定的時間早,所以 MFC 內部實現了許多後來標準庫裡也有的元件,比如各種資料結構容器。VC6
的市場佔有率讓 windows 平臺下開發的許多 C++ 程式設計師甚至不知道有 STL,同時也無視 C++98 標準,從更相容標準的
VC2002/2003 的市場佔有率就可以看出來,直到今天,我知道國內不少公司還是隻用 VC6 的。
其實在 90
年代,計算機的運算能力有限,市場上非常需要一款效能較高、抽象較強的程式語言,C++
獲得了成功,但它標準化的時間過長,造成各種編譯器有各自互不相容的“方言”,成了它的第一個軟肋。第一個瞄準這個軟肋的就是 java,java 在
1995 年推出,雖然效能稍遜,但它有更高的抽象能力、也更安全,並且更容易跨平臺,所以迅速獲得了成功;第二個瞄準這個軟肋的是 C#,微軟不能推動
C++ 發展,又不願 C++ 的市場被 java 鯨吞,於是在 2001 年推出了 C#,經過 10 年的發展和微軟大量的金錢推廣,C#
已經成功獲得了它應有的江湖地位。
雖然 java/c# 都不是善類,但 C++ 在 21 世紀的第一個十年裡仍然地位穩固,這是因為
Linux 和 MacOS X 大獲成功,在這兩個平臺上 C++ 都是非常有競爭力的程式語言,C++ 自然水漲船高。但隨著 web2.0 和
web app 概念的興起,以及 CPU
的主頻進一步提升,伺服器端程式語言漸漸地對執行效率不再敏感,而是更在意程式設計師的開發效率,眾多的指令碼語言開始蠶食 C++ 的市場份額,從早期的
perl 到後期的 python/php/ruby,在 2005 年以後,C++/java/C#
等靜態型別的編譯型語言的市場份額都下降了,新興的貴族是動態語言。面對動態語言在開發效率上的強勁挑戰,C++ 社群除了在 2003 年對
C++98 做了小小的 patch,基本上睡著了,完全沒有應對之策,哦不,連應用的姿態都沒有。
進入 21
世紀的第二個十年,市場又發生了變化,雲端計算越走越近,也許我們中的大部分人今天還可以說只聞其聲不見其形,但 The Data Center Is
the Computer
這句話大家應該覺得很務實:完成一個使用者操作,在伺服器端的程式間通訊次數前所未有地多。在這個十年,我們需要這樣的程式語言:
1、能充分利用現代 CPU 的計算能力,不僅僅是多個核心,更是巨大的 L1/L2/L3 Cache、超執行緒等;
2、能夠大量減小非同步 I/O 的效能提升的同時帶來的副作用:非同步程式設計的複雜性以及對可維護性的傷害;
兩
句話其實也可以壓縮為一句:需要有更好的併發模型的語言。一開始大家都在已有的程式語言中尋找,然後找到了 erlang,實踐證明 erlang
自有其侷限,所以 google go/scala/rust 等新語言如同雨後春筍般撥地而出。C++2011 標準努力降低 C++
的程式設計難度,並提供了執行緒庫以支援現代 CPU,如果在 2005 年,這個標準絕對有競爭力,但在今天,它只能成為新的程式語言的墊腳石。正如 IE
最大的用處是用來下載其它瀏覽器,不久之後,也許會流行新的冷笑話:C++ 最大的用處就是用來實現其它程式語言。
市場一直在尋找一門中間的高階
語言,它上承 C 語言和組合語言,下啟指令碼語言。C++ 最先搶佔了高地,並在與 java/c# 的爭鬥中不落下風,但新的十年,它的對手又增加了
google go/scala/rust 等新銳,並且新的標準不可能在兩三年內再次出臺,兩三年內新銳成長起來後,留給它的位置就不多了。
上
文討論的基本上都是伺服器程式設計,有必要再來看一下桌面和移動裝置領域。首先看桌面軟體,rust 是 mozilla
基金會開發系統程式語言的,它的定位是部分取代 C++ 開發 firefox 的瀏覽器,所以 rust 會進入桌面開發,google go
肯定會順道啃一口。移動裝置方面,主要是 android、ios 和 windows
phone,隨著移動裝置效能增強,編譯型語言加指令碼的模式就會佔大頭,編譯型語言方面主要是 C++ 和 Objective-C 在競爭,C++
會佔上風(但需求量遠遠小於指令碼,從 lua 在 2011 年的增長速度可以印證),但是誰知道 rust
之類的會不會進入移動裝置呢,畢竟移動裝置的 CPU 核心也越來越多了呀,C++ 還是前景堪憂。
回首 C++ 的 30 年,展望它的未來,總結起來可能就是:標準化流程拖死人了。如果不是 15 年不能標準化,java/c# 的攪局可能不會出現;如果在 2005 年能夠應對動態語言……如果雲時代有更好的併發模型……
題
外話:java/c# 不會有 C++ 的問題,因為它們有自己的平臺,有巨大的財富支撐。特別是平臺的作用非常巨大,你可以想像一下如果 Adobe
有自己的瀏覽器或手機作業系統 ActionScript/MXML 會不會是今天的境地;也可以想像一下 google go 的飛速發展動力是什麼。
2、新年新氣象,工作和家庭都有很重要的事情壓在肩上,大家的評論我不逐條回覆了,我會在一兩個星期後再統一寫一篇《2012 不宜進入的三個技術點(Q&A)》統一回答,還請見諒。
相關文章
- 2012年技術圖書大盤點
- 技術的悟道之三 –給入門者的幾點諫言薦
- 雲端儲存架構的技術特點與三個發展方向架構
- 【API進階之路6】一個技術盲點,差點讓整個專案翻車API
- 專案進度管理的三個要點
- 雲安全2.0三大技術進中國
- 張鈸院士:人工智慧技術已進入第三代人工智慧
- 前端工程師的技術進階點在哪裡?前端工程師
- 對引進IT技術書籍的一點建議
- Linux運維工程師入門須掌握的10個技術點Linux運維工程師
- 淺談沉浸式投影的三大技術特點
- 交流技術的進~~~~
- 技術部如何做覆盤——“年終盤點一對一”之三進宮的男人!
- 大資料三個重要的技術問題大資料
- C#中的幾個簡單技術點C#
- MDM獲取UDID的幾個技術點
- ByteHouse實時匯入技術演進
- Android 動態載入技術三個關鍵問題詳解Android
- 技術管理進階——第三個五年,獨立思考與落地實操
- 技術盤點:雲原生中介軟體的技術演進與未來趨勢展望
- 一個程式設計師的技術進階之路程式設計師
- 程式設計技術點滴三(C/C++)程式設計C++
- 邦芒貼士:這三種人不宜跳槽
- Scrum進入疲倦期?三點幫你走出困境Scrum
- 大資料領域三個大的技術方向大資料
- 物聯網的技術發展的三個階段
- 入門Linux運維工程師,必須要掌握的10個技術點Linux運維工程師
- HTML5 中 40 個最重要的技術點HTML
- 一場成功的技術面試的幾個關鍵點面試
- Docker技術三大要點:cgroup,namespace和unionFS的理解DockernamespaceNFS
- Docker技術三大要點:cgroup, namespace和unionFS的理解DockernamespaceNFS
- 技術進階·K線篇(八)——下降三法
- 有趣的角度:《權力的遊戲》少兒不宜資料盤點遊戲
- 開發Webview的技術,小的技術知識點WebView
- Codidate - 一個先進的線上技術面試平臺面試
- 技術站點
- 技術盤點:容器技術的演進路線是什麼?未來有哪些想象空間?
- 伺服器推送技術常用的三個解決方案伺服器