看你是什麼方向了。

我推薦一開始還是學習 C 語言,因為他真的大道至簡,並且順便能逼著自己了解一些計算機原理,而且能碰到一些更加底層的東西(

功利心不要太重,打好基礎,終生受益。

我倒是推薦 小甲魚 的 C 語言視頻,B站優酷大概都有。

書的話,《C Primer Plus》算嗎(


這類問題我好像看到好多遍了

我依舊覺得你可以去某寶某東看看

這是以前的一個回答。

請問各位大佬想自學編程需要看什麼書??

www.zhihu.com圖標大學本科如何深入的學習一門編程語言??

www.zhihu.com圖標

太多了,不知道你想學具體哪方面的,可以關註:http://nndev.cn


相信每個初入計算機編程大門的小白都會有很多問題?例如我應該學習哪門編程語言?學習了這門編程語言我能進入 BAT 大廠嗎?除了編程語言我還要學習什麼?

網上有很多文章講述初學者應該如何去學習,內容五花八門,錯綜複雜。文章翻了又翻,初入編程大門的小朋友們最終還是無法下定決心,反而看了以後開始變得更加迷茫,懷疑自己的智商。

在這裡我想要說的是,我和你一樣曾經也迷茫過,不是因為你太笨,而是因為互聯網上的知識太多了,作為初學者的你根本不知道如何抉擇。

我和你一樣,曾經迷茫過,但慶幸的是我最後找到了答案,打開了計算機編程的大門。

如今作為一個編程近十載的老碼農,我想就此將我的經驗分享與你。此文僅代表的我的個人觀點,歡迎一起討論學習。

我將編程生涯分為了三個階段,並且我會告訴你這三個階段你分別要掌握什麼樣的技能,以及這三個階段你可以做什麼樣的事情。

三個階段

站在食物鏈頂端的程序員必然會經歷過三個階段。

悲催的是有些人整個職業生涯都處於第一階段,而還有一部分停留在了第二階段,只有少量的人才能進入第三階段。

這三個階段分別是:碼農(代碼民工)、程序員 和 架構師。

接下來我們一起詳細聊聊這三個階段:

第一階段:碼農

每個程序員都會從碼農做起。

還記得大學上第一節 C 語言課程的時候老師問誰有編程經驗,教室裡面有十來個同學舉起手來,然而那時候我不知道編程是什麼。沒錯,很多人還沒進入大學就達到了碼農階段。

碼農到底是什麼,如何定義碼農?

碼農知道如何跟機器交流,他可以編寫計算機能讀得懂的文字。

當遇到一些問題時候,碼農可以將問題轉換為計算機可以讀懂的代碼,讓計算機幫助我們幹活(不管三七二十一,先 run 起來再說)。

如何你在這個階段感覺到非常痛苦和難受,那麼你應該認真思考一下是不是適合程序員這個職業。

如果 feel so good,那麼恭喜你,你有可能會成為一個不錯的程序員。

然而可悲的是,很多人在整個職業生涯中都處於碼農這一階段。

但是我要告訴你的是,這一階段的你雖然能幹活,但是很容易被年輕人替代,因為隨著你年紀的增長,年輕人會比你更有活力,而且他們可以忍受拿更少的錢,搬更多的磚頭。

如果你只是個碼農,你的晉陞機會也會很少,同時意味著你的薪水也會較少。

如果你想加入 BAT 級別的大公司,這個階段的你會處處碰壁,面試一次被打擊一次,你會面到開始懷疑人生,自暴自棄。

因此你需要掌握更多的技能,然後達到第二個階段,成為一名程序員

第二階段:程序員

在這個階段,你可能接觸了至少 2 門編程語言,一個動態類型語言和一個靜態類型語言。

程序員本質上是一個高級的碼農,那麼我們該如何進一步提升自己呢?

碼農編寫可以正常 run 起來的代碼,俗稱搬磚。而程序員呢,是編寫高質量高性能的可以 run 的代碼,俗稱高級搬磚(哈哈哈)。

那想成為程序員你需要掌握哪些技能呢:

  • 了解代碼最終如何變成硬體晶元可以理解和執行的指令。
  • 了解如何讓代碼有效利用計算機資源,例如 處理器、內存和網路。

  • 了解如何使用數據結構和演算法編寫高效的代碼。
  • 了解代碼質量很重要,並且會編寫測試代碼。

到此你是不是被嚇到了,成為程序員居然還有這麼多知識要學習,安安靜靜地做一個碼農不香嗎。

我要告訴你的是,碼農很多,但是真正基礎紮實的程序員並不多。如果你能靜下心來修鍊內功,達到這一階段,BAT 的大門將隨時為你敞開,你會收穫更多的東西。

絕大多數人一輩子都會停留在這個階段,直到退休。

第三階段:架構師

很悲催的告訴你,編程永無止盡,你需要不斷的去學習去進步。

當你到達這個階段時候,你會站在一個更高的角度,對系統的全局的思考比對細節的細膩了解更多。

你對設計大型分散式系統有紮實的了解,並且知道如何構建高可用,高並發,高可伸縮的大型分散式系統。

你永遠不會停止學習,並且始終關注前沿的技術,當然你可能也會創造出一些技術。

在這個級別上,你可能會負責公司的大型項目,並且管理著一個團隊,團隊裡面有幾個骨幹程序員和多個碼農來完成工作。

你可能會經常和其他團隊開會討論和制定技術方案,同時你需要有出色的社交和領導才能。

如上就是我認為的程序員職業發展的三個重要階段,那麼接下來我們一起聊聊在這三個階段我們該如何去學習,逐步打怪升級走向程序人生的疊峰。

1 - 編程

首先考慮如何成為一個碼農,在這個階段你往往會有這樣的困惑,我到底該學哪門編程語言?

Java,Python,C#,Ruby,Go,JavaScript 。。。

其實你不應該為選擇編程語言發愁,因為這個階段,重要的不是特定的編程語言,而是一些編程的概念。這些概念在幾乎所有其他編程語言中都適用。

當你成為經驗豐富的程序員時,學習一種新的編程語言所需的時間不超過一個星期,所以不要浪費時間去糾結 「完美的」 編程語言,因為根本不存在,也沒有必要。

話雖如此,我還是會推薦 2 門編程語言給你,從最簡單的開始慢慢建立自信心,打怪升級從編程中獲得樂趣。

Python

我強烈建議你從 Python 開始學習。

為什麼?

因為 Python 是一門非常易於學習的語言,它真的,真的,真的很容易!

Python 是一門高級的編程語言,使用它可以非常快速的開發出一個程序,正如 Python 之父的名言:人生苦短,我用 Python。

誇張一點說,100 行 Java 代碼完成的事情,Python 只要一行就搞定了。

那麼如何學習 Python 呢?

在此推薦一下廖雪峰大神的在線圖文 Python教程,這是比較全面的一套教程。

如果要繼續簡單點,你還可以在這個在線學習網站開始學習:Python 基礎教程

當然最好還是要搭配一本書一起學習,我推薦一下《Python 編程從入門到實戰》,喜歡讀紙制書的同學,它可以是你的一個選擇。

Java

學完 Python 之後,我強烈建議你學習另外一門語言 Java。學習 Java 將會把你帶入面向對象的世界,這是和面向過程完全不同的編程思想。

Python是一種動態類型的語言,而 Java 是一種靜態類型的語言,此時你可能一臉懵逼,當你學完這兩種語言之後你會茅塞頓開。

Python 和 Java的組合是很好的入門方法,學習他倆你會掌握到幾乎所有的編程概念,為以後學習其他編程語言打下紮實的基礎。

我要告訴你的是,Python 和 Java 目前在企業里被大量使用,同時 Python 是機器學習首選語言,Java 是大數據生態的核心語言,學習他們也會更利於你找到一份好的工作。

對於 Java 的學習,初期我建議你主要學習 Java Core 知識,等到熟悉以後再去學習高階知識。此時,我不再會推薦你去在線網站學習,因為你已經擁有了編程基礎,同時有了很強的動手能力,我會推薦你從書籍入手。

學習 Java 當然少不了經典的 Java 編程思想,我推薦 Bruce Eckel 大師的最新 Java 巨作《 On Java 8 》,這是內容相當充實的一本書,學完它你將掌握 Java 編程的核心技能,同時關於 Java 語言的面試題對你來說將會是小菜一碟,不信你讀讀看?

如果此時你仍然不滿足,我會推薦你去學習一下 Java 之父 James Gosling 鼎力推薦的 《 Effective Java 》,它將教會你如何寫出高效的 Java 代碼,學完此書你的 Java 技能將會更上一層樓,此時你已經甩掉一大部分 Java 碼農。

此處我要恭喜你!你已經獲得碼農資格證!

2 - 計算機的構造

此時你已經可以寫出大量的代碼,但是你真的明白計算機底層究竟發生了什麼嗎?

假設你編寫了一個非常簡單的程序,列印 Hello World 到屏幕上。

例如用 Python 來編寫:

hello = Hello World
print(hello)

在硬體級別,變數分配(hello = Hello World)是什麼意思?字元串 Hello World 在硬體中如何表示?結果如何顯示在你的屏幕上?

歸根結底,計算機只是硬體晶元和電線的集合。

計算機到底是怎麼理解我們的代碼,並且完美的執行呢?小朋友你是否有很多問號?

事實是,代碼只是最表面的東西。代碼下還有許多其他層,它們一起互相協同工作,最終執行了我們輸入的代碼指令。

相信此時你已經迫不及待的去解決頭上的眾多問題,不要著急,我推薦一本書給你。

這本書從最基礎的角度介紹了硬體,編譯器,鏈接器和操作系統,非常適合初學者。

它將告訴你,如何創建一種編程語言,如何創建編譯器和鏈接器,最後創建操作系統。

3 - 演算法和數據結構

現在你處於高度興奮狀,此時你的編程思維發生了轉變。

因為現在,你知道代碼之下計算機是怎麼運行的,硬體是如何工作的。

你知道硬體資源是有限的,並且了解如何高效利用有限的資源。

但是還不夠,我們要學習演算法和數據結構。數據結構和演算法是進入 BAT 大廠的必考項目,當然我們學習數據結構和演算法也不僅僅是為了進入大廠,歸根結底還是為了寫出高效的代碼,具體可以參考我之前的文章:面試了一個月,到底要不要刷演算法?我有了答案

在演算法和數據結構方面,如果你已經掌握了 Java 編程,那麼我推薦你從下面這本書入門:

好吧,書確實挺厚的,但是書中的內容絕對值得你去花時間學習,學完此書,你將紮實的掌握數據結構和演算法。

如果你不喜歡選擇這本以 Java 描述的演算法書,如下這本也是一個不錯的選擇:

4 - 網路

到目前為止,我們還沒有談到網路,生活在互聯網時代,我們的程序不可能僅僅單機運行,因此作為一名合格的程序員掌握網路是必不可少的。

基礎知識是枯燥的,尋找一本有趣的書是非常有必要的。

如上《計算機網路:自頂向下的方法》是一本超級容易理解的書,它涵蓋了你需要知道的所有的網路基礎知識,同時也是一本你可以用來墊桌角,適當時間查詢的資料書。

學完此書,相信你會回來感謝我的推薦。

5 - 操作系統

如果你按照我推薦的學習順序,此時知道了計算機的組成原理,網路,演算法數據結構,那麼是時候開始學習操作系統了。

操作系統基本採用 C 語言編寫,所以你需要一些 C 語言的基本知識。

操作系統是非常繁雜龐大的知識體系,了解它的各個方面的所有細節非常耗時。我不建議你陷入細節,除非你想成為一名操作系統研發人員。

在這裡,你只需要掌握基本操作系統概念,然後繼續前進,不要被繁雜的細節揪住。

學習操作系統你可以參考如下這本書:

恭喜你!此時你已經是一名合格的程序員了!

6 - 分散式系統

分散式系統是關於構建和設計可伸縮的軟體系統,避免單點故障。這要求我們站在更高的層次考慮問題,而不是專註於如何編寫一個模塊組件(程序員和碼農)。

舉個例子,例如你想要和你的好朋友通過軟體進行聊天通訊,你租用了一台伺服器,上面運行了聊天服務端,你和朋友的電腦上都運行了聊天客戶端,此時你們可以開始愉快的聊天了。

相信通過前面的學習過程,這對你來說簡直易如反掌。

但是當你的朋友的朋友知道了這個工具,也想加入進來,朋友的朋友的朋友也知道了,你的客戶滿滿的變得巨多無比。

現在,你的服務每秒可以收到數百萬個聊天客戶端的請求。

假如此時你的聊天伺服器出現故障怎麼辦?

數百萬的請求將無法得到滿足,此時應該開始考慮分散式系統設計問題了。

分散式系統是在單台機器無法滿足我們的請求時候,將多台機器通過軟體連接在一起,共同對外提供服務。

當請求量增加時,我們可以靈活的添加服務節點。同時如果某個節點故障後,整個系統仍然可以對外提供服務。

此處,我推薦《分散式系統概念與設計》,它可以幫助你掌握分散式系統設計的基本原理。

7 - 機器學習

機器學習是一個橫跨計算機科學,數學和統計學的領域,它是個硬骨頭。

但是在當今時代,它被無處不在的使用!

例如每天刷抖音的小朋友應該深有體會,刷抖音一時爽,一直刷一直爽,都是機器學習搞的鬼,拚命的推薦你喜歡的東西。

即使你不從事相關的工作,我也建議那你學習了解一下它。

為什麼?萬一機器哪天會自己寫代碼了怎麼辦(哈哈哈)。

但是想要做這樣的事情,我們還需要有數學和統計學基礎,以及一些機器學習類庫,例如,Python 的 Scikit-Learn。

機器學習主要有 2 種方法,一種方法和我們學習計算機基礎知識類似,上來就是干,先學習類庫擼代碼,然後再補充理論知識(個人更喜歡這種);另外一種方式是先學習理論,數學、統計學和機器學習演算法,這種方法在前期比較枯燥,初學者容易受挫。

當年學習 Java 我就採用了第一種方法,先直接擼代碼,做項目,然後再鞏固理論知識。這種方法容易形成正反饋,寫代碼一時爽,一直寫代碼一直爽。

一定有很多人採用這種方式,是的小朋友請舉手。

但這種方法的缺點是,有時候比較難理解為什麼這樣做,這樣做就沒 Bug 了,因為我們缺少了理論知識。

相信你一定聽說過大名鼎鼎的 Andrew Ng,他在 Coursera 發布的課程可以作為你的機器學習入門課程,這門課程裡面沒有採用 Python,採用了另外一門語言,具體原因相信你看到就懂了,Andrew 老師會細細的告訴你,哈哈。

如果你確確實實照我說的學習了上面的機器學習課程,那想必你應該已經知道了 Kaggle,去吧體驗用技術賺錢的快感,嘿嘿。

恭喜你成神了!現在我認為你是一名架構師了!

摘自我的知乎文章:

尼克:假如時光倒流,我要這樣學編程?

zhuanlan.zhihu.com圖標

我個人路徑

自學過程:Python→PHP→MySQL→(前端+JavaScript)→Linux(剛剛開始)

學校安排:c→c++(可以學Java我沒選)

隨便找個感興趣的方向就行,反正該踩的坑一個也少不了。


你說的是哪門編程語言?建議看官網,一般官網都會有技術文檔說明和論壇。


推薦閱讀:
相关文章