標籤:

你會如何重新學習編程?

腦洞大開,如果以現在的心態和認識,重新再來制定一套適合自己的學習方案,去規劃學習自己的編程之路,繞過一些坑,你會怎麼樣制定?(比如會先學什麼語言,再讀哪兒本書?去哪家公司實習?做什麼樣的項目?)


遊戲里常有這樣的設定,開局的時候,整張地圖都是霧蒙蒙的,什麼也看不見。先選個地方造兵採礦,建立基地,再派兵去周圍的地方探索,繼續造兵採礦,佔領的地方越來越多,整張地圖也越來越清晰。

編程也是這樣,一開始的時候,什麼都看不清,什麼都不懂,學了幾年也寫不出個軟體。傳統的學習模式是,學習,理解,運用,而學編程的時候,可以靈活一點。

把編程知識想像成一個3D網路,每個知識點都是網路中的一個節點,每個節點上有一盞燈,你學會了,燈就亮了,可以看到周圍的節點,接著走,點燈,再走,再點燈,這樣,燈亮的越來越多,看的越來越清楚,對於自己要走的方向也越來越有信心。

基本的思想是,先用後學,縮短反饋,反覆迭代。

舉個例子來說,假如初學Java,想寫個下載軟體,怎麼辦?

第一次迭代:寫出個下載文件的類。

破冰階段。這個階段的目標是,先跑起來,懂不懂沒關係,先有一份能運行,能列印log的代碼出來。這樣就有了反饋。其實很簡單,網上搜一下,直接可以找到代碼段,放進IDE就可以跑。

public class DownloadFile {

public static void main(String[] args) throws IOException {

String fileName = "file.txt"; //The file that will be saved on your computer
URL link = new URL("http://shayconcepts.com"); //The file that you want to download

//Code to download
InputStream in = new BufferedInputStream(link.openStream());
ByteArrayOutputStream out = new ByteArrayOutputStream();
byte[] buf = new byte[1024];
int n = 0;
while (-1!=(n=in.read(buf)))
{
out.write(buf, 0, n);
}
out.close();
in.close();
byte[] response = out.toByteArray();

FileOutputStream fos = new FileOutputStream(fileName);
fos.write(response);
fos.close();
//End download code

System.out.println("Finished");

}

}

學習階段。捋出代碼中的知識點,分別點亮。文件系統,Input/OutStream,URL,這些都是用到的知識點,研讀官方文檔,嘗試調用不同的method, 跑起來就能看到結果,儘快學會運用。

專家階段。想像自己是專家,試圖理解為什麼是這樣。為什麼要用ByteArrayOutputStream?還有其他的OutputStream嗎?組織結構是什麼?為什麼要用URL類?還有其他的選擇嗎?各有什麼優缺點?很多問題可能解答不了,但只要想了,就會很不一樣。

這樣,一輪迭代就完成了,也點亮了幾個知識點,File, input/out stream, url。接著來,

迭代2:實現斷點續傳。知識點:http request, response.

迭代3: 管理多個下載文件。知識點:多線程,embedded db,sql。

迭代4: 加個UI。知識點:GUI,消息處理,響應模式。

到這時候,基本上代碼已經改的亂七八糟,難以為繼了。

迭代5:重構。知識點:軟體工程,代碼管理,設計模式。這是相當痛苦的過程。

迭代6: Web版,通過網頁管理下載任務。知識點:web ui,server,db,各種協議,通訊模式,相當不容易。

迭代7: App版,同樣的server端,通過手機客戶端管理下載。知識點: app開發,各種實現方式。

迭代8: 爬蟲版,專門用來爬網頁,或者特定信息的版本。知識點: 爬蟲,文本處理,dom。

迭代9: 股市版,爬下股票價格,畫出各種圖表,指標。知識點:畫圖,數學計算,金融知識。

在這個過程中,同步學習專業課里的OS,DB,軟體工程,網路,會時不時有醍醐灌頂的感覺。

