靠譜,這是我見過最好的編程指南了!
從大一入學(xué)被調(diào)劑到計算機專業(yè),到喜歡上這個專業(yè),再到畢業(yè)拿到 10 多個 offer,最終進入理想的大廠工作?;叵肫疬@些年確確實實踩過的坑,小北不慎感慨。和我一樣,他在剛學(xué)習(xí)編程的時候也想一口氣吃個大胖子,但卻不盡人意。
我讓小北把這些年來學(xué)習(xí)編程的一些經(jīng)驗梳理了出來,順帶挑選了一些我認為很值得注意的方面,分享給大家。希望初學(xué)編程的你,能少走一些彎路。可能文章比較長,但我真心希望你能一字一句地認真讀完,至少,我認為如果我剛學(xué)編程的那會能看到這篇文章,絕逼是有一些幫助的。
作為一名計算機專業(yè)的學(xué)生,很多人會認為編程是在課堂上學(xué)到的,其實不是這樣的。科班比非科班的優(yōu)勢可能在于知道該去學(xué)什么,知道哪些作業(yè)和項目是必須完成的,除此之外,真的是全靠自學(xué)。
對于自學(xué)編程,我認為首先應(yīng)該考慮的是如何去避免一些坑,這樣可以節(jié)約大把的時間。下面我就以問題的形式來分享一些我認為重要的方面。
01、應(yīng)該選擇哪一門編程語言
“我應(yīng)該學(xué)習(xí)什么編程語言”,可能是困擾編程新手最多的一個問題。很多人一直在糾結(jié)這個問題,于是陷入了一種怪圈,這門語言學(xué)一點,那門語言學(xué)一點,最終什么也沒學(xué)會,時間也白白浪費了。
剛上大一的時候,我也很想知道應(yīng)該選擇什么編程語言。網(wǎng)上查了很多資料,但答案都略顯片面,無非是“這門編程語言難”,“那門編程語言性能好”,“某某編程語言生態(tài)好”。
作為初學(xué)者,我認為,沒有哪門子編程語言是容易的吧?至于性能好不好,生態(tài)好不好,更沒有概念。
如果你沒有明確的方向,那么很好選擇。如果你學(xué)歷高,想走算法、機器學(xué)習(xí)方向,Python 就是最好的選擇。如果學(xué)歷一般,想做個 Web 后端開發(fā)工程師,Java 就是最好的選擇。如果學(xué)歷還行,想做更底層的工作,C 和 C++ 就是最好的選擇。
可能很多人和我一樣,上大學(xué)之前沒怎么接觸過計算機行業(yè),各種編程語言也就是知道個名字,根本不知道它們之間有什么差別。那索性不要糾結(jié)了,我替你做個選擇吧。
如果你是在校大學(xué)生,首選的當(dāng)然是學(xué)校給你安排的編程語言,畢竟有個可以學(xué)習(xí)交流的氛圍。如果學(xué)校選擇的不是 C 或者 C++,那么就在私底下自學(xué),千萬不要不學(xué),會在以后的工作中吃大虧的。
C 和 C++ 都很難,看起來似乎不適合入門。但學(xué)習(xí)編程不是只學(xué)習(xí)某一門編程語言的事,而是要學(xué)習(xí)一個龐大的計算機知識體系。C 和 C++ 可以幫助你更容易地理解操作系統(tǒng)、編譯原理、計算機網(wǎng)絡(luò)、計算機組成原理,因為底層的東西基本上都是靠它們實現(xiàn)的。
如果你已經(jīng)參加工作了,但剛開始學(xué)習(xí)編程,C 和 C++ 對你來說有些復(fù)雜和困難,因為學(xué)習(xí)它們需要大量的時間,你又無法像在校大學(xué)生那樣投入大把的時間。我建議你選擇一門「就業(yè)條件更寬泛」的編程語言,比如說 Java,難度適中,生態(tài)又極其豐富,也能快速做出一些小的應(yīng)用,在最短時間內(nèi)看到學(xué)習(xí)的效果。
當(dāng)然了,學(xué)習(xí)任何一門編程語言都需要看看與計算機系統(tǒng)相關(guān)的書籍,這樣才能更深層次地去編程。我強烈推薦你啃一啃這本書——《深入理解計算機系統(tǒng)》。

