天天看點

靠譜,這是我見過最好的程式設計指南了!趕快收藏吧,錯過大學就白上了!

從大一入學被調劑到計算機專業,到喜歡上這個專業,再到畢業拿到 10 多個 offer,最終進入理想的大廠工作。回想起這些年确确實實踩過的坑,小北不慎感慨。和我一樣,他在剛學習程式設計的時候也想一口氣吃個大胖子,但卻不盡人意。

我讓小北把這些年來學習程式設計的一些經驗梳理了出來,順帶挑選了一些我認為很值得注意的方面,分享給大家。希望初學程式設計的你,能少走一些彎路。可能文章比較長,但我真心希望你能一字一句地認真讀完,至少,我認為如果我剛學程式設計的那會能看到這篇文章,絕逼是有一些幫助的。

作為一名計算機專業的學生,很多人會認為程式設計是在課堂上學到的,其實不是這樣的。科班比非科班的優勢可能在于知道該去學什麼,知道哪些作業和項目是必須完成的,除此之外,真的是全靠自學。

對于自學程式設計,我認為首先應該考慮的是如何去避免一些坑,這樣可以節約大把的時間。下面我就以問題的形式來分享一些我認為重要的方面。

01、應該選擇哪一門程式設計語言

“我應該學習什麼程式設計語言”,可能是困擾程式設計新手最多的一個問題。很多人一直在糾結這個問題,于是陷入了一種怪圈,這門語言學一點,那門語言學一點,最終什麼也沒學會,時間也白白浪費了。

剛上大一的時候,我也很想知道應該選擇什麼程式設計語言。網上查了很多資料,但答案都略顯片面,無非是“這門程式設計語言難”,“那門程式設計語言性能好”,“某某程式設計語言生态好”。

作為初學者,我認為,沒有哪門子程式設計語言是容易的吧?至于性能好不好,生态好不好,更沒有概念。

如果你沒有明确的方向,那麼很好選擇。如果你學曆高,想走算法、機器學習方向,Python 就是最好的選擇。如果學曆一般,想做個 Web 後端開發工程師,Java 就是最好的選擇。如果學曆還行,想做更底層的工作,C 和 C++ 就是最好的選擇。

可能很多人和我一樣,上大學之前沒怎麼接觸過計算機行業,各種程式設計語言也就是知道個名字,根本不知道它們之間有什麼差别。那索性不要糾結了,我替你做個選擇吧。

如果你是在校大學生,首選的當然是學校給你安排的程式設計語言,畢竟有個可以學習交流的氛圍。如果學校選擇的不是 C 或者 C++,那麼就在私底下自學,千萬不要不學,會在以後的工作中吃大虧的。

C 和 C++ 都很難,看起來似乎不适合入門。但學習程式設計不是隻學習某一門程式設計語言的事,而是要學習一個龐大的計算機知識體系。C 和 C++ 可以幫助你更容易地了解作業系統、編譯原理、計算機網絡、計算機組成原理,因為底層的東西基本上都是靠它們實作的。

如果你已經參加工作了,但剛開始學習程式設計,C 和 C++ 對你來說有些複雜和困難,因為學習它們需要大量的時間,你又無法像在校大學生那樣投入大把的時間。我建議你選擇一門「就業條件更寬泛」的程式設計語言,比如說 Java,難度适中,生态又極其豐富,也能快速做出一些小的應用,在最短時間内看到學習的效果。

當然了,學習任何一門程式設計語言都需要看看與計算機系統相關的書籍,這樣才能更深層次地去程式設計。我強烈推薦你啃一啃這本書——《深入了解計算機系統》。

多啃幾遍後,你就能把整個計算機系統給串聯起來了,學習程式設計也就更有底氣了。

02、需要學習哪些課程

我已經畢業快十年了,偶爾同學們聚會的時候,總能聽見一些同學抱怨說,“大學那會,學校安排的高數、離散數學、線性代數、機率論等等,這些課程對工作壓根就沒有一點幫助,不學也罷。”

對于某些工作來說,這些課程可能沒用,但做算法和機器學習的同學肯定知道,這些課程有用到不行。

之前看過這樣一個視訊。有個同學問一名老師,“老師,學習古文詩歌有什麼用啊?”老師一開始覺得很懵逼,因為他之前沒想過這個問題,學習古文和詩歌又不能掙錢,又不能當官。但思索了片刻後答道,在教育學的理念當中,有 3 個因素是很重要的。第一就是想象,它決定了你有沒有創造性,比如說李白說“為樓高百尺,手可摘星辰”。第二就是直覺敏不敏感,我們看月亮它可能是個月亮,但宋朝有個混蛋說月亮像寡婦的臉,因為他心情不好。第三就是邏輯嚴不嚴謹,有些古文嚴謹到滴水不漏。

同樣的道理,你覺得某些課程沒用,可能是因為你沒用到而已。大學面向的是“面”的教育,什麼課程都講一點,但又不講那麼深。當你工作或者讀研的時候,更多的則是面向“點”的學習,用到的知識更專業,更深入。