點亮的知識點越來越多,路也會越來越好走。可以選擇向上走,做應用,也可以向下走,做底層。有的喜歡做app,有的能給玩具熊編程,有的可以操縱空調,有的可以做股票交易。

學習的過程不是線性的,而是在不斷的調整,朝向最重要,最有興趣的方向,完善自己的技能樹。

就當作是程序員養成遊戲吧。


感覺大學裡面才開始接觸編程,而且一開始沒有懂這方面的人指一下方向一路走來,發現自己走的路是挺彎的,如果現在回到當時重新開始學習編程,我估計會:
1.學好cs專業開的四門數學課(高等數學,概率論,線性代數,離散數學),培養邏輯思維能力不說,但是計算機專業學生數學基礎的確是很重要的。
2.學好計算機學科的基礎知識,操作系統,數據結構,計算機網路,組成原理等,這些課程一開始學習的時候覺得現在並用不上,但是在後面的學習過程中會一直出現,而且非常重要。
3.學好演算法基礎。以前才學習的編程的時候並沒有意識到演算法是何等重要的東西,當時覺得能寫出一個能用的程序似乎就是非常牛b的樣子,不得不說視野很狹窄,演算法是各門編程語言都會用到的東西,可以說是編程語言的靈魂。
4.學習編程語言之前首先了解一些主流的編程語言的應用場景,優勢,特點,然後深入一門語言進行學習。在學習一套體系的時候應該由大到小,從全局到細節,這樣可以對整個流程了解的很清晰。
5.多和別人討論自己的見解,不要老是局限在自己的思維中,多請教一下大神們,看他們怎麼解決問題,了解一下他們最近在學一些什麼新的技術。
6.關注一下開源社區的東西,裡面有很多好東西。
附 程序猿能力矩陣


