編者注
這期邀請(qǐng)到的主講嘉賓煜豪,本科文科畢業(yè),在美國(guó)攻讀計(jì)算機(jī)專業(yè)研究生,最后在硅谷成功求職成為一位軟件工程師。在與他溝通的過程中,小編感覺到在成年時(shí)起步學(xué)習(xí)編程與在少年時(shí)開始學(xué)習(xí)編程,兩者之間存在著巨大的差異 。下面是這一期嘉賓的個(gè)人經(jīng)歷和建議。
自述
2014年6月份我從中山大學(xué)畢業(yè),大學(xué)期間所學(xué)專業(yè)是純粹的文科專業(yè)。本科畢業(yè)后漸漸發(fā)現(xiàn),就文科的那些知識(shí)已經(jīng)不能漸漸滿足我所需求的,感覺必須要掌握一門技術(shù)。正如盧梭在《愛彌兒》中所講,“每個(gè)人都應(yīng)該掌握一門技術(shù)”,所以審視了自己過去所學(xué)的種種,發(fā)現(xiàn)計(jì)算機(jī)反而不是毫無基礎(chǔ)的,所以我決定申請(qǐng)美國(guó)的計(jì)算機(jī)專業(yè)的研究生,并轉(zhuǎn)行為軟件工程師。
雖然在一些技術(shù)課程中學(xué)過一些編程語言(JavaScript, html/css, R),然而這點(diǎn)東西實(shí)在是不夠讓我去申請(qǐng)美國(guó)的計(jì)算機(jī)專業(yè)并成為軟件工程師的,所以我開始了自學(xué)編程之路。但由于不懂如何進(jìn)階,這條路走的很不順,在彎路上走了非常多的時(shí)間。
C/C++需要童子功
剛開始那會(huì)兒,我由于不知道從哪種語言入手,所以當(dāng)時(shí)到網(wǎng)上到處搜索。然而非常不幸的是,近乎小白的我對(duì)網(wǎng)上各種帖子并沒有多少分辨力,結(jié)果最后就是選了一個(gè)非常錯(cuò)誤的帖子去跟隨。這帖子給予的建議是跟從譚浩強(qiáng)的C/C++語言課本去開始編程之路。后來看網(wǎng)上有很多人討論,多少人都在講譚浩強(qiáng)的課本是何等的噩夢(mèng),現(xiàn)在我再回想這件事,認(rèn)為這個(gè)帖子的作者說少一個(gè)學(xué)習(xí)C/C++語言前提條件,那就是C/C++語言需要童子功,需要從小進(jìn)行編程基礎(chǔ)知識(shí)的訓(xùn)練,而對(duì)于比較急功近利的成年人未必合適。兒童受到功利主義干擾少,而成年人學(xué)編程比較急于求成,這就是少兒編程和成年人編程的根本不同,所以越是小的時(shí)候,越應(yīng)該學(xué)習(xí)基礎(chǔ)的C/C++語言,練好童子功。而對(duì)于成年的編程初學(xué)者,則應(yīng)該是需要能在短時(shí)間內(nèi)做出各種好玩的應(yīng)用,從而可以對(duì)自己的學(xué)習(xí)產(chǎn)生反饋,激發(fā)更大的熱情去學(xué)習(xí)編程,而不是把時(shí)間花費(fèi)在深入研究操作系統(tǒng),這樣只會(huì)消磨掉學(xué)習(xí)的信心。
Python vs C/C++
我剛開始學(xué)那半年,所經(jīng)歷的痛苦可想而知,幾度要放棄。到了美國(guó)讀研后,跟一個(gè)專門做操作系統(tǒng)的朋友聊起這件事,他就直接講初學(xué)者就應(yīng)該把時(shí)間都放在代碼邏輯上,遠(yuǎn)離一切和底層打交道的事物,而且他高度推薦python,說像CMU這種計(jì)算機(jī)強(qiáng)校,計(jì)算機(jī)本科大一新生的第一門語言就是python而不是C。學(xué)習(xí)一門腳本語言,可以讓初學(xué)者擺脫對(duì)底層語言的恐懼(C/C++),這也是我通過很多案例真實(shí)驗(yàn)證過的 。我在美國(guó)讀研究生期間做商學(xué)院的python研究生課助教,這兩年由于AI的迅速發(fā)展,python幾乎成了每個(gè)學(xué)科的人都要掌握的語言。在教學(xué)實(shí)踐中,我們不會(huì)花太多時(shí)間上去教學(xué)生python的語法知識(shí),而是直接讓學(xué)生花一周去code academy(https://www.codecademy.com/)上去上一門python的操作課程,一周之后我們就要求學(xué)生去寫爬蟲,然后用python對(duì)文本內(nèi)容進(jìn)行情感分析,結(jié)果發(fā)現(xiàn)每個(gè)學(xué)生都可以做的非常棒。與此同時(shí),由于python簡(jiǎn)單易學(xué)的語法,可以借此迅速開始算法之旅。
不過以Python入門也有一個(gè)壞處,就是習(xí)慣了宏觀的邏輯思維,對(duì)一些需要精細(xì)化設(shè)計(jì),追求極致效率的程序,就顯得力不從心。所以,習(xí)Python者容易形成舒適區(qū);雖然習(xí)C/C++者痛苦,但是思維精度會(huì)大大提高。
Java vs C/C++
在學(xué)習(xí)了半年多C語言后,跟很多已經(jīng)在美國(guó)讀計(jì)算機(jī)研究生的同學(xué)聊起來我的境況,他們指出我適合作應(yīng)用型的開發(fā),而C/C++是屬于比較底層的核心軟件開發(fā)語言。為了快速具備應(yīng)用開發(fā)能力,他們建議迅速切換到Java上,熟悉Java的數(shù)據(jù)結(jié)構(gòu)和面向?qū)ο?,并開始進(jìn)行算法知識(shí)的學(xué)習(xí)。在美國(guó),算法是軟件工程師必須掌握得非常熟練的知識(shí),因?yàn)閹缀趺繄?chǎng)找工作面試,必然會(huì)有算法題在這里讓你解決。不得不說,算法對(duì)于我則是另一片天地。仍然記得那會(huì)兒為了理解recursion,在IntelliJ上設(shè)上斷點(diǎn),一層一層的研究所經(jīng)歷的每一步。然而沒這種愚蠢的處理,我在后面也是不可能很熟練地理解如何寫recursion rule和畫recursion tree的。而最折磨人的大概就屬動(dòng)態(tài)規(guī)劃了吧,在推出通項(xiàng)公式之前,大概就只有一片黑暗。當(dāng)初剛接觸這部分時(shí),真是不知道該如何下手,只能在網(wǎng)上到處找資源,這次比較幸運(yùn)的是,根據(jù)YouTube的相關(guān)資源瀏覽量,我看了Tushar Roy講解動(dòng)態(tài)規(guī)劃題目的視頻,他真是個(gè)非常好的講解者,用填圖表的方式去解決動(dòng)態(tài)規(guī)劃這類問題,這不僅讓人可以一目了然每一步都要怎樣走,也可以讓人很快就推導(dǎo)出通項(xiàng)公式。
編程實(shí)戰(zhàn)和硅谷求職
在掌握的語言之后,我就開始琢磨著如何去拓展對(duì)這個(gè)語言的理解,做一個(gè)實(shí)戰(zhàn)項(xiàng)目成了我要走的下一步。但選何種項(xiàng)目成了一個(gè)難題,我就圍繞著這幾個(gè)問題去思考該如何去選一個(gè)日后可以拿得出手的項(xiàng)目:1.什么技術(shù)架構(gòu)能夠吸引你的面試官;2.無數(shù)的公司需要,大部分的工程師每天做的事情是什么;3.哪些技術(shù)最多出現(xiàn)在Job Description里邊?綜合這些思考之后,我發(fā)現(xiàn)做一個(gè)Event的推薦系統(tǒng)成了一個(gè)很好的選擇,如何實(shí)際設(shè)計(jì)和開發(fā)推薦API,如何設(shè)計(jì)內(nèi)部的搜索系統(tǒng),如何進(jìn)行后端服務(wù)和數(shù)據(jù)庫(kù)的開發(fā),都是我亟需練習(xí)的。也是因?yàn)檫@個(gè)項(xiàng)目,開始了我做全棧開發(fā)之路。
講了這么多個(gè)人進(jìn)路,也總該有些針對(duì)成年初學(xué)者的詳細(xì)建議了吧。后面有三部分,前兩部分較詳細(xì),至于最后一部分大概就不需要這么詳細(xì)了,因?yàn)橐呀?jīng)走完第二階段的你,相信是可以自己去走后面的高階之路的。
1.啟蒙階段(零編程基礎(chǔ))
1
學(xué)習(xí)一門腳本語言python或javascript。實(shí)踐項(xiàng)目有:
①處理txt或csv文件,學(xué)會(huì)使用python下的幾個(gè)package去讀一個(gè)本地文件,例如csv, open, sys這些,可以做一些word count的工作
②可以用python跟數(shù)據(jù)庫(kù)打交道,mysql或sqlite,可以用腳本文件去統(tǒng)計(jì)數(shù)據(jù)庫(kù)里的條目
③用python去遍歷文件系統(tǒng),可以編寫腳本文件去統(tǒng)計(jì)一個(gè)目錄下的所有文件大小
④可以熟練使用print或assert這種粗暴的方法去調(diào)試
2
熟悉使用Unix/Linux命令行:
①避免對(duì)圖形界面的依賴
②學(xué)會(huì)用man來查看幫助
③文件系統(tǒng)結(jié)構(gòu)和基本操作:cd/ls/chmod/chown/mkdir/rm/find/cat/mount/tar
④學(xué)會(huì)使用文本操作命令:sed/awk/print/head/echo/less/more
⑤學(xué)會(huì)使用管理命令:df/lsof/kill/ps
⑥知道/etc的配置文件,知道如何從/var/log查閱系統(tǒng)日志
⑦regex和wildcard
⑧熟練使用vim的各種快捷鍵
3
學(xué)習(xí)lamp stack和web基礎(chǔ):
① 學(xué)習(xí)html/css
② 學(xué)習(xí)如何配置一個(gè)apache server
③ 學(xué)會(huì)使用php,了解什么什么是get,什么是post
④ 學(xué)會(huì)javascript和ajax,知道如何parse json數(shù)據(jù)格式
⑤ 學(xué)習(xí)數(shù)據(jù)庫(kù)(MySQL)基礎(chǔ)知識(shí)
⑥ 附帶學(xué)習(xí)git和github的使用
2. 進(jìn)階階段
(懂腳本語言,shell編程和web基礎(chǔ))
1
學(xué)習(xí)Java(面向?qū)ο?數(shù)據(jù)結(jié)構(gòu)):
①了解何為jvm,試著比較java, c和python在編譯和執(zhí)行上的區(qū)別,思考何為跨平臺(tái)
②熟練掌握面向?qū)ο蟮囊I(lǐng),熟悉8種常見的數(shù)據(jù)結(jié)構(gòu)在java中的使用,并能夠自己實(shí)現(xiàn)這些數(shù)據(jù)結(jié)構(gòu)
③熟練使用IntelliJ或Eclipse去編譯,調(diào)試和開發(fā)java程序
④用Tomcat做server,把php的項(xiàng)目用java servlet去重新實(shí)現(xiàn)
⑤了解垃圾回收機(jī)制,了解異常
1
C語言學(xué)習(xí),這部分主要是為了學(xué)習(xí)操作系統(tǒng)準(zhǔn)備的:
①理解指針和內(nèi)存模型,知道C語言的內(nèi)存管理
②理解多線程和多進(jìn)程,并可以用c語言去實(shí)現(xiàn)
③socket編程
1
算法學(xué)習(xí),程序員找工作必然會(huì)面到的一部分,不論是新手還是專家
①Sort
②Binary Search
③recursion vs iterative
④graph (dfs or bfs) vs tree
⑤Dynamic Programming
⑥String vs Array
⑦Advanced Data Structure
聯(lián)系客服