Author: Fox
元旦放假3天,本來(lái)想把前面寫的一個(gè)存在線程安全隱患的模塊推倒重來(lái)的,可是改著改著就覺(jué)得不對(duì)勁了。
既然是返工,就想盡量把現(xiàn)在的理解完全加進(jìn)去,讓后面的人看了不要罵??墒窍氚褞浊械拇a改得面目全非并且更加安全準(zhǔn)確也并不是一件容易的事,雖然對(duì)于功能和邏輯的認(rèn)識(shí)比以前要清晰的多。
拿到一個(gè)新的模塊,上面一般會(huì)給個(gè)大致的deadline。除非你對(duì)這個(gè)模塊和整個(gè)項(xiàng)目的依賴關(guān)系(接口、邏輯、功能)有很好的把握,否則,你根本不知道到底有多少東西是已經(jīng)實(shí)現(xiàn)的,有多少東西是可以復(fù)用的,有多少東西是需要修改的,有多少東西是要重寫的,有多少東西是要新加的,僅僅根據(jù)需求預(yù)估的進(jìn)度是不可能恰到好處的。而脫離了整個(gè)項(xiàng)目實(shí)現(xiàn)的模塊是非??赡艹鰡?wèn)題的,尤其是在使用多線程的項(xiàng)目中。
當(dāng)我的這個(gè)模塊完成并上馬之后,我沾沾自喜的跟上面說(shuō),應(yīng)該是不會(huì)有問(wèn)題了,上面跟我說(shuō)了一句:如果不出問(wèn)題就是奇跡了,我當(dāng)時(shí)頗不以為然。在后面一兩周之內(nèi)真的就是沒(méi)有什么問(wèn)題,我真想告訴他是我創(chuàng)造了奇跡。
“奇跡”在2007年的最后一周破滅了。在我從西嶺雪山回來(lái)的那天,為了增加新功能把代碼修改了一些,結(jié)果第二天更新之后,服務(wù)器就老是有問(wèn)題,找了一下午,才發(fā)現(xiàn)在修改代碼的時(shí)候居然忘記對(duì)一個(gè)pointer做NULL判定!我心想,這種錯(cuò)誤居然都出來(lái)了!死了算了!而且這個(gè)問(wèn)題出在非主線程中。然后就和同事在考慮,這個(gè)東西如果線程同步出現(xiàn)問(wèn)題,你就是每次使用前都做NULL判定也沒(méi)用,所以就決定把這個(gè)模塊重寫了。
在這兒我就不想就線程安全問(wèn)題多說(shuō)了,以后想好了再專門去寫點(diǎn)多線程的東西吧,今天只是想說(shuō)點(diǎn)瑣碎的東西。
因?yàn)槭欠偶伲乃嘉幢鼐腿糠旁谏厦媪?,代碼沒(méi)改多少,倒是玩了很長(zhǎng)時(shí)間的游戲。后來(lái)想想,也不全是時(shí)間問(wèn)題,幾千行的代碼改來(lái)改去,難保不出現(xiàn)更多的問(wèn)題。必須把它當(dāng)作一個(gè)新的模塊去寫,先要把邏輯結(jié)構(gòu)完全理出來(lái),能多細(xì)化就多細(xì)化,最好能夠精確到變量的使用,而且把文檔做細(xì),這樣就可以在寫文檔的過(guò)程中把問(wèn)題盡可能想全想清楚。改代碼先改文檔,這幾乎是所有學(xué)過(guò)軟件工程并寫過(guò)項(xiàng)目的同學(xué)都能認(rèn)識(shí)并理解的常識(shí),可是在實(shí)際工作中,上有任務(wù)催趕,下有閑心雜念,很難把文檔和注釋寫好。而做不到這一點(diǎn)的話,你就不敢保證你的模塊不出差錯(cuò)。
所以,對(duì)于一個(gè)一般的需求,如果deadline是2個(gè)月的話。讀需求、評(píng)估依賴關(guān)系、量進(jìn)度要花掉1周,畫邏輯結(jié)構(gòu)、寫文檔要花掉3周,相當(dāng)于前面一半的時(shí)間沒(méi)有動(dòng)手寫代碼,然后寫代碼大概只用1周,甚至更少,其他時(shí)間就留給測(cè)試和修改文檔、代碼了。從軟件工程的角度,這樣的分配是合理的,而且是應(yīng)該的,但到了實(shí)際項(xiàng)目里面,又做不到!看來(lái),不管是manager,還是coder,都不能急,軟件工程不能白學(xué)了。
我發(fā)現(xiàn),我的軟件工程就是白學(xué)了,以后得改改。
/*****************************************************************************
?不想回頭去動(dòng)以前的代碼,每次看以前寫過(guò)的東西,都有一種想把它徹底刪除的沖動(dòng)。
?把需求看好、文檔寫好、時(shí)間安排好,這才是硬道理……
?畢竟是新年,還是祝大家:新年快樂(lè)!
?重要的是,新的一年,別荒廢了……
*****************************************************************************/