1. 開始之前¶
1.1. 這份文檔的目標讀者¶
軟件開發初學者¶
這是一份面向軟件開發初學者的文檔,所謂初學者,可以定義爲:學過的語言不超過2種,在已經學過的語言技能方面,能夠完成課程上的大部分習題。從高校教育的通常情況來說,基本能夠完成老師佈置的最後的課程大作業。如果要說學得很出色,大概談不上。要想進一步提高,也很困難。
對於大學畢業(正負1~2年)的同學們來說,他們很難接觸到真正較爲複雜的項目,即使參與到複雜的項目之中,也會是其中非常細枝末節的部分。他們渴望快速的提升自己的軟件開發能力,而恰恰最缺乏提升自身能力的機會。
因此,本文希望能夠介紹一種較爲合理的方法,幫助各位"同學",以較爲科學合理的方式,提高軟件開發的實力。
開源軟件的初次使用者¶
在軟件開發這個領域,完全不接觸開源項目,幾乎是不可能的事情。在日常開發工作中,如何藉助開源項目提高開發效率,減少重複勞動;如何從開源而受惠,而不是因開源而受害。也是一個很有意思的課題。本文也希望能夠通過分享過來人的經驗,幫助那些初次接觸開源的朋友。
開源社區外徘徊的愛好者¶
想要成爲開源社區的一份子,在享受開源帶來的好處之後,也能夠回饋一些幫助給開源社區?開源社區到底是怎麼一回事?有很多人對於開源有着天然的好感,希望能夠加入進來,能不能更快的融入開源社區,能不能爲開源做出更多的貢獻,甚至啓動一個自己的開源項目,拉起一支隊伍來做些了不起的事情。有這樣想法的朋友,應該也不少,希望本文的介紹能夠起到一定的幫助。
《由於這是一份開放式寫作的文檔,因此,當我寫下這段話的時候,我並沒有特別確定的把握。這份文檔將只有以上三類目標用戶。也許,它能夠對更多的人產生價值......》
1.2. 基本條件¶
一臺能夠上網的電腦¶
如果我說,以上就是全部的基本條件,似乎的確是太不負責任了。但是,真的也就夠了。假設你只是研究JavaScript的開源項目的話,裝一個FireFox/Chrome這樣的對開發者友好的瀏覽器,基本上就可以開始學習了。
再進一步,當然可以有更多的考究。比如:究竟是選擇Windwos還是Linux/MacOS?Linux又應該選擇什麼發行版?等等等等,一旦深入,自然有無窮無盡的問題在等着你。
首選Ubuntu¶
首先解釋爲什麼要選擇Linux,因爲開源軟件,在很多情況下都是Linux的版本更加穩定可靠,在解決版本依賴問題的時候,也更加容易些。當然,在Windows下面,也有非常非常多靠譜的開源項目,因此選擇Linux更多的是出於一種多多使用開源的偏好。
金庸先生的《神鵰俠侶》中提到的寒玉牀,可以用來解釋這其中的奧妙。當你完全處在一個開源的環境,當你的各種操作都會接觸到與開源相關的各種概念時,你就時時刻刻都在進步中,這樣獲得進步自然會更快一些。
再說爲什麼選擇Ubuntu,這就更是個人偏好了,因爲Ubuntu的易用性目前看來還是最好的。對於初學者來說,也更加友好一些。網絡上的中文資源,也更多一些。
另外,網絡上有一篇非常著名的文章叫做:《開發人員爲何應該使用 Mac OS X 兼 OS X 小史 》,也寫得非常有說服力,推薦閱讀一下。
如果你真的喜歡Windows¶
必須承認,在Windows環境下,還是可以學習開源的。也有很多很多開源人,努力的在Windows平臺下工作。很多環境的搭建工具,被一點一點的開發出來。比如:RubyInstaller;XAMPP;以及cygwin等等。(具體的名詞這裏不解釋)
但是,很多時候,你會遭遇莫名其妙的報錯,很多人會在某個深夜,突然擡頭望天,破口大罵:“這個爛Windows!”不是沒有道理的。
不會被阻隔的網絡¶
是的,這篇文章如果有幸被翻譯爲英文,這一段話可以被完全刪除。因爲他們無法想象我們還會遇到這樣的困難。而克服這種困難,對於學習軟件開發,又是絕對必須的一種技能,所以......如果你真的發現目標網站無法訪問,尋求幫助吧。(抱歉,無法在這份文檔裏提供幫助。不過,我留了email。)
Google在大多數時候,對於軟件開發來說,都是更好的搜索引擎,所以,哪怕你費盡千辛萬苦,也一定要用Google來搜索想要尋找的項目、文檔和資料,必須的!
1.3. 你需要明確的一些事情¶
你真的想學習軟件開發嗎?¶
在正式開始學習之前,我實在是忍不住,我想一遍又一遍的詢問你:你真的想嗎?你真的想成爲一個“碼農”嗎?你真的想掌握軟件開發這門手藝,甚至以此來謀生嗎?那麼好,我得告訴你一些事實:
- 軟件開發絕非你想象中的事少錢多責任輕的那種高薪白領。很多程序員會自稱“碼農”,就是因爲這份職業非常的辛苦,而且做好不易。
- 另外,這是一份需要終生學習的行當,很多很多的其他領域,沒有那麼快的知識更新速度。但是軟件開發這個領域,1~2年不接觸技術最新的進展,你就OUT了。
- 還有,軟件開發這個行當,真的未必那麼好找工作。就業前景什麼的,並非想那些傳說的成功故事一樣光明。
但是,真的有一些人,熱愛這個行業,編程不但是他的工作,他的業餘愛好也是Coding。
如果,你確信自己不僅僅是靠編程來維生,更是將編程作爲自己最大的愛好,那麼歡迎您,來到一個神奇而充滿魅力的世界。這裏有智慧、有樂趣、更有熱心的朋友和充滿前途的事業!
你真的適合軟件開發嗎?¶
雖然,軟件開發並非像傳說中的那樣,是一個需要高智商的Nerd的行業。但是,他的確需要一些品質和能力,如果你發現自己並不具備,或者要很辛苦才能做到。那麼,你不適合這個行當。
- 懶惰:有一句名言這麼說:“懶惰是程序員的美德”,因爲真正的程序員,一定痛恨反覆做同一件事情,至少他們會寫一個函數來替自己完成。如果發現代碼裏重複出現相同的段落,他們會無法抑制的想要消除這種重複。
- 條理:如果這是一個複雜的事情,那麼我可以分成三個階段來着手去做它。如果仔細想想,第一個階段,還可以分爲5個部分。在開始第一階段之前,還有4個準備工作,必須首先考慮。
- 耐心:很多時候,程序裏的麻煩會來找你,如何解決?解決“bug”需要洞察力,需要細心,而最需要的,則是耐心。有些時候,我會非常享受這種“破案”的過程。
- 好奇心:值得好奇的事情太多了,永遠學不完的新技術;最近的進展和最佳實踐。甚至其他行業和領域的究竟,我們都有充沛的好奇心,因爲無論哪個行業,他們早晚都會來找到我們,幫他們編寫代碼的。
- 較真:很多事情,據說都差不多就可以了。但是,計算機是那麼嚴格,快百分之一毫秒,也是快了。一個萬分之一概率下會出的bug,還是bug。如果你不是一個足夠較真的人,就會放過很多問題,而那些問題,往往就會釀成大禍。
OK,閒話少敘,咱們開始吧!¶
2. 開始¶
2.1. 學習軟件開發的幾條主要途徑¶
一萬小時的神話¶
前一陣子我在網上與人討論一個一萬小時的話題。有一本叫做《異類》的書中說到這樣的觀點:世上本沒有絕對的天才。天才也需要超過1萬小時的訓練。人人都有可能成爲頂級高手。具體可以參考一篇流傳甚廣的文章《怎樣練習一萬小時 》
在這種理論的基礎上,有人提出了“一萬小時編程訓練”的概念,似乎經過一萬小時以上的訓練,普通人也有可能成爲編程領域的“大師/高手”。但是,這個理論其實是一個貌似建立在統計學基礎上的僞理論。
首先是範圍,多大的一個範圍,算是一個領域呢?編程是一個大的範圍,編譯器或者數據庫編程是其中兩個不同的領域。如果有人用一萬小時專注於編譯器的開發,他們對於數據庫方面的編程,可能是一竅不通的。那麼,這種人,算不算編程領域的大師呢?如果有人用一萬小時專注於彙編語言的編程,那麼對於新出現的面向對象的腳本語言,能夠有多高的水平呢?
其次是訓練,在一萬小時的相關統計中,提到了舞蹈、音樂等衆多需要反覆練習的領域,而這種針對熟練程度的訓練,真的是編程領域需要的嗎?當然,我相信提高打字熟讀,的確有助於提高代碼編寫的速度,但是這真的有助於提高編程的能力嗎?要想在軟件開發這個領域,討論如何纔算是訓練了一萬小時的編程,會非常困難。
最後是關於知識更新,在一個每天都在誕生新名詞,新技術,新思路的領域,一個曾經埋頭苦練一萬小時的高手,在3年不接觸最新知識以後,還能稱之爲高手嗎?
總之,匆匆忙忙的接受了一萬小時的概念,被激勵得熱血沸騰,打算下定決心奮力學習一萬小時編程,通常不過是“勵志書中毒”的症狀而已。
軟件開發的能力體系是怎樣的?¶
在很多領域,我們都可以用一個金字塔模型,來描述該領域的能力體系,在軟件開發領域,同樣如此。
- 高
- 創造能力
- 中
- 邏輯能力
- 理解能力
- 低
- 基礎知識
- 編程技能
- 領域知識
簡單解釋一下:
低的三項,屬於知識類。基礎知識包括計算機、數學、算法、邏輯等等知識,這些知識,通過認真的學習書本教材,基本能夠掌握。
編程技能,往往是跟具體的語言相關的,當然,多學幾門不同的語言,對於快速掌握一門新的語言,大有幫助。
領域知識,則是與工作的具體方向有關,比如針對多媒體領域的編程,自然要熟悉圖形、圖形、聲音等等的相關領域知識。針對企業級應用的開發,對於管理制度、財務、成本、倉儲的東西,總得搞清楚纔行。
中與高的兩項,屬於超越編程侷限的通用能力,不僅僅是軟件開發上用得到,在各方面都非常需要這三類能力。邏輯能力,可以通過訓練提高;理解能力,可以通過經驗積累;而創造能力,的確比較難,有天賦的成分在其中。
有哪些途徑,可以鍛鍊這些能力?¶
- 閱讀與習題:找到一堆的經典教科書,狠狠的讀,認真的把書裏的習題都給做了,這樣對於打下紮實的基礎,將會有極大的幫助。
- 視頻教程/ScreenCast:每次講解一個主題,學習一下總會有收穫,只是效率不高。
- PPT/Slide/PDF:這種屬於某次技術會議上的演講稿,如果能夠配合視頻看,效果還好些,否則通常會不知所與。
- Wiki:針對某個詞條,某個特定的問題,會有相當清晰的解釋,不過要看運氣,有些詞條的解釋就非常粗略,甚至過時。
- Blog:在分享知識與經驗的過程中,blog是很不錯的載體,如果你能夠找到的話。
- BBS:曾經是最主要的學習方式,很多人通過泡論壇來提高自己,不過說實話,效率很低,而且容易跑題。
- 問答社區(StackOverFlow/Quora):新興的交流社區,在面臨特定問題時,可以嘗試搜索或提問。平時泡泡,努力回答別人的問題,也有助於自己的提高。
- 工作中的項目:當然,老闆給你發工資,肯定希望你儘快完成,在壓力之下,通常進步都會很快。只是這種進步也許是你無法選擇的。
- QQ羣:真的有人藉助QQ羣來學習嗎?
- 開源項目/開源社區:當然,這個是最重要的,咱們下節詳細說。
2.2. 爲什麼藉助開源學習是最有效的¶
爲什麼要學習¶
學習有不同的目的:有人學習是因爲興趣或者好奇;有人是爲了增加生存的技術,把學作爲改變工作、生活狀態的手段;當然,也有些人,學習是爲了思想的交流,與周圍的人交流,與遠方的朋友交流,與過世的先哲交流。
靜下心來,仔細想想自己爲什麼要學習很重要。如果學習的目的不明確,學習就缺少源動力。這種思考在學習之初是需要的,在學習過程中也同樣是需要的。因爲隨着學習的進行,個人對學習的態度、感受也會發生變化,學習的目的也需要及時的調整。
一個善於學習的人,是能充分利用各種學習機會進行學習實踐的人。有人七十多歲開始學畫油畫,也有人利用每天坐地鐵的時間學會一門外語,甚至還有些人把微博、網絡公開課作爲學習的重要工具。只要學習目的明確了,學習就變成了一件有意義的事,因而纔可能持久。
生物進化的幾百萬年,才使人類有了學習的能力,這種能力是區別與一般動物的。人類的學習是一個覺醒的過程,近百年人類文明高速演進,特別是互聯網的出現,使學習的從原始的環境適應演進爲主動的創造並迅速轉爲社會向上的推動力,或者破壞力。
源代碼是最好的營養¶
知識是多樣的,學習的目的不同,學的內容也不同。計算機的出現,使學的工具發生了根本的變化,而程序的靈魂,因此學習編程不僅僅是軟件工程師的事,它應該成爲每個社會成員的一個基本的技能。正如語言是人類交流的基本技術,編程是人與機器交流的基本技能。學會編程,可以使機器按照你的意志運行,使每個人按自己的興趣整合信息資源,以利於更有效的學習。
軟件是近百年發展最快的技術之一,特別是隨着智能手機與平板電腦的普及,軟件技術更是滲透到了我們生活的各個方面。學會編程,並不意味着要去要去建一個複雜的系統。其實寫的個報表的計算公式或者做一個小動畫可以是一種編程的體驗。
軟件編程需要的基本環境就是一臺電腦,當然如果有互聯網的接入則更利於交流與技術信息的查詢。
使用Linux最大的好處是它本身就是一個軟件開發的開放平臺,你可以方便地下載各種開發工具,比如gnu c/c++,python或者其它。你應該學會使用apt-get, 這是一個Ubuntu下強大的軟件包管理工具。
在網站kernel.org上,有各種版本的內核源代碼,如果你想從根本上學習操作系統,也可以通過LFS快速地學習內核構建的過程。
源代碼開放的最大的好處是我們不需要重複設計和製造輪子。每個人都可以在軟件巨人的臂膀上構造自已的夢想代碼天堂。
無論從美國的facebook 谷歌 蘋果還是中國的華爲成功的經驗中我們可以看到,開源的代碼以及開源的項目是當前衆多商業公司的技術立足之根本。開源已經造就了無數商業神話。我們大部分人只知道蘋果的酷,但很少有人在蘋果的版權說明中,看有關開源項目的羅列。
微軟的比爾蓋茨以及蘋果的喬布斯大家耳熟能詳,但對軟件產業最有影響力的人應該是出生於芬蘭的李紐斯(Linus Torvalds)。谷歌正是採用linux爲內核,才使android幾乎在一夜之間串紅並重創諾基亞。而李紐斯在軟件界的影響力,堪比羅馬教皇。
有一部電影叫源代碼,也許對代碼開源化的一個隱喻。如果你讀到了關鍵的源代碼,也許你真的可以改寫歷史。當然,李紐斯說得很好,開源應該是快樂的,“Just for fun”。我們不需要太多的使命感與焦慮,改變世界也許只是一個順帶的結果。
方向不對,努力白費¶
在中國,如果你想面朝大海,應該是一路向東。當然向西也是可以的,不過要多費些周折。技術的更新非常快,但如果把握了大勢往往可以事半功倍。
舉一個實際的例子:十多年前,PHP是一個相對冷門的編程工具。在很多場合,很多人都不好意思說自已是搞PHP開發的。而如今,PHP已經成爲主流的開發工具,很多搞.net處於生計的考慮,不得不轉向Java,或者PHP。
選擇開發工具只是軟件工匠們需要認真定奪的一個方面。其它如系統構架、測試方法、團隊管理、決策者眼光等等,更是關係每個程序員未來的諸多要素。
開源的精神內涵使學習變得更加有意義¶
在商業極度發展的今天,人們對物質的無限追求使很多人忘記了生活的本質。人被異化爲物的附屬品,價值被虛擬的概念、標籤重置。
互聯網的出現,促進了人類相互之間的溝通。軟件高速更新發展的自然需求和因團隊協作所帶來的有效性、高效性造就了一個全新的文化:開源文化。軟件便與分享、開源代碼便於擴展的特質,使以Linux操作系統爲代表的開源項目迅速崛起。大批的軟件工程師不僅通過開源項目找到的精神寄託、同道中人,而且還找到了與商業社會有效融合的模式與渠道,解決了事業與興趣結合問題,實現了生活、學習、工作甚至社會公益有完美統一。
在開源精神的感召下,學習變得更加積極主動。在分享、貢獻的核心價值體系下,人們能充分體會人心溫情的另一面。與傳統商業社會利用信息不對稱在交易中圖謀利益最大化不同,開源世界裏的人們在創造、協作的過程中完成一個又一個不斷成長的軟件系統,這些系統有些使整個社會運行更有效、當然也有的在損壞甚至危及社會的安全。人類精神世界的兩面性在開源世界裏更直接、更激烈地表現出來,正在影響着現實的諸多方面。
開源社區是最好的學校¶
軟件是構建虛擬世界的基礎,而開源社區則是軟件新技術產生、發展的主要場所,因而也是學習軟件技術最好的學校。
當前最大的網絡社區應該算遊戲社區,這個社區的人大多是在消費社會資源。而開源社區則分化成兩個陣營:一個是以創新、創造爲目地的,創造社會價值;另一個則是以破壞、非法取得信息資源爲目地,損毀社會資源與體系。
在開源社區裏,有大量熱心的程序員他們樂於分享自已對技術的理解、心得,他們通過各自的行動擴大自已的影響力,在協助別人的同時不斷加深自己對技術的理解程度和實踐能力。而新的社區加入者也可以在與社區互動的過程中找到自已技術與精社的導師(Mentor), 正如電影黑客帝國(Matrix)中尼歐(Neo)遇到摩菲(Morpheus)。
如果說我們生話的世界是上帝創造的,那麼我們對面的這個數字的世界則是由程序員創造的。數字世界與現實世界不斷地融合,使現實世界與虛擬世界的邊界變得越來越模糊。在學校課堂裏,陳舊的教學方法、過時的教學內容、有限的學習資源是無法與互聯網上豐富的開源社區資源相比的。社區內部團隊協作的自發性、自主性、可靠性也極大地提高了社區成員學習的效率,並使個體超常規成長成爲可能。
在媒體上經常看到十、三四歲的少年創造一個個軟件項目的奇蹟,殊不知這與國外成熟的開源社區發展息息相關。如果國內開源社區漸漸發展起來了,我們有理由相信在不久的將來,我們的周圍會出現衆多皮爾斯·富里曼(Pierce Freeman)這樣的天才少年。
移動互聯網時代,學習是開放的更是開源的¶
隨着智能手機、平板電腦的普及,學校以及教室的功能將被弱化,人們可以在各種公共場所組成形式多樣的學習社區。而開源社區提供多種專業技術人員以及業餘愛好者面對面交流的機會。有的地方還出現了包括軟件、硬件開源的創客空間。大家在無線網絡環境下快速組成學習社區,分享交流最新的技術,互相協助解決各種技術問題。發現的志同道合的朋友,有的技術團隊在天使投資者的支持下,在學習的過程中還可以建立創業團隊。
在企業的內部,根據企業的發展戰略,也可以形成企業內部的開源社區,通過開源項目整合企業內部與外部的技術資源。開放的心態使企業以開源文化的發展爲契機引領技術的潮流。
2.3. 選擇一門語言¶
首先需要說明,這裏所討論的選擇語言,並非工作中開發語言的選擇,而是出於學習軟件開發,提高軟件開發能力的目的,討論如何選擇語言。
一些基本的判斷依據¶
- 最好是跨平臺/平臺無關的語言。比如Java、Ruby、Python、PHP、JS這樣的語言。.NET平臺的衆多語言,因爲mono的存在,現在也算是跨平臺的了。
- 這門語言所創建的開源項目,要足夠多,可供選擇。C/C++、Java、Python、PHP都可以非常好的滿足這個條件,隨着github平臺的出現,Ruby的開源項目現在也越來越多的了。隨着nodejs的興起,JS的開源項目也呈現明顯的上升趨勢。
- 語言以及語法本身,要具備較好的可讀性。這裏我非常推崇Ruby,因爲這門語言從創立之初,就是極端重視代碼可讀性的,整個Ruby社區的風格,也非常強調代碼的簡潔優雅。
- 相關的文檔資料容易查找,這方面大多數流行語言都符合條件。C/C++、Java、PHP、C#、Python都已經極爲豐富了。
- 最好身邊有能夠隨時請教的這門語言的高手。有這一條,基本就足夠了。
- 最好能夠至少分別學習一門靜態類型語言與一門動態類型語言。
推薦一些語言學習網站¶
- 《笨辦法學語言》系列,詳見下節的介紹。
- 《9個指導開發者快速編碼/學習的網站推薦 》
- 當然,各個語言的官方網站,是必須常去的。
一些忠告¶
- 不要根據流行的編程語言排行榜,選擇語言。
- 不要根據某某語言最容易找工作,薪酬水平最高,來選擇語言。
- 不需要貪圖掌握太多的語言,越是深入的學習一門語言A,越是能夠快速的學習另一門語言B。A和B可以是任何兩種語言。努力深入透徹的掌門目前正在使用的這門語言,深入、再深入。這些努力,在你以後要學習其他語言的時候,一定會有回報的。
推薦語言,這個列表,可以不斷擴充,也歡迎大家補充自己的推薦語言與推薦理由¶
語言名稱 | 主要開源項目 | 推薦理由 |
ruby | Ruby On Rails | 動態語言,簡潔清新 |
java | Tomcat | 經典的面向對象靜態語言,長盛不衰,優秀項目多如牛毛 |
2.4. 必須初步掌握的基本功¶
以下所討論的基本功,其實是一個相當寬泛的概念。很難確切的定義一個門檻:不到某種程度,你就無法學習開源了。而是說,在掌握了一些必要的能力之後,再開始學習,會學得不那麼幸苦。
計算機基礎知識¶
計算機相關的基礎知識,其實相當瑣碎,很多人都是在日常的使用與開發過程中,逐步掌握的。在瞭解各種各樣的零零碎碎的知識同時,對於各種知識及其相互關聯,有一個整體上的把握,我稱之爲“地圖思維”,是非常重要的。
簡單來說,計算機相關的基礎知識主要包括:基本操作與使用;計算機體系結構;網絡基礎知識;算法導論等等。
- 計算機操作與使用:會初步使用至少一種操作系統吧;會自己裝一個虛擬機(VirtualBox什麼的都可以);知道常見的文件格式如何打開;知道去哪裏下載並安裝相關的應用軟件;諸如此類的知識。推薦一個網站:我愛電腦網 真心覺得不錯,那些亂七八糟的廣告可以略過。
- 計算機體系結構:這個方面,推薦一本教材:《深入理解計算機系統 》並附贈一篇書評《NB學校的NB課程的NB教材--CSAPP 》相信會對各種程度的同學,都非常有幫助。
- 網絡基礎知識:同樣推薦一本教程:《計算機網絡 》,並同樣附贈一篇書評《我看過的最好的網絡入門書 》
- 算法導論:說實話,我自己都沒有正經的看過什麼算法的書。不過因爲看到一篇寫得不錯的譯者推薦,因此對於《Algorithms 》一書有着相當濃厚的興趣,也因此推薦給大家。《大家好,我是譯者 》
至少掌握一門編程語言¶
聽上去似乎是廢話,如果連語言都沒有掌握,怎麼可能開始學習開源軟件,看人家的源代碼呢?不過,怎麼纔算掌握了一門語言呢?能夠寫出Hello World,自然是不算的。掌握這門語言的基本語法,肯定也是不夠的。也許找一本某某語言的經典教材,然後把後面的習題都給做出來,的確算是一個簡單的辦法。不過,編程語言實在太多,相關的經典教材,就更是多不勝數。這裏就不再一一推薦了。
不過特別想推薦一個《笨辦法學語言》系列,目前有:Python、Ruby、C、Regex、SQL、CLI六種。引用我覺得最有道理的一段話:“不要複製粘貼。你必須手動將每個練習打出來。複製粘貼會讓這些練習變得毫無意義。這些習題的目的是訓練你的雙手和大腦思維,讓你有能力讀代碼、寫代碼、觀察代碼。如果你複製粘貼的話,那你就是在欺騙*自*己,而且這些練習的效果也將大打折扣。”
相關鏈接如下:
Learn code the hard way
《笨辦法學 Python 》在線中文版
熟練掌握搜索引擎的使用¶
- 第一戒律:儘可能在Google,而不是Baidu搜索。對於軟件開發而言,Google纔是最佳武器。
- 不斷的積累關鍵字:一個內容你搜索不到,只是因爲你沒有聽說過那個關鍵字。比如,我想要找一個圖像處理的開源項目,如果你知道“Computer Vision”是指計算機視覺,那麼直接搜“Open Source Computer Vision”,OpenCV一定就會是第一個結果。如果你知道OpenCV,那麼想要找一個2D圖像轉換成3D圖像的技術,有沒有開源實現,就可以試着搜“2D to 3D OpenCV”,也許就會更快的找到想要的內容。當你對某個領域完全沒有了解時,可以先試着搜索一些周邊詞彙,看看相關的文檔,然後瞭解行內人是用哪些關鍵詞的,然後再去搜索,就會迅速的縮小範圍。
- 搜索出錯信息:當然,當你遇到錯誤時,直接把錯誤輸出放到Google裏去搜索,也說不定就會遇到和你有相同遭遇的同學,看看別人是怎麼解決的。
- 嘗試各種專業的、垂直的搜索引擎:比如StackOverFlow或者Quora這樣的專業問答社區,koders 則是一個源代碼搜索的引擎。google search裏的Blog、Discussions裏也有不少好東西。
- 到百度試試手氣:畢竟人家也抓了不少網頁了,說不定會有Google沒抓到的呢?
英語不能太差¶
當然,這個更加是沒底的事情,只是我自身英文也非常差,所以沒資格教育別人,推薦餘晟老師的一篇博客,供大家學習:《關於程序員學英語的經驗 》
3. 選擇一個開源項目¶
3.1. 到哪裏尋找開源項目¶
開源基金會¶
大部分開源項目都來自於開源社區,而大部分開源社區背後都有基金會在運作,比較知名的有Apache基金會(專注於Java技術的開源軟件),Linux基金會(專注於Linux系統的開源軟件),Eclipse基金會(專注於基於Eclipse IDE的開源軟件),Jboss基金會(專注於JAVA EE方面的開源項目)等。每個基金會都會有目前該基金會正在進行的項目列表,我們可以從其中尋找自己感興趣的項目。
Apache:http://projects.apache.org/indexes/quick.html
Linux:http://www.linuxfoundation.org/programs
Eclipse:http://www.eclipse.org/projects/listofprojects.php
Jboss:http://www.jboss.org/projects
開源項目託管網站¶
另外,每個開源項目都需要有自己的管理平臺,各大基金會的開源項目也不例外,因此,各個開源項目的託管網站是也是一個尋找開源軟件的好去處。
目前在業界比較知名的項目託管網站主要有SalesForge,Google Code,GitHub,當然還有我們當前項目正在使用的TeamHost等等。
微博上的@OpenERP_Jeff 補充說:
launchpad 是一個很重要的開源hosting網站,著名的開源項目有ubuntu、mysql和zope。項目計劃、藍圖、代碼庫、bug管理、翻譯都很完整。
服務提供商 | SVN | Git | Mercurial | 介紹 |
Google Code | 支持 | 支持 | 支持 | Google Code屬於“富二代”,其在速度上,使用體驗上都優於其他幾個託管網站,尤其是其豐富的幫助文檔,其中有很多還有對應的中文版。因此,對於初學者來說,比較容易上手,也可以獲得一個很好的學習機會。當然,因爲都是google.com的域名,所以時不時的會訪問不了管理界面,原因大家懂的。另外,因爲使用簡單方便,相應的其在功能上就相對較弱一點。但是應付一般的項目還是綽綽有餘。 |
Sourceforge | 支持 | 支持 | 支持 | SourceForge可以算是開源界的託管始祖,很多古老的,知名的開源項目都託管在它上面,其對開源界的貢獻估計可以和Apache對Java界的貢獻相提並論了。因此,其在功能上經過了長時間的考驗,大家想要的功能都能找到。不過,因爲強大,其上手難度也相對較高,而且全英文界面,對於英文較弱的同學來說也是一件很痛苦的事。 |
Github | 不支持 | 支持 | 不支持 | GitHub屬於託管界的新貴,伴隨着Git的蓬勃發展而發展。越來越多的開源軟件使用Github託管。最近因Rails漏洞被Hacker黑了也讓其處於媒體的風口浪尖。這個事件從一個側面反映了其在業界的影響力。 |
維基百科有一個詞條,列出了非常非常多的開源託管服務的比較:
Comparison of open source software hosting facilities
自由軟件主機服務比較
技術社區¶
像ITeye,infoQ,OSChina,CSDN等國內知名的技術社區都非常關心開源軟件的發展,在社區新聞,月刊等載體上都有最新的,流行的開源軟件介紹。同時在社區,還有一個很大的好處,你會找到很多志同道合的朋友,這可是學習過程中的一大樂事。
各大科技公司的研究院¶
Google的BigTable論文,Amazon的Dynamo論文開啓了目前火熱的雲計算時代,各大科技公司對技術領域的引領能力毋庸置疑,同時,很多公司也是開源運動的忠實支持者,像國外的Google,Facebook,Yahoo,國內的淘寶,百度,盛大,豆瓣等,連曾經的堅決反對者Microsoft也開始通過贊助Apache基金會扭轉自己在開源界的形象。關注各大科技公司的研究院最新的開源軟件可以瞭解目前整個業界的技術趨勢,而且他們開源的軟件的未來發展前景都比較看好,因此,是一個尋找開源軟件的有效途徑。
搜索引擎¶
如果您對某類技術特別感興趣,或者遇到某個技術難題想找業界成熟的解決方案,搜索引擎(Google,Baidu,Bing)都是一個不錯的工具,其在我們尋找開源軟件的過程中也起同樣的作用。通過一些關鍵詞的羅列就能幫助我們找到感興趣的開源項目。
博客和微博¶
關注各個領域大牛們的博客和微博,他們會緊跟技術節奏給我們推薦他們領域最新的開源軟件,甚至會爲我們講解這些開源軟件的底層實現原理,帶領我們入門,這是多麼高尚的行爲啊。
關注各大科技公司的博客和微博,他們也會經常透露自己的開源計劃,以及分析業界的一些開源軟件在自己公司內部的應用,這對我們深入瞭解一個開源軟件的技術價值有很大的幫助。
技術問答網站¶
這是最直接的一個方式,在知乎,StackOverflow,Quora等問答網站直接請人推薦幾款開源軟件,工程師的熱情會讓你受寵若驚的,很有可能向你推薦某個開源軟件的就是這個開源軟件的創始人。
維基百科¶
在維基百科上,有很多辛勤的人們,在整理着各種相關的資料,例如:
http://en.wikipedia.org/wiki/Open-source_software
http://en.wikipedia.org/wiki/List_of_open_source_software_packages
http://en.wikipedia.org/wiki/Comparison_of_open_source_software_hosting_facilities
等等,在其中搜索相關的詞條,還能發現很多的寶藏。
3.2. 什麼樣的開源項目適合初學者¶
緣起¶
說實話,在當初列這個提綱的時候,我並沒有想好如何寫這一節。但是,開放地做事情,就常常會有奇妙的事情發生,佛家稱之爲“助緣”,各種對這件事情有幫助的緣分,都會在不經意間出現。
一位叫李軍的朋友,給我發來郵件,信中寫道:“我想是否我們能夠通過溝通,然後你在對我有些瞭解,給我指出點建議,並且是詳細的建議,我看學apache開源框架應該不錯的 ,不知道我是否適合,謝謝。期待你的回覆。”
在與他的往來郵件中,我也真的將這一節漸漸的想清楚了。另外,在與李軍的討論中,我還發現,需要開闢一個專門的章節,討論:“學習開源項目,能夠提升軟件開發中的哪些能力。”
在此,我想對李軍表示感謝,更希望有越來越多的朋友,參與到這個文檔的討論中來,相信它會變得越來越完善。
明確自己的目的¶
選擇一個開源軟件,首先要明確的,是自己的動力何在。是出於興趣?還是出於工作需要?比如,有人對於搜索引擎特別感興趣,想了解搜索引擎是怎麼做出來的?那麼首先可以考慮先尋找一些專業的書籍,來了解一些關鍵的知識點。如果對於某一領域的知識點,缺乏必要的瞭解,可能完全無法理解一個項目裏的代碼。在掌握初步的知識以後,自然可以去找Lucene、Sphinx來學習。
也可能是出於工作需要,比如平時是用PHP開發Web應用,已經在用某一個常見的PHP框架了,希望能夠對這個框架有一個深入的學習瞭解,甚至希望橫向的比較多個不同的PHP Web框架,這些都是非常清晰的目的。自然在學習的過程中,不太會迷失方向。
比較危險的一種,是聽說某某項目很有名氣,甚至是爲了將來找工作比較容易,就貿然一頭扎進某個項目中去了。這種學習目的,往往會選擇到那種很龐大,也很成熟的項目,打開文件夾一看,成百上千的源文件,根本無法看完,一下子就蒙了,再就是頹了。心想自己大概不是學軟件開發的料吧~~
優先選擇能夠獨立運行的項目¶
開源的項目有很多種類,能夠獨立運行的項目,當然很多。但是也有不少項目,是其他開源項目的插件,類庫,擴展包之類的東西,這些在一開始接觸開源的時候,最好不要涉獵,因爲理解他們,可能會需要理解他們背後的那個龐然大物,往往會遭遇很多難解的細節,一不小心,就進行不下去了。
當然,還有一類項目,他們雖然是獨立運行,但是想要讓他們獨立運行成功,還得安裝、配置很多其他的依賴項目,這個往往會讓初學者特別絕望,搞了一個禮拜,居然這個項目都還沒有運行起來。。。
所以,小的,能夠獨立運行的,不依賴於太多其他項目的開源項目,可以優先選擇。
選擇活躍的項目¶
項目的活躍程度,包括兩個部分,一個是開發者提交新代碼的頻繁程度。另一個是在社區中對於這個項目的討論熱烈程度。提交代碼越是活躍,提交的人越多,越能證明這個項目是很有價值的,也證明這個項目是值得你花精力去學習的。而項目在社區討論的熱烈程度,則能夠確保當你遇到問題的時候,能夠搜索到別人的答案,或者你自己提問以後,能夠有人熱心回答你。
當然,活躍程度都是相對的,如果你真的對一個項目感興趣,可以直接試着給這個項目的作者發郵件,提問題。大多數開發者都會很高興有人關注他的項目,也會通常會熱心的回答你的問題的。
判斷代碼質量¶
並非所有的開源項目,都是高手寫的,都值得你去學習。事實上,有很多垃圾開源項目,代碼仔細一看,寫得真是一塌糊塗。所以,試着閱讀一下這個項目的代碼。至於如何判斷一個項目的代碼質量,之前我在知乎回答過一個類似的問題《如何讓自己寫的代碼易維護? 》。推薦各位朋友參考一下。
當然,更加推薦的,是閱讀《Clean Code》一書,非常好的一本介紹如何提交代碼質量的書。附一篇書評,可以一讀:《寫代碼猶如寫文章 》
選擇合適的版本¶
最後,面對已經發展了多年的開源項目,最好不要選擇最新的版本。如果你是在工作中要想使用這個項目,當然應該選擇最新的穩定版,甚至測試版、beta版。但是如果是出於學習的目的,爲了減少複雜度,快速的理解這個項目的核心結構與開發思想,選擇第一個穩定版,是一個比較妥當的辦法。
然後,在初步理解了第一個版本的代碼之後,再不斷的通過閱讀changelogs,追蹤最新的版本中的代碼變更,體會作者修改代碼的目的、手法與技巧。這樣應該會有很大的收穫。
3.3. 值得推薦給大家的開源項目¶
目錄:
這是一份面向軟件開發初學者的文檔,所謂初學者,可以定義爲:學過的語言不超過2種,在已經學過的語言技能方面,能夠完成課程上的大部分習題。從高校教育 的通常情況來說,基本能夠完成老師佈置的最後的課程大作業。如果要說學得很出色,大概談不上。要想進一步提高,也很困難。
對於大學畢業(正負1~2年)的同學們來說,他們很難接觸到真正較爲複雜的項目,即使參與到複雜的項目之中,也會是其中非常細枝末節的部分。他們渴望快速的提升自己的軟件開發能力,而恰恰最缺乏提升自身能力的機會。
因此,本文希望能夠介紹一種較爲合理的方法,幫助各位"同學",以較爲科學合理的方式,提高軟件開發的實力。
這份文檔本身也是一個開源項目,你可以參與這個文檔的寫作、維護。
以下是這份文檔的目錄
- 開始之前
- 這份文檔的目標讀者
- 基本條件
- 你需要明確的一些事情
- 開始
- 學習軟件開發的幾條主要途徑
- 爲什麼藉助開源學習是最有效的
- 選擇一門語言
- 必須初步掌握的基本功
- 選擇一個開源項目
- 到哪裏去尋找開源項目
- 什麼樣的開源項目適合初學者
- 值得推薦給大家的開源項目
- Hello World
- 下載源代碼的N種辦法
- 讓代碼運行起來
- 可能遇到的困難
- 碰壁的過程,就是成長的過程
- 理解開源項目
- 基本結構的掌握
- 靜態理解與動態理解
- 常用工具簡介
- Debug與Log
- 主線與分支
- demo/example
- 單元測試
- 介紹文檔
- 做點破壞活動
- 修改開源項目
- 嘗試修改代碼
- 提出一個小小的需求
- 如果不能搞定,試試看能不能亂來
- 尋求認可的艱難歷程
- 爲開源項目做貢獻
- 提bug與建議
- 幫助完善文檔
- 提交代碼(功能代碼與測試代碼)
- 周邊代碼(demo/擴展/子項目)
- 外部宣傳
- 其他各種雜務
- 成爲組織的一員
- 交流圈
- 組織結構
- 開源項目的組織方式*
- 基本禮儀
- 自己發起一個開源項目
- 延伸閱讀
轉:http://www.teamhost.org/projects/learn-with-open-source/wiki/Wiki