我該如何規劃、準備大學的計算機課程?

我是一名高三學生,本科留美,申請季剛剛結束。

我從四年級開始接觸編程。從初一開始,對於應用向的內容很感興趣。初中前兩年不太認真的玩過信息學競賽,會一些基礎演算法和數據結構(比如說,圖相關的演算法就不熟悉)。自己看了看 C++ 和 C#。高中的時候,主要興趣集中在 Web 開發,了解了一些關於 HTML CSS 的知識,寫過簡單的 Node.js。有幸讀過 SICP 前兩章。後來玩了一點 Haskell。

自我評估一下,感覺我的問題主要有兩點。其一是數學太差,比如演算法複雜度分析不會,稍微理論一點的論文就讀不下去。其二,我又有些拖延,經常追求完美,以至於工程經驗不足。舉個例子,光開發自己的個人網站,我就在中文網頁字體、中西文空格、語義化上糾結了一年多的時間,原型/技術驗證代碼一大堆,半個成品都沒有。

不過由於我這個缺點,加上我興趣廣泛,不少流行的技術的皮毛,我還是能隨便瞎扯一番——當然,這並不是什麼優點。

現在想來,我主要的興趣應該是程序語言和人機交互。我覺得這是一個全民編程的時代,只不過可能未來編程的形式會發生很大的變化。

======

我想問的是:

一、離開學還有,四五六七八,整整五個月。這段時間,做些什麼比較划算呢?數學方面?工程方面?能不能結合一下?有沒有什麼很好的資源求推薦?(之前幾年都是自學,碰到了很多坑,爛了很多尾)

二、大學之後,我應當重點注意哪些學科的內容呢?

謝謝。


首先表示膜拜,順便膜拜小學(?)就玩Common Lisp的@開源哥 。。

數學基礎課微積分、線性代數、概率論等等都不用先學。。

CS基礎課(計算機體系結構、操作系統『編譯原理,計算機網路等等)也不需要。。

5個月做什麼?

方案一:PL偏Semantic、Verification

準備好

  • 參考書籍:Software foundationTypes and Programming Language 為主,其他有需要再找

  • 開發語言:Ocaml/Haskell/Scala/Racet任選

  • Proof Assistant:Coq/Agda/PLT Redex/Isabelle任選

  • 待處理語言:Typed Arith,Untyped lambda calculus,Simple typed lambda calculus,IMP Language。。

針對以上待處理語言:

  • 用你喜歡的語言寫解釋/編譯器(直接解釋/編譯到C/編譯到JS/編譯到機器碼 自選)
  • 用Latex敲一遍它們的Typing rule,以及Formal semantic。。
  • 用你習慣的Proof Assistant寫Mechanized semantics

  • 用上面那個Proof Assistant寫Certified的解釋/編譯器
  • 做IMP或其他語言的Program Analysis Framework
  • 驗證你的Framework。。。
  • 自己設計一個語言,把上面的流程再走一遍,循環往複。。

這幾遍下來ECOOP乃至POPL上的一些論文你就看得懂甚至能Follow了。。

方案二:PL偏Type System、FP以及Compier(FP)

準備

  • 書籍:Types and Programming Language和Advanced Topics of Types and Programming Language
  • 論文:GHC reading lists、SPJ的Publication lists、ICPF/POPL近幾年的論文;
  • 開發語言
  • 研究語言:1. ML及其變種;2. Haskell;3.Racket各種擴展 自選

大致流程

  • 先把Types and Programming Language過一遍,寫解釋器,重點寫類型推導演算法

  • 自己設計一個語言,逐個加特性;或者嘗試給ML/Haskell/Racket做擴展。。
  • 通過Advanced Topics of Types and PL和那些論文清單,了解有哪些自己感興趣的課題,確定一到兩個準備深入研究的
  • 深入研究、開發,有問題可以與書籍、論文作者交流。最好是能把自己做的集成到ML/Haskell/Racket上。
  • 。。。

方案三:PL偏Compiller(傳統)以及Program Analysis

這個不用多說

而且感覺lz興趣不在這個?。。

方案四:數學

數理邏輯

抽象代數及其後續內容

圖論及其應用

能學多深學多深。。

(閉關前答一個)。。


不過由於我這個缺點,加上我興趣廣泛,不少流行的技術的皮毛,我還是能隨便瞎扯一番——當然,這並不是什麼優點。

我是一名高三學生,本科留美,申請季剛剛結束。

誰邀我的放學不要走!別攔我,我要哭給你們看!真的哭,哭出聲!

======

一、幾個月的時間說長不長,就算全力以赴去系統學習或者應用一項技術也很難衡量哪個更划算。。所以我的建議是不如去social一下,找個公司或者實驗室的實習。未必能出多少活,但提前豐富一下體驗,之後做選擇時避免瞎想,這個挺好的。

