10條讓開(kāi)發(fā)者受益終生的編碼原則
目前大多數(shù)開(kāi)發(fā)者對(duì)于編碼有一種固有印象,認(rèn)為編碼就是利用計(jì)算機(jī)語(yǔ)言實(shí)現(xiàn)一些復(fù)雜邏輯或者數(shù)學(xué)公式,讓計(jì)算機(jī)能夠按照我們的指令去完成相應(yīng)的工作。
誠(chéng)然,這樣理解沒(méi)有任何問(wèn)題。
但是,真正的編碼技術(shù)是不僅寫(xiě)出機(jī)器能夠理解的語(yǔ)言,還要讓人類(lèi)能夠輕松閱讀和理解。
換個(gè)角度來(lái)看,寫(xiě)好代碼就相當(dāng)于寫(xiě)一個(gè)好故事。
首先,你需要正確的命名你的變量,就如同故事中的任務(wù)一樣。
其次,需要用到一些或深?yuàn)W、或淺顯易懂的詞匯來(lái)讓你的故事表下的更加透徹。
同樣,僅僅在代碼中使用高級(jí)算法并不能讓你成為一個(gè)好的編碼者!
當(dāng)我們?cè)诂F(xiàn)實(shí)世界的項(xiàng)目中,與不同團(tuán)隊(duì)和業(yè)務(wù)部門(mén)合作時(shí),需要寫(xiě)出干凈、可維護(hù)的代碼,甚至,還需要寫(xiě)出更加優(yōu)秀的代碼,使得能夠跨功能工作。
在這篇文章中,我們將看到一些概念和編碼實(shí)踐,這些概念和實(shí)踐一定能夠長(zhǎng)期幫助到你。
1. 對(duì)合適的人有合適的可見(jiàn)性
今天,我們生活在一個(gè)對(duì)技術(shù)的依賴(lài)性成倍增加的世界里,各行各業(yè)都在自動(dòng)化、優(yōu)化和擴(kuò)大業(yè)務(wù)規(guī)模。
特別是當(dāng)下工作環(huán)境中,數(shù)據(jù)驅(qū)動(dòng)解決方案的必要性是不可避免的,我們需要考慮用面向?qū)ο蟮木幊谭绞絹?lái)解決業(yè)務(wù)問(wèn)題。需要適當(dāng)?shù)某橄蠛头庋b,向不同層次的業(yè)務(wù)展示不同層次的可見(jiàn)性。
在商業(yè)領(lǐng)域通常講:“客戶(hù)只關(guān)心結(jié)果,不關(guān)心算法!”
這里的客戶(hù)是廣義的,任何直接/間接使用你的解決方案的人都是你的客戶(hù),或者內(nèi)部的、或者外部的。
它可以是合作開(kāi)發(fā)者,項(xiàng)目經(jīng)理,項(xiàng)目經(jīng)理,測(cè)試團(tuán)隊(duì),或者實(shí)際的客戶(hù)本身,這取決于你做什么。
舉一個(gè)例子,一個(gè)客戶(hù)到一杯奶茶店買(mǎi)一杯奶茶,他并不想知道牛奶和水的比例是多少,他想看到的只是一個(gè)結(jié)果。
2. 模塊化的解決方案
把你的代碼放在模塊中。