:-(


Follow CMU。

我相信在這個問題下的其他答案以及其他網上的教程都不會比CMU的課程大綱靠譜。。。。

CMU課程的很多材料都是在網上公開的,google之。。。。

CMU計算機系的本科教學體系

CMU大學的計算機系是1965年成立,屬於早期建計算機系的大學。 現在是計算機學院,在多個學科上有很大優勢。

本科教學也有一些特點,整個課程360 units, 換成我們國內的約90學分,其中計算機科學類課程約36學分,核心課程是必選,為17學分,選修是每個方向選一門,合計19學分,兩者合計36學分。總體感覺他們的課程設置很靈活,課程量比我們少,給學生很大的選擇度,計算機與其他學科搭配也比較平衡,各年級安排也比較合理,三年級專業課多,四年級課比較少。畢竟他們的學費也很貴,因為是私立學校,約4-5萬美元/年,所以可以有更多選擇,呵呵。

整個課程體系如下: 

計算機科學Computer Science 13門課 36學分

數學 Math/Statistics 5門課  12學分

工程 Engineering/Science 4門課  9學分

人文 Humanities/Arts 7門課  16學分

自由選擇 Minor/Free electives 7門課 19學分

合計約90學分。


下面是詳細的信息,供參考。


A: CMU的課程計算機核心課程(合計 17學分, 學分已經轉化為成國內的演算法,略有出入)如下:

15-128 Freshman Immigration Course (介紹類,時間很短)

15-122 命令式語言編程Principles of Imperative Computation (2.5學分,沒有編程基礎的同學)

15-150 函數式語言編程Principles of Functional Programming(2.5學分)

15-210 並行/串列數據結構 Parallel and Sequential Data Structures and Algorithms (3學分)

15-213 計算機系統基礎Introduction to Computer Systems (3學分)

15-251 計算機理論基礎Great Theoretical Ideas in Computer Science (3學分)

15-451 演算法分析與設計 Algorithm Design and Analysis (3學分)


B: 一門技術交流課程One Communcations course:

15-221 計算機科學家技術交流Technical Communication for Computer Scientists(2學分,相當於我們的英文寫作課程,也關注口頭表達)


C: 從下面選擇一門演算法課程

15-354 計算離散數學Computational Discrete Mathematics (3學分)

15-355 現代計算機代數Modern Computer Algebra (2學分)

15-453 形式化語言與自動機Formal Languages, Automata, and Computability (2學分)

21-301 組合數學Combinatorics (2學分)

21-484 圖理論Graph Theory (2學分)


D: 從下面選擇一門應用類課程

05-391 人機交互 Designing Human Centered Software (3學分)

05-431 用戶界面Software Structures for User Interfaces (1.5學分)

10-601 機器學習 Machine Learning (3學分)

11-411 自然語言處理 Natural Language Processing (3學分)

15-313 軟體工程 Foundations of Software Engineering (3學分)

15-322 計算機音樂 Introduction to Computer Music (2學分)

15-323 計算機音樂和信息處理 Computer Music Systems and Information Processing (2學分)

15-381 人工智慧 Artificial Intelligence: Representation and Problem Solving (2學分)

15-384 機器操作Robotic Manipulation (3學分)

15-385 計算機視覺Computer Vision (2學分)

15-415 資料庫應用Database Applications (3學分)

15-462 計算機圖像Computer Graphics (3學分)


E:從下面選擇一門理論類課程

15-312 計算機語言基礎 Foundations of Programming Languages (3學分)

15-317 構造邏輯 Constructive Logic (2學分)

15-414 計算機自動化驗證 Bug Catching: Automated Program Verification and Testing (2學分)

21-300 基本邏輯 Basic Logic (2學分)

80-311 複雜性 Computability and Incompleteness (2學分)


F:從下面選擇一門軟體系統類課程

15-410 操作系統 Operating System Design and Implementation (3學分)

15-411 編譯器 Compiler Design (3學分)

15-418 並行體系結構與編程 Parallel Computer Architecture and Programming (3學分)

15-440 分散式系統 Distributed Systems (3學分)

15-441 計算機網路 Computer Networks (3學分)


G: 兩門專業課程

 從計算機系 機器學習 軟體工程所等選擇兩門專業課程 (約5學分)

其中課程安排如下:

一(上):2門入門計算機課程,2門數學課 1門人文課 1門技能課 1門科學/工程課

一(下): 2門計算機課,1門數學科 1門人文課 1門技能課 1門科學/工程課

二(上): 1門計算機課 1門數學課 1門人文課 1門自由選擇 1門科學/工程課

二(下): 2門計算機課, 1門人文課 1門自由選擇 1門科學/工程課

三(上): 2門計算機課 1門數學 1門人文課 1門自由選擇

三(下): 3門計算機課 1門自由選擇

四(上): 1門計算機課  1門人文 2門自由選擇

四(下): 1門計算機課  1門人文 2門自由選擇

出處:科學網—西行記-8: CMU計算機系的本科教學體系


建立一套編程知識體系

由下至上,對整體框架有印象了解即可,可以想像成是一個倒著的金字塔。

  1. 計算機組成硬體、單片機、PLC。
  2. 操作系統(進程、多線程、IO、內存、網路,文件)
  3. 彙編語言、基本的CPU指令集。
  4. 以C語言為基礎的初級演算法和數據結構。
  5. 解釋器,編譯器。
  6. JVM、CLR、GC相關知識。
  7. OOP思想,23種設計模式,代碼管理。
  8. 資料庫,html-css-js,web框架,http服務,app。

找出自己的興趣點

一開始啃演算法導論、離散數學之類的書沒什麼反饋,很快會產生厭倦感,容易放棄。
所以一定要找到自己感興趣的地方,比如:
喜歡Web,就用html+css+js+mvc做一些頁面掛到網上。
喜歡APP,就學java或swift開發app裝自己手機上。
喜歡邏輯性強的,就搞演算法、刷題。

2/8時間分配方案

把80%的時間專註在某個領域,剩餘20%用來擴展知識面。一個領域的專研,同樣會帶動其他方面的進步,東搞西搞的最容易瓶頸。

比如
專攻編譯器相關,就深挖詞法語法語義分析、中間代碼優化,GC策略。
專攻大數據處理的話,就把主流分散式計算框架原理搞通,相關bloomfilter、skiplist、kmeans演算法全部自己擼一遍。
專攻web的話,想想高並發、分散式緩存、SOA、負載均衡的解決方案。
專攻前端的話,思考怎麼自適應、模塊化,less、bootstrap能否簡化工作量。
etc..

寫博客、英文文檔

所有思考的結果、學到的知識全部要記下來。不完整的話就先整理到evernote,然後定期整理到技術博客上,對學習回顧、建立知識體系非常有用。習慣讀英文文檔、原版圖書。


假如我能回到大一,我會:
好好學數學,說不定會修數學雙學位
好好學英語
非常認真的刷演算法導論,從頭到尾
絕不折騰Linux桌面系統
語言只仔細學C++ scheme和haskell,洗掉我現在沒少投入技能點的Python Ruby和Java
多看書,而不是經常寫一堆意義不大的小程序
不學vim,但還會學著用emacs
使勁刷PL,啃論文
不對各種工程技術投入過多精力
絕不參加學校里奇怪的競賽

恩,我覺得我得補充幾句…
早上知乎,早點來發現更大的世界,早點認識這裡的各種巨巨(尤其是輪子哥和邵成巨巨,對我影響深刻啊)


其實,我大學跳的最大的坑之一就是用了一整年時間倒騰Linux桌面,不僅耽誤了時間還幾乎屁收穫沒有。


感覺目前有一大批人都是去學一些工程方面的東西.(比如說做App)
畢業了就去擼工程, 來錢快.
然而到後面的時候你可能會感覺自己很快就到達了瓶頸. 這個時候需要很多底層的支持才能繼續深入地走下去.

以上是在一個群里的聚聚說的, 現在想來確實是這樣(至少我是這樣2333...)
所以如果讓我重新開始學習編程, 我會選擇從底層的東西開始學起...

如果具體點的話...我想先把操作系統, 計算機網路, 演算法和數據結構, 彙編, 計算機組成原理, C語言 這些搞定...然後深入學習C++吧...平時多看看數學方面的東西.然後學一個用來玩的語言比如說Python...這個時候再去學一些工程的東西,比如說客戶端應用程序嘍...後面怎麼辦我也不知道了-。-可能那個時候會有對於自己更清晰的一條路吧。。。


  • 每當需要讀文檔的時候,一定儘早通讀,能省去許多不必要的問題
  • 任何新概念一定一次弄清楚,而不指望以後再回頭看
  • 早一點買微批嗯,而不總是指望著用免費的,早一點用上youtube和google(https://www.linkev.com/?a_aid=itlr)
  • 開頭幾年應該積極地找書,把能找到的書(至少經典http://simpleprogrammer.com/2015/03/23/the-ultimate-list-of-programming-books/)都看了,很多問題的根源都是因為書看得太少
  • 用不到的語言和工具,絕不花超過10%的時間,了解即可,不追熱點,專心自己上手的東西
  • 少浪費一點時間在所謂數據結構與演算法,編譯原理上面,但也不是說不去理解,踏踏實實地做應用開發,關心架構,用戶體驗,產品與市場,讓代碼為它們服務

https://www.linkev.com/?a_aid=itlr


早開始。真沒別的了。

我確立計算機方面的興趣,比我真正開始學編程早太多了。編程的話,高中略學過一點Pascal搞OI,沒搞出啥名堂,我也並不覺得遺憾,到大學才真正開始點編程的技能樹。

與此相比,我很小的時候就特別喜歡玩電腦,訂的電腦報、電腦愛好者、大眾軟體等刊物幾年下來滿柜子;那時雖然喜歡折騰,但編程也就不過用VB拖拖控制項,從網上找源碼包下來改改標題欄,加幾個宣示大名的Label,編譯完找小夥伴吹牛。。這種水平。能夠熟練裝系統,定製盜版盤,然而Windows編程一竅不通;能夠花費時間整天找破解補丁和keygen,然而逆向工程一竅不通,etc。。

最接近編程門口的一次是,有那麼年把兩年,對所謂黑客技術有興趣,網上搜羅各種遠控來玩,遠的冰河、BO2k、廣外女生,稍近一些的灰鴿子,都玩過,然後混QQ群做伸手黨,整天求大神給好用的殼好用的免殺版,或者求視頻教程啥的。。就這麼玩,可惜如果那時有入門一點彙編和逆向技能的意識(甚至不一定是像現在這樣學習,完全獨立找資料看,而是正經在論壇或者群里拜個老師),說不定我現在的技能樹就偏了十萬八千里。。

從搜羅好玩的玩具來玩,一個玩厭了玩下一個,到搜羅好玩的玩具來拆,想自己造好多玩具,這個轉變用了我好長的時間。實際上我還不確定這步路是不是真的走完了,每當玩玩具一般把玩新語言和新框架並以此為樂時,心底總有一句響亮的「傻逼快給我干正事」響起。。。。另外知乎上時不時有人邀請我回答「怎樣看待X技術」「X技術和Y技術學哪個好」「X平台未來發展趨勢怎麼樣」之類的問題,每當看到這些問題,我的回答只有一個:

Just go write some f**king code!!!

Become a Programmer, Motherfucker


對不起,對於樓上這種直接貼我們學校計算機課表的人,我只能表示非常遺憾+反對

私以為,其實光看課表,我們學校技能樹加點的方式和其他學校並無二致,但是,我認為,我們學校課表的精髓,在於龐雜的co-req。

在我大一一年的學習生活中,第一學期有21-127+15-122的課程組合,第二學期有15-150和15-251的課程組合。 21-127講的主要是數理邏輯,內容從自然數的定義講到點集拓撲,與此同時,15-122也十分強調對於代碼正確性的證明,這和127中嚴謹的演繹證明是一脈相承的。第二學期,我們通過15-150介紹函數式編程,藉此了解計算機編程的另外一種等價形式,而15-251則會介紹更加多的數理邏輯知識。我可以簡單列舉一些兩門課之中相輔相成的東西:

函數式編程中的recursive data structure 和 數學中的deductive logic system
lambda calculus 和 圖靈機的等價性證明【這一塊我們沒細說,但是往年都會有介紹
NP-C 問題
哥德爾不完備定理
演算法複雜度的定義和分析【時間,空間,通訊複雜度】
等等,這些都是在兩門不同的課中相互映襯的。顯然,光光show一個課程列表是不夠的,這些課程之間的相互關係也是教授們精心設計過的。

所以,回到最初的問題: 想如何學習編程?
我只想說:
不要以為CS就是碼代碼!不要以為CS就和數學沒關係!
不要以為CS就是碼代碼!不要以為CS就和數學沒關係!
不要以為CS就是碼代碼!不要以為CS就和數學沒關係!

很重要的事要說三遍!

以上~


讀大學的人還會考慮重新複習初中的知識嗎?
翻過去的基礎知識,沒有必要重複的記憶性全面的複習,只需要在項目中找出不足並及時填補不足就可以了。
絕對的完美主義往往會變成拖延症。


高考努力上個好大學
:)
-----------------------------7月4日更新-----------------------------------------------
為什麼呢,我們來比較一下學校的課程就知道了?(不要TM給我說全靠自己,雖然這很關鍵!但是學校更是關鍵,環境和氛圍也是最重要的)
看看中山女神的回答國內的本科 CS 教學和國外相比有什麼優劣? - 張秋怡的回答:摘抄一部分

  1. 規定使用英文教材,試卷使用英語,連帶著大部分課件也乾脆英文(不過小部分老師不太遵守),教材的選擇上還是不錯的,各種經典輪著上,所以不用太擔心教材坑爹的問題。
  2. 大一的 C/C++ 目前是放在自家寫的 OJ 上,要跑 cpplint(以Google C++ Style Guide為準,請允許我吐槽一下還在學 C 的時候用 C++ 的 Style Guide 檢查是鬧哪樣),valgrind 和 gtest 寫的單元測試。一些老師要求 Linux 下操作,一般要會 vim/emcas 和手寫簡單 Makefile。教材 C How to Program (豆瓣)。另外我院有某次期中(刷OJ)無人及格的傳說(上了南都hhhh)。
  3. 我那屆大一的 C++(某老師的)和實訓是有寫單元測試的要求的,現在似乎沒了,不過都是 Linux 下 C++ 擼個 XX 管理系統,涉及簡單的設計模式和 C++11,加分項有 socket 和 GUI/TUI 什麼的(用個clang都有加分然而沒人用我會亂說嗎),單元測試打分,moss 查代碼相似度。大二實訓用 Java 擼米國高中 APCS 的 Case study(此處省略槽點若干)、一個 BMP loader 和色彩通道提取,A* 和 BFS 走迷宮,要上 Ant 構建/Snoar 代碼質量管理/JUnit 單元測試。
  4. 某些老師的 OS 讓大家做 PINTOS,教材恐龍書。
  5. 編譯原理就是寫個簡單的編譯器/解釋器,教材龍書(此處省略槽點若干),某老師的考試照搬斯坦福的試卷(又是槽點若干)。人工智慧寫寫神經網路決策樹模擬退火什麼的,教材Artificial Intelligence: A modern approach (豆瓣)。數據結構和演算法課(兩門)偏向 ACM,OJ刷起來(不過也要看老師)。資料庫擼個資料庫引擎,教材 Database Management Systems (豆瓣) ,以前有擼 B 樹的,我們擼的列存儲(看老師),還有技能點點歪的 Hadoop 大作業。這堆貌似不能說有啥特色不過相對於其他答主抱怨的似乎挺好了……
  6. 小學期有 Haskell。貌似今年沒了?(小學期的課全是外教所以排課不太穩定)
  7. 各種選修課,Web 啦 Android 啦 Win8 應用啦……基本都是一堆代碼的節奏,請不要擔心沒得寫~ Web 是用 Python+Tornado/MongoDB/jQuery,Android 用 Android Studio,Win8 最後做的作品要放到應用商店,下載量是評分依據……
  8. 數字圖像處理代碼作業量大(實現各種演算法比如快速傅里葉和五花八門的濾波)+ 考試有一定難度,大作業實現一遍 CVPR 09 best paper,很爽。
  9. 請允許我吐槽一下機器學習相關課程真是多,一個神經網路寫了 n 門課都能用。還有分散式應用的課程(hadoop/spark 什麼的)。數據挖掘在 kaggle 開比賽當作業,教的從Logistic Regression/Linear Regression 到各種神經網路/SVM/隨機森林一類(DM秒變ML,省略槽點若干)。
  10. 人人必選的 Web 安全(課容量巨大+3學分),作業五花八門,從實現 MD5 到緩衝區溢出攻擊實踐到架設 VPN 應有盡有。
  11. 計算機圖形學若干作業代碼量適中,自由度極高發(nao)揮(dong)空間極大,不過還在教 fixed pipeline(槽點若干)
  12. 多門課程要求 GitHub 提交作業/大作業用 GitHub 表明小組成員貢獻率。
  13. 有外教的論文寫作課,教你從 Word 轉到 LaTeX 以及正確的科技論文寫作姿勢(IEEE transaction style),可以學到大量針對科技工程類專業的寫作和演講技巧,教材包括著名的The Elements of Style (豆瓣) 和 How to Write and Publish a Scientific Paper (豆瓣)。其實這門課真正的名字叫 Technical Communication 所以是說和寫一半一半,期末作業是挑自己喜歡的領域寫一篇 review(隔一周在原來的基礎上加一頁,最後面5頁,打分標準包括格式和行文風格)和做一個介紹自己的 review 的脫稿 talk(印象里大概8分鐘?也是隔一周做一次不斷延長和改進,而且當然是英文的hhhh 小組坐成半徑&<2m的一圈圍著你看,外教還會晃來晃去檢查,亞歷山大),相當於訓練你做一個 oral paper 了。另外除開這門課,好像挺多人交作業報告喜歡用 LaTeX 啊……(需要引參考文獻的時候我也喜歡用……)。
  14. 某老師的軟體過程改進各種花式 Node.js/CSS3/CoffeeScript/LiveScript/Sass/Meteor 什麼的前端同學可以自由玩耍(ES6黨如我有時會有淡淡的憂傷就是了),不過老師吹捧前端和Node大法好的時候請別太當真……
  15. 計算機視覺從相機角度校正(Canny + Hough)到全景圖(SIFT+RANSAC)到 MNIST 檢測與識別(Adaboost + SVM)不愁沒代碼寫……
  16. 聽說師弟師妹們大一的導論課有Construct 2擼遊戲+擼樹莓派加分+Python/C擼貪吃蛇還要讀黑客與畫家和浪潮之巔什麼的
  17. 虛擬現實我看到了很多以本科生水平來講很炸天的作品,大部分人用 Unity 3D 做的,我用的 Three.js 也沒啥大礙。老師有點鬼畜……
  18. Python 黨表示很多課都可以用 Python,就算是寫C++很多TA也接受(鼓勵)C++11
  19. 只要選課得當+必修碰上某些老師一個學期代碼量上萬不難,大量修羅場(請叫我自虐小能手)。像我一樣選課+RP不要太差的話,個人經驗四年下來光課程作業+實訓十萬代碼量還是有的(而且我還只有實訓的時候寫過 Java 其他時間都是 C++11/Python/JavaScript 為主)。雖然代碼行數不是很好的評判標準,不過起碼能說明在這裡有心學的話不至於大學四年無所事事。壞處大概就是你沒太多時間擼自己的代碼了……
  20. 選課得當的話也不缺 paper 讀,有志科研的最晚大二也可以開始準備了,大三湧出來的大量選修課可以提供跟老師套磁的機會,不少課程的大作業就是看 paper 寫代碼,某些課平時也有些讀 paper 的訓練啥的,再選個外教的論文寫作課大概進門還是挺快的

額,其實我們學校根本沒有資格和別人top10比。但是我還是想對比一下,給各位想報考CS專業的學弟學妹提個醒---下面是我們學校的核心課程

  1. 大一的時候只有C++課程,嗯,一本書!兩學期沒上完?課堂作業,寫寫水仙花,斐波那契數列就ok了。老師說的:如果你們能夠把這本書上的例子都運行一遍,西南片區,就沒有敵手了:),大一結束0.5%的學生會編程
  2. 大二的時候上課數據結構,資料庫(全是扯淡),計算機網路(老師PPT大神),實驗課就是交實驗報告,你好他也好,大家都好,一起渾水摸魚唄。對!我們沒有編譯原理這門課
  3. 大三就不說了,到了現在。我們的大作業就是老師把網站全是jsp寫的代碼用word發給你,你只要能在環境上面跑起來,然後交個實驗報告就算結束了!現在這個年代還全jsp,你能知道我們學院的眼光有好落後嗎?或者說他們懶?
  4. 大三現在最坑的事情出來了,我還是不說了!:)我怕被摺疊