多啃幾遍后,你就能把整個計算機系統(tǒng)給串聯(lián)起來了,學(xué)習(xí)編程也就更有底氣了。
02、需要學(xué)習(xí)哪些課程
我已經(jīng)畢業(yè)快十年了,偶爾同學(xué)們聚會的時候,總能聽見一些同學(xué)抱怨說,“大學(xué)那會,學(xué)校安排的高數(shù)、離散數(shù)學(xué)、線性代數(shù)、概率論等等,這些課程對工作壓根就沒有一點幫助,不學(xué)也罷?!?/p>
對于某些工作來說,這些課程可能沒用,但做算法和機器學(xué)習(xí)的同學(xué)肯定知道,這些課程有用到不行。
之前看過這樣一個視頻。有個同學(xué)問一名老師,“老師,學(xué)習(xí)古文詩歌有什么用???”老師一開始覺得很懵逼,因為他之前沒想過這個問題,學(xué)習(xí)古文和詩歌又不能掙錢,又不能當(dāng)官。但思索了片刻后答道,在教育學(xué)的理念當(dāng)中,有 3 個因素是很重要的。第一就是想象,它決定了你有沒有創(chuàng)造性,比如說李白說“為樓高百尺,手可摘星辰”。第二就是直覺敏不敏感,我們看月亮它可能是個月亮,但宋朝有個混蛋說月亮像寡婦的臉,因為他心情不好。第三就是邏輯嚴不嚴謹,有些古文嚴謹?shù)降嗡宦?/p>
同樣的道理,你覺得某些課程沒用,可能是因為你沒用到而已。大學(xué)面向的是“面”的教育,什么課程都講一點,但又不講那么深。當(dāng)你工作或者讀研的時候,更多的則是面向“點”的學(xué)習(xí),用到的知識更專業(yè),更深入。
如果學(xué)校安排了某些課程,你感興趣的話,就使勁學(xué),如果不感興趣的話,可以放輕松點,做到不掛科就行了,然后把精力投入到你更感興趣的方面。沒必要很抗拒,這門課沒用,打死我都不學(xué),這種態(tài)度是不可取的。
大學(xué)的時候,學(xué)校不知道你以后是搞算法還是搞架構(gòu),還是搞服務(wù)器開發(fā)或者搞硬件,所以學(xué)校需要你多學(xué)習(xí)一些課程,盡量都有個了解。對于學(xué)生來說,一方面可以從中選擇自己感興趣的方向,一方面對未來的就業(yè)方向有所啟發(fā)。
我給大家一些建議吧。
如果你是在校大學(xué)生,可以在學(xué)習(xí)一段時間理論知識后,做個小項目,將做項目遇到的問題記錄下來,針對性地學(xué)習(xí)相關(guān)知識,然后再實踐,讓知識成網(wǎng)絡(luò)發(fā)射狀地變大。
如果你已經(jīng)參加工作,那么就針對工作中遇到的疑難雜癥系統(tǒng)性地學(xué)習(xí),做個能夠解決問題的人,這樣你不僅能夠成為公司不可或缺的那個人,還可以最有價值的知識學(xué)到手。
03、學(xué)習(xí)編程是否需要指定計劃
其實不只是學(xué)習(xí)編程需要制定計劃,其他任何學(xué)習(xí)和工作都需要制定計劃。小北在上大學(xué)的時候就開始定期給自己制定計劃,這個習(xí)慣一直保持到他工作以后,按照他自己的話叫做受益匪淺。
我自己在平常學(xué)習(xí)的時候,也喜歡先做計劃,然后按照計劃表去落實。比如我在學(xué)習(xí) Java 基礎(chǔ)的時候,會先畫一個思維導(dǎo)圖,然后按照里面的每個節(jié)點再深入地去學(xué)習(xí)。

