學妹問我: 如何提高編程能力


前言
開局兩張圖,剩下全靠吹了。
上面這兩張圖便是寫這篇文章的原由。
對話框的另一邊,是一位大二計算機科班在讀的小姐姐,看似平靜的文字背后透露著迷茫與困惑,還對未來的焦慮。
透過屏幕,似乎看到了大一時的自己,不會裝環(huán)境、不知道怎么編譯,報錯也不會解決,更不知道除了計算水仙花數(shù)、打印乘法口訣表...還能寫些什么。
感同身受讓我覺得有必要認真的好好回答一下(其實是因為這是小姐姐問的?,也算是對大一時的自己一個隔空對話。
做公眾號短短這一個多月,我在后臺看到過不少類似問題的,每次看到學弟學妹們這樣認真又略帶迷茫的提問,其實是比較有壓力的。
怕自己不能夠站在他們的境地去思考問題,搞成了「B」乎似的回答,也擔心自己的回答不能幫到他們,甚至在某些方面對他們產生誤導。
所以一般我都是選擇回答比較政治正確的那種,比如:
“加油,你要多去實踐,xxx”
“嗯嗯,你要多去看書,balabala”
“剛開始都是這樣的,你多堅持一下呢,xxx”
...
怎么說呢,這都是正確的廢話,誰都知道要多看書,要實踐,要去動手寫代碼。
有時候想回答得更細致一些,但是迫于各種原因,也沒時間去挨個的回復。
但這次學妹特地打了很長一段字,我看到了她想要快速適應計算機學習卻又不得其法的迷茫,也許我的回答會對她有所幫助呢?
因此我讓她描述得更加細致一點,也很好針對性的提出一些建議。
不過首先申明下,本文主要是以回答學妹的問題為主線,面向的對象是大一、大二以及自學還未找到合適的學習編程方法的同學。
如果你已經有了自己的一套方法論,或者說已經工作了,那本文對你幾乎沒有參考價值,建議直接拉到末尾點個贊~
可能有小伙伴沒細看聊天截圖的內容,我在這里再貼一次學妹的問題:

下面是我抽出來的一些問題:
1、只會像高中一樣跟著課程學習
2、怎么可以脫離課本和教學視頻自己編寫一個小項目?
3、停于理論,不知道如何實戰(zhàn)
4、就算跟著教程安裝軟件,搭配環(huán)境幾乎每一步都會有這樣那樣的錯誤
5、知識遺忘得快,理論沒有形成體系,自己計算機的學習只局限在刷了一些慕課上的題,做了學校要求的實驗
6、學完一門課程不知道能干什么
7、畏難情緒嚴重
8、焦慮、擔心找不到工作
首先,看似抽出了很多條的問題,但是我把所有問題都歸為一個,那就是 「如何提高編程能力」。
只要編程能力、實戰(zhàn)能力提高,上面一長串的問題自然也就不成問題了,更不用擔心找工作的問題。
所以今天就來聊聊如何提高編程能力這個話題。
要說提高,總得先明確下什么是 「編程能力」 吧~
到底什么是編程能力
經常能看到大V、前輩們說,你要多寫,要多練,提高自己的“編程能力”,但是編程能力到底是什么呢?
在我看來啊,所謂的編程能力其實說到底就是用代碼解決問題的能力,無論是 Leetcode 上的還是現(xiàn)實世界的問題。
能夠從問題本身或是業(yè)務邏輯提煉出解決方案,并且用代碼去實現(xiàn),編程就是在干這樣一件事:
現(xiàn)實世界的問題 -> 抽象出解決方案/建模 -> 計算機語言表達
可以看到,寫代碼只是最后一步,而我們常常說自己不會寫,真的是不會寫代碼嗎?
這讓我想起了以前英語老師說的:
“很多同學說英語作文說寫不了幾句就寫不下去了,但是真的是英語學得差嗎?我看未必,大概讓你用中文寫,也寫不上幾句”
是啊,英語作文寫得不好,很多同學下意識的覺得是自己英語本身沒學好,確實有這個原因。
但是更本質的原因或許是你語言表達和組織能力的問題,也就是讓你用母語寫,也不一定能有條理的寫上一段文字。
那回到編程這里,不會寫代碼,也許是你連解決問題的思路都沒想明白,就是說你的腦海里沒有形成「第一步該做什么,第二步該做什么」這樣的流程。
這其實是最重要的,編碼實現(xiàn)反而是相對簡單的事情。
很多大廠,一般都是高級工程師或者架構師進行領域設計、架構設計,初級工程師進行編碼實現(xiàn)各種接口。
說到這,我又想起了最近工作上的事情。
由于時間緊迫,我被 leader 安排去了支援隔壁部門開發(fā),但是他們那里的很多業(yè)務背景我一點都不知道。
對方對接的人讓我去模仿 xxx 模塊寫,我看了 xxx 模塊兩天,愣是沒寫出個啥來。
事后,我在想,為啥會這樣呢?是我編程能力太差嗎?
也許是吧,但是更重要的原因是,我不理解業(yè)務背景,所以我的腦海里沒有要實現(xiàn)這個需求的流程圖.
檢查參數(shù)、鑒權、認證、簽名...... 這些流程不清晰,表現(xiàn)出來的形式就是,我不知道代碼到底該先調哪個接口,再做什么。
心中沒思路,自然無從下手。
所以其實編程的核心就是,你需要在心中對整個實現(xiàn)流程有一個大致的思路,然后用代碼去一步步的實現(xiàn)。
在實現(xiàn)過程中,你會遇到很多細節(jié)問題,比如數(shù)據(jù)結構的選擇,用 set 還是 list,存儲結構的選型,以及如何 bug free的實現(xiàn)。
更進一步,怎樣寫出高性能、易讀、易維護、易擴展高質量的代碼,當然這都屬于編碼能力了。
如何提高編程能力
嗯,我回過去看了自己上面的一翻分析之后,我覺得......分析了個寂寞,說的太尼瑪抽象了,我 TM 就想知道到底怎么提高編程能力!
好,接下來我就具體一點,不搞這些虛頭巴腦的東西了。
提高編程能力,我自己總結了以下幾點:
多實戰(zhàn),做項目,用需求倒逼輸入 善用工具,尤其是搜索引擎 看優(yōu)質資料,特別是經典的計算機書籍 養(yǎng)成自學習慣,提高自學能力 看一些小而美的源碼
來,先上第一點,關于做項目,這也是學妹的痛,不知道如何去開始一個項目。
談到這點,對不起,我又想講自己的經歷了,有點長。。。
一、實踐
learning by doing
是的,我們都知道編程是一門實踐的學科,不動手永遠學不會,看懂了和學會了之間差了上萬行代碼。
或者說:看懂了 + 上萬行代碼 = 學會(此公式未經證明,純碎自己拍腦袋想的
剛學完一門語言,想必大家都想做點有用的東西,而不是天天寫練習題,但是呢,又不知道從何下手,尤其是 C 語言。
我大一上完 C 語言課,就處于這種狀態(tài),但是我隔壁一個室友就不一樣的。
他在學習 C 語言的過程中,剛學到動態(tài)內存分配(malloc),就去摸索著寫貪吃蛇、坦克大戰(zhàn),而且完成度都挺高的,那時候是我們眼里妥妥的大神。
但是大神和我上的課,學的東西都完全一樣呀,況且都是上了大學才開始接觸編程,為什么差別這么大呢?
以至于那時候,我和學妹一樣,常常懷疑自己沒有編程天賦,覺得別人天生就是這么強。
這種狀態(tài)一直持續(xù)到大一下,那時候剛學完 Java,而 Java 也比 C 友好了不少,所以總想寫點什么。
于是自己就選擇寫一個類似 QQ 的聊天工具,其實功能就很簡陋,就是一個簡單的 GUI + Socket 編程,然后在加上用戶信息管理就完了。
但是,當我用這個簡陋的軟件,分別在室友和我的電腦上跑起來并且成功發(fā)送消息的那瞬間,我覺得我的編程世界被點亮了。
原來編程這么好玩,原來我也能做一些有趣的東西!似乎找到了一絲編程的感覺,但還說不上到底是什么感覺,畢竟這個程序總共也就幾百行。
緊接著,趁熱打鐵,我又寫了一個聯(lián)機五子棋,實現(xiàn)上依然是 GUI + Socket 傳輸數(shù)據(jù)。
但是寫這個又遇到了不同的問題,比如棋盤在我的實現(xiàn)里是一個 N*N 的數(shù)組,棋子是用對象表示,對象里有坐標、顏色這些屬性。
當時我就疑惑了,當一方落子后,該怎么把棋子對象通過網絡傳輸給對方呢,再從網絡接收的數(shù)據(jù)恢復到對象?
起初自己的想法是手動的把對象轉換成字符串,然后像聊天工具一樣發(fā)送給對方,比如:
{x: 12, y: 13, color: black .......}。
這種做法沒問題,但是總感覺不夠優(yōu)雅完美,于是上網一番搜索之后發(fā)現(xiàn),原來我想的這個就叫「序列化」和「反序列化」。
并且在 Java 里直接實現(xiàn) Serializable接口就好了,甚至可以直接使用ObjectOutputStream類就能完成序列化和反序列化對象。
這些問題在現(xiàn)在看來,根本就不是問題,更像是“常識”。甚至序列化這塊,還會選擇一些兼容性更好、性能更高的協(xié)議,比如 Protobuf、Thrift、Avro 等等。
但是對大一時的我來說,在這個過程中不斷的遇到問題并且去解決,就是實打實的編程能力上的提高啊。
在我解決掉一系列問題之后,順利的和隔壁室友用自己寫的聯(lián)機五子棋對戰(zhàn)了幾局,這個五子棋還支持不少諸如悔棋、暫停、自動判斷輸贏等功能。
界面風格和下面這個很相似(這是網上搜的)

但是由于當時沒有存 Github 的習慣,代碼在換電腦之后沒能留下來。
通過寫這些項目,我像打通了任督二脈一樣,不是學了什么厲害的算法、也不是高深的設計模式、更沒有分布式這樣高級的東西。
那是什么呢?
我感覺到編程就好像搭積木一樣,基本的函數(shù)、庫、組件就是一個個的積木塊,寫的代碼就是膠水。
只要我們心中有設計圖紙,那就能通過膠水把這些積木搭建成想象的模樣,缺少什么積木塊,用到的時候再去搜索就行了。
在程序的世界,只要你想,你就能。
這段時間大概是我編程能力提升最快的一個階段之一。
關于這個五子棋,還有個小插曲:
我寫的不是聯(lián)機五子棋嘛,然后啟動的時候輸入對方的 IP 和 Port 就能連上對戰(zhàn)。
后來,我找了一個在其它城市上大學的高中同學,讓他和我一起玩五子棋,但是呢,我傻乎乎的讓他用 ifconfig 查看自己 IP 后告訴我,然后我在這邊連接。
那個 ip 呢,大概長得像 192.168.1.xxx,熟悉的同學都知道,這個就是局域網內使用的 IP 了,并非公網上的 IP。
局域網內的 IP 只能在內網才能使用,所以我用這個 IP 是永遠連不上的他的電腦的。
但是那時候我才大一,沒學過計網,根本不懂這里面的原理。
為啥我和室友能連上呢(因為在一個局域網)?為啥和其它學校的同學就不行?
別看現(xiàn)在這個東西在我看來是常識,但我那時候是一點計網知識都沒,就是硬著頭皮學的 Socket 編程,去理解 IP 和 Port。
那是怎么解決的呢?
當然是找谷歌呀!
在網上一番查詢后,大概明白了,如果想讓不同局域網內的主機進行 P2P 通信,需要一個公網中轉服務器輔助進行 NAT 打洞。。。后來,我就又去嘗試 NAT 打洞了,其中細節(jié)就不再描述了。
其實把我個人編程經歷上寫這么多,就是想展現(xiàn)我是如何一步步去實踐的,遇到了什么問題,又是怎么解決的,把這個過程展現(xiàn)出來。
你看我沒學任何計網知識,還不是通過邊學邊用,完成了網絡相關的項目。
所以你離項目只差一個開始。
說到這里,不少同學又會說,我知道要多實踐、多動手,道理我都懂。
可我還是不知道如何開始去寫一個五子棋、貪吃蛇之類的東西。
好,那我就要問問你了
小北:為什么你學了 C 語言還是不會寫貪吃蛇呢?
學妹:老師沒教我貪吃蛇如何在 C 語言中表示,也沒教我如何讓畫面動起來,更沒教我如何繪制 GUI ,所以我不知道怎么做。
這應該是大多數(shù)同學最典型的問題吧?
那我們以貪吃蛇為例拆解一下,看看是如何從問題到代碼的。
首先,貪吃蛇是一個個的節(jié)點組成的,節(jié)點肯定有橫縱坐標吧?一個個的節(jié)點組成了一條蛇,那自然應該想到鏈表吧?
蛇還有什么屬性?當前移動的方向
還要食物位置吧?那這些屬性在 C 語言中用結構體表達出來就是這樣:
typedef?struct?node{
??int?x;
?int?y;
?struct?node*?next;//?單向鏈表
}?SnakeNode;
typedef?struct?snake?{
?SnakeNode?*pHead;?//?蛇頭
?SnakeNode?*pFood;?//?食物
?int direction;??//?方向??0-3 依次表示:上、下左、右
?...
}
接下要考慮的就是如何去繪制蛇,這個簡單呀,就把整個鏈表從頭開始把每個節(jié)點打印出來。
每個節(jié)點可以是一個圓點,也可以是方形。
那如何讓蛇動起來?所謂的動,其實就是不斷的將蛇打印出來,然后又清除。
并且不斷的根據(jù)移動方向更新蛇的位置,只要這個過程夠快,快過人眼能夠分辨的幀率,那看起來蛇就像是在連續(xù)的動一樣。
然后這個過程你還要去考慮如何檢測碰撞,如何判斷吃到了食物,還要隨機產生食物。。。這些東西首先你得想清楚邏輯,代碼實現(xiàn)其實if、else 、for 就足夠了。
做項目的過程總會遇到不會的東西,也會遇到問題。
但是要相信,所有的問題在你之前基本上都已經有人遇到過了,只需要把問題準確的描述出來,然后去搜索引擎上搜就肯定能找到解決的線索。
如果你要等學會所有東西,才去開始做項目,那估計等到本科畢業(yè)也沒機會。
本科上的就那幾門課,Java/C/C++、操作系統(tǒng)、計網、編譯原理、離散、數(shù)據(jù)結構......
可能沒有學校會單獨開一門課教你 Java Web、Python 寫爬蟲等等。
學完這些理論課,等到畢業(yè),你會發(fā)現(xiàn),依然好像什么都做不了,所以說,要動手,趁早。
并且理論上,學完一門語言,掌握了數(shù)組、鏈表、 if、for、函數(shù)這些編程最基本的概念,就有能力去實現(xiàn)一些諸如貪吃蛇、五子棋、掃雷這樣的小玩意了。
這種通過項目去學習,以解決問題為導向的學習才是更加精準和高效的。
課堂上的學習大多數(shù)是老師灌輸知識、學生記住,然后考試就能拿高分。
實際上有多少知識能轉化為解決問題的能力呢?
不好說。
還是那句話,編程就像搭積木,學完基礎的,積木塊都給你了。
你能搭出房子、車子、還是火箭這全靠自己。
二、善用工具、學會搜索
學會用工具,更要用好的工具。什么是好的工具?
諸如 VSCode,Github、Stackoverflow、Google、知乎、Jetbrains 全家桶都是不錯的編程工具,有的提高生產力,有的能解決問題。
都 2020 年了,就不要在機房裝著 VC6 寫練習題了。
不要等到大一結束了,還沒上過 Github,更不知 issue、pull request 為何物。
計算機專業(yè)的學生,如果還在用百度搜索技術問題,送給你一段陳皓(左耳朵耗子)前輩的話:

當然,在沒法使用谷歌的情況下,百度還是可以用的,但是這對計算機專業(yè)的同學,不應該是一個問題。
很多時候,你把遇到的問題準確的復制到 Google/Stackoverflow 搜索框,大概就能找到答案。
而百度會將你帶向培訓班的課堂,嘿嘿,刺激不。
3. 看優(yōu)質資料
現(xiàn)在處于信息大爆炸的時代,互聯(lián)網上充斥著各種博客、學習資源,這是對學習者最好的時代。但是資源太多,就存在一個選擇的問題,在這里我給你幾個建議:
把網盤里屯的那 500G 視頻/資源 刪掉,你永遠不會去下載來看的
正所謂,收藏從未停止,學習從未開始,當你不再習慣的收藏資源了,你就成長了。最好掌握獲取/搜索資源的方式,自己需要什么資源再去搜就完了。而不是讓資源白白的占據(jù)你的網盤。
當需要學習某個東西的時候先去知乎/Google 搜索 「xx學習路線」
然后根據(jù)高贊/優(yōu)質回答,選取大 V 們都提到的資源,這大概是這個領域比較經典的,然后去搜集資料,開始學習。
B站、mooc、網易公開課、Coursera等視頻網站上有很多優(yōu)質免費的課程
答應我,不要再被那些關注送 500 G 學習資源的騙了好嗎?資源都在網上公開著,直接打開 B 站就能看,不香么?
學應用框架,官方文檔是最適合入門的,并且很多都提供了「快速入門」的指引
比如 Vue、Hadoop、Requests 這些官網的指引都非常的清晰易懂,真的不要再去看七零八碎的博客,博客的定位應該是補充。
少看博客,多看書
很多博客其實就是博主自己讀完書,然后復述一遍的筆記,你再去看他的博客那就是等于學二手知識,他的高度就決定了你的高度。
當然有些優(yōu)秀的博主能夠概況性的總結,或者把某些原理講得特別清楚,這是值得看的。
總的來說,系統(tǒng)性的看書是你成長最快的方式。
四、自學
大學的學習,學的絕非是僅僅的知識,最應該學會的能力是「自學」。
等走上工作崗位的時候,你便會發(fā)現(xiàn)這個能力有多么重要。
初入職場,在公司,沒人會像學校里的老師那樣,手把手的教你。
就算有安排導師,也是扔給你一堆的文檔和資料,自己去學習,然后開始上手實際項目。
這個過程大多會比較痛苦,至少我這幾個月是這么過來的。
說到這,我突然想說下我認為的「自學的能力」,因為在程序員這個群體中,不管是科班學生還是野生程序員,自學都是必不可少的。
那「自學的能力」又到底是什么呢?
我個人體會有以下幾點:
1. 明確你學習的目標,比如我要學 Java Web、IOS 開發(fā)、機器學習等等
2. 了解該領域包含了哪些子模塊,比如 Java web 需要學 Java 語言基礎、JVM、數(shù)據(jù)庫、計算機基礎等
3. 掌握這些子模塊的學習順序和依賴路徑,也就是先學什么,再學什么
4. 搞清楚這個方向有哪些入門、進階的學習資料
5. 按著學習路線,開始學習一個子模塊
上面這個過程,不斷的遞歸下去,直到拆分出一個比較小的學習目標。
比如我要學 「Java web」,那這里面可能包含了Java 基礎、Netty、JVM、Spring、MySQL、Redis 等等。
那 Java 基礎又可以進一步分為 基礎語法、面向對象、異常、集合、IO、反射等。
分到這里,你就可以開始去找資料學習了啊。
比如先安裝 JDK,然后寫 Hello World,然后慢慢開始刷書或是刷視頻......
五、看小而美的源碼
這里我用了一個定語「小而美」,小是指代碼量少,最好就幾千行,這樣我們能夠充分把控,美則是指代碼實現(xiàn)寫得很優(yōu)雅。
我們都知道提高審美能力很重要的一環(huán)就是多看美的東西,好的設計。
那寫代碼也是一樣的,自己學完基本語法,寫出來的代碼大概停留跑起來的水平。
這時候去看看大佬寫的代碼,你絕對會驚呼 臥槽,還能這樣?
這樣的代碼有哪些呢?
如果你是大一的同學,我推薦你去看看 Linux 內核中關于鏈表的實現(xiàn),簡直特么太妙了,平常我們定義鏈表不都是這樣嘛
struct?Node?{
???int?data;
???struct?Node*?next;
}
但是這個存在的問題就是,每個想用鏈表存儲的結構體,我們都得去寫一遍,遍歷、插入、刪除的邏輯,顯然太low了。
那 Linux kernel 中就用宏,在對用戶自定義數(shù)據(jù)結構侵入性很小的情況下,實現(xiàn)了其它語言中模板的功能。
相信我,看完,你會學到很多騷操作的,后面找機會寫一下這塊。
又比如學完 C 語言,你會不會覺得 C 中的字符串有點不靈活,那推薦你去看看 Redis 中關于動態(tài)字符串的設計--SDS。
這些代碼都不長,也不難理解,但是看完對于提升我們的編碼能力是有很大幫助的,這就是小而美。
提倡看源碼,不是讓你直接上手就啃什么 Nginx、Sqlite、Redis的源碼,這些都是幾萬級別的代碼量,一般初學者
即使要啃,我給你說個好辦法,這些東西目前來看,代碼量都是幾萬幾十萬的級別,有點不友好,你可以去 github fork 下來。
然后回退到第一個 commit,從第一個 commit 開始看起,看到第一個完整的版本。
這個過程也是能學到不少東西的,看看羅馬都是怎么建造成的。
解答問題
好了,BB了一大段假大空的東西,最后再回到學妹具體的問題上,挑幾個來具體問題具體分析:
一、只會像高中一樣跟著課程學習
說到底,還是填鴨式,沒有形成自己的目標和學習路徑。
如何破局?
最簡單的方式,給自己定一個目標,或者我給你定幾個,自己領一個:
學習前端開發(fā),目標 BAT 學習 Java 后端開發(fā),目標 BAT 做 Linux CPP后臺開發(fā),目標 BAT 保研/考研,目標 985 或 C9 算法崗....不建議,太卷了 大數(shù)據(jù)開發(fā)、數(shù)據(jù)分析等等
如果你做技術崗,上面這幾個基本覆蓋了應屆生找工作的主要崗位,你選一個自己相對喜歡一點的。
至于如何去達到目標?
當然是分解,然后去找 Google 呀,去看看 BAT 這些崗位需要點亮哪些技能,怎么學才能達到。
記住,目標、目標、目標!!!
沒有目標,你的生活就會是得過且過,滿足于上課、做作業(yè)、考試、績點這樣的循環(huán)。
到了畢業(yè)找工作,你會發(fā)現(xiàn)面試官好像都不怎么關注你的績點有多高,他們更關注你的基礎知識和解決問題的能力。
解決問題的能力怎么體現(xiàn)?
可以是刷題或者是讓你講你參與的項目,以及在這個項目中你扮演的角色和遇到了什么題,又是怎么解決的。
我們會發(fā)現(xiàn),那些優(yōu)秀的人,無一不是有著清晰的目標,從現(xiàn)在開始給自己定一個目標吧!
二、怎么可以脫離課本和教學視頻自己編寫一個小項目?
初學者跟著視頻做是很有幫助的。
先跟著課本或者視頻完成一個項目,記住不是看視頻里的老師完成,而是你自己要跟著完整的敲一遍!
第二步,不看視頻,根據(jù)自己腦海中的流程、思路來逐漸編碼,明確先做什么,再做什么。
第三步,改造,或者基于視頻里的做一個類似但不同的項目,比如視頻里寫的商城,那你可以自己做個論壇,視頻里是貪吃蛇,你可以自己做個坦克大戰(zhàn),諸如此類。
其實這就是學自行車嘛,先用借助輔助輪或者別人扶著練習,然后慢慢的下掉輔助輪,自己騎。
千萬不要沒學會走,就想跑了,這樣會摔得很慘。
三、就算跟著教程安裝軟件,搭配環(huán)境幾乎每一步都會有這樣那樣的錯誤
這個問題,百分之 99% 的同學肯定都遇到過,甚至現(xiàn)在,我安裝一些新環(huán)境的時候也會有各種問題。
想起剛學 Java 的時候需要去配置 Path、ClassPath、環(huán)境變量這些,但是第一次接觸根本不知道配置這些的作用,也不知道他們的原理。
就跟著博客教程一步步執(zhí)行,但是經常就會發(fā)生,明明都照著來了,還是跑不通。
那這個時候怎么辦呢?
第一辦法是重新搜索嘗試不同的教程,這個其實是換湯不換藥,能不能配通還是看運氣
第二個辦法就是去搜為什么要這樣配?
了解之后,你就明白 Path 就是指定了我們平時在終端使用命令的搜索路徑,ClassPath 則是讓 Java 執(zhí)行環(huán)境找到指定的 Java 程序對應的 Class 文件以及程序中引用的其他 Class 文件。
當你去了解這些東西之后,再去看博客的配置步驟就不再是懵的了。
在不了解背景的情況下,我們只能根據(jù)別人的指令一步步走,害怕和被人有一絲的不一樣,而導致最后配置失敗。
但是當你了解了原理之后,這些博客就只是參考了,你甚至還可以考慮到你和博主的某些環(huán)境是不是有差異,這些差異會對應到步驟中哪里應該采用不同的配置。
這個其實我體會特別深,在我第一次用到 CMake 的時候,起初,我是去抄別人的 CMakeList.txt 文件。
但是當我需要增加編譯依賴或者其它定制化的時候,我就懵逼了。
include_directories、include_directories、target_link_libraries 這些指令,不知道如何去組合達到自己想要的目的。
那我當時是去找來了 CMake 的教程,瀏覽一遍后,我便懂了 CMake 構建的原理,以及各個指令的作用。
這時候,我便有能力基于別人的 CMakeList.txt 去定制化。
這就是我個人認為「搭配環(huán)境幾乎每一步都會有這樣那樣的錯誤」的內在原因和解決辦法了。
一句話,你是否清楚你所看博客做的每一步操作是在干什么,如果不明白。
只是復制別人的命令,那出錯了,肯定會懵逼的。
四、 知識遺忘得快,理論沒有形成體系
不知道學妹這里說的遺忘得快的知識是指什么?
我說一下我的看法吧,我在不同文章中都反復提到了,學習新知識要學會抓主線,把零碎的、非本質的東西瀏覽一遍就行,用到的時候知道去哪找,這就夠了。
我在萬字長文 | 這可能是東半球最保姆級的后臺服務器開發(fā)學習路線中也提到過各個學科的主線是什么,這里再啰嗦一遍,比如計網,你說你把 CRC(循環(huán)冗余校驗碼)的計算方式忘了,這就是遺忘嗎?
對不起,我也記不住,也完全沒有必要去記。
計算機網絡的主線是「兩臺主機之間的數(shù)據(jù)包是如何通過網絡傳輸給對方的」,其它的,像 UDP 的包頭的構成呀,SMTP 使用的端口號呀 之類的問題,看一遍,有個大體印象就行了。
但是你得知道 UDP 包頭里有源端口和目的端口以及數(shù)據(jù)包長度,為什么呢?
因為這個是靠理解,反推出來的,首先 UDP 是傳輸層協(xié)議,傳輸層的目的是區(qū)分同一主機上的不同進程,那么一定是需要一個標識的,這就是端口號。至于它們是怎么排列的,這絲毫不是關鍵。
上面這段話,拋磚引玉的聊了下我認為什么知識是可以遺忘,什么是不可以遺忘的。
那不能遺忘的知識也遺忘了怎么辦呢?
多看。多去思考這樣設計背后的原理,多問自己「Why」。
至于理論沒有形成體系,其實我也存在這個問題。
但是我想的是,量變引起質變,你先積累足夠的各個領域的知識,總會有打通任督二脈的那一天。
才開始學,怎么可能有完整的知識體系呢,至少到了大三、大四再來考慮知識體系這個問題。
五、畏難情緒嚴重,擔心找不到工作
畏難這個事,老實說,人人都會有,我也不例外。
不要想著去克服它,畏難其實和喜歡舒適區(qū)差不多,這大概是天性吧。
除了天性使然,還有一個原因是想得太多,做得太少,還沒開始做呢,就去想各種后果了,進而產生一系列奇奇怪怪的想法,自己嚇自己。
那克服畏難情緒最簡單方法就是行動,立刻行動起來,去分析一下,要做成這件事,需要哪些資源、前置條件等等
行動是緩解焦慮的最好方式,這真的不是雞湯。
至于擔心找不到工作,這完全沒啥好焦慮的呀,你按照上面說的去制定目標,學習,找工作就是一件水到渠成的事。
當然了,最重要的嘛,持續(xù)關注編程指北~
END
不知道這篇文章有沒有解決學妹的問題,但是我已經算是把我能想到的,用我覺得最合適的方式表達出來了。
剩下的還要靠學弟學妹們自己去摸索了,畢竟,看別人的總結再多,不如自己親身體會一次記憶深刻。
來個直擊靈魂的三連吧!
