一、寫作初衷&簡單自我介紹
本科專業(yè)為計算機科學與技術(shù),今年六月畢業(yè)后入職一家上市游戲公司從事游戲服務(wù)器端開發(fā),九月中旬離開游戲行業(yè),目前在一家互聯(lián)網(wǎng)公司從事圖形圖像音視頻算法崗,偶爾兼顧服務(wù)器開發(fā)。
為什么要寫這樣一篇文章,主要原因有兩點:
1,根本原因:大學四年的學習 + 工作半年的實踐與領(lǐng)悟,讓我刷新了以前對技術(shù)的認知,在此記錄一下;
2,直接原因:隨著博客訪問量的提高,總會碰到一些非計算機專業(yè)的其他工科生,理科生甚至文科生想要入IT行業(yè),在此想盡我的微薄之力為他們提供一些真實有效的經(jīng)驗和學習方法,而不是被無所事事的人誤導剛?cè)腴T就去看《算法導論》,Linux內(nèi)核源碼。
二、計算機學科基礎(chǔ)
計算機學科的專業(yè)課主要有這些
高等數(shù)學、概率論、線性代數(shù):這些課程以前只是為了應(yīng)付考試,但當我工作后才逐漸發(fā)覺,邏輯寫入到底層時,是研究操作系統(tǒng)內(nèi)部機理以及算法,而算法研究到一定層次其實就是在研究數(shù)學。比如音頻加密中會用到傅里葉變換,概率論在人口預測和推薦系統(tǒng)中的使用,線性代數(shù)在圖形渲染,計算三維坐標的應(yīng)用等;
數(shù)據(jù)結(jié)構(gòu)與算法:學編程肯定離不開這個。數(shù)據(jù)結(jié)構(gòu)是定義數(shù)據(jù)存儲的一種格式,而算法是解決某一特定問題所使用的方法,所以數(shù)據(jù)結(jié)構(gòu)+算法+一門熟練的編程語言=你所要編寫的程序;
C語言:大多數(shù)學校都會選擇以C語言作為入門語言,還有一些學校以Java或Python作為入門語言,在此我不是想爭辯C語言有多么好,但就從長遠看來,我認為C語言是除了匯編語言之外第二個能將系統(tǒng)底層原理展示出來的語言,所以會有人說學懂了C/C++,看其他語言都不是很難了;
離散數(shù)學:和數(shù)據(jù)結(jié)構(gòu)有著異曲同工之妙;
單片機:計算機硬件方向必修課,涉及C語言/匯編語言學習,涉及電路知識,因為這門課,讓我深入了解了數(shù)據(jù)在底層的傳輸;
計算機組成原理:無論是以后做硬件還是軟件都應(yīng)掌握的底層技能;
計算機控制原理:和自動化,機械設(shè)計專業(yè)共有的專業(yè)課,主要面對工業(yè)制造方面,控制原理中涉及許多積分、傅里葉變換;
數(shù)據(jù)庫:一般以SQL語句為主,涉及后端開發(fā)必須掌握了一項技能;
操作系統(tǒng):當年把銀行家算法、頁面置換算法搞的妥妥的,就為了期末考試那40分大題,除此之外,還有進程、線程,安全的概念,屬于底層技能;
計算機網(wǎng)絡(luò):凡是涉及網(wǎng)上收發(fā)消息,通信,都離不開網(wǎng)絡(luò)編程,因此這塊基礎(chǔ)知識也得學習;
Linux操作:有時做開發(fā)需要在Linux操作系統(tǒng)環(huán)境下進行,所以要掌握Linux基礎(chǔ)操作,屬于專業(yè)基礎(chǔ)課;
編譯原理:這塊涉及不深,不過據(jù)說是數(shù)據(jù)結(jié)構(gòu)、編程語言、操作系統(tǒng)綜合起來的一門學科,課程設(shè)計是做一個簡單的編譯器出來;
面向?qū)ο螅簩WJava、C++語言進階需要掌握的一種編程思想,當時我學習這門課時用StartUML畫類圖,時序圖,它就像教你如何設(shè)計一個工程,而畫的圖就是做這個工程的圖紙;
圖形學:一門將技術(shù)和藝術(shù)結(jié)合起來的學科,非常有趣,兼具美感和深度,美是因為它做出來的東西確實好看,而且應(yīng)用領(lǐng)域很廣,深度在于它的學習有一定的門檻,比如線性代數(shù),算法,還有空間幾何和變換等;
信息/網(wǎng)絡(luò)安全:涉及網(wǎng)絡(luò)編程,加密的一門專業(yè)基礎(chǔ)課,在我看來,這門課不是教你如何盜取對方電腦上的資料或者稱為一名黑客,而是教你如何更好的保護自己的電腦,以及學習相關(guān)的安全法律;
模擬電路:大二的專業(yè)基礎(chǔ)課,難度較大,當時也沒學好,不過這門課對于計算機硬件編程很有幫助;
數(shù)字電路:大二的專業(yè)基礎(chǔ)課,將開關(guān)狀態(tài)轉(zhuǎn)為01邏輯數(shù)字,進行一系列的操作。
三、計算機學科進階
工作半年,意識到學校所學與企業(yè)所用,兩者之間造成的斷層是多么的深,所以有些公司會在新人入職時進行相應(yīng)的培養(yǎng),在此說下我的感受。
如果讓我用優(yōu)先級來判別的話,肯定是以你在公司目前崗位所需的技能進行優(yōu)先學習,例如:
游戲服務(wù)端:掌握C++/Go這些語言的基礎(chǔ),再學習下TCP/IP,線程安全,簡單的數(shù)據(jù)庫查找語句;
游戲客戶端:熟練Unity操作和C#腳本編程,熟悉Shader原理和渲染管線;
圖形渲染:熟練使用C++編程,理解操作系統(tǒng)原理,有良好的數(shù)學基礎(chǔ),熟悉常用的圖形學算法,最好能自己寫一個軟件渲染器出來。
以上三個崗位是我接觸后了解了需求總結(jié)得到的,在此掌握的基礎(chǔ)上,然后學習你想學習的東西。
進階階段可以通過刷編程題,或者做一些小demo來實踐你所學的內(nèi)容,例如:
可以通過寫一個包含線程安全的多人在線聊天室,來熟悉Go語言或C++編程,網(wǎng)絡(luò)基礎(chǔ)和數(shù)據(jù)庫操作,鎖機制Github地址;
可以通過寫一個3D/2D射擊小游戲,來熟悉Unity游戲引擎的操作,以及C#腳本代碼的編寫,如果考慮多人聯(lián)網(wǎng),那就去復習服務(wù)器端相關(guān)技能Github地址;
可以通過寫一個3D旋轉(zhuǎn)的時鐘,來熟悉圖形學中的紋理貼圖,搭建三維場景的框架等博客文章地址;
可以通過把一個99碼表計時器,來熟悉單片機課程的基礎(chǔ)知識,以及Proteus軟件的操作,還有C語言的硬件編程,如果還想進一步挑戰(zhàn)自己,可以將C語言轉(zhuǎn)成匯編語言來實現(xiàn)它,或者把碼表來改進增加其他功能博客文章地址;
四、一些吐槽 + 學習經(jīng)驗
1,學編程必須要精通數(shù)學嗎?
如果你是找計算機相關(guān)工作的話,在我看來沒有必要。
用到什么學什么。精力有限,你不可能為了搞懂一個空間坐標變換而把一本線性代數(shù),矩陣論看一遍;也不可能為了一個加密而把大學高等數(shù)學全部學一遍。
2,學編程必須要有電腦嗎?
我高中學編程用算術(shù)本寫程序,在我看來電腦只是為了幫你驗證你的程序是否可以跑起來,同時它自帶首行縮進,語法高亮,還有在線查問題的功能。
以前看一些人為了學編程在手機上下載編程軟件,在我看來沒有這個必要。
有些人會把寫不了程序怪自己沒有電腦,或者鍵盤敲著沒有手感,在我看來完全是為了逃避困難而找的借口。
3,算法崗,開發(fā)崗、測試崗和技術(shù)支持崗的區(qū)別是什么?
如果把我們做出來的東西比作一輛車的話
算法崗:根據(jù)使用場景造輪子,思考如何讓車跑的更快,是造方的好,還是圓的好,還是三角的好;
開發(fā)崗:熟練將輪子與發(fā)動機銜接好,將輪子與各個模塊裝好,并使其跑起來;
測試崗:車子在跑的過程總要經(jīng)過各種場景的測試才可以投入量產(chǎn),這時候他們會把各種測試數(shù)據(jù)采集,分析,遇到數(shù)據(jù)異常的發(fā)給開發(fā)崗和算法崗來進行優(yōu)化,改bug;
技術(shù)支持崗:車子在投入量產(chǎn)后,總會在用戶那使用中碰到一些小問題,這時候先由技術(shù)支持崗的負責人前去排查問題,看是操作不當,還是輪子到期該換了,還是輪胎那有個缺口,如果他們解決不了,再找開發(fā)。
曾經(jīng)因分不清技術(shù)支持和技術(shù)研發(fā)而在一場面試中尷尬了,面試詳情如下???/b>威視2017校園秋季招聘技術(shù)支持工程師面試經(jīng)驗
注:以上四個崗位也是根據(jù)我的觀察和工作來熟悉的,如果有前輩或同行覺得有誤導,請及時在下面提出來。
4,有沒有必要從頭到尾把 CSAPP,C++ primer這樣的超過七百多頁的磚頭書從頭到尾看一遍?
如果時間充裕,當然最好是認認真真看幾遍,但我平時經(jīng)常把它們當做手冊來查閱,帶著問題去看。
5,學習編程有必要學習英語嗎?
有必要,但不是絕對。
我時??吹揭恍┤艘驗榭床欢⑽亩^疼說是要把考研英語大綱8000個詞匯背完,當然這是好事,但或許是揀了芝麻丟了西瓜。
我剛?cè)肼毸惴◢彆r曾被打擊英文閱讀能力差,因為老大給的所有參考資料都是英文的,為此我開啟了一個英語學習的開源項目VocabularyMap。但是據(jù)我了解,我們平時所經(jīng)常使用的英語詞匯最多不超過一千個,加上你所在崗位的特殊專業(yè)名詞,不超過一千五百個,而且句式較為簡單,不像考研英語閱讀那么喜歡拐彎抹角的表達意思(這個形容詞我想了很久),你只需在閱讀英文時,把中文思維調(diào)整為英文思維,單詞多看幾遍記住意思即可。
6,自學還是報培訓班學比較好?
如果有半年的充裕時間,建議選擇自學,如果自制力差,可以找?guī)孜豢孔V的朋友一起學習,實在不行再去報培訓班。
7,關(guān)于剛畢業(yè)找工作
慎入外包公司。
剛畢業(yè)建議去大廠工作一段時間,在這里面會遇到許多有特點的人,同時也會學習到他們思考問題的方式,這對自身長遠發(fā)展都是非常有利的。
如果不在大廠,那就靜下心來先做好眼前的事,再想辦法提升自己。
8,公司都在看有沒有個人博客和github賬號,我需要申請一個嗎?
堅持寫博客和整理寫過的代碼是一個好習慣,但既然選擇去做就堅持下去,不要為了面試,為了找工作去隨意丟幾個代碼上去,要是那樣我一天可以寫出幾十篇,甚至不要為了github上的Stars和Followers而故意去造假。
面試是看你的專業(yè)基礎(chǔ)能力和在這個公司繼續(xù)干下去的穩(wěn)定性,博客和Github只是展示你能力的一部分體現(xiàn),莫要本末倒置。
9,現(xiàn)在公司不用匯編做開發(fā),是不是就代表它已經(jīng)不重要?
其實這樣的問題還有個變形,例如,C語言崗位招的少了,是不是代表它即將要被淘汰了?
在我看來,編程語言沒有高低貴賤之分,只有適用場合的不同。那些所謂的排名也是根據(jù)每年的需求量而不斷變化。
因此,存在即是合理,也許它現(xiàn)在沒有什么用途,但在未來某一新發(fā)現(xiàn)的領(lǐng)域中會起到不一樣的作用。對技術(shù)存在包容,那么對自己能力的提升也是有一定好處的。
具體感受可以參考這篇文章淺談單片機中C語言與匯編語言的轉(zhuǎn)換
五、寫在最后
2018這一年,我經(jīng)歷了考研失敗帶給我的痛苦,經(jīng)歷了校園春招帶給我的打擊和培訓機構(gòu)的騙術(shù),我慶幸有父母對我的寬容與理解,女友的不離不棄帶給我的鼓勵,還有每一位前輩和好朋友的加油,最后在畢業(yè)時經(jīng)歷四輪面試拿到了上市游戲公司研發(fā)崗的offer,在這里我收獲了寶貴的開發(fā)經(jīng)驗,結(jié)識了許多能力強又不失低調(diào)的伙伴,代表了開發(fā)團隊去廈門參加48小時游戲開發(fā)大賽最后的Pitch
Time,最后也因工作原因離開游戲行業(yè),選擇進入圖形圖像和音視頻算法領(lǐng)域進行歷練。
猶記得進去的第一天,發(fā)現(xiàn)部門內(nèi)基本都是碩士研究生畢業(yè),或者是工作3-5年的老哥,只有我一位稚氣未脫的本科畢業(yè)生,接著一周五天,連續(xù)打擊了我的C++編程,VitualStudio軟件操作,英文翻譯水平和提出的問題(因為太簡單)。
但也正是如此,使我跑開了曾經(jīng)學校戴在我身上的枷鎖,使我在不斷的遇到問題和解決問題的過程中,逐漸縮小著與周圍人的差距。
謹以此文,記錄我從象牙塔出來后的半年時間完成的蛻變,同時寫給那些想跨行轉(zhuǎn)計算機的人,希望這篇文章能幫助你們解決一些學習上的困惑。
最后安利我開啟的兩個開源項目
英語學習(一年時間內(nèi)做完)VocabularyMap
計算機網(wǎng)上資源分享CS-Resources
?距離2019年還有半個月的時間,收拾好心情,一起努力!
(本文內(nèi)容已同步至Github-WeeklyARTS計劃)