如果你想成為專業(yè)的軟件工程師

      網(wǎng)友投稿 750 2022-05-29

      “噢,笑吧,科廷,老伙計(jì)。這是上帝,或者也可以說是命運(yùn)或自然,跟我們開的一個(gè)玩笑。不過,不管這家伙是誰或是什么,他真幽默!哈哈!”

      ——霍華德,《碧血***》

      哦,你點(diǎn)進(jìn)來了,這么說,你確實(shí)是想成為專業(yè)的軟件工程師,對(duì)吧?你希望能昂首挺胸向世界宣告“我是專業(yè)人士”,希望人們滿懷尊重地看著你,充滿敬意地對(duì)待你。希望母親們會(huì)指著你告訴自己的孩子要成為像你這樣的人。這些都是你想要的,對(duì)吧?

      1 清楚你要什么

      “專業(yè)主義”有很深的含義,它不但象征著榮譽(yù)與驕傲,而且明確意味著責(zé)任與義務(wù)。這兩者密切相關(guān),因?yàn)槟悴豢赡軓哪銦o法負(fù)責(zé)的事情上獲得榮譽(yù)與驕傲。

      做個(gè)非專業(yè)人士可輕松多了。非專業(yè)人士不需要為自己所做的工作負(fù)責(zé),他們大可把責(zé)任推給雇主。如果非專業(yè)人士把事情搞砸了,收拾攤子的往往是雇主;而專業(yè)人士如果犯了錯(cuò),只好自己收拾殘局。

      如果你不小心放過了某個(gè)模塊里的一個(gè)bug,以致公司損失了1萬美元,結(jié)果將會(huì)怎樣呢?非專業(yè)人士會(huì)聳聳肩說:“難免要出點(diǎn)兒狀況嘛。”然后像沒事兒人一樣繼續(xù)寫其他模塊。而專業(yè)人士會(huì)自己為公司的那1萬美元買單!

      哇,自掏腰包?那可真讓人心疼唉!但專業(yè)人士就必須這么做。實(shí)際上,專業(yè)主義的精髓就在于將公司利益視同個(gè)人利益。看到了吧,“專業(yè)主義”就意味著擔(dān)當(dāng)責(zé)任。

      2 擔(dān)當(dāng)責(zé)任

      我曾因不負(fù)責(zé)任嘗盡了苦頭,所以明白盡職盡責(zé)的重要意義。

      那是1979年,當(dāng)時(shí)我是一家叫Teradyne的公司的“負(fù)責(zé)工程師”,所負(fù)責(zé)的軟件控制著一個(gè)測(cè)量電話線路質(zhì)量的小型機(jī)系統(tǒng)和微機(jī)系統(tǒng),該系統(tǒng)的中央小型機(jī)通過帶寬為300波特的撥號(hào)電話線與幾十臺(tái)控制測(cè)量硬件的外圍微機(jī)連接在一起,程序是用匯編語言編寫的。

      我們的客戶是各大電話公司的客服經(jīng)理,他們每個(gè)人都負(fù)責(zé)10萬條甚至更多的電話線路。我的系統(tǒng)負(fù)責(zé)幫助這些服務(wù)區(qū)經(jīng)理搶在客戶之前發(fā)現(xiàn)各種線路故障并及時(shí)修復(fù)。這可以減少客戶投訴率,以免對(duì)此做監(jiān)測(cè)的公共設(shè)施委員會(huì)相應(yīng)下調(diào)電話公司收取的服務(wù)費(fèi)。總之,這些系統(tǒng)極其重要。

      每天晚上,這些系統(tǒng)都會(huì)運(yùn)行“夜間例行程序”,即中央小型機(jī)會(huì)通知外圍微機(jī)對(duì)所控制的電話線路進(jìn)行檢測(cè);每天早上,中央計(jì)算機(jī)就能獲取故障線路清單及其故障特征。根據(jù)這些報(bào)告,各服務(wù)區(qū)經(jīng)理會(huì)安排人員修復(fù)故障,這樣就不會(huì)有客戶投訴了。

      一次,我對(duì)幾十個(gè)客戶推出了一版新發(fā)布。“推出”這詞可真是形象啊。我把軟件寫在磁帶上,就把這些帶子“推出”給客戶了。客戶載入這些磁帶,然后重啟系統(tǒng)。

      這一新發(fā)布修復(fù)了幾個(gè)小故障,還增加了客戶要求的一項(xiàng)新功能。之前我們?cè)兄Z會(huì)在截止日期之前提供那項(xiàng)新功能。我連夜趕工,總算在約定日期前交付了磁帶。

      兩天后,我接到現(xiàn)場(chǎng)服務(wù)經(jīng)理Tom的電話,他告訴我已經(jīng)有好幾個(gè)客戶投訴“夜間例行程序”沒能執(zhí)行完成,他們沒收到任何報(bào)告。我不由心頭一沉:為了按時(shí)交付軟件,我沒測(cè)試?yán)谐绦颉N覝y(cè)試了系統(tǒng)的其他大部分功能,但測(cè)試?yán)谐绦蛞M(fèi)好幾個(gè)小時(shí),而當(dāng)時(shí)我又必須交付軟件。因?yàn)楣收闲迯?fù)部分都不涉及例行程序部分的編碼,所以我也沒擔(dān)心會(huì)有什么不妥。

      收不到夜間報(bào)告,問題可就大了。修理工們會(huì)一時(shí)無事可忙但隨后又要超負(fù)荷工作,而且,有些電話客戶也可能會(huì)在這期間發(fā)現(xiàn)故障并投訴。要是弄丟一晚的數(shù)據(jù),某一服務(wù)區(qū)經(jīng)理肯定會(huì)打電話臭罵Tom。

      我啟動(dòng)實(shí)驗(yàn)室系統(tǒng),加載新軟件,然后開始對(duì)“夜間例行程序”進(jìn)行測(cè)試。幾小時(shí)后,運(yùn)行中斷。例行程序運(yùn)行失敗!如果我在匆忙交付軟件前對(duì)此進(jìn)行測(cè)試,就不會(huì)發(fā)生服務(wù)區(qū)丟失數(shù)據(jù)的事了,服務(wù)區(qū)經(jīng)理們這時(shí)也不會(huì)炮轟Tom了。

      我打電話給Tom,說我能重現(xiàn)問題了。Tom告訴我其他大部分客戶也已經(jīng)打電話抱怨了,并問我什么時(shí)候能解決問題。我說我也沒把握,但正在努力。同時(shí)我告訴他應(yīng)該建議客戶倒回去使用舊版軟件。Tom發(fā)火了,說那對(duì)客戶來說無疑是個(gè)雙重打擊,因?yàn)榭蛻舨粌H為此丟失了一整個(gè)晚上的數(shù)據(jù),而且還無法使用事先承諾的新功能。

      故障排查非常困難,每次測(cè)試就要好幾個(gè)小時(shí)。第一次修復(fù)失敗了。第二次也沒能成功。我試了好幾次,等我發(fā)現(xiàn)問題所在時(shí),好幾天已過去了。這期間,Tom每隔幾小時(shí)就打電話問我問題什么時(shí)候能解決,他還把那些服務(wù)區(qū)經(jīng)理喋喋不休的抱怨如數(shù)傳達(dá)給我,并一再告訴我讓那些客戶重新起用舊軟件令他多么尷尬。

      最后,我終于找出了缺陷所在,重新交付修復(fù)了問題的新程序,一切恢復(fù)正常。Tom也平靜下來,不再提這段插曲,畢竟,他不是我的上司。事后,我的老板過來對(duì)我說:“你最好別再犯同樣的錯(cuò)誤。”我只能默默地點(diǎn)點(diǎn)頭。

      經(jīng)過反省,我意識(shí)到?jīng)]有對(duì)例行程序進(jìn)行測(cè)試就交付軟件是不負(fù)責(zé)任的。為了如期交付產(chǎn)品,我忽略了測(cè)試環(huán)節(jié),整個(gè)過程中只考慮要如何保全自己的顏面,卻沒顧及客戶和雇主的聲譽(yù)。我本該早點(diǎn)兒擔(dān)起責(zé)任,告訴Tom測(cè)試還未完成、自己不能按時(shí)交付產(chǎn)品。那么做絕非易事,Tom一定會(huì)不高興,但客戶不會(huì)丟失數(shù)據(jù),客服經(jīng)理也不會(huì)打電話來轟炸。

      3 首先,不行損害之事

      那么,我們?cè)撊绾纬袚?dān)責(zé)任呢?的確有一些原則可供參考。援引“希波克拉底誓言”或許顯得有點(diǎn)夸張,但沒有比這更好的引據(jù)了。的確,作為一名有追求有抱負(fù)的專業(yè)人士,他的首要職責(zé)與目標(biāo)難道不正是盡其所能行有益之事嗎?

      軟件開發(fā)人員能做出什么壞事呢?從純軟件角度看,他可以破壞軟件的功能與架構(gòu)。我們會(huì)探討如何避免帶來這些破壞。

      3.1 不要破壞軟件功能

      顯然,我們希望軟件可以運(yùn)行。沒錯(cuò),我們中的大部分人今天之所以是程序員,是因?yàn)槲覀冊(cè)_發(fā)出可用的軟件,而且希望能再度體驗(yàn)?zāi)欠N成功創(chuàng)作的喜悅。但希望軟件有用的不單單是我們,客戶和雇主也希望它們能用。是啊,他們出錢,讓我們?nèi)ラ_發(fā)那些能按照他們意愿運(yùn)行的軟件。

      開發(fā)的軟件有bug會(huì)損害軟件的功能。因此,要做得專業(yè),就不能留下bug。

      “等等!”你肯定會(huì)說,“可是那是不可能的呀。軟件開發(fā)太復(fù)雜了,怎么可能會(huì)沒bug呢!”

      當(dāng)然,你說的沒錯(cuò)。軟件開發(fā)太復(fù)雜了,不可能沒什么bug。但很不幸,這并不能為你開脫。人體太復(fù)雜了,不可能盡知其全部,但醫(yī)生仍要發(fā)誓不傷害病人。如果他們都不拿“人體的復(fù)雜性”作托辭,我們又怎么能開脫自己的責(zé)任呢?

      如果你想成為專業(yè)的軟件工程師

      “你的意思是我們要追求完美嘍?”你可能會(huì)這樣抬杠吧?

      不,我其實(shí)是想告訴你,要對(duì)自己的不完美負(fù)責(zé)。代碼中難免會(huì)出現(xiàn)bug,但這并不意味著你不用對(duì)它們負(fù)責(zé);沒人能寫出完美的軟件,但這并不表示你不用對(duì)不完美負(fù)責(zé)。

      所謂專業(yè)人士,就是能對(duì)自己犯下的錯(cuò)誤負(fù)責(zé)的人,哪怕那些錯(cuò)誤實(shí)際上在所難免。所以,雄心勃勃的專業(yè)人士們,你們要練習(xí)的第一件事就是“道歉”。道歉是必要的,但還不夠。你不能一而再、再而三地犯相同的錯(cuò)誤。職業(yè)經(jīng)驗(yàn)多了之后,你的失誤率應(yīng)該快速減少,甚至漸近于零。失誤率永遠(yuǎn)不可能等于零,但你有責(zé)任讓它無限接近零。

      因此,發(fā)布軟件時(shí),你應(yīng)該確保QA找不出任何問題。故意發(fā)送明知有缺陷的代碼,這種做法是極其不專業(yè)的。什么樣的代碼是有缺陷的呢?那些你沒把握的代碼都是!

      有些家伙會(huì)把QA當(dāng)作啄木鳥看待。他們把自己沒有全盤檢查過的代碼發(fā)送過去,想等QA找出bug再反饋回來。沒錯(cuò),有些公司確實(shí)按照所發(fā)現(xiàn)的bug數(shù)來獎(jiǎng)勵(lì)測(cè)試人員,揪出的bug越多,獎(jiǎng)金越多。

      且不說這么做是否會(huì)大幅增加公司成本,嚴(yán)重?fù)p害軟件,是否會(huì)破壞計(jì)劃并讓企業(yè)對(duì)開發(fā)小組的信心打折扣,也不去評(píng)判這么做是否等同于懶惰失職,把自己沒把握的代碼發(fā)送給QA這么做本身就是不專業(yè)的。這違背了“不行損害之事”的原則。

      QA會(huì)發(fā)現(xiàn)bug嗎?可能會(huì)吧,所以,準(zhǔn)備好道歉吧,然后反思那些bug是怎么逃過你的注意的,想辦法防止它再次出現(xiàn)。

      每次QA找出問題時(shí),更糟糕的是用戶找出問題時(shí),你都該震驚羞愧,并決心以此為戒。

      你怎么知道代碼能否常運(yùn)行呢?很簡(jiǎn)單,測(cè)試!一遍遍地測(cè),翻來覆去、顛來倒去地測(cè),使出渾身解數(shù)來測(cè)!

      你或許會(huì)擔(dān)心這么狂測(cè)代碼會(huì)占用很多時(shí)間,畢竟,你還要趕進(jìn)度,要在截止日期前完工。如果不停地花時(shí)間做測(cè)試,你就沒時(shí)間寫別的代碼了。言之有理!所以要實(shí)行自動(dòng)化測(cè)試。寫一些隨時(shí)都能運(yùn)行的單元測(cè)試,然后盡可能多地執(zhí)行這些測(cè)試。

      要用這些自動(dòng)化單元測(cè)試去測(cè)多少代碼呢?還要說嗎?全部!全部都要測(cè)!

      我是在建議進(jìn)行百分百測(cè)試覆蓋嗎?不,我不是在建議,我是在要求!你寫的每一行代碼都要測(cè)試。完畢!

      這是不是不切實(shí)際?當(dāng)然不是。你寫代碼是因?yàn)橄雸?zhí)行它,如果你希望代碼可以執(zhí)行,那你就該知道它是否可行。而要知道它是否可行,就一定要對(duì)它進(jìn)行測(cè)試。

      我是開源項(xiàng)目FitNesse的主要貢獻(xiàn)者和代碼提交者。在寫作本書的時(shí)候,F(xiàn)itNesse的代碼有6萬多行。在這6萬行代碼中有2000多個(gè)單元測(cè)試,超過2.6萬行。Emma的報(bào)告顯示,這2000多個(gè)測(cè)試對(duì)代碼的覆蓋率約為90%。

      為什么只有90%呢?因?yàn)镋mma會(huì)忽略一些執(zhí)行的代碼。我確信實(shí)際的覆蓋率會(huì)比90%高許多。能達(dá)到100%嗎?不,達(dá)不到,100%只是個(gè)理想值。

      但是有些代碼不是很難測(cè)試嗎?是的,但之所以很難測(cè)試,是因?yàn)樵O(shè)計(jì)時(shí)就沒考慮如何測(cè)試。唯一的解決辦法就是要設(shè)計(jì)易于測(cè)試的代碼,最好是先寫測(cè)試,再寫要測(cè)的代碼。

      這一方法叫做測(cè)試驅(qū)動(dòng)開發(fā)(TDD),我們?cè)陔S后的章節(jié)里會(huì)繼續(xù)談到。

      FitNesse的整個(gè)QA流程即是執(zhí)行單元測(cè)試和驗(yàn)收測(cè)試。如果這些測(cè)試通過了,我就會(huì)發(fā)布軟件。這意味著我的QA流程大概需要3分鐘,只要我想要,可以隨時(shí)執(zhí)行完整的測(cè)試流程。

      沒錯(cuò),F(xiàn)itNesse即使有bug也不是什么人命關(guān)天的事,也不會(huì)有人為此損失幾百萬美元。值得一提的是FitNesse用戶上萬,但它的bug列表卻很短。

      當(dāng)然,也不排除有些系統(tǒng)因其任務(wù)極其關(guān)鍵特殊,不能只靠簡(jiǎn)短的自動(dòng)化測(cè)試來判斷軟件是否已經(jīng)足夠高質(zhì)量,是否可以投入使用。而且,作為開發(fā)人員,你需要有個(gè)相對(duì)迅捷可靠的機(jī)制,以此判斷所寫的代碼可否正常工作,并且不會(huì)干擾系統(tǒng)的其他部分。因此,你的自動(dòng)化測(cè)試至少要能夠讓你知道,你的系統(tǒng)很有可能通過QA的測(cè)試。

      3.2 不要破壞結(jié)構(gòu)

      成熟的專業(yè)開發(fā)人員知道,聰明人不會(huì)為了發(fā)布新功能而破壞結(jié)構(gòu)。結(jié)構(gòu)良好的代碼更靈活。以犧牲結(jié)構(gòu)為代價(jià),得不償失,將來必追悔莫及。

      所有軟件項(xiàng)目的根本指導(dǎo)原則是,軟件要易于修改。如果違背這條原則搭建僵化的結(jié)構(gòu),就破壞了構(gòu)筑整個(gè)行業(yè)的經(jīng)濟(jì)模型。

      簡(jiǎn)言之,你必須能讓修改不必花太高代價(jià)就可以完成。

      不幸的是,實(shí)在是已有太多的項(xiàng)目因結(jié)構(gòu)糟糕而深陷失敗的泥潭。那些曾經(jīng)只要幾天就能完成的任務(wù)現(xiàn)在需要耗費(fèi)幾周甚至幾個(gè)月的時(shí)間。急于重新樹立威望的管理層于是聘來更多的開發(fā)人員來加快項(xiàng)目進(jìn)度,但這些開發(fā)人員只會(huì)進(jìn)一步破壞結(jié)構(gòu),亂上添亂。

      描述如何創(chuàng)建靈活可維護(hù)的結(jié)構(gòu)的軟件設(shè)計(jì)原則和模式已經(jīng)有許多了。專業(yè)的軟件開發(fā)人員會(huì)牢記這些原則和模式,并在開發(fā)軟件時(shí)認(rèn)真遵循。但是其中有一條實(shí)在是沒幾個(gè)軟件開發(fā)人員會(huì)認(rèn)真照做,那就是,如果你希望自己的軟件靈活可變,那就應(yīng)該時(shí)常修改它!

      要想證明軟件易于修改,唯一辦法就是做些實(shí)際的修改。如果發(fā)現(xiàn)這些改動(dòng)并不像你預(yù)想的那樣簡(jiǎn)單,你便應(yīng)該改進(jìn)設(shè)計(jì),使后續(xù)修改變簡(jiǎn)單。

      該在什么時(shí)候做這些簡(jiǎn)單的小修改呢?隨時(shí)!關(guān)注哪個(gè)模塊,就對(duì)它做點(diǎn)簡(jiǎn)單的修改來改進(jìn)結(jié)構(gòu)。每次通讀代碼的時(shí)候,也可以不時(shí)調(diào)整一下結(jié)構(gòu)。

      這一策略有時(shí)也叫“無情重構(gòu)”,我把它叫作“童子軍訓(xùn)練守則”:對(duì)每個(gè)模塊,每檢入一次代碼,就要讓它比上次檢出時(shí)變得更為簡(jiǎn)潔。每次讀代碼,都別忘了進(jìn)行點(diǎn)滴的改善。

      這完全與大多數(shù)人對(duì)軟件的理解相反。他們認(rèn)為對(duì)上線運(yùn)行的軟件不斷地做修改是危險(xiǎn)的。錯(cuò)!讓軟件保持固定不變才是危險(xiǎn)的!如果一直不重構(gòu)代碼,等到最后不得不重構(gòu)時(shí),你就會(huì)發(fā)現(xiàn)代碼已經(jīng)“僵化了”。

      為什么大多數(shù)開發(fā)人員不敢不斷修改他的代碼呢?因?yàn)樗麄兒ε聲?huì)改壞代碼!為什么會(huì)有這樣的擔(dān)心呢?因?yàn)樗麄儧]做過測(cè)試。

      話題又回到測(cè)試上來了。如果你有一套覆蓋了全部代碼的自動(dòng)化測(cè)試,如果那套測(cè)試可以隨時(shí)快速執(zhí)行,那么你根本不會(huì)害怕修改代碼。怎樣才能證明你不怕修改代碼呢?那就是,你一直在改。

      專業(yè)開發(fā)人員對(duì)自己的代碼和測(cè)試極有把握,他們會(huì)極其瘋狂隨意地做各種修改。他們敢于隨心所欲修改類的名稱。在通讀代碼時(shí),如果發(fā)現(xiàn)一個(gè)冗長(zhǎng)的方法,他們肯定會(huì)將它拆分,重新組織。他們還會(huì)把switch語句改為多態(tài)結(jié)構(gòu),或者將繼承層次重構(gòu)成一條“命令鏈”。簡(jiǎn)單地說,他們對(duì)待代碼,就如同雕塑家對(duì)待泥巴那樣,要對(duì)它進(jìn)行不斷的變形與塑造。

      4 職業(yè)道德

      職業(yè)發(fā)展是你自己的事。雇主沒有義務(wù)確保你在職場(chǎng)能夠立于不敗之地,也沒義務(wù)培訓(xùn)你,送你參加各種會(huì)議或給你買各種書籍充電。這些都是你自己的事。將自己的職業(yè)發(fā)展寄希望于雇主的軟件開發(fā)人員將會(huì)很慘。

      有些雇主愿意為員工買各種書籍或送員工參加各種培訓(xùn)課程和會(huì)議。那樣挺不錯(cuò)的,說明他們待你不薄。但可千萬別就此認(rèn)為這些是雇主該做的。如果他們不為你做這些,你就該自己想辦法去做。

      另外,雇主也沒義務(wù)給你留學(xué)習(xí)時(shí)間。有些雇主會(huì)這么做,有些甚至要求你這么做。但是還是那句話,他們待你不薄,你應(yīng)該適當(dāng)表示感激。因?yàn)檫@些優(yōu)待不是你理所當(dāng)然就該享有的。

      雇主出了錢,你必須付出時(shí)間和精力。為了說明問題,就用一周工作40小時(shí)的美國(guó)標(biāo)準(zhǔn)來做參照吧。這40小時(shí)應(yīng)該用來解決雇主的問題,而不是你自己的問題。

      你應(yīng)該計(jì)劃每周工作60小時(shí)。前40小時(shí)是給雇主的,后20小時(shí)是給自己的。在這剩余的20小時(shí)里,你應(yīng)該看書、練習(xí)、學(xué)習(xí),或者做其他能提升職業(yè)能力的事情。

      你肯定會(huì)說:“那我的家庭該怎么辦?還有我的生活呢?難道我就該為雇主犧牲這些嗎?”

      在此,我不是說要占用你全部的業(yè)余時(shí)間。我是指每周額外增加20小時(shí),也就是大約每天3小時(shí)。如果你在午飯時(shí)間看看書,在通勤路上聽聽播客,花90分鐘學(xué)一門新的語言,那么你就都能兼顧到了。

      做個(gè)簡(jiǎn)單的計(jì)算吧。一周有168小時(shí),給你的雇主40小時(shí),為自己的職業(yè)發(fā)展留20小時(shí),剩下的108小時(shí)再留56小時(shí)給睡眠,那么還剩52小時(shí)可做其他的事呢。

      或許你不愿那么勤勉。沒問題。只是那樣的話你也不能自視為專業(yè)人士了,因?yàn)樗^“術(shù)業(yè)有專攻”那也是需要投入時(shí)間去追求的。

      或許你會(huì)覺得工作就該在上班時(shí)完成,不該再帶回家中。贊成!那20小時(shí)你不用為雇主工作。相反,你該為自己的職業(yè)發(fā)展工作。

      有時(shí)這兩者并不矛盾,而是一致的。有時(shí)你為雇主做的工作讓你個(gè)人的職業(yè)發(fā)展受益匪淺,這種情況下,在那20小時(shí)里花點(diǎn)時(shí)間為雇主工作也是合理的。但別忘了,那20小時(shí)是為你自己的。它們將會(huì)讓你成為更有價(jià)值的專業(yè)人士。

      或許你會(huì)覺得這樣做只會(huì)讓人精力枯竭。恰恰相反,這樣做其實(shí)能讓你免于枯竭匱乏。假設(shè)你是因?yàn)闊釔圮浖蔀檐浖_發(fā)者,渴望成為專業(yè)開發(fā)者的動(dòng)力也正是來自對(duì)軟件的熱情,那么在那20小時(shí)里,就應(yīng)該做能夠激發(fā)、強(qiáng)化你的熱情的事。那20小時(shí)應(yīng)該充滿樂趣!

      4.1 了解你的領(lǐng)域

      你知道什么是N-S(Nassi-Schneiderman)圖表嗎?如果不知道,那為什么不了解一下呢?你知道“米利型”(Mealy)和“摩爾型”(Moore)這兩種狀態(tài)機(jī)的差別嗎?你應(yīng)該知道的。你能不需查閱算法手冊(cè)就可寫出一個(gè)快速排序程序嗎?你知道“變換分析”(Transform Analysis)這個(gè)術(shù)語的意思嗎?你知道如何用數(shù)據(jù)流圖進(jìn)行功能分解嗎?你知道“臨時(shí)傳遞數(shù)據(jù)”(Tramp Data)的意思嗎?你聽說過“耦合性”(Conascence)嗎?什么是Parnas表呢?

      近50年來,各種觀點(diǎn)、實(shí)踐、技術(shù)、工具與術(shù)語在我們這一領(lǐng)域?qū)映霾桓F。你對(duì)這些了解多少呢?如果想成為一名專業(yè)開發(fā)者,那你就得對(duì)其中的相當(dāng)一大部分有所了解,而且要不斷擴(kuò)展這一知識(shí)面。

      為什么要了解這些呢?這一行業(yè)發(fā)展迅速,許多舊見解似乎也已經(jīng)過時(shí)了,不是嗎?前半句似乎是顯而易見的。確實(shí),行業(yè)正迅猛發(fā)展,而有趣的是,從多個(gè)方面來看,這種進(jìn)展都只是很淺層的。沒錯(cuò),我們不再需要為拿到編譯結(jié)果苦等上24小時(shí),我們也已經(jīng)可以寫出GB級(jí)別的系統(tǒng),我們置身覆蓋全球的網(wǎng)絡(luò)之中,各種信息唾手可得。但另一方面,我們還是跟50年前一樣,寫著各種if和while語句。所以,改變說多也多,說少也少。

      舊見解過時(shí)了這種說法明顯是不對(duì)的。過去50年中產(chǎn)生的理念,已經(jīng)過時(shí)的其實(shí)很少。有一部分理論確實(shí)在慢慢淡出,比如說“瀑布式開發(fā)”的理論確實(shí)不再流行了。但這并不表示我們不需要了解它,不需要知道它的長(zhǎng)處和短處。

      總的來說,那些在過去50年中來之不易的理念,絕大部分在今天仍像過去一樣富有價(jià)值,甚至寶貴了。

      別忘了桑塔亞納的詛咒:“不能銘記過去的人,注定要重蹈覆轍。”

      下面列出了每個(gè)專業(yè)軟件開發(fā)人員必須精通的事項(xiàng)。

      設(shè)計(jì)模式。必須能描述GOF書中的全部24種模式,同時(shí)還要有POSA書中的多數(shù)模式的實(shí)戰(zhàn)經(jīng)驗(yàn)。

      設(shè)計(jì)原則。必須了解SOLID原則,而且要深刻理解組件設(shè)計(jì)原則。

      方法。必須理解XP、Scrum、精益、看板、瀑布、結(jié)構(gòu)化分析及結(jié)構(gòu)化設(shè)計(jì)等。

      實(shí)踐。必須掌握測(cè)試驅(qū)動(dòng)開發(fā)、面向?qū)ο笤O(shè)計(jì)、結(jié)構(gòu)化編程、持續(xù)集成和結(jié)對(duì)編程。

      工件。必須了解如何使用UML圖、DFD圖、結(jié)構(gòu)圖、Petri網(wǎng)絡(luò)圖、狀態(tài)遷移圖表、流程圖和決策表。

      4.2 堅(jiān)持學(xué)習(xí)

      軟件行業(yè)的飛速改變,意味著軟件開發(fā)人員必須堅(jiān)持廣泛學(xué)習(xí)才不至于落伍。不寫代碼的架構(gòu)師必然遭殃,他們很快會(huì)發(fā)現(xiàn)自己跟不上時(shí)代了;不學(xué)習(xí)新語言的程序員同樣會(huì)遭殃,他們只能眼睜睜看著軟件業(yè)一路發(fā)展,把自己拋在后面;學(xué)不會(huì)新規(guī)矩和新技術(shù)的開發(fā)人員更可憐,他們只能在日漸淪落的時(shí)候看著身邊人越發(fā)優(yōu)秀。

      你會(huì)找那些已經(jīng)不看醫(yī)學(xué)期刊的醫(yī)生看病嗎?你會(huì)聘請(qǐng)那些不了解最新稅法和判例的稅務(wù)律師嗎?雇主們干嘛要聘用那些不能與時(shí)俱進(jìn)的開發(fā)人員呢?

      讀書,看相關(guān)文章,關(guān)注博客和微博,參加技術(shù)大會(huì),訪問用戶群,多參與讀書與學(xué)習(xí)小組。不懂就學(xué),不要畏難。如果你是.NET程序員,就去學(xué)學(xué)Java;如果你是Java程序員,就去學(xué)學(xué)Ruby;如果你是C語言程序員,就去學(xué)學(xué)Lisp;如果你真想練練腦子,就去學(xué)學(xué)Prolog和Forth吧!

      4.3 練習(xí)

      業(yè)精于勤。真正的專業(yè)人士往往勤學(xué)苦干,以求得自身技能的純熟精煉。只完成日常工作是不足以稱為練習(xí)的,那只能算是種執(zhí)行性質(zhì)的操作,而不是練習(xí)。練習(xí),指的是在日常工作之余專門練習(xí)技能,以期自我提升。

      對(duì)軟件開發(fā)人員來說,有什么可以用以操練的呢?乍一聽,這概念顯得荒唐。但是再仔細(xì)想一會(huì)兒,想想音樂家是如何掌握演練技能的。他們靠的不是表演,而是練習(xí)。他們又是如何練習(xí)的呢?首先,表演之前,都需要經(jīng)歷過特別的訓(xùn)練,音階、練習(xí)曲、不斷演奏等。他們一遍又一遍地訓(xùn)練自己的手指和意識(shí),保持技巧純熟。

      那么軟件開發(fā)者該怎樣來不斷訓(xùn)練自己呢?本書會(huì)用一整章的篇幅來談?wù)摳鞣N練習(xí)技巧,所以在此先不贅述了。簡(jiǎn)單說,我常用的一個(gè)技巧是重復(fù)做一些簡(jiǎn)單的練習(xí),如“保齡球游戲”或“素?cái)?shù)篩選”,我把這些練習(xí)叫作“卡塔”(kata)。卡塔有很多類型。

      卡塔的形式往往是一個(gè)有待解決的簡(jiǎn)單編程問題,比如編寫計(jì)算拆分某個(gè)整數(shù)的素?cái)?shù)因子等。練卡塔的目的不是找出解決方法(你已經(jīng)知道方法了),而是訓(xùn)練你的手指和大腦。

      每天我都會(huì)練一兩個(gè)卡塔,時(shí)間往往安排在正式投入工作之前。我可能會(huì)選用Java、Ruby、Clojure或其他我希望保持純熟的語言來練習(xí)。我會(huì)用卡塔來培養(yǎng)某種專門的技能,比如讓我的手指習(xí)慣點(diǎn)擊快捷鍵或習(xí)慣使用某些重構(gòu)技法等。

      不妨早晚都來個(gè)10分鐘的卡塔吧,把它當(dāng)作熱身練習(xí)或者靜心過程。

      4.4 合作

      學(xué)習(xí)的第二個(gè)最佳方法是與他人合作。專業(yè)軟件開發(fā)人員往往會(huì)更加努力地嘗試與他人一起編程、一起練習(xí)、一起設(shè)計(jì)、一起計(jì)劃,這樣他們可以從彼此身上學(xué)到很多東西,而且能在更短的時(shí)間內(nèi)更高質(zhì)量地完成更多工作。

      并不是讓你花全部時(shí)間一直和別人共事。獨(dú)處的時(shí)間也很重要。雖然我很喜歡和別人一起編程,但是如果不能經(jīng)常獨(dú)處,我也一樣會(huì)發(fā)瘋。

      4.5 輔導(dǎo)

      俗話說:教學(xué)相長(zhǎng)。想迅速牢固地掌握某些事實(shí)和觀念,最好的辦法就是與你負(fù)責(zé)指導(dǎo)的人交流這些內(nèi)容。這樣,傳道授業(yè)的同時(shí),導(dǎo)師也會(huì)從中受益。

      同樣,讓新人融入團(tuán)隊(duì)的最好辦法是和他們坐到一起,向他們傳授工作要訣。專業(yè)人士會(huì)視輔導(dǎo)新人為己任,他們不會(huì)放任未經(jīng)輔導(dǎo)的新手恣意妄為。

      4.6 了解業(yè)務(wù)領(lǐng)域

      每位專業(yè)軟件開發(fā)人員都有義務(wù)了解自己開發(fā)的解決方案所對(duì)應(yīng)的業(yè)務(wù)領(lǐng)域。如果編寫財(cái)務(wù)系統(tǒng),你就應(yīng)該對(duì)財(cái)務(wù)領(lǐng)域有所了解;如果編寫旅游應(yīng)用程序,那么你需要去了解旅游業(yè)。你未必需要成為該領(lǐng)域的專家,但你仍需要用功,付出相當(dāng)?shù)呐碚J(rèn)識(shí)業(yè)務(wù)領(lǐng)域。

      開始一個(gè)新領(lǐng)域的項(xiàng)目時(shí),應(yīng)當(dāng)讀一兩本該領(lǐng)域相關(guān)的書,要就該領(lǐng)域的基礎(chǔ)架構(gòu)與基本知識(shí)作客戶和用戶訪談,還應(yīng)當(dāng)花時(shí)間和業(yè)內(nèi)專家交流,了解他們的原則與價(jià)值觀念。

      最糟糕、最不專業(yè)的做法是,簡(jiǎn)單按照規(guī)格說明來編寫代碼,但卻對(duì)為什么那些業(yè)務(wù)需要那樣的規(guī)格定義不求甚解。相反,你應(yīng)該對(duì)這一領(lǐng)域有所了解,能辨別、質(zhì)疑規(guī)格說明書中的錯(cuò)誤。

      4.7 與雇主/客戶保持一致

      雇主的問題就是你的問題。你必須弄明白這些問題,并尋求最佳的解決方案。每次開發(fā)系統(tǒng),都應(yīng)該站在雇主的角度來思考,確保開發(fā)的功能真正能滿足雇主的需要。

      開發(fā)人員之間互相認(rèn)同是容易的,但把一方換成雇主,人們就容易產(chǎn)生“彼”“此”之分。專業(yè)人士會(huì)盡全力避免這樣的狹隘之見。

      4.8 謙遜

      編程是一種創(chuàng)造性活動(dòng)。寫代碼是無中生有的創(chuàng)造過程,我們大膽地從混沌之中創(chuàng)建秩序。我們自信地發(fā)布準(zhǔn)確無誤的指令,稍有差錯(cuò),機(jī)器的錯(cuò)誤行為就可能造成無法估量的損失。因此,編程也是極其自負(fù)的行為。

      專業(yè)人士知道自己自負(fù),不會(huì)故作謙遜。他們熟知自己的工作,并引以為榮;他們對(duì)自己的能力充滿自信,并因此勇于承擔(dān)有把握的風(fēng)險(xiǎn)。專業(yè)人士不是膽小鬼。

      然而,專業(yè)人士也知道自己會(huì)摔跟頭,自己的風(fēng)險(xiǎn)評(píng)估也有出錯(cuò)的時(shí)候,自己也有力不從心的時(shí)候。這時(shí)候,如果他們照照鏡子,會(huì)看到那個(gè)自負(fù)的傻瓜正對(duì)著自己笑。

      因此,在發(fā)現(xiàn)自己成為笑柄時(shí),專業(yè)人士會(huì)第一個(gè)發(fā)笑。他從不會(huì)嘲諷別人,自作自受時(shí)他會(huì)接受別人的嘲諷。反之,他則會(huì)一笑了之。他不會(huì)因別人犯錯(cuò)就對(duì)之橫加貶損,因?yàn)樗溃约河锌赡芫褪窍乱粋€(gè)犯錯(cuò)的人。

      專業(yè)人士都清楚自己的自負(fù),也知道上天會(huì)注意到這種自負(fù),并加以懲戒。如若果真遭遇挫折,最好的辦法就是按照霍華德說的——一笑了之吧!

      參考文獻(xiàn)

      [PPP2001]:Robert C. Martin, Principles, Patterns, and Practices of Agile Software Development, Upper Saddle River, NJ: Prentice Hall, 2002.

      軟件開發(fā) 單元測(cè)試

      版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實(shí)的內(nèi)容,請(qǐng)聯(lián)系我們jiasou666@gmail.com 處理,核實(shí)后本網(wǎng)站將在24小時(shí)內(nèi)刪除侵權(quán)內(nèi)容。

      上一篇:居然有這么多種定時(shí)任務(wù)的實(shí)現(xiàn)方式
      下一篇:動(dòng)態(tài)規(guī)劃的深入探討
      相關(guān)文章
      青青青亚洲精品国产| 99久久精品国产亚洲| 亚洲福利一区二区| 亚洲av无码无在线观看红杏| 国产午夜亚洲精品不卡电影| 亚洲AV成人片无码网站| 亚洲日本乱码卡2卡3卡新区| 亚洲成人网在线观看| 亚洲一区二区三区夜色 | 中文字幕在线亚洲精品| 亚洲一区二区三区乱码A| 色综合久久精品亚洲国产| 亚洲综合精品伊人久久| 亚洲人成高清在线播放| 亚洲黄色在线视频| 亚洲天天做日日做天天看| 相泽亚洲一区中文字幕| 国产精品亚洲精品日韩已方 | 亚洲综合精品网站在线观看| 亚洲熟女精品中文字幕| 亚洲国产日韩在线成人蜜芽| 亚洲综合男人的天堂色婷婷| 亚洲国产老鸭窝一区二区三区| 亚洲乳大丰满中文字幕| 亚洲中文字幕无码不卡电影| 久久精品国产精品亚洲艾草网美妙 | 亚洲精品97久久中文字幕无码| 亚洲第一页综合图片自拍| 亚洲第一成人在线| 久久久久精品国产亚洲AV无码| 亚洲国产精品白丝在线观看| 亚洲人成免费电影| 亚洲91精品麻豆国产系列在线| 亚洲女人18毛片水真多| 久久丫精品国产亚洲av不卡| 亚洲美女在线观看播放| 亚洲电影唐人社一区二区| 亚洲不卡中文字幕| 伊人久久综在合线亚洲2019| 亚洲视频在线免费看| 亚洲国产福利精品一区二区|