經(jīng)驗(yàn)分享 —— 程序員編程如何入門、進(jìn)階

圖:于海童@清華
關(guān)于作者:程序猿石頭(ID: tangleithu),現(xiàn)任阿里巴巴技術(shù)專家,清華學(xué)渣,前大疆后端 Leader。歡迎關(guān)注,交流和指導(dǎo)!
背景
在之前的這篇文章中,我談了談讀本科的時(shí)候都學(xué)了哪些計(jì)算機(jī)專業(yè)課和推薦了一些經(jīng)典的技術(shù)書籍,然后推文封面中的這張圖引起了不少讀者的注意。

這其實(shí)是我當(dāng)時(shí)的課程大作業(yè)的 Demo,嚴(yán)格意義上講其實(shí)是幾個(gè)課程的大作業(yè)?。
今天這篇文章, 石頭哥就接著這個(gè)話題講講我是如何入門和進(jìn)階編程的。也正好有讀者朋友跟我咨詢類似的問題,如何入門編程?有沒有什么 Java 小項(xiàng)目可以練手的?這篇文章也算是能回答這部分讀者的疑問。
下面,我將從以下這幾個(gè)方面,談?wù)勛约旱睦斫猓?/p>
如何入門、提高興趣?
首先,“編程”的門檻相對(duì)較低,你看外面的培訓(xùn)機(jī)構(gòu)早就從成年人延伸到越來越多的中小學(xué)生,甚至“少兒編程”了。既然“少兒”都學(xué),難道你還不能學(xué)么?
但整體來講學(xué)習(xí)“編程”,特別是到后面進(jìn)階(例如數(shù)據(jù)結(jié)構(gòu)和算法),是相對(duì)比較枯燥的。所以就要想辦法來提高自己的興趣,或者說通過一步步學(xué)習(xí)來獲得“成就感”反向刺激自己主動(dòng)多學(xué)習(xí)。
關(guān)于入門的編程語言,我覺得不要太局限,不要太限制自己非得用某個(gè)語言入門,可以根據(jù)自己的實(shí)際情況來選擇。不過整體來講,如果之前完全是小白,我推薦比如用 Python 等先對(duì)編程語言有個(gè)大體的了解。
掌握了一門編程語言后,其他語言都是觸類旁通的,無外乎就是“順序、選擇、循環(huán)”,不同編程語言的具體語法不一樣而已。然后對(duì)于常規(guī)的面向過程的 C 語言,或者面向?qū)ο蟮?Java 等也建議都了解和學(xué)習(xí)一下。
記得我當(dāng)初上大學(xué)的時(shí)候接觸的第一門編程語言就是“VB”,我想學(xué)校安排的課程先后順序還是很有道理的。用 VB,在 VisualStudio 上簡(jiǎn)單用鼠標(biāo)拖一拖就能出來一個(gè)有用戶界面、可交互的像模像樣的“軟件”,這對(duì)于上面提到的用“成就感”來激勵(lì)自己主動(dòng)多學(xué)習(xí)還是很有效果的。
比如當(dāng)初課程大作業(yè)就是寫一個(gè)計(jì)算器,通過短時(shí)間的入門學(xué)習(xí),就能寫一個(gè)這樣的計(jì)算器軟件出來,確實(shí)還是頗有成就感。這其實(shí)就跟現(xiàn)在的少兒編程一個(gè)道理,用一些可視化的編程平臺(tái)讓小朋友通過簡(jiǎn)單的拖拽,加上少部分邏輯就能出一個(gè)非常“炫麗”的效果,就跟玩游戲一樣,這當(dāng)然能激發(fā)足夠的興趣。
再比如剛開始入門就選擇 C 語言或者匯編,這對(duì)于提高興趣、想獲得“成就感”來起到激勵(lì)作用就大打折扣了。我記得當(dāng)初課程學(xué)習(xí) C 語言時(shí),最后作業(yè)都只有在黑屏控制臺(tái)下,雖然也能完成差不多的功能,但從“可觀賞性”來講就差太多了。當(dāng)然,我不是說 C 語言不重要哦~ C 語言還是很經(jīng)典的,入門一門語言后,建議都認(rèn)真學(xué)學(xué)
。
小結(jié)一下,入門編程,就是先學(xué)一門比較好上手的編程語言,通過嘗試寫一些有用戶界面(比如 HTML+JS)的小項(xiàng)目、小 Demo 來激勵(lì)自己。
積累專業(yè)知識(shí),重視基礎(chǔ)
有了一兩門編程語言作為基礎(chǔ)后,這個(gè)環(huán)節(jié)就是真正體現(xiàn)編程水平的時(shí)候,也是最能和其他人拉開差距的部分。
在阿里社招面試的過程中也是非??粗鼗A(chǔ)的,過去項(xiàng)目不牛 X 沒關(guān)系,基礎(chǔ)知識(shí)一定得雜實(shí)。
石頭在參與社招面試過程中,領(lǐng)導(dǎo)也特別交代,除了一般的溝通交流外一定要看基礎(chǔ),基礎(chǔ)好,解決問題時(shí)有邏輯、有條理,簡(jiǎn)單的代碼題目能寫個(gè)八九不離十,基本上一面二面也就過了。
具體相關(guān)的計(jì)算機(jī)專業(yè)課程無外乎就是那么幾門:《C/C++程序設(shè)計(jì)基礎(chǔ)》、《數(shù)據(jù)結(jié)構(gòu)》、《算法分析和設(shè)計(jì)》、《匯編語言程序設(shè)計(jì)》、《計(jì)算機(jī)網(wǎng)絡(luò)》、《操作系統(tǒng)》、《數(shù)據(jù)庫系統(tǒng)》、《編譯原理》等等,在這里我也不再詳述了,感興趣的同學(xué)可以參考下我之前寫的這篇文章?1024程序猿節(jié),聊聊石頭學(xué)了哪些課,屯了哪些書?
從中可看出,正如我之前所說,計(jì)算機(jī)相關(guān)的專業(yè)基礎(chǔ)知識(shí)和就業(yè)聯(lián)系得很緊密。如果是在校生,就一定不要浪費(fèi)時(shí)間、抓住這些專業(yè)課程的學(xué)習(xí)機(jī)會(huì)。不然畢業(yè)后從事了編程這個(gè)行業(yè),也還是會(huì)回到這些基礎(chǔ)知識(shí)上,正所謂“欠下的債,遲早都是要還的”。
況且,學(xué)校的課程學(xué)得好,還能幫助獲得獎(jiǎng)學(xué)金、保研、找工作等等,一舉多得,簡(jiǎn)直完美。
再次強(qiáng)調(diào)一下,程序猿真的需要重視基礎(chǔ),我在之前的文章中也多次強(qiáng)調(diào)了,比如?《有了這份程序員面試指南,你離大廠Offer還遠(yuǎn)嗎?》?、《從一道面試題談?wù)勔痪€大廠碼農(nóng)應(yīng)該具備的基本能力》
現(xiàn)在的網(wǎng)絡(luò)資源也很豐富,各種豐富的教程、文章、書籍等都可以直接白嫖,比如肝王 cxuan 總,小林的圖解系列等等都很不錯(cuò)。比起我們當(dāng)年,真是要好太多了。
不過也正是因?yàn)楝F(xiàn)在各種資料滿天飛,其中也不乏各種垃圾,學(xué)會(huì)甄別和如何快速檢索到想要的也是一種能力。感興趣的同學(xué)可以私信我,我把我這邊收藏的覺得質(zhì)量還不錯(cuò)的學(xué)習(xí)資料分享給你。
當(dāng)然,還有一點(diǎn)也很重要,很多情況下,我們?nèi)ネ土瞬簧賹W(xué)習(xí)資料,然而真正去閱讀學(xué)習(xí)的又占多少?我不知道你怎么樣,反正我確實(shí)是屯了不少,但屯了后去認(rèn)真看的,確實(shí)少。
積攢項(xiàng)目經(jīng)驗(yàn)
前面提到的入門也好,基礎(chǔ)知識(shí)也好,其實(shí)最終是為“項(xiàng)目”、為“產(chǎn)品”服務(wù)的。在校生或者剛?cè)腴T沒有“項(xiàng)目”,沒有“產(chǎn)品”怎么辦,那就自己制造機(jī)會(huì)。
為什么要做項(xiàng)目呢,因?yàn)橐粋€(gè)完整的項(xiàng)目是可以比較系統(tǒng)的,是一個(gè)可以把理論付諸實(shí)踐的機(jī)會(huì),從某種程度上講,做一個(gè)或大或小的項(xiàng)目,也能起到跟前文所說的正向激勵(lì)的作用。
例如我在本科期間,就做了幾個(gè)小項(xiàng)目,現(xiàn)在列舉兩個(gè)典型供大家參考。
例如,學(xué)完 Java 編程、數(shù)據(jù)庫等課程后,是不是也可以自己來搞個(gè)小聊天工具呢?再比如,學(xué)了 Java Web 開發(fā),是不是可以搞個(gè)類似的圖書管理系統(tǒng)、校園 SNS 之類(當(dāng)初人人網(wǎng)很??。┑耐嫱妫?/p>
下面就來看看我上學(xué)期間搞的兩個(gè)小項(xiàng)目吧,供參考。
仿QQ聊天系統(tǒng)
這個(gè)就能對(duì)自己的學(xué)習(xí)有一個(gè)階段性、系統(tǒng)性的總結(jié),在當(dāng)初看來確實(shí)還是蠻有成就感的。其實(shí)做一個(gè),各種場(chǎng)合都能用,比如課程 A 的大作業(yè)可以用,稍微改吧改吧,課程 B 的也能接著用,一舉多得。用心做,不僅自己知識(shí)點(diǎn) get 到了,各個(gè)課程作業(yè)又能得高分。?
這個(gè)系統(tǒng)主要是仿照QQ聊天軟件,其功能模塊包括:私聊、群聊、語音聊天、視頻聊天,用到的主要技術(shù)點(diǎn):C/S 體系結(jié)構(gòu),Oracle數(shù)據(jù)庫、socket、多線程、swing等等。
當(dāng)初做完了語音、視頻聊天,還是很讓人眼前一亮的。當(dāng)然這種小項(xiàng)目當(dāng)初我們是幾個(gè)小伙伴一起合作完成的,一般課程作業(yè)是需要在規(guī)定的時(shí)間內(nèi)完成的,就可以找?guī)讉€(gè)小伙伴一起學(xué)習(xí)、互相促進(jìn)和成長(zhǎng)。
你當(dāng)然也可以獨(dú)立完成,如果也想找小伙伴一起,也可以加入"程序猿石頭"的讀者交流群,找志同道合的小伙伴一起“刷項(xiàng)目”,共同成長(zhǎng)、共同進(jìn)步。

