技術的執念

邱俊濤發表於2016-09-28

知識漩渦

只需稍加留意,我們就會發現自己被各種技術、工具包圍。ThoughtWorks的技術雷達差不多每半年就會更新一次,在專案中更會遇到很多已經從技術雷達上消失的技術,專案上的舊技術/舊框架還在服役,新的技術/工具/語言/框架又在迅速的出現,有些曇花一現、迅速被新的後來者所取代。有的留下來了,不過也都在不斷的演化、改變(不相容的API,不同的版本等隨處可見)。

如果你不幸是一個前端工程師,那麼這個更新速度還要更加迅速。三年前Backbone是主流,兩年前是Angular.JS,去年是React,緊接著Flux、Reflux等作為React的擴充套件而成為了新的主流;Grunt流行過一段時間,很快被Gulp替代,而新的Webpack又依稀有大一統的趨勢。幾乎每週都能看到新的框架湧現,雙向繫結、虛擬DOM、事件代理、同構、後端渲染、更友好的語法糖、更快的執行速度等等,幾乎任何一個方向都有無窮無盡的變化。

1-technology

而後端也好不到哪裡去,容器技術、Web框架、ORM、構建指令碼、自動化測試工具、依賴管理、應用伺服器等等,你總有很多的選項,卻又無法在事先區分到底哪個技術/工具更靠譜、更適合專案。

置身其中,往往有眼花繚亂、應接不暇的感覺。知識工作者當然需要終身不斷的學習,但是像目前這種節奏,我很懷疑這是否是一種健康的狀態。周圍經常有人抱怨,好不容易上手了一個前端的MVC框架,一看周圍的專案,大家已經在spike另外的框架/工具了(這意味著你在專案上無法使用該框架了……)。僅僅從學習的速度上來講,我們已經遠遠無法跟上科技演化的節奏了,這是人類自身的一種限制。

知識的陷阱

假設你在一個Ruby專案上,學習了Rails/ActiveRecord/RSpec/MySQL。如果下一個專案還是Ruby,同樣的技術站,你會覺得這是一種重複,因為除了業務邏輯、業務物件變化了之外,並沒有新的內容,還是同樣的技術。如果下一個專案是Python,技術棧變成了Django/nose/PostgreSQL,你可能會覺得有所提升,因為學到了不同的技術、框架、共建工具、測試工具等等,其實仔細觀察,這還是一種重複,古人云:“換湯不換藥”者,是也。

在目前我們所處的時代,資訊以遠遠超過人們能接受的速度不斷的被創造出來,一方面資訊傳播的速度大大提升了,另一方面是資訊傳播的渠道也極具多樣化。我們無時無刻不被過載的資訊包圍著,即使你不主動的去嘗試獲取新的資訊,手機App裡的微信、微博、Flipboard、Pocket、知乎、開發者頭條、Feedly、果殼、丁香園等等的推送已經足以提供給你足夠的資訊(大部分甚至都來不及消費就變成了歷史資訊而被忽略)。

以我自己為例,從2015年10月到2016年2月,我學習了很多東西,看一下下面這張圖:

2-tech-tree

圖中灰色方框中的內容是專案要求的知識,另外的則是我根據自己的興趣學習的,兩者基本上各佔一半。事實上有很多內容(尤其是根據自己興趣學習的)在真正要使用時,可能還需要學一遍。這些內容可能讓我產生了我學到了好多東西的錯覺。其實這個在另一個角度顯現了技術人員的一個誤區:以為自己可以掌握所有軟體開發相關的知識(或者說太過於縱容自己的好奇心和興趣)。

過載的資訊

身處這樣的資訊過載環境,我們很難不為自己對資訊的缺乏而感到不安,擔心自己錯過了什麼重要的資訊,這種擔心和焦慮會促使我們進一步將時間消耗在對資訊的獲取上,從而更無暇思考什麼是真正重要的。

