課程簡(jiǎn)介
一個(gè)人不可能在地面上學(xué)會(huì)游泳!本課程采用完全現(xiàn)場(chǎng)實(shí)戰(zhàn)的方式,幫助團(tuán)隊(duì)快速體驗(yàn)和學(xué)會(huì)高級(jí)面向?qū)ο蠹夹g(shù),編寫(xiě)出高質(zhì)量、易維護(hù)的代碼。
?學(xué)員分為若干小組(最好是實(shí)際工作組),每個(gè)小組都有2~3個(gè)核心參訓(xùn)人員人
?核心參訓(xùn)人員提供總計(jì)3000回車(chē)行實(shí)際工作代碼
?對(duì)其中1000行代碼,講師會(huì)在課上現(xiàn)場(chǎng)講解并改寫(xiě)(改寫(xiě)量一般在300~500行左右)
?改寫(xiě)完成后達(dá)到極高的標(biāo)準(zhǔn),包括:
?零常數(shù),零for(int i),零else/case(代碼中沒(méi)有任何else和case關(guān)鍵字)、每個(gè)函數(shù)均小于30回車(chē)行
?編碼有效率在13~15LOC/FP左右(世界紀(jì)錄級(jí)別)
?另外每組準(zhǔn)備2000行較差代碼作為課堂練習(xí)
注意:本課程不涉及性能優(yōu)化、安全性、多線程等特殊技術(shù)。
目標(biāo)收益
培訓(xùn)對(duì)象
技術(shù)經(jīng)理,開(kāi)發(fā)骨干,資質(zhì)高的新員工,重點(diǎn)產(chǎn)品、新產(chǎn)品、重構(gòu)團(tuán)隊(duì)的全體開(kāi)發(fā)人員
課程大綱
微觀編碼 |
?初級(jí)篇 ?此階段注重語(yǔ)句級(jí)別的編程技能,基本上不需要面向?qū)ο蠡A(chǔ) ?講師現(xiàn)場(chǎng)對(duì)某個(gè)團(tuán)隊(duì)的代表性產(chǎn)品進(jìn)行代碼審查重點(diǎn)包括: ?變量命名 ?函數(shù)命名 ?全局變量處理 ?消除常數(shù) ?冗余語(yǔ)句的處理 ?FFT結(jié)構(gòu)(false-false-true) ?foreach循環(huán) ?var/auto關(guān)鍵字 所有團(tuán)隊(duì)現(xiàn)場(chǎng)對(duì)剩余代碼進(jìn)行重構(gòu),講師點(diǎn)評(píng) |
中級(jí)篇 |
?此階段注重函數(shù)級(jí)別的編程技能,需要函數(shù)封裝、模板(泛型)等知識(shí) ?講師現(xiàn)場(chǎng)對(duì)某個(gè)團(tuán)隊(duì)的代碼進(jìn)行走讀,指出以下問(wèn)題: ?代碼克隆 ?如何消除結(jié)構(gòu)相同、類(lèi)型不同的if-else或case ?模板 ?Map ?三元表達(dá)式 ?所有團(tuán)隊(duì)現(xiàn)場(chǎng)對(duì)剩余代碼進(jìn)行重構(gòu),講師點(diǎn)評(píng) |
宏觀編碼 |
?CCI代碼混沌指數(shù) ?CCI是4個(gè)數(shù)據(jù)的平均值:超長(zhǎng)類(lèi)占比(>250邏輯行),超長(zhǎng)方法占比(>30回車(chē)行),不良分支密度((else+case+default)/邏輯行),不良常數(shù)密度(數(shù)字或字符常量/邏輯行)。 ?CCI與測(cè)試缺陷密度有0.78~0.80的相關(guān)系數(shù),與生產(chǎn)率有-0.52~-0.75的相關(guān)系數(shù),對(duì)提升生產(chǎn)率和質(zhì)量具有顯著意義。 ?據(jù)對(duì)30多個(gè)代碼樣本的研究(約500個(gè)文件),CCI工具與人類(lèi)高手的主觀評(píng)價(jià)幾乎完全相同。 ?CCI可由工具自動(dòng)掃描獲得,不受人數(shù)、代碼數(shù)量的限制(約10萬(wàn)行/秒),可用于對(duì)組織級(jí)、大規(guī)模、長(zhǎng)周期代碼的整體度量與控制。 ?CCI實(shí)戰(zhàn) ?使用CCI對(duì)現(xiàn)場(chǎng)代碼進(jìn)行掃描 ?掃描結(jié)果判讀 ?高級(jí)篇(基于CCI結(jié)果) ?此階段注重封裝、繼承、多態(tài)等傳統(tǒng)面向?qū)ο蟮闹R(shí) ?初級(jí)概念講解 ?代碼克隆 ?圈復(fù)雜度與圈復(fù)雜密度 ?講師現(xiàn)場(chǎng)對(duì)某個(gè)團(tuán)隊(duì)的代碼進(jìn)行走讀,修改代碼以降低CCI數(shù)值(越低越好) ?消除超長(zhǎng)類(lèi) ?消除超長(zhǎng)方法 ?消除結(jié)構(gòu)大為不同的大段if-else或case ?基類(lèi),虛函數(shù) ?多態(tài)與虛函數(shù) ?接口與多繼承 ?基類(lèi)vs接口:擴(kuò)展與實(shí)現(xiàn) ?消除常數(shù) ?封閉與非封閉取之空間的常數(shù) ?所有團(tuán)隊(duì)現(xiàn)場(chǎng)對(duì)剩余代碼進(jìn)行重構(gòu),講師點(diǎn)評(píng) ?質(zhì)量篇 ?此階段注重防范開(kāi)發(fā)中、維護(hù)中可能產(chǎn)生的編碼質(zhì)量問(wèn)題 ?注:實(shí)際上此章節(jié)所述內(nèi)容,均會(huì)在上述課程中遇到問(wèn)題時(shí)隨時(shí)提到,此處僅做總結(jié) ?講師現(xiàn)場(chǎng)對(duì)某個(gè)團(tuán)隊(duì)的代碼進(jìn)行走讀,指出以下問(wèn)題: ?易讀性問(wèn)題 ?看似技術(shù)含量很高的“半截子科技”代碼 ?可維護(hù)性問(wèn)題 ?成對(duì)出現(xiàn)的編碼 ?常數(shù)封裝位置 ?多分支結(jié)構(gòu)的處理 ?If-else與case的8種消除方法比較 ?常見(jiàn)缺陷預(yù)防 ?空指針 ?數(shù)組越界 ?所有團(tuán)隊(duì)現(xiàn)場(chǎng)對(duì)剩余代碼進(jìn)行重構(gòu),講師點(diǎn)評(píng) |
設(shè)計(jì)模式 |
?設(shè)計(jì)模式解讀 ?由于設(shè)計(jì)模式種類(lèi)繁多,此內(nèi)容不固定,而是以根據(jù)兩件事情進(jìn)行選擇性演示 ?代碼中存在的問(wèn)題類(lèi)型 ?對(duì)代碼重構(gòu)可能用到的模式 ?預(yù)計(jì)會(huì)演示23種中的約10種典型的設(shè)計(jì)模式 ?心法篇 ?此階段注重實(shí)際開(kāi)發(fā)動(dòng)態(tài)過(guò)程中,人們由于編碼次序的差異而造成的思維差異,進(jìn)而導(dǎo)致的編碼質(zhì)量差異;解決了明明懂設(shè)計(jì)模式但卻想不到要用的問(wèn)題 ?講師現(xiàn)場(chǎng)對(duì)某個(gè)團(tuán)隊(duì)的一部分代碼進(jìn)行重寫(xiě),并展示以下編程心法: ?從外向內(nèi)分解問(wèn)題出 ?先編寫(xiě)調(diào)用者,后編寫(xiě)底層函數(shù)(準(zhǔn)TDD開(kāi)發(fā)) ?每5~10分鐘進(jìn)行一次編譯和測(cè)試(TDDB,Test Driven De-Bug測(cè)試驅(qū)動(dòng)的調(diào)試) ?隨時(shí)將問(wèn)題控制在最近2~5行代碼內(nèi) ?內(nèi)建的質(zhì)量 ?隨時(shí)避免各種不良編程問(wèn)題,而不是編寫(xiě)后再進(jìn)行重構(gòu) ?一次性寫(xiě)成“上帝代碼” ?“上帝代碼”是在語(yǔ)言框架內(nèi),多一行則多,少一行則少,無(wú)意中刪除或添加任何一個(gè)字符將會(huì)出現(xiàn)編譯錯(cuò)誤的代碼 ?首次編寫(xiě)即不包括“陳舊語(yǔ)法” ?在第一次編寫(xiě)代碼時(shí),按照特有的心法和順序,從來(lái)不需要if-else if/switch case等語(yǔ)法,也不會(huì)想到它們 ?重構(gòu) ?重構(gòu)時(shí)機(jī) ?重構(gòu)控制 ?通過(guò)度量CCI和CCR防止重蹈覆轍 ?CCR編碼消耗率是每功能點(diǎn)(Function Point)需要的代碼行數(shù),其數(shù)值大致=邏輯代碼行數(shù)/(api數(shù)*5.4),業(yè)界Java中值為27。由于多數(shù)被重構(gòu)的舊產(chǎn)品都有100~300以上的CCR數(shù)值,通過(guò)每個(gè)迭代持續(xù)度量和控制重構(gòu)代碼的CCR數(shù)值,可以防止重蹈覆轍。 ?高級(jí)話題 ?單元測(cè)試覆蓋率的提升 ?代碼行覆蓋率 ?分支覆蓋率 ?通過(guò)減少分支來(lái)提升分支覆蓋率 ?超越語(yǔ)言的語(yǔ)法邊界 ?C,C++,C#,Java,Python語(yǔ)法進(jìn)化對(duì)比 通過(guò)5種語(yǔ)言實(shí)現(xiàn)同一個(gè)功能的對(duì)比,觀察人類(lèi)語(yǔ)言向編碼終極奧義的逼近過(guò)程 |
微觀編碼 ?初級(jí)篇 ?此階段注重語(yǔ)句級(jí)別的編程技能,基本上不需要面向?qū)ο蠡A(chǔ) ?講師現(xiàn)場(chǎng)對(duì)某個(gè)團(tuán)隊(duì)的代表性產(chǎn)品進(jìn)行代碼審查重點(diǎn)包括: ?變量命名 ?函數(shù)命名 ?全局變量處理 ?消除常數(shù) ?冗余語(yǔ)句的處理 ?FFT結(jié)構(gòu)(false-false-true) ?foreach循環(huán) ?var/auto關(guān)鍵字 所有團(tuán)隊(duì)現(xiàn)場(chǎng)對(duì)剩余代碼進(jìn)行重構(gòu),講師點(diǎn)評(píng) |
中級(jí)篇 ?此階段注重函數(shù)級(jí)別的編程技能,需要函數(shù)封裝、模板(泛型)等知識(shí) ?講師現(xiàn)場(chǎng)對(duì)某個(gè)團(tuán)隊(duì)的代碼進(jìn)行走讀,指出以下問(wèn)題: ?代碼克隆 ?如何消除結(jié)構(gòu)相同、類(lèi)型不同的if-else或case ?模板 ?Map ?三元表達(dá)式 ?所有團(tuán)隊(duì)現(xiàn)場(chǎng)對(duì)剩余代碼進(jìn)行重構(gòu),講師點(diǎn)評(píng) |
宏觀編碼 ?CCI代碼混沌指數(shù) ?CCI是4個(gè)數(shù)據(jù)的平均值:超長(zhǎng)類(lèi)占比(>250邏輯行),超長(zhǎng)方法占比(>30回車(chē)行),不良分支密度((else+case+default)/邏輯行),不良常數(shù)密度(數(shù)字或字符常量/邏輯行)。 ?CCI與測(cè)試缺陷密度有0.78~0.80的相關(guān)系數(shù),與生產(chǎn)率有-0.52~-0.75的相關(guān)系數(shù),對(duì)提升生產(chǎn)率和質(zhì)量具有顯著意義。 ?據(jù)對(duì)30多個(gè)代碼樣本的研究(約500個(gè)文件),CCI工具與人類(lèi)高手的主觀評(píng)價(jià)幾乎完全相同。 ?CCI可由工具自動(dòng)掃描獲得,不受人數(shù)、代碼數(shù)量的限制(約10萬(wàn)行/秒),可用于對(duì)組織級(jí)、大規(guī)模、長(zhǎng)周期代碼的整體度量與控制。 ?CCI實(shí)戰(zhàn) ?使用CCI對(duì)現(xiàn)場(chǎng)代碼進(jìn)行掃描 ?掃描結(jié)果判讀 ?高級(jí)篇(基于CCI結(jié)果) ?此階段注重封裝、繼承、多態(tài)等傳統(tǒng)面向?qū)ο蟮闹R(shí) ?初級(jí)概念講解 ?代碼克隆 ?圈復(fù)雜度與圈復(fù)雜密度 ?講師現(xiàn)場(chǎng)對(duì)某個(gè)團(tuán)隊(duì)的代碼進(jìn)行走讀,修改代碼以降低CCI數(shù)值(越低越好) ?消除超長(zhǎng)類(lèi) ?消除超長(zhǎng)方法 ?消除結(jié)構(gòu)大為不同的大段if-else或case ?基類(lèi),虛函數(shù) ?多態(tài)與虛函數(shù) ?接口與多繼承 ?基類(lèi)vs接口:擴(kuò)展與實(shí)現(xiàn) ?消除常數(shù) ?封閉與非封閉取之空間的常數(shù) ?所有團(tuán)隊(duì)現(xiàn)場(chǎng)對(duì)剩余代碼進(jìn)行重構(gòu),講師點(diǎn)評(píng) ?質(zhì)量篇 ?此階段注重防范開(kāi)發(fā)中、維護(hù)中可能產(chǎn)生的編碼質(zhì)量問(wèn)題 ?注:實(shí)際上此章節(jié)所述內(nèi)容,均會(huì)在上述課程中遇到問(wèn)題時(shí)隨時(shí)提到,此處僅做總結(jié) ?講師現(xiàn)場(chǎng)對(duì)某個(gè)團(tuán)隊(duì)的代碼進(jìn)行走讀,指出以下問(wèn)題: ?易讀性問(wèn)題 ?看似技術(shù)含量很高的“半截子科技”代碼 ?可維護(hù)性問(wèn)題 ?成對(duì)出現(xiàn)的編碼 ?常數(shù)封裝位置 ?多分支結(jié)構(gòu)的處理 ?If-else與case的8種消除方法比較 ?常見(jiàn)缺陷預(yù)防 ?空指針 ?數(shù)組越界 ?所有團(tuán)隊(duì)現(xiàn)場(chǎng)對(duì)剩余代碼進(jìn)行重構(gòu),講師點(diǎn)評(píng) |
設(shè)計(jì)模式 ?設(shè)計(jì)模式解讀 ?由于設(shè)計(jì)模式種類(lèi)繁多,此內(nèi)容不固定,而是以根據(jù)兩件事情進(jìn)行選擇性演示 ?代碼中存在的問(wèn)題類(lèi)型 ?對(duì)代碼重構(gòu)可能用到的模式 ?預(yù)計(jì)會(huì)演示23種中的約10種典型的設(shè)計(jì)模式 ?心法篇 ?此階段注重實(shí)際開(kāi)發(fā)動(dòng)態(tài)過(guò)程中,人們由于編碼次序的差異而造成的思維差異,進(jìn)而導(dǎo)致的編碼質(zhì)量差異;解決了明明懂設(shè)計(jì)模式但卻想不到要用的問(wèn)題 ?講師現(xiàn)場(chǎng)對(duì)某個(gè)團(tuán)隊(duì)的一部分代碼進(jìn)行重寫(xiě),并展示以下編程心法: ?從外向內(nèi)分解問(wèn)題出 ?先編寫(xiě)調(diào)用者,后編寫(xiě)底層函數(shù)(準(zhǔn)TDD開(kāi)發(fā)) ?每5~10分鐘進(jìn)行一次編譯和測(cè)試(TDDB,Test Driven De-Bug測(cè)試驅(qū)動(dòng)的調(diào)試) ?隨時(shí)將問(wèn)題控制在最近2~5行代碼內(nèi) ?內(nèi)建的質(zhì)量 ?隨時(shí)避免各種不良編程問(wèn)題,而不是編寫(xiě)后再進(jìn)行重構(gòu) ?一次性寫(xiě)成“上帝代碼” ?“上帝代碼”是在語(yǔ)言框架內(nèi),多一行則多,少一行則少,無(wú)意中刪除或添加任何一個(gè)字符將會(huì)出現(xiàn)編譯錯(cuò)誤的代碼 ?首次編寫(xiě)即不包括“陳舊語(yǔ)法” ?在第一次編寫(xiě)代碼時(shí),按照特有的心法和順序,從來(lái)不需要if-else if/switch case等語(yǔ)法,也不會(huì)想到它們 ?重構(gòu) ?重構(gòu)時(shí)機(jī) ?重構(gòu)控制 ?通過(guò)度量CCI和CCR防止重蹈覆轍 ?CCR編碼消耗率是每功能點(diǎn)(Function Point)需要的代碼行數(shù),其數(shù)值大致=邏輯代碼行數(shù)/(api數(shù)*5.4),業(yè)界Java中值為27。由于多數(shù)被重構(gòu)的舊產(chǎn)品都有100~300以上的CCR數(shù)值,通過(guò)每個(gè)迭代持續(xù)度量和控制重構(gòu)代碼的CCR數(shù)值,可以防止重蹈覆轍。 ?高級(jí)話題 ?單元測(cè)試覆蓋率的提升 ?代碼行覆蓋率 ?分支覆蓋率 ?通過(guò)減少分支來(lái)提升分支覆蓋率 ?超越語(yǔ)言的語(yǔ)法邊界 ?C,C++,C#,Java,Python語(yǔ)法進(jìn)化對(duì)比 通過(guò)5種語(yǔ)言實(shí)現(xiàn)同一個(gè)功能的對(duì)比,觀察人類(lèi)語(yǔ)言向編碼終極奧義的逼近過(guò)程 |