我是代碼極簡(jiǎn)主義者。
1:寫代碼禽炬,能夠用簡(jiǎn)單語句寫的涧卵,絕對(duì)不用復(fù)雜語句。
簡(jiǎn)單語句腹尖,不管什么水平的人都能閱讀柳恐,在讀代碼的過程中,會(huì)很順暢热幔。而復(fù)雜語句乐设,水平不夠的人,不一定能看懂绎巨。試想一個(gè)場(chǎng)景近尚,項(xiàng)目時(shí)間很緊,我今天要把這段代碼看懂场勤,然后爭(zhēng)取把這個(gè)bug解決掉戈锻。可是突然來了這么一個(gè)復(fù)雜語句和媳,以前都沒有見過格遭,都不知道是什么意思?你說討厭不討厭?為了弄懂它,我得擺渡一下留瞳,擺渡如果沒有結(jié)果拒迅,那谷還得谷歌一下,如果還是看不太懂她倘。那沒辦法了璧微,問一下大牛吧。抬頭一看帝牡,大牛都下班了往毡。于是今天要把這個(gè)bug解決的希望徹底破滅,你說鬧心不鬧心靶溜,多耽誤時(shí)間?
所以懒震,我從不用復(fù)雜語句罩息。你可以說我水平不夠,也可以說我沒見過世面个扰,無所謂瓷炮。只要功能實(shí)現(xiàn)了就好,只要代碼容易維護(hù)就好递宅,其他的我不care娘香。
你也可能會(huì)說苍狰,寫這種復(fù)雜的代碼,執(zhí)行效率高烘绽。但是淋昭,我覺得,以犧牲代碼的易讀性和易維護(hù)性來得到這一點(diǎn)點(diǎn)的性能安接,不太值得翔忽。而且現(xiàn)在的硬件性能都很高,這點(diǎn)性能提升根本就是杯水車薪盏檐。寫這種復(fù)雜代碼歇式,我覺得一般都是酸腐程序員的個(gè)人技能秀,沒有多大的實(shí)用意義胡野。
有人說材失,一個(gè)手機(jī),80%的功能是沒有用的硫豆,我覺得龙巨,一門語言,也有很多語法是沒用的够庙,我們沒必要一定要用它們恭应。
2:我從不愿意保留無用的代碼。
記得有一次耘眨,我們公司的項(xiàng)目上線運(yùn)行的時(shí)候出了個(gè)大bug昼榛。同一時(shí)間點(diǎn)所有業(yè)務(wù)進(jìn)程集體重啟了。業(yè)務(wù)團(tuán)隊(duì)查了很久剔难,都沒有查出原因胆屿,因?yàn)闆]有發(fā)現(xiàn)任何異常的日志文件。然后就把我叫過去偶宫。說他們發(fā)現(xiàn)這些集體重啟的業(yè)務(wù)進(jìn)程有一個(gè)共同特點(diǎn)非迹,就是都包了我提供的一個(gè)庫(kù),所以他們懷疑是不是我這個(gè)庫(kù)的問題纯趋,希望我查一下這個(gè)庫(kù)憎兽。
因?yàn)闆]有經(jīng)歷過,所以我理所當(dāng)然地認(rèn)為吵冒,這次集體重啟事情跟我的庫(kù)應(yīng)該沒什么關(guān)系纯命。就算是我的庫(kù)有問題,那也只可能影響單個(gè)的業(yè)務(wù)進(jìn)程痹栖,而不可能同時(shí)影響其他的業(yè)務(wù)進(jìn)程亿汞。因?yàn)檫@個(gè)庫(kù)之前不是我做的,我也是剛接手過來沒多久揪阿,正在整理代碼疗我。所以回來后咆畏,雖然我不太相信是我的庫(kù)的問題,但還是把代碼仔細(xì)走讀了一遍吴裤。這不走讀不要緊旧找,一走讀才發(fā)現(xiàn)還真的是我這個(gè)庫(kù)代碼的問題。
事情是這樣的嚼摩,這個(gè)庫(kù)代碼是從以前老的庫(kù)代碼修改過來的钦讳。老的庫(kù)代碼里面有一段邏輯,如果這個(gè)庫(kù)連接服務(wù)器失敗枕面,那么就會(huì)開啟一個(gè)72小時(shí)的定時(shí)器愿卒,如果72小時(shí)還沒有重連成功,那么庫(kù)就會(huì)自殺潮秘,使用的自殺手段是kill -9 進(jìn)程pid琼开。如果72小時(shí)內(nèi)重連成功,那么就會(huì)把定時(shí)器停掉枕荞。
新的庫(kù)代碼不需要這個(gè)邏輯柜候,但是相關(guān)的代碼并沒有完全刪除。重連成功的時(shí)候躏精,停止定時(shí)器的代碼被刪除了渣刷,但是網(wǎng)絡(luò)連接失敗的時(shí)候,開啟定時(shí)器的代碼沒有刪除矗烛,定時(shí)器回調(diào)函數(shù)也沒有刪除辅柴。所以一旦在業(yè)務(wù)的運(yùn)行過程中,出現(xiàn)過網(wǎng)絡(luò)連接失敗的情況瞭吃,那么72小時(shí)定時(shí)器就會(huì)被開啟碌嘀,即使后面重連成功了,定時(shí)器也不會(huì)被刪除歪架,所以72小時(shí)一到股冗,所有業(yè)務(wù)進(jìn)程就集體自殺了。
所以這次事故的根本原因就是沒有把老代碼刪除干凈和蚪!大家應(yīng)該都有這樣的經(jīng)歷止状,維護(hù)老代碼的時(shí)候,里面經(jīng)常會(huì)有很多注釋的代碼攒霹。有時(shí)候更夸張的是导俘,你會(huì)發(fā)現(xiàn)有用的代碼還沒有注釋掉的代碼多,有用的代碼都被淹沒在注釋代碼里剔蹋,看到這樣的代碼,你會(huì)覺得爽么辅髓?還有的情況是泣崩,代碼沒有被注釋掉少梁,但是根本沒有什么用處,因?yàn)闆]有地方調(diào)用他們矫付,或者是已經(jīng)是沒有用的邏輯凯沪。這樣的代碼多了,你可能會(huì)迷失在這些無用的代碼中买优,而忽略真正有用的代碼妨马。
所以,我一般接手一份老代碼后杀赢,第一件事情就是把這些廢代碼刪除烘跺。首先是把注釋掉的代碼刪除,然后就是把代碼從頭到尾走讀一遍脂崔,把沒有注釋掉滤淳,但是已經(jīng)明顯沒用的代碼都刪除。這樣做的好處一方面是減少代碼量砌左,另外一方面就是避免了老代碼里面隱藏的bug脖咐。你只有對(duì)每一行代碼的用處都有清晰的認(rèn)知,才能在出bug的時(shí)候精準(zhǔn)定位汇歹。
之前有個(gè)同事跟我說屁擅,代碼為什么要?jiǎng)h除,放在那里产弹,說不定以后還有用呀派歌。這應(yīng)該就是大多數(shù)廢代碼殘留的原因。我不排除這種可能性取视,但是經(jīng)常的情況是這種可能性出現(xiàn)的機(jī)會(huì)很少硝皂。即使真的出現(xiàn)了,我再重新寫一次作谭,又有什么關(guān)系呢稽物?
3:我不愿意做超前的設(shè)計(jì)
很多人在設(shè)計(jì)一個(gè)新系統(tǒng)的時(shí)候,會(huì)進(jìn)行過度的設(shè)計(jì)折欠。
什么叫過度設(shè)計(jì)贝或?打個(gè)比方,本來計(jì)劃只是要造一個(gè)一層樓的小房子锐秦,但是設(shè)計(jì)人員認(rèn)為以后這個(gè)一層的小房子可能會(huì)加到十層咪奖,所以地基被設(shè)計(jì)成能支持十層樓的地基。因?yàn)橐院罂赡軙?huì)加到十層酱床,所以羊赵,房子的周圍應(yīng)該要設(shè)計(jì)一些停車位,以滿足以后住戶的停車需求。那既然以后這里會(huì)住那么多人昧捷,那相關(guān)的門衛(wèi)闲昭,便利店,菜場(chǎng)靡挥,健身產(chǎn)所序矩,幼兒園,小學(xué)跋破,中學(xué)等等都要考慮起來簸淀。
于是乎,本來只需要幾百行代碼就能搞定的系統(tǒng)毒返,被這么一過度的設(shè)計(jì)租幕,變成了幾千上萬行的代碼。各種封裝饿悬,各種泛型令蛉,各種繞。設(shè)計(jì)人員自己還沾沾自喜狡恬,看我設(shè)計(jì)了一個(gè)多么牛逼的系統(tǒng)珠叔,以后的擴(kuò)展性多么地好。而目前真正用到的代碼弟劲,只是那幾百行而已祷安。如果這個(gè)系統(tǒng)一直是這個(gè)設(shè)計(jì)人員自己維護(hù),那也就罷了兔乞,愛咋整咋整汇鞭。不幸的是,后來這個(gè)設(shè)計(jì)人員離職了庸追,然后系統(tǒng)被移交給了一個(gè)并不熟悉這個(gè)系統(tǒng)的同事霍骄。
這個(gè)同事傻眼了,這個(gè)系統(tǒng)原來這么復(fù)雜啊淡溯,我都快繞暈了读整?這里為什么要用泛型?直接定義一個(gè)類不就行了咱娶?這里為什么要封裝米间,封裝類里面什么都沒有做呀?是不是里面有什么玄機(jī)我還沒有參透膘侮?是不是我能力有限呀屈糊?
所以,我總不建議在設(shè)計(jì)的時(shí)候考慮太多“以后”這種可能性∏砹耍現(xiàn)在軟件更新?lián)Q代那么快逻锐,以后的事情誰知道呢?你的這種可能性可能還沒有出現(xiàn)呢,你設(shè)計(jì)的模塊可能就已經(jīng)被淘汰了谦去。但是你的那些過度的設(shè)計(jì)卻花費(fèi)了后續(xù)維護(hù)人員太多的時(shí)間和精力慷丽。
以我的經(jīng)驗(yàn),一個(gè)軟件在初期規(guī)劃的時(shí)候是什么樣子鳄哭,以后基本上就是什么樣子,可能會(huì)有些小功能的添加纲熏,一般不會(huì)在結(jié)構(gòu)上有大的調(diào)整妆丘。如果真的需要在結(jié)構(gòu)上進(jìn)行大的調(diào)整,基本上就需要重新規(guī)劃一個(gè)新的軟件了局劲。所以代碼滿足現(xiàn)在的需求就行了勺拣,不需要做過多超前的設(shè)計(jì)。