如何從菜鳥程序員成長為(偽)高手
1.摘要
最近有一些畢業(yè)不久的同事問我:“你工作的時候有沒有什么竅門?怎么才能快速成為高手?”
想起當初剛入職,新人培訓的時候,也跟其他同事討論過這個問題:如何才能成為業(yè)界大牛?當時自己只是覺得興趣是***的老師,思路方法什么的沒有多想。
加入微博平臺架構部的時間也不短了,趁著快過春節(jié)總結了一下自己入職微博以來的工作情況,從互聯(lián)網(wǎng)開發(fā)的半個門外漢,到如今能設計一些架構、排查一些問題、分享一些經(jīng)驗,收獲頗多,感想頗多,也逐漸意識到思路和方法的重要性,在此跟大家分享一下。主要分為學、做、想三方面。
2.學會學習
學習無疑是程序員最為重要的素質之一,尤其是互聯(lián)網(wǎng)這種日新月異的行業(yè),把學習當做工作的一大半也不為過。
2.1.自主學習
最近發(fā)現(xiàn)身邊的人并不是不想學習,只是每天都在糾結自己到底學什么好:簡單的沒挑戰(zhàn),復雜的看不懂;舊技術怕過時,新技術沒方向……
講講自己畢業(yè)后的經(jīng)歷,畢業(yè)之后去了個不大不小的公司,工作主要是做一些XX管理系統(tǒng)之類的東西,沒什么挑戰(zhàn),也用不上什么技術,基本上前端用個extjs后面套個sql server就解決了。工作穩(wěn)定了幾年,業(yè)余時間除了wow沒別的事情做,覺得這么閑下去不是辦法,于是之后一年的時間里,用上班摸魚和下班休息的時間學了這些東西:
閑著無聊想做個小游戲,發(fā)現(xiàn)游戲相關的書大多是英文的,看不懂,一咬牙翻譯了《Real-time rending 3rd》的前幾章,剛開始前言都看不懂,只能一個詞一個詞的翻字典,一句話要琢磨幾個鐘頭到底作者說的到底是什么意思。翻譯了幾百頁英文書之后,發(fā)現(xiàn)自己看英文書沒什么障礙了,于是開始每天用休息和摸魚的時間看書。
看完游戲引擎的書之后,把irrlicht引擎的代碼看了一遍,然后自己山寨了一個3d渲染的場景管理器,還有個樸素的渲染引擎。
給自己的游戲引擎寫了個基于腳本語言的解釋器,為此看了不少編譯原理和虛擬機的書,了解了程序究竟是什么東西,這是我覺得收益很大的一件事情。
看編譯原理的書的時候發(fā)現(xiàn)操作系統(tǒng)的知識有些欠缺,又去看了linux內核相關的書。之后買了個開發(fā)板天天修改內核玩,畢業(yè)以后又一次了解了內核的cpu調度、內存管理和文件系統(tǒng),了解了應用是怎么跑在操作系統(tǒng)上,操作系統(tǒng)又是怎么運行在硬件上的,這也是收益很大的一件事情。
看完操作系統(tǒng)又順著看網(wǎng)絡相關的書,之后把lighthttpd的代碼看了一遍,用c寫了個linux下的http服務器,把幾種網(wǎng)絡編程模型挨個實現(xiàn)了一遍。
實現(xiàn)http服務器的過程中覺得自己編碼能力還是有欠缺,把代碼大全翻了一遍,順著又去看了設計模式的書,并且用自己的理解把每個模式用文字重新描述了一遍。
中間還看了很多語言和框架相關的書,就不一一列舉了。可以參考這里。
我把學習的方向分為三類:
為了工作,滿足當前工作所必備的知識
為了提升,與當前工作相關的知識(深度)
拓展視野,與當前工作無關的知識(廣度)
學習(1)之后只是個熟練工,2和3才是提升自己的途徑,伴隨著知識儲備的提升,接觸新事物時更容易找到相似的知識加以類比,加快理解,也更容易掌握本質。如果每天都在糾結“到底學什么”,那么只能說明還是學的太少了。(真正沒什么可學的大牛們應該不會讀到這里吧……)
所以,如果覺著沒什么東西可以學的時候,那么可以考慮一下學一下更有深度的知識(比如虛擬機或編譯器),或者完全不同的知識(新的語言或當前比較火的方向),甚至完全不相干的知識(單純練習英文閱讀,學習ppt排版之類)吧。隨著知識儲備增加,自己的不足和未來的學習的方向也會更加明確起來。
2.2.向歷史學習
以微博為例,在微博發(fā)展的過程中經(jīng)歷了不少波折,并逐漸衍生出了目前的系統(tǒng)架構。很多新人最喜歡問的問題便是“現(xiàn)在線上是怎么做的?”
這個問題不錯,但是還不夠好。在程序員的世界里罕有能解決所有問題的“銀彈”,當前的做法用不了多久也會被替換掉,如果想了解一件事情,那么就多關注一下“它是怎么變成今天這樣的”吧。學會用發(fā)展的眼光看問題,了解一些經(jīng)歷過的經(jīng)驗教訓,收獲會比單純學會一件什么事情多的多。
那么,如何向歷史學習?
公司內部的資料庫、wiki等大都會有舊時的資料,剛入職時大多不會太忙,這些資料庫簡直是挖不完的寶藏
部門內部分享,比如我當初入職時經(jīng)常去聽“微博XXXX架構演化歷程”之類的內部分享
多問一下自己”它為什么不那么設計“
老員工憶苦思甜吹牛逼的時候多奉承幾句(:з」 ∠)
2.3.向他人學習
這里有兩個極端,
有的人喜歡自己悶頭搗鼓,什么也不問,這必然是不利于自己提高的;
也有人碰到問題就問,這也有問題,浪費他人時間不說,更關鍵的是說明這人向他人學習的思路錯了,要學習他人的并不是具體某個知識(要學知識看書就能解決了),而是學習別人的思維方式。
但是思維方式這種東西很難通過交流的方式學到,后來我發(fā)現(xiàn)有個很簡單的學習方式:口頭禪。舉幾個例子,大家體會一下:
“這個其實是兩個問題”
“有沒有更好的方案”
“能不能舉個例子”
“能不能給個一句話總結”
除了口頭禪,很多牛人都會有非常鮮明的思維方式和處事原則,如果有幸與業(yè)界的大牛共事,那么恭喜你,只要多交流、多觀察、多思考,那么提升速度會提升好幾個數(shù)量級。
3.多做有意義的事情
有的人每天時間浪費在跟問題本身無關的事情上,比如我要設計架構的時候還要考慮架構圖怎么畫,寫完代碼還要反復部署測試好幾輪才pass,查bug的時候把時間浪費在掃日志上。人的精力總是有限的,把時間浪費在這些事情上面,讓自己提高的時間就變得少了。
3.1.練習,更多的練習
這里有個誤區(qū):“做有意義的事情”不等于“只做自己沒做過的事情”。
對于程序員來說,寫代碼是基本功中的基本功,編碼的規(guī)范、設計的權衡、甚至順手的IDE快捷鍵都要靠平日的試錯和積累,很難通過幾本書或者幾天培訓領悟到。
曾經(jīng)目睹一些人寫代碼一年之后開始做一些小項目的設計,然后就迫不及待的把重心全都轉移到設計甚至架構上,這種沒有基礎能力支撐做出的設計和架構最多只能算是高級意淫,大多沒等落地就荒廢了,意義不大。究其原因,大多是設計出來的東西“不好做”或者“不好用”,就像是只看過一遍課本就去參加高數(shù)考試,現(xiàn)實嗎?(學霸們我錯了……)
舉個例子,幾年前在看設計模式的過程中,用qt做了個看漫畫的應用,把能用的模式都試了一遍,當然有很多用的不合適的地方,正是這些不合適的地方讓我對面向對象編程和設計模式的思考深入了很多,如何權衡靈活性和復雜性也有了新的認識。之后在設計很多系統(tǒng)的時候少走了很多彎路,既保證了時間點又保證了質量。如果當時指望著“用的時候再說”,大概已經(jīng)被項目坑的不能自理了。
3.2.善用工具
工具能解決的事情就用工具去解決,好的工具能節(jié)約大把的時間用在更有意義的事情上。
工具的范疇很廣,比如linux的各種命令、比如團隊內部的各種系統(tǒng)、比如順手的應用、甚至包括上下班騎的自行車。只要能節(jié)約時間、提高效率,那就值得一試。
在這里我列舉幾個大幅度提升了我的效率的東西:
雙屏顯示器
順手的鍵盤
google(不是baidu!不是bing?。?/p>
mac
mac上的應用:idea、alfread、omnifocus、甚至synergy和istats menus之類跟開發(fā)本身關系不大的應用。
我更傾向于把“使用工具”作為一種生活態(tài)度:是否希望讓自己的生活專注于有意義的事情。如果你認同這個觀點,那么想一想投入和回報比例,還是很可觀的。
(當然,為了不花錢而自己破解應用的大神也是極叼的……)
3.3.提高時間的利用率
時間是所有期待提升自己的人最寶貴的資源,效率再高,沒時間做也沒意義。
網(wǎng)上有個流傳挺廣的圖:打擾程序員的成本。事實上我每天的工作時間非常碎片化,來到公司之后可能不斷的接電話、被問問題、被拉去開會、回復郵件等等;也經(jīng)常會有時間不夠用或者沒事做的困惑,這里分享一下心得:
GTD可以整合很多碎片時間。除了把事做完之外,把上下文相關的事情集中在一起完成也很有幫助。比如把幾件想去其他辦公室做的事情整合成一趟完成。
減少無意義的時間浪費,比如家住在公司邊上可以每天節(jié)省幾個小時的時間用來學習或者做別的事情。(但如果節(jié)省下來的時間用來刷微博,那就沒有必要了。)
另外一個很有趣的現(xiàn)象:一個軟件的注冊費就10幾刀,貴些的幾百刀,把日常用到的所有工具的費用全加起來都頂不上一個腎6貴,但是很多人還是堅持著沒有破解不用的觀念,為了幾百塊錢浪費了大把時間。
加班可以創(chuàng)造很多時間,并且能有效減少被打擾的幾率,但是也會給身體和精神帶來很大負擔。因此加班做的事情必須能對個人進步產(chǎn)生足夠多的收益。如果加班只是用來處理無意義的工作的話,那應該是日常工作出了什么問題。
事情可以分成緊急重要、緊急不重要、重要不緊急、不重要不緊急四類,在todo列表里隨時要有重要不緊急的事情。
4.學會思考
4.1.深究
當有什么問題解決不了的時候,很多人會有畏難或者拖延的情緒,典型口頭禪就是“就這么湊合著用吧”或者“先這樣吧,以后有時間再研究”,說這些話的人大多并不是真的那么忙,甚至有人一邊刷著微博一邊跟我說沒時間研究……(你tm在逗我?)
要克服畏難情緒其實很簡單,找一個具體的似懂非懂的問題,想盡辦法把問題研究清楚,體會幾次解決問題時的愉悅感,建立自信。
大部分問題其實沒有什么高深的科學原理,甚至只要翻幾頁書就解決了,但是遇到問題不深究,久而久之會形成自我暗示:這些問題是我懂的,那些是我不懂的,自己反而把自己進步的路給堵上了。
說到如何深究,也有幾條心得:
遇事多想為什么,并且要反復問為什么。很多貌似理解了的問題過一陣再重新想想,往往會發(fā)現(xiàn)之前還有沒考慮到的地方
問題要有明確答案,哲學之類的就別糾結了
查找資料時選權威的書籍或者網(wǎng)站,避免被誤導
找人討論,或者直接拉小伙伴入伙,既可以互相交流,又可以互相監(jiān)督
分享你的成果
不要所有事情全都深究,會給自己太多壓力
4.2.多說,多寫,多交流
平常工作中有一個感受,有交流和寫作習慣的人思路會更清晰一些,能接觸到的觀點也會多一些。這方面其實屬于我的弱項,大概總結幾個觀點。
隔一段時間***能書面形式總結一下最近的工作,比如說寫個心得感悟,或者持續(xù)更新自己的簡歷
寫作的時候有兩個難點:對要說明的事情做總結和抽象,形成觀點統(tǒng)一、調理清晰的主線;從對方的視角考慮,把事情說明白,避免自言自語。
找人討論之前自己先要有個基本完整的思路,否則大部分的時間都要耗在解釋原理之類的上網(wǎng)查反而更快的事情上。
討論之后要有一句話就能說明白的結論和描述清晰的時間點。
有些人喜歡糾結于“這個不是我的問題,為什么要我處理”之類的事情。在我看來這是很好的機會。既能增長見識,又能展示水平,還能留個認真負責的好名聲,何樂而不為呢。
5.***
***分享一下關于我理解的程序員的自我修養(yǎng),在我看來,可以總結為:負責任,重名聲。
負責任,說的更具體些:寫的代碼自己有沒有測過、做的框架自己有沒有用過、設計的架構自己有沒有認真權衡過。
重名聲,說的直接些:沒有測過的代碼、沒有用過的框架、沒有權衡過的方案有沒有臉交付給別人。
與各位共勉。