2018年終總結_四年計算機科班學習經驗分享+半年工作感悟

不會飛的章魚發表於2018-12-11

一、寫作初衷&簡單自我介紹

本科專業為電腦科學與技術,今年六月畢業後入職一家上市遊戲公司從事遊戲伺服器端開發,九月中旬離開遊戲行業,目前在一家網際網路公司從事圖形影像音視訊演算法,偶爾兼顧伺服器開發。

為什麼要寫這樣一篇文章,主要原因有兩點:

  • 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軟體操作,英文翻譯水平和提出的問題(因為太簡單)。

但也正是如此,使我跑開了曾經學校戴在我身上的枷鎖,使我在不斷的遇到問題和解決問題的過程中,逐漸縮小著與周圍大佬的差距。

謹以此文,記錄我從象牙塔出來後的半年時間完成的蛻變,同時寫給那些想跨行轉計算機的人,希望這篇文章能幫助你們解決一些學習上的困惑。

最後安利我開啟的兩個開源專案

距離2019年還有半個月的時間,收拾好心情,一起努力!

文章已同步至
Github-WeeklyARTS-Share

相關文章