近40年码龄,从通宵写代码到三思而后行——专访云风

Posted 《新程序员》编辑部

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了近40年码龄,从通宵写代码到三思而后行——专访云风相关的知识,希望对你有一定的参考价值。

小学时跟随母亲去成人大学学习编程,初中开始参加信息学奥赛,高中写出人生中第一个成熟软件——Cview,大学发布开源软件风魂系列,后用于网易开发的《大话西游》《梦幻西游》等热门游戏,离开网易创立简悦科技……随着云风在游戏与编程领域的不断深入,他的声名也愈发广为人知,成为大家口中的技术大神。“游戏做得好”“博客写得好”“很极客的一个人”是大家对他的印象,“云风大佬”“云风大神”“云大”是大家对他的称呼。

《新程序员》专访了这位集游戏、编程、开源、创业、攀岩等标签于一身的极客,深入了解其三十多年编程生涯与人生感悟。

作者 | 田玮靖
出品 | 《新程序员》编辑部

一位43岁的中年人,已有三十多年时光与游戏和编程为伴,恐怕全球都难找几人。

生于1979年的云风,在电脑还是稀罕玩意儿的20世纪80年代初,便成为了他的玩具。电脑没有显示器,用黑白电视接,将《儿童计算机世界》中的程序按步骤写入、运行,就是最好玩的事情。

因为游戏爱上编程,又因编程做好游戏,云风至今都在游戏与编程的世界中感受乐趣。如果让一个超过30年码龄的程序员对年轻人说点什么,他的建议是:想清楚再去做、多听别人的声音、抓住问题的本质、把复杂的问题简单化、看清事物也认清自己、做事情要专注、信任和你共事的人。

云风。原网易游戏核心成员、杭州研究中心总监;后联合创办的简悦科技为现阿里游戏的前身。具有丰富的程序开发经验。硬核游戏玩家。早期在 cfido 和水木清华 BBS 发表了多篇关于游戏制作的文章。1997 年开始维护的个人网站是最早用简体中文介绍游戏制作的网站之一,收录个人文章超过百万字,在游戏界颇有名气。

谈儿时与玩具

《新程序员》:你从小接触游戏和电脑,大概几岁萌生了对编程的兴趣?

云风: 我在绚丽的街机厅看到电子游戏,是在八、九岁的时候,那时就想自己做游戏。小学时也写过程序,但不成系统。

在我五岁的时候,家里买了一台电脑,那是我爸的玩具。他给我写了一些比较简单的游戏,也教我编程,但他觉得教不会。大概在我四、五年级的时候,课业较松,有很多自由时间可以支配,我就跟着母亲去成人大学上一门Basic语言的课程,我每堂课都听,并且认真完成老师留的作业。课堂上基本都是四十多岁的中年人,只有我一个小孩,老师自然也就认识我了。学完这门课程后,我做了一些小游戏,但当时的能力还不能把东西完全做好。真正有把握写程序,以及正式学习编程,是上初中后,1990年左右。

当时我所在的中学,素有奥赛传统,包括数、理、化与信息学。奥赛老师是我爸的大学同学,由于在当时想找一个会写程序的人比较难,他就让我爸去代课,我也顺理成章地成为了我爸的正式学生。

初中几年的奥赛经历,让我对自己的编程能力充满信心,觉得自己什么都能做。初三时还进了奥赛省队,作为高中生的后备力量。那时,初中生参加高中奥赛就算拿不到好成绩,也可以到上高中后继续比赛,所以我在这方面非常积极。每逢暑假就去大学,带队老师按本科课程教我们计算机知识,算法、数据结构、编译原理等。

《新程序员》:那时的电脑有显示器吗?用这样的电脑编程,是什么样的感受?

云风: 很有意思,它对小孩来说就是玩具。我最早使用的电脑是Z80 CPU的港产机器——Laser310,这是一台只有16K内存的电脑。为了接显示器,在电视还没有普及的年代,我爸就买了一台旧的9寸黑白电视。后来在初中参加奥赛基本都是用Apple II兼容机。学校机房使用的是中华学习机,由于我爸在学校代课,就从学校机房借了一台放在家里用。中华学习机比较简单,它有几本配套书,讲解硬件、软件系统,对于当时的我来说,这是特别好玩的玩具,玩了好几年。