整個大學的課程從來沒有認真聽過一節課,哦,不對,認真上過一堂課叫《大學語文》楊老師交的課才算是課,好歹也是多年國外教學經驗。雖然這只是一門選修課!不過卻是收益最多的2333!

在我們這種渣校,唯一的出路就是進團隊,進實驗室鍛煉!據我分析99%能找到bat,360,美團等等大的企業的同學都是在實驗室呆了的.完全跟著老師走,你最多最多去個3大運營商都是運氣了!!

說了這麼多,沒辦法!誰讓自己當年高考不爭氣呢?也是真是智商問題吧!
不管怎樣,學校是非常重要的。高考考個好學校,可以少奮鬥很多年,少累很多!!


會開始一切編程學習之前先找個對象。


以前以為第一門學習的語言應該是 JS 或者 Python 這種能很快讓你通過代碼做出點東西來的高級語言。現在想來,自己會把 C 甚至彙編作為第一門學習的語言,儘早去打好基礎、了解底層原理,別整天想著做多酷炫的東西。


代碼一定要從小開始寫。。。初中不寫,高中寫。。。讀個大學想做大牛太難了


最近在自學代碼,大學的時候有C語言、C++和SQL資料庫的基礎

從html開始學的,不為別的,就因為這個上手簡單,學個一周就能做個丑乎乎的網頁出來自娛自樂了

