
有個小伙伴在微信上問我:
我剛工作半年,有時候對于Java的發(fā)展方向有點迷茫,Java的范圍是在是太廣了,我有時候會不知道從哪開始入手,我想問一下,您有什么好的建議嗎?
我理解這位朋友的問題是:工作中該如何發(fā)現(xiàn)自己要學什么,怎樣構建自己的技能樹。這是一個非常重要的問題,假如你不知道要學什么,那一旦你工作不那么忙時就會覺得無聊,只能通過瀏覽新聞、看小說、打游戲等方式消磨時間消耗自己。這對自己的成長和增值非常不利。所以,這次咱就來聊聊工作中學什么這個話題——這也是很多朋友在我訂閱號“程序視界”里頻繁問題的話題。
根據(jù)我的經驗,在開發(fā)過程中,有兩種學習策略:一種是橫向拓展,也可以稱之為廣度學習;一種是縱向深入,也可以稱之為深度學習。如果能貫徹這兩種學習策略,就會慢慢形成程序員最理想的技能結構——T型,即在橫向上熟悉足夠多的知識和技能,在縱向上又精通某一領域。簡單說就是一專多能。
廣度學習

以C++語言為例,如果你做網(wǎng)絡方面的開發(fā),就會遇到選擇哪個框架的問題,libevent、ACE、Asio還是Qt Network?如果你做GUI開發(fā),可能會在Qt、CEF、MFC、wxWidgets、DirectUI之間做個選擇。
選擇和了解的過程,是個人廣度學習的過程。你會快速了解每一種框架的優(yōu)缺點,會搭建環(huán)境,會寫一些Demo來對關鍵技術點和需求做驗證……最終會根據(jù)文檔和實驗結果來做出實際的選擇。這個過程非常難得,會快速拓寬個人的知識面。建議把每次了解到的技術框架都記錄下來,有閑暇時可以進一步學習。
即便你不是預研技術方案的工程師,而是別人定方案你來開發(fā),也可以有意地讓自己經歷這個選擇過程,只需要問自己一個問題即可:為什么用A而不是B或C?
其實不單單是大的技術框架選擇,小到某個頁面要用的某個元素,都會經歷選擇的過程,有心,就可以用這種以點帶面的策略學習到更多。
深度學習
大多數(shù)時候我們會使用一門語言和一兩種技術框架進行軟件產品的開發(fā),此時就是縱向深入學習的好機會。
對技術框架的學習,大體分三個階段:
- 基礎開發(fā),主要是了解API、基于API完成應用
- 熟悉內核及原理,主要是了解框架的設計原理,閱讀源碼,洞悉內在機理
- 優(yōu)化框架,主要是針對框架的已有功能的不足進行完善、優(yōu)化,或者使用框架提供的機制擴展框架功能,或者對框架進行定制,讓它適合特定情境
我以Qt為例畫了張圖,供參考:

很多時候我們經歷了第一個階段——能夠使用API進行簡單開發(fā)——之后就跑別的地方去了(工作需要),然后就把這個框架撂那里不管了,然后就一直停留在那個階段。建議有時間的話梳理下自己用過的技術,挑出當下工作中還在用的那項,往深里鉆,去熟悉原理熟悉內核,有可能的話,也可以優(yōu)化、擴展或定制。惟其如此,才能對一個框架真正掌握,才會有深度,才會在該項技術上形成自己的價值和競爭力。
小結
不管是廣度學習還是深度學習,都是從實際需要出發(fā)的,是你工作中要用這門技術你不得不學。明白這點非常關鍵——你要用到某項技術時才會有學習的動力。所以,最好的學習時機就是一邊開發(fā)一邊學習,白天上班晚上學習,周內上班周末學習——在有明確目標時最有學習動力,在熱度還未退卻時學習效果最好。
如果你想學習與當下工作內容無關的知識和技能,投資自己的未來價值,那最好的辦法是給自己設計一個軟件產品(或者參與到別人的項目中),設定一個期限,用你想掌握的技術去完成它。用不到的知識,等于沒有,這就是這種說法背后的原理。
所以,沒有需求,要創(chuàng)造需求,沒有問題,要創(chuàng)造問題,有了需求和問題,學習才更有方向感和目的性,才會有持續(xù)下去的動力。如果你能主動創(chuàng)造目標和需求,那你很快就可以建立自己的技能樹并讓這棵樹根深葉茂,你就會越來越值錢,也越來越能賺到更多的錢。
相關閱讀:
更多文章請關注我。