初學(xué)編程丨從零開(kāi)始學(xué)習(xí)編程的基本路線,BAT程序員親手總結(jié)!
編程并不是說(shuō)代碼怎么寫(xiě),框架怎么用,業(yè)務(wù)怎么轉(zhuǎn)換為代碼邏輯,這些都不是編程的要素(但卻是工作的剛需......)。我認(rèn)為按照下面這個(gè)路線來(lái)學(xué)習(xí)編程,會(huì)使自己在學(xué)習(xí)的路途上少去很多問(wèn)題(比如為啥會(huì)有多線程問(wèn)題啊,什么是阻塞啊,為啥單線程模型反而更快啊,I/O為啥是阻塞的啊,為什么要報(bào)NPL錯(cuò)誤啊等等等等,可能不太恰當(dāng),打個(gè)比方嘛)。

先學(xué)一門程序語(yǔ)言
首先得掌握編程的邏輯。
要學(xué)會(huì)把生活中的問(wèn)題,用程序語(yǔ)言的方式來(lái)轉(zhuǎn)換。最簡(jiǎn)單的學(xué)習(xí)就是直接學(xué)一門編程語(yǔ)言。可以是C/C++,Python,Go,Java, C#,Kotlin,Swift等等面向?qū)ο笳Z(yǔ)言,隨便選一個(gè)喜歡的/以后會(huì)用到的都可以。
你會(huì)學(xué)習(xí)到變量、循環(huán)、條件判斷、類與對(duì)象、基本數(shù)據(jù)結(jié)構(gòu)的一些用法甚至更深一些,獲取文件、控制欄輸入輸出等之類的東西。這是一門程序語(yǔ)言的基礎(chǔ)。
然后最好開(kāi)始學(xué)習(xí)數(shù)據(jù)結(jié)構(gòu)
因?yàn)榇藭r(shí)掌握了基本編程語(yǔ)言的你,是完全可以把理論的數(shù)據(jù)結(jié)構(gòu)轉(zhuǎn)換為代碼邏輯的。數(shù)據(jù)結(jié)構(gòu)一般不需要了解一些底層復(fù)雜的機(jī)制,也暫時(shí)無(wú)需考慮并發(fā)問(wèn)題?;镜木€性表、樹(shù)狀結(jié)構(gòu)、圖型結(jié)構(gòu)、查找/排序算法,高級(jí)數(shù)據(jù)結(jié)構(gòu)等等,慢慢學(xué)習(xí)并總結(jié),嘗試用這些數(shù)據(jù)結(jié)構(gòu)與算法去類比生活中的一些事務(wù)。那時(shí)你會(huì)發(fā)現(xiàn),算法無(wú)處不在(就跟數(shù)學(xué)一樣)。

可以上LeetCode看看了
掌握了編程語(yǔ)言與數(shù)據(jù)結(jié)構(gòu),就去刷題吧。魯迅說(shuō)過(guò),刷題千萬(wàn)遍寫(xiě)代碼如有神。大膽地刷吧,不會(huì)就看答案,去理解答案,然后思考并總結(jié)其方法,最好是寫(xiě)文章記錄下來(lái)。寫(xiě)文章不要記流水賬,一定要你完全弄明白了再去寫(xiě),保證寫(xiě)下來(lái)的都是自己所領(lǐng)會(huì)到的(雖然百分之九十九都是別人寫(xiě)過(guò)的...承認(rèn)吧這就是事實(shí)...)。LeetCode社區(qū)還會(huì)有一些比賽之類的,雖然我還沒(méi)去體驗(yàn)過(guò)。
計(jì)算機(jī)是如何運(yùn)作的?
如果你不知道計(jì)算機(jī)到底是怎么運(yùn)作的,那你也很難去深刻理解你寫(xiě)的那些涉及多線程、I/O、文件、網(wǎng)絡(luò)的代碼的原理。《計(jì)算機(jī)組成原理》《操作系統(tǒng)》《計(jì)算機(jī)》這兩本書(shū)也是計(jì)算機(jī)系學(xué)生的必修課。為啥要學(xué)這個(gè),這不明擺著嘛。。
一開(kāi)始挺枯燥的,慢慢看,有耐心一點(diǎn)。其中會(huì)有一些東西運(yùn)用到數(shù)據(jù)結(jié)構(gòu),正好派上用場(chǎng)。
要理解處理器、磁盤、網(wǎng)絡(luò)、內(nèi)存這些東西的基本運(yùn)作方式,后面才能為你解決一些想不通的問(wèn)題(比如讀取文件時(shí)為啥CPU可以暫時(shí)掛起啥都不干)。
看完這些知識(shí)后你也基本上理解了你寫(xiě)的代碼到底是在干嘛了。