然後在學XHTML,js和CSS,html5也在接觸範圍內

下一步打算學安卓端,Python和php也在學習範圍內

先打算每樣都大致粗淺學到接近熟練能做出點小東西的地步

然後再選一兩樣來精通,同時上github學習大牛們的思路

之後在網上找有項目大腿抱大腿參與項目製作

混到點資歷之後,就可以開始轉職為碼農啦~~

我已經向這個目標努力了一周了,好了不做夢了,我繼續看XHTML去了。。。。。。


其實感覺自己初一開始寫代碼也不算太晚,唯一可惜的是家在一個小縣城沒有好的環境給我堅持下來。
走到現在沒什麼可以後悔的吧。

可惜的是交大傻逼的課程安排花了太多時間在沒有用的課上。
如果可以的話我應該從大一開始就確定好自己的研究方向開始進行研究的。


然並卵,都到這個時候了,想著如何重新學習還有什麼用的,我唯一能做的,還是腳踏實地一點,多學多看多做。


我會去百度騰訊或阿里實習拿一堆股票然後現在財務自由了哦耶。


基本素養:
1.演算法數據結構
(leetcode,geeksforgeeks,MIT advanced data structures)
2.操作系統理論
3.計算機網路(TCP/IP 卷一)
4.體系結構理論

