10. 注釋說明“是什么”,而不是“為什么”
入門級編程課程教導(dǎo)學(xué)生要學(xué)會(huì)頻繁且盡早地注釋。不可否認(rèn)在學(xué)習(xí)編程的起步階段這方法的確是相當(dāng)有效的(即使看到簡單的代碼行都像天書)。然而許多程序員即使已經(jīng)從一只小菜鳥長大成一位計(jì)算機(jī)牛人,也還是把這個(gè)習(xí)慣給延續(xù)了下來。
r = n / 2; // Set r to n divided by 2 // Loop while r – (n/r) is greater than t while (abs ( r – (n/r) ) > t) { r = 0.5 * ( r + (n/r) ); // Set r to half of r + (n/r) }
看明白上面的代碼是啥意思沒?
四個(gè)字:云里霧里。
上述問題就是,雖然有很多注釋,但是卻沒有說明為什么要寫這些代碼。下面將上述相同的代碼換用另一種注釋,那效果就大大不同了。
// square root of n with Newton-Raphson approximation r = n / 2; while ( abs ( r – (n/r) ) > t ) { r = 0.5 * ( r + (n/r) ); }
是不是好多了!雖然我們還是沒有完全理解這段代碼是什么意思,但是至少我們精簡了代碼,清爽多了。
寫注釋是為了幫助讀者理解代碼。這里假設(shè),所有閱讀代碼的人都已經(jīng)對 for 循環(huán)如何運(yùn)行有了基本的了解。他們可能不清楚的是,你的代碼如何奏效或者你為什么選擇這條路徑來實(shí)現(xiàn)。
在大多數(shù)情況下,程序員的思緒比起法拉利更像是火車,需要慢慢啟動(dòng),也就是說我們得醞釀一下才能進(jìn)入狀態(tài)。但是一旦我們?nèi)硇耐度氲臅r(shí)候,就會(huì)高效完成很多令人嘖嘖稱贊的代碼。只是很不幸的是,這是很難達(dá)到的境界,因?yàn)槲覀兊乃悸房偸遣粩嗍艿娇蛻艉屯碌拇驍嚒?
維基百科將范圍蔓延定義為“在項(xiàng)目范圍內(nèi)不受控制的變化”。范圍蔓延會(huì)使得一個(gè)相對簡單的請求延伸成一個(gè)極為復(fù)雜和耗時(shí)的任務(wù)。它就是運(yùn)用一些看似方便無害的要求蔓延范圍,一步一步破壞項(xiàng)目的時(shí)間表:
當(dāng)然,也會(huì)有例外,此點(diǎn)標(biāo)題僅為個(gè)人遭遇,如有雷同,純屬巧合。
首先我們要承認(rèn),管理不是個(gè)簡單活。下屬會(huì)討厭你:他們脆弱的內(nèi)心有時(shí)也會(huì)受傷。并且要保持一大群人的團(tuán)結(jié)和凝聚力幾乎就像是座山一樣的任務(wù)。然而,任務(wù)艱巨并不意味著管理者能不對他們的下屬有一個(gè)基本的了解。當(dāng)管理層無法把握工作理念,就會(huì)使員工出現(xiàn)范圍蔓延,超出完成期限,感到挫折心情沮喪等等狀況。這是很多程序員在日常工作中經(jīng)常抱怨和焦慮的根本原因。
沒錯(cuò),的確有很多文檔生成工具,但我的經(jīng)驗(yàn)告訴我,這些工具都是只適合生成 API 文檔,以供其他程序員參考。如果你開發(fā)的軟件是很多人在日常生活中都會(huì)用到的,那么你好寫一些即使外行人也能理解的文檔(例如,應(yīng)用程序如何工作、故障診斷指南等等)。
好吧,有些程序員可不樂意干這事兒。大家經(jīng)常做的是,快速瀏覽開源項(xiàng)目,然后開始不斷的搜尋文檔來獲取幫助。
我敢打保票的說,不管在哪里,幾乎所有的程序員被要求寫文檔時(shí),都會(huì)說:“不能讓其他人去寫嗎?”
好吧,我從來沒有說過我們程序員是說一套做一套的人。程序員經(jīng)常被要求在項(xiàng)目中用到第三方的類庫和應(yīng)用。這使得我們不得不需要文檔。但是正如我在上面那條說的那樣,程序員痛恨寫文檔。真是個(gè)矛盾又糾結(jié)啊!
當(dāng)我們需要使用一個(gè)第三方類庫是,卻不知道至少有一半的 API 有什么用,沒有什么比這個(gè)更讓人崩潰了。知道函數(shù) poorlyNamedFunctionA ()和 poorlyButSimilarlyNamedFunctionB ()的區(qū)別不?當(dāng)我訪問 PropertyX 時(shí)是不是需要先做一個(gè) null 測試?如果缺少文檔,我估計(jì)我得通過自己的測試和錯(cuò)誤報(bào)告才能知道結(jié)果,哦,my god!
任何一個(gè)程序員要是被叫去調(diào)試數(shù)據(jù)庫服務(wù)器上一種奇怪的宕機(jī)現(xiàn)象,或者去解決 RAID 驅(qū)動(dòng)器不能正常工作的問題,而后發(fā)現(xiàn)卻是硬件的原因,orz 都會(huì)痛苦不已。話說,不知道哪里來的誤解,人們?nèi)粫?huì)以為程序員這種整天搗鼓電腦的家伙,肯定知道如何修電腦。好吧,有些程序員確實(shí)會(huì)修(大概是他們大學(xué)時(shí)泡妹子修煉的技能?),但是,我敢打包票,大多數(shù)程序員是不知道的,或者對程序被編譯成機(jī)器碼后是如何工作的毫不關(guān)心。
我們關(guān)心什么呢?我們關(guān)心的是我們做出來的東西是否符合需求,這樣我們才能集中精力去解決更高級別的任務(wù)。
“哎呀,我的網(wǎng)站出問題了”、“XX 功能不正常”,這種指向性不明確的要求痛苦了。我特別訝異的是,當(dāng)我們要求那些非程序員重現(xiàn)問題時(shí),他們?nèi)粫?huì)憤怒不已。難道他們不知道,僅僅一句“電腦壞掉了,快點(diǎn)修復(fù)一下”,我們是沒辦法開始工作的,我們需要更多的信息。
軟件的運(yùn)行,在大多數(shù)情況下,是有跡可循的。我們也喜歡這種方式。請遷就我們,幫助我們找出是在哪一步出現(xiàn)的問題,而不是簡單一句“修復(fù)”。
程序員經(jīng)常和其他程序員合不來。不要裝的很驚訝,內(nèi)心早承認(rèn)了吧,親愛的程序員們。關(guān)于這方面的事例我隨口就可以列出十大條,甚至可以另外單獨(dú)寫篇博客,所以在本文中我僅列出幾個(gè)之所以會(huì)和同事難以好好相處的常見原因:
這還不是糟糕的,還有個(gè)重量級的“程序員殺手”——No.1 在后面呢……
別打噴嚏,我發(fā)現(xiàn)了一個(gè) bug。
你有沒有回過頭去看看自己以前寫的代碼,有沒有情不自禁地捶胸頓足?有沒有在懊惱自己當(dāng)初怎么會(huì)這么傻逼,寫出這種垃圾玩意!刪掉,刪掉,通通刪掉!
好吧,你可以開心一下,這種事并不單單發(fā)生在你身上。
我們的編程世界是在不斷變化的。今天或許是棒的技術(shù),明天搞不好就過時(shí)了。我們永遠(yuǎn)寫不出完美的代碼,因?yàn)樵u價(jià)的標(biāo)準(zhǔn)也在隨著時(shí)代的進(jìn)步而不斷提高。無論我們寫出來的代碼現(xiàn)在看來是要多完美有多完美,但是很可能在不久之后就是被人嘲笑的對象了。
這的確讓人情不自禁的沮喪,因?yàn)榧词刮覀儸F(xiàn)在怎么努力去學(xué)習(xí)新棒的開發(fā)工具、設(shè)計(jì)、框架,以及開發(fā)方法,我們總是比新的技術(shù)發(fā)展趨勢慢了一步。于我而言,這是作為一個(gè)程序員為懊惱的事情了,沒有之一,所以我把這一條列為 No.1。我們能做的就是不斷更新自己的技術(shù),不過有時(shí)候,我卻會(huì)覺得我就像是個(gè)搞沙雕的,不斷推到重做,呵呵。
本站文章版權(quán)歸原作者及原出處所有 。內(nèi)容為作者個(gè)人觀點(diǎn), 并不代表本站贊同其觀點(diǎn)和對其真實(shí)性負(fù)責(zé),本站只提供參考并不構(gòu)成任何投資及應(yīng)用建議。本站是一個(gè)個(gè)人學(xué)習(xí)交流的平臺(tái),網(wǎng)站上部分文章為轉(zhuǎn)載,并不用于任何商業(yè)目的,我們已經(jīng)盡可能的對作者和來源進(jìn)行了通告,但是能力有限或疏忽,造成漏登,請及時(shí)聯(lián)系我們,我們將根據(jù)著作權(quán)人的要求,立即更正或者刪除有關(guān)內(nèi)容。本站擁有對此聲明的最終解釋權(quán)。