记得1998年打电话给余雪松,我兴奋的说,我已经将游戏中设计元素精简统一了。世界只有两个基础概念:元素、树结构。窗口、菜单、按钮这些概念,通通去掉。现在的LayaAir引擎即采用的这个结构。
说这个故事是在想我近30年程序猿生涯,我在求什么?
可以肯定的说,我不是一个顶尖的程序猿。上文提到的余雪松,初中就参加全国计算机比赛,编程天才,我的搭档,原可乐吧的CTO,中国最早游戏脚本语言fcc作者,他的程序水平就比我高。
我的另两个好朋友,姚震和鲍岳桥。一个是中国最早即时战略游戏《生死之间》主程。另一个是联众游戏创始人,96年著名UCDOS汉字系统作者。他们程序水平应该也都比我强。
我与他们的区别是什么?为什么最后反而是我去做了引擎。也许有一天我会比这些朋友在程序方面走得更远,我们的区别是什么?
一个求法。一个求道。
此话怎讲?
法即是方法、方案,有大法和小法之分,解决局部问题叫方法,是小法;解决整体问题叫方案,是大法。比如《孙子兵法》,就是大法,但他的目的还是只是解决战争的策略,而不是思考战争的本质。
程序的行业大法叫解决方案,提出解决方案的人是最大价值创造者。比如,提出MVC的是著名的施乐帕克研究中心,就是那个创造了鼠标和人类历史上第一台个人电脑及图形用户界面的顶尖技术团队,盖茨和乔布斯的成功也都源自于对施乐的技术借鉴。
还有一种牛人是在理论基础上做框架实现。比如MVC著名框架:Struts。
算法是小法,一个好的光线渲染算法,一个好的AI算法。
还有一种优秀的程序猿是对框架方案理解深刻,融会贯通,能熟练的完成项目。
因此,法又包括法的创造者和法的执行者。
道又是什么?
道是事物本质,是世界的规则。比如中国的阴阳、八卦,比如计算机的二进制。法求解决问题,道更抽象,更执着于规则的发现和创造。
而对于程序员的道是什么?我求道,但不是得道。只能通过我的追求过程去说说我的理解。我更多说的是因求道而导致的不同的思路和关注点,而不是我真正找到了程序的道。
上文说的游戏世界构成规则就是我当年幼稚的思索,为什么世界描述要那么细碎?有没有简约终极的描述方式?
设计游戏程序,通常一个问题提出了,我们先想的一定是如何去解决他,任务系统如何做?商城如何做?这些解决方案很多,都可以实现。我们做LayaNative时,如何实现比浏览器更高的性能?节点方案,内置算法,暴露绘图函数,提供材质对象,都可以实现,效果也很好。但这种层面的方法都存在诸多的约束性,被问题自身限制,今天解决了,明天可能又不满足,疲于奔命。有没有更好的方法?不要做任务系统,任务系统就有了,不做材质系统,材质就绘制出来了。我在公司经常说的是:不着一字,尽得风流;不做事而问题都解决了,这才是道。
道是回到问题本质,从而探索问题的基点。道不是头痛医头,脚痛医脚,是要去探索病理的机制,西医讲病毒,中医讲阴阳失衡。游戏中比如任务系统、商城,甚至整个服务器设计,最本质是数据,是数据的逻辑、操作、同步、存储。数据驱动模式是大法,道呢?更进一步,要将世界描述数据化,提出数据描述语言和规则,然后由法来提出解决方案,然后再实现相关代码模块。
WebGL脱胎于OpenGL指令,OpenGL是道,是对视觉呈现的规则抽象,但WebGL太底层,HTML5游戏运行中,JS对操作接口的损耗以及准备数据计算开销,导致HTML5在JS层性能压力过大,如何解决浏览器的缺陷,解决HTML5的性能和耗电量缺陷?QQ厘米游戏平台、LayaNative都是将更多算法和模块内置到Native内核层,通过Native的速度优势来解决问题。这是办法,是针对特定问题的特定方案,这种方案效果明显,但最后的结果却是因要满足开发者无限的创意需求,需要不停的增加和调整接口,会疲于奔命。特别是3D游戏,模式更多,需求更多,扩展性要求更高,较高的封装和更严格的规则只能是针对特定项目,所以这就存在问题。有的人或许会想,这不算问题,大不了改改嘛,但如果像LayaBox开源引擎、手机QQ或微信这样的开放平台,这样的方式一定是行不通的,做的越多,死得越快。
为什么要做LayaNative,问题的本质是什么?无非是性能嘛。火狐最早提出asm.js方案,并进一步被四大浏览器发展为WebAssembly方案,这就是求道的思路。但受制于WebAssembly的不成熟,问题多多,目前还无法大规模用于实践。
2014年我和火狐负责人沟通,今年和手机QQ厘米秀负责人、微信游戏技术负责人都提出过,大家为什么不去思考WebGL 方案呢?用规则去解决规则的问题,这是道的思考方式,回到基点去思考。站在宇宙大爆炸的奇点去思考宇宙,用基因的方式去思考生物和人类。新一代的LayaNative就试图用这样的思路去解决问题。
2000年做可乐吧,我们还不习惯服务器和客户端分离设计,信息一来一去,开发和调试太麻烦,远不如单机方便,我当时就提出数据共享概念,服务器操作数据,自动同步到前端,前端只是视觉呈现,把网络编程变成单机编程,我们取得了一定的收获,当然最后还是没有达到我们的预期,求道之路确实艰辛,他的问题是离结果,环节太远。
很多人问我Laya名字的来源,前因不多说,Laya原来是我在2008年筹备成立的开源组织名,是一个新语言的名字,我们当时做端游,大并发量的分布式设计导致程序代码割裂、设计极其复杂、动态扩容困难,看看市面上的解决方案都存在问题。我们并没有从算法和结构层思考问题,我们认为是程序语言自身的问题导致,在现有语言的基础提出的解决方案都是打布丁,无法完美解决问题。我们首次提出了虚拟应用和await(当时名字不是这个)方案,虚拟应用是程序内部独立运行子应用,包括代码和内存,可以虚拟应用的方式动态部署、拆分、合并和迁移。而await则是通过新的异步编程方案,试图解决应用、模块之间通讯和调用是,因大量异步回调导致的代码割裂和晦涩问题。也就是希望通过虚拟应用解决发布问题,而通过await使开发者感知不到虚拟应用的存在。这个方案当时和微软的人探讨过。因为资金问题,项目并没有得到整体实施,只是在公司内部有局部应用。随后.NET和最近的ES7标准部分实现了我当时的想法。
我为什么一直痴迷于道的追求?
一是因为中国文化的惯性使然,中国人喜欢抽象思索,我们的道家、中医、太极,都试图用整体性的方法去解决问题、描述问题,当然古希腊等原始哲学也有这个特点,只是漫长的统一的社会让我们的文化持续性最长。
二是懒,一个勤奋的懒人,找出终极解决方案,一劳永逸,从此高枕无忧,天天晒太阳。当然,几十年下来,这也只是梦想,我只是求道,不是得道。
求道是一个有趣的过程,也是一个艰难的选择,能不能找到道是个挑战,道是否正确是个挑战,道与果的路径其实在变长,能不能实现是个巨大的挑战。我经历过很多想法很好,但做不了,或者做出来结果并不理想的事。所以道为体,法为用,“用”这一部分基本功是要扎实的,道的实现需要团队,钱也是很重要的。
大道至简。
简就是一种美,最后其实是我们在痴迷于一种美。
求道孤独
希望能多一些同路人。
END