實踐:
1. 把 MIT JOS 做完
2. reimplement Nginx partially
3. reimplement or Analyze LevelDB
4. Analyze flask

拓展:
write a compiler in Ocaml

&<以上大學四年能做完的不多&>


不搞ACM!
不搞ACM!!
不搞ACM!!!

ACM於科研於工作,都沒有任何幫助。

炒的都是幾十年前學術界就玩爛了的東西,知乎上有個答案分析過吧(懶得找原鏈接了,日後有空補上),即便是前幾年新潮得一塌糊塗(因為已經退役,並不了解現在的動向)的主席樹、link-cut tree、動態仙人掌,其實都是學術界六七十年代就已經研究透了的東西。對於想搞科研的人來說,也就是你的眼界最多停留在六七十年代。真想搞科研的話為什麼不去好好混實驗室啃論文呢?ACM是讓你把這些已經很成熟的東西練到肌肉記憶的程度,才能在場上5小時面對10+道題,這個過程中為了場上的穩定輸出你要花多少時間去練模板?要花多少時間用printf大法debug?要花多少時間現場造輪子?而這些東西有意義么?不讓用IDE也就算了,C++11的功能都不開(auto黨們還記得大明湖畔的map&::iterator么?),O2優化都不開導致STL根本不敢隨便用。我會說退役之後轉到配合PyCharm寫Python我的頸椎病都好了么?

另外對於想找工作的人來說,ACM除了能幫你免掉筆試、最多不過再免掉初面以外,並沒有什麼幫助,決定你能不能拿到offer的還是項目經驗而已。

嘛,當然也只是我個人的怨念,自己弱得一塌糊塗兩銅收場,也因為花了太多時間在ACM上耽誤了績點耽誤了出國。各位看看就好,輕噴即可。

另外同意 @邵成 的答案,越早開始越好,就我現在來說每一年回過頭去看上一年寫的文章和代碼都覺得不可直視,真是一年一個新眼界。雖然我現在仍然很弱(逃。。。


推薦閱讀:

為什麼很多程序員、geek 都喜歡熬夜,而且在後半夜工作效率異常高?
怎樣成為全棧工程師(Full Stack Developer)?
軟體工程專業本科畢業直接工作的話,還有沒有機會靠自學從事機器學習方面的工作?
為什麼程序員這麼討厭被人問「會不會修電腦」?
做一個優秀的程序員到底難在哪裡?

TAG:程序員 | 編程 |