成為優(yōu)秀碼農(nóng)的十二項(xiàng)自我修養(yǎng)
譯文
【51CTO.com快譯】業(yè)界有著這樣一個(gè)普遍的誤解:要成為一名優(yōu)秀的程序員,就必須掌握許多種編程語(yǔ)言和工具。實(shí)際情況是這樣嗎?也許下面給出的十二條建議會(huì)讓您或多或少地改變對(duì)此的認(rèn)同感。
1.研究數(shù)據(jù)結(jié)構(gòu)
計(jì)算機(jī)科學(xué)家Niklaus Wirth曾經(jīng)有過一個(gè)著名論斷:“數(shù)據(jù)結(jié)構(gòu)+算法=程序”。可見,數(shù)據(jù)結(jié)構(gòu)是計(jì)算機(jī)程序的基礎(chǔ),它們就像構(gòu)造房屋的磚頭一樣。實(shí)際上,數(shù)據(jù)結(jié)構(gòu)決定了程序?qū)⑷绾慰焖儆行У亟鉀Q問題。一旦使用了正確的數(shù)據(jù)結(jié)構(gòu),您的程序方案會(huì)變得既簡(jiǎn)單,又省時(shí)。
那么,我們?cè)撊绾窝芯繑?shù)據(jù)結(jié)構(gòu)呢?
- 首先,選擇一本好書,以理解并掌握有關(guān)如何設(shè)計(jì)和執(zhí)行數(shù)據(jù)結(jié)構(gòu)。在此,我推薦Narasimha Karumanchi撰寫的《輕松實(shí)現(xiàn)數(shù)據(jù)結(jié)構(gòu)和算法》(Data Structures and Algorithms Made Easy,https://amzn.to/34DxomJ)一書。這是C/C++版本的,您也可以通過鏈接:https://amzn.to/2NZ3W4E,找到其對(duì)應(yīng)的Java版本。
- 其次,嘗試從頭開始實(shí)現(xiàn)一些數(shù)據(jù)結(jié)構(gòu),例如:列表、堆棧和隊(duì)列。您不僅可以深刻地理解到它們的工作原理,而且還能夠通過“重新發(fā)明”這些數(shù)據(jù)結(jié)構(gòu)來(lái)提高編程的技能。
- 第三,試用那些由自己常用的編程語(yǔ)言所提供的內(nèi)置數(shù)據(jù)結(jié)構(gòu)(如果是Java,則對(duì)應(yīng)的是Collections框架)。例如:使用不同的列表,通過索引來(lái)快速訪問各種元素;將集合用于元素的隨機(jī)排列;使用隊(duì)列進(jìn)行producer-consumer的處理等。
- 第四,在編寫代碼之前,請(qǐng)認(rèn)真思考并選擇出最適合于解決問題的數(shù)據(jù)結(jié)構(gòu)。當(dāng)然,您不必重復(fù)造輪子,請(qǐng)盡量利用當(dāng)前編程語(yǔ)言所提供的現(xiàn)有數(shù)據(jù)結(jié)構(gòu)。
2.學(xué)習(xí)算法
如果說數(shù)據(jù)結(jié)構(gòu)抽象出了問題的輸入和輸出的話,那么算法則決定了系統(tǒng)該如何解決問題。優(yōu)秀的程序員一般都能善于使用經(jīng)過實(shí)際檢驗(yàn)的算法、并編寫出新的算法。
由于算法不僅需要良好的邏輯思維,而且需要一定的數(shù)學(xué)能力,因此它是編程中最難學(xué)習(xí)的部分之一。如果您能夠靈活運(yùn)用自己擅長(zhǎng)的各種算法,那么您將很容易從編程人群中脫穎而出。
不過,好消息是:您不必從頭開始發(fā)明各種算法,只需要學(xué)習(xí)和使用那些經(jīng)過實(shí)際檢驗(yàn)的實(shí)用算法便可。我建議您至少對(duì)如下基本算法有一定的了解:排序(快速排序、合并排序等),二進(jìn)制搜索,遞歸,圖檢索,greedy,密碼學(xué)相關(guān)基礎(chǔ)知識(shí),以及復(fù)雜的big O表示法。
那么,我們應(yīng)該如何學(xué)習(xí)算法呢?除了上述提到的數(shù)據(jù)結(jié)構(gòu)書籍之外,我建議您通過選讀《算法簡(jiǎn)介》(Introduction to Algorithms,https://amzn.to/2NWOoyw)一書,以獲取相關(guān)的概念,并從頭開始實(shí)現(xiàn)那些熱門的算法。通常,您可以試著通過自行編程來(lái)模擬算法的運(yùn)作原理。例如,您可以編寫一個(gè)程序,以可視化的方式顯示快速排序算法的工作方式。籍此,您不但可以學(xué)到許多相關(guān)概念,并且能夠大幅提高自己的編碼技能。
3.研究設(shè)計(jì)模式
雖說編程就是為問題尋找的某種解決方案,但是方案本身也可能會(huì)面臨各種問題與挑戰(zhàn)。例如,我們往往需要更好的性能、更靈活的設(shè)計(jì)、更可靠的體系結(jié)構(gòu)、更少的錯(cuò)誤、以及更少的潛在瓶頸。因此,設(shè)計(jì)模式是解決在軟件設(shè)計(jì)中各種常見問題的一種行之有效的解決方法。
要成為一名優(yōu)秀的程序員,您應(yīng)該能夠?qū)⑶‘?dāng)?shù)脑O(shè)計(jì)模式應(yīng)用到程序的技術(shù)實(shí)現(xiàn)上。那么我們應(yīng)該如何學(xué)習(xí)設(shè)計(jì)模式呢?在此,我建議您從著名的設(shè)計(jì)類書籍:《設(shè)計(jì)模式:可重用的面向?qū)ο筌浖囊兀–/C ++實(shí)現(xiàn))》(Design Patterns: Elements of Reusable Object-Oriented Software,https://amzn.to/2Q6B2Cy)入手。如果您經(jīng)常使用的是Java的話,我建議您閱讀《深入淺出設(shè)計(jì)模式》(Head First Design Patterns,https://amzn.to/2LtXu44)。通過學(xué)習(xí),您可以迅速地掌握各種基礎(chǔ)的設(shè)計(jì)模式,其中包括factory、builder、strategy、command、template、facade、visitor、singleton。
當(dāng)然,這是一個(gè)反復(fù)的過程,您只有通過閱讀案例,研究設(shè)計(jì)模式,編寫各種代碼,測(cè)試不同的模式,才能真正理解并自信地將自己的設(shè)計(jì)模式應(yīng)用到程序之中。
4.讀書
您會(huì)堅(jiān)持每年閱讀幾本編程書籍嗎?如果您的答案是少于三本的話,那么您該適當(dāng)?shù)胤词∫幌铝恕.吘梗切﹥?yōu)秀的程序員都會(huì)表現(xiàn)出對(duì)新知識(shí)的如饑似渴。因此,我建議您每年至少閱讀五本書。這些書籍不但是過往經(jīng)驗(yàn)的集合,而且能夠拓寬您的視野,幫助您更快地獲取新知,以及向您展示如何以正確的方式實(shí)現(xiàn)軟件與產(chǎn)品的功能。
那么,我們應(yīng)該閱讀哪些書籍呢?我推薦您從如下的必讀書目開始:
- 程序員修煉之道(The Pragmatic Programmer,https://amzn.to/2Q6NUso)
- 代碼大全(Code Complete,https://amzn.to/2IhRA4f)
- 程序員職業(yè)規(guī)劃之道(The Passionate Programmer,https://amzn.to/2NXF0uz)
- 軟件工藝(Software Craftmanship,https://amzn.to/2Lv7kTv)
而對(duì)于Java編程愛好者而言,《Java 高效編程》(Effective Java,https://amzn.to/2Q82yzr)也是必讀書目。擇日不如撞日,咱們現(xiàn)在就開始規(guī)劃一年內(nèi)需要閱讀的書籍吧。
不過,您在閱讀時(shí)請(qǐng)記住如下兩點(diǎn):
- 不必從頭到尾地讀一本書。這樣您可能沒有足夠的時(shí)間和耐心。請(qǐng)?jiān)囍捎靡环N明智的方式:首先只閱讀您需要的內(nèi)容,然后在有時(shí)間的情況下閱讀其他的部分。例如,如果您需要應(yīng)用Strategy模式,則應(yīng)當(dāng)重點(diǎn)閱讀涉及到該模式的章節(jié);而如果您需要編寫servlet,則請(qǐng)關(guān)注servlet的相關(guān)章節(jié)。
- 請(qǐng)認(rèn)真做好筆記與練習(xí),好腦筋不如爛筆頭,這樣會(huì)加深您的閱讀印象與效果。
5.閱讀各種博客與雜志
眾所周知:為了留存和吸引讀者,博客總是比書籍要更新得多。您可以在自己的細(xì)分市場(chǎng)與領(lǐng)域中找到一個(gè)權(quán)威性的博客或網(wǎng)站,堅(jiān)持閱讀那里您所感興趣的各種帖子。例如:您可以通過每周閱讀一篇新文章的方式,讓自己與當(dāng)今快速變化的技術(shù)保持更新。
在此,我會(huì)推薦DZone.com網(wǎng)站,這是一個(gè)最初為Java開發(fā)人員構(gòu)建的社區(qū)。如今,它已成為了網(wǎng)絡(luò)中最大的軟件專業(yè)人員的交流社區(qū)之一。您可以在DZone上找到從Java到Javascript,從Web開發(fā)到敏捷(Agile)方法,從大數(shù)據(jù)到云計(jì)算等,幾乎所有類別的技術(shù)實(shí)用文章、見解和建議。
此外,您也可以訂閱自己相關(guān)領(lǐng)域的傳統(tǒng)或電子雜志。例如:對(duì)于Java而言,我建議您閱讀由Oracle發(fā)行的雙月刊Java Magazine(https://www.oracle.com/technetwork/java/javamagazine/index.html),它涉及到了Java技術(shù)管理的方方面面。
6.使用單元測(cè)試
在編程項(xiàng)目中,您可能聽說過“先寫測(cè)試,后寫代碼”的說法。我們需要將普通的需求轉(zhuǎn)換為非常具體的測(cè)試用例,然后編寫代碼,以實(shí)現(xiàn)業(yè)務(wù)邏輯,并確保它們能夠通過所有的測(cè)試。因此,我們應(yīng)當(dāng)通過編寫代碼,來(lái)測(cè)試每個(gè)程序的類,以及每個(gè)類的方法。
在編程界,大家普遍采用的是單元測(cè)試的方法。其好處包括:能夠及早地發(fā)現(xiàn)問題,促進(jìn)代碼的更改與重構(gòu),簡(jiǎn)化各種集成測(cè)試,為系統(tǒng)提供實(shí)時(shí)的文檔等方面。
單元測(cè)試直接導(dǎo)致了測(cè)試驅(qū)動(dòng)開發(fā)(Test Driven Development,TDD)方法的出現(xiàn)。如今,TDD已被許多程序員運(yùn)用到了多種編程語(yǔ)言中。
那么,我們應(yīng)該如何學(xué)習(xí)單元測(cè)試呢?我建議您閱讀《單元測(cè)試的藝術(shù)》(The Art of Unit Testing,https://amzn.to/2NbbiCG)一書。它是有關(guān)單元測(cè)試與TDD方面極好的書籍。
而對(duì)于Java而言,由于JUnit是Java開發(fā)中非常受歡迎的測(cè)試框架之一,因此您可以從《Junit教程:設(shè)置、編寫與運(yùn)行Java單元測(cè)試》(JUnit Tutorial: Setting Up, Writing, and Running Java Unit Tests,https://dzone.com/articles/junit-tutorial-setting-up-writing-and-running-java-1)開始。可以說,如果您從未使用過任何單元測(cè)試框架的話,那么您勢(shì)必缺少了軟件開發(fā)環(huán)節(jié)中的一項(xiàng)有力工具。
7.參與自由項(xiàng)目
以兼職或全職的方式參與自由項(xiàng)目,以提高編程的技能,是成為一名優(yōu)秀程序員的快捷方法之一。簡(jiǎn)而言之,自由項(xiàng)目意味著您可以在線查找項(xiàng)目,通過遠(yuǎn)程工作的方式獲得在線的報(bào)酬。更棒的是,您可以選擇自己喜歡的項(xiàng)目類型,例如:PC端、Web應(yīng)用、移動(dòng)應(yīng)用、設(shè)計(jì)、編程、測(cè)試、乃至某些硬件項(xiàng)目。這些都可以讓您在各個(gè)領(lǐng)域積累并拓展自己的編程經(jīng)驗(yàn),提升面對(duì)挑戰(zhàn)的能力。
相比公司里的那些循規(guī)蹈矩的項(xiàng)目,自由項(xiàng)目雖然顯得更豐富、更精彩。但是,成為一名自由職業(yè)者可一點(diǎn)也不輕松。自由職業(yè)的市場(chǎng)往往充滿了激烈的競(jìng)爭(zhēng),您要面對(duì)成千上萬(wàn)個(gè)其他自由職業(yè)者的爭(zhēng)搶與挑戰(zhàn)。因此,我強(qiáng)烈建議您最好在保留當(dāng)前工作的前提下,逐漸參與或領(lǐng)取自由項(xiàng)目。
那么我們應(yīng)該如何當(dāng)一名自由職業(yè)者,開展自由項(xiàng)目呢?我建議您去訪問Freelancer.com網(wǎng)站。它是網(wǎng)絡(luò)上最大的自由職業(yè)市場(chǎng)之一,您可以在其中找到幾乎任何種類的工作。自2009年以來(lái),我持續(xù)參加了該網(wǎng)站上的各類項(xiàng)目,目前已完成了142個(gè)項(xiàng)目,平均評(píng)分為4.8/5。當(dāng)然,我從中也積累了豐富的編程經(jīng)驗(yàn)。
8.做編外項(xiàng)目
如果您不喜歡做自由項(xiàng)目的話,那么可以通過接手一些有趣的小項(xiàng)目,來(lái)打發(fā)空閑的時(shí)間。處理此類項(xiàng)目可幫助您提高各個(gè)階段的編程技能,其中包括:編碼、測(cè)試、設(shè)計(jì)、文檔編制、以及部署等方面。與您在公司參與到的主要工作相比,這些編外項(xiàng)目向您提供了軟件開發(fā)的整個(gè)過程,而不僅僅是編碼這一個(gè)階段。
那么我們應(yīng)該如何參與編外項(xiàng)目呢?常言道:不積跬步,無(wú)以至千里。我的建議是“從小開始”。由于一開始您并沒有足夠的資源與經(jīng)驗(yàn),因此最好不要馬上開展大型的項(xiàng)目。另外,您需要管理好自己的時(shí)間,一般以兩到三個(gè)月內(nèi)完成一個(gè)項(xiàng)目為宜。
9.參加編程比賽
也許這是激發(fā)您自己成為一名優(yōu)秀程序員的最具挑戰(zhàn)性的方式。為了參加比賽,您必須投入大量的時(shí)間和資源,并高度重視具體的開發(fā)環(huán)節(jié),但是這對(duì)于提高您整體的編程技能是大有好處的。
請(qǐng)記住:重要的不是獲獎(jiǎng),而是在比賽中的成長(zhǎng)。我曾經(jīng)參加了幾次移動(dòng)應(yīng)用和桌面端游戲的競(jìng)賽,雖然并未獲得任何獎(jiǎng)勵(lì),但是我承認(rèn)自己在努力保證按時(shí)提交程序作品的時(shí)候,已經(jīng)學(xué)到了不少的東西。
當(dāng)然,您也可以嘗試一些著名的編程競(jìng)賽,例如:微軟的Imagine Cup(https://www.imaginecup.com/);由IBM贊助的ACM-ICPC(https://icpc.baylor.edu/),以及TopCoder(https://www.topcoder.com/)。前兩個(gè)是面向?qū)W生的,而最后一個(gè)則是面向所有程序員的。另外,您還可以尋找并參與本國(guó)、本地區(qū)、乃至本公司舉辦的各類競(jìng)賽。不要擔(dān)心自己是否擁有足夠的經(jīng)驗(yàn),大膽注冊(cè),一切隨緣!
10.進(jìn)行規(guī)范性審查
代碼審查工作應(yīng)當(dāng)定期在項(xiàng)目團(tuán)隊(duì)中開展。您既可以對(duì)他人的代碼進(jìn)行規(guī)范性審查,也可以讓其他程序員來(lái)審查您的代碼。一系列的審查工作,不但能夠規(guī)范大家編寫程序代碼的習(xí)慣,而且有助于團(tuán)隊(duì)成員之間相互學(xué)習(xí)、取長(zhǎng)補(bǔ)短。
我建議您使用Sonar Qube(https://www.sonarqube.org/)之類的代碼分析工具。此工具可掃描整個(gè)代碼庫(kù),并根據(jù)各種代碼的質(zhì)量標(biāo)準(zhǔn)生成詳細(xì)的報(bào)告。一般而言,您需要持續(xù)修復(fù)代碼中的問題,直到該工具不再出現(xiàn)“紅色報(bào)警”為止。當(dāng)然,某些代碼分析工具還能夠與您的IDE(如,Eclipse或NetBeans)很好地集成在一起,使得代碼的檢查過程更加順暢自然。
11.閱讀代碼
與檢查代碼不同的是,我們也需要花時(shí)間去認(rèn)真閱讀其他程序員寫出的代碼。通過這一過程,您將學(xué)到更多的東西。正所謂:“一千個(gè)人心中有一千個(gè)哈姆雷特”,面對(duì)同樣的軟件需求,不同的編程專家會(huì)編寫出截然不同的代碼解決方案。只要您能夠潛下心來(lái)仔細(xì)閱讀,就能收獲到各種設(shè)計(jì)上的創(chuàng)新和編程上的經(jīng)驗(yàn)。
對(duì)于Java用戶而言,我建議您閱讀Java Collections框架(https://www.codejava.net/java-core/collections)的源代碼。您可以在JDK的安裝目錄下,通過src.zip文件找到它。當(dāng)然,您也可以試著去閱讀諸如Spring、Hibernate、以及Struts等流行框架的源代碼。
12.開展與編程相關(guān)的教學(xué)
常言道:“最好的學(xué)習(xí)方法是進(jìn)行教學(xué)”。您可以通過錄制視頻、撰寫文章、創(chuàng)作書籍、甚至是組織編程課程等形式,以幫助其他人學(xué)習(xí)編程。通常情況下,單純的編程目的是為了使程序代碼能夠“起作用”,而您在準(zhǔn)備教學(xué)的過程中,往往會(huì)學(xué)習(xí)研究那些與目標(biāo)課程主題相關(guān)的所有內(nèi)容。“教學(xué)相長(zhǎng)”就是這個(gè)道理。
在此,我強(qiáng)烈建議您選擇一種最適合自己的教學(xué)方式。例如:在創(chuàng)建自己的網(wǎng)站--CodeJava.net(https://www.codejava.net/)和Java Youtube(https://www.youtube.com/codejava)頻道之前,我曾經(jīng)持續(xù)為一些編程網(wǎng)站編寫了各種各樣的Java教程。而且,我還在Udemy上開設(shè)過一些Java課程。
至此,我已經(jīng)和您討論了成為優(yōu)秀程序員的十二項(xiàng)自我修養(yǎng)。當(dāng)然,這些只是我的經(jīng)驗(yàn)之談,希望您也能分享自己的觀點(diǎn)。
原文標(biāo)題:12 Practices That Make You a Good Programmer,作者:Nam Ha Minh
【51CTO譯稿,合作站點(diǎn)轉(zhuǎn)載請(qǐng)注明原文譯者和出處為51CTO.com】