《新程序员》:喜欢编程是觉得有趣,还是因为在计算机稀有的年代,会比其他小朋友厉害?

云风: 我从小到大身边总有各方面比我厉害的人。我的父母属于工薪阶层, 经济条件不是很好,没有给我买很多玩具。家里有一台电脑,就觉得很有意思了,但早期没办法跟别人交流其中的乐趣。当时《儿童计算机世界》创刊(1984年),刊登一些有趣的程序,我拿到以后,打开电脑。花两、三个小时把程序敲进去,运行一下,觉得非常好玩。

上中学以后参加奥赛,并不是因为对比赛多么有兴致,而是因为拿到好的比赛成绩可以被保送,保送就意味着不用参加高考。当然,后来没有保送成功,高考前虽然没怎么复习,但成绩也不算太糟糕。

《新程序员》:高中时为什么会想做一个看书的软件——C-View?

云风: 读高三时玩拨号的BBS网络(中国惠多网),大家用电话拨到一个固定的位置,传送信件、下载资源。其中最多的就是电子书。在互联网普及之前,BBS网络在国内流行了好几年,求伯君、雷军、马化腾等人都玩过很长时间。

我从小到大都喜欢看书,但没那么多钱买书。我发现在电脑上看书可以省很多钱。在Windows还没诞生的年代,DOS系统是使用最广泛的,很多电脑甚至连硬盘都没有。因此,我想做一个在软盘上快速打开的电子书软件,并自带中文环境。初期发布在BBS网络,按照很多共享软件的注册页面,照猫画虎也做了注册框,注册费10块钱,并留了收费地址。直到大学时间,都一直有人给我邮寄软件注册费。也正因为这个软件积累了一些用户,所以上大学后又更新了一个版本,后来被《电脑报》的光盘收录,在全国发行。

谈游戏与产品

《新程序员》:最近在忙什么?

云风: 最近两、三年,由于简悦科技被阿里巴巴(以下简称阿里)收购,我就脱离了管理工作。然后,兴趣使然,我做了一个3D游戏引擎。原本计划开源,但我觉得游戏引擎需要完整成熟,才能培养出好的开发社区,因此在完善之前,还是闭源开发。因此,从2021年下半年开始,带了五、六个人的小团队,基于这个自研游戏引擎开发游戏。在做游戏的过程中,能够发现游戏引擎的不足,逐渐完善它。目前是围绕游戏来完善游戏引擎,等我们做下一款游戏的时候,就可以逐步把游戏引擎中通用的部分抽象出来。本质上,做游戏引擎还是为了做游戏,游戏引擎只是其中的一部分。所以,我定义自己目前在做的事情,并不是游戏引擎,还是游戏。

目前在做的这款游戏,是手机端的单机游戏。定位于城市建设和自动化,基调和我近两年喜欢玩的一款游戏——异星工厂很相似。在2022年春节,我们刚完成游戏的雏形。

现在的状态也很舒服,不负责简悦大团队的事项,又做着自己感兴趣的事情,按现在流行的话说,我已经财务自由了,不会为了赚钱去做什么事,也就没有太大的业绩压力。

《新程序员》:果然自由的基础还是财务自由。

云风: 财务自由只是一种流行的说法,其实,自由不自由不在于有多少积蓄,还是看自身的个人需求。我没有太大的需求,自然就感觉财务自由了。当经济比较独立后,来自外界的压力会小得多。但我自己还是有压力的,因为我希望给一起工作的团队一个交代,让同事觉得工作有意义,生活也能过得比较好。

《新程序员》:你们现在忙吗?

云风: 还算有点忙,但至少我负责的团队,从不鼓励加班。我们在晚上六、七点钟就下班,下班后也不谈工作。在我看来,做开发这项工作,最主要的是把事情想清楚,再按照计划好的工作时间做事。比如一件事你做了两年,回头看有多少时间在做有效工作?可能你做了很多无谓的事情,占用了太多时间。你会发现,最终有效工作花掉的时间并不多。因此,要少犯错误、少走弯路,减少返工,这样就会有很多时间被节省下来。如果事情没有做好,我作为团队领导者责任最大,是我带着大家走了弯路。