看截圖,是不是還像模像樣的。用這個(gè)小項(xiàng)目來入門練手,還真是個(gè)不錯(cuò)的選擇。有足夠的挑戰(zhàn),同時(shí)也有足夠的趣味性和成就感。
基于中國(guó)移動(dòng)飛信的校園資訊網(wǎng)
這個(gè)項(xiàng)目是基于WEB網(wǎng)絡(luò)的校園資訊網(wǎng),項(xiàng)目分析了飛信協(xié)議(其實(shí)就是利用網(wǎng)絡(luò)資源改寫一個(gè)web飛信),利用飛信功能可以進(jìn)行個(gè)人日程提醒、訂閱天氣、好友生日提醒、課程提醒等等;(時(shí)光荏苒,飛信?用過的說明你也“老”了)
主要技術(shù)點(diǎn):項(xiàng)目采用Struts+Hibernate框架開發(fā),httpclient+htmlparser分析教務(wù)管理系統(tǒng)流程獲取有用信息,利用webservices獲得谷歌天氣信息,將這些有用信息通過飛信發(fā)送給用戶。

這個(gè)小項(xiàng)目也是源于生活。當(dāng)初當(dāng)了個(gè)小班長(zhǎng),每期末都要統(tǒng)計(jì)成績(jī),計(jì)算綜合測(cè)評(píng)等,想想,何不寫個(gè)爬蟲來爬呢。有時(shí)候,程序猿的“懶”就是為了提高效率。

類似的小項(xiàng)目可以達(dá)到階段性總結(jié)的目的,同時(shí)自己的積累和總結(jié)也是自己的一筆財(cái)富,且無形之中可以讓自己將來也獲益。
舉個(gè)?例子,比如我上面的項(xiàng)目總結(jié)和積累,可以幫助我后面獲取更多的機(jī)會(huì),例如當(dāng)初我搞了個(gè)小團(tuán)隊(duì),參與了大學(xué)生創(chuàng)新性實(shí)驗(yàn)項(xiàng)目,獲得了國(guó)家 2 萬元的項(xiàng)目研究資助,還發(fā)了小論文(雖然現(xiàn)在看來很水),后期在簡(jiǎn)歷中也有加分。比如在我大三的時(shí)候,就獲得了騰訊的實(shí)習(xí)機(jī)會(huì),參與了真正的商業(yè)產(chǎn)品的開發(fā)。再后來,前面的積累又幫助我全獎(jiǎng)保研到清華讀研(清華錄取外校的學(xué)碩名額是相當(dāng)少的)。
勤思考、多總結(jié)
這個(gè)其實(shí)不必多說。不管那個(gè)行當(dāng),做到 “勤思考、多總結(jié)” 百利無一害。我在《10 年 bloger 告訴你要不要寫博客,又該如何優(yōu)雅地寫博客?》?這篇文章中也提到了,我其實(shí)當(dāng)初最初玩 blog,更多的就是抱著學(xué)習(xí)總結(jié)的態(tài)度。
例如,下圖是我在讀本科和碩士期間相關(guān)課程的學(xué)習(xí)材料,包括老師課件,課程作業(yè)和學(xué)習(xí)筆記和復(fù)習(xí)資料等,這種平日積累總結(jié)很有效,對(duì)于臨近期末考試也能做到不慌不亂,還是很有作用的。

