天天看點

國外計算機科學的 lab,真滴牛逼!我跨專業是如何學CS的如何學習專業課知識關于 6.824 和 15445參加競賽對面試的幫助總結

大家好,我是小林。

相信不少 CS 學生都有關于項目到底要怎麼準備的問題,可能大家認為要做個非常強的項目才有機會面試。

在前幾個星期,有位大三非科班的讀者的項目經曆寫的是國外 CS 課程的 lab,也就是課程的實驗,并不是什麼高大上的項目,他依然拿到了騰訊的實習。

國外計算機科學的 lab,真滴牛逼!我跨專業是如何學CS的如何學習專業課知識關于 6.824 和 15445參加競賽對面試的幫助總結

他跟說,對于校招面試,項目其實并不要求做的很牛逼,但是要保證是你自己親手做的,因為面試時,問項目主要是問你在項目中用什麼技術解決了什麼問題,然後達到了什麼效果,你能回答出這些才是主要的。

然後面試過程中,計算機基礎和算法才是大頭,考的最多的還是這些。

他由于在學校裡參加過 ACM 比賽,是以面試時的算法對他不是難度,他甚至都沒刷過 leetcode,但是每次面試的算法他都是秒殺的。

他的弱點主要是在計算機基礎知識,因為他不是非科班的,很多計算機專業課都沒上過,或者有的沒怎麼認真學過。

他最開始因為沒有準備計算機基礎,面試屢屢挫敗,後面他開始突擊一兩月這些八股文,我的圖解網絡和系統也對他起到來一定的幫助,最終成功拿到騰訊的實習。

我也邀請這位讀者分享他的學習經驗和做 lab 的經驗。

開車!

目錄

  • 我跨專業是如何學CS的
  • 如何學習專業課知識
  • 關于 6.824 和 15445
    • 6.824 lab
    • 15445 lab
  • 參加競賽對面試的幫助
  • 總結

簡單概括我的情況就是非科班的 acm 選手,在準備面試之前這一段時間都沒有系統的學習過專業課的知識。

我跨專業是如何學CS的

我是一名大三的機械系的學生。

大概在大二上學期過完的假期,我刷知乎偶然看到了同學校學長描述自己的競賽經曆,覺得很好奇,就入坑了算法競賽也就是俗稱的 acm,興趣使然一直打到了大三下學期。

在這段時間裡,我和隊友或者其他計算機院的學生聊天的時候,偶爾會聽到一些關于專業課的知識或者名詞,然後會去搜這些相應的知識稍微進行了解,但是完全沒有系統的學習過 CS 的專業課知識,基本上就是看到了什麼知識點感覺好玩就去搜一搜。可以說,在面試之前我對CS的體系和知識是完全陌生的。

到了大三下學期,偶然看到學校群裡有學姐發的實習招聘資訊,我才意識到:我都大三了,是時候着手準備一下找工作的事了。

通過學姐發的招聘資訊,我被内推去參加了 tx 的實習面試。

這一次面試的内容都十分簡單,什麼是多态,多态怎麼實作的,程序和線程的内容是什麼,計算機網絡的幾層結構是怎麼樣的…如果你有準備面試的話,你會發現這些問題簡直就是送分題!

但由于我從來沒有學習過相關的知識,被虐的慘不忍睹(面試官還和我說會進行評估,然後五分鐘之後就把我挂了)才發現自己這一塊有如此大的欠缺,開始着手一點點的從頭開始補 CS 的知識。

如何學習專業課知識

不要上來就啃所謂的經典書。

先去找一些經典的網課看看。對于新手來說,網課的老師可能講的更像人話一點。

我個人主要推薦:CSAPP。從計算機的組成比如浮點數的存儲方式,存儲金字塔結構到作業系統的程序線程,計算機網絡的 socket 等都有介紹,一個成本效益很高的課程能夠讓你了解整個計算機體系結構。

其次我個人認為面試中常考察的點就是 OS、計網、資料庫和一些語言知識。語言大家自己去找對應的課程學習。

計網的話我是看小林的圖解網絡 + b站的湖科大的老師做的視訊,都附帶了很多圖和動畫,簡單易懂。參考的文字材料就是自頂向下 + tcp/ip 詳解卷1。

OS 沒有找過網課看,覺得看完 csapp 之後挺好了解的了。用的文字材料主要是小林的圖解系統 + 作業系統概論。

資料庫網課看的是 15445,這是一個面向磁盤的資料庫,後面發現大量的講解的其實是mysql 的原理。然後文字材料參考的是 mysql 技術内幕,innodb存儲引擎和 redis 設計與實作。

進階的内容大家可以參照自己想要發展的方向學習啦,我認為學到這裡的人對計算機體系結構有了了解之後,應該很容易找自己的方向。像我對分布式和資料庫感興趣,就選了 6.824 和 15445 作為擴充學習内容。

雖然我推薦了一些網課和書籍作為學習内容,但是我學習過程中絕對不止參考了這些東西。

對于一個知識點,我如果看不懂的話先考慮找公開課/部落格,然後在書中找較為書面化的表達方式,最後我還會在自己部落格中寫筆記,用自己的話表達也是一種學習方式。

關于 6.824 和 15445

6.824 和 15445 這兩個一個是關于分布式系統的,他會講一些關于 mapreduce 和 raft 的分布式算法,以及 15445,它一個基于磁盤的資料庫(後來我看 innodb 引擎的時候發現其實就是對着 mysql 講的)選擇這兩個課程學習的好處在于*他們的 lab 真的很好**,其實 CSAPP 出名的地方同樣如此。

