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