# 第二章-咋學編程
前邊說了那么多編程的基本概念,那我怎么開始學習呢?
### 聽說編程很難,那我能學會嗎
你覺得說中文難么?漢語是世界上最難學習掌握的語言之一,但你不是每天都能流利地用普通話和別人聊天么?任何一種計算機語言的難度都不會超過英語,更比不上漢語,編程這件事的難度基本上等價于指揮IQ<20的壯漢。那么你認為你能不能學會編程呢?
請記住學會和學好是兩個層次,就像中學生作文和報刊出版物之間的差距。達到學會那個程度,只要有小學三年級的知識基礎就可以開始了,也就是識字就行。而如果要學好,那需要初高中畢業的文化水準,也就是應該略懂英文和解析幾何。當然還有更高的技術層次,比如在相當于職業作家的水平上,你將被稱為專業程序員。而如果你被稱為大師,那就是諾貝爾文學獎,當然,抵達那個程度需要付出艱苦的努力。
### 我的英語很差,怎么辦
無法回避的事實,當今世界中的信息技術,絕大部分是歐美人的發明,更準確地說,是美國人的功勞。順理成章的,各種資料文檔技術手冊,尤其是記載最新技術的, 都是用美國通用語也就是英語撰寫的。可能在其它領域不懂英語沒有什么大的問題,但在IT行業,不懂英語就是無法掌握最先進的技術,基本等于沒有出頭之日。不懂?——不懂就去查唄。
不過話說回來,不是說你一定要有個托福雅思的高分才能去學編程的。由于歷史原因,大部分計算機語言借用了部分英語的詞匯作為基本詞匯,但絕不是說必須先學英語才能學習編程。就編程本身而言,它所需要的英語水平不過是死記硬背好幾個單詞而已。你在看好萊塢大片時,一部片子下來總能記住主角和主要配角的名字吧,C語言全部關鍵字一共32個,而其中有6到7個的使用率超過78%,這樣你還有什么可擔心的。但是,要想成為高手,閱讀大量的相關資料是免不了的,這個時候,英語就顯出它的重要性了。能使用英文原版的軟件就盡量不要用中文漢化版,能讀經典的原版英文教材就盡量不要讀翻譯過來的中文版。在這里不是崇洋媚外,而是使用漢化版的軟件極易引起各種不可預料的問題,國人翻譯過來的教材或多或少有失原味,下邊來一段小插曲:
> 如果只因為那幾個屈指可數的英文單詞而放棄學習編程,我只能說這樣的人趁早離開為好。順便提一句,本文作者(這里指BlueAuris)一向認為那個叫易語言的中文編程語言是個不折不扣的笑話。理由很簡單,其他流行的語言都有自己的獨到之處,就像武當劍少林拳打狗棒一樣在江湖上占有一席之地,而這個語言除了有幾個中文標識符之外,一無所長。而這幾個中文標識符也不過是使用了文本替換的方式把C語言的幾個特定詞匯換成了意思相對應的中文而已,任何一個文本編輯器都可以做到這一點。形象的表現一下,這就是有個猥瑣的家伙特地身穿全套阿拉伯長袍練了整路正宗少林長拳然后大聲叫嚷這就是他發明的具有民族特色的中東石油大亨拳。
### 我能學好編程嗎
如果你已經看完前面的部分到達這里,顯然你是確實想要學習編程的新手。不論你是為了什么目的來學習,在看了上面的話之后是不是很有信心呢?不過我要打擊你一下,不是誰都學得好編程的。人人學開車,但不是誰都能上賽道,舒馬赫更是只有那么一個。就像有些驚險刺激的游樂設施禁止高血壓心臟病患者參與一樣,編程作為一項耗費智力和體力的活動,對參與者也有一定的要求。先來看看吧,滿足以下這些條件,你就可以放心大膽的開始了。:-)
先說體質要求。太祖說:身體是革命的本錢。健康的身體對編程大有益處,但并不是說殘疾人就不能參與。就目前的技術水平,除了腦癱和目盲這兩項,其他的肢體殘缺根本不妨礙。Stephen William Hawking在這樣嚴重的情況下還能持續研究的事實,還不夠激勵你么。(^o^)
緊隨其后的是足夠的精力和時間。親愛的小伙伴,只要你能靜坐半小時安靜的看完這本小冊子,你的體能就達標了。如果你想告訴我,你能夠一天在電腦前連續操作18小時以上,我要說的是,小伙伴,雖然你很犀利,但請注意保護好身體和眼睛。只要每天你能抽出30分鐘來學習編程,那你的時間也合格了,當然有更多時間確實會更好,不過也沒必要每天12小時。編程并不是世界上最重要的事,我們還有別的事要做。必須認識到,學習編程重要的是持之以恒,而不是依靠爆發力,每天半小時比一周一次6小時效果好的多。
第三個要求是你要略微懂一點計算機。不錯,只要略懂就可以了。因為這正是本文的主要目的之一:向略懂計算機的人介紹編程。那么,怎么才算略懂呢?能瀏覽網頁和用文本編輯器輸入代碼并且把鍵盤上的26個字母和十個數字挨個輸入一遍就OK了!
最后一點,你需要有頑強的毅力。編程并不像你想象的那樣輕松,不是野餐和聚會。尤其是對于職業程序員都應掌握的C++,它可以用兩句話來形容:三年不開張,開張吃三年。千萬記住,C++被稱為是真正的程序員使用的語言不是沒有理由的,它的復雜度和性能超出你的想象。有無數的編程新手在第一個月不到就放棄了,你最好確定你不是他們中的一員。毅力沒有尺子可以來度量,在這里我只能先祝愿各位都能堅持到最后。Good luck~
### 一定要有一臺計算機嗎
到目前為止,是的。在老年時期,Beethoven可以憑空作曲而不依靠鋼琴之類的東西,但幾乎沒有哪個程序員不依靠電腦而只在大腦里編寫,尤其是開始學習的階段。但這也不意味著只能在電腦上才能編程。在電腦還屬于稀有電子產品的那個年代,哪有那么多人能非常方便的在電腦上編程呢?但最后不同樣也誕生了不少優秀程序員么?那他們是怎樣編程的呢?——紙、筆和大腦。當然,能有一臺電腦顯然更好。
用各種語言所編寫的程序被運行在各種各樣的機器和設備上,從掌上設備到巨型服務器,從臺式電腦到微波爐,所有能夠自動運行的地方都有程序的身影。但是很遺憾,并不是只要能夠運行的設備就可以用來進行編程的,這就像雖然可能洗衣機也能發出悅耳的聲音,但你不能指望用洗衣機來錄制流行歌曲(額...也許SONY有這樣的產品,我保留意見)。
目前大部分語言,所需要的電腦并不如你想象的那樣高級。當然作為學習,我們還是需要有比較稱手的設備。不錯,最重要的就是稱手兩個字,所謂稱手,就是不會由于設備的問題,妨礙你的思考,不需要高速的處理器,也不需要巨大的顯示器,更不需要海量的硬盤,只要稱手。當然,如果你是游戲或者影音發燒友,那你可以當我說的是廢話。編程不是豪華海上旅游,而是修行。修行不需要五星級賓館,但也要有破屋以遮風雨,否則感冒發燒了,怎么來修行呢?
### 編程第一步
首先確保你的健康狀況和基本計算機操作水平(不會?不會就去學,健康狀況不好?這個我只能建議你多鍛煉身體)。
編程這件事上,沒人可以無師自通,天才也不行。所以你要做的第一件事是找一本好的入門教材,最好是經典作品(后邊會集中介紹)。反復地看教材,要牢記一點,你所提出的大部分問題,教材上都有解釋,只是你沒有認真看而已。反復地閱讀,直到你覺得你已經可以編寫出那本教材了,才可以丟棄它。教材比老師好的理由之一是,你可以帶教材上廁所去臥室,而老師不行。當然,老師也有比教材優越的地方,那就是他可以給你解釋教材上沒有的問題。但記住老師也是人,你不動腦子就去找他,他會厭煩的。不要鄙視你的老師,即使他其他方面不如你,但至少在編程這件事上他能做你的老師就是他比你強的硬道理。尊師重道是中華民族的傳統美德,O(∩_∩)O 哈哈~
你以為光看語法書和背誦單詞而不練嘴就能說好英語么?顯然不對。編程也是,熟能生巧在任何地方都是一樣的。首先看懂教材上的那些例子,確保看懂之后,按著他的思路把它默寫出來,當你嘗試過就會知道看懂和默寫是兩個完全不同的程度。然后就可以做書后面的習題,獨立想,想好之后最好是能在電腦上敲一遍,不到萬不得已不要看答案或提示。等到整本書后面的習題你都能做對的時候,你就算入門了。如果你的目的僅僅只是為了考試拿高分,現在就可以去睡大覺了,但如果想要用編程來解決一些實際問題,對不起,你還欠火候。這其中的差別就相當于大學英語四級作文和暢銷英文小說之間的差異。
會做書后邊的習題只是編程的第一步而已,你掌握了大量的單詞和熟悉語法并不能讓你寫出優美的英語小說。你得學習修辭手法和謀篇布局這類文學技巧,還得掌握歷史典故、諺語俗話以及文化背景這些文字外的東西。如果要暢銷,還需要超凡的主題、生動的故事和跌宕的情節。編程圈子里正好有和這些類似的玩意兒,這些都留到下一章細說。
### 問題向誰問
還記得鄭鈞的《路漫漫》歌詞中有:
> 記住沒人會同情你 我親愛的兄弟
> 你最好鼓起勇氣才能活下去
> 因為路漫漫 其修遠 我們要上下而戰斗
### 編譯器/解釋器-案發現場
編程這件事,基本上是不能指望有人幫你的,因為你很可能問了別人半天后才發現你們倆說的根本就不是一個東西。當你編程遇到問題,首先應該是去看編譯器提供的信息,它可是最直接的來源,相當于案發現場,很少有刑警不看尸檢報告就直接破案的(當然,對于柯南這種我保持沉默)。
現代的編譯器已經不止編譯那么簡單,編譯本身就能送出大量的提示,調試功能更是強大到可以讓你檢視程序運行的每一步都發生了什么變化,只要你能看懂。機器的問題,就應該用機器來解決,而不是用人的肉眼去檢查(在你還沒練就火眼金睛前)。不過也不要過分依賴編譯器,尤其是初學編程的時候,有錯誤時先在紙上用大腦跑一跑程序,實在搞不定了再單步跟蹤,多試幾次你的編程能力自然會有很大的提高。
### 教材和文檔-手邊的工具
手邊的教材和文檔能解決70%以上的問題,[Linux](http://zh.wikipedia.org/wiki/Linux)下的 manual 就非常好,一些IDE的help文檔也不錯。如果還不夠,上網去查。如果找不到,請記住有個東西叫搜索引擎。
### 搜索引擎-第二大腦
在如今的知識爆炸時代,海量的信息被存放在互聯網上,那么如何從這些海量的信息中篩選出自己需要的信息吶?——答曰搜索引擎。首推 [Google](https://www.google.com),使用得當的話,絕大多數問題可以得到解決。搜索引擎適合解決一個點的問題,而接下來要推薦的 [Wikipedia](http://zh.wikipedia.org) 則比較適合解決一個面的問題,維基百科頁面的下方往往會有相應主題的一些鏈接和同一類別的其他主題介紹。后邊就搜索引擎的高效使用再做詳細介紹,這里先知道有搜索引擎這么個東西就夠了。
### 向他人求助
如果以上三種方式都沒能解決你的問題,確認你已經努力過而沒有答案,那么接下來可以向老師、同學請教或者在郵件列表上提問。在你確定要提問之前,請先把 [How To Ask Questions the Smart Way](http://linuxmafia.com/faq/Essays/smart-questions.html)[[1]](#)[[2]](#)[[3]](#) 好好讀一讀。解決完一個問題后可以記錄在自己的博客或者wiki上,獨樂樂不如眾樂樂。:)
### Notes
1. [[1]]() 大家網論壇上有一份整理不錯的 [中文翻譯](http://club.topsage.com/thread-220478-1-1.html)
1. [[2]]()[Zoom.Quiet](http://zoomquiet.org/) 制作的 [提問的智慧中文版-思維導圖](#)
1. [[3]]()[啄木鳥社區整理地比較好的一份提問及答題指南](http://wiki.woodpecker.org.cn/moin/AskForHelp)
- Introduction
- Part I Introduction to Programming
- 第一章-編程所謂何物
- 第二章-咋學編程
- 第三章-編程進階-數據結構與算法
- 第四章-操作系統及項目開發雜談
- 控制臺和圖形用戶界面
- 工程和單個文件的關系
- 第五章-編程語言
- 第六章-編程方法論雜談
- 好書哪里找
- 高效使用搜索引擎
- 好習慣
- 文本編輯器
- 版本控制
- 編程開發
- 第七章-教材推薦及其它
- 數據結構與算法類
- Operating System
- C
- C++
- Java
- Python
- Golang
- Network
- 數據庫
- Web-前端
- Web-后端
- 機器學習
- Linux
- GUI
- Android開發
- 數據挖掘與分析
- Spark
- 雜項