- 代碼整潔之道:程序員的職業(yè)素養(yǎng)
- (美)羅伯特·C.馬丁
- 3805字
- 2025-01-09 17:19:10
1.4 職業(yè)道德
職業(yè)發(fā)展是你自己的事。雇主沒(méi)有義務(wù)確保你在職場(chǎng)能夠立于不敗之地,也沒(méi)義務(wù)培訓(xùn)你,送你參加各種會(huì)議或給你買(mǎi)各種書(shū)籍充電。這些都是你自己的事。將自己的職業(yè)發(fā)展寄希望于雇主的軟件開(kāi)發(fā)人員將會(huì)很慘。
有些雇主愿意為員工買(mǎi)各種書(shū)籍或送員工參加各種培訓(xùn)課程和會(huì)議。那樣挺不錯(cuò)的,說(shuō)明他們待你不薄。但可千萬(wàn)別就此認(rèn)為這些是雇主該做的。如果他們不為你做這些,你就該自己想辦法去做。
另外,雇主也沒(méi)義務(wù)給你留學(xué)習(xí)時(shí)間。有些雇主會(huì)這么做,有些甚至要求你這么做。但是還是那句話(huà),他們待你不薄,你應(yīng)該適當(dāng)表示感激。因?yàn)檫@些優(yōu)待不是你理所當(dāng)然就該享有的。
雇主出了錢(qián),你必須付出時(shí)間和精力。為了說(shuō)明問(wèn)題,就用一周工作40小時(shí)的美國(guó)標(biāo)準(zhǔn)來(lái)做參照吧。這40小時(shí)應(yīng)該用來(lái)解決雇主的問(wèn)題,而不是你自己的問(wèn)題。
你應(yīng)該計(jì)劃每周工作60小時(shí)。前40小時(shí)是給雇主的,后20小時(shí)是給自己的。在這剩余的20小時(shí)里,你應(yīng)該看書(shū)、練習(xí)、學(xué)習(xí),或者做其他能提升職業(yè)能力的事情。
你肯定會(huì)說(shuō):“那我的家庭該怎么辦?還有我的生活呢?難道我就該為雇主犧牲這些嗎?”
在此,我不是說(shuō)要占用你全部的業(yè)余時(shí)間。我是指每周額外增加20小時(shí),也就是大約每天3小時(shí)。如果你在午飯時(shí)間看看書(shū),在通勤路上聽(tīng)聽(tīng)播客,花90分鐘學(xué)一門(mén)新的語(yǔ)言,那么你就都能兼顧到了。
做個(gè)簡(jiǎn)單的計(jì)算吧。一周有168小時(shí),給你的雇主40小時(shí),為自己的職業(yè)發(fā)展留20小時(shí),剩下的108小時(shí)再留56小時(shí)給睡眠,那么還剩52小時(shí)可做其他的事呢。
或許你不愿那么勤勉。沒(méi)問(wèn)題。只是那樣的話(huà)你也不能自視為專(zhuān)業(yè)人士了,因?yàn)樗^“術(shù)業(yè)有專(zhuān)攻”那也是需要投入時(shí)間去追求的。
或許你會(huì)覺(jué)得工作就該在上班時(shí)完成,不該再帶回家中。贊成!那20小時(shí)你不用為雇主工作。相反,你該為自己的職業(yè)發(fā)展工作。
有時(shí)這兩者并不矛盾,而是一致的。有時(shí)你為雇主做的工作讓你個(gè)人的職業(yè)發(fā)展受益匪淺,這種情況下,在那20小時(shí)里花點(diǎn)時(shí)間為雇主工作也是合理的。但別忘了,那20小時(shí)是為你自己的。它們將會(huì)讓你成為更有價(jià)值的專(zhuān)業(yè)人士。
或許你會(huì)覺(jué)得這樣做只會(huì)讓人精力枯竭。恰恰相反,這樣做其實(shí)能讓你免于枯竭匱乏。假設(shè)你是因?yàn)闊釔?ài)軟件而成為軟件開(kāi)發(fā)者,渴望成為專(zhuān)業(yè)開(kāi)發(fā)者的動(dòng)力也正是來(lái)自對(duì)軟件的熱情,那么在那20小時(shí)里,就應(yīng)該做能夠激發(fā)、強(qiáng)化你的熱情的事。那20小時(shí)應(yīng)該充滿(mǎn)樂(lè)趣!
1.4.1 了解你的領(lǐng)域
你知道什么是N-S(Nassi-Schneiderman)圖表嗎?如果不知道,那為什么不了解一下呢?你知道“米利型”(Mealy)和“摩爾型”(Moore)這兩種狀態(tài)機(jī)的差別嗎?你應(yīng)該知道的。你能不需查閱算法手冊(cè)就可寫(xiě)出一個(gè)快速排序程序嗎?你知道“變換分析”(Transform Analysis)這個(gè)術(shù)語(yǔ)的意思嗎?你知道如何用數(shù)據(jù)流圖進(jìn)行功能分解嗎?你知道“臨時(shí)傳遞數(shù)據(jù)”(Tramp Data)的意思嗎?你聽(tīng)說(shuō)過(guò)“耦合性”(Conascence)嗎?什么是Parnas表呢?
近50年來(lái),各種觀(guān)點(diǎn)、實(shí)踐、技術(shù)、工具與術(shù)語(yǔ)在我們這一領(lǐng)域?qū)映霾桓F。你對(duì)這些了解多少呢?如果想成為一名專(zhuān)業(yè)開(kāi)發(fā)者,那你就得對(duì)其中的相當(dāng)一大部分有所了解,而且要不斷擴(kuò)展這一知識(shí)面。
為什么要了解這些呢?這一行業(yè)發(fā)展迅速,許多舊見(jiàn)解似乎也已經(jīng)過(guò)時(shí)了,不是嗎?前半句似乎是顯而易見(jiàn)的。確實(shí),行業(yè)正迅猛發(fā)展,而有趣的是,從多個(gè)方面來(lái)看,這種進(jìn)展都只是很淺層的。沒(méi)錯(cuò),我們不再需要為拿到編譯結(jié)果苦等上24小時(shí),我們也已經(jīng)可以寫(xiě)出GB級(jí)別的系統(tǒng),我們置身覆蓋全球的網(wǎng)絡(luò)之中,各種信息唾手可得。但另一方面,我們還是跟50年前一樣,寫(xiě)著各種if和while語(yǔ)句。所以,改變說(shuō)多也多,說(shuō)少也少。
舊見(jiàn)解過(guò)時(shí)了這種說(shuō)法明顯是不對(duì)的。過(guò)去50年中產(chǎn)生的理念,已經(jīng)過(guò)時(shí)的其實(shí)很少。有一部分理論確實(shí)在慢慢淡出,比如說(shuō)“瀑布式開(kāi)發(fā)”的理論確實(shí)不再流行了。但這并不表示我們不需要了解它,不需要知道它的長(zhǎng)處和短處。
總的來(lái)說(shuō),那些在過(guò)去50年中來(lái)之不易的理念,絕大部分在今天仍像過(guò)去一樣富有價(jià)值,甚至寶貴了。
別忘了桑塔亞納的詛咒:“不能銘記過(guò)去的人,注定要重蹈覆轍。”
下面列出了每個(gè)專(zhuān)業(yè)軟件開(kāi)發(fā)人員必須精通的事項(xiàng)。
· 設(shè)計(jì)模式。必須能描述GOF書(shū)中的全部24種模式,同時(shí)還要有POSA書(shū)中的多數(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)開(kāi)發(fā)、面向?qū)ο笤O(shè)計(jì)、結(jié)構(gòu)化編程、持續(xù)集成和結(jié)對(duì)編程。
· 工件。必須了解如何使用UML圖、DFD圖、結(jié)構(gòu)圖、Petri網(wǎng)絡(luò)圖、狀態(tài)遷移圖表、流程圖和決策表。
1.4.2 堅(jiān)持學(xué)習(xí)
軟件行業(yè)的飛速改變,意味著軟件開(kāi)發(fā)人員必須堅(jiān)持廣泛學(xué)習(xí)才不至于落伍。不寫(xiě)代碼的架構(gòu)師必然遭殃,他們很快會(huì)發(fā)現(xiàn)自己跟不上時(shí)代了;不學(xué)習(xí)新語(yǔ)言的程序員同樣會(huì)遭殃,他們只能眼睜睜看著軟件業(yè)一路發(fā)展,把自己拋在后面;學(xué)不會(huì)新規(guī)矩和新技術(shù)的開(kāi)發(fā)人員更可憐,他們只能在日漸淪落的時(shí)候看著身邊人越發(fā)優(yōu)秀。
你會(huì)找那些已經(jīng)不看醫(yī)學(xué)期刊的醫(yī)生看病嗎?你會(huì)聘請(qǐng)那些不了解最新稅法和判例的稅務(wù)律師嗎?雇主們干嗎要聘用那些不能與時(shí)俱進(jìn)的開(kāi)發(fā)人員呢?
讀書(shū),看相關(guān)文章,關(guān)注博客和微博,參加技術(shù)大會(huì),訪(fǎng)問(wèn)用戶(hù)群,多參與讀書(shū)與學(xué)習(xí)小組。不懂就學(xué),不要畏難。如果你是.NET程序員,就去學(xué)學(xué)Java;如果你是Java程序員,就去學(xué)學(xué)Ruby;如果你是C語(yǔ)言程序員,就去學(xué)學(xué)Lisp;如果你真想練練腦子,就去學(xué)學(xué)Prolog和Forth吧!
1.4.3 練習(xí)
業(yè)精于勤。真正的專(zhuān)業(yè)人士往往勤學(xué)苦干,以求得自身技能的純熟精煉。只完成日常工作是不足以稱(chēng)為練習(xí)的,那只能算是種執(zhí)行性質(zhì)的操作,而不是練習(xí)。練習(xí),指的是在日常工作之余專(zhuān)門(mén)練習(xí)技能,以期自我提升。
對(duì)軟件開(kāi)發(fā)人員來(lái)說(shuō),有什么可以用以操練的呢?乍一聽(tīng),這概念顯得荒唐。但是再仔細(xì)想一會(huì)兒,想想音樂(lè)家是如何掌握演練技能的。他們靠的不是表演,而是練習(xí)。他們又是如何練習(xí)的呢?首先,表演之前,都需要經(jīng)歷過(guò)特別的訓(xùn)練,音階、練習(xí)曲、不斷演奏等。他們一遍又一遍地訓(xùn)練自己的手指和意識(shí),保持技巧純熟。
那么軟件開(kāi)發(fā)者該怎樣來(lái)不斷訓(xùn)練自己呢?本書(shū)會(huì)用一整章的篇幅來(lái)談?wù)摳鞣N練習(xí)技巧,所以在此先不贅述了。簡(jiǎn)單說(shuō),我常用的一個(gè)技巧是重復(fù)做一些簡(jiǎn)單的練習(xí),如“保齡球游戲”或“素?cái)?shù)篩選”,我把這些練習(xí)叫作“卡塔”(kata)[3]。卡塔有很多類(lèi)型。
卡塔的形式往往是一個(gè)有待解決的簡(jiǎn)單編程問(wèn)題,比如編寫(xiě)計(jì)算拆分某個(gè)整數(shù)的素?cái)?shù)因子等。練卡塔的目的不是找出解決方法(你已經(jīng)知道方法了),而是訓(xùn)練你的手指和大腦。
每天我都會(huì)練一兩個(gè)卡塔,時(shí)間往往安排在正式投入工作之前。我可能會(huì)選用Java、Ruby、Clojure或其他我希望保持純熟的語(yǔ)言來(lái)練習(xí)。我會(huì)用卡塔來(lái)培養(yǎng)某種專(zhuān)門(mén)的技能,比如讓我的手指習(xí)慣點(diǎn)擊快捷鍵或習(xí)慣使用某些重構(gòu)技法等。
不妨早晚都來(lái)個(gè)10分鐘的卡塔吧,把它當(dāng)作熱身練習(xí)或者靜心過(guò)程。
1.4.4 合作
學(xué)習(xí)的第二個(gè)最佳方法是與他人合作。專(zhuān)業(yè)軟件開(kāi)發(fā)人員往往會(huì)更加努力地嘗試與他人一起編程、一起練習(xí)、一起設(shè)計(jì)、一起計(jì)劃,這樣他們可以從彼此身上學(xué)到很多東西,而且能在更短的時(shí)間內(nèi)更高質(zhì)量地完成更多工作。
并不是讓你花全部時(shí)間一直和別人共事。獨(dú)處的時(shí)間也很重要。雖然我很喜歡和別人一起編程,但是如果不能經(jīng)常獨(dú)處,我也一樣會(huì)發(fā)瘋。
1.4.5 輔導(dǎo)
俗話(huà)說(shuō):教學(xué)相長(zhǎng)。想迅速牢固地掌握某些事實(shí)和觀(guān)念,最好的辦法就是與你負(fù)責(zé)指導(dǎo)的人交流這些內(nèi)容。這樣,傳道授業(yè)的同時(shí),導(dǎo)師也會(huì)從中受益。
同樣,讓新人融入團(tuán)隊(duì)的最好辦法是和他們坐到一起,向他們傳授工作要訣。專(zhuān)業(yè)人士會(huì)視輔導(dǎo)新人為己任,他們不會(huì)放任未經(jīng)輔導(dǎo)的新手恣意妄為。
1.4.6 了解業(yè)務(wù)領(lǐng)域
每位專(zhuān)業(yè)軟件開(kāi)發(fā)人員都有義務(wù)了解自己開(kāi)發(fā)的解決方案所對(duì)應(yīng)的業(yè)務(wù)領(lǐng)域。如果編寫(xiě)財(cái)務(wù)系統(tǒng),你就應(yīng)該對(duì)財(cái)務(wù)領(lǐng)域有所了解;如果編寫(xiě)旅游應(yīng)用程序,那么你需要去了解旅游業(yè)。你未必需要成為該領(lǐng)域的專(zhuān)家,但你仍需要用功,付出相當(dāng)?shù)呐?lái)認(rèn)識(shí)業(yè)務(wù)領(lǐng)域。
開(kāi)始一個(gè)新領(lǐng)域的項(xiàng)目時(shí),應(yīng)當(dāng)讀一兩本該領(lǐng)域相關(guān)的書(shū),要就該領(lǐng)域的基礎(chǔ)架構(gòu)與基本知識(shí)作客戶(hù)和用戶(hù)訪(fǎng)談,還應(yīng)當(dāng)花時(shí)間和業(yè)內(nèi)專(zhuān)家交流,了解他們的原則與價(jià)值觀(guān)念。
最糟糕、最不專(zhuān)業(yè)的做法是,簡(jiǎn)單按照規(guī)格說(shuō)明來(lái)編寫(xiě)代碼,但卻對(duì)為什么那些業(yè)務(wù)需要那樣的規(guī)格定義不求甚解。相反,你應(yīng)該對(duì)這一領(lǐng)域有所了解,能辨別、質(zhì)疑規(guī)格說(shuō)明書(shū)中的錯(cuò)誤。
1.4.7 與雇主/客戶(hù)保持一致
雇主的問(wèn)題就是你的問(wèn)題。你必須弄明白這些問(wèn)題,并尋求最佳的解決方案。每次開(kāi)發(fā)系統(tǒng),都應(yīng)該站在雇主的角度來(lái)思考,確保開(kāi)發(fā)的功能真正能滿(mǎn)足雇主的需要。
開(kāi)發(fā)人員之間互相認(rèn)同是容易的,但把一方換成雇主,人們就容易產(chǎn)生“彼”“此”之分。專(zhuān)業(yè)人士會(huì)盡全力避免這樣的狹隘之見(jiàn)。
1.4.8 謙遜
編程是一種創(chuàng)造性活動(dòng)。寫(xiě)代碼是無(wú)中生有的創(chuàng)造過(guò)程,我們大膽地從混沌之中創(chuàng)建秩序。我們自信地發(fā)布準(zhǔn)確無(wú)誤的指令,稍有差錯(cuò),機(jī)器的錯(cuò)誤行為就可能造成無(wú)法估量的損失。因此,編程也是極其自負(fù)的行為。
專(zhuān)業(yè)人士知道自己自負(fù),不會(huì)故作謙遜。他們熟知自己的工作,并引以為榮;他們對(duì)自己的能力充滿(mǎn)自信,并因此勇于承擔(dān)有把握的風(fēng)險(xiǎn)。專(zhuān)業(yè)人士不是膽小鬼。
然而,專(zhuān)業(yè)人士也知道自己會(huì)摔跟頭,自己的風(fēng)險(xiǎn)評(píng)估也有出錯(cuò)的時(shí)候,自己也有力不從心的時(shí)候。這時(shí)候,如果他們照照鏡子,會(huì)看到那個(gè)自負(fù)的傻瓜正對(duì)著自己笑。
因此,在發(fā)現(xiàn)自己成為笑柄時(shí),專(zhuān)業(yè)人士會(huì)第一個(gè)發(fā)笑。他從不會(huì)嘲諷別人,自作自受時(shí)他會(huì)接受別人的嘲諷。反之,他則會(huì)一笑了之。他不會(huì)因別人犯錯(cuò)就對(duì)之橫加貶損,因?yàn)樗溃约河锌赡芫褪窍乱粋€(gè)犯錯(cuò)的人。
專(zhuān)業(yè)人士都清楚自己的自負(fù),也知道上天會(huì)注意到這種自負(fù),并加以懲戒。如若果真遭遇挫折,最好的辦法就是按照霍華德說(shuō)的——一笑了之吧!
- 程序員修煉之道:程序設(shè)計(jì)入門(mén)30講
- 玩轉(zhuǎn)Scratch少兒趣味編程
- Java程序設(shè)計(jì)實(shí)戰(zhàn)教程
- Unity 2020 Mobile Game Development
- Servlet/JSP深入詳解
- Amazon S3 Cookbook
- Mastering ServiceNow(Second Edition)
- 快速念咒:MySQL入門(mén)指南與進(jìn)階實(shí)戰(zhàn)
- Mathematica Data Analysis
- Hands-On Reinforcement Learning with Python
- Hands-On Full Stack Development with Go
- 程序設(shè)計(jì)基礎(chǔ)教程:C語(yǔ)言
- Oracle 18c 必須掌握的新特性:管理與實(shí)戰(zhàn)
- Android傳感器開(kāi)發(fā)與智能設(shè)備案例實(shí)戰(zhàn)
- JavaScript應(yīng)用開(kāi)發(fā)實(shí)踐指南