《新程序员》:你认为做产品最重要的因素是什么,怎样才能做一款被大家认可并追捧的产品?

云风: 其实我不太做面向最终用户的东西,而是更偏底层,是给其他程序员用的。不过我认为,作为产品的首批用户,首先自己要喜欢它,让自己满意。我不太赞成仅为迎合市场调研结果或别人的想法去做产品。自己喜欢的东西,总有人也会喜欢。如果自己不喜欢,就不应该参与这件事。

《新程序员》:相比其他领域,做游戏开发的难点是什么?

云风: 游戏的前端开发决定着一款游戏给用户呈现怎样的画面质量和交互效果,一个永恒的话题是把图形技术做好,而图形技术的发展速度非常快,也比较复杂,需要投入大量的时间学习,更新知识储备。可能有些游戏不在乎画面,但在国内目前的大环境下,必须考虑这方面。而游戏的后端开发,关系着游戏系统的稳定性,系统不能出故障,即使出现问题也必须尽快修复。如果是单机游戏,就不涉及后端开发。

另外,游戏软件和其他领域软件,最大的不同在于时效性。通常,软件开发关注输入和输出,输入正确,输出也正确,中间的过程无误,程序员的事情就做完了。可能会去优化代码,让它运行得更快。但在游戏领域,如果不能在10毫秒内把任务运行完,拖延到20毫秒,就是不及格的,而这在很多其他领域,其实不是个事儿。游戏领域之所以特别强调代码的优化,是因为“人”是整个系统的一部分。“人”的感受是决定了系统运作是否合格。10毫秒运行一个任务对用户来说是“很流畅”,但20毫秒就意味着“卡”,损害了系统中“人”的感觉。因此,游戏系统中的许多事务必需在限定时间内处理完,而这一点却非常难以衡量。不同的硬件会有不同的环境,很难确定事务能否正确按时处理。

《新程序员》:很多伟大的项目往往由一个人或者一个极小数量的群体发起并成长起来的,但在企业里,作为开发者缺乏高层决策能力,项目的开展也讲求完美的计划,多人头脑风暴,你认为这两者之间是否存在“矛盾”?

云风: 我个人不太喜欢多人头脑风暴,大部分时候都是在浪费时间,只有极少数头脑风暴能带来一点灵感。我们启动新项目时,通常只在吃饭的时候,大家凑在一起聊一聊,很少在工作时间开大会。

首先,我个人比较反感开会这件事,我认为做好工作计划,大家各自执行就好了,然后团队负责人尽量了解其他人在做什么事,做好沟通工作。一堆人为了沟通专门坐在一起开会,是非常没有效率的。

其次,项目做得好不好,最为关键的往往只在一两个人。

谈开源与贡献

《新程序员》:你是什么时候关注开源的?

云风: 在读大学的时候,1997年左右,彼时互联网刚刚兴起,大家使用的大部分软件来自盗版。有一次我买到一张光碟,里面是各种各样的非商业开源软件。还买到过一套Linux的光碟。这给我带来了很大的冲击,居然有光碟中不是盗版软件,而可以合法免费使用。我发现,其实这个世界上有很多软件并不是商业模式的运作方式。后来,在学校机房下载到很多开源的开发工具,也做了一些开源的软件,当时只觉得做开源软件供大家使用是件很有意思的事,而且在这个过程中可以认识很多有趣的人,

当时大部分软件是英文文档,没有中文说明书,而我又很喜欢游戏引擎。机缘巧合,我接触到了Allegro ,我就加了他们的邮件列表,写邮件讨论问题或回答别人的问题。当时翻译了这个游戏引擎的中文文档,大概用了一个多学期的时间。因此还收获了一个意外惊喜,我此前的的英文水平非常差,高考英文分数很低,大学第一次考英语4级也没过。我从来没想到翻译文档能加强了我的英语应试能力。第二次报考英语4级,没有备考却竟然及格了。更巧合的是,我最近发现Allegro居然还在发展,而我最喜欢的异星工厂一开始就是用它开发的。

