前谷歌技術(shù)主管親述:程序員請避開這幾大雷區(qū)
軟件工程師的技能發(fā)展都會(huì)經(jīng)歷一個(gè)自然的過程——經(jīng)驗(yàn)從無到有,最后變成老手。而一旦到了經(jīng)驗(yàn)豐富的階段,他們對代碼就不那么感興趣了。恰恰相反,他們會(huì)把更多的精力放在文件設(shè)計(jì)和代碼重構(gòu)上。
奇怪的是,不管任職于哪家公司,大多數(shù)經(jīng)驗(yàn)豐富的工程師都會(huì)表現(xiàn)出同樣的特點(diǎn)。他們?nèi)狈Υa的關(guān)注,和其他工程師相比,他們寫代碼的速度較慢。這是因?yàn)楹蛢H僅編寫代碼相比,他們會(huì)將更多的時(shí)間花在設(shè)計(jì)上面。
從一個(gè)新手到經(jīng)驗(yàn)豐富,這個(gè)轉(zhuǎn)變過程不是一蹴而就的。但一般而言,這些工程師會(huì)用幾年甚至幾十年的時(shí)間,逐漸成為領(lǐng)域內(nèi)資歷很高的人。
他們似乎在每個(gè)公司都是一樣的——不斷地處理新出現(xiàn)的需求,進(jìn)行不必要的繁忙工作——這無疑會(huì)讓他們感到沮喪。本文將指出工程師們可能表現(xiàn)出的一些抑制其發(fā)展的特征。
1. 在代碼重構(gòu)上浪費(fèi)時(shí)間
@techleadhd作為目前在世的經(jīng)驗(yàn)最豐富的工程師之一,在推特上透露了他關(guān)于編寫代碼的真實(shí)想法。
他顯然不相信編寫代碼的意義。相反,他暗示稱刪除和重構(gòu)代碼是有價(jià)值的。
但這項(xiàng)工作并不是軟件清理,而是做軟件工程。
這就意味著工程師需要設(shè)計(jì)代碼,而不是維護(hù)代碼。維護(hù)代碼是其他人的工作,興許實(shí)習(xí)生就能做到。
軟件工程師們應(yīng)該花時(shí)間對那些陳舊低效的代碼進(jìn)行編程,而不是試圖改進(jìn)舊的基礎(chǔ)結(jié)構(gòu)。只要工作正常運(yùn)作,就還可以用尚有不足的代碼。然而,不少經(jīng)驗(yàn)豐富的工程師似乎認(rèn)為維護(hù)舊代碼具有很重要的意義。
2. 關(guān)注整體情況而不是代碼
值得明確的一點(diǎn)是,整體情況和業(yè)務(wù)方面的事情并不重要,重要的是代碼!
經(jīng)驗(yàn)豐富的軟件工程師有一個(gè)壞習(xí)慣,就是把注意力集中在整體情況而不是代碼本身。他們喜歡提出這樣的問題,比如“這個(gè)項(xiàng)目將對誰產(chǎn)生影響”“最終用戶將如何與代碼交互”以及“工程師將如何維護(hù)代碼”。
他們花費(fèi)很多時(shí)間試圖去了解項(xiàng)目的范圍以及它對于公司的影響。有時(shí),他們甚至?xí)盟麄冋J(rèn)為的“更好的解決方案”來挑戰(zhàn)領(lǐng)導(dǎo)階層。那么,當(dāng)他們專注于諸如“影響”和“優(yōu)先次序”之類的瑣事時(shí),他們?nèi)绾纬槌鰰r(shí)間來完成所有代碼?
把所有的時(shí)間都花在會(huì)議、鞏固、度量跟蹤和代碼審查上,會(huì)導(dǎo)致代碼編寫不再純粹。
優(yōu)秀的程序員不應(yīng)該質(zhì)疑他們正在做的事情。相反,無論是什么請求,他們都應(yīng)該低下頭來編碼。在任何時(shí)候,企業(yè)都確切清楚什么樣的行為將會(huì)對公司產(chǎn)生影響。作為程序員的工作職責(zé),就是做好本職工作,而不是弄清楚他們做的事情是否值得,或者是否符合公司的戰(zhàn)略。
希望經(jīng)驗(yàn)豐富的工程師們記?。耗闶浅绦騿T,而不是領(lǐng)導(dǎo)者。
3. 總是想要一個(gè)設(shè)計(jì)文檔
出于某種原因,經(jīng)驗(yàn)豐富的軟件工程師們總是想要一個(gè)設(shè)計(jì)文檔。其實(shí),在不考慮設(shè)計(jì)文檔的情況下,無論項(xiàng)目規(guī)格多大,直接開始編寫都要快得多。
人們不會(huì)用一個(gè)稍微不同的對象或任何東西去重復(fù)功能。那么,為什么經(jīng)驗(yàn)豐富的軟件工程師偏要如此在意呢?
最后,如果不需要花時(shí)間考慮設(shè)計(jì)文檔,工程師很可能將以快十倍的速度編寫代碼。
4. 不喜歡“復(fù)雜性”和“設(shè)計(jì)過度的工程”
在某種程度上,有些資歷頗深的工程師不再愿意深思其他人的代碼。
因此,當(dāng)創(chuàng)建一個(gè)模塊時(shí),他往往把在學(xué)校學(xué)到的所有知識都融合到一個(gè)面向?qū)ο笥洃涹w中,并通常聲稱這是過度設(shè)計(jì)的代碼。
其實(shí)他們只是不想深思別人的杰作。
花時(shí)間去理解如何從對象B中得到對象A,然后調(diào)用函數(shù)C,調(diào)用函數(shù)D,有時(shí)選項(xiàng)F和選項(xiàng)G從配置文件E提取,配置文件E用函數(shù)F從數(shù)據(jù)庫G中來解析數(shù)據(jù),然后將日志存儲在Hadoop、 CouchDB和S3中,這會(huì)很困難。
人們開始抱怨,說代碼太簡單,或者設(shè)計(jì)太復(fù)雜。懶惰使得精心設(shè)計(jì)的代碼很容易停產(chǎn)。
5. 他們都被困在未來
事實(shí)上,我們現(xiàn)在所了解的框架往往是一生中所需要了解的唯一框架。
然而,經(jīng)驗(yàn)豐富的工程師似乎花費(fèi)了大量的時(shí)間去學(xué)習(xí)新的框架和語言,最起碼去研究新的設(shè)計(jì)原則,但這往往并非是必須要做的事情——很多事情并非是越多越好的。
事實(shí)上,從這一點(diǎn)來考慮的話,經(jīng)驗(yàn)豐富的軟件工程師可能正是阻礙社會(huì)發(fā)展的因素之一。
隨著對代碼重構(gòu)、設(shè)計(jì)文檔和學(xué)習(xí)所提出的源源不斷的需求,他們不斷地推進(jìn)著軟件的迭代。我們甚至可以這么想:如果沒有那些經(jīng)驗(yàn)過度豐富的工程師,現(xiàn)在說不定已經(jīng)出現(xiàn)比我們更智能的飛行汽車和機(jī)器人了!