下圖是 2016 年 10 月 30 日的計劃,那時候小北已經(jīng)大四了,并且已經(jīng)找到了工作、簽了滿意的 offer。當(dāng)時已經(jīng)沒有什么課了,按理說可以放松放松了,不過小北還是制定了一些學(xué)習(xí)計劃,并且選擇在 11 月去百度實習(xí)。
從內(nèi)容上看,主要是學(xué)習(xí)英語和計算機專業(yè)課,因為大一大二的時候小北確實不明白為什么要學(xué)習(xí)專業(yè)課,到了大三想清楚原因后,就一直在重新學(xué)習(xí),因為計算機專業(yè)課真的很重要!學(xué)好了這些課,能讓你在日后的學(xué)習(xí)工作中輕松不少。

除了大四制定的計劃外,大二的時候小北也制定過較為詳細的學(xué)習(xí)計劃,見下圖,我都有點自愧不如,說實話,太強了。他把需要學(xué)習(xí)的內(nèi)容編了號,存入表格,做起來就有條不紊了。當(dāng)然了,很難完全按照計劃去執(zhí)行,不過制定相應(yīng)的計劃能讓你清楚地知道自己應(yīng)該干什么。

04、編程是否需要做筆記和寫博客
反正我一開始的時候,把寫博客當(dāng)成了做筆記的形式。雖然博客寫出來是給大家看的,但一開始沒什么瀏覽量,讀者就只有自己,很無所謂的心態(tài)。不管你寫不寫博客,我都強烈建議你記筆記,并且記筆記是一個長期的過程。
就編程而言,我們需要善用搜索引擎,因為搜索引擎會給我們提供各式各樣的答案。但答案畢竟是別人的,如果只是照搬的話,可能有用,但你記不住,知識就不屬于你,之后你遇到同樣的問題,還是要再搜索一遍,并且搜索引擎提供的答案不是一成不變的,可能過了一段時間后,你就找不到原來你想要的那個答案了。
但記筆記不一樣,筆記是定制化的,按照你自己的風(fēng)格定制的,你用自己最喜歡的方式,自己既能看得懂,也能記得住。之后再遇到相同的問題時,也可以快速地通過筆記找得到。
另外,我需要特別提醒你的一點就是,筆記是一種不可多得的財富。如果你以后想寫博客了,這些筆記就是最寶貴的素材,可以直接拿來用的。
小北已經(jīng)記錄了四年多了,總共積累了 1G 多的內(nèi)容,已經(jīng)形成了他自己的知識體系,給大家展示其中的一部分看一看。

05、需要刷題嗎
不管你是刷 LeetCode,還是 OJ(Online Judge),我認識是需要的,但不要“走火入魔”!小北在上大學(xué)的時候,身邊就遇到了很多搞計算機競賽的人,他們之間都相互稱對方為“XX 神”,使用某個算法,將程序的運行時間從 1 秒降低到 0.999 秒之類的。
我認為刷題不應(yīng)該是奔著這個目的去的,而是適應(yīng)寫代碼的感覺。在這個過程中你會遇到編譯錯誤,你會慢慢去記住一些語法、關(guān)鍵字,并理解一些概念,還可以自己去使用它,比如實現(xiàn)數(shù)據(jù)結(jié)構(gòu)。慢慢的你就會變得有經(jīng)驗,知道一些錯誤產(chǎn)生的原因。
刷題到一定程度后就沒必要一直刷下去了,可以到 GitHub 上找一些優(yōu)質(zhì)的開源項目來看,然后嘗試去增加一些功能或者優(yōu)化一些代碼,這樣的話,編程能力就能夠大幅度的提升。
刷題除了可以鍛煉編程能力,對找工作也是有很大幫助的,因為大廠都喜歡這么干。
一開始,刷 LeetCode 可能會很吃力,怎么辦呢?我強烈推薦這份谷歌大佬的 Leetcode 刷題筆記,這位谷歌大佬當(dāng)年在美國卡內(nèi)基梅隆大學(xué)攻讀碩士學(xué)位時,為了準(zhǔn)備實習(xí)秋招,他從夏天開始整理 Leetcode 上的題目,幾個月的時間,刷了幾百道題目。
憑借著扎實的基礎(chǔ)和長期的勤奮,他很快找到了如愿的工作。后來,他想啊,自己刷了那么多題,而且對很多題目的解法都有著自己的理解,為什么不把這些題目歸納總結(jié)一下,做成一個便于后來者閱讀學(xué)習(xí)的電子書呢?
于是他就把這份 PDF 開源了出來。我哥發(fā)給我后,我仔細看了一下,每一道題的題解都寫得非常清楚。
引用大佬的話來說,就是:
本書分為算法和數(shù)據(jù)結(jié)構(gòu)兩大部分,又細分了十五個章節(jié),詳細講解了刷 LeetCode 時常用的技巧。我把題目精簡到了 101 道,一是呼應(yīng)了本書的標(biāo)題,二是不想讓讀者閱讀和練習(xí)時間過長。
從我的直觀感受來說,這是一本用心的數(shù)據(jù)結(jié)構(gòu)算法類書籍,全書總共 143 頁篇幅,詳細講解算法的內(nèi)容有十五個章節(jié)。每個章節(jié)都是一些重要的知識點,伴有基礎(chǔ)講解和例題介紹,當(dāng)然,也有一些推薦的練習(xí)題。