再后来我去网易工作,也是源于开源。当时网易做《大话西游》的团队,使用了我在网上开源的底层系统——风魂,网易希望我兼职做底层渲染的开发。远程工作一个多月后,为了便于团队间的沟通,才正式入职网易。因此,从机缘角度来说,是我先做了开源软件,才进入网易做《大话西游》系列,并且一待就是十年。在网易期间还开源过一些小项目,用户比较多的一个项目是Google Protobuf(通讯协议),很多年都是国内游戏领域的一个事实标准。

创立简悦后,做了Skynet,它一诞生就用开源的方式,发布在GitHub上。因为我当时在业界有点名气,所以Skynet一经发布就吸引了很多用户。这个项目从产生想法到衍生出第一个可用版本,不到一个月的时间,发展至今,一直有很多用户在维护它、完善它。

这也是我第一个拥有很多用户并一直维护的开源项目。早在大学期间的开源项目,都是自己把项目完善后才发到网上。之所以在 Skynet 雏形时就开源,是受 Linus Benedict Torvalds(操作系统Linux之父、Git的开发者,以下简称Linus)影响。2007年,Linux团队与BitKeeper(彼时是非开源但有条件免费的版本控制工具)产生合作纠纷,Linus决定不再使用BitKeeper,大约三天后,Git(开源版本控制系统)横空出世。可能最初连1000行代码都不到的Git雏形,一直发展到现在。很多开源的大项目都是从一开始就在众人眼皮下生长起来的。

除了上述事件外,我更多的是参与一些开源项目的开发。我们正在开发的游戏引擎使用了很多开源的库,基本每个使用过的开源项目,我们都参与了开发,包括提修改、修补丁以及与主要开发者交流等。另外,我觉得作为一个开源爱好者,甄选合适的库也是很重要的能力,非常考验一个人的眼光和读代码的能力。

《新程序员》:您如何看待开源的发展及它对世界的影响?未来开源还会向哪些方向发展?

云风: 世界上要解决的问题是非常多的,尤其是一些根源问题,但每个问题都只能找到极少的几个人去解决。因为对于程序员而言,做得好的人和做得不那么好的人,会相差几个数量级。如果你需要解决的问题非常需要人去做的话,那么可能你在世界上只能找到那么几个人可以把这个事情做好,不是说其他人做不好,其他人可能不关心这个问题,或者不是他的领域。如果这个前提正确,你就会发现很多基础设施的问题和一些很专注的问题,若限定在一个公司里边,根本找不到合适的人。只有群体足够大,大到世界范围,才可以找到对的人把事情做好或把问题很好的解决,我觉得这是开源最大的意义:把特定的事情和擅长做这些事的人连接、聚集在一起。

正因此,不是所有的代码都应该开源,比如一项特别专注于某个领域或某项技术的业务代码,开源没有意义,因为不需要有很多人参与。反之,越是能被大众广泛使用的项目,越值得开源。游戏引擎同理,大家不需要把精力都浪费在同样的事情上。

当然,开源的发展与互联网的发展相互关联,如果互联网不那么发达,就没办法把世界各地、各种各样的人连接在一起。举个例子,为什么在早年间美国的大学之间会流行开源、黑客文化等?因为他们有自己的网络。当人和人不能顺畅沟通的时候,就谈不上做开源这件事,而开源又会极大地促进互联网行业的发展,因此我认为,至少对于通用的、底层的设施,必然会走向开源,不应该有第二条路。

《新程序员》:你对中国的开发者在开源领域,有哪些期待或倡导?

云风: 当我们作为开源领域的参与者或贡献者时,最重要的能力不是代码写得比别人好多少,而当我们作为一个开源项目的主导者,最重要的能力是与人沟通的能力,听更多人的意见,求同存异。这和我们在公司当差不一样,在公司里,大家都拿工资,下级需要听从上级的安排,但在开源领域,大家可能都是“为爱发电”,只有信任才能让彼此更好地协作,把事情做好,因此,通过网络语言让别人相信你的想法,愿意跟你共事,是相当重要的。