如果學校安排了某些課程,你感興趣的話,就使勁學,如果不感興趣的話,可以放輕松點,做到不挂科就行了,然後把精力投入到你更感興趣的方面。沒必要很抗拒,這門課沒用,打死我都不學,這種态度是不可取的。

大學的時候,學校不知道你以後是搞算法還是搞架構,還是搞伺服器開發或者搞硬體,是以學校需要你多學習一些課程,盡量都有個了解。對于學生來說,一方面可以從中選擇自己感興趣的方向,一方面對未來的就業方向有所啟發。

我給大家一些建議吧。

如果你是在校大學生,可以在學習一段時間理論知識後,做個小項目,将做項目遇到的問題記錄下來,針對性地學習相關知識,然後再實踐,讓知識成網絡發射狀地變大。

如果你已經參加工作,那麼就針對工作中遇到的疑難雜症系統性地學習,做個能夠解決問題的人,這樣你不僅能夠成為公司不可或缺的那個人,還可以最有價值的知識學到手。

03、學習程式設計是否需要指定計劃

其實不隻是學習程式設計需要制定計劃,其他任何學習和工作都需要制定計劃。小北在上大學的時候就開始定期給自己制定計劃,這個習慣一直保持到他工作以後,按照他自己的話叫做受益匪淺。

我自己在平常學習的時候,也喜歡先做計劃,然後按照計劃表去落實。比如我在學習 Java 基礎的時候,會先畫一個思維導圖,然後按照裡面的每個節點再深入地去學習。

下圖是 2016 年 10 月 30 日的計劃,那時候小北已經大四了,并且已經找到了工作、簽了滿意的 offer。當時已經沒有什麼課了,按理說可以放松放松了,不過小北還是制定了一些學習計劃,并且選擇在 11 月去百度實習。

從内容上看,主要是學習英語和計算機專業課,因為大一大二的時候小北确實不明白為什麼要學習專業課,到了大三想清楚原因後,就一直在重新學習,因為計算機專業課真的很重要!學好了這些課,能讓你在日後的學習工作中輕松不少。

除了大四制定的計劃外,大二的時候小北也制定過較為詳細的學習計劃,見下圖,我都有點自愧不如,說實話,太強了。他把需要學習的内容編了号,存入表格,做起來就有條不紊了。當然了,很難完全按照計劃去執行,不過制定相應的計劃能讓你清楚地知道自己應該幹什麼。

04、程式設計是否需要做筆記和寫部落格

反正我一開始的時候,把寫部落格當成了做筆記的形式。雖然部落格寫出來是給大家看的,但一開始沒什麼浏覽量,讀者就隻有自己,很無所謂的心态。不管你寫不寫部落格,我都強烈建議你記筆記,并且記筆記是一個長期的過程。

就程式設計而言,我們需要善用搜尋引擎,因為搜尋引擎會給我們提供各式各樣的答案。但答案畢竟是别人的,如果隻是照搬的話,可能有用,但你記不住,知識就不屬于你,之後你遇到同樣的問題,還是要再搜尋一遍,并且搜尋引擎提供的答案不是一成不變的,可能過了一段時間後,你就找不到原來你想要的那個答案了。

但記筆記不一樣,筆記是定制化的,按照你自己的風格定制的,你用自己最喜歡的方式,自己既能看得懂,也能記得住。之後再遇到相同的問題時,也可以快速地通過筆記找得到。

另外,我需要特别提醒你的一點就是,筆記是一種不可多得的财富。如果你以後想寫部落格了,這些筆記就是最寶貴的素材,可以直接拿來用的。

小北已經記錄了四年多了,總共積累了 1G 多的内容,已經形成了他自己的知識體系,給大家展示其中的一部分看一看。

05、需要刷題嗎

不管你是刷 LeetCode,還是 OJ(Online Judge),我認識是需要的,但不要“走火入魔”!小北在上大學的時候,身邊就遇到了很多搞計算機競賽的人,他們之間都互相稱對方為“XX 神”,使用某個算法,将程式的運作時間從 1 秒降低到 0.999 秒之類的。

我認為刷題不應該是奔着這個目的去的,而是适應寫代碼的感覺。在這個過程中你會遇到編譯錯誤,你會慢慢去記住一些文法、關鍵字,并了解一些概念,還可以自己去使用它,比如實作資料結構。慢慢的你就會變得有經驗,知道一些錯誤産生的原因。

刷題到一定程度後就沒必要一直刷下去了,可以到 GitHub 上找一些優質的開源項目來看,然後嘗試去增加一些功能或者優化一些代碼,這樣的話,程式設計能力就能夠大幅度的提升。

刷題除了可以鍛煉程式設計能力,對找工作也是有很大幫助的,因為大廠都喜歡這麼幹。

