「程序員」還是「代碼生成器」?
程師在項(xiàng)目中的角色不應(yīng)只是執(zhí)行者,而應(yīng)是整個(gè)項(xiàng)目的參與者。
按:國(guó)外的程序員有一句自嘲的話(huà)叫做:coffee in, code out. 程序員是最喜歡自嘲的一群人,這不失為一種積極的生活態(tài)度。但有些話(huà)如果你當(dāng)真了,結(jié)果往往不會(huì)很好,比如剛才那句話(huà)。
入職以后接到的***個(gè)任務(wù),就是更新和修復(fù)現(xiàn)有的部門(mén)簽名系統(tǒng)。這個(gè)系統(tǒng)可以根據(jù)當(dāng)前登入的帳號(hào)自動(dòng)從后臺(tái)獲取相關(guān)信息,填入到簽名檔的對(duì)應(yīng)位置 上,因?yàn)樽詣?dòng)獲取到的信息可能有誤差,所以還支持用戶(hù)手動(dòng)修改。用戶(hù)修改完成后可以生成一張圖片保存下來(lái),加入到郵件的簽名檔中。因?yàn)樵O(shè)計(jì)了新一版的郵件 簽名,所以需要按照新的設(shè)計(jì)圖更新簽名樣式,同時(shí)需要解決當(dāng)前系統(tǒng)中某一行過(guò)長(zhǎng)時(shí)不能自動(dòng)換行的 bug,以及后臺(tái)信息獲取不全的問(wèn)題。
接到任務(wù)后,我大致瀏覽了一遍現(xiàn)有系統(tǒng)的源代碼以后就馬上著手改版了。在我看來(lái),對(duì)于原有的系統(tǒng)來(lái)說(shuō),這些任務(wù)只是一些小修小補(bǔ),所以我直接選擇了 在現(xiàn)有的系統(tǒng)上加 patch 的方法。對(duì)于新增加的設(shè)計(jì)圖與原來(lái)的系統(tǒng)產(chǎn)生的不兼容的部分,也通過(guò)一些 patch 來(lái)修改掉。
這樣做的結(jié)果就是,這個(gè)任務(wù)完成后,系統(tǒng)里充斥著各種各樣的 patch ,邏輯異常復(fù)雜,如果不仔細(xì)想的話(huà),就連自己再讀一遍代碼也未必能馬上明白所有地方。花了一天完成的新系統(tǒng)雖然上線(xiàn)了,布置給我任務(wù)的師兄和我自己都不太 滿(mǎn)意。所幸這只是一個(gè)內(nèi)部的系統(tǒng),我還有機(jī)會(huì)補(bǔ)救。我提出重構(gòu)整個(gè)系統(tǒng)。為了不讓重構(gòu)僅僅是重蹈覆轍,我們對(duì)于出現(xiàn)的問(wèn)題進(jìn)行了分析。
問(wèn)題分析
回顧從接到任務(wù)開(kāi)始到重構(gòu)前這整個(gè)的過(guò)程,問(wèn)題出在了哪里呢?在接到任務(wù)以后,我做的是馬上著手執(zhí)行。***個(gè)問(wèn)題可能就出在「馬上」上面。
***次完成后的系統(tǒng)雖然能正常工作,但面臨的***的問(wèn)題就是,當(dāng)需要添加新的設(shè)計(jì)圖或者對(duì)現(xiàn)有的設(shè)計(jì)圖做出修改時(shí),非常難以維護(hù)。然而在動(dòng)手之前, 我并沒(méi)有考慮過(guò)這些問(wèn)題。這個(gè)系統(tǒng)曾經(jīng)供五六個(gè)不同的部門(mén)共同使用,每個(gè)部門(mén)都有自己的簽名檔,并且每個(gè)的設(shè)計(jì)也在不斷地變化當(dāng)中。也就是說(shuō),這個(gè)系統(tǒng)需 要高度可維護(hù)和可擴(kuò)展是一個(gè)隱含的需求,然而因?yàn)槲也](méi)有對(duì)整個(gè)系統(tǒng)的背景進(jìn)行了解,只是執(zhí)行眼前的任務(wù),造成了最終難以維護(hù)的問(wèn)題。
所以,工程師不僅要寫(xiě)代碼,還要了解需求的背景,以指導(dǎo)自己的工作。
在解決后臺(tái)信息獲取不全的這個(gè)問(wèn)題時(shí),我花費(fèi)了大量的時(shí)間在對(duì)接接口上,然而最終發(fā)現(xiàn)當(dāng)時(shí)系統(tǒng)所用的 PHP 后臺(tái)接口已經(jīng)很久沒(méi)有人維護(hù)了,連文檔中給出的示例都無(wú)法正常運(yùn)行。這樣的經(jīng)歷無(wú)疑讓人沮喪。究其問(wèn)題在于,在接到任務(wù)的時(shí)候,我僅僅了解到后臺(tái)提供了這 樣的接口就作罷,沒(méi)有對(duì)接口進(jìn)行可用性測(cè)試,最終浪費(fèi)了自己的時(shí)間。換句話(huà)說(shuō),需求方提供的資源不一定都是可用的,在正式開(kāi)始工作之前,需要對(duì)資源進(jìn)行可 用性測(cè)試。
所以,工程師不僅要寫(xiě)代碼,還要測(cè)試資源的可用性,以支持自己的工作。
我接到的任務(wù)不算復(fù)雜,但直接就去寫(xiě)代碼的執(zhí)行方式還是白白花費(fèi)了不少時(shí)間和精力。對(duì)于文字換行這一個(gè) bug ,其實(shí)可考慮的情況有很多:一種是因?yàn)椴块T(mén)信息本身就過(guò)長(zhǎng),從后端取得的結(jié)果直接就超出了一行;另一種是用戶(hù)在自己修改的時(shí)候讓結(jié)果超過(guò)了一行。而第二種 情況又可以細(xì)分為兩種,即用戶(hù)輸入了換行符,或者添加文字后同段的內(nèi)容超過(guò)一行。對(duì)于邏輯處理來(lái)說(shuō),這幾種情況每種需要做的處理都不一樣。如果沒(méi)有想清楚 就去執(zhí)行,要么是在過(guò)程中發(fā)現(xiàn)問(wèn)題,邏輯反復(fù)更改,要么上線(xiàn)后才發(fā)現(xiàn)沒(méi)有考慮周全,這都不是我們想要看到的。
所以,工程師不僅要寫(xiě)代碼,還要對(duì)需求進(jìn)行完整地分析,把需求拆分成具體可執(zhí)行的動(dòng)作,以確保自己的工作嚴(yán)謹(jǐn)和周密。
在學(xué)校中,我們常常說(shuō) Deadline 是***生產(chǎn)力。沒(méi)有時(shí)限的工作往往是很難有效推進(jìn)的。學(xué)校里的 Deadline 通常由老師根據(jù)經(jīng)驗(yàn)來(lái)確定,而工作中就很難這樣了。布置任務(wù)的時(shí)候,師兄問(wèn)我說(shuō),三個(gè)小時(shí)能不能做完?我大概只是簡(jiǎn)單的過(guò)了一下腦子,就回答可以。結(jié)果最 終花了一整天的時(shí)間。這里就涉及到一個(gè)時(shí)間評(píng)估的問(wèn)題。在真實(shí)業(yè)務(wù)場(chǎng)景下,需求方通常要和工程師協(xié)商一個(gè)時(shí)間線(xiàn),從工程師的角度來(lái)講,這個(gè)時(shí)間如何評(píng)估才 比較合理呢?在上一步需求拆分完成后,針對(duì)每一個(gè)具體可執(zhí)行的小步驟,都預(yù)估一個(gè)時(shí)間。那些很難直接給出預(yù)估時(shí)間的地方,就是任務(wù)的風(fēng)險(xiǎn)點(diǎn)。比如在這個(gè)任 務(wù)中,我對(duì)于 Canvas 的操作不是很熟悉,這里可能占用很多時(shí)間,就是一個(gè)風(fēng)險(xiǎn)點(diǎn)。對(duì)于風(fēng)險(xiǎn)點(diǎn),要找出解決方案,并且給出足夠并且合理的預(yù)留時(shí)間。把所有時(shí)間加到一起,再向上浮 動(dòng) 10% ,才是一個(gè)比較準(zhǔn)確的預(yù)估時(shí)間。預(yù)估的時(shí)間對(duì)于整個(gè)項(xiàng)目的流程都起著至關(guān)重要的作用。
所以,工程師不僅要寫(xiě)代碼,還要對(duì)時(shí)間進(jìn)行合理預(yù)估,配合需求方制定項(xiàng)目的時(shí)間流程。
在做完以上所有的工作之后,才到了具體的執(zhí)行階段。也就是之前我認(rèn)為的工程師工作的全部——寫(xiě)代碼。在完成這個(gè)任務(wù)的這一過(guò)程中,也不是沒(méi)有可以改 進(jìn)的地方。在寫(xiě)代碼時(shí)候,遇到的問(wèn)題我都傾向于獨(dú)立解決,即使在已經(jīng)花費(fèi)了很長(zhǎng)時(shí)間的情況下,也沒(méi)有及時(shí)與師兄溝通。我們都遇到過(guò)這樣的情況,自己苦苦想 了很久的問(wèn)題,其實(shí)已經(jīng)進(jìn)入了死胡同,然而局外人一句話(huà)就可能幫我們解決。對(duì)于實(shí)際項(xiàng)目來(lái)講,溝通不僅僅局限于技術(shù)人員之間,發(fā)現(xiàn)問(wèn)題后作為工程師,還應(yīng) 該及時(shí)與需求方溝通,保持信息的通暢,來(lái)幫助需求方協(xié)調(diào)整個(gè)項(xiàng)目。完成這個(gè)系統(tǒng)的時(shí)候我遇到的技術(shù)上的問(wèn)題沒(méi)有及時(shí)和別人溝通,在約定的時(shí)間快要截止的時(shí) 候沒(méi)有通知任何人,這在真實(shí)項(xiàng)目中是需要堅(jiān)決避免的。
所以,工程師不僅要寫(xiě)代碼,還要把問(wèn)題及時(shí)與相關(guān)人員溝通,幫助自己也幫助別人高效地工作。
重構(gòu)
問(wèn)題分析過(guò)后,對(duì)于我來(lái)說(shuō),這一重構(gòu)的過(guò)程也是我對(duì)工程師在項(xiàng)目中的定位的重新認(rèn)識(shí)的過(guò)程。我記下了這個(gè)過(guò)程,感興趣的同學(xué)可以移步這里查看。
結(jié)語(yǔ)
現(xiàn)在有很多工程師抱怨自己在大公司中只是一枚鏍絲釘,多了不多,少了不少。他們每天埋頭寫(xiě)代碼,需求來(lái)了,執(zhí)行任務(wù),再等待下一個(gè)需求。至少我認(rèn)為,「人」的價(jià)值不應(yīng)該僅限于此。如果把人當(dāng)作黑盒,coffee in, code out,那人又和工具有什么差別呢?要做一個(gè)「程序員」還是「代碼生成器」,值得思考。
原文:http://code.mforever78.com/essay/2015/08/02/programmer-or-code-generator/ 作者: MForever78