二、數學。

======

我強調數學不是說讓題主提前自學,而是開學之後留心不要落下。另外我真的沒有書單!!別聽開源哥瞎扯。。我推薦書的模式是,如果有人對XX話題感興趣 我對XX話題感興趣 我收藏和翻閱過若干XX話題的書,那我可以就這個話題推薦幾本。。。。而不是說我有個遊戲攻略一樣的秘藏書單,照著一二三四五按順序刷完就睥睨天下了。。。。哪有這種好事!


謝邀,首先讓我再次感嘆一下年輕真好,而且樓主這麼早就接觸編程,並且在高中畢業就找到了自己喜歡的計算機方向,這是讓人佩服的。

接下來的幾個月,我會比較建議看看數學,比如線性代數,概率論等,其實我覺得線性代數和概率論是計算機後面更直接接觸到的東西,如計算機圖形學就會與線性代數息息相關,而工程方面你不用著急,後面你有很多的機會做。MIT有一門線性代數的公開課講的非常的棒,以致於我機智的保存在了我的移動硬碟中,這個你搜MIT線性代數公開課應該就會出來。

走向大學中,我會建議你著眼於計算機基礎課程,如演算法,操作系統等,這樣對整個計算機體系有一個很夯實的基礎,學習很多東西也會心中有數,而不要被一些時下所謂的技術弄花了眼,亂了心神。你對人機交互和語言很感興趣,對人機交互我不大懂,而程序語言我可以簡單提及一些。對於程序語言,其實會有專門研究程序語言的方向,其內容會包括各種類型推導驗證等,而這方面印第安納大學做的很好,你若有意在此,我想你以後也許可以考慮去那裡。

其實這也只是我的一些簡單建議和看法吧,我覺得你已經很不錯了,我相信你也會有自己的判斷與選擇,加油!


Ucb大四狗,即將cmu machine learning PhD,去年google實習。

1。這個時間段把能抵學分的ap都考了,等上了大學再上這些真的比較浪費時間。

2。不建議學數學。題主複雜度啥的不懂應該還是mathematical maturity不夠,說白了就是數學用的太少。等上了大學把現代,微積分,離散,(數分,抽代,拓撲。。。)上了後自然就好了。但現在自學實在是效率不高的一件事,何況你上了大學還要再上一遍課= =

3。不建議自學cs。題主大學早晚得把數據結構,演算法,操作系統,database,網路,ai,hci。。。上掉。美國大學的課程設計還是能保證你學到該學的東西的,這比自己看書效率實在高太多。

4。以後每個暑假你不是上summer,做research,就是intern。。。所以現在就好好玩吧


美國本科路過...

你這個水平碾壓一般的美國學生已經沒有壓力了...