一開始,刷 LeetCode 可能會很吃力,怎麼辦呢?我強烈推薦這份谷歌大佬的 Leetcode 刷題筆記,這位谷歌大佬當年在美國卡内基梅隆大學攻讀碩士學位時,為了準備實習秋招,他從夏天開始整理 Leetcode 上的題目,幾個月的時間,刷了幾百道題目。

憑借着紮實的基礎和長期的勤奮,他很快找到了如願的工作。後來,他想啊,自己刷了那麼多題,而且對很多題目的解法都有着自己的了解,為什麼不把這些題目歸納總結一下,做成一個便于後來者閱讀學習的電子書呢?

于是他就把這份 PDF 開源了出來。我仔細看了一下,每一道題的題解都寫得非常清楚。

引用大佬的話來說,就是:

本書分為算法和資料結構兩大部分,又細分了十五個章節,詳細講解了刷 LeetCode 時常用的技巧。我把題目精簡到了 101 道,一是呼應了本書的标題,二是不想讓讀者閱讀和練習時間過長。

從我的直覺感受來說,這是一本用心的資料結構算法類書籍,全書總共 143 頁篇幅,詳細講解算法的内容有十五個章節。每個章節都是一些重要的知識點,伴有基礎講解和例題介紹,當然,也有一些推薦的練習題。

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

從排版上也可以看得出,整本書制作得非常精美。如果你需要這份 Leetcode 刷題筆記的話,我貼一下位址。

連結:https://pan.baidu.com/s/1ojBerkBfgMFpYcj-JfDKlw 提取碼:5ttz

還有一份 BAT 大佬的刷題筆記。不管你使用的程式設計語言是 Java、C++,還是 Go,都可以學習,适合刷題的同學反複學習。認真地揣摩其中的架構思維,你會發現,這是一本非常用心的刷題類書籍。筆記總共 1200 頁,分程式設計技巧、線性表、字元串、棧隊列、樹、排序、查找、BFS、DFS、貪心、動态規劃等。

每個章節都會先講解架構思維,然後挑選非常典型的十幾道 LeetCode 題進行實戰講解:

不僅排版十分精美,内容也異常充實,每一題都是細緻的講解,有時候還會配上圖檔,就怕你搞不懂,大大的良心啊!

如果你恰好要學習算法、資料結構,或者年後找工作,一定不要錯過。貼一下下載下傳位址:

連結:https://pan.baidu.com/s/12RT8pRk6OUNa1PuYkqZliw 提取碼:8w3m

如果你想刷 OJ 的話,可以去北京大學、浙江大學、全美計算機奧林匹克競賽的網站。裡面有大量曆年的競賽題目,注冊一個 ID,然後用自己熟悉的語言(一般有 Pascal/C/C++/Java)寫好源代碼送出即可,會實時傳回資訊告訴你是否正确。

北京大學:

http://poj.org

浙江大學:

https://zoj.pintia.cn/contests

全美計算機奧林匹克競賽:

http://www.usaco.org/index.php?page=contests

06、看書還是看視訊

看視訊入門,看書進階。

視訊能用較短的時間告訴你你現在所學的技術可以幹什麼,可能需要先修哪些知識,可以幫助我們搭建一個入門知識體系。

我最近在 B 站上發現了兩個不錯的視訊,推薦給大家看一下。能堅持看完,絕對受益匪淺。

清華大學的作業系統:

https://www.bilibili.com/video/BV1js411b7vg

清華大學資料結構與算法:

https://www.bilibili.com/video/BV1jt4y117KR

看書的重要性我就不再贅述了,不管到了什麼時候,看書仍然是吸收知識最佳的途徑。你渴望力量嗎?機械工業引進的黑皮書系列,你值得收藏。這些闆磚書無論是用來墊顯示器還是桌子腿,都是非常好的選擇。

《C 程式設計語言》、《算法導論》、《深入了解計算機系統》、《現代作業系統》、《計算機程式的構造和解釋》、《編譯原理》、《設計模式》、《計算機網絡》、《資料庫系統概論》等等,這些書啃下來确實比較吃力,可能不太适合初學者,但這些就是計算機方面的經典書籍。

我知道,你肯定也想要擷取這些電子書,有!

CodeChina:

https://codechina.csdn.net/mirrors/itwanger/JavaBooks

GitHub:

https://github.com/itwanger/JavaBooks

碼雲:

https://gitee.com/itwanger/JavaBooks

這一套下去,你就會擁有知識與力量!!! 等待着你的隻會是重塑于新生!!!面試的時候更輕松了,寫起代碼更流利了,腰不酸了腿不痛了,頸椎也不難受了,高薪升職再也不是夢了!!!還等什麼,心動不如行動,程式設計黑皮書,誰讀誰知道,讀了你不後悔,讀了你不吃虧! 成為大拿的機會就在眼前,還等什麼,行動起來!!!

最好的程式設計指南,二哥和你一起補上,沖!

二哥經過重重海選,終于入圍了 CSDN 2020 年部落格之星投票環節。本來不打算拉票了,但意外發現二哥已經悄悄排名前 30 了,不拉拉票對不起各位投票的小夥伴啊!