程序員積累了很多編程知識,將它放到十年后,將有多少變得沒用?
本文是看了一名 40 歲“老”程序員的反思后想到的。?
為什么知乎上有 8個人邀請,你們都覺得我很老了么?我還很年輕,悄悄的告訴你們,姚老師比我老,你們該去邀請他。?
以前學(xué)了現(xiàn)在沒用的技術(shù),有很多,越數(shù)越傷心,還是回憶下 2007年的事情吧:?

13年前?
1. 業(yè)余在玩 Flash 游戲開發(fā),當(dāng)時頁游還沒有火,我覺得是個機會,市面上很多頁游都是八位機的水平,估計他們以前都沒什么游戲開發(fā)經(jīng)驗,所以大家都持懷疑態(tài)度,我想看看 Flash 的 2D 效果能做到什么程度,于是花了了兩周時間做了 Flash 下的第一個小游戲:Flash Game – Final Weapon 。。。?
嗯,模仿 PopCap 的 heavy weapon 加了些有趣的元素,比當(dāng)時所有市面上的 Flash 游戲效果都好一大截,至今為止,仍然有很多市面上的 Flash 游戲沒達到這個 Demo 的效果。?
2. 帶領(lǐng)一只六人團隊開發(fā) XBox 360 的預(yù)研項目,把公司一套 3D引擎移植到 XDK 的 D3D9下面,D3D8 到9 跨度很大,廢了比較多的時間,覺得 D3D9 才是未來。當(dāng)時 360 的性能并沒有說的那么好,單核性能差不多只能到我筆記本單核的 50% 左右,但是它有六個核,和原有引擎的單線程體系差別比較大,因此性能十分堪憂,這個坑填了很久。原有引擎很多基于 SSE 的運算代碼全部不能使用了,花了不少時間改寫成為 PowerPC 的 AltiVec 指令,最終才將整個引擎終于在 360 上從 “不能用” 變?yōu)?“能夠一用” 了。當(dāng)時寫了篇關(guān)于 360 的優(yōu)化文章:PowerPC 匯編入門與優(yōu)化 。?

3. 研究游戲同步技術(shù),當(dāng)時國內(nèi)沒人覺得游戲還有 “同步” 問題,沒有任何參考資料,2007年游戲市場上清一色的 MMORPG 游戲,大家覺得只有做 MMO才是掙錢的。我看當(dāng)時網(wǎng)游里 95% 的 RPG游戲,在對比單機游戲上只有 39%的 RPG比例,覺得十分不合理,玩家遲早要厭煩,RPG壟斷的局面必然被打破。但是傳統(tǒng) RPG那一套在快速動作游戲上基本沒法行得通。我不斷的抓包,推敲模擬傳統(tǒng)局域網(wǎng)游戲和國外快速動作游戲的同步方式,寫了篇文章:《幀鎖定同步算法》配合之前寫的《網(wǎng)絡(luò)游戲同步法則》以及《影子跟隨算法》,基本上從兩個方向討論游戲同步的兩大核心方法:幀同步和狀態(tài)同步(客戶端預(yù)測插值)。?
4. 學(xué)習(xí)策劃知識,翻譯 MUD之父 Richard Bartle 的《MUD玩家分類理論》,當(dāng)時游戲“成就系統(tǒng)” 在國外剛剛興起,國內(nèi)游戲還沒有這個東西,覺得十分不錯,我又翻譯了 《成就系統(tǒng)最佳實踐》。?
5. 弄 server 內(nèi)存分配優(yōu)化,參考 kernel 的 slab 內(nèi)存分配算法,于是優(yōu)化并重新設(shè)計了一套 slabtree 分配算法,給服務(wù)端整體內(nèi)存分配性能提升了一倍,不再受運行時間和碎片的影響 。

