如何成為強大的程序員?
英文原文:aaronstannard.com,編譯:infoq – 侯伯薇
aaron stannard是新創公司markedup的ceo,他最近花費大量時間雇傭、評估很多不同的程序員,并和他們一起協作。在這個過程中他發現并總結了十種程序員無法意識到自己潛力的原因,意在讓更多程序員發掘出自己的潛力,從而成為強大的程序員。
aaron提到,他的公司中所使用的技術非常復雜,某些大型企業都很難掌握,所以對于想要加入團隊的程序員來說,入門門檻非常高。因此,盡管他們非常仔細地雇傭新人,但還是很難找到足夠天才的程序員。于是,他總結出十種阻礙程序員職業生涯發展的行為,并據此來幫助想要提升自身的平凡的程序員們。
1. 太害怕學不會新的工具、語言和框架
一般的程序員會墨守他們最喜歡的工具,而不希望學習新的,因為他們認為,離開了那些語言和工具,多年的經驗就會付諸東流。而強大的程序員會擁抱那些挑戰和機會,積極地學習新的工作方式。
&
2. 直到特性“完成”的時候才會提交。(但永遠都不會完成!)
他在markedup公司中把這種行為叫做“囤積提交(commit hoarding)”。有些程序員沒有足夠的信心來承受團隊中其他成員的批評和審查,因此會把自己的工作藏起來,直到“完成”狀態才提交。
這種開發者會損害團隊中其他人員的生產力,因為團隊看不到他每天的成果,而且他也不會在正常開發的過程中尋求幫助,這樣就會造成很多“最后一分鐘”的缺陷,從而讓交付延遲。而強大的程序員會知道,代碼并不是他們自己,因此會把代碼經常自信地呈現在其他團隊成員的眼前,獲得批評和建議。
&
3. 只是“知其然”會很危險
在這里aaron舉了微軟最近在c# 5.0中引入的async和await關鍵字為例,這兩個關鍵字會讓創建和管理異步調用變得很容易,但是也會造成上下文切換、對共享資源進行多線程訪問的成本,僅僅對此有基本了解的程序員會盲目地使用這些特性,把所有i/o調用都封裝成c#中的task對象,這會創建出危險的、不可預測的而且非常難以測試的代碼。
好的開發者不僅“知其然”,而且會了解為什么這么做以及應該在什么樣的條件下使用。
&
4. 分析癱瘓(analysis paralysis)
分析癱瘓是指在程序開發初期進行系統分析,常因為太過執著于控制所有可能的變化和意外,而造成大量時間的浪費,裹足不前。這是一種很經典的問題,會影響很多一般的程序員。它通常是由過度分析造成的,但是aaron認為其根本原因在于不敢做出壞的決定。一般的程序員會擔心犯錯,只想一次成功。
而強大的程序員不會害怕,他們會編寫很爛的代碼,對其進行單元測試,如果認為無法達到目的,就會在45分鐘之內把它拋棄。強大的程序員會積極地限制用來研究的時間,因為他們知道那是個陷阱——看起來是有效的,但經常都無效。
&
5. 沒有對工具和開發過程投入
如果你想要成為天才程序員,那么就需要投入時間提升技能和知識,而將你和普通的代碼工人區分開來的是快速編寫出生產級別代碼的能力。你可以同時擁有好的代碼和速度,但是你需要先對你用于構建的過程投入。
一般的程序員不會對工具、過程和環境投入,只會使用大量的時間學習新的語言特性和api如何工作,但那并不會改變什么。
通常,你作為程序員所能夠做出的最大改進并不是專注于你所編寫的代碼,而是優化你編寫代碼的過程。
&
6. 羞于請求幫助
一般的程序員羞于或者不想讓人知道自己不懂,所以他們裝作什么都知道,但這樣就有可能提交某種非常可怕的代碼到庫中。說“我不知道怎么做。”沒什么錯,強大的程序員知道這一點,所以當被問題難住的時候就會請求幫助。
&
7. 不知道如何讓其他程序員更容易使用你的代碼
在所有技術團隊中,工作很重要的一部分就是人員的并行(human parallelism),也就是多個人能夠同時對同一代碼庫工作的能力。但是對于團隊來說,能夠異步工作也很重要,當你不在的時候我可以修改你的代碼,反之亦然。
一般的開發者并不這么認為,他們會開始對一項任務編寫代碼,認為他們會永遠擁有這段代碼。而強大的開發者會知道技術債務的說法,從而試圖通過設計代碼來對其限制,讓它盡可能可維護和自解釋。(推薦閱讀:《用雞講解技術債務的形成過程》、《技術債務真正的代價》)
編寫可讀的代碼需要程序員改變他們的看法——你的代碼要比你在組織中存在的時間長。
&
8. 不知道如何閱讀其他人的代碼(或者不想讀)
當一位一般程序員看到用他所不熟悉的語言或框架編寫的代碼庫時,就想立刻重寫,而不考慮業務價值或者推向市場的時間。而強大的程序員會接受這樣的觀點,重寫所導致的業務成本通常是不可接受的,所以應該避免這種行為。他們會試圖坐在計算機前,理解、學習然后修改現有的代碼。
閱讀代碼要比編寫代碼還難,但是強大的程序員會投入時間來學習如何超越。
&
9. 不能從最終用戶的角度編碼(你考慮的范圍太狹窄)
有句話說得好:作為程序員,你的工作不是解決技術問題,你之所以解決技術問題,是為了解決業務問題。
一般的程序員只會陷在技術問題之中,而不知道最初是為什么要解決這個問題。更嚴重的是,一般程序員無法從頭開始創建出具有業務價值的東西。當被要求基于簡單的用戶設計新特性的時候,他們會死板地、照著字面對故事或者說明書做出解釋,這樣交付的產品用戶根本無法使用。因為他們不會考慮相關的用例;不會考慮最終用戶的體驗;并且在做面向用戶的內容時,設計都會很笨重。這導致他們無法編寫業務應用,只能做產品。
好的程序員會從最終用戶的角度來看他們的代碼。我怎樣才能讓它更輕松地解決用戶的問題呢?故事的文字內容之外有哪些方面會讓這個特性給用戶帶來更多收益呢?
&
10. 無法判斷任何編程任務的業務價值
這個問題和上一個是相關的,很多技術上很強的程序員之所以無法意識到自己的潛力,是因為他們不會停下來,從業務或者組織本身的角度去看一下他們的工作。
強大的程序員能夠自我管理,對選擇如何投入時間做出很好的業務決定,他們會問這樣的問題:這是我現在應該做的最有價值的事情嗎?我應該為之投入多少時間?離交付日期有兩個星期,我現在能做什么,從而更容易滿足那個日期呢?
一般的程序員不會,他們只會拿著說明書,然后盲目地實現,直到結束,不關心他們的工作和公司的業務目標有什么關系,以及對其他團隊和業務組會產生什么樣的影響。這樣,他們就會在業務價值很低的技術任務上浪費大量開發時間。
aaron在最后做出總結:如果你想要成為更好的程序員,那么就要從改變你看待代碼以及編碼的方式開始。你需要理解所編寫的每行代碼背后的業務成本;你需要從客戶或者最終用戶的角度來看待工作;你需要接受代碼會比你在組織中存在的時間更長,所以要以其他開發者能夠繼承的方式來設計;最重要的,永遠都不要害怕新的挑戰,也不要害怕請求幫助,你無法獨居一隅來提升工作效果,軟件開發也是社會化的工作。