孔子曰,三人行必有我?guī)熝?。在一些技術(shù)行業(yè)類里這句話體現(xiàn)的尤為明顯。像互聯(lián)網(wǎng)行業(yè)中的編程者或者說(shuō)程序員,通常新人在入行時(shí),由于實(shí)戰(zhàn)經(jīng)驗(yàn)的缺乏不可避免的會(huì)遇到一些個(gè)人無(wú)法解決的問(wèn)題,這時(shí)候有經(jīng)驗(yàn)的老人通常能給他們些有用的建議,那么,剛?cè)胄械男率中“兹绾翁嵘约?,讓自己的技術(shù)升級(jí)呢?以下所列是藍(lán)鷗資深講師團(tuán)隊(duì)整理和總結(jié)的在這些年來(lái)軟件開(kāi)發(fā)工作過(guò)程中和教學(xué)過(guò)程中受到的啟發(fā),還有總結(jié)而來(lái)的好經(jīng)驗(yàn)。共有四個(gè)大分類,包括22個(gè)小概括點(diǎn)。
開(kāi)發(fā)
1. 從小事做起,然后再擴(kuò)展
無(wú)論是創(chuàng)建一個(gè)新的系統(tǒng),還是在現(xiàn)有的系統(tǒng)中添加新的功能,要從一個(gè)簡(jiǎn)單到幾乎沒(méi)有任何所需功能的版本開(kāi)始,然后再一步一步地解決問(wèn)題,直到滿意為止。從來(lái)不要妄想能夠一步登天。需要一邊開(kāi)發(fā)一邊學(xué)習(xí),同時(shí)新掌握的信息還可以用于解決方案中。
2. 一次只做一件事
當(dāng)我們?cè)陂_(kāi)發(fā)時(shí),碰到測(cè)試失敗和功能無(wú)效的情況,如果你一次只研究一個(gè)問(wèn)題,那將會(huì)更容易找到問(wèn)題的關(guān)鍵。換言之,就是使用短迭代。必須確保這個(gè)問(wèn)題解決之后,再轉(zhuǎn)移到另一個(gè)問(wèn)題上。這適用于向下提交。如果在你添加新功能之前需要先重構(gòu)代碼,那么先提交重構(gòu),然后再添加新的功能。
3. 盡早地添加日志和錯(cuò)誤處理
在開(kāi)發(fā)新系統(tǒng)時(shí),做的第一件事就是添加日志和錯(cuò)誤處理,因?yàn)檫@兩者從一開(kāi)始就非常有用。對(duì)系統(tǒng)來(lái)說(shuō)它比一大把代碼更有用,你需要一些了解程序狀態(tài)的方法。如果系統(tǒng)不能照常工作,那么你就需要知道程序中發(fā)生了什么——這是日志的作用。錯(cuò)誤處理也是如此——錯(cuò)誤和異常越早處理越好。
4. 每一行新代碼必須至少執(zhí)行一次
在你真正完成一個(gè)功能之前,你必須對(duì)它進(jìn)行測(cè)試。不然,你怎么知道它是不是按照你的想法在執(zhí)行呢?通常情況下,最好的方法是通過(guò)自動(dòng)測(cè)試,但并非總是如此。不過(guò),不管怎么說(shuō),每一行新代碼必須至少執(zhí)行一次。
一般,我們想觸發(fā)某種條件很難。但幸運(yùn)的是,我們可以作弊。例如,數(shù)據(jù)的錯(cuò)誤處理可以通過(guò)臨時(shí)拼寫錯(cuò)一個(gè)列名來(lái)觸發(fā)。或者,一個(gè)if語(yǔ)句可以暫時(shí)顛倒過(guò)來(lái)(從 if error 變成 if not error),這樣來(lái)觸發(fā)那些平時(shí)很難觸發(fā)的條件,這樣只是為了確定代碼是否正常運(yùn)行和它會(huì)出現(xiàn)什么結(jié)果。
有時(shí),有一些行代碼永遠(yuǎn)都不會(huì)被運(yùn)行。當(dāng)我們做代碼檢查是它看起來(lái)沒(méi)有什么問(wèn)題,但就是不工作。你要避免這樣的尷尬狀況,如果你想你的每一行新代碼都會(huì)被執(zhí)行。
5. 在整體測(cè)試之前先進(jìn)行模塊測(cè)試
先進(jìn)行部分模塊測(cè)試可以節(jié)省時(shí)間。通常說(shuō)來(lái),我們?cè)谡喜煌哪K時(shí)也會(huì)出現(xiàn)問(wèn)題,例如模塊之間的接口不匹配。但是如果我們能夠信任各個(gè)組件的話,那么跟蹤集成問(wèn)題就會(huì)變得簡(jiǎn)單得多。
6. 所有事情所花費(fèi)的時(shí)間總是比你預(yù)期的要長(zhǎng)
特別是在編程中,即使一切進(jìn)展順利,我們也很難對(duì)功能所需的時(shí)間做出正確的預(yù)算。并且,開(kāi)發(fā)軟件時(shí)碰到各種意想不到的問(wèn)題是非常常見(jiàn)的。一個(gè)簡(jiǎn)單的合并操作會(huì)導(dǎo)致一系列小Bug,一次框架升級(jí)意味著一些函數(shù)必須改變或者一些API不按照你想象的那樣工作。
7. 先了解現(xiàn)有的代碼
大多數(shù)的編碼都需要以某種方式改變現(xiàn)有的代碼。即使是新功能,也需要適應(yīng)現(xiàn)有的程序。所以,在你加進(jìn)去新的內(nèi)容前,首先需要了解當(dāng)前的解決方案。否則,你一不小心就很有可能會(huì)打破現(xiàn)有的功能。這意味著,閱讀代碼和編寫代碼都是必要的技能。這也是為什么看似微小的變化仍可能需要很長(zhǎng)時(shí)間才能解決的原因之一,因?yàn)槟闶紫缺仨毩私馍舷挛摹?/p>
8. 閱讀和運(yùn)行代碼
幸運(yùn)的是,對(duì)于理解代碼,我們有兩種互補(bǔ)的方法。你可以閱讀代碼,也可以運(yùn)行代碼。運(yùn)行代碼的確是個(gè)非常棒的好方法。所以,請(qǐng)確保充分利用這兩種方法。
故障排除
9. Bug 總是難免的
那些宣稱軟件開(kāi)發(fā)可以“一蹴而就”的高談闊論不要相信。不論你再怎么努力,Bug總是難免的(Bug的定義基本上是:“我們沒(méi)有想到”)。最好能夠做成可以快速故障排除、修復(fù)bug和部署修復(fù)的系統(tǒng)。
10. 解決故障報(bào)告
每個(gè)開(kāi)發(fā)人員都應(yīng)該花時(shí)間去處理來(lái)自客戶的故障報(bào)告,并修復(fù)Bug。這能讓你更好地理解客戶的意圖,明白如何使用系統(tǒng),知道排除故障的難易程度,了解系統(tǒng)的設(shè)計(jì)情況。這也是為自己的開(kāi)發(fā)成果負(fù)責(zé)的好方法。不要錯(cuò)過(guò)這些好處。
11. 重現(xiàn)問(wèn)題
修復(fù)Bug的第一步就是重現(xiàn)問(wèn)題。然后你得確保修復(fù)之后,問(wèn)題能夠徹徹底底地消失。這樣一個(gè)簡(jiǎn)單的規(guī)則,可以確保你不會(huì)誤將非問(wèn)題當(dāng)作是問(wèn)題,并確保解決方案真的能夠奏效。
12. 修復(fù)已知錯(cuò)誤,然后再看看有沒(méi)有其他不對(duì)的地方
有時(shí)候,可能同時(shí)存在著幾個(gè)不同的問(wèn)題。它們之間的互相作用,可能會(huì)讓你毫無(wú)頭緒,束手無(wú)策。不要糾結(jié)于搞清楚發(fā)生了什么,先去解決所有已知的問(wèn)題,然后再看看還有什么不對(duì)的地方。
13. 沒(méi)有巧合
在測(cè)試和故障排除時(shí),不要相信會(huì)出現(xiàn)什么巧合。就像你改變了定時(shí)器的值,那么就會(huì)改變系統(tǒng)重啟的頻率。所以一切都并非是巧合。添加新功能,另一個(gè)不相干的功能變慢了?這絕對(duì)不是巧合。相反,是你應(yīng)該仔細(xì)調(diào)查的內(nèi)容。
14. 關(guān)聯(lián)時(shí)間戳
在故障排除時(shí),事件的時(shí)間戳可以作為你的好幫手。尋找偶數(shù)增量。例如,如果系統(tǒng)重啟了,并且剛剛發(fā)出過(guò)一個(gè)3000毫秒左右的請(qǐng)求,那么可能是觸發(fā)了某個(gè)定時(shí)器,才導(dǎo)致出現(xiàn)重啟的動(dòng)作。
合作
15. 面對(duì)面的交流最有效
當(dāng)我們需要討論如何解決問(wèn)題時(shí),那么面對(duì)面的交流比視頻、打電話和電子郵件都要好。
16. 小黃鴨調(diào)試法
遇到你絞盡腦汁也解決不了的問(wèn)題時(shí),不妨找一個(gè)同事,然后將問(wèn)題解釋給他們聽(tīng)。很多時(shí)候,當(dāng)你在敘述時(shí),即使你的同事一言不發(fā),你可能也會(huì)突然靈光乍現(xiàn)找到問(wèn)題的關(guān)鍵。聽(tīng)起來(lái)像魔法,但是這經(jīng)常起作用。
17. 問(wèn)問(wèn)題
閱讀和運(yùn)行代碼往往非常有助于指出代碼的目的和它的工作原理。但是如果你有機(jī)會(huì)咨詢那些更為了解的人(例如原來(lái)的程序員),那么千萬(wàn)不要錯(cuò)過(guò)。繼續(xù)問(wèn)他們具體的問(wèn)題、后續(xù)的問(wèn)題,這幾分鐘內(nèi)給你的信息可能是你需要花費(fèi)好幾天才能獲得的。
18. 共享榮譽(yù)
不要貪圖榮譽(yù),該是誰(shuí)的就是誰(shuí)的。例如:“Marcus 想出了這個(gè)主意……”(如果真是他想的話),而不要說(shuō)“我們想出的……”。大膽的說(shuō)出那些幫助過(guò)你或者貢獻(xiàn)過(guò)力量的人的名字。
其他
19. 動(dòng)手去做
如果你不知道某種編程語(yǔ)言功能的工作原理,那么不妨寫一個(gè)小程序來(lái)理解它是如何工作的。這同樣適用于測(cè)試你正在開(kāi)發(fā)的系統(tǒng)。經(jīng)常做這些會(huì)幫你發(fā)現(xiàn)Bug,在此同時(shí)也會(huì)加深你的系統(tǒng)工作的了解。
20. 帶著問(wèn)題睡覺(jué)
如果你正在解決一個(gè)很難的問(wèn)題,那么不妨帶著問(wèn)題睡覺(jué)。有科學(xué)研究表明,這樣做雖然你表明上并沒(méi)有在主動(dòng)思考,但你的潛意思卻這么做了。其結(jié)果就是,第二天再去研究問(wèn)題,解決方案已經(jīng)呼之欲出了。
21. 改變/跳槽
不要害怕角色變化。和不同的人共事,開(kāi)發(fā)不同的產(chǎn)品,感受不同的公司文化是非常有意思的。
22. 活到老學(xué)到老
軟件行業(yè)的一大魅力就是我們隨時(shí)有機(jī)會(huì)可以學(xué)到新的東西。你可以嘗試不同的編程語(yǔ)言和工具,閱讀軟件開(kāi)發(fā)的書(shū)籍,接受藍(lán)鷗的編程培訓(xùn)課程。量變才能達(dá)到質(zhì)的飛躍,這些小小的學(xué)習(xí)積累,終有一天會(huì)大大地提高你的知識(shí)和能力。