程序员所积累的编程知识在十年后将有多少变得没用?

本文是看了一名 40 岁“老”程序员的反思后想到的。

为什么知乎上有 8个人邀请,你们都觉得我很老了么?我还很年轻,悄悄的告诉你们,姚老师比我老,你们该去邀请他。

以前学了现在没用的技术,有很多,越数越伤心,还是回忆下 2007年的事情吧:

10年前

1. 业余在玩 Flash 游戏开发,当时页游还没有火,我觉得是个机会,市面上很多页游都是八位机的水平,估计他们以前都没什么游戏开发经验,所以大家都持怀疑态度,我想看看 Flash 的 2D 效果能做到什么程度,于是花了了两周时间做了 Flash 下的第一个小游戏:Flash Game – Final Weapon 。。。

嗯,模仿 PopCap 的 heavy weapon 加了些有趣的元素,比当时所有市面上的 Flash 游戏效果都好一大截,至今为止,仍然有很多市面上的 Flash 游戏没达到这个 Demo 的效果。

2. 带领一只六人团队开发 XBox 360 的预研项目,把公司一套 3D引擎移植到 XDK 的 D3D9下面,D3D8 到9 跨度很大,废了比较多的时间,觉得 D3D9 才是未来。当时 360 的性能并没有说的那么好,单核性能差不多只能到我笔记本单核的 50% 左右,但是它有六个核,和原有引擎的单线程体系差别比较大,因此性能十分堪忧,这个坑填了很久。原有引擎很多基于 SSE 的运算代码全部不能使用了,花了不少时间改写成为 PowerPC 的 AltiVec 指令,最终才将整个引擎终于在 360 上从 “不能用” 变为 “能够一用” 了。当时写了篇关于 360 的优化文章:PowerPC 汇编入门与优化

3. 研究游戏同步技术,当时国内没人觉得游戏还有 “同步” 问题,没有任何参考资料,2007年游戏市场上清一色的 MMORPG 游戏,大家觉得只有做 MMO才是挣钱的。我看当时网游里 95% 的 RPG游戏,在对比单机游戏上只有 39%的 RPG比例,觉得十分不合理,玩家迟早要厌烦,RPG垄断的局面必然被打破。但是传统 RPG那一套在快速动作游戏上基本没法行得通。我不断的抓包,推敲模拟传统局域网游戏和国外快速动作游戏的同步方式,写了篇文章:《帧锁定同步算法》配合之前写的《网络游戏同步法则》以及《影子跟随算法》,基本上从两个方向讨论游戏同步的两大核心方法:帧同步状态同步(客户端预测插值)

4. 学习策划知识,翻译 MUD之父 Richard Bartle 的《MUD玩家分类理论》,当时游戏“成就系统” 在国外刚刚兴起,国内游戏还没有这个东西,觉得十分不错,我又翻译了 《成就系统最佳实践》。

5. 弄 server 内存分配优化,参考 kernel 的 slab 内存分配算法,于是优化并重新设计了一套 slabtree 分配算法,给服务端整体内存分配性能提升了一倍,不再受运行时间和碎片的影响 。大致原理见:如何设计内存池? – 知乎

10年后:

1. Flash 基本挂掉了,没人再提了,不过如今页游还是在发展,只是远没当初那么火爆,当年学习 Flash 的程序员都纷纷 cocos 和 u3d了,现在做页游想招聘一个 Flash 程序员更是难上加难,不过 Flash 的 API 我觉得设计的真的很漂亮,我见过 2D 引擎里比较上乘的接口设计了,今天很多用 H5封装的游戏引擎,比如白鹭引擎,没事扫了一眼,他们从对象树到 API名称,还是再模仿 Flash 的接口,可见影响力有多大。

2. 360也挂掉了,当年游戏机清一色的 PowerPC (主机)和 mips(掌机,PSP)架构,如今换成了 x86(主机)和 arm(掌机)结构了。D3D9 也早已被淘汰。

3. 同步技术到今天都还在很多讨论,作为研究的比较早的人,我的三篇文章曾经帮助了不少游戏解决他们的同步技术。《街机三国》的制作人跟我说,当时做 DEMO就是卡在同步上,后来看到了我的 《帧锁定同步法》解决了《街机三国》的同步问题,最终项目得以立项,然后他们就发财了,我得到一句真诚的 “感谢”。听说《王者荣耀》也还在用基于 “帧同步” 的改良方式。

4. 当年花过好几年的时间学习策划知识,业余也喜欢自己兼任策划和程序做些小游戏,但如今成就系统早已不是什么新东西,巴图的理论也出现了更为科学先进的玩家分类方法的论文,加上 2009 年以后我就不做游戏了,这些知识基本也就白费了。

5. 后来发现和 tcmalloc 很像,用了 7年这套代码,比 libc 自带的 malloc 强太多了,一路都是最好用的内存分配算法,后来我自己忙其他项目懒得添加新特性和继续优化就换成 jemalloc 了。当年 “内存分配” 这个技术,但凡有点经验的人,都会来两手,也是比较关键的模块之一,如今好玩看看就行,自己重新实现边际效用太低。

总结

总结下,翻翻历史,以前学过现在没用的技术实在是一大把,我承认技术是有 “道” 和 “术” 的区别,我写了十多年代码的时候以为 “术” 容易淘汰,而只有 “道” 就能长存,一旦掌握了恒久不变的道,就可以以不变应万变;而又写了十多年代码以后发现从更长的尺度上来看,并没有一成不变的东西。

道法精深,短期是可以帮助你尽快的掌握运用新的 “术” 但是随着具体实践的不断发展,人类认识世界的范围逐步扩大,理论体系这个上层建筑的 “道” 也需要不断修正,推陈出新,适应新的实际情况。

早期基于的端游开发经验,帮我在 Flash 平台上可以更短的时间内掌握要点,并做出超过同期水平的东西。手游兴起后,我虽然没趟这滩浑水了,但看到很多第一批成功的团队,也都是早年在端游或者页游上有经验的人。

另一层面上,道也不是一成不变的:以前积累的各种单核技术下的 “道”,碰到 360 这种 6核cpu,每个核都不行的体系,基本全废了;以前写代码,每一行我都想追求极致性能的做法,后面变得没那么重要了;内存分配算法,在某一阶段内自己可以做到领先,但不能持续了解最新相关方法,不持续迭代,兴趣转移了,隔段时间也就被 jemalloc 超过了,所以也并无一成不变的算法。

总之,基本原理要掌握,不能成天只搞具体技术忽视理论提高;也不能痴迷纯粹的 “理论”,还是要勇于实践掌握新进的 “术” 才能更好的迭代进化你自己的 “道”,否则空有理论,只能坐而论道了。这不,我一把年纪了,最近几个月还在玩 beautifulsoup4 做爬虫呢。

并没有什么 “一成不变” 的 “基本原理” 可以让你学一次就吃一辈子的。

钱学森不是说过么,脱离工程的理论,是没有价值的。

作者:韦易笑
来源:知乎

你也许感兴趣的:

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注