另外,怎么让你的项目吸引更多人,一起把你的项目做好,也非常重要。拿到一个开源项目,私下做一个分支,我不喜欢这样的开发方式,我觉得对于开源项目,如果它是一个基础设施,所有参与贡献的开发者就应该抱紧了朝一个方向走下去,即使这个方向有人并不喜欢,但可以先参与进去,慢慢将其修正为自己喜欢的方向,或逐渐改变自己的想法,尽量减少分叉。对于这种情况,你需要花费很多时间与参与者或用户,也可以称其为潜在的开发者,保持良好的关系。

谈人生与感悟

《新程序员》:如今,你已经有三十多年码龄了,在你的编程生涯中,从前和现在的做事方式或观念有没有一些变化?

云风: 改变都是渐进的,从趋势上来看,我越来越趋向于写更简单的程序,而不追求性能更好。但我想说,把程序写简单,不论是空间性能还是时间性能都更容易变好。性能是一种自然而然的结果,不必刻意追求。

现在做事情也更有规律。二十几岁时,我经常通宵写代码,一旦进入状态能写到第二天早上七、八点,还不觉得累,觉得一天能做很多事,非常有满足感。而现在,我会在每天早上或头天晚上临睡前想好接下来要做什么事、几个小时完成、大概怎么做,以及在每天下午四、五点钟思考下一步的计划。即使这个时间段我有很好的工作状态,也会去想下一步该怎么做、应该在哪里停下来。在下班之前,我会把工作告一段落,并想好第二天怎么接着启动更好。如果是周五,就告一个大的段落,如果这件事比较重要,我在周末两天也会思考,但不会动手做。把事情分阶段完成,讲究节奏,不倾向于突击,是我在做事方面比较大的改变,三思而后行。

《新程序员》:以你多年的从业经历来看,优秀的研发人员具有哪些品质和能力?

云风: 很多能力都重要,近两年我认为,比较重要的能力是抓住问题的本质。就是可以用足够简单的方法去解决根源问题,抛开中间的一些枝节干扰。

为什么我会强调用简单的方法?Keep it Simple and Stupid,即KISS原则。在20年前,我不完全理解这个道理,比如,我在大学期间以及刚毕业的时候,比较喜欢做程序的优化,让自己写的代码比别人写的代码跑得快。很多年轻程序员和我一样,都喜欢炫技。但我现在看来,这些事不是解决问题的本质。这与把事情做简单有什么关系?以前我认为写出复杂的程序并且不出错是一种出色的能力,可随着时间的推移,我的代码需要被别人维护,可能还要和其他人合作,这时我们需要在这群人之间找到一个共同的基点,让代码更容易理解。所以我们需要让代码足够简单,让别人一看就明白。什么样的代码是好代码?并不是看上去好像没有问题的代码,而是看上去所有东西都清清楚楚,断定它肯定不会出问题的代码。

最近几年,我写程序很少炫技。炫技在短时间内看,是用一个很巧妙的方法把问题解决掉了,但经不起时间的检验。把复杂的问题简单化,对程序员而言是一项非常重要的能力。

另一项重要能力是评估事物的能力,知道一件事情大概是怎么回事,需要多长时间完成,需要什么条件完成,这是靠经验堆出来的。也要对自身有清晰的认知,这样你才能规划好你做整件事情的流程和时间,减少返工。通常一件事谁都能做,比如,同样是2000行代码,有人只需要两天,有人却需要两周、两月,为什么?当一个程序员经验不足时,他评估一件事可以用两天搞定,但他可能又花费两周甚至两月来解决他做事过程中发现的问题,改错、返工,导致和预期完成时间出入很大。这就是能力的差异,否则程序员的能力差异体现在哪里?别人会的东西,你学习后也能掌握,所以真正在做事时,能力的差异就在于一个人的评估能力。

《新程序员》:那么,有哪些人生感悟、研发感悟可以分享给大家吗?

云风: 第一,做事情要专注。想好一件事情就去做,只要花的时间和精力足够多,不三心二意,这件事终究会给你回报。每个人的生命都几乎一样长,你不可能比别人多出很多时间和精力,你也不会比别人差在哪或好多少,那么,一件事情做得好不好,就看你投入的时间多不多。但过程中是有方法的,不能蛮干,时常回顾自己怎么才能把这件事学好、做好,发现错误或更好的方向,及时修正。

