開始更新公眾號內容以來,我就一直想整理我的技術變更路線;想理一理,我是一個怎樣的程式設計師。
這比記錄生活瑣碎難,我一週又一週的推遲,一次又一次的提筆放下。按理說,自己有一個工作內容列表,將它們列出來,便會是一份兒成長曆程。那是什麼一直在阻延我呢?是回想不起某個時間段對敲程式碼的態度?是對自己所掌握的工作技能不自信?是認為自己深度不夠?
最初,我是想將自己做過的系統一一列舉出來,並在每一項後面新增一些感悟。但發現並不能對所有程式碼都有感悟,於是換成本篇內容,按照一些印象深刻的節點講述。
電腦是什麼?
初次接觸電腦是初中的微機課,記不起來上課內容。能記住的是,當年很期待上微機課,在同學幫助(印象中的我,對各種操作都會戰戰兢兢,不敢點)開啟遊戲後,操控上下左右與空格,打飛機。
高中在同學帶領下去過兩次網咖,坐在網咖看電視、聊QQ。
大學之前,電腦對我來說,是一個可以玩遊戲、聊QQ、看電視的奢侈工具,只存在於網咖與微機房。
Hello World
高考結束報志願,可以選擇六個專業。聽說土木、建築很好,便選擇土木、建築;剩下的專業,在看起來順眼的名稱中挑選。最終被調劑到軟體工程,這程式設計師生涯開端,起於調劑。
大學學習的第一門程式語言是C++。聽過課程簡要介紹之後,第一次上機課程需要在控制檯輸出“Hello World”。正確輸出之前,錯誤過許多次,開啟VC6.0,建立工程,敲正確每一個字母……雖說按照教程操作,但一步一個坎。
#include <iostream>
using namespace std;
int main() {
cout << "Hello World!" << endl;
return 0;
}
當第一次將Hello World輸出到控制檯的時候,有些欣喜。即便只是在一個黑框框中顯示一行字。
大一經常去學院公用實驗室練習打字,待到能夠不看鍵盤盲打,感覺自己好厲害,進入一個新階段。
許多課程
大學的課程有許多。
《程式設計基礎》、《資訊系統基礎》、《離散數學》、《面向物件程式設計》、《軟體工程導論》、《計算機網路與 通訊》、《資料庫原理與設計》、《資料結構與演算法》、《Web開發技術》、《軟體需求分析》、《作業系統原理》、《軟體測試理論與方法》、《軟體架構與設計模式》、《軟體專案管理》,等等等等……
當時的目標是,每一門考試都及格。許多的課程,當時學起來,似乎能夠懂得,但歷經變遷,大部分課程,最後能留在腦子中的,也就只剩下它們的名字。淺嘗輒止。
現在的認知中,許多的課程設計目的,只是為了讓我們知道有某一種技術方向。以一本書進行舉例,大學的課程,只是前言(序)部分,正文內容還未開始。
除了上述專業課,還會有政治、歷史、數學、英語等,會選修另外的一些語言(如Java)課。已經忘記是由於什麼原因,當時認為寫C++ 是一件很酷的事情,所以許多的作業,都用C++ 完成。
編寫過許多的“玩具程式”後,能夠一口氣敲出沒有語法錯誤的程式碼,便很是開心。
Unity3D
第一份實習工作,在一家遊戲公司,他們使用Unity3D引擎進行開發。初次接觸Unity3D,轉為使用C#語言程式設計。其後的一兩年時間,都使用Unity3D做東西。
看Unity3D官方文件,某一瞬間忽然意識到:哦,原來Update函式是每幀都呼叫的啊,每一秒鐘會執行30幀,Start函式會在GameObject建立時候執行。其後的很長一段時間,都感覺自己理解了Unity3D的運作規則。並沒有去想想這些規則是如何實現的。
時隔六七年,現在已經不太記得當時寫的程式碼長什麼樣子。不過那個時期,似乎主要目標只是將功能實現,並不太注重效率。會稍微注意一下程式碼可讀性,對以大量的abcd、中文變數命名有些嫌棄,對在U3D中將幾十個GameObject放在一個層級感到煩心。
模糊的感覺到當時做的東西,不精緻。
語言
隨著工作(專案)變更,使用過C++、C#、Java、Python、Lua、JavaScript。
C++很酷。
C#和Java看起來一樣。
使用Python,感受到不一樣,不用寫變數型別,只需要注意縮排,寫起來很爽。
……
有一段時間,又覺得自己很厲害:語言都是類似的;一門新的語言,給我一點時間,讓我稍稍熟悉下它的關鍵字,便可以開始做專案。
不過近期,思維有了變化。之前的“覺得”太過自信。每一門語言都是博大精深的,都需要許多時間去學習、研究;需要知道它們的內部實現原理,胸中自有丘壑後,才能敲出更好的程式碼。
寫邏輯
不算實習期的內容,畢業後到現在,已經工作七年半的時間。細細想來,已經好長的時間過去。
那這些年做的最多的事情是什麼呢?寫邏輯!
什麼是邏輯?我的理解是:
需求方(專案經理、遊戲策劃)提出當時專案所需要的各種需求,它們會隨著專案死亡而湮沒在某個不知名的硬碟角落。
隨著做的專案多起來,許多需求,都是相似的、生命週期是短暫的。
到最後,程式設計師的工作,便是許多重複內容。
這些需求所對應的程式實現,這些重複的程式碼,就是邏輯。
而邏輯寫多了,不加總結,就真正成為搬磚人,只是重複勞作。一直寫邏輯的我,有那麼兩三年,一直在原地踏步。
走在前面的人,真的非常厲害。他們為了減少重複勞作,提高程式碼複用率、可讀性、易於擴充套件,提出了設計模式。
最近幾年所跟的專案,用到了許多的設計模式。但在我有意識的去學習設計模式之前,我並不知道那就是設計模式。
三四年前,專案中的導師讓我去閱讀《重構》這一本書,書中講述了許多最佳化程式碼的具體方法。不知道從什麼時候開始,腦子中有了這個印象:
按照一些規則將程式碼進行重構,重構後的程式碼,就會是設計模式的具體展現。
新知識的學習
程式設計師,就是一個需要不停學習的行業。想為這“不停學習”寫兩句話,到落筆時刻,我只能左右食指輕輕敲擊F與J。
我敲啊敲,敲啊敲……
一個詞語出現在我的腦子中:學以致用!
我想學習的新技術有許多,熟練的卻很少。
按照我的學習經歷,如果要真正的熟練掌握一項技術,便需要真正的在工作中用到它,經常的用到它。否則,便會很快忘記這些內容。嗯,要學以致用。
但是,新知識又是必須學習的,不能只在工作需要時臨時抱佛腳。我現在的理解,有這麼一點:
學習一項新技術後,雖然不能完全的記在腦子中,但是可以藉助筆記。學習當時,用自己的語言將其總結記錄,待需要時候,翻一翻。
舉例說一說此前的學習經歷:
Shader
作為一個遊戲程式設計師,剛開始接觸Unity3D,就知道要學習渲染。
這麼多年過去,即使按照一份教程敲過一遍程式碼、研究過一段時間遊戲中效果表現。但現在印在腦子中的清晰內容,也就只剩渲染流程。
awk指令
線上執行的專案,往往需要進行一些資料統計。看見大佬們刷刷刷的搞定,於是模仿。
使用多次後,我也能夠刷刷刷的統計出結果。
未來
作為一枚普通程式設計師,需要學習的東西還有很多,且前行~