哪怕正式工作之后,寫周報(bào)、月報(bào)等也都是階段性的總結(jié),再比如晉升答辯等等都是需要你日常的思考積累和總結(jié)的。反正將來都會(huì)用得著,何不現(xiàn)在就開始鍛煉呢。
在日常學(xué)習(xí)和工作之中,我們看到一個(gè)問題的時(shí)候,要學(xué)會(huì)思考背后的道理,比如在接到某個(gè)需求的時(shí)候,思考這個(gè)需求最終是要解決具體什么問題,有沒有更好的解決方案?在閱讀某段代碼,思考原作者為什么要這么設(shè)計(jì)?我有更好的方案么?
就比如看到這段代碼,你能否多思考一下其中的奧秘?
public?static?boolean?isEqual(byte[]?digesta,?byte[]?digestb)?{
???if?(digesta?==?digestb)?return?true;
???if?(digesta?==?null?||?digestb?==?null)?{
???????return?false;
???}
???if?(digesta.length?!=?digestb.length)?{
???????return?false;
???}
???int?result?=?0;
???for?(int?i?=?0;?i????????result?|=?digesta[i]?^?digestb[i];
???}
???return?result?==?0;
}
上述代碼中,比較兩個(gè)字符串是否相等,按道理,其實(shí)中間某位不相等就可以直接返回了,但為啥要遍歷完了再返回,這么做的目的是什么?在問了為什么之后,你可能就會(huì)知道,原來這么做是為了防止計(jì)時(shí)攻擊。完整文章可參考本人寫的這篇文章——《這 10 行比較字符串相等的代碼給我整懵了,不信你也來看看》。
總結(jié)
整體來講,針對(duì)“入門進(jìn)階編程”這個(gè)話題,我談了談自己的理解,重點(diǎn)還是要重視基礎(chǔ),通過小項(xiàng)目正向激勵(lì)自己多主動(dòng)學(xué)習(xí),然后做到勤思考,多總結(jié)。
最后,求關(guān)注,本號(hào)會(huì)定期分享一些技術(shù)干貨、職場(chǎng)經(jīng)驗(yàn)等,如果大家對(duì)阿里或者其他大廠感興趣,也可以找我內(nèi)推(我廠 JD 看這里),我可以幫忙提供簡(jiǎn)歷 review 等,希望能和大家積極交流討論,一起學(xué)習(xí)、共同進(jìn)步。
覺得本號(hào)分享的文章有價(jià)值,記得添加星標(biāo)哦。周更很累(基本都是犧牲周末時(shí)間來肝文的),不要白 piao,需要來點(diǎn)正反饋,安排個(gè) “一鍵三連”(點(diǎn)贊、在看、分享)如何???這將是我持續(xù)輸出優(yōu)質(zhì)文章的最強(qiáng)動(dòng)力。


程序猿石頭?
程序猿石頭(ID: tangleithu),現(xiàn)任阿里巴巴技術(shù)專家,清華學(xué)渣,前大疆后端 Leader。用不同的視角分享高質(zhì)量技術(shù)文章,以每篇文章都讓人有收獲為目的,歡迎關(guān)注,交流和指導(dǎo)!掃碼回復(fù)關(guān)鍵字 “1024” 獲取程序員大廠面試指南。