與其給一個(gè)很長(zhǎng)的腳本/jupyter筆記本作為你的解決方案,利用import
導(dǎo)入模塊。
它的優(yōu)點(diǎn)是:
讓客戶(hù)的事情簡(jiǎn)單化,隱藏不必要的細(xì)節(jié)。
可重復(fù)使用
更容易協(xié)作
如果你對(duì)創(chuàng)建自己的Python包感興趣,請(qǐng)查看官方文檔。
3. 先創(chuàng)建一個(gè)version0的解決方案
先創(chuàng)建一個(gè)基本的解決方案。
這將使我們能夠展示一些進(jìn)展并開(kāi)始討論,這將有助于你獲得客戶(hù)的早期反饋。
一開(kāi)始就錯(cuò),總比最后錯(cuò)好。
4. 版本控制系統(tǒng)和日志記錄
當(dāng)你作為一個(gè)團(tuán)隊(duì)工作時(shí),對(duì)Git等版本控制系統(tǒng)有一定的了解是必須的。
這將確保:
更容易協(xié)作和版本管理。
代碼備份
每一行代碼都可追溯
另外,有一個(gè)日志文件來(lái)跟蹤你的進(jìn)度和錯(cuò)誤,將大大減少調(diào)試工作。
5. 即插即用的功能
創(chuàng)建一個(gè)配置文件,用于激活/停用解決方案的各種功能,這可以在很多方面幫助我們。
如果我們對(duì)同一個(gè)問(wèn)題有多種可能的解決方案,并且需要測(cè)試所有的可能性。
你需要在一個(gè)子模塊中調(diào)試一個(gè)問(wèn)題,它不需要很多其他模塊。
如果有一個(gè)即插即用的功能,你可以簡(jiǎn)單地停用它們,避免運(yùn)行那些不需要的模塊所花費(fèi)的時(shí)間。
6. 相信人,而不是他們的代碼
在現(xiàn)實(shí)世界的編碼中,最重要的技能之一就是防御性編碼。
防御性編碼是一種以預(yù)測(cè)可能的失敗點(diǎn)為目的的編程方式。
當(dāng)你是一個(gè)大型項(xiàng)目的一部分時(shí),你將會(huì)和很多其他的開(kāi)發(fā)者合作,你將不得不創(chuàng)建具有外部輸入的模塊,這些外部輸入將是原始數(shù)據(jù)本身或其他模塊的處理輸出。
我們需要預(yù)料到人為錯(cuò)誤和現(xiàn)實(shí)世界噪音的可能性,并嘗試處理它們。
我們的想法是,我們的解決方案不應(yīng)該崩潰,如果你的模塊無(wú)法運(yùn)行,你應(yīng)該記錄錯(cuò)誤并繼續(xù)。
特別是當(dāng)我們?cè)谔幚鞟I項(xiàng)目時(shí),由于False positives,一些模塊的失敗是意料之中的,這并不意味著代碼應(yīng)該終止,這時(shí)候就需要你對(duì)這些報(bào)錯(cuò)點(diǎn)進(jìn)行預(yù)估,然后做出適當(dāng)?shù)奶幚怼?/span>
因此,做好異常處理是非常關(guān)鍵的一部分。
7. 也不要相信自己的代碼!
這個(gè)不用多說(shuō),我們是人,人是容易犯錯(cuò)的。
無(wú)論你是多么優(yōu)秀的編碼員,都要時(shí)刻接受自己犯錯(cuò)的可能性。
一旦你完成了一個(gè)模塊,休息一下。做一些別的事情,然后回來(lái)看看你的代碼。
你會(huì)驚奇地發(fā)現(xiàn),你可以很容易地找到剛才從未想到的錯(cuò)誤和優(yōu)化。
因此,這也體現(xiàn)到代碼評(píng)審的重要性。
我一直踐行一個(gè)原則:
提升代碼質(zhì)量最有效的途徑就是:多看別人的代碼,多讓別人看自己的代碼!
8. 不要對(duì)你的代碼產(chǎn)生感情!
當(dāng)你花了大量的時(shí)間進(jìn)行頭腦風(fēng)暴,學(xué)習(xí)新技術(shù),解決大量的問(wèn)題之后,你往往會(huì)對(duì)它產(chǎn)生感情,因?yàn)樗怯赡愕膭?chuàng)造力和智慧創(chuàng)造出來(lái)的東西。
誠(chéng)然,這種激情和創(chuàng)造力會(huì)讓你寫(xiě)出更好的代碼,解決復(fù)雜的挑戰(zhàn),但也有一些弊端。
你去向你的客戶(hù)過(guò)度解釋你的算法之美,而客戶(hù)并不真正關(guān)心這些。
在一個(gè)不斷發(fā)展的商業(yè)場(chǎng)景中,任何事情都可能在一天之內(nèi)發(fā)生變化。你會(huì)被要求放棄過(guò)去一年的一切工作,開(kāi)始著手一個(gè)新的項(xiàng)目,而對(duì)你的代碼產(chǎn)生感情會(huì)讓這一切變得困難。
這聽(tīng)起來(lái)可能很傻,但這是實(shí)實(shí)在在的事情,即使在這個(gè)行業(yè)工作了三年多,我有時(shí)還是會(huì)因?yàn)檫@個(gè)問(wèn)題而掙扎。
9. 只能,追求完美
最后,要接受這樣一個(gè)事實(shí):完美是無(wú)法實(shí)現(xiàn)的,只能追求。
無(wú)論你覺(jué)得今天寫(xiě)的代碼有多好,如果你會(huì)在一個(gè)月后看它,你可以想到很多方法讓它變得更好。
但只要你追求完美,就會(huì)達(dá)到卓越的境界。
10. 結(jié)語(yǔ)
我在這篇文章中討論的大部分觀(guān)點(diǎn)不僅適用于編碼,也適用于生活。
就像喬布斯說(shuō)的那樣:
每個(gè)人都應(yīng)該學(xué)習(xí)電腦編程,因?yàn)樗棠闳绾嗡伎肌?/span>
干貨推薦
為了方便大家,我花費(fèi)了半個(gè)月的時(shí)間把這幾年來(lái)收集的各種技術(shù)干貨整理到一起,其中內(nèi)容包括但不限于Python、機(jī)器學(xué)習(xí)、深度學(xué)習(xí)、計(jì)算機(jī)視覺(jué)、推薦系統(tǒng)、Linux、工程化、Java,內(nèi)容多達(dá)5T+,我把各個(gè)資源下載鏈接整理到一個(gè)文檔內(nèi),目錄如下:




所有干貨送給大家,希望能夠點(diǎn)贊支持一下!
https://pan.baidu.com/s/1eks7CUyjbWQ3A7O9cmYljA