光看書的目錄就覺得非常的震撼,相信你和我一樣,都有這種強烈的感受。整本書,我仔細看了一遍,并對書中的一些解題思路和代碼進行了校驗,確實良心了。第 7 章是講動態(tài)規(guī)劃的,這里摘取了一點內(nèi)容,你可以看到谷歌大佬對于知識點的講解是非常透徹且細致的。

從排版上也可以看得出,整本書制作得非常精美。如果你需要這份 Leetcode 刷題筆記的話,可以在公眾號后臺回復(fù)「008」獲取。
如果你想刷 OJ 的話,可以去北京大學(xué)、浙江大學(xué)、全美計算機奧林匹克競賽的網(wǎng)站。里面有大量歷年的競賽題目,注冊一個 ID,然后用自己熟悉的語言(一般有 Pascal/C/C++/Java)寫好源代碼提交即可,會實時返回信息告訴你是否正確。
北京大學(xué):http://poj.org
浙江大學(xué):https://zoj.pintia.cn/contests
全美計算機奧林匹克競賽:http://www.usaco.org/index.php?page=contests
06、看書還是看視頻
看視頻入門,看書進階。
視頻能用較短的時間告訴你你現(xiàn)在所學(xué)的技術(shù)可以干什么,可能需要先修哪些知識,可以幫助我們搭建一個入門知識體系。
我最近在 B 站上發(fā)現(xiàn)了兩個不錯的視頻,推薦給大家看一下。能堅持看完,絕對受益匪淺。
看書的重要性我就不再贅述了,不管到了什么時候,看書仍然是吸收知識最佳的途徑。你渴望力量嗎?機械工業(yè)引進的黑皮書系列,你值得收藏。這些板磚書無論是用來墊顯示器還是桌子腿,都是非常好的選擇。

《C 程序設(shè)計語言》、《算法導(dǎo)論》、《深入理解計算機系統(tǒng)》、《現(xiàn)代操作系統(tǒng)》、《計算機程序的構(gòu)造和解釋》、《編譯原理》、《設(shè)計模式》、《計算機網(wǎng)絡(luò)》、《數(shù)據(jù)庫系統(tǒng)概論》等等,這些書啃下來確實比較吃力,可能不太適合初學(xué)者,但這些就是計算機方面的經(jīng)典書籍,
這一套下去,你就會擁有知識與力量?。?!等待著你的只會是重塑于新生!??!面試的時候更輕松了,寫起代碼更流利了,腰不酸了腿不痛了,頸椎也不難受了,高薪升職再也不是夢了?。。∵€等什么,心動不如行動,編程黑皮書,誰讀誰知道,讀了你不后悔,讀了你不吃虧!成為大拿的機會就在眼前,還等什么,行動起來?。。?/p>
最好的編程指南,二哥和你一起學(xué),沖!
