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