差不多的内容,講師的水準肯定不會有決定性差距,差距主要展現在這些公開課由很好的 lab,帶你手把手對一個知識進行實作算法/資料結構,讓你對知識的了解更加深刻。

同時,由于這些是比較常見的算法,一般面試官都會懂,是以就喜歡和你聊一聊相關的問題,是一個面試的時候很好的談資。你可以聊一聊你項目裡面是怎麼實作的,遇到了什麼問題,如何解決的。

鋪墊了這麼多,如何學習這種公開課?

6.824 和 15445在b站上都是有相應的視訊的,但據我了解免費放出來的貌似都是機翻的,可能有一些地方語義不是很通暢,這裡我推薦一個組織叫simviso,人工翻譯公開課的視訊,會比機翻的看起來舒服一些。

然後關于怎麼做公開課的lab,其實你要實作的東西老師上課從答題思路到實作細節都會講的很清楚,認真聽了公開課之後你就知道裡面的東西怎麼運作的了,隻需要自己再理一理怎麼實作之類的問題就可以了。

同時,官網上也會有很詳細的教程,告訴你要實作什麼東西,然後每個子產品你要實作什麼樣的函數,擁有什麼樣的功能,是保姆級教學!不用擔心不會寫的問題。

知識點在課上會說的很清楚,lab 做的東西絕對不會超綱,不僅課上會教你,官網的文檔也寫得很清楚,可能對于英語不是很好的小夥伴會造成一些困惑,但是我感覺當程式員面對英國文檔應該會是很常見的事情。

6.824 lab

6.824 的官網位址:http://nil.csail.mit.edu/6.824/2018/schedule.html

6.824 的官網的 schedule,如下圖:

國外計算機科學的 lab,真滴牛逼!我跨專業是如何學CS的如何學習專業課知識關于 6.824 和 15445參加競賽對面試的幫助總結

下圖是 lab1 的 mapreduce介紹,這一部分是教你怎麼用git配置環境的。

國外計算機科學的 lab,真滴牛逼!我跨專業是如何學CS的如何學習專業課知識關于 6.824 和 15445參加競賽對面試的幫助總結

下圖是 lab1 的part1,告訴你你需要在 common_map.go 裡實 現domap()函數等等…會寫的很清楚讓你去實作哪一部分的子產品。

國外計算機科學的 lab,真滴牛逼!我跨專業是如何學CS的如何學習專業課知識關于 6.824 和 15445參加競賽對面試的幫助總結

而且,還提供了一些 test 來測試你實作的對不對,如下圖

國外計算機科學的 lab,真滴牛逼!我跨專業是如何學CS的如何學習專業課知識關于 6.824 和 15445參加競賽對面試的幫助總結

15445 lab

15445 的官網位址:https://15445.courses.cs.cmu.edu/fall2020/schedule.html

15445 的官網 schedule 如下圖,可以找到裡面的 project released:…, 點進去。

國外計算機科學的 lab,真滴牛逼!我跨專業是如何學CS的如何學習專業課知識關于 6.824 和 15445參加競賽對面試的幫助總結

下圖是 lab1 的LRU子產品,告訴你要去實作 src/…/lru_replacer.h 的 victim 函數啊,pin函數啊等等,寫的十厘清楚。

國外計算機科學的 lab,真滴牛逼!我跨專業是如何學CS的如何學習專業課知識關于 6.824 和 15445參加競賽對面試的幫助總結

是以,大家有時間的話,一定要做lab。

我個人認為國外的公開課的最大優勢就是量身定制的lab,真的能将你課上所學知識完美的再複現一遍,讓你的了解更加深刻。

參加競賽對面試的幫助

這個問題可以轉換為:學算法有什麼好處?

其實面試中考察的算法,甚至是算法競賽中考察的算法,都是很久以前計算機科學家們玩爛了的。在現實工程中有許多算法都是被淘汰了/用不上的。

那為什麼還要學?

他們原本設計出來是為了解決某些特定問題的。比如最小生成樹,原本就是為了解決計算機網絡中的一些特定問題的,或者說二叉樹,将二分這一個思想轉換成了一個持久化的資料結構。

我個人的了解就是,學習算法你可以學習原本解決這些計算機問題的思維,培養了計算機思維,在後續的專業課學習中就打了一個很好的基礎。

回到原問題,參加算法競賽的好處在于獎項多了之後,履歷更突出(幫助我一個雙非的學生過了一些履歷關),和具備紮實的程式設計功底,良好的計算機思維。

同時,參加了算法競賽,基本上就是對面試的算法題進行了一個降維打擊吧。

我雖然沒有刷過leetcode,但面試的算法題基本都沒什麼壓力寫出來了*(中間也挂了不少面試,但不是挂在算法上,是當時八股背的不好)。

雖然面試不僅僅是由算法題組成的,但對于很多同學來說,專業知識都掌握好了,但是死在了算法上,這就有點氣人。還是得多多刷題~現在太卷啦,盡量都做到最好吧。

總結

在我面試的過程中,算法環節遇到的題目都是十分簡單或者十分常見的問題,是以隻要多刷刷題,提高自己的實作能力就 ok 了。

最主要的還是基礎知識的準備。

首先對照着一些簡單易懂的公開課/小林的圖解系列等了解知識雛形,然後再自己從專業書裡更詳細的學習。

同時自己寫部落格,多刷刷面經,看看面試喜歡考什麼,大概就ok了?

也許吧,大家都要加油哦!