程序員的成長從開竅開始
有時(shí)候即使是很優(yōu)秀的程序員,也會被一個(gè)低級錯(cuò)誤困擾,可能會幾天都解決不了。所以,關(guān)鍵在于,如何找到問題。
遇到問題的時(shí)候:
1,不要怨天怨地。出了問題,當(dāng)然有可能是系統(tǒng)的bug,API的問題,但是那些幾率往往比你犯低級錯(cuò)誤的幾率要低多了,先從自己身上找原因,是不是自己寫錯(cuò)了。
2,要掌握工具。最低限度你要會寫Log,最好是Log和調(diào)試器結(jié)合。好 的工具可以大大的提高效率。以前有人跟我說,Dll不能調(diào)試,我發(fā)現(xiàn)可以;有人說多線程不能調(diào)試,我發(fā)現(xiàn)可以;有人說COM不能調(diào)試,我發(fā)現(xiàn)可以;有人說 IE插件不能調(diào)試,我發(fā)現(xiàn)可以;有人說OE插件不能調(diào)試,我發(fā)現(xiàn)也可以。當(dāng)然,你確實(shí)會遇到不能調(diào)試的時(shí)候,當(dāng)年我們做東芝芯片的嵌入程序,一個(gè)組都沒有 一個(gè)仿真器和調(diào)試器,但是至少可以用Log嘛,無非是麻煩點(diǎn)。
3,分析問題要有邏輯。遇到問題可以先把所有的可能性都列出來,然后一個(gè)一個(gè)分析,肯定能找到原因的。
4,要學(xué)會隔離問題。問題涉及到的代碼越多,越難以理解,問題越難以解決。遇到這樣的情況,可以利用Log或者調(diào)試器,一行代碼一行代碼的給它們洗清嫌疑,這樣很快你就可以找到出問題的地方。如果代碼特別長,程序特別復(fù)雜,可以用二分法來做,效率很高。
5,千萬不要懶惰,不要事事求別人。一次復(fù)雜的調(diào)試過程就像一部偵探劇,如果你有非常好的邏輯性,那這部劇的主角就是福爾摩斯,劇情一定非常精彩。我說這個(gè)是有巨大風(fēng)險(xiǎn)的,說真的我?guī)腿苏{(diào)東西挺上癮的,很有意思。但是我還是要告訴大家,一次高難度的調(diào)試之后,你的滿足感絕對不亞于寫了一個(gè)偉大的程序。
要想不遇到問題,寫代碼的時(shí)候:
1,要對寫出來的代碼負(fù)責(zé)。我很佩服那些寫代碼寫100行都不執(zhí)行一次的 高手,如果他們最后不被低級錯(cuò)誤困擾的話我就更加的佩服了。我寫程序幾乎是寫一行兩行就要執(zhí)行一次,每句話我都要確保執(zhí)行效果跟我的預(yù)期一致。沒錯(cuò)這樣寫的時(shí)候 可能慢一些,但是調(diào)試的時(shí)候很輕松,我可以很簡單的確定哪些代碼絕對沒有問題。所以我寫代碼整體速度比一般人高。很多人學(xué)習(xí)新東西的時(shí)候喜歡把例子抄一遍,運(yùn)行一下,改改,再運(yùn)行。我喜歡一句一句的抄例子,抄一句兩句執(zhí)行一次,這樣可以把例子透徹的理解,而且很難會遇到出現(xiàn)了問題找不到原因的時(shí)候。
2,函數(shù)體功能塊不要過長。我認(rèn)為我的智商并不高,我很難接受一個(gè)程序的一個(gè)函數(shù)體或者一個(gè)功能塊超越3屏(當(dāng)然邏輯真的有那么復(fù)雜除外,你會發(fā)現(xiàn)越是簡單的邏輯越是容易被人寫的冗長)。很多人對面向?qū)ο蠖炷茉?,對封裝繼承看起來駕輕就熟。但是動不動就寫出來個(gè)函數(shù)體超長的程序。這就像寫本書從頭到尾不點(diǎn)句號一樣,會累死讀者的。自己看的時(shí)候,估計(jì)也會被累的喘不過來氣。這是我對基礎(chǔ)教育的微詞所在,他們連教會學(xué)生寫函數(shù)都沒教會,雖然表面上他們連面向?qū)ο筮@么高深的東西都教。
3,縮進(jìn)要對。這點(diǎn)很重要,雖然大部分語言不是像Python那樣用縮進(jìn)來決定邏輯塊的位置,但是人看到縮進(jìn)的時(shí)候,總是會以為這些縮進(jìn)位置跟邏輯相關(guān)。尤其是在有大量的ifelse或者for循環(huán)等等的嵌套邏輯的時(shí)候,如果縮進(jìn)錯(cuò)了,可能會直接讓人把程序的邏輯讀錯(cuò)。所以我拿到別人的代碼,第一件事情就是整理縮進(jìn)。我見過一些比較優(yōu)秀的頁面工程師,他們會在div結(jié)束的位置用注釋寫上這個(gè)div的id,這樣層級關(guān)系就一目了然了。