《如何閱讀一本書》將書分為兩類:一種是提供資訊/資訊(known)的,一種是幫助你理解(understand)資訊的。相對於理解來講,資訊本身其實並不那麼重要。我們大部分人目前採用的碎片化的閱讀方式無法提供給我們足夠的“理解力”。我們都有這樣的體驗,有些書特別耗費腦力,讀起來很累,而另一些書則非常輕鬆,易於消費。碎片化的閱讀方式易於消費,只需要很少的思考就可以讀懂,但是危害嚴重,它們並不會幫助你提升理解力。

4-fragmentation

但是直覺上我們會選擇容易的事情來做,雖然這種淺層次的閱讀只對擴充套件資訊/資訊有幫助,對提升理解力則幾乎無用。而我們在處理日常工作中的問題時,能真正幫助的,只有理解了的那部分知識。我在2014年,曾經有幾個月遮蔽了所有微信、微博等內容聚合類的應用,也儘量少的去技術論壇,每天就是寫程式碼,讀紙質書,除了最初幾天的忐忑之外,整個過程的收穫非常大(而且也沒有漏掉任何重要的資訊)。

知識框架

技術人員有時候會有一種想要把所有技術都掌握的「執念」,這在局外人來看是一種荒誕不經的想法,但是置身其中,你很難看出這一點。畢竟,有意思的東西實在太多了,各種正規化的程式語言、編譯器技術、人工智慧、資料視覺化、地理資訊系統、嵌入式裝置、軟硬體結合、大資料、自動化測試等等,每一個方向都有無窮無盡的有意思的東西。

但是在知識規模如此巨大的今天,一個人是無法掌握所有技術的,更不用說新的技術還在不斷的湧現出來!這就要求我們有節制的來聚焦在某些技術上,而視其他技術如無物。當然這需要很大的勇氣和魄力,不過唯有如此,技術人員才可能有真正的長進和成就。

我基於自己的經驗,繪製了一個「Web開發」方面的知識框架,這個框架上包含了一個比較全的技能/知識集合,也是我認為一個「Web開發」人員應該掌握的一些知識點。

3-knowledge-framework

在成為一個專家之前,你需要先對要學習的領域有一個全面的認識。也就是說,做Web開發,需要儘可能覆蓋到這個框架上的所有點。一旦完成了這棵樹上的所有節點,就不用再去做第二次了,這時候你可以嘗試找到樹上的某一個分支,深入下去。這個聽起來好像和我之前文章中的觀點有所矛盾,其實不然。我在《我們真的缺前端工程師嗎?》一文中提到過,“工程師不應該將自己束縛在前端開發上,要了解整個軟體開發的全生命週期。”這裡的觀點其實是一致的,即首先要了解軟體開發全生命週期中的所有節點,然後再有所側重的去找自己的興趣點來發展,即:先建立廣度,再建立深度。

應對方法

對於知識的陷阱

當因自己的興趣(而不是專案驅動,也就是沒有實際的土壤來驗證)而想要學習一個新的知識時,對照知識框架,如果發現自己已經在歷史上學過它了,那就強迫自己放棄這個念頭。比如你很熟悉用rspec來編寫測試,忽然有一天心血來潮,想要學習JUnit,正確的做法就是泡杯茶,等這種衝動自己過去。相信我,一旦有了Java專案,你可以非常快速的掌握JUnit,而且很快會找到對應的feature,就像一個長期工作在Java技術棧上的同事那樣!

對於過載的資訊

實踐中,首先要令自己相信:你無法掌握所有的知識,即使僅僅在軟體開發領域。有了這個大前提之後,你只需要採取先建立廣度,再建立深度的原則即可:

  • 做減法(在建立了知識框架之後,有針對性的學習)
  • 主動、深度閱讀經典
  • 為那些有趣但非自己關注方向的知識賦予較低的優先順序

另外,還可以嘗試將微信、微博關閉一段時間,或者至少可以不去點那些朋友圈裡的《老X聊微服務》或者《12個你不知道的Sublime技巧》文章,保持專注,保持簡單。

相關文章