你的公司會獎勵程式碼量最大的那個人嗎
本文引自我的個人部落格http://johncai.github.io/thought/2014/05/17/does-your-company-value-top-committers/
在一次部門PM會議中,一位PM提出可以在每個月的update meeting中評選一些表現不錯的員工,比如執行code review最好的、最準時上班的等等,是個很不錯的想法。大家繼續思考還有哪些獎項時,其中一位說:提交程式碼最多的人,怎麼樣?或者提交程式碼次數最多的人!
聽上去是個不錯的建議,在我們這個軟體開發部門,寫程式碼是我們最主要的工作,這個獎項無疑是對程式設計師很大的鼓勵和肯定。但我心裡立刻就反應過來,這是危險很可能錯誤的做法。為什麼呢?
一個程式設計師,如果提及程式碼次數比別人多,無非兩種可能:
- 他比別人寫了更多的程式碼。
- 他比別人提交程式碼更加頻繁。
應該獎勵寫更多程式碼的程式設計師嗎?
不, 我很容易地就回想起,有一次要做某功能的釋出時,發現效能不行,我看了下程式碼,大概100行,執行過程需要查詢資料庫10次左右,有些查詢很慢。然後我把它重構(嚴格說應該是重寫)到10行程式碼,查詢資料庫2次,效能不再是問題,順利釋出。
什麼是重構?什麼是重寫?當你說重構時,首先,你得有女朋友,不對,首先,你得有測試;其次,要不你改生產程式碼而不改測試程式碼,要不你改測試程式碼而不改生產程式碼。這才叫重構;否則就是重寫。
好的程式設計師通過寫更少(而不是更多)的程式碼,來完成一個功能。用程式碼完成一件事,固然很爽,但很多好的程式設計師都有這個體會:刪除大段大段的程式碼時,更爽。
因為更少的程式碼意味著更高效,更可維護,更節約別人讀程式碼的時間(別忘記你花1天寫的程式碼,會有10天以上的時間被別人讀。),更能適應業務需求的變化。因此好的程式設計師對自己寫出的大量程式碼心懷不安,而為自己更少的程式碼感到傲嬌。
更好的程式設計師不僅著力於用更少的程式碼去實現軟體功能,更著力於開發更少的軟體功能來滿足更多的業務需求。軟體的feature不是越多越好,如果開發出來的東西沒人用,沒有解決客戶的問題,或者沒有給客戶帶來便利,沒有滿足他們的需求,那麼這樣的feature是沒有用的。
軟體feature是軟體開發團隊的output,滿足了多少客戶的需求,才是outcome。outcome無非就幾種:要麼給客戶省錢了,要麼給客戶賺錢了,要麼提高了對客戶的service,讓客戶的日子更幸福了。
優秀的程式設計師以解決客戶需求為目標,首先保證開發的軟體功能是真正需要的,也就是保證做對的事情,其次用對的方式寫程式碼,儘量降低程式碼量。他不再是碼農,他心裡總是有一張影響地圖,想著他要做的是如何通過程式碼影響他人。至於什麼程式碼行數,則多麼無聊的計數。
Do the right things. ATDD是重要的手段之一。
Do the things right. TDD是重要的手段之一。
應該獎勵提交程式碼更頻繁的程式設計師嗎?
看情況。毫無疑問,應該頻繁地提交程式碼,或者,更嚴格地說,頻繁地整合你的程式碼。這意味著要做持續整合,意味著,不要打特性分支。
整合
經常看到有些程式設計師,把兩天寫的一大坨的程式碼commit。他們做不到每1到2小時就commit一次程式碼,那麼意味著
- 他沒掌握分解任務這一必備技能。
- 他在這兩天失去了用程式碼跟其他程式設計師交流的機會。
寫程式碼是一種創造性的活動,程式設計師用思想交流,好的程式設計師把思想反應到程式碼中(talk is cheap, show me the code),時時用程式碼與他人交流。
另外一些程式設計師提交程式碼時,不先做整合,整合至少意味著編譯通過+單元測試的通過,表示我們這次提交沒有破壞之前的任何東西。任何的一次破壞,對於其他程式設計師來說,都需要花時間去看哪裡不對了,尤其是那些用程式碼交流的程式設計師,他們經常從伺服器pull最新程式碼,他們需要伺服器上的程式碼一直都是對的,以免中斷並打擾他們的工作。
整合!
很多使用git的團隊,為每一個feature打一個feature branch出來,然後做了上面所有的實踐,直到feature完成,才merge回開發的主線上。這樣的團隊還是沒明白整合的意思。整合就是在主線上整合的意思,沒有其它意思。沒事就打個branch,那是開源、超大團隊不得已而為之的做法。
不在主線上的程式碼是不存在的。
當然,其實還是應該沒事就打個branch,但在本地打,打出來做一些實驗性的東西,打出來以便目前工作未完成時可以隨時切換到另一個工作中去,打出個新天地。隨打隨刪。git的branch就是個指標,好好利用。
所以,應該獎勵提交程式碼更頻繁的程式設計師嗎?應該,如果他在做持續整合,他幾乎從不破壞程式碼庫,他以修復失敗的CI為第一要務,他讓所有程式設計師的工作流動而不停滯,他以更少程式碼為榮。
相關文章
- Scrum團隊的個人獎勵機制Scrum
- 獎勵一定是正向的嗎? 談談遊戲中的“壓力”與“獎勵”遊戲
- 你會敲程式碼嗎
- “來我公司寫爬蟲嗎?會坐牢的那種!”爬蟲
- 致AI:你是我今生最大的機會嗎?AI
- 你們公司做程式碼審查嗎?
- 你信嗎?重構軟體並不會改善程式碼質量
- 會寫程式碼是你創業路上的包袱嗎?創業
- 你需要程式設計師鼓勵師嗎?程式設計師
- python——公司年會抽獎小程式Python
- 俄羅斯公司用加密代幣獎勵員工加密
- 獎勵關
- 請註釋你那該死的程式碼
- 程式媛看過來!來自Google的特殊獎勵Go
- 推薦4款個人珍藏的IDEA外掛!幫你寫出不那麼差的程式碼Idea
- 你的程式碼有重複嗎?
- Google之類公司的程式碼質量如何?Go
- 2.6.6 指定程式的最大數量
- 老闆會因為你拼命寫程式碼而感謝你嗎?
- 你會執行指令碼嗎指令碼
- 學會了ES6,就不會寫出那樣的程式碼
- 【前端面試】同學,你會手寫程式碼嗎?前端面試
- AdMob獎勵廣告的入門指南
- 老闆會因為你拼命編寫程式碼而感謝你嗎?
- 你瞭解你和程式碼的生存環境嗎
- 物件導向:你是我的那個他嗎?物件
- AI會動你的“乳酪”嗎?AI
- 我們一直談論“寫程式碼”,但你會“讀程式碼”嗎?
- 多雲策略適合你的公司嗎?
- 端午團隊大PK!【漏洞翻倍獎勵+團隊獎勵】爽歪歪!
- Millward Brown&SessionM:34%獲得獎勵的使用者會點選廣告Session
- 你真的會用搜尋引擎嗎?能寫出好論文、找到好工作的那種
- 羨慕程式設計師的高薪?你會讓你的孩子當程式設計師嗎?程式設計師高薪
- 可以獎勵幾個糖果
- 每天加班的你,真的會工作嗎?
- 寫程式碼前的準備,你做好了嗎?
- 利用註解+反射消除重複程式碼,你學會了嗎?反射
- 你會為了效能而犧牲程式碼簡潔性嗎?