【課程背景】
軟件質(zhì)量,不但依賴于架構(gòu),設(shè)計(jì)以及項(xiàng)目管理,而且與代碼質(zhì)量緊密相關(guān).這一點(diǎn),無論你使用什么開發(fā)技術(shù),都不得不承認(rèn). 代碼是程序員溝通直接的手段,代碼是技術(shù)交流的手段,代碼是需求交流的途徑。重視代碼,回歸本源,曾經(jīng)我們遠(yuǎn)離代碼,談架構(gòu)設(shè)計(jì),談UML,談開發(fā)流程。如今我們落地,找回軟件的本源,看清代碼、深入思考代碼。那些研發(fā)中心非常重視代碼,Facebook就有典型的Code wins arguments(代碼贏得爭論)。在Facebook 做 code review時(shí)間大約占50%,管理者對(duì)代碼質(zhì)量負(fù)有一定責(zé)任 。甚至代碼質(zhì)量高于一切:Facebook Code review是KPI考核的對(duì)象,實(shí)行連坐制,如果因?yàn)榇a質(zhì)量問題,那么產(chǎn)生的KPI責(zé)任包括領(lǐng)導(dǎo)30%、程序員50%、審核人員20%。
但是我們的管理者經(jīng)常聽到開發(fā)人員這樣抱怨:“不能再增加功能了!我們得停下來重寫代碼。軟件代碼一團(tuán)糟,就像紙糊的老虎,根本應(yīng)付不了持續(xù)增加的用戶需求。我們實(shí)在維護(hù)不下去了!可以推倒重寫吧”
這一幕在很多公司上演過,現(xiàn)在依然在不斷重演。一旦公司陷入這種困境,以前版本的開發(fā)者往往淪為替罪羊。新的開發(fā)者一般就會(huì)罵前人怎么寫這么爛的代碼。他們準(zhǔn)備推倒重來,準(zhǔn)備重寫系統(tǒng)。在重寫代碼的過程中,用戶無法看到產(chǎn)品的任何改進(jìn)。你可能認(rèn)為重寫代碼至多也就幾個(gè)月,但是實(shí)際花費(fèi)的時(shí)間無一例外要多得多。你只能坐在一旁,眼睜睜看著用戶投奔競爭對(duì)手,而這個(gè)時(shí)候,競爭對(duì)手恰恰在不斷地改進(jìn)產(chǎn)品。
我們研發(fā)中心有一個(gè)理念”代碼是債務(wù)而不是資產(chǎn)”。開始,團(tuán)隊(duì)會(huì)編寫代碼,做出產(chǎn)品,并用它來賺錢,但是,之后團(tuán)隊(duì)?wèi)?yīng)該盡可能地尋找減少代碼的方法和使代碼盡量整潔,從而降低成本。軟件界有一個(gè)真理,你擁有的代碼越多,維護(hù)代碼所要付出的成本就越高。如果你的代碼結(jié)構(gòu)越好,你做了越多的單元測試,你的代碼質(zhì)量越好、越小、耦合越松,那么添加新代碼所需要付出的成本就越少。因此大師 Craig Larman說: “好維護(hù)的代碼就是沒有代碼,好的程序員的代碼產(chǎn)量是負(fù)的,因?yàn)樗ㄟ^減少代碼來增加功能”。對(duì)比現(xiàn)實(shí)中,很多人以為,LOC(line of code)越多的feature越大,寫LOC越多的程序員越牛。這其實(shí)是很錯(cuò)誤的觀念.
因此我們必須有全面的管理制度讓我們保持代碼少而整潔。所以Michael Feathers認(rèn)為"未來屬于知道如何有策略地刪除代碼的公司”。持有代碼的成本要比我們想象的大。意識(shí)到這一點(diǎn)的公司更具有競爭優(yōu)勢。
為了切實(shí)幫助軟件企業(yè)降低企業(yè)項(xiàng)目開發(fā)成本,大面積提高軟件工程師編程能力和代碼質(zhì)量管理能力,我們特別推出實(shí)戰(zhàn)訓(xùn)練營,分享多家大型研發(fā)中心代碼管理經(jīng)驗(yàn)給大家.
該課程適應(yīng)于各個(gè)階段的技術(shù)人員.初級(jí)工程師能夠透過大師的眼睛來看待編程,了解編程的價(jià)值觀和原則;具有豐富經(jīng)驗(yàn)的設(shè)計(jì)師和架構(gòu)師可以通過實(shí)現(xiàn)模式進(jìn)行反思,探究成功實(shí)踐背后的意義.把價(jià)值觀,原則和開發(fā)實(shí)踐結(jié)合;管理者通過學(xué)習(xí)業(yè)界典型研發(fā)中心的管理經(jīng)驗(yàn)和失敗的教訓(xùn),來制定自己公司的代碼管理策略.質(zhì)量管理相關(guān)人員學(xué)習(xí)如何定制代碼質(zhì)量指標(biāo),通過哪些工具進(jìn)行監(jiān)控,怎樣管理代碼質(zhì)量。
【培訓(xùn)特色】
我們已經(jīng)為幾十家企業(yè)提供了多次培訓(xùn)和咨詢服務(wù),以下企業(yè)已經(jīng)選擇了我們的內(nèi)訓(xùn)課程
互聯(lián)網(wǎng)研發(fā)企業(yè),比如百度研發(fā)中心4次 ,阿里巴巴6次, 騰訊 ,暢唐科技, 獵豹移動(dòng)(原金山移動(dòng))
電信研發(fā)企業(yè),比如思科研發(fā)中心5次,阿爾卡特-朗訊研發(fā)中心,華為研發(fā)中心13次,摩托羅拉研發(fā)中心 1次,大唐電信研發(fā) 1次,廣州從興電子,億陽通信 1次, 愛立信研發(fā)中心8次,鼎橋通信技術(shù)5次, 艾默生深圳研發(fā)中心 4次, 中興通信, 中興軟創(chuàng)
廣電行業(yè):廣州誠毅科技研發(fā)中心,
企業(yè)軟件研發(fā)企業(yè),比如Adobe中國研發(fā)中心,北京久其研發(fā)中心,博古中國研發(fā)中心,金蝶深圳研發(fā)中心, EMC中國研發(fā)中心(北京和上海), VMware(北京與上海研發(fā)中心), Intel中國研發(fā)中心(上海), AutoDesk上海研發(fā)中心
嵌入式軟件企業(yè),比如阿爾卑斯中國研發(fā)中心,德國M&M Software,西門子研發(fā)中心, Sony研發(fā)中心,金立智能研究院,南車研發(fā)中心,德塞西威,霍尼韋爾研發(fā)中心, 東芝中國研發(fā)中心, 匯川科技,
外包類企業(yè),聯(lián)盟計(jì)算機(jī)服務(wù)(天津)有限公司ACS 3次。
金融行業(yè):恒生電子,華騰,中國人民銀行研發(fā)中心,工商行研發(fā)中心,平安科技研發(fā)中心,建行研發(fā)中心,深圳登記結(jié)算研發(fā)中心,花旗銀行中國研發(fā)中心
我們已經(jīng)為幾十期公開課,已經(jīng)有100多家企業(yè)已經(jīng)選擇了我們的公開課程
騰訊(深圳)有限公司, EMC中國研發(fā)中心,華為終端有限公司、 斯倫貝謝技術(shù),通用電氣醫(yī)療系統(tǒng)(中國)有限公司,華為技術(shù)有限公司,廣州從興電子開發(fā)有限公司、福建星網(wǎng)銳捷股份有限公司,廣州菲特網(wǎng)絡(luò)科技有限公司,盛立金融(杭州)軟件公司 ,索尼中國研發(fā)中心, 愛德萬,上海金慧軟件有限公司,珠海世紀(jì)鼎利通信科技股份,蘭吉爾儀表系統(tǒng)有限公司,珠海飛企軟件有限公司,廣東佳和通信技術(shù)有限公司,珠海一多監(jiān)測科技有限公司,遠(yuǎn)光軟件股份有限公司
【目標(biāo)收益】
課程根據(jù)編程大師的理論:
編程是一種態(tài)度,編程是一種技藝,編程是一種習(xí)慣。
面向以下不同的人群,有不同收獲。
角色 |
收獲 |
技術(shù)負(fù)責(zé)人/技術(shù)總監(jiān) |
了解業(yè)內(nèi)代碼審查的形式、技術(shù)、技巧和流程的成功經(jīng)驗(yàn),優(yōu)化現(xiàn)有開發(fā)中心代碼審核方法; 掌握業(yè)內(nèi)成熟的自動(dòng)化審核審查工具及方法,提升開發(fā)人員在代碼結(jié)構(gòu)分析、代碼質(zhì)量度量、代碼覆蓋率分析等方面的能力,并有效運(yùn)用到項(xiàng)目研發(fā)工作中。 |
項(xiàng)目經(jīng)理/項(xiàng)目管理人員/架構(gòu)師/ |
學(xué)習(xí)其他研發(fā)機(jī)構(gòu)的代碼管理思想 代碼管理手段 代碼管理相關(guān)流程和相關(guān)工具 代碼監(jiān)控 |
測試部門/質(zhì)量管理部門 |
代碼審查 代碼檢查列表 代碼管理手段 代碼管理制度的建立 |
經(jīng)驗(yàn)豐富的開發(fā)人員 |
掌握代碼編碼規(guī)范、代碼評(píng)審要點(diǎn)等知識(shí),引導(dǎo)開發(fā)人員養(yǎng)成正確的代碼編寫習(xí)慣; 編程技藝和相關(guān)編程實(shí)踐 重構(gòu)手段 |
一般開發(fā)人員 |
編程技藝和相關(guān)編程實(shí)踐 重構(gòu)手段 代碼壞味道 |
【培訓(xùn)對(duì)象】
各類軟件企業(yè)和研發(fā)中心的程序員、軟件設(shè)計(jì)師、架構(gòu)師, 項(xiàng)目經(jīng)理,質(zhì)量部門員工。
如果你不重視代碼質(zhì)量, 請(qǐng)不要參加. 本課程面向重視代碼質(zhì)量的管理者.?
如果你不認(rèn)為寫好代碼是一件重要,困難并且有趣的事情,請(qǐng)你不要參加. 本課程面向追求卓越的程序員,我們認(rèn)為編程是一種態(tài)度.
如果你已經(jīng)多年不寫代碼,建議不要參加,本課程面向一線還在編程的程序員/設(shè)計(jì)師/架構(gòu)師
【培訓(xùn)時(shí)長】
5天
【課程大綱】
第一篇: 編程是一種態(tài)度-------價(jià)值觀 |
||
主題 |
培訓(xùn)內(nèi)容 |
備注 |
第1單元 代碼就是債務(wù) |
內(nèi)容一:代碼是債務(wù) 1. 代碼的認(rèn)識(shí)---代碼就是債務(wù) 2. 代碼是債務(wù),越少越好 3. 你擁有的代碼越多,添加新內(nèi)容所要付出的成本就越高 4. 通過案例分析讓代碼庫盡可能小的方法: 5. 通過國際研發(fā)中心電信計(jì)費(fèi)系統(tǒng)演示代碼是債務(wù)的思想,10多年國外研發(fā)團(tuán)隊(duì)設(shè)計(jì)與研發(fā)第一版本,幾百人在維護(hù) 通過項(xiàng)目演示通過重構(gòu)如何減少了一半的代碼,維護(hù)的人員的減少
項(xiàng)目的失敗可能歸咎于各種各樣的原因。一些項(xiàng)目因糟糕的需求而失敗,另一些則由于錢和時(shí)間超支了,還有少數(shù)單純是因?yàn)樵愀獾墓芾硭?。如果我們探究其根本原因,是否?huì)發(fā)現(xiàn)所有項(xiàng)目失敗的罪魁禍?zhǔn)资窃愀獾拇a呢?
Bob大叔堅(jiān)信糟糕的代碼所帶來的成本之大足夠讓一個(gè)項(xiàng)目失敗。
內(nèi)容二 軟件界要以新視角看待代碼 1. 傳統(tǒng)的軟件工程對(duì)代碼的錯(cuò)誤認(rèn)識(shí) 2. 代碼的兩面性,代碼的靜態(tài)結(jié)構(gòu)和運(yùn)行時(shí)行為 3. 客戶和管理者往往僅僅關(guān)注代碼的運(yùn)行時(shí)的行為 4. 溫伯格認(rèn)為的主管必須關(guān)注代碼 5. 軟件設(shè)計(jì)與代碼的關(guān)系—真正好的設(shè)計(jì)是在編碼階段一步一步而形成的,通過案例分析,設(shè)計(jì)如何根據(jù)代碼進(jìn)行演化 6. 編程真的是簡單的勞動(dòng)嗎? 7. 通過多家項(xiàng)目案例進(jìn)行分析,傳統(tǒng)思想對(duì)代碼的種種誤解,我們提出了從3種新的角度來觀察代碼, a) 從管理者的角度,我們僅僅觀察代碼的運(yùn)行時(shí)行為,導(dǎo)致代碼的靜態(tài)結(jié)構(gòu)混亂的源頭。這就是代碼的冰山原理,大量垃圾代碼隱藏在冰山之下。 b) 設(shè)計(jì)師的角度認(rèn)為只要有好的設(shè)計(jì),軟件質(zhì)量就可以保證。其實(shí)我們認(rèn)為代碼是真正可以精確描述的設(shè)計(jì)文檔。 c) 程序員的視角,編程真的很難,通過某一個(gè)項(xiàng)目案例分析,20多人一周的工作量就為幾行代碼問題
|
|
第2單元編程價(jià)值觀 |
內(nèi)容一:編程價(jià)值觀 1. 編程的方法學(xué) 2. 什么是好的代碼,我們卻認(rèn)為“Good code is not bad code !” 3. 編程價(jià)值觀---溝通,簡單,靈活 4. 價(jià)值觀決定行為 5. 優(yōu)秀代碼的評(píng)價(jià)標(biāo)準(zhǔn), 什么是高質(zhì)量編碼? 特征是什么? 6. 軟件代碼的可讀性 7. 代碼的可擴(kuò)展性 8. 糟糕代碼的特征 9. 劣質(zhì)代碼的代價(jià) 10. 大師評(píng)價(jià)整潔代碼的標(biāo)準(zhǔn) 11. 通過大量項(xiàng)目案例分析,什么是好的代碼,對(duì)好代碼新的認(rèn)識(shí) |
|
第二篇: 編程是一種技藝-------實(shí)踐篇 |
||
第3單元 高質(zhì)量函數(shù)(該內(nèi)容較多,根據(jù)實(shí)際情況調(diào)整) |
內(nèi)容一:高質(zhì)量函數(shù)/過程 1. 為什么需要函數(shù) 2. 函數(shù)復(fù)雜度度量 3. 函數(shù)圈復(fù)雜度以及度量 4. 函數(shù)抽象層次-單一抽象層次原則SLAP(Single Level of Abstrction Principle) 5. 函數(shù)實(shí)現(xiàn)模式之—組合函數(shù)(Composed Method) 6. 萬惡之源—函數(shù)過長 7. 函數(shù)的單一職責(zé) 8. 函數(shù)第一原則:是要短小,函數(shù)第二原則:是還要短小,函數(shù)第三原則:是必須短小 9. 函數(shù)重構(gòu)之道—抽取方法(Extract Method)和抽取對(duì)象函數(shù) 10. 函數(shù)命名—怎樣取好的函數(shù)名 11. 通過大量項(xiàng)目代碼分析,函數(shù)的遇到的各種問題,如何編程高質(zhì)量函數(shù)
內(nèi)容二:函數(shù)易理解與溝通 1. 函數(shù)主體流 2. 函數(shù)的異常處理 3. 函數(shù)主題流程簡化方法1-助手方法 4. 助手方法的應(yīng)用場景 5. 助手方法的效果 6. 函數(shù)主題流程簡化方法2-函數(shù)對(duì)象(MethodObject) 7. 通過真實(shí)項(xiàng)目代碼進(jìn)行分析,如果提高代碼的可讀性
內(nèi)容三:函數(shù)靈活/易可擴(kuò)展---函數(shù)接縫 1. 歷史遺留代碼維護(hù)問題 2. 某電信研發(fā)中心的維護(hù)問題—開發(fā)維護(hù)的效率問題。 3. 增加一個(gè)功能特性的成本并不單單是為這些功能編碼所花費(fèi)時(shí)間的成本,還應(yīng)該包括特性擴(kuò)展的障礙成本。 4. 代碼的可維護(hù)成本分析—通過大量案例分析 a) 確定需要修改哪些部分有多難 b) 必要的改動(dòng)有多少 c) 實(shí)現(xiàn)改動(dòng)對(duì)系統(tǒng)其他部分的影響有多大 5. 如何實(shí)現(xiàn)代碼的易擴(kuò)展—函數(shù)接縫 6. 接縫(seam),指程序中的一些特殊的點(diǎn),在這些點(diǎn)上你無需做任何修改就可以達(dá)到改動(dòng)程序行為的目的 7. 通過案例分析,如何實(shí)現(xiàn)函數(shù)的靈活/易擴(kuò)展。
內(nèi)容四:函數(shù)參數(shù) 1. 函數(shù)參數(shù)過長 2. 最理想的參數(shù)數(shù)量是零,其次是一,再次是二,有足夠的理由才能使用三個(gè)以上參數(shù). 3. 函數(shù)參數(shù)重構(gòu)之道-引入?yún)?shù)對(duì)象(introduce parameter object 4. 函數(shù)參數(shù)的順序. 5. 不要把程序參數(shù)當(dāng)做工作變量/臨時(shí)變量 6. 函數(shù)參數(shù)模式-collecting parameter 7. 函數(shù)返回值 8. 通過大量項(xiàng)目代碼是函數(shù)參數(shù)問題 9. 演示函參數(shù)的重構(gòu)
內(nèi)容五:變量 1. “一旦了解在程序設(shè)計(jì)中如何使用變量,他就掌握了程序設(shè)計(jì)的精華?!?span>-Dijkstra 2. 為什么需要變量—變量的引入的理由 3. 單一變量用途 4. 變量與方法 5. 變量作用域 6. 變量聲明與初始化 7. 通過案例分析, 函數(shù)的變量如何處理與控制。
內(nèi)容六:函數(shù)代碼重復(fù) 1. 重復(fù)的危害 2. 強(qiáng)加的重復(fù)/無意的重復(fù)/無耐心的重復(fù)/開發(fā)者之間的重復(fù) 3. 不要重復(fù)自己DRY—Don't Repeat Yourself Principle 4. Make It Easy to Reuse(讓復(fù)用變得容易) 5. 魔法數(shù)(Magic number) 6. 重復(fù)性代碼(Duplicated Code) 7. 接口不同的相似類(Alternative Classes with Different Interfaces) 8. 系統(tǒng)分離關(guān)注點(diǎn) 9. 系統(tǒng)架構(gòu)的基礎(chǔ)通用服務(wù)組件 10. 通過某項(xiàng)目代碼是介紹重復(fù)編碼問題 11. 演示研發(fā)過程之中的常見重復(fù)問題,以及如何解決
內(nèi)容七:條件表達(dá)式 1. 復(fù)雜表達(dá)式的簡化 2. IF/ELSE語句應(yīng)該如何編寫 3. Switch/Case語句應(yīng)該如何編寫 4. 復(fù)雜條件表示式的危害 5. 過分深層的縮進(jìn),或者“嵌套”,已經(jīng)困擾了計(jì)算機(jī)界達(dá)25年之久,并且至今仍然是產(chǎn)生混亂代碼的罪魁禍?zhǔn)字?/span> 6. 復(fù)雜表達(dá)式重構(gòu)之道—引入解釋變量/分解條件/抽取方法計(jì)算條件 7. 表驅(qū)動(dòng)法-多級(jí)嵌套IF語句的必然之道 8. 表驅(qū)動(dòng)法使用總則 9. 某保險(xiǎn)項(xiàng)目表驅(qū)動(dòng)法應(yīng)用案例分析 10. 通過大量項(xiàng)目代碼演示條件表達(dá)式編碼問題 11. 復(fù)雜表達(dá)式的注意事項(xiàng),如何解決
內(nèi)容八:利用多態(tài)解決復(fù)雜表達(dá)式 1. 面向?qū)ο蠖鄳B(tài)技術(shù)的新認(rèn)識(shí) 2. 減少使用if語句,重構(gòu)到多態(tài) 3. 以State/Strategy取代類型代碼 4. 引入Null Object 5. 以Command替換條件調(diào)度程序 6. 轉(zhuǎn)移聚集操作到Visitor 7. 轉(zhuǎn)移裝飾功能到Decorator 8. 通過大量項(xiàng)目代碼演示多態(tài)可以解決的編程問題
內(nèi)容九:函數(shù)組織 1. 盡管組織直線代碼是一個(gè)相當(dāng)簡單的任務(wù),代碼結(jié)構(gòu)上的不合理會(huì)對(duì)代碼的質(zhì)量,正確性,可讀性和可維護(hù)性帶來影響。 2. 把函數(shù)代碼分成“段落” 3. 選擇一個(gè)有意義的順序,始終一致的使用它 4. |