工做前三年是職業生涯中成長最快的幾年,在這段時間裏你會充滿激情,作事專一,也容易養成良好的習慣。在咱們公司有些同窗在前三年中就快速成爲某一個領域的技術專家,有些同窗也可能止步不前。本文和你們一塊兒探討下如何在三年內快速成長爲一名技術專家。
git
做者:清英程序員
1:掌握良好的學習心態github
2:掌握系統化的學習方法編程
3:知識如何內化成能力服務器
4:廣度和深度的選擇架構
1:你須要學會的編碼習慣併發
2:在業務團隊作開發如何成長框架
首先要有空杯的學習心態,而不是傲嬌自滿,故步自封,空杯子才能夠裝下更多的東西。首先要學會取百家之長,帶着欣賞的眼光看團隊的同事或學校的同窗,欣賞每位同事或同窗的優勢,而後吸收他們的優勢,每一個同事都有其擅長的能力,好比有的同事技術能力強,那麼能夠觀察下他如何學習的(或者找他請教學習方法),有的同窗擅長解決線上問題,那麼觀察他是如何解決線上問題的,解決思路是什麼?若是他解決不了時,他是如何尋求幫助。有的同窗擅長使用IDE或MAC的快捷鍵,那麼能夠向他學習提升工做效率。有的同窗能快速理解業務知識,觀察他是如何作到的,本身如何達到他的程度。溝通能力,解決問題能力以及規劃能力均可以向同事學習。運維
從書上看到一個知識點,或者從別人那裏聽到一個知識點,必定要去挑戰和質疑這個知識點的正確性,不然學到的知識點多是錯誤的。先用邏輯思惟推測下,再實戰檢測下,必定要記住實踐是檢驗真理的惟一標準。好比同事說這個SQL加這個索引是最快的,首先要思考同事的結論是如何得出的,是靠歷史經驗仍是測試過,若是咱們沒有經驗,就加上這個索引跑下SQL,看看執行計劃和執行時間,再換下其餘索引試試會不會更快。依次類推,併發必定比串行快嗎?無鎖必定比加鎖快嗎? 不少結論都是在特定的場景下才會產生的,必定要本身親手實踐驗證下。機器學習
有的同窗可能工做了五年,可是學習的時間可能一年都不到。學技術不能急於求成,只要學習方法正確,量變必定會引發質變。我在大學剛學JAVA時,怎麼都學不會,可是堅持學習了幾個月,天天看張老師的JAVA視頻教學,買書按照書裏的代碼一行一行的敲代碼,白天睡覺,晚上學習和寫代碼,寫到宿舍關燈時就去避風塘呆一夜,早上6點鐘回宿舍睡覺,學到必定時間後,忽然恍然大悟,才入了門。
在工做中,我曾經花了一個月的時間學習AOP的實現原理,學習了各類方式來實現AOP的原理,並寫了幾種實現方式的代碼,雖然花的時間不少,可是到如今仍記憶猶新,對於排查問題和學習其餘知識都很是有幫助。
要作到堅持學習,學習的環境很是重要。若是你想學,可是又不在學習狀態,能夠考慮換個學習環境,我常常會去星巴克看書和學習。我據說有的同事會週末抽一天去大學教師上自習。
對本身要求越高,進步越快。要有強烈的把事情作完美的心態,我剛開始工做的時候,老是快而不精,作事作的不夠細緻,總但願快速拿出結果證實本身,可是反而證實不了什麼,技術能力也得不到提高,缺乏技術亮點,在團隊中也沒什麼影響力,後面就開始鍛鍊一次就把事情作對的心態和方法。我觀察過,不少人都擅長快速作事情,可是把事情作好作精緻的人會比較少,可是結果倒是**在精益求精的路上纔會快速提升本身的能力**。好比用100行代碼實現的功能,思考下是否能夠用10行來實現,以便於下降運維成本,提升下次的編碼效率。引用GUAVA等類庫,提取公共方法,和使用JDK8新特性等。系統的方法壓測事後,單機只能承受1700QPS,能夠思考和實踐可否優化下程序提升QPS,減小服務器數量。
把事情作精,必定是要強迫本身多花心思多花時間在這件事情上。有位技術牛人給我分享了一個心得,我以爲說的很是好,老闆給你佈置了一個任務,**你要花百分之150的精力作到100分,這樣在老闆那裏你就能拿到80分或者60分**。
若是學習到的知識不成體系,那麼遇到問題時就會很是難解決。有些同窗會出現這些狀況,好比編碼時遇到問題百度搜索,若是百度上找不到答案,這個問題就解決不了。再好比,在開發中要用到某個技術點,就學習下API,程序調通後就再也不深刻研究,淺嘗輒止,若是程序遇到其餘問題也不知道如何解決。
以上狀況我認爲叫**點狀學習**。遇到一個問題,解決一個問題,須要一項技術,學習一項技術。那麼如何由點到面,由面到體,造成系統化學習呢。
首先要肯定學習的知識領域,須要達成的學習目標,針對目標制定學習計劃,就像你要寫一本書同樣,先把目錄寫出來,而後根據目錄上的知識點逐步去學習,最後把這些知識點關聯起來,造成一個系統化的知識體系。學習的時候,能夠制定一個計劃,以周爲單位,好比第一週學什麼,第二週學什麼。
好比我最近在學習人工智能,學習步驟是:
1: 高數基礎知識:線性代數,微積分和統計學。最近在打德州撲克時,我也會用統計學裏的知識計算下輸贏的機率。
2: 人工智能基礎:買幾本書人工智能的基礎書籍,如《機器學習基礎教程》《Python機器學習》
3:框架:TensorFlow等。
4:實戰:在工做中找到一個應用場景,把學到的知識運用進去。
做家格拉德威爾在《異類》一書中指出,1萬小時的錘鍊是任何人從平凡變成世界級大師的必要條件。1萬小時有多久?天天學習10小時,須要大約三年。可是不少人都工做了五年甚至更長,可是爲何成爲世界級大師的卻很是少。讀者能夠先本身思考下這個問題。接下來談談個人見解。
成長必須經歷一個步驟,就是把知識內化成能力。**知識是用腦記住的,能力是用手練習出來的**。在工做的幾年裏,咱們可能看過不少書,聽過不少技術講座和視頻,可是經過聽和看只是讓你能記住這些知識,這些知識還不能轉換成你的能力。
聽和看只是第一步,更重要的是實踐,經過刻意練習把聽到和看到的知識內化成你的能力。
刻意練習,就是有目的的練習,先規劃好,再去練習。首先給本身定一個目標,目標能夠有效的引導你學習,而後使用3F練習法:
1: 專一(Focus),專一在眼前的任務上,在學習過程當中保持專一,能夠嘗試使用番茄工做法。
2:反饋(Feedback),意識到本身的不足,學習完以後進行反思,思考下本身哪些方面不足,爲何不足,
3: 修正(Fix),改進本身的不足。
不停的練習和思考能夠改變大腦結構,大腦像肌肉同樣,挑戰越大,影響越大,學習更高效,而且也會產生突破性。
技術人員的學習路徑有兩個維度,深度和廣度。不少程序員都有這個疑問,是先深後廣,仍是先廣後深呢?
經過這麼多年的學習和思考,個人建議先深後廣,由於當技術學到必定深度後,就會有舉一反三的能力,本身掌握的廣度也天然有了深度。可是在實際學習過程當中,深度和廣度相互穿插着學習,好比學習併發編程時,首先學習JDK源碼,而後學進去以後,開始看JVM源碼,最後看CPU架構,在技術點逐漸深度研究的過程當中,廣度也獲得了完善。
因此不管哪一種學習方式,學習態度纔是最重要的,在廣度學習的時候有深刻研究的態度就能達到必定的深度,在深度學習的時候,主動學習相關的技術點,廣度也獲得拓寬。
程序員應該學會經過技術的手段來提升效率。幾個經常使用的手段是使用工具,快捷鍵和編寫腳本。
技術人員電腦儘可能用MAC,使用命令行效率必定比在1024*1024像素中找一個10*10像素的按鈕更快。IDE用IDEA,比Eclipse更智能。命令行工具用iTerm和IDEA裏的Terminal。寫文章用MAC的客戶端工具MacDown,左邊編寫,右邊展現,比Word等工具方便快速不少。有時候我還會用按鍵精靈裏配置腳本須要解決工做問題,好比經過點擊咱們的系統,來執行任務。這樣的工具不少,只要能提升工做效率的工具,你們均可以嘗試使用。
MAC,IDEA和Eclipse有不少快捷鍵都要學會使用,好比在MAC命令行中經過idea .快速打開工程,經過open . 快速的打開文件夾,把IDEA裏經過快捷鍵把一段代碼抽成一個單獨的方法,快速生成getter setter方法。
當咱們用人工的方式作一件重複性很強的事情,首先要考慮使用工具來幫咱們自動完成,若是沒有相似工具,能夠本身寫個腳原本實現,這樣除了能快速解決問題,還能提升本身的技術能力。
好比,我常常要在兩個maven倉庫發佈jar包,我就寫了個腳原本實現jar包的發佈,deploy.sh代碼以下:
cp pom.xmlpom.xml.bakrm pom.xmlln -s pom-2-deploy.xmlpom.xmlmvn deployrm -rf pom.xmlcp pom.xml.bakpom.xmlrm pom.xml.bak
我一直在業務團隊中作開發,在業務團隊最主要的提升的能力是業務抽象和架構能力,經過業務場景,不斷思考如何經過合理的架構和業務抽象能快速支持業務,下降運維成本。同時在這個過程當中鍛鍊技術能力,好比寫一些技術框架來快速支持業務,作到技術驅動業務。
可配置化的方式支持業務
設計業務的領域模型,把不隨着業務邏輯變化的領域模型作成系統能力,把隨着業務邏輯變化功能,作成可配置化,上一個新業務,經過配置的方式或少許開發就能支持。
在作客戶後臺功能時,因爲須要展現的數據種類很是多,每種數據展現可能須要花費幾天的時間,因此設計了一個通用的技術框架,實現了經過配置化的方式展現各類數據。
寫框架解決業務問題
我在上家公司常常作一些CRUD的業務功能,我就本身開發了一個快速作CRUD的框架jdbcutil,經過配置實體生成SQL語句,實現了子類只要繼承父類,就自動擁有CRUD的能力。後面還寫過生成CRUD頁面代碼的程序。
目前咱們團隊在作的TITAN框架經過模塊化開發的方式,解決易變的業務系統在多人開發時遇到的問題。
技術驅動業務
在業務團隊,必定要不斷的思考如何利用技術來支持快速支持業務,配置化是一種思路,可是有些功能配置複雜度比較高,配置加驗證的工做量,可能須要一個星期的時間,那麼能不能減小人工配置,實現系統自動化配置,因而能夠研究下人工智能,經過人工智能的方式實現,系統告訴人須要配置哪些東西,而後交給人來進行確認,這樣能夠大大減小人工成本,更快的支持業務。