有個小夥伴在微信上問我:程序員
我剛工做半年,有時候對於Java的發展方向有點迷茫,Java的範圍是在是太廣了,我有時候會不知道從哪開始入手,我想問一下,您有什麼好的建議嗎?微信
我理解這位朋友的問題是:工做中該如何發現本身要學什麼,怎樣構建本身的技能樹。這是一個很是重要的問題,假如你不知道要學什麼,那一旦你工做不那麼忙時就會以爲無聊,只能經過瀏覽新聞、看小說、打遊戲等方式消磨時間消耗本身。這對本身的成長和增值很是不利。因此,此次咱就來聊聊工做中學什麼這個話題。網絡
根據個人經驗,在開發過程當中,有兩種學習策略:一種是橫向拓展,也能夠稱之爲廣度學習;一種是縱向深刻,也能夠稱之爲深度學習。若是能貫徹這兩種學習策略,就會慢慢造成程序員最理想的技能結構——T型,即在橫向上熟悉足夠多的知識和技能,在縱向上又精通某一領域。簡單說就是一專多能。框架
廣度學習學習
以C++語言爲例,若是你作網絡方面的開發,就會遇到選擇哪一個框架的問題,libevent、ACE、Asio仍是Qt Network?若是你作GUI開發,可能會在Qt、CEF、MFC、wxWidgets、DirectUI之間作個選擇。優化
選擇和了解的過程,是我的廣度學習的過程。你會快速瞭解每一種框架的優缺點,會搭建環境,會寫一些Demo來對關鍵技術點和需求作驗證……最終會根據文檔和實驗結果來作出實際的選擇。這個過程很是可貴,會快速拓寬我的的知識面。建議把每次瞭解到的技術框架都記錄下來,有閒暇時能夠進一步學習。設計
即使你不是預研技術方案的工程師,而是別人定方案你來開發,也能夠有意地讓本身經歷這個選擇過程,只須要問本身一個問題便可:爲何用A而不是B或C?blog
其實不僅僅是大的技術框架選擇,小到某個頁面要用的某個元素,都會經歷選擇的過程,有心,就能夠用這種以點帶面的策略學習到更多。遊戲
深度學習開發
大多數時候咱們會使用一門語言和一兩種技術框架進行軟件產品的開發,此時就是縱向深刻學習的好機會。
對技術框架的學習,大致分三個階段:
基礎開發,主要是瞭解API、基於API完成應用
熟悉內核及原理,主要是瞭解框架的設計原理,閱讀源碼,洞悉內在機理
優化框架,主要是針對框架的已有功能的不足進行完善、優化,或者使用框架提供的機制擴展框架功能,或者對框架進行定製,讓它適合特定情境
我以Qt爲例畫了張圖,供參考:
不少時候咱們經歷了第一個階段——可以使用API進行簡單開發——以後就跑別的地方去了(工做須要),而後就把這個框架撂那裏無論了,而後就一直停留在那個階段。建議有時間的話梳理下本身用過的技術,挑出當下工做中還在用的那項,往深裏鑽,去熟悉原理熟悉內核,有可能的話,也能夠優化、擴展或定製。唯其如此,才能對一個框架真正掌握,纔會有深度,纔會在該項技術上造成本身的價值和競爭力。
小結
無論是廣度學習仍是深度學習,都是從實際須要出發的,是你工做中要用這門技術你不得不學。明白這點很是關鍵——你要用到某項技術時纔會有學習的動力。因此,最好的學習時機就是一邊開發一邊學習,白天上班晚上學習,周內上班週末學習——在有明確目標時最有學習動力,在熱度還未退卻時學習效果最好。
若是你想學習與當下工做內容無關的知識和技能,投資本身的將來價值,那最好的辦法是給本身設計一個軟件產品(或者參與到別人的項目中),設定一個期限,用你想掌握的技術去完成它。用不到的知識,等於沒有,這就是這種說法背後的原理。
因此,沒有需求,要創造需求,沒有問題,要創造問題,有了需求和問題,學習才更有方向感和目的性,纔會有持續下去的動力。若是你能主動創造目標和需求,那你很快就能夠創建本身的技能樹並讓這棵樹根深葉茂,你就會愈來愈值錢,也愈來愈能賺到更多的錢。