版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、程序員的素質(zhì)白楊2010-12-01眾所周知,軟件和硬件工程師個(gè)體間存在巨大的生產(chǎn)力差異:經(jīng)常有一個(gè)人一兩天就能做好的事情另一個(gè)人花一兩個(gè)月也沒能做到同樣好。Apple創(chuàng)始人史蒂夫·喬布斯曾在In the Company of Giants一書中接收采訪時(shí)提到:“一個(gè)最優(yōu)秀的人完成工作的能力能抵50到100個(gè)一般水平的人”。而軟件工程領(lǐng)域也經(jīng)常提到最好和最差的程序員之間的生產(chǎn)力差異超過1000倍,因?yàn)槿绻粋€(gè)程序員產(chǎn)出的代碼中包含了很多bug,需要其它程序員花費(fèi)大量時(shí)間去修正,那么他的生產(chǎn)力是負(fù)值。在世界名著人月神話中,作者也明確地提出了類似的觀點(diǎn):“最優(yōu)秀和一般的軟件工程實(shí)踐之間的
2、差距是非常大的,可能比其他工程領(lǐng)域中的差距都要大”。除了團(tuán)隊(duì)組織和項(xiàng)目管理等行政方面的問題;以及語(yǔ)文、數(shù)學(xué)、邏輯思維和形象思維等個(gè)人基礎(chǔ)素質(zhì)以外,到底是哪些專業(yè)素養(yǎng)導(dǎo)致了程序員個(gè)體間的巨大生產(chǎn)力差異呢?本文嘗試以由淺到深、由易到難的順序來討論程序員的個(gè)體素質(zhì)。1. 基本技術(shù)素養(yǎng)基本素養(yǎng)包含了每個(gè)程序員都應(yīng)當(dāng)牢固掌握和充分理解的技能和知識(shí)。基本素養(yǎng)中又可以分為前景知識(shí)和背景知識(shí)兩種。前景知識(shí):今天的程序員主要通過使用編程語(yǔ)言書寫代碼來完成軟件開發(fā)活動(dòng),前景知 識(shí)則特指程序員對(duì)其使用語(yǔ)言的掌握程度。這里所說的“掌握”并不是僅僅能夠?qū)懗龊戏ǖ拇a就行了,而是對(duì)語(yǔ)言中各種實(shí)現(xiàn)細(xì)節(jié)的深度掌握。如果一位程
3、序員未能透徹掌握他正在使用的程序設(shè)計(jì)語(yǔ)言,那他寫的程序就一定會(huì)或早或晚地出現(xiàn)一些至少在他看來有些“莫名其妙”的問題,比如:應(yīng)用程序時(shí)常莫名其妙地崩潰、經(jīng)常發(fā)生資源泄露、或是執(zhí)行過某些操作時(shí)性能差的離譜等等。以C+語(yǔ)言為例:正如大部分C程序員都能毫不費(fèi)力地將任意C源碼“肉眼翻譯”成偽匯編碼那樣,一個(gè)合格的C+程序員也應(yīng)當(dāng)可以做到將任意C+源碼“人腦編譯”為對(duì)應(yīng)的偽匯編碼。但現(xiàn)實(shí)的情況是由于C+新增了模板、虛函數(shù)、RTTI、虛基類、異常等大量高級(jí)特性,以至于能夠真正透徹掌握C+語(yǔ)言的程序員很少。除非完全不使用前文中列出的那些C+高級(jí)特性,僅把它作為一個(gè)“稍好的C”來使用。否則,對(duì)于任何一個(gè)職業(yè)程序
4、員來說,貿(mào)然地使用一種尚不了解其底層(編譯器或VM實(shí)現(xiàn)細(xì)節(jié)的語(yǔ)言特性是一件很危險(xiǎn)的事。類似的例子同樣適用于其它語(yǔ)言。不管是編譯型的(如:C/C+還是解釋/虛擬機(jī)型的(如:PHP、Java以及JavaScript程序設(shè)計(jì)語(yǔ)言,它們都有一些需要程序員事先透徹理解和掌握的實(shí)現(xiàn)細(xì)節(jié)。背景知識(shí):透徹地理解和掌握至少一門編程語(yǔ)言對(duì)任何一位職業(yè)程序員來講都是很重要 的基礎(chǔ)素質(zhì),但僅僅做到這點(diǎn)仍然是遠(yuǎn)遠(yuǎn)不夠的。想要產(chǎn)出具備現(xiàn)實(shí)意義的產(chǎn)品,還需要具備足夠的背景知識(shí)。以下,我們將背景知識(shí)分成“公共背景”和“領(lǐng)域背景”兩類,分別進(jìn)行討論。公共背景:公共背景包括了幾乎每個(gè)程序員都需要掌握的知識(shí)。從操作系統(tǒng)原理、 編譯
5、原理、數(shù)據(jù)結(jié)構(gòu)、離散數(shù)學(xué)、計(jì)算機(jī)組成原理、網(wǎng)絡(luò)原理等理論性知識(shí)到各種接口和實(shí)際環(huán)境的運(yùn)行時(shí)API(例如:對(duì)C/C+來講通常是操作系統(tǒng)API,對(duì)JavaScript來講通常是瀏覽器提供的API都是作為程序員必不可少的基礎(chǔ)。領(lǐng)域背景:領(lǐng)域背景中包含了與具體問題域相關(guān)的背景知識(shí),這些知識(shí)并不是每 個(gè)程序員都需要掌握的,但對(duì)于涉及該領(lǐng)域的開發(fā)人員來講卻必不可少。例如:對(duì)于要實(shí)現(xiàn)音頻編輯器的程序員來說,至少具備起碼的聲學(xué)背景;MIDI編曲軟件的作者需要樂理和和聲方面的知識(shí);OCR軟件的作者則要學(xué)習(xí)模式識(shí)別和圖像處理方面的理論等等。2. 思維的條理性和連貫性對(duì)于一個(gè)程序員來說,從產(chǎn)品的設(shè)計(jì)之初到其中組件的
6、逐一實(shí)現(xiàn)完成乃至最后的聯(lián)調(diào)。整個(gè)開發(fā)周期從始至終都需要保持清晰的條理和連貫的思維。以下準(zhǔn)則有助于幫助程序員在開發(fā)過程中始終保持思維的條理性和連貫性。3W準(zhǔn)則:我想每個(gè)程序員都應(yīng)該遵循3W準(zhǔn)則,即:每次在開始編寫代碼之前,都應(yīng) 當(dāng)先搞清楚What、Why、How三個(gè)問題。其中“What”指我們要做什么,也就是用戶的需求?!癢hy”表示為什么我們要做這件事,這是對(duì)需求和架構(gòu)的更深層理解。很多時(shí)候,只有充分了解了“為什么”以后,我們才能更好地完成設(shè)計(jì)(例如:使用更合適的算法和構(gòu)架,以及在架構(gòu)中預(yù)留恰當(dāng)?shù)慕涌诘鹊?。最后“How”從設(shè)計(jì)層面指明了應(yīng)當(dāng)以何種架構(gòu)、哪些模式和算法來最終構(gòu)建出產(chǎn)品。值得指出的
7、是,3W準(zhǔn)則不但適用與對(duì)系統(tǒng)進(jìn)行整體分析和設(shè)計(jì),同樣也應(yīng)當(dāng)利用在模塊或組件等粒度更細(xì)的層面上在開始著手編寫一個(gè)組件前,應(yīng)當(dāng)事先搞清楚這個(gè)組件的功能(What;需要在何處使用它、為什么需要用到它、它的典型用例和工作上下文(Why;最后是使用何種架構(gòu)、模式和算法來實(shí)現(xiàn)它(How。本質(zhì)上講,需求分析和總體設(shè)計(jì)的意義就是在系統(tǒng)的層面上回答以上三個(gè)問題??傮w設(shè)計(jì)使開發(fā)人員能夠?qū)Υ_發(fā)的產(chǎn)品在整體上有一個(gè)比較清晰的了解,知道當(dāng)前正在實(shí)現(xiàn)的組件處于系統(tǒng)中的什么位置。在著手實(shí)現(xiàn)一個(gè)組件前,如果程序員能先在組件的層面上搞清楚這三個(gè)問題,那么他就可以在一個(gè)目標(biāo)、動(dòng)機(jī)和實(shí)現(xiàn)方式都很清晰的狀態(tài)下開始工作。進(jìn)一步說,在
8、開始工作之前,清楚的知道自己要做什么以及如何完成手上的工作對(duì)于任何行業(yè)的從業(yè)人員來說都是非常重要的。遺憾的是,相當(dāng)多的程序員好像并不這么認(rèn)為。時(shí)刻保持清晰的邏輯:3W準(zhǔn)則讓我們?cè)趧?dòng)手前就清楚自己要做什么以及如何做。但在 具體實(shí)踐的時(shí)候我們還需要隨時(shí)清楚自己正在做什么?之前幾步分別做了哪些事?以及之后幾步還要干點(diǎn)啥?只有時(shí)刻了解自己“剛才”、“現(xiàn)在”、以及“將來”要做的事情,才能隨時(shí)保持思維連貫和條理清晰。以恰當(dāng)?shù)膶哟芜M(jìn)行思考:太高的層次過于抽象,而過低的層次容易讓我們揪住某些細(xì)節(jié) 問題不放。在合適的層次思考才能夠最有效地想出恰當(dāng)?shù)慕鉀Q方案。什么層次才算“恰當(dāng)”沒有簡(jiǎn)單的定論,這取決于產(chǎn)品的規(guī)模
9、和正在解決的問題。但是在碰到棘手問題的時(shí)候換個(gè)層面來重新考量往往能夠事倍功半。3. 高效的產(chǎn)品維護(hù)軟件產(chǎn)品的日常維護(hù)主要包含排錯(cuò)、Workaround、功能變更、架構(gòu)重構(gòu)等活動(dòng)。對(duì)于新手來說,花個(gè)幾天時(shí)間找“臭蟲”實(shí)屬常見(有句順口溜說的好:“鋤禾日當(dāng)午,不如coding苦,對(duì)著C+,一調(diào)一下午”。提高產(chǎn)品維護(hù)的效率就在很大程度上提高了程序員的生產(chǎn)力(因?yàn)橛懈嗟臅r(shí)間編寫新代碼。多年的經(jīng)驗(yàn)顯示,以下要點(diǎn)對(duì)于提高產(chǎn)品維護(hù)效率、以及提高產(chǎn)品質(zhì)量都有著不可忽視的作用:編碼規(guī)范:編碼規(guī)范對(duì)于軟件品質(zhì)的影響怎么強(qiáng)調(diào)都不過分。程序代碼作為一種文檔, 首先是供人類閱讀的。好的編碼規(guī)范能夠有效地降低錯(cuò)誤率、提
10、高可讀性、以及極大地曾強(qiáng)代碼的可維護(hù)性。換個(gè)角度來看,代碼只寫一次,但卻需要斷地進(jìn)行閱讀、理解、修改等維護(hù)工作。沒人愿意接手維護(hù)一大堆完全看不懂的代碼,在書寫時(shí)始終遵循一套完善的編碼規(guī)范則可以在很大程度上緩解這些問題。編碼規(guī)范對(duì)程序品質(zhì)和可維護(hù)性方面的影響就像鞋對(duì)人類的影響一樣:都屬于效果巨大,但跟沒體會(huì)過的人很難描述清楚的事情真是誰(shuí)用誰(shuí)知道。這可能也是為什么那么多公司都在強(qiáng)調(diào)它,同時(shí)那么多程序員卻又不重視它的原因所在光腳的不怕穿鞋的!錯(cuò)誤處理和日志:優(yōu)秀的錯(cuò)誤處理和日志記錄方式能節(jié)省大量排錯(cuò)時(shí)間,同時(shí)揭示產(chǎn)品 改進(jìn)的重要線索。在另一本世界名著Code Complete中,作者憑借其多年的軟件
11、行業(yè)經(jīng)驗(yàn)以及NASA、IBM等各大組織的長(zhǎng)期研究報(bào)告得出結(jié)論:“在絕大多數(shù)項(xiàng)目中,最大規(guī)模的活動(dòng)就是調(diào)試以及修改那些不能正常工作的代碼消除軟件缺陷實(shí)際上是最昂貴且最耗時(shí)的軟件工作”。這方面牽扯到的技術(shù)和技巧太多太雜,以至于沒有辦法給出一個(gè)總結(jié)性的描述。因此,這里只能以日常維護(hù)場(chǎng)景為例,舉一個(gè)簡(jiǎn)單的例子:試想一下,你有一個(gè)可以向系統(tǒng)syslog、網(wǎng)絡(luò)syslog server、磁盤文件、Event Log Service等等各種日志目的實(shí)時(shí)發(fā)送日志消息的記錄器,它能夠工作在調(diào)用線程或獨(dú)立的線程/進(jìn)程中,就算進(jìn)程崩潰它也能夠捕捉到足夠詳細(xì)的錯(cuò)誤信息,即使整個(gè)系統(tǒng)崩潰了也不會(huì)丟失重要的日志消息。與此
12、同時(shí),你所有組件中的任何操作發(fā)生錯(cuò)誤時(shí),都會(huì)準(zhǔn)確地將該操作的錯(cuò)誤信息、操作過程中產(chǎn)生錯(cuò)誤的模塊信息、該模塊調(diào)用的底層平臺(tái)API以及這個(gè)API返回的錯(cuò)誤信息等等的各級(jí)出錯(cuò)詳細(xì)信息都按照層次結(jié)構(gòu)如實(shí)地記錄到日志中。在這樣的環(huán)境中,無論是排錯(cuò)還是調(diào)優(yōu)是不是都會(huì)點(diǎn)單很多呢?正如前文所述,日志記錄和錯(cuò)誤處理是個(gè)很大的話題,足以著書立說。這個(gè)例子也只是揭示其冰山一角,從一個(gè)小小的側(cè)面來反映一套優(yōu)秀的日志記錄和錯(cuò)誤處理機(jī)制對(duì)排錯(cuò)和性能分析之類的活動(dòng)有多大幫助。環(huán)境和工具:熟練掌握開發(fā)編輯、分析統(tǒng)計(jì)、調(diào)試跟蹤等工具。優(yōu)秀的開發(fā)、分析、和 調(diào)試環(huán)境可以節(jié)省大量時(shí)間。盡量避免在不熟悉或者較“艱苦”的環(huán)境下分析和調(diào)
13、試程序。當(dāng)然,有時(shí)也會(huì)有一些不可避免的情況出現(xiàn)。比如:程序的最終目標(biāo)平臺(tái)是基于MIPS架構(gòu)的NetBSD,但開發(fā)人員最熟悉,各類工具最齊全的開發(fā)環(huán)境確實(shí) x86平臺(tái)下的Windows系統(tǒng)。對(duì)此,我們的解決方案是:實(shí)現(xiàn)一套與跨平臺(tái)的應(yīng)用支撐框架,這個(gè)支持框架向上封裝所有平臺(tái)相關(guān)的功能,為上層應(yīng)用提供統(tǒng)一的,平臺(tái)無關(guān)的API。然后使用該支撐框架在Windows(x86環(huán)境完成應(yīng)用的開發(fā)、分析和調(diào)試工作,然后在NetBSD(MIPS平臺(tái)上重新編譯并發(fā)布。其它因素:產(chǎn)品維護(hù)的成本還會(huì)受到很多其它因素的影響。比如在設(shè)計(jì)之初以3W原則 精心衡量過的方案可以避免很多后期不必要的變更;比如重用已經(jīng)經(jīng)過驗(yàn)證的可
14、靠組件不但節(jié)省了開發(fā)成本,而且也避免了重新實(shí)現(xiàn)產(chǎn)生的缺陷;再比如經(jīng)驗(yàn)、設(shè)計(jì)思想和品味對(duì)設(shè)計(jì)產(chǎn)生的影響等等。4. 標(biāo)準(zhǔn)化和重用標(biāo)準(zhǔn)化本質(zhì)上就是為重用做準(zhǔn)備。想要擁有大量標(biāo)準(zhǔn)的可重用組件需要長(zhǎng)時(shí)間的積累。當(dāng)然,我們這里提到的“標(biāo)準(zhǔn)化”并不僅僅是指ISO/IEC之類的國(guó)際標(biāo)準(zhǔn)或者GB之類的國(guó)家標(biāo)準(zhǔn)。實(shí)際上,小到公司甚至是個(gè)人也可以有自己的內(nèi)部標(biāo)準(zhǔn)(其實(shí)編碼規(guī)范就屬于這種內(nèi)部標(biāo)準(zhǔn)之一。C+之父Bjarne Stroustrup曾經(jīng)說過:產(chǎn)品開發(fā)就是重用已有標(biāo)準(zhǔn)組件、實(shí)現(xiàn)新的標(biāo)準(zhǔn)組件、然后將它們粘接起來的過程。想要自己實(shí)現(xiàn)一套完備的標(biāo)準(zhǔn)組件庫(kù)當(dāng)然需要長(zhǎng)時(shí)間的積累,但如果利用其它人已經(jīng)實(shí)現(xiàn)的現(xiàn)成庫(kù)呢?我們
15、知道,當(dāng)今的開源時(shí)代,能夠免費(fèi)取用的第三方功能庫(kù)數(shù)不勝數(shù)。但是使用第三方庫(kù)的成本也不低。具體表現(xiàn)在幾方面:首先,要用好它,你需要閱讀大量代碼和文檔;其次,掌握一個(gè)庫(kù)不光是會(huì)使用即可,一旦把它用到自己的產(chǎn)品里,那么當(dāng)它發(fā)生問題時(shí)你要修正、當(dāng)它不滿足要求時(shí)你要修改和重構(gòu)、當(dāng)它缺少功能時(shí)你要添加也就是說,一旦在自己的產(chǎn)品中使用了一套第三方庫(kù),那么維護(hù)它就是你的義務(wù),而要維護(hù)一大堆代碼,前提是你需要先讀懂這些代碼。最后,第三方庫(kù)的架構(gòu)和品質(zhì)不一定滿足你的要求,而且這個(gè)問題可能到最后才會(huì)被發(fā)現(xiàn)。例如:由于架構(gòu)的限制,Windows IOCP機(jī)制無法被在Boost庫(kù)asio組件良好地支持。如果你的產(chǎn)品使用
16、了asio組件,并且在開發(fā)的最后階段才考慮需要提供針對(duì)Windows平臺(tái)的支持,那么你將會(huì)面臨艱難選擇。再比如:你需要一套跨平臺(tái)C/C+框架,但Boost、Mozilla NSPR、Apache APR、GNU Common C+ 等均無法滿足你的需求(舉個(gè)最簡(jiǎn)單的例子:他們都支持對(duì)線程設(shè)置CPU粘滯屬性這也使你面臨兩難的選擇:是選擇其中一個(gè)庫(kù),大規(guī)模的修改它以滿足你的功能需求,并且忍受這個(gè)實(shí)現(xiàn)從架構(gòu)到編碼規(guī)范中所有你看不順眼的地方,同時(shí)還要日復(fù)一日地將官方補(bǔ)丁合并到你自己的私人分支。還是索性從頭開始建立自己的庫(kù)?當(dāng)然,無論你如何選擇,這些代價(jià)都是值得的。因?yàn)槲覀冎?程序員的生產(chǎn)力基本等同于
17、他在單位時(shí)間內(nèi)產(chǎn)出的有效代碼行數(shù)與其中每行代碼平均表達(dá)能力的乘積。即:生產(chǎn)力=有效代碼行數(shù)×每行代碼的表達(dá)能力大量使用標(biāo)準(zhǔn)組件不光獲得了由于組件被反復(fù)使用因而比較成熟的優(yōu)點(diǎn),而且也使得每行代碼的平均表達(dá)能力大大提高(比如:標(biāo)準(zhǔn)組件通過成千上萬行代碼封裝好的一個(gè)功能,使用一行代碼即可調(diào)用,這就使得程序員的生產(chǎn)力能夠以乘積的形式增長(zhǎng)。5. 經(jīng)驗(yàn)和設(shè)計(jì)思想經(jīng)驗(yàn)和個(gè)人品味是永遠(yuǎn)也無法被替代的。Stroustrup曾說:任何一個(gè)成功的產(chǎn)品中都必然充斥著其作者的味道。這話雖然有一定夸張的成分,但也不可否認(rèn),設(shè)計(jì)者的經(jīng)驗(yàn)和品味會(huì)極大地影響產(chǎn)品的最終品質(zhì)。而設(shè)計(jì)思想其實(shí)是來自于經(jīng)驗(yàn)的總結(jié)和升華,當(dāng)然其中也糅合了個(gè)人的品味與喜好。因此,設(shè)計(jì)思想只有成熟和幼稚的區(qū)別,而成熟的設(shè)計(jì)思想之間很難有好壞之分成熟的思維各有各的老練之處,但所有人幼稚起來則是大同小異的。6. 人品(態(tài)度這標(biāo)題
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2023年四川省成都市公開招聘警務(wù)輔助人員輔警筆試自考題1卷含答案
- 2023年甘肅省酒泉市公開招聘警務(wù)輔助人員輔警筆試自考題2卷含答案
- 2024年湖北省孝感市公開招聘警務(wù)輔助人員輔警筆試自考題2卷含答案
- 2022年青海省西寧市公開招聘警務(wù)輔助人員輔警筆試自考題1卷含答案
- 2024年廣東省韶關(guān)市公開招聘警務(wù)輔助人員輔警筆試自考題1卷含答案
- 頒獎(jiǎng)晚會(huì)發(fā)言稿
- 個(gè)人借條范本整合
- 霸氣押韻的班級(jí)口號(hào)
- 湖北省省直轄行政單位(2024年-2025年小學(xué)六年級(jí)語(yǔ)文)部編版質(zhì)量測(cè)試(下學(xué)期)試卷及答案
- 廣東省陽(yáng)江市(2024年-2025年小學(xué)六年級(jí)語(yǔ)文)部編版階段練習(xí)(上學(xué)期)試卷及答案
- 《基因突變的機(jī)制》課件
- 天安門地區(qū)地下空間開發(fā)利用策略-洞察分析
- 《基層管理者職業(yè)素養(yǎng)與行為規(guī)范》考核試題及答案
- 公共關(guān)系理論與實(shí)務(wù)教程 課件 項(xiàng)目九-公共關(guān)系危機(jī)管理
- 椎間孔鏡治療腰椎間盤突出
- 2024年融媒體中心事業(yè)單位考試招考142人500題大全加解析答案
- 2024-2025學(xué)年 語(yǔ)文二年級(jí)上冊(cè)統(tǒng)編版期末測(cè)試卷(含答案)
- 期末測(cè)試題二(含答案)2024-2025學(xué)年譯林版七年級(jí)英語(yǔ)上冊(cè)
- 大創(chuàng)賽項(xiàng)目書
- 產(chǎn)品質(zhì)量知識(shí)培訓(xùn)課件
- 乳腺旋切手術(shù)
評(píng)論
0/150
提交評(píng)論