10年后:?
1. Flash 基本掛掉了,沒人再提了,不過如今頁游還是在發(fā)展,只是遠沒當(dāng)初那么火爆,當(dāng)年學(xué)習(xí) Flash 的程序員都紛紛 cocos 和 u3d了,現(xiàn)在做頁游想招聘一個 Flash 程序員更是難上加難,不過 Flash 的 API 我覺得設(shè)計的真的很漂亮,我見過 2D 引擎里比較上乘的接口設(shè)計了,今天很多用 H5封裝的游戲引擎,比如白鷺引擎,沒事掃了一眼,他們從對象樹到 API名稱,還是再模仿 Flash 的接口,可見影響力有多大。?
2. 360也掛掉了,當(dāng)年游戲機清一色的 PowerPC (主機)和 mips(掌機,PSP)架構(gòu),如今換成了 x86(主機)和 arm(掌機)結(jié)構(gòu)了。D3D9 也早已被淘汰。?
3. 同步技術(shù)到今天都還在很多討論,作為研究的比較早的人,我的三篇文章曾經(jīng)幫助了不少游戲解決他們的同步技術(shù)。《街機三國》的制作人跟我說,當(dāng)時做 DEMO就是卡在同步上,后來看到了我的 《幀鎖定同步法》解決了《街機三國》的同步問題,最終項目得以立項,然后他們就發(fā)財了,我得到一句真誠的 “感謝”。聽說《王者榮耀》也還在用基于 “幀同步” 的改良方式。?
4. 當(dāng)年花過好幾年的時間學(xué)習(xí)策劃知識,業(yè)余也喜歡自己兼任策劃和程序做些小游戲,但如今成就系統(tǒng)早已不是什么新東西,巴圖的理論也出現(xiàn)了更為科學(xué)先進的玩家分類方法的論文,加上 2009 年以后我就不做游戲了,這些知識基本也就白費了。?
5. 后來發(fā)現(xiàn)和 tcmalloc 很像,用了 7年這套代碼,比 libc 自帶的 malloc 強太多了,一路都是最好用的內(nèi)存分配算法,后來我自己忙其他項目懶得添加新特性和繼續(xù)優(yōu)化就換成 jemalloc 了。當(dāng)年 “內(nèi)存分配” 這個技術(shù),但凡有點經(jīng)驗的人,都會來兩手,也是比較關(guān)鍵的模塊之一,如今好玩看看就行,自己重新實現(xiàn)邊際效用太低。?

總結(jié)?
總結(jié)下,翻翻歷史,以前學(xué)過現(xiàn)在沒用的技術(shù)實在是一大把,我承認技術(shù)是有 “道” 和 “術(shù)” 的區(qū)別,我寫了十多年代碼的時候以為 “術(shù)” 容易淘汰,而只有 “道” 就能長存,一旦掌握了恒久不變的道,就可以以不變應(yīng)萬變;而又寫了十多年代碼以后發(fā)現(xiàn)從更長的尺度上來看,并沒有一成不變的東西。?
道法精深,短期是可以幫助你盡快的掌握運用新的 “術(shù)” 但是隨著具體實踐的不斷發(fā)展,人類認識世界的范圍逐步擴大,理論體系這個上層建筑的 “道” 也需要不斷修正,推陳出新,適應(yīng)新的實際情況。?
早期基于的端游開發(fā)經(jīng)驗,幫我在 Flash 平臺上可以更短的時間內(nèi)掌握要點,并做出超過同期水平的東西。手游興起后,我雖然沒趟這灘渾水了,但看到很多第一批成功的團隊,也都是早年在端游或者頁游上有經(jīng)驗的人。?
另一層面上,道也不是一成不變的:以前積累的各種單核技術(shù)下的 “道”,碰到 360 這種 6核cpu,每個核都不行的體系,基本全廢了;以前寫代碼,每一行我都想追求極致性能的做法,后面變得沒那么重要了;內(nèi)存分配算法,在某一階段內(nèi)自己可以做到領(lǐng)先,但不能持續(xù)了解最新相關(guān)方法,不持續(xù)迭代,興趣轉(zhuǎn)移了,隔段時間也就被 jemalloc 超過了,所以也并無一成不變的算法。?

總之,基本原理要掌握,不能成天只搞具體技術(shù)忽視理論提高;也不能癡迷純粹的 “理論”,還是要勇于實踐掌握新進的 “術(shù)” 才能更好的迭代進化你自己的 “道”,否則空有理論,只能坐而論道了。這不,我一把年紀了,最近幾個月還在玩 beautifulsoup4 做爬蟲呢。?
并沒有什么 “一成不變” 的 “基本原理” 可以讓你學(xué)一次就吃一輩子的。?
錢學(xué)森不是說過么,脫離工程的理論,是沒有價值的。?
作者:韋易笑?
另外筆者還是一名CC++的程序員,如果你想更好的提升你的編程能力,好好學(xué)習(xí)C/C++編程知識的話!那么你很幸運~

UP在主頁上傳了一些學(xué)習(xí)C/C++編程的視頻教程,有興趣或者正在學(xué)習(xí)的小伙伴一定要去看一看哦!會對你有幫助的~
分享(源碼、項目實戰(zhàn)視頻、項目筆記,基礎(chǔ)入門教程)
歡迎轉(zhuǎn)行和學(xué)習(xí)編程的伙伴,利用更多的資料學(xué)習(xí)成長比自己琢磨更快哦!
編程學(xué)習(xí)書籍:

編程學(xué)習(xí)視頻:
