如何從菜鳥(niǎo)程序員成長(zhǎng)為(偽)高手

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
