我现在40多岁,每个人从十几岁开始明白这个世界的道理,到了40多岁,也就30年的时间,每个人都是30年。如果这30年间你都做一件事,那你会超越大部分人。对于任何事情,如果你处于金字塔上层的位置,就会觉得自己是个很有用的人。很多事情必需你来做才能做好的时候,自然而然,这个世界就会给你回报。

第二,信任和你共事的人,接受他们做得不好的方面。以把整件事情做好为主。每个模块都按照你的想法做,通常是行不通的。你可以找准你真正想要的那件事,围绕那件事情,把它做好,其他事情放心交给你的伙伴。我反复讲,人不会比其他人强多少,也不会差多少,你找对人一起做事,接纳其他人的不同想法,求同存异,把整件事做好就可以了。

谈兴趣与偶像

《新程序员》:你是很多开发者的偶像,你知道吗?

云风: 可能有感觉,但我很少谈偶像这件事。

《新程序员》:你有自己的偶像吗?

云风: 我可能会钦佩某些人,但谈不上“偶像”,我会觉得他有些事情做得很好,而已。比如,我觉得Linus做了两件非常厉害的事情。一件是开发了Linux操作系统,另一件是开发了Git版本控制系统。这两件中的任何一件都足以改变世界,但他做了两件,我觉得他很了不起。而且他平常发表的一些观点,我也比较认同。

《新程序员》:你的一位粉丝想问你什么时候再出书?

云风: 随着阅历的增加,知道的事情越多,感到自己不知道的事情越多,而且觉得自己的想法不够成熟。写《游戏之旅》这本书是二十来岁,当时觉得自己很多东西都懂,如今觉得自己不懂的更多了,所以就不太敢写。但我觉得翻译书籍也挺好的,翻译《程序员修炼之道》(第2版)花费了我大半年的时间。做翻译也是一种创作,并不是把英文一字一句翻译成中文,而是按照自己的理解,把作者原本想表达的内容以准确、可读的文字重新表达。

《新程序员》:你现在业余时间还会攀岩吗,攀岩的时候会想些什么?

云风: 比较少,一周会去一次。当你真的爬上墙,你不会想什么,你会聚精会神地思考这条线路怎么完成。

《新程序员》:喜欢这项运动是因为过程比较专注吗?

云风: 我觉得攀岩是个很有意思的事情,因为我是一个不太喜欢社交的人,自己玩自己的。过程中就想着面前的问题该怎么解决,如果能力不足,再提高自己的能力,完成线路后非常有快感和成就感。

《新程序员》:攀岩和研发有没有什么共同点?

云风: 所有事情都能找到一些共同点。攀岩时要去思考线路的每一步怎么完成,每个人的身体状况和攀爬能力不同,方法也不同。所以攀岩之前,需要根据自己的条件,预想一套完整的计划,攀爬就是兑现这个计划。研发也是这样,不能想到哪做到哪,否则中间错了一步,退回来的代价很大。

本文为《新程序员004》内容,二十年前,《程序员》创刊时,我们要全面关注软件人的成长。今天,我们依然初心不变:在一行行代码的背后,是一颗颗鲜活的开发者想要改变世界的雄心壮志。因此,《新程序员》从潘爱民到mysql 之父、MariaDB 创始人 Michael “Monty” Widenius,PostgreSQL 全球开发组联合创始人Bruce Momjian,阿里巴巴副总裁贾扬清,著名科技作者吴军,Vue.js作者尤雨溪……共谈我们的程序人生,我们的技术时代。《新程序员》即将上市,敬请期待。

​​​​
​​​

以上是关于近40年码龄,从通宵写代码到三思而后行——专访云风的主要内容,如果未能解决你的问题,请参考以下文章

Python - 计算两个球体相交的IoU

R语言使用DALEX包的explain函数对caret包生成的多个算法模型进行解释分析

R语言使用reshape函数将dataframe数据从长表变换为宽表(long format to wide format)

R语言使用econocharts包创建微观经济或宏观经济图ptvalue函数可视化前景理论价值函数(Prospect theory value function)

R语言使用timeROC包计算存在竞争情况下的生存资料多个标记物在相同时间下的AUC值并可视化多个标记物在相同时间下的ROC值多指标的ROC曲线

“5年码龄”大二学生的自述