成為高級(jí)工程師的五個(gè)關(guān)鍵思維

Dave Cutler(Windows NT的首席設(shè)計(jì)師),今年74歲,這么“年輕”的程序員仍然每天到微軟辦公室去寫代碼。
我第一次知道Cutler是因?yàn)樗?0年前對(duì)PC產(chǎn)業(yè)的貢獻(xiàn)獲得電腦歷史博物館研究員的大獎(jiǎng),但是光根據(jù)他這輩子寫的代碼數(shù)量,你不得不承認(rèn)他是最牛的程序員。
但是比起前面這些光環(huán),他的工作已經(jīng)影響20億的電腦使用者的經(jīng)驗(yàn),在他諸多貢獻(xiàn)中,Cutler建立了Windows NT很重要的部分:過去20年來所有主要的Windows版本的基礎(chǔ),這讓微軟在早期市場(chǎng)上有非常大的優(yōu)勢(shì),回想之前的電腦操作系統(tǒng),如何讓操作與前面的版本兼容,所以他更被人們津津樂道的成為“微軟Windows操作系統(tǒng)背后的關(guān)鍵技術(shù)頭腦”。
是什么讓Cutler這樣的人成為如此成功的程序員?我們要如何立志才能達(dá)到他,可能只到他的幾分之幾的影響力呢?什么讓這些最強(qiáng)的程序員,他們的軟件創(chuàng)造如此巨大的影響呢?
雖然寫代碼不是程序員唯一的活動(dòng),但不可否認(rèn)我們大部分時(shí)間仍然為之奮斗。許多硅谷頂尖公司的工程部門主管后,我發(fā)現(xiàn)最有效率的工程師,確實(shí)完成任務(wù)且有很大影響力者,都有最少以下五個(gè)思維:
1.對(duì)于陌生的語言會(huì)毫不畏懼地下去了解
跳進(jìn)一個(gè)不熟悉的語言里面讓人不舒服甚至感到害怕,很多人可能連試都沒試就放棄了。這種嚴(yán)苛的技巧在你多次嘗試后將不再困難,且經(jīng)過這種歷練,你將會(huì)有顯著的成長(zhǎng)。如果一個(gè)開源library或另一團(tuán)隊(duì)給的library不符合你的預(yù)期,這時(shí)候剛好給你一次機(jī)會(huì),抓出為什么你覺得不好的原因。
對(duì)陌生感到害怕不會(huì)只局限于代碼。每次你換工作,你可能會(huì)遲疑是否有辦法復(fù)制前一角色一樣強(qiáng)的工作表現(xiàn)。很少人不公開談“冒名頂替綜合癥”(imposter syndrome),但我曾聽過CTO職位的人告訴我他們有覺得自己是冒牌的感覺。
事實(shí)上每個(gè)人的起步都不一樣。Culter的學(xué)歷是一所不出名的大學(xué),且不曾受過正式的電腦科學(xué)教育。從很多方面來說,他的起步落后于很多人,且需要通過嘗試和錯(cuò)誤學(xué)習(xí)很多事務(wù)。
為了與時(shí)俱進(jìn),我們必須采用成長(zhǎng)的思維與最佳化學(xué)習(xí)任何技術(shù),不管是程序開發(fā)、溝通、聯(lián)網(wǎng)、小型演說或任何其他事務(wù),都是學(xué)得來的,只要你愿意花時(shí)間,就你想學(xué)的項(xiàng)目找書來讀、尋求幫助。相信隨著時(shí)間的積累,處理不熟悉的事情會(huì)越來越容易。
2.精通解Bug
“為什么我寫出來的代碼不是我想要的效果?”
這是身為軟件工程師每天會(huì)問自己的問題。解決bug的能力對(duì)于程序員完成整體項(xiàng)目收尾有著很大的影響,然而在大學(xué)的課程里以及技術(shù)的面試這項(xiàng)技能都沒有得到重視。
你如何有效率的debug?
由其核心過濾出的科學(xué)的方法:
1,猜猜到底發(fā)生了什么錯(cuò)誤。
2,假設(shè)猜測(cè)正確,辨識(shí)此猜測(cè)將會(huì)有哪些錯(cuò)誤的結(jié)果。
3,試著觀察與結(jié)果抵觸的事實(shí)。
4,如果有任何抵觸,你的猜測(cè)就不正確,所以請(qǐng)做另外的猜測(cè)。如果沒找到任何抵觸,那已找到其中一個(gè)原由。
5,要能更快的排除BUG,你必須要學(xué)會(huì)做更好的猜測(cè),且你要精通那些能讓你更有效觀察的工具與技術(shù)。
是否能做更好的猜測(cè)取決于你解決更多的問題也因此經(jīng)歷了更多的練習(xí)。
是否能有更好的觀察能力在于你是否掌握了技術(shù)竅門。先從每件事都有辦法觀察到的假設(shè)開始,然后找出可以讓你做到某種觀察或更快辨識(shí)出來的工具和機(jī)制。別以為你只能從你熟悉的有限工具來做觀察,經(jīng)常有可能某人已經(jīng)發(fā)展出某個(gè)工具,它已經(jīng)知道你想要找的。
3.投資可省時(shí)的工具
當(dāng)電腦剛剛問世,資源很有限且昂貴,所以程序員在使用電腦時(shí)要很注意資源占用。而現(xiàn)在,亞馬遜云端的一小時(shí)運(yùn)算花費(fèi)不到一毛錢。
但反觀來看,我們?nèi)匀灰粯右惶熘挥?4小時(shí),一星期只有7天。這表示任何手動(dòng)的工作如果可以用電腦替代處理,將會(huì)是高度減輕工作負(fù)擔(dān)的杠桿。我們以投資省時(shí)的工具以及自動(dòng)化流程來達(dá)到,只要是能讓我們放大投入相同時(shí)間的產(chǎn)出,或能在我們睡覺時(shí)或?qū)P钠渌麊栴}時(shí)幫我們自動(dòng)做某些事的工具,都值得考慮投資。
當(dāng)前Facebook的技術(shù)總監(jiān)Bobby Johnson(他把6人的構(gòu)架團(tuán)隊(duì)成長(zhǎng)到100人以上)曾提到一個(gè)他觀察到的現(xiàn)象“所有成功的程序員,幾乎都寫了很多工具”
這似乎很明顯,對(duì)于程序員而言工具是很棒的投資,可是當(dāng)我們真正的去分解一天的工作時(shí)間,計(jì)算要花多少時(shí)間在工具建置上,我們認(rèn)為應(yīng)該不會(huì)很高。優(yōu)秀的開發(fā)團(tuán)隊(duì),很多最好的程序員事實(shí)上花三分之一的時(shí)間在工具上,用這些工具來做代碼的部署、監(jiān)控系統(tǒng)以及更多方面來幫助他們?cè)诟痰臅r(shí)間內(nèi)完成更多事,不要一直做可以運(yùn)用機(jī)器就能幫你做好的事。
4.最佳化重復(fù)性動(dòng)作的速度
假如說從一個(gè)function call找到并導(dǎo)覽到它的定義花你12秒,如果你一天要做類似的導(dǎo)覽60次,那就是每天要花12分鐘在檔案的導(dǎo)覽,如果你夠熟悉文字編輯到檔案導(dǎo)航的快捷鍵,將12秒縮短到2秒,那么經(jīng)過一天,你節(jié)省了10分鐘。每年,加總起來你可省40小時(shí),相當(dāng)于一個(gè)工作星期。
找出三個(gè)類似的最佳化,如此你將節(jié)省一個(gè)月,想像你每年多出一個(gè)月的時(shí)間可以做什么?
或假設(shè)你正在解決一個(gè)bug,這需要你開啟這個(gè)app然后導(dǎo)航過五個(gè)畫面以設(shè)定好狀況觸發(fā)那個(gè)bug。你可以花10分鐘來寫個(gè)程序幫你從開啟直接引到發(fā)生bug的畫面嗎?所以你將因?yàn)檫@小小的起始投資大大的加快迭代速度。
系統(tǒng)性的思考:“我可以如何加快重復(fù)性動(dòng)作的速度”這收益將很豐碩且隨著時(shí)間加倍。”
5.從系統(tǒng)級(jí)高度來思考
當(dāng)你寫代碼的時(shí)候,很容易認(rèn)為所謂“工作完成”就是你已經(jīng)寫完開發(fā)文檔所要求的代碼。但這些真的只是冰山一角,任何被閑置在代碼貯存器里的作品且沒有拿出來運(yùn)作的都是毫無價(jià)值的產(chǎn)物。
為了建置并交付真的有用的代碼,你必須超越寫代碼的角度,以系統(tǒng)級(jí)的高度來思考:
你寫的代碼如何與其他人建立的程序基底和功能配合?
你對(duì)自己寫的代碼已經(jīng)做夠足夠的測(cè)試了嗎?
產(chǎn)品團(tuán)隊(duì)能夠運(yùn)作你建立的功能嗎?
為了部署你寫好的代碼,運(yùn)營生產(chǎn)環(huán)境需要做什么變動(dòng)?
你新增的代碼對(duì)于正在運(yùn)行的其他系統(tǒng)會(huì)有不良的作用或影響性能表現(xiàn)?
當(dāng)使用你所寫的部分,用戶的行為如你預(yù)期嗎?
你所寫的代碼有達(dá)到你想發(fā)揮的影響力嗎?
這些都不是簡(jiǎn)單的問題,需費(fèi)點(diǎn)功夫來回答。但你需要一個(gè)清楚的心智地圖了解你寫的代碼是否符合大方向,指引你在時(shí)間和精力上的分配,讓自己的工作往更有影響力的方向發(fā)展。
這五個(gè)程序開發(fā)的思維將幫助你起步,但記得要成為成功的程序員或工程師一定還有更多條件是超乎寫程序的范圍,如果你想要通過更多開發(fā)實(shí)踐來提高自己的開發(fā)能力,歡迎入駐程序員客棧與這里諸多BAT級(jí)別和其他頂尖互聯(lián)網(wǎng)公司的程序員、產(chǎn)品經(jīng)理、設(shè)計(jì)師、一起組隊(duì)拿賞金吧。
