【敏捷开发每日一贴】代码走查
代碼走查
怎樣走查
“高手本來自己就要開發很多代碼,還要替新手檢查代碼,多花費時間啊……”這是一個常見問題,答案是:“每天,在后檢查點,花費不超過15分鐘時間,能看出什么來就說什么,時間到了就停。”
一般而言,大致每天高手能編寫100多行有效代碼(按分號計數),新手會多一些但也不超過200(他們編寫代碼比較費),也就是10個屏幕以內。有經驗的人一定知道:高手看新手的軟件,5秒鐘就能發現問題。
常存在的一種情況是高手“看不懂”新手的代碼,當然不是因為技術太精妙了,而是寫得太亂了。但在松結對編程里邊不存在,由于師傅徒弟天天在一起,這200行代碼可謂一目十行,如果以往一直每天檢查代碼,那么里邊存在的問題應該不會很多。
走查什么
這個是重點,整體包括:
1. 結構問題
代碼最大的問題,不是一兩個地方有技術缺陷,也不是業務邏輯錯誤,而是整個軟件編寫的不好。前兩者都可以通過測試或使用來發現和更正,但后者就不同了。如果回想一下自己見過的各種爛攤子,是不是有同感?具體哪里有問題怎么改說不上來,就是整個軟件看上去混亂無章,無從下手。
具體結構問題包括:重復拷貝代碼(不封裝函數,不用Template/泛型……),函數過長(超過一屏幕就叫過長),錯誤封裝(不恰當的public/不用Interface/不內聚/強耦合/在類中封裝了無關方法……),內容錯誤(多個無關類置于一個文件/不恰當的命名……)等等。
改正結構問題,是從編寫可靠軟件向編寫精美軟件邁進的重要方法。
2. 業務邏輯問題
就是軟件是否與需求的要求符合的問題。師傅和徒弟經常對業務需求的理解有差異,借此機會同步一下,必要時引入PO(產品經理/策劃人員……)。
有人會說業務邏輯問題不是一測試就知道了嗎?可是測試一般發生在很久以后,有些邏輯測試還需要一定的觸發條件,而且測試只會發現失效(failure, 與預期不符)而不能發現缺陷(defect, 具體哪里出了錯),等積累長了,誰也找不到原因了。
3. 編程素養問題
很多問題屬于那種“這樣也行那樣也行”的狀態,比如命名/初始值/縮進/斷行……但是高手的做法總是比新手好一些。
比如bool?result= true; 這句話就有問題,剛初始化就先宣布成功,必有隱患。這是一個真實案例,而下面也的確有一個分支錯誤地返回了這個true(實際案例是個HRESULT)。而發現這個問題,不是測試而是代碼檢查。實際上測試幾乎發現不了這些問題,比如上面那段代碼會在某文件打不開的時候錯誤地返回這個true,而在測試中幾乎不會故事破壞那個文件來測試其結果。
實際使用時,不用拉太長的清單,師傅能想到的看到的告訴徒弟就行。
徒弟不需要學到天上去,只要能學到師傅那么好就可以了。之前在做CMMI咨詢的時候我弄過一些檢查表,推廣均以失敗而告終。那些表都是為了頂級安全性的軟件考慮的,在普通項目里邊使用是個災難。
幾個問題
1. 師傅天天檢查,會不會很累?
檢查不全是為了發現缺陷,而是為了提高成長。如果總是發現重復問題,此徒不可教。好學的徒弟有半年時間就能接近師傅了,考慮到師傅一般比徒弟多工作2年,我們因此讓一個人加速1.5年。
2. 不會餓死師傅嗎?
會,也不會。如果師傅止步不前,即使他不教別人,也遲早被人超越;師傅也是需要學習的。事實是會教徒弟的師傅才會學習,而會學習的師傅才會教徒弟。
3. 師傅跟誰學?
師徒制度是最底層團隊制度(1個師傅+1~3個徒弟左右),其上還有更大的結構和更高的高手。我們之前曾把人員層次設為需指導的(徒弟)/可免于指導的(也是徒弟)/可提供指導的(師傅)/可培訓的(團隊最高級別的高手),最后一級需要定期與大家分享內容。
師傅作為高級技術人員,還享有機會外出培訓/采購圖書等待遇。
師傅自學也很重要,經驗更是不可取代的。前事不忘后事之師,要把自己的經歷和別人的經歷都當作經驗來看待。
4. 師傅努力編好自己的軟件不久已經有很大貢獻了,為何要幫助徒弟?
軟件整體是一個串聯系統,一個環節出了問題整個軟件崩潰(Web軟件好一些)。因此軟件質量取決于最差的部分,而不是最好的部分。
代碼審查的確會占用時間導致最好的部分變差,但卻使最差的地方變得好得多,整體質量因此而得以提高。
從工作層面講,代碼檢查使得代碼的質量尤其是結構質量,整體上保持在師傅可能達到的水平,從而保證了項目的成功。
從學習層面講,代碼檢查使得徒弟可以不斷/漸進地學習,從而花費遠遠低于師傅的時間成本達到更高層次。
心態是其中的關鍵。徒弟不能因此而覺得有一個后盾了可以放任存在問題等師傅發現,要珍惜師傅的時間,也要利用師傅的時間每次都學不同的內容;師傅也不能覺得徒弟學會了對自己是個威脅,威脅時刻都在,不來自于自己的徒弟,也會來自于別人的徒弟,唯有自我提高。
----本文摘自CSDN文章
?
總結
以上是生活随笔為你收集整理的【敏捷开发每日一贴】代码走查的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 深度学习第五课-训练注意事项与框架使用
- 下一篇: [Leetcode][第79题][JAV