做一個(gè)網(wǎng)站或者手機(jī)App或者桌面App?
此時(shí)你應(yīng)該基本掌握你學(xué)的這一門語(yǔ)言了。你想做一點(diǎn)什么,比如你學(xué)了Kotlin想開(kāi)始做安卓應(yīng)用?上google看開(kāi)發(fā)文檔或者買本書(shū)照著學(xué)就行了。照著步驟一步一步來(lái),不會(huì)難倒你的。也許會(huì)有一些疑問(wèn),為啥這個(gè)地方會(huì)這么設(shè)計(jì)啊,為啥這些東西可以這么用啊,此時(shí)去學(xué)一些設(shè)計(jì)模式,然后你也許就能理解為啥源代碼里一些東西會(huì)這么設(shè)計(jì)。
學(xué)網(wǎng)站的話,C#、Java、Python之類的都可以做到。另外由于網(wǎng)頁(yè)肯定是瀏覽器打開(kāi),所以你還得去學(xué)一學(xué)前端的東西(JS、Html、CSS)。難不到你的,只是做基礎(chǔ)網(wǎng)頁(yè)(基本的數(shù)據(jù)展示與輸入)的話用不了太多知識(shí)。網(wǎng)上各種資源都有,去照著做就是了。另外學(xué)一學(xué)基本的UI設(shè)計(jì)、平面設(shè)計(jì)知識(shí)會(huì)讓你寫(xiě)出來(lái)的網(wǎng)頁(yè)更好看一些(起碼得配上自己帥氣的臉吧)。
后端比如Java(目前我只會(huì)這個(gè)),目前開(kāi)發(fā)網(wǎng)站最需要的就是spring-boot了,百度去搜,或者掘金站內(nèi)都有很多東西我就不講了,可以基于servlet也可以基于netty來(lái)開(kāi)發(fā),隨便你。甚至你還可以用kotlin來(lái)開(kāi)發(fā)Java后臺(tái)項(xiàng)目。Kotlin你就理解為是Java語(yǔ)言的一種方言就好了,百分之百兼容Java,且某些方面更好用。在學(xué)這些框架的過(guò)程你也會(huì)更加深入地接觸到I/O、網(wǎng)絡(luò)、多線程的知識(shí)。學(xué)習(xí)一門語(yǔ)言到越后面就會(huì)發(fā)現(xiàn)知識(shí)都是相通的,前面學(xué)到的東西都能為你提供幫助。
桌面應(yīng)用的話C#無(wú)疑是王者了。畢竟巨硬滿天下。但是也有一些其他方法可以開(kāi)發(fā)桌面應(yīng)用比如基于JS的Electron、還有基于C++的Qt。很多,我比較推薦C#(如果你沒(méi)學(xué)過(guò)C#可以去學(xué)一學(xué),此時(shí)的你多學(xué)一門語(yǔ)言僅僅是一兩周就搞定的問(wèn)題,當(dāng)然我指的是能用而不是深入。多學(xué)一門語(yǔ)言也能讓你認(rèn)識(shí)到不同的編程語(yǔ)言之間的差異與優(yōu)缺點(diǎn))。

繼續(xù)深入?服務(wù)器 or 客戶端
服務(wù)器自然就是指Java這類后端方向的領(lǐng)域了,而客戶端則代表了網(wǎng)頁(yè)前端、桌面/手機(jī)App這類方向。因?yàn)槎咦⒅氐姆较虺霈F(xiàn)了差別。所以深入工作的話,你就要在自己所擅長(zhǎng)的領(lǐng)域多下功夫。
后端自然要去研究分布式、緩存、消息、SOA模型之類的東西,這些能讓你的后端網(wǎng)站擁有更健壯的體格,讓它們能夠長(zhǎng)久地運(yùn)行下去;你要多了解一下服務(wù)器Linux系統(tǒng),因?yàn)橐院髸?huì)經(jīng)常打交道的。后端的東西很深入,也許發(fā)展到一定程度你要根據(jù)具體的需求去創(chuàng)建輪子或者改造現(xiàn)有的輪子。任重而道遠(yuǎn)吶~
前端則更加注重用戶體驗(yàn),界面交互邏輯、性能之類的,因?yàn)槭怯脩糁苯涌吹降?、直接觸碰到的。畢竟客戶端就那么大(你面臨的可能是一臺(tái)十年以上的IE瀏覽器 / 一臺(tái)iPhone5 / 一臺(tái)小米2S,你懂的,如果人人都是Surface Laptop或者iPhone11Pro或者華為保時(shí)捷那就沒(méi)啥好擔(dān)心的了,不可能嘛),你要在有限的資源中不斷挖掘性能,具體我就不懂了咱暫時(shí)也不會(huì)~~
寫(xiě)在最后
也許你需要學(xué)習(xí)一下英語(yǔ),當(dāng)然你會(huì)的話就當(dāng)我沒(méi)說(shuō)。編程畢竟源自國(guó)外,學(xué)的東西都是從國(guó)外傳來(lái)的,官方很多的資源都是英文版,所以英語(yǔ)格外重要。
也許不是很全面!但大概是一個(gè)比較正確的方向吧!希望對(duì)大家有幫助吧~
如果你選擇的是C/C++的方向的話,自學(xué)C/C++編程難度很大,不妨關(guān)注UP主頁(yè),UP上傳了一些學(xué)習(xí)視頻教程,希望對(duì)你有幫助哦~
最后就以一份關(guān)于C/C++編程的學(xué)習(xí)路線來(lái)結(jié)束吧!




歡迎評(píng)論、點(diǎn)贊、收藏、投幣、轉(zhuǎn)發(fā)