做者:sizovs 譯者:方應杭程序員
來源:https://zhuanlan.zhihu.com/p/52814937編程
以前發過相似的一篇文章,這篇更加全面。設計模式
咱們都是程序員,咱們須要與技術保持同步。每一天咱們都要學習編程語言、框架與庫。安全
咱們瞭解的現代開發工具越多越好,好比Angular,React,Riot,Vue,Ember,Knockout,和這些新技術保持同步真是一件頗有意思的事情。微信
可是....咱們倒是在浪費時間!數據結構
時間是咱們擁有的最爲寶貴的資源。時間有限,它不可再生,你我都不能購買更多的時間。架構
爲何?就像時尚時裝界同樣,技術領域如光速通常發生着變化。要遇上它,咱們須要快速的學習,這場比賽沒有贏家,由於它永無止境。框架
馬丁·斯科塞斯2013年做品《華爾街之狼》劇照編程語言
個人授業導師曾經教我這樣一課:ide
導師:「艾德,你在作什麼?」
我(自豪地說):「我在讀一本使用GWT構建現代Java應用程序的書。」
導師:「你爲何要讀這本書?」
我:「做爲一個Java開發者,我須要緊跟趨勢,GWT如今最火。」
導師:」在讀GWT以前你在讀什麼技術書?「
我:」是一本500多頁的Apache Tapestry的書,Tapestry當時很是流行「
導師:」這個Tapersty一直流行嗎?「
我:」沒有多長時間。GWT如今最火。「
導師:」你能從新用Tapersty的能力來解決如今的問題嗎?「
我:」不能了。如今它沒有什麼用。「
導師:」Taperstry的知識能幫你對GWT理解的更好嗎?「
我:」不能,沒有太大用。可是我看到裏面有一些設計模式有些類似「
導師:」是設計模式。這些能幫你解決如今的問題嗎?「
我:」是的,幫助太多了。「
導師:」技術一直在向前發展。可是有一些是相通的,要找準重點,將80%的時間放在提高基礎問題上,餘下的20%再去學習框架,庫和工具「
我:」Hmmm... 只留20%的時間學習框架,庫和工具?「
導師:」是的。你在解決問題時天然就會學會框架、庫和工具「
我:」謝謝指點「
導師: 如今不忙着謝,過一段時間,你天然會明白。
此次談話能夠說改變了個人人生!我把全部的講框架、庫的書從書架上所有撤下,一本都沒留,那叫一個輕鬆啊!
我在書架上換了一些長期的基礎技術讀物,不會過期的那種,好比像下面這類書就佔據了我閱讀學習時間的80%:
程序員修煉之道 The Pragmatic Programmer
代碼整潔之道 Clean Code
程序員的職業素養 The Clean Code
領域驅動設計和實踐 Domain-Driven Design
測試驅動的面向對象軟件開發 Growing Object-Oriented Software, Guided by Tests
持續交付 Continuous Delivery
我只買了一本關於最新技術的書,是關於 Spring 的。由於根據林迪效應,學習 Spring 是一項不錯的投資。
林迪效應認爲,對於不會天然消亡的事物,如一項技術或一個想法,其預期壽命與其當前的生命成正比;即,只要這一事物多存活一天,就意味着其預期生壽命會更長一些。
技術的將來預期壽命與其當前的「年齡」成正比,技術每延長存續一段時間,其剩餘生命週期也會相應延長。
越是在市場上持續存活時間長的技術,投入時間學習越安全、越值得。
不要忙着去學習最新的技術,由於這些新技術極可能很快消亡。
時間會告訴你,哪一種技術值得投入精力去學習,時間是你最好的顧問,學會等待是很重要的。
自那次與導師的談話後,十年過去了。期間我陸陸續續參與了50多個不一樣的軟件項目的開發。感謝導師的建議,我學到的一切東西均可以在不一樣公司、團隊和領域之間順利遷移。我學到的知識到今天仍然有用。我沒有浪費時間。
電影《時間規劃局》劇照
全部的項目看起來都不同了。可是,若是剝離表面,往深處看不難發現其中的共通之處,好比:
編程語言不一樣,但設計風格類似
框架不一樣,但有相似的設計模式
開發人員不一樣,但與人打交道的原則倒是一致的
永遠記住,框架、庫和工具的更替永不停息,而你的時間很寶貴。
必定要把你最寶貴的時間投入到可遷移的技能上。也就是說,在那些始終會用獲得的技能上下最多的功夫,好比下面這些內容,可能會讓你長期受用。
不要學習微服務框架,學習演進式架構(Evolutionary Architecture)。
不要學習新的編程語言,學習代碼整潔之道、設計模式、領域驅動設計(DDD)。
不要學習 LeSS 和規模化敏捷框架(SAFe),學習精益生產原則(Lean manufacturing principles)。
不要學習 Hystrix,學習容錯模式(Fault Tolerance Patterns)。
不要學習 Docker,學成持續交付。
不要學習 Angular、React 和 Vue,學習 Web、HTTP 和 REST。
熱門評論:
我贊成你的大部分觀點,可是我以爲你不用這麼堅定地不學習一些東西。
「學習工具」與「學習它所蘊含的設計模式」並不互斥。
2007 年的時候我曾經試圖搞清楚到底什麼是「數據層」以及怎麼使用它,這是當時流行的 ORM 概念。我向別人問了一堆關於 NHibernate(譯註:一個面向.NET框架的對象關係映射解決方案。主要用來把對象模型表示的對象映射到基於SQL的關係模型數據結構中去)的問題,不少人都回復我說「你應該先搞清楚原理,而不是學習這個工具」。但我內心想的是,shit,不行啊,由於我須要經過大量的實踐才能理解這些原理啊。這是我學習的重要途徑。
因此我以爲學習這些蘊含了豐富原理的工具實際上是很是有用的。
一樣的道理對不少工具都適用。好比 React,若是沒有 React 誰能理解虛擬 DOM 呢?
不過我基本贊成你的論點,可是過度強調不要學習工具就有一點何不食肉糜的意味了。
另外,Docker 也不只僅是持續交付,「學習新的編程語言」和「學習設計模式和 DDD」也不是互斥的,Angular 最難的部分也不是 Web 和 HTTP,最難的是學習 Angular 提供的這些傻傻的工具和工做流(我不是很喜歡這些玩意)。
做者的回覆:
看來咱們達成了共識——學習基礎經常意味着深挖某個框架、庫或者工具。框架和基礎都要學習,可是優先級必須是基礎高於框架。
個人觀點:
假設你面前有兩個應聘者,一個對框架特別熟,可是對基礎知識一點都不懂;另外一個對框架一點都不熟,可是基礎知識特別懂。
你會僱傭誰?
小公司僱傭前者,能用就行。大公司僱傭後者,能堪重任。
·END·
程序員的成長之路
路雖遠,行則必至
本文原發於 同名微信公衆號「程序員的成長之路」,回覆「1024」你懂得,給個讚唄。
回覆 [ 520 ] 領取程序員最佳學習方式
回覆 [ 256 ] 查看 Java 程序員成長規劃
往期精彩回顧