挨踢部落故事匯(18):程序猿與代碼的基情
原創(chuàng)【51CTO.com原創(chuàng)稿件】“朋友,你還會(huì)修電腦啊?”這是小史在朋友中聽(tīng)到過(guò)的最多的一句話。每當(dāng)聽(tīng)到這句話時(shí),他也很無(wú)奈。難道程序猿就一定要會(huì)修電腦嘛?但是沒(méi)辦法,在朋友眼中,編程是一個(gè)很高深的工作。可能動(dòng)動(dòng)手指,哪邊就會(huì)出什么事,生活十分精彩。嗯,電影看多了。作為一名不會(huì)修電腦但努力想學(xué)習(xí)修電腦的程序猿來(lái)說(shuō),除了修電腦的技能,也還要具備大部分其他程序猿共有的特質(zhì)。比如:宅、悶。可能也具備獨(dú)有的特質(zhì),喜歡陪老婆逛街。。。
小史·Java開(kāi)發(fā)
嚴(yán)肅的簡(jiǎn)單介紹下本期主人公小史童鞋,從事Java后臺(tái)開(kāi)發(fā)工作已經(jīng)三年有余,目前服務(wù)于一家創(chuàng)業(yè)公司做駐場(chǎng)開(kāi)發(fā)。期間經(jīng)歷過(guò)kafka,大數(shù)據(jù)等領(lǐng)域的開(kāi)發(fā)。作為程序猿,大家應(yīng)該每天都在和26個(gè)字母做著你死我活的斗爭(zhēng),對(duì)于編程應(yīng)該也都有自己獨(dú)到的見(jiàn)解。借著這個(gè)機(jī)會(huì),小史拋個(gè)磚頭,粗淺的和大家聊聊關(guān)于代碼的一些事。
一、對(duì)復(fù)制/粘貼說(shuō)NO
小史看過(guò)一篇文章《程序員的進(jìn)步從每一天少寫(xiě)一點(diǎn)代碼開(kāi)始》里面提到說(shuō)Google與網(wǎng)絡(luò)的幫助可以讓你寫(xiě)出一行又一行的代碼。這句話不禁讓小史想起大學(xué)實(shí)習(xí),面試工作時(shí)候,測(cè)試主管對(duì)他說(shuō)的一句話:“寫(xiě)代碼沒(méi)什么難的,不就是復(fù)制、粘貼嘛”。當(dāng)聽(tīng)到這句話的時(shí)候,他的腦海中不禁又浮現(xiàn)出了同學(xué)對(duì)他說(shuō)的話:“我現(xiàn)在在公司里整天干的活就是復(fù)制、粘貼”。當(dāng)時(shí)小史不經(jīng)意間產(chǎn)生一種疑問(wèn),難道程序猿的工作這么簡(jiǎn)單和枯燥嘛?帶著這個(gè)疑問(wèn),他踏入了程序開(kāi)發(fā)的大軍中。
小史參加工作的***天,他的領(lǐng)導(dǎo)就反復(fù)強(qiáng)調(diào)一句話:“寫(xiě)代碼不要復(fù)制、粘貼”。這對(duì)于剛參加工作的他不是太能理解這句話的含義。當(dāng)時(shí),他一心就是為了工作效率,工作趕緊完成,讓領(lǐng)導(dǎo)知道自己的能力。這就導(dǎo)致了功能代碼的命名、結(jié)構(gòu)差勁,后來(lái)返工反而浪費(fèi)了更多的時(shí)間。現(xiàn)在他回頭想想,當(dāng)時(shí)的行為是多么的幼稚,如果只是復(fù)制粘貼,并沒(méi)有嘗試了解背后的運(yùn)作機(jī)制,充其量代表了工作完成而已。
二、碼農(nóng)的追求——高品質(zhì)代碼
“你的代碼像一坨翔”。相信這句話大家或多或少的在平時(shí)工作中都有聽(tīng)過(guò)。曾經(jīng)在網(wǎng)絡(luò)上看見(jiàn)過(guò)一個(gè)帖子是這樣說(shuō)的:“相信很多人都認(rèn)為自己的代碼是最棒的,別人的代碼都是很糟糕的,因?yàn)榭床欢?rdquo;。畢竟程序猿都有一顆工程師的心,所以當(dāng)他們到新的場(chǎng)地想做的***件事就是,將舊的一切推倒重來(lái)。是的,他們決不會(huì)滿足于簡(jiǎn)單的增量勞動(dòng)。或許這種微妙的心理定位可以解釋:為什么程序猿進(jìn)入新項(xiàng)目組后寧愿丟掉舊代碼重新寫(xiě),也不愿意修修補(bǔ)補(bǔ)。他們認(rèn)為舊代碼簡(jiǎn)直一團(tuán)糟。
好的代碼,就像是好的笑話,無(wú)須解釋就能讓人輕易明白;壞的代碼,就像是古文言,即使寫(xiě)滿了注解,也不一定能輕易看懂;好的代碼,就像是一本寫(xiě)作技巧高超的人所寫(xiě)的書(shū),它容易理解、分章明確;壞的代碼,就像是剛剛學(xué)會(huì)寫(xiě)字的人所寫(xiě)的書(shū),它錯(cuò)亂復(fù)雜,自我推翻。
那么,如何寫(xiě)出一段好代碼呢?小史曾經(jīng)看過(guò)一篇文章,覺(jué)得解釋的很好,它是這樣說(shuō)的:
- 可讀性——你所寫(xiě)出的代碼,不僅你自己要明白,你身邊合作的開(kāi)發(fā)者也要能在最短的時(shí)間內(nèi)看懂。(這個(gè)尤其要注意)
- 可維護(hù)性——讓你的代碼在修改的時(shí)候很簡(jiǎn)單。
- 簡(jiǎn)潔性——不要讓你的代碼看上去毫無(wú)必要的復(fù)雜。
- 效率性——盡可能的讓你的代碼獲得最快的運(yùn)行速度。
- 明確性——類的命令、方法的命名要清楚的表達(dá)出具體動(dòng)作的含義。
三、代碼優(yōu)化很有必要
代碼優(yōu)化,一個(gè)很重要的課題。可能有些人覺(jué)得沒(méi)用,一些細(xì)小的地方有什么好修改的,改與不改對(duì)于代碼的運(yùn)行效率有什么影響呢?關(guān)于這個(gè)問(wèn)題,小史有深刻的體會(huì)。舉個(gè)例子,之前他寫(xiě)過(guò)一個(gè)功能用到redis的排序。本著有輪子不造輪子原則,毅然決然的使用了redis提供的排序方法。寫(xiě)完之后,他還挺高興的,對(duì)redis的學(xué)習(xí)又深了一點(diǎn)。然而,事與愿違,當(dāng)代碼放到生產(chǎn)環(huán)境上運(yùn)行出來(lái)的結(jié)果直接把他干懵逼了,在大規(guī)模的數(shù)據(jù)洗禮下,完全跑不動(dòng)。那晚,小史一行一行打著日志,分析慢的原因,***定位到了redis的排序上(具體代碼細(xì)節(jié)不作闡述),然后寫(xiě)了一個(gè)算法代替了redis排序。
關(guān)于代碼優(yōu)化,小史做了很多筆記,如:
1、盡量指定類的final修飾符帶有final修飾符的類是不可派生的。
2、盡量重用對(duì)象。特別是String 對(duì)象的使用中,出現(xiàn)字符串連接情況時(shí)應(yīng)用StringBuffer 代替。
3、盡量使用局部變量,調(diào)用方法時(shí)傳遞的參數(shù)以及在調(diào)用中創(chuàng)建的臨時(shí)變量都保存在棧(Stack)中,速度較快。其他變量,如靜態(tài)變量、實(shí)例變量等,都在堆(Heap)中創(chuàng)建,速度較慢。另外,依賴于具體的編譯器/JVM,局部變量還可能得到進(jìn)一步優(yōu)化。
4、在Java+ ORACLE 的應(yīng)用系統(tǒng)開(kāi)發(fā)中,Java中內(nèi)嵌的SQL語(yǔ)句盡量使用大寫(xiě)的形式,以減輕ORACLE解析器的解析負(fù)擔(dān)。
5、盡量減少對(duì)變量的重復(fù)計(jì)算
例如:for(int i = 0;i < list.size; i ++) {
…
}
應(yīng)替換為:
for(int i = 0,int len = list.size();i < len; i ++) {
…
}
6、盡量采用lazy loading的策略,即在需要的時(shí)候才開(kāi)始創(chuàng)建。
例如: String str = “aaa”;
if(i == 1) {
list.add(str);
}
應(yīng)替換為:
if(i == 1) {
String str = “aaa”;
list.add(str);
}
等等……
四、書(shū)籍很重要
Web行業(yè)知識(shí)更新特別快,今天一個(gè)框架的新版本,明天又是另一個(gè)新框架,有時(shí)往往根據(jù)項(xiàng)目的需要來(lái)不斷學(xué)習(xí)新東西。所以,我們大家在平時(shí)閑暇的時(shí)候不妨多看兩本好書(shū),如果實(shí)在沒(méi)時(shí)間看的話,也建議大家去找一些看過(guò)這本書(shū)的大牛寫(xiě)的博客。因?yàn)椋@上面可能就是整本書(shū)的精華所在。
以上觀點(diǎn)來(lái)自51CTO社群核心開(kāi)發(fā)者小史的個(gè)人見(jiàn)解,歡迎加群(群號(hào)312724475)共同交流學(xué)習(xí)~
【51CTO原創(chuàng)稿件,合作站點(diǎn)轉(zhuǎn)載請(qǐng)注明原文作者和出處為51CTO.com】