一轉眼從學校畢業已經超過10年了,從一名普通的程序員成長為500強企業的架構師,如今也開始做IT管理工作,可以算是一個過來人。前兩天公司一位初入職場的同事希望我給一些建議與經驗。我覺得這個話題很有價值,這里以個人的想法與經歷寫成此文,希望給年輕的開發者們一些啟發。
我工作過的公司有4家,NVIDIA, google, SlIDE和Glow。其中兩家是知名的大公司,Slide我是D輪過后加入的,那時約150人。Glow則是從它第一天創立,一直走到現在。個人的工作也從Developer,Tech Lead,Engineering Manager到CTO。這些經歷使我對程序員的個人發展之路有比較全面的看法。這一路走來,自己有一些感悟,也看到其他人的一些經驗教訓,對于如何掌控自己的職業生涯,總結了些建議,希望對那些處在迷茫中的年輕朋友們有些許幫助。
工作前三年是職業生涯中成長最快的幾年,在這段時間里你會充滿激情,做事專注,也容易養成良好的習慣。在我們公司有些同學在前三年中就快速成為某一個領域的技術專家,有些同學也可能止步不前。
如果你問一個年輕的前端開發人員,你在今后的3年內如何提升自己的能力?他可能會說“我現在對Web前端比較熟悉,但我想深入了解AngularJS,另外React現在發展的很快我也想看一下。之后,我會花時間去學習IOS和Android開發。”看上去不錯,但缺乏系統性的目標。或者說,他制定了學什么,但對為什么要學這些并沒有仔細地思考。
在技術領域,有太多的東西會迅速地過時,如何利用有限時間,最大化你的長期收益?
學習方法
1:掌握良好的學習心態
2:掌握系統化的學習方法
3:知識如何內化成能力
4:廣度和深度的選擇
實戰技巧
1:你需要學會的編碼習慣
2:在業務團隊做開發如何成長
打造你的工具箱
工欲善其事,必先利其器。每個開發者都應該有一把自己的瑞士軍刀,在將來漫長的職業生涯中,這些工具可以為你省下寶貴的時間,并幫助你更好的組織個人知識庫。舉兩個例子
- 一套高效的開發環境
- 一個信息采集器和一本筆記本
空杯心態
首先要有空杯的學習心態,而不是傲嬌自滿,故步自封,空杯子才可以裝下更多的東西。首先要學會取百家之長,帶著欣賞的眼光看團隊的同事或學校的同學,欣賞每位同事或同學的優點,然后吸取他們的優點,每個同事都有其擅長的能力,比如有的同事技術能力強,那么可以觀察下他如何學習的(或者找他請教學習方法),有的同學擅長解決線上問題,那么觀察他是如何解決線上問題的,解決思路是什么?如果他解決不了時,他是如何尋求幫助。有的同學擅長使用IDE或mac的快捷鍵,那么可以向他學習提高工作效率。有的同學能快速理解業務知識,觀察他是如何做到的,自己如何達到他的程度。溝通能力,解決問題能力以及規劃能力都可以向同事學習。
挑戰權威
從書上看到一個知識點,或者從別人那里聽到一個知識點,一定要去挑戰和質疑這個知識點的正確性,否則學到的知識點可能是錯誤的。先用邏輯思維推測下,再實戰檢測下,一定要記住實踐是檢驗真理的唯一標準。比如同事說這個SQL加這個索引是最快的,首先要思考同事的結論是如何得出的,是靠歷史經驗還是測試過,如果我們沒有經驗,就加上這個索引跑下SQL,看看執行計劃和執行時間,再換下其他索引試試會不會更快。依次類推,并發一定比串行快嗎?無鎖一定比加鎖快嗎? 很多結論都是在特定的場景下才會產生的,一定要自己親手實踐驗證下。
堅持學習
有的同學可能工作了五年,但是學習的時間可能一年都不到。學技術不能急于求成,只要學習方法正確,量變一定會引起質變。我在大學剛學JAVA時,怎么都學不會,但是堅持學習了幾個月,每天看張老師的JAVA視頻教學,買書按照書里的代碼一行一行的敲代碼,白天睡覺,晚上學習和寫代碼,寫到宿舍關燈時就去避風塘呆一晚上,早上6點鐘回宿舍睡覺,學到一定時間后,突然恍然大悟,才入了門。
在工作中,我曾經花了一個月的時間學習AOP的實現原理,學習了各種方式來實現AOP的原理,并寫了幾種實現方式的代碼,雖然花的時間很多,但是到現在仍記憶猶新,對于排查問題和學習其他知識都非常有幫助。
要做到堅持學習,學習的環境非常重要。如果你想學,但是又不在學習狀態,可以考慮換個學習環境,我經常會去星巴克看書和學習。我聽說有的同事會周末抽一天去大學教師上自習。
把事做精
對自己要求越高,進步越快。要有強烈的把事情做完美的心態,我剛開始工作的時候,總是快而不精,做事做得不夠細致,總希望快速拿出結果證明自己,但是反而證明不了什么,技術能力也得不到提升,缺少技術亮點,在團隊中也沒什么影響力,后面就開始鍛煉一次就把事情做對的心態和方法。我觀察過,很多人都擅長快速做事情,但是把事情做好做精致的人會比較少,但是結果卻是 在精益求精的路上才會快速提高自己的能力 。比如用100行代碼實現的功能,思考下是否可以用10行來實現,以便于降低運維成本,提高下次的編碼效率。引用GUAVA等類庫,提取公共方法,和使用JDK8新特性等。系統的方法壓測過后,單機只能承受1700QPS,可以思考和實踐能否優化下程序提高QPS,減少服務器數量。
把事情做精,一定是要強迫自己多花心思多花時間在這件事情上。有位技術牛人給我分享了一個心得,我覺得說得非常好,老板給你布置了一個任務, 你要花百分之150的精力做到100分,這樣在老板那里你就能拿到80分或者60分 。
廣度和深度的選擇
技術人員的學習路徑有兩個維度,深度和廣度。很多程序員都有這個疑問,是先深后廣,還是先廣后深呢?
通過這么多年的學習和思考,我的建議先深后廣,因為當技術學到一定深度后,就會有觸類旁通的能力,自己掌握的廣度也自然有了深度。但是在實際學習過程中,深度和廣度相互穿插著學習,比如學習并發編程時,首先學習JDK源碼,然后學進去之后,開始看JVM源碼,最后看CPU架構,在技術點逐漸深度研究的過程中,廣度也得到了完善。
所以無論哪種學習方式,學習態度才是最重要的,在廣度學習的時候有深入研究的態度就能達到一定的深度,在深度學習的時候,主動學習相關的技術點,廣度也得到拓寬。
高效的開發環境
我們可以從編緝器談起,這里有IDE vs Text Editor,有Vim vs Emacs,有Sublime vs Atom,那該如何選擇呢?在做選擇之前,我們先想想自己的目標。我們希望這是一個長期的投資,這款編緝器能被長期使用,在這個過程不斷地打磨,使其能完全適合自己的習慣,最大化編緝效率。如果程序員是俠客,編緝器則是他手中的劍。
雖然我是Vim的重度用戶,但我覺得當年選擇Vim時有欠考慮。如果讓我重選一次,我的第一選擇會是Emacs,第二選擇會是Atom。Emacs已存在30年,社區仍然活躍,其可擴展性在編緝器中無人能出其右。Emacs的腳本語言elisp又是lisp的一種dialect,我覺得對lisp的學習可以提升程序員對編程核心思想的理解。另一個加分點是Emacs由于其本身的高門檻及lisp特質,吸引了大批高質素的程序員,其社區可謂藏龍臥虎,更誕生了像Org-mode這樣神級的插件。反觀Vim,Vim的精髓在于Mode editing,這是值得學習的,可以極大提高文本編緝的效率。
但當你熟悉了這一理念后,我覺得可以轉投其他編緝器,因為Vim的架構與Vimscript限制了其擴展性。Emacs通過Evil插件非常完整的支持了Mode editing,其他主流的編輯器也有類似插件,所以你一旦掌握了這個理念,在別的編輯器中也可以發揮作用。可能有人會說沒有一個Vim emulator能做到Vim 100%的功能,但重點不在于某條指令是否被移植,而是mode editing思想的精髓能否被移植,我覺得答案是肯定的。
再看Atom vs Sublime,Atom的可擴展性非常好,它的大部分核心功能也是以插件的方式實現,這點與Emacs有異曲同工之妙。并且其開源的特性,使我相信它有比Sublime更持久的生命力。
關于IDE,我的看法是,我不排斥IDE,但每個IDE都是為了某個特定的任務或是編程語言服務的。做為一個有追求的程序員,可以用IDE,但依然需要精通一個強大的通用編緝器。
類似編緝器,高效的開發環境還包括Shell,Launcher,窗口管理器,文檔閱讀器等等。其中有一部分只需要你化很少的時間就可以完成配置,它們的投資回報率是非常高。
信息采集器和筆記本
前者是用來收集別人產生的信息,后者則是收集自己產生的信息。前者一個簡單的例子就是瀏覽器的Bookmark。你需要能隨時將一組有用的信息歸檔,并在未來的某個時刻快速找到它。后者最直觀的例子則是Mac OS或是iOS自帶的筆記本,這里的目的是能隨時隨地記錄你自己的想法。從本質上講,就是你需要有一套好用的工具來做你的知識庫管理(Knowledge management),也可以說是你知識和思想的外部備份。我個人現在是用Evernote同時來做信息采集與筆記的。如果有一個好的流程,你也完全可以用兩個工具來分別把這兩件事做好。但我建議你花足夠多的時間來思考如何組織你的個人知識庫。
以上只是兩個典型的例子,你需要做的是發現那些你要長期從事的任務(往往不隨技術而改變,也不隨公司而改變),將完成這些任務所需的工具調整至最優。再舉一個例子,我會留意身邊的程序員所用的鍵盤。只有少部分的程序員會買高端的靜電容鍵盤,比如HHKB。而在我看來,這明顯是一筆很劃得來的投資,程序員在工作的大部分時間里都需要和鍵盤打交道,一個舒適的打字體驗是非常有收益的,更何況這類高品質的鍵盤都非常的耐用。
你需要學會的編碼習慣
程序員應該學會通過技術的手段來提高效率。幾個常用的手段是使用工具,快捷鍵和編寫腳本。
使用各種工具
技術人員電腦盡量用MAC,使用命令行效率一定比在 10241024 像素中找一個 1010 像素的按鈕更快。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.xml pom.xml.bakrm pom.xmlln -s pom-2-deploy.xml pom.xmlmvn deployrm -rf pom.xmlcp pom.xml.bak pom.xmlrm pom.xml.bak
在業務團隊做開發如何成長
我一直在業務團隊中做開發,在業務團隊最主要的提高的能力是業務抽象和架構能力,通過業務場景,不斷思考如何通過合理的架構和業務抽象能快速支持業務,降低運維成本。同時在這個過程中鍛煉技術能力,比如寫一些技術框架來快速支持業務,做到技術驅動業務。
可配置化的方式支持業務
設計業務的領域模型,把不隨著業務邏輯變化的領域模型做成系統能力,把隨著業務邏輯變化功能,做成可配置化,上一個新業務,通過配置的方式或少量開發就能支持。
在做客戶后臺功能時,由于需要展示的數據種類非常多,每種數據展示可能需要花費幾天的時間,所以設計了一個通用的技術框架,實現了通過配置化的方式展示各種數據。
寫框架解決業務問題
我在上家公司經常做一些CRUD的業務功能,我就自己開發了一個快速做CRUD的框架 jdbcutil,通過配置實體生成SQL語句,實現了子類只要繼承父類,就自動擁有CRUD的能力。后面還寫過生成CRUD頁面代碼的程序。
目前我們團隊在做的TITAN框架通過模塊化開發的方式,解決易變的業務系統在多人開發時遇到的問題。
技術驅動業務
在業務團隊,一定要不斷的思考如何利用技術來支持快速支持業務,配置化是一種思路,但是有些功能配置復雜度比較高,配置加驗證的工作量,可能需要一個星期的時間,那么能不能減少人工配置,實現系統自動化配置,于是可以研究下人工智能,通過人工智能的方式實現,系統告訴人需要配置哪些東西,然后交給人來進行確認,這樣可以大大減少人工成本,更快的支持業務。
系統化學習不斷的提升自己的能力
掌握系統化的學習方法
如果學習到的知識不成體系,那么遇到問題時就會非常難解決。有些同學會出現這些情況,比如編碼時遇到問題百度搜索,如果百度上找不到答案,這個問題就解決不了。再比如,在開發中要用到某個技術點,就學習下API,程序調通后就不再深入研究,淺嘗輒止,如果程序遇到其他問題也不知道如何解決。
以上情況我認為叫 點狀學習 。遇到一個問題,解決一個問題,需要一項技術,學習一項技術。那么如何由點到面,由面到體,形成系統化學習呢。
首先要確定學習的知識領域,需要達成的學習目標,針對目標制定學習計劃,就像你要寫一本書一樣,先把目錄寫出來,然后根據目錄上的知識點逐步去學習,最后把這些知識點關聯起來,形成一個系統化的知識體系。學習的時候,可以制定一個計劃,以周為單位,比如第一周學什么,第二周學什么。
有不少朋友會問,那怎么算系統化學習,系統化學習還要系統學習哪些Java相關的技術,這里我也分享自己收集的系統的學習資料,互聯網Java技術學習路線圖,真心的希望能幫助到大家。架構師必須具備的一些技術總結出來一套思維導圖和錄制了一些相關視頻,分享給大家,供大家參考。感興趣的鐵子們可以后臺私信【架構】免費獲取高清知識體系思維導圖及相關資料。
![]()
![]()
一:常見模式與工具
學習Java技術體系,設計模式,流行的框架與組件是必不可少的:
常見的設計模式,編碼必備
Spring5,做應用必不可少的最新框架
MyBatis,玩數據庫必不可少的組件
![]()
二:工程化與工具
工欲善其事必先利其器,不管是小白,還是資深開發,玩Java技術體系,選擇好的工具,提升開發效率和團隊協作效率,是必不可少的:
Maven,項目管理
Jenkins,持續集成
Sonar,代碼質量管理
Git,版本管理
![]()
三:分布式架構
高并發,高可用,海量數據,沒有分布式的架構知識肯定是玩不轉的:
分布式架構原理
分布式架構策略
分布式中間件
分布式架構實戰
![]()
四:微服務架構
業務越來越復雜,服務分層,微服務架構是架構升級的必由之路,Java技術體系,和微服務相關的技術有哪些呢?
微服務框架
Spring Cloud
Docker與虛擬化
微服務架構
![]()
五:性能優化
任何脫離細節的ppt架構師都是耍流氓,向上能運籌帷幄,向下能解決一線性能問題,Java技術體系,需要了解:
性能指標體系
JVM調優
Web調優
DB調優
![]()
?六:底層知識
從架構設計,到應用層調優,再深入了解底層原理,扎實的Java基本功才能讓自己變為掃地神僧:
內存模型
并發模式
線程模型
鎖細節
![]()
我覺得步入職場的前3年對今后的發展尤其重要, 所以,大家如果想往技術路上走的,想成為架構師的,一定要保持終生學習的態度,讓學習力成為核心競爭力,才能不被時代所淘汰,知易行難,知道了上面的一些經驗,并不代表年輕程序員們就能馬上成功,畢竟這需要一個鳳凰涅槃和實踐的過程,但是肯定能幫助有志于于此的年輕程序員們少走一些彎路。希望此文能對年輕的程序員們有所幫助。
最后
希望大家能從文章中得到幫助獲得收獲,也可以評論出你想看哪方面的技術。文章會持續更新,希望能幫助到大家,哪怕是讓你靈光一現。喜歡的朋友可以點點贊和關注,也可以分享出去讓更多的人看見,一起努力一起進步!