剩下的就聽 @邵成 的去學數學吧 (可以私信找他要書單 (逃


很好、你如果不是裝逼去了就可以碾軋水貨們。


如果不是準備本科畢業就工作的話,好好學數學,學對CS有用的數學。

CS是一門跟實踐密切相連的課程,真的,你再也找不到哪門工科那麼容易地在寢室里就能自己做lab了。

每學完一門課,爭取自己做一個小的項目出來,不知道怎麼做就上網找,各大高校的課程主頁,總會告訴你。


搞工程:周圍人瞧不起,ACMer嘲諷,實習沒人要,導師沒人跟,畢業無工作。

搞ACM:眾星捧月,實習爭著搶,導師倒貼,工作隨意找。

你還想搞工程嗎?智商不低,趕緊搞ACM,搞演算法,編譯器,圖形學,機器學習,數據挖掘,刷刷題,寫寫論文,多愜意。

總比做幾個破網站,開發幾個破API,上架幾個破iOS軟體好多了。千萬不要像我一樣淪落至此。


題主個人水平很不錯了,除了跟OI黨比不足以外,算是freshman里很好的了。

看個人資料是準備去UCSD了嗎?說實話個人覺得CS除了專排top10,或者top20,剩下的學校都大差不差,題主水平基本可以碾壓全場了。

來美國也快一年了,現在大一第三個學期。大一上學了編譯原理,實現了簡單的前端,這學期在搞操作系統,網路和前端。google和fb的實習看樣子是沒戲了,暑假還是回國找實習或者看看書吧。

我其實也不擅長演算法,CLRS也沒刷完,對演算法的目標也就是抽空刷完CLRS,如果不是專精演算法的路子,CLRS基本就夠了我覺得。

另外給題主的建議的話,可以學【離散數學及其應用,線性代數,SICP,CLRS,CSAPP】這五個內容,然後專精下C++和Python,再然後就可以申請google的暑期實習了,如果你有興趣的話。


4/3日更新

美國學校CS會帶你接觸現在最前沿的技術的,沒必要刻意超前

但是工程基礎早晚都是要的,所以不如先把工程基礎打好

-------------------------------------------------------------------------------------------------

本人Class of 2018,大一一年快過完了,也有一些想法

大家很多都說學數學,但是我個人一年下來感覺那麼長一段時間用來學工程更好

原因如下:

1. 自學數學其實是非常難的,而且即使是非常優秀的教材,在你對它的應用毫無所知的情況下非常容易厭倦

2. 好多人瞧不起工程只覺得演算法高級,這是非常不對的。 實際上你不做圖形學或者特別偏演算法的方向計算機系的數學課程肯定也夠了

3. 工程投入產出比大。你五個月的時間絕對能把python, java, C#(這兩個一回事), 前端技術+nodejs全部學一遍,並且自己能搭一個不錯的網站,能寫一些簡單的手機app了,而且越早起步之後能得到的鍛煉越多(英語推薦codeacedemy或者lynda(你們學校可能有買的)中文推薦極客學院)

4. 學了之後不一定需要精通,但是能保證需要用別人的東西的時候能看得懂別人的代碼(我現在就是只會兩門……當你發現輪子不夠要去跨語言找的時候你就知道多掌握幾門語言有多重要了

5. 至於計算機專業課反正你以後要學的,當你覺得你自己需要學的時候現在coursera和edX資源那麼豐富也隨時可以上手

工程這東西上手容易,但是要不斷地寫項目才能進步

當你會了之後你就能自由選擇是否在上面花時間,對其他方面感興趣的話也離不開這些基礎

數學真的沒有想像中那麼重要,我覺得大家都是當時大學沒有好好學數學現在才說的而不是後悔大學前沒有好好學數學……所以只要你能好好跟著學校里上課,自己再適當拓展就行了


歪樓:

要不要考慮研讀一下卓里奇的《數學分析》?其中數學的思維挺有趣的~(不要怕,我確實是在坑你)

順便

快來玩acm-icpc,快來虐場~

幾個月是吧……要不去tc和cf朝著tourist的境界進發?至少努力往WJMZBMR的位置爬嘛~

然後你就會發現幾個月的時間短得不值一提


各種碰坑爛尾是因為你只讀了SICP兩章,早讀完早超生。

---

現在做其他事,比如搞工程,學數學搞演算法什麼的,我覺得沒啥意思,還不如這幾個月多看看SICP,這本書也算是個你提到的結合點。然後爭取大三前把全書包括習題搞定,到時候境界和身邊人是不一樣的,有了SICP的加持,不管是搞工程還是還是搞演算法,那時才能做到所謂的虐翻全場,就像當年在 Facebook 做 HHVM 項目的那幫人,蛤蛤。


同樣是小學開始編程的,一點過來人的經驗和你分享下。

不管怎麼樣,先學好數學比較重要一些,概率,統計,數分,高代,數值,至少這些你要會才行。數學不好,你會受到局限,導致很多東西沒法理解。

計算機方面,計網,計組,數據結構,操作系統,編譯原理,都是基礎。

可以這麼說,這些數學和計算機基礎課程學的怎麼樣決定你的上限。

所以我覺得這幾個月你應該找到你感興趣的一個到幾個內容去學一學,夯實基礎,加油!


決心做工程的,請去碼代碼。有完美主義沒問題,不斷重構就好。如何在重構過程中保證可用,這裡的複雜度處理是很好的工程經驗。

請去參加自由軟體項目,大量閱讀感興趣的源代碼,嘗試提供補丁。如果你可以像我一樣,在高三的暑假完成一次針對某大項目(比如GCC)提交的代碼被合併到主分支的過程,就能了解到大項目開發中的複雜度問題,自由軟體社區化開發的模式。關注下GSOC,爭取能在本科階段至少做一次GSOC項目。

以上都是本科教育中不會涉及或不受重視的。

如果決心讀研,做博士。請學數學去,其他人的答案已經說了很多這條路的練級方式了。


學數學。


你已經學到數據結構了就開始補數學吧 第一波分析,線代,離散做掉,推薦台交大的視頻… 網上有伯克利的cs61a 和 c 全部跟掉也可以 LZ看發展方向自己把握吧自己把握吧


搞搞數學吧,oi不過是數學炒冷飯,沒意思。


我是加拿大留學數學計算機專業。學之前零基礎 完全沒問題 學的過程中多創造學習的機會就可以 你這水平 可以算學霸了 一開始的課你會覺得無聊透頂的


推薦閱讀:

為什麼程序都要用英文寫,中文不行嗎?
零基礎如何成為編程高手?
小霸王學習機有哪些學習(編程)的功能?
如何評價港科大 CSE PhD 首次入選 POPL 的這篇論文?
為什麼這麼多人黑譚浩強的c語言教材?

TAG:編程語言 | 數學 | 知識管理 | 大學課程 | 計算機專業 |