[導(dǎo)讀]大家好,我是小林。相信不少CS學(xué)生都有關(guān)于項(xiàng)目到底要怎么準(zhǔn)備的問(wèn)題,可能大家認(rèn)為要做個(gè)非常強(qiáng)的項(xiàng)目才有機(jī)會(huì)面試。在前幾個(gè)星期,有位大三非科班的讀者的項(xiàng)目經(jīng)歷寫的是國(guó)外CS課程的lab,也就是課程的實(shí)驗(yàn),并不是什么高大上的項(xiàng)目,他依然拿到了騰訊的實(shí)習(xí)。他跟說(shuō),對(duì)于校招面試,項(xiàng)目其實(shí)...
大家好,我是小林。相信不少 CS 學(xué)生都有關(guān)于項(xiàng)目到底要怎么準(zhǔn)備的問(wèn)題,可能大家認(rèn)為要做個(gè)非常強(qiáng)的項(xiàng)目才有機(jī)會(huì)面試。在前幾個(gè)星期,有位大三非科班的讀者的項(xiàng)目經(jīng)歷寫的是國(guó)外 CS 課程的 lab,也就是課程的實(shí)驗(yàn),并不是什么高大上的項(xiàng)目,他依然拿到了騰訊的實(shí)習(xí)。他跟說(shuō),對(duì)于校招面試,項(xiàng)目其實(shí)并不要求做的很牛逼,但是要保證是你自己親手做的,因?yàn)槊嬖嚂r(shí),問(wèn)項(xiàng)目主要是問(wèn)你在項(xiàng)目中用什么技術(shù)解決了什么問(wèn)題,然后達(dá)到了什么效果,你能回答出這些才是主要的。然后面試過(guò)程中,計(jì)算機(jī)基礎(chǔ)和算法才是大頭,考的最多的還是這些。他由于在學(xué)校里參加過(guò) ACM 比賽,所以面試時(shí)的算法對(duì)他不是難度,他甚至都沒(méi)刷過(guò) leetcode,但是每次面試的算法他都是秒殺的。他的弱點(diǎn)主要是在計(jì)算機(jī)基礎(chǔ)知識(shí),因?yàn)樗皇欠强瓢嗟?,很多?jì)算機(jī)專業(yè)課都沒(méi)上過(guò),或者有的沒(méi)怎么認(rèn)真學(xué)過(guò)。他最開(kāi)始因?yàn)闆](méi)有準(zhǔn)備計(jì)算機(jī)基礎(chǔ),面試屢屢挫敗,后面他開(kāi)始突擊一兩月這些八股文,我的圖解網(wǎng)絡(luò)和系統(tǒng)也對(duì)他起到來(lái)一定的幫助,最終成功拿到騰訊的實(shí)習(xí)。我也邀請(qǐng)這位讀者分享他的學(xué)習(xí)經(jīng)驗(yàn)和做 lab 的經(jīng)驗(yàn)。開(kāi)車!
我跨專業(yè)是如何學(xué)CS的
簡(jiǎn)單概括我的情況。我是名非科班的?ACM?選手,在準(zhǔn)備面試之前這一段時(shí)間都沒(méi)有系統(tǒng)的學(xué)習(xí)過(guò)專業(yè)課的知識(shí)我是一名大三的機(jī)械系的學(xué)生,大概在大二上學(xué)期過(guò)完的假期,我刷知乎偶然看到了同學(xué)校學(xué)長(zhǎng)描述自己的競(jìng)賽經(jīng)歷,覺(jué)得很好奇,就入坑了算法競(jìng)賽也就是俗稱的 ACM,興趣使然一直打到了大三下學(xué)期。在這段時(shí)間里,我和隊(duì)友或者其他計(jì)算機(jī)院的學(xué)生聊天的時(shí)候,偶爾會(huì)聽(tīng)到一些關(guān)于專業(yè)課的知識(shí)或者名詞,然后會(huì)去搜這些相應(yīng)的知識(shí)稍微進(jìn)行了解,但是完全沒(méi)有系統(tǒng)的學(xué)習(xí)過(guò) CS 的專業(yè)課知識(shí),基本上就是看到了什么知識(shí)點(diǎn)感覺(jué)好玩就去搜一搜。可以說(shuō),在面試之前我對(duì)CS的體系和知識(shí)是完全陌生的。到了大三下學(xué)期,偶然看到學(xué)校群里有學(xué)姐發(fā)的實(shí)習(xí)招聘信息,我才意識(shí)到:我都大三了,是時(shí)候著手準(zhǔn)備一下找工作的事了。通過(guò)學(xué)姐發(fā)的招聘信息,我被內(nèi)推去參加了 tx 的實(shí)習(xí)面試。這一次面試的內(nèi)容都十分簡(jiǎn)單,什么是多態(tài),多態(tài)怎么實(shí)現(xiàn)的,進(jìn)程和線程的內(nèi)容是什么,計(jì)算機(jī)網(wǎng)絡(luò)的幾層結(jié)構(gòu)是怎么樣的…如果你有準(zhǔn)備面試的話,你會(huì)發(fā)現(xiàn)這些問(wèn)題簡(jiǎn)直就是送分題!但由于我從來(lái)沒(méi)有學(xué)習(xí)過(guò)相關(guān)的知識(shí),被虐的慘不忍睹(面試官還和我說(shuō)會(huì)進(jìn)行評(píng)估,然后五分鐘之后就把我掛了)才發(fā)現(xiàn)自己這一塊有如此大的欠缺,開(kāi)始著手一點(diǎn)點(diǎn)的從頭開(kāi)始補(bǔ) CS 的知識(shí)。如何學(xué)習(xí)專業(yè)課知識(shí)
不要上來(lái)就啃所謂的經(jīng)典書。先去找一些經(jīng)典的網(wǎng)課看看。對(duì)于新手來(lái)說(shuō),網(wǎng)課的老師可能講的更像人話一點(diǎn)。我個(gè)人主要推薦:CSAPP。從計(jì)算機(jī)的組成比如浮點(diǎn)數(shù)的存儲(chǔ)方式,存儲(chǔ)金字塔結(jié)構(gòu)到操作系統(tǒng)的進(jìn)程線程,計(jì)算機(jī)網(wǎng)絡(luò)的 socket 等都有介紹,一個(gè)性價(jià)比很高的課程能夠讓你了解整個(gè)計(jì)算機(jī)體系結(jié)構(gòu)。其次我個(gè)人認(rèn)為面試中??疾斓狞c(diǎn)就是?OS、計(jì)網(wǎng)、數(shù)據(jù)庫(kù)和一些語(yǔ)言知識(shí)。語(yǔ)言大家自己去找對(duì)應(yīng)的課程學(xué)習(xí)。計(jì)網(wǎng)的話我是看小林的圖解網(wǎng)絡(luò) b站的湖科大的老師做的視頻,都附帶了很多圖和動(dòng)畫,簡(jiǎn)單易懂。參考的文字材料就是自頂向下 TCP/IP 詳解卷1。OS 沒(méi)有找過(guò)網(wǎng)課看,覺(jué)得看完 CSAPP 之后挺好理解的了。用的文字材料主要是小林的圖解系統(tǒng) 操作系統(tǒng)概論。數(shù)據(jù)庫(kù)網(wǎng)課看的是 15445,這是一個(gè)面向磁盤的數(shù)據(jù)庫(kù),后面發(fā)現(xiàn)大量的講解的其實(shí)是 Mysql 的原理。然后文字材料參考的是 Mysql 技術(shù)內(nèi)幕,Innodb存儲(chǔ)引擎和 Redis 設(shè)計(jì)與實(shí)現(xiàn)。進(jìn)階的內(nèi)容大家可以參照自己想要發(fā)展的方向?qū)W習(xí)啦,我認(rèn)為學(xué)到這里的人對(duì)計(jì)算機(jī)體系結(jié)構(gòu)有了了解之后,應(yīng)該很容易找自己的方向。像我對(duì)分布式和數(shù)據(jù)庫(kù)感興趣,就選了 6.824 和 15445 作為擴(kuò)展學(xué)習(xí)內(nèi)容。雖然我推薦了一些網(wǎng)課和書籍作為學(xué)習(xí)內(nèi)容,但是我學(xué)習(xí)過(guò)程中絕對(duì)不止參考了這些東西。對(duì)于一個(gè)知識(shí)點(diǎn),我如果看不懂的話先考慮找公開(kāi)課/博客,然后在書中找較為書面化的表達(dá)方式,最后我還會(huì)在自己博客中寫筆記,用自己的話表達(dá)也是一種學(xué)習(xí)方式。關(guān)于 6.824 和 15445
6.824 和 15445 這兩個(gè)一個(gè)是關(guān)于分布式系統(tǒng)的。他會(huì)講一些關(guān)于 mapreduce 和 raft 的分布式算法,以及 15445,它一個(gè)基于磁盤的數(shù)據(jù)庫(kù)(后來(lái)我看 innodb 引擎的時(shí)候發(fā)現(xiàn)其實(shí)就是對(duì)著 mysql 講的)選擇這兩個(gè)課程學(xué)習(xí)的好處在于他們的 lab 真的很好,其實(shí) CSAPP 出名的地方同樣如此。差不多的內(nèi)容,講師的水平肯定不會(huì)有決定性差距,差距主要體現(xiàn)在這些公開(kāi)課由很好的 lab,帶你手把手對(duì)一個(gè)知識(shí)進(jìn)行實(shí)現(xiàn)算法/數(shù)據(jù)結(jié)構(gòu),讓你對(duì)知識(shí)的理解更加深刻。同時(shí),由于這些是比較常見(jiàn)的算法,一般面試官都會(huì)懂,因此就喜歡和你聊一聊相關(guān)的問(wèn)題,是一個(gè)面試的時(shí)候很好的談資。你可以聊一聊你項(xiàng)目里面是怎么實(shí)現(xiàn)的,遇到了什么問(wèn)題,如何解決的。鋪墊了這么多,如何學(xué)習(xí)這種公開(kāi)課?6.824 和 15445在b站上都是有相應(yīng)的視頻的,但據(jù)我了解免費(fèi)放出來(lái)的貌似都是機(jī)翻的,可能有一些地方語(yǔ)義不是很通暢,這里我推薦一個(gè)組織叫simviso,人工翻譯公開(kāi)課的視頻,會(huì)比機(jī)翻的看起來(lái)舒服一些。然后關(guān)于怎么做公開(kāi)課的lab,其實(shí)你要實(shí)現(xiàn)的東西老師上課從答題思路到實(shí)現(xiàn)細(xì)節(jié)都會(huì)講的很清楚,認(rèn)真聽(tīng)了公開(kāi)課之后你就知道里面的東西怎么運(yùn)作的了,只需要自己再理一理怎么實(shí)現(xiàn)之類的問(wèn)題就可以了。同時(shí),官網(wǎng)上也會(huì)有很詳細(xì)的教程,告訴你要實(shí)現(xiàn)什么東西,然后每個(gè)模塊你要實(shí)現(xiàn)什么樣的函數(shù),擁有什么樣的功能,是保姆級(jí)教學(xué)!不用擔(dān)心不會(huì)寫的問(wèn)題。知識(shí)點(diǎn)在課上會(huì)說(shuō)的很清楚,lab 做的東西絕對(duì)不會(huì)超綱,不僅課上會(huì)教你,官網(wǎng)的文檔也寫得很清楚,可能對(duì)于英語(yǔ)不是很好的小伙伴會(huì)造成一些困惑,但是我感覺(jué)當(dāng)程序員面對(duì)英語(yǔ)文檔應(yīng)該會(huì)是很常見(jiàn)的事情。6.824 lab
6.824 的官網(wǎng)地址:http://nil.csail.mit.edu/6.824/2018/schedule.html6.824 的官網(wǎng)的 schedule,如下圖:下圖是 lab1 的 mapreduce介紹,這一部分是教你怎么用 git 配置環(huán)境的。下圖是 lab1 的part1,告訴你你需要在 common_map.go 里實(shí) 現(xiàn)domap()函數(shù)等等…會(huì)寫的很清楚讓你去實(shí)現(xiàn)哪一部分的模塊。而且,還提供了一些 test 來(lái)測(cè)試你實(shí)現(xiàn)的對(duì)不對(duì),如下圖:15445 lab
15445 的官網(wǎng)地址:https://15445.courses.cs.cmu.edu/fall2020/schedule.html15445 的官網(wǎng) schedule 如下圖,可以找到里面的 project released 點(diǎn)進(jìn)去。下圖是 lab1 的LRU模塊,告訴你要去實(shí)現(xiàn) src/…/lru_replacer.h 的 victim 函數(shù)啊,pin函數(shù)啊等等,寫的十分清楚。所以,大家有時(shí)間的話,一定要做lab。我個(gè)人認(rèn)為國(guó)外的公開(kāi)課的最大優(yōu)勢(shì)就是量身定制的lab,真的能將你課上所學(xué)知識(shí)完美的再?gòu)?fù)現(xiàn)一遍,讓你的理解更加深刻。參加競(jìng)賽對(duì)面試的幫助
這個(gè)問(wèn)題可以轉(zhuǎn)換為:學(xué)算法有什么好處?其實(shí)面試中考察的算法,甚至是算法競(jìng)賽中考察的算法,都是很久以前計(jì)算機(jī)科學(xué)家們玩爛了的。在現(xiàn)實(shí)工程中有許多算法都是被淘汰了/用不上的。那為什么還要學(xué)?他們?cè)驹O(shè)計(jì)出來(lái)是為了解決某些特定問(wèn)題的。比如最小生成樹(shù),原本就是為了解決計(jì)算機(jī)網(wǎng)絡(luò)中的一些特定問(wèn)題的,或者說(shuō)二叉樹(shù),將二分這一個(gè)思想轉(zhuǎn)換成了一個(gè)持久化的數(shù)據(jù)結(jié)構(gòu)。我個(gè)人的理解就是,學(xué)習(xí)算法你可以學(xué)習(xí)原本解決這些計(jì)算機(jī)問(wèn)題的思維,培養(yǎng)了計(jì)算機(jī)思維,在后續(xù)的專業(yè)課學(xué)習(xí)中就打了一個(gè)很好的基礎(chǔ)。回到原問(wèn)題,參加算法競(jìng)賽的好處在于獎(jiǎng)項(xiàng)多了之后,簡(jiǎn)歷更突出(幫助我一個(gè)雙非的學(xué)生過(guò)了一些簡(jiǎn)歷關(guān)),和具備扎實(shí)的編程功底,良好的計(jì)算機(jī)思維。同時(shí),參加了算法競(jìng)賽,基本上就是對(duì)面試的算法題進(jìn)行了一個(gè)降維打擊吧。我雖然沒(méi)有刷過(guò)leetcode,但面試的算法題基本都沒(méi)什么壓力寫出來(lái)了*(中間也掛了不少面試,但不是掛在算法上,是當(dāng)時(shí)八股背的不好)。雖然面試不僅僅是由算法題組成的,但對(duì)于很多同學(xué)來(lái)說(shuō),專業(yè)知識(shí)都掌握好了,但是死在了算法上,這就有點(diǎn)氣人。還是得多多刷題~現(xiàn)在太卷啦,盡量都做到最好吧。總結(jié)
在我面試的過(guò)程中,算法環(huán)節(jié)遇到的題目都是十分簡(jiǎn)單或者十分常見(jiàn)的問(wèn)題,因此只要多刷刷題,提高自己的實(shí)現(xiàn)能力就 ok 了。最主要的還是基礎(chǔ)知識(shí)的準(zhǔn)備。首先對(duì)照著一些簡(jiǎn)單易懂的公開(kāi)課/小林的圖解系列等了解知識(shí)雛形,然后再自己從專業(yè)書里更詳細(xì)的學(xué)習(xí)。同時(shí)自己寫博客,多刷刷面經(jīng),看看面試喜歡考什么,大概就ok了?也許吧,大家都要加油哦!
欲知詳情,請(qǐng)下載word文檔
下載文檔
本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請(qǐng)聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請(qǐng)及時(shí)聯(lián)系本站刪除。