|
文/顾煜 授权游资网发布
程序员成长有很多外因,好的时机、好的公司、好的同事,会让你的成长更顺利。
这次我们聊聊刚入行的初学者该怎么提升自己,用个流行的说法,咱们来谈点观念,理清概念,才能更好地成长。
提高业务能力
对初学者,入行后最重要的肯定是抓紧提高自己的业务能力。对校招渠道入职的新员工,公司的期望一般不高,能干活,有潜力即可。新员工的第一要务,当然是要迅速上手。在一个中小项目里,上手一般不是太大的难题。我们看看UI开发的例子。
初学者的第一份工作,经常会是简单的逻辑、菜单、UI等等,它们共同的特点是不难但很繁琐,一般只要照着前人的工作,依样画葫芦,就能做得八九不离十。在这个过程中,新人可以很好锻炼自己在软件工程方面的实践,学习如何同团队成员配合,如何和跨领域的策划美术交流,尽快熟悉游戏的设计、开发、构建、测试等流程。如果项目快上线了,那还能顺便锻炼身体,加班熬夜。
关于做UI和逻辑,初学者常常抱怨,没有技术深度,不出彩,但特别繁琐,做起来很累。属于做好了没功劳,做砸了要背锅,摧残人性,让人痛不欲生。这也是一个老生常谈,简单的工作也需要有人做,如果有心,在UI开发里面也可以找到个人的积累和发展,有几个事情不妨尝试一下:
1.提高自己的效率:做得更好、更快、更少Bug。有了效率,就能提高质量。以前见过新的同事,学有余力,做一个功能,往往会自己发挥,做两三个不同版本让leader挑选,这样的同学很快就能脱颖而出。
2.提高程序团队的效率:看看UI从设计、开发到验收,有什么流程可以改进,提高功能开发效率。Leader或者其他Senior程序员往往有其他领域要关心,没精力关心这一块。让领导放心不就是我们职场应尽的义务么,在这个子领域,初学者也有机会发挥的。或者你也可以看看是不是能做通用控件,让整个UI团队效率更高。通用控件由于要考虑方方面面的需求,开发有一定的难度,能很好地提高个人的能力。
3.提高项目整体效率:UI和逻辑上更多应用数据驱动,合理架构,减少硬编码,把一部分UI编码工作变成配置工作,开放给策划,既减少了工作量,策划也会觉得更灵活。分开逻辑和表现代码,便于调整功能,也方便写单元测试。做点力所能及的重构,关注一下UI的内存和性能,别给整个项目增加不必要的风险,这都是可以尝试的。
无论在什么职业中,业务能力总是最重要的。有了业务能力,才能赢得大家的尊重。即使第一份工作内容并没那么有深度,也要认真做好它,从中学习,快速成长。
持续学习,找到unbrokentime
本职工作做好之后,千万别满足。我想聊的下一个话题,就是关于持续学习。
程序员族群,早就身处在一个终身学习的时代,入行就是焦虑的开始,持续的学习,不能保证百尺竿头,但至少能回避逆水行舟的惶恐。
虽说程序员都在学习,学习的质量差别还是比较大的。相当多的程序员并没有良好的学习习惯,忽略了提前储备知识的过程,只是被动的学习如何解决迫在眉睫的问题,掌握明天上班要用的技能。学习和积累的主题以后单独展开,这里只说一个小习惯,也是个人效率里一个很重要的概念,找到你的不被打断的时间。
程序相关知识往往烧脑,没有沉下心,便不能理解。一整段不被打扰的时间,是必须的,但碎片化的时代,整段时间早被手机的滚滚洪流碾得粉碎,大家前仆后继,把完整时间碎片化,刷刷朋友圈,回个微信,收个邮件,一个小时就过去了。
我们要做的,是尽量给自己创造条件,空出不受打扰的时间,用个人的意志抵制碎片化。
我工作早年使用的是公交车等座位大法。反向坐公交车到终点站,排个座位,上车,拿本书慢慢看。那年代心还很静,手机还被叫做大哥大,没什么车上娱乐。快快翻过看得懂的页,看不懂的低头想想,每个工作日有那么一个小时可以静心阅读,不知不觉几年间啃掉了很多艰涩难懂的大部头。
后来开车上下班就悲剧了,尝试了各种方法,但还是没法专心阅读,车上的时间只能听听Podcast。要深度学习,要省出不被打扰的时间。实践下来最有效的还是早到公司法。早上提前30分钟从家出发,路上车没那么堵,往往还可以省出15分钟路上的时间。到了公司也很清静,千万不要收邮件,也别去倒茶,要警惕碎片化陷阱。赶紧拿上要看的书,离开你的电脑,离开你的手机,去会议室学习。
另一些能用的方法包括早起法,晚睡法,打出租车上下班法,一个人去很贵很清静的馆子吃饭法等等,大家可以自行发挥。有了完整的不被打扰的时间,可以深度储备业务知识,可以横向扫描行业进展,可以回顾工作得失,可以总结输出知识。虽然每天几十分钟不起眼,但如果能坚持几年的话,你一定能看见自己的成长。
信息枢纽(InfoHub)
下一个对我很有帮助的观念,是需要努力成为团队中信息的枢纽。
信息枢纽是我的一个生造的概念,灵感来源于HUB(集线器)。网络中的集线器,汇集了所有的信息,再广播给其他设备。对我们信息从业人员来说,你做好了本职业务,积累了广泛的跨领域知识后,应该考虑如何逐渐让自己变成团队内开发知识沟通的中心,让自己在团队中更不可替代。
回到我的个人经历,我在2001年作为公司前几批开发人员,接触Unreal2引擎。当时的项目使用Unreal2,我做逻辑,做网络对战,有了持续的积累后,我很快在Unreal的逻辑开发积累了丰富经验。虽然在整体开发经验方面我还是比不上其他开发者,但在Unreal逻辑这一块我比较专业。
我在公司内做了一些相关知识的分享,然后在后续的项目里面坚持到处看看,帮助其他同事debug,或者介绍相关的模块,让他们也能快速上手。
逐渐的,我发现了一些有趣的变化。很多同事碰到这个领域的知识,有问题都会先来咨询我。当然这些问题我也并不是全部能回答的,我择期易者答之,其不易者学之。因为手头工作也很多,对那些不了解的问题,我通常会说让我研究一下,抽点时间看看能不能解决,然后再回复同事。帮助大家次数多了,我就自然成为了InfoHub。
成为信息枢纽以后,对团队的好处显而易见,你润滑了团队,顺畅了知识通路,自身价值变得更重要。对个人的好处不那么明显,却更重要。各类信息在你这里集结,回答已知问题可以巩固你的知识,研究未知问题可以扩展你的边界,信息在你身边流过,自然可以滋润你的认知。变成更好的自己,不就是我们一直的追求?
当然成为InfoHub并不容易,需要个人努力,也需要一些机缘巧合。新项目、新技术的早期拓荒者,很有可能成为信息枢纽。但新项目和技术有一定的风险,不是新的就是好的,新方向会失败,会毁了你统治信息的野望。与我而言,在2001年这个节点,Unreal也许就是一个新方向,在2001年后的八年里,熟悉Unreal给我带来了巨大的回报,甚至很多影响点点滴滴影响了开发自己引擎。
如果运气并不那么好,研究了没落的技术,参与了失败的项目怎么办?事情没有你想象的那么糟糕。没落的技术,即将无人问津,但它是细分领域的知识,领域越窄,越少人懂,越方便你成为专家。总结一下这个技术为什么失败,横向对比一下其他成功技术,谈谈趋势,都能让你自己提高。至于失败的项目,就更无所谓。项目的失败,意味着公司或者团队损失了机会成本,但项目中的每一个人,确确实实得到了成长,吃一堑就能长一智。时常总结,在失败中找到自己的成长,才是我们要关注的。我刚开始用Unreal,第一个项目是被公司砍掉的,也没有任何人有把握说,Unreal将来能得到巨大的应用,但积累在那里,说不定哪天会给你带来丰厚的回报。
再来谈一个对初学者成长有帮助的概念。
跨界和好奇
如果让我总结怎么让自己变得更有价值,跨界无疑是一个非常重要的关键字。
所谓的跨界,是指拥有多个和本专业不同领域的开发知识,并可以灵活运用在开发过程中。当你有了跨界的能力,就可以在开发和交流中,利用跨领域的知识,帮助团队更好的沟通、设计、实现功能。
跨界的意义有几个,重要性依次递增,增加沟通效率,提升产品质量,超越已有认知。我们分别展开讨论。
增加沟通效率是最容易理解的,游戏开发需要多工种合作,大家说着不一样的行话,做着不一样的工作。工种和工种之间,有壁垒,阻碍了交流。拥有跨界的知识,逻辑程序员了解一点关卡策划的工作,渲染程序员懂一点技术美术的工具,引擎程序员接手一下工具程序员的模块,这些跨界的认知,都能很好提高团队沟通效率,帮助不同职能同事更快的达成共识。拥有足够的跨界知识,沟通会更请准,也不用经常拉上其他同事一起讨论问题,减少沟通环节,降低沟通中的失真,就顺理成章了。人和人的信任,本就是从工作的合作细节开始,你会发现那些拥有跨界知识的同事,不知不觉间,就成了项目中中心,加薪升职赢取白富美,从此过上了幸福的生活。
提升产品质量是下一个水到渠成的事情,当拥有了别的领域的知识,我们在设计和实现功能的时候,就可以考虑到用户的需求,把手头的工作做到更好。
举个简单例子说明一下。比如开发编辑器时,很常见的一个需求,就是编辑参数的界面,比如我们要调整一个游戏内物件的参数,最常见的做法,就是选中这个对象,弹出属性表单,可以调整参数。这个功能所有引擎都有,一般的实现方式是在引擎内表示对象参数的时候,对每一个参数有元信息描述,表示参数的类型、编辑方式、取值范围等等。属性表单弹出后只需要遍历这个对象的参数元信息,然后为每个可调整参数创建显示和编辑的控件即可。
有了基础功能,下一个诉求,是一个对象会有非常多的参数,不是所有参数都需要暴露给编辑器编辑,全部暴露出来反而降低开发效率,容易误操作。所以多数引擎一般在参数元信息加上标志,需要暴露的参数,才会被编辑器显示在属性表单内。
到目前为止一切都还好。但策划又提出新要求,同一个对象,在另一个特殊的编辑界面,也要调整参数,这次需要显示的参数,和普通界面需要暴露的参数不一样。这个需求的本质,就是针对同一套数据Model,定义多个不同的View。如果按照原有的元信息系统发展下去,我们要加上新的参数标志,说这些参数开放给另一个View。当View变多的时候,整个设计就会比较臃肿,每多一个不同的View,就需要修改Model的元信息,这个路径有点长,会动到已有的结构。这个思路有点不对,为什么不同的View,需要动到数据的Model呢?不同View的复杂性,就应该放在View里面啊。
当工具程序员设计参数元信息和属性表单的时候,如果能提前想到策划可能有这样的需求,那么设计角度就可以做点调整。不必通过在元信息上打标记,而是搜索的方式。比如我们看Mac电脑上的Finder,它有智能文件夹,本质上就是一个组合的filter,用search来进行文件的筛选,不同的搜索,保存成智能文件夹,就可以快速便捷的归类文件。
同样,对我们的属性表单,我们也可以使用正则表达式来进行属性的筛选。这样针对不同的View,只需要定义不同的过滤表达式就可以了,正则表达式还可以数据驱动,策划要什么参数就改改配置文件就好了。正则表达式来定义View的内容,既强大,也精准。
所以当你拥有了跨界的知识,了解用户的需求,了解其他领域的巧妙设计,就有可能设计出更好的系统。
超越已有认知是跨界更重要的好处,可以做出不同的设计,或更精简,或更高效,或更突破,或兼而有之。
举几个例子,寻路问题是个搜索问题,可以用来计算最短路径,那我就可以用它来计算声音在室内的传播了;序列化不仅仅可以用在保存上,也可以用来做垃圾回收的标记,做文本数据和配置文件的打包和二进制化,做数据文件的压缩和加密,做项目废旧资源的标记和删除;谁说我们一定要在同一个进程里读写数据,为什么不在另一个进程里面统一读写数据,便于多开游戏进程可以共享读取的cache,也可以对并发的读取进行重新排序,降低磁盘寻道开销。
既然跨界知识如此重要,如何来培养自己的跨界能力呢?我给的答案是好奇心,对技术有好奇,多看多问,多想多总结,自然就跨界了。
初学者最重要的品质就是好奇心,帮助你探索未知的边缘。游戏开发的客户端技术,业务领域众多,我们简单细分一下,就可以分出逻辑、UI、工具、渲染、引擎、物理、音频、动画、AI、构建等等领域。相当多的方向,既广又深。再考虑到和周边业务团队接口,还需要对后台技术、美术技术、策划领域有一定的了解。对技术的好奇,可以帮助你加速跨越岗位之间的边界。试着放纵一下自己的好奇,完成本职工作之余,向对面的工作内容张望几眼。多看看,就懂了。
我从业最初工作内容是UI逻辑,逐渐做了unreal引擎上的开发,先写脚本和逻辑,然后支持关卡策划做逻辑相关开发,工作之余,游戏crash时候,就顺便往脚本解释器里面捣鼓捣鼓,debug一下脚本编译器和解释器。引擎程序员和逻辑程序员之间并没有分明的泾渭,看几次,没啥学不会的,逐渐也就熟悉了相关模块,再逐渐拓展到引擎其他模块,哪里有问题,过去看几眼,不懂找高手问问。再不懂,放一下,职业生涯很长,现在不懂的,将来会懂,保持好奇,总会到彼岸。几年下来,也就把Unreal引擎方方面面磨了个透。
任何一个大项目,大引擎,都是知识的宝库,不用舍近求远,认真做好手边的项目,就会成长。如果有幸能参与一流的项目中,成长速度会更快。我的职业生涯前几年在UBISOFT工作,参与了很多AAA项目,即使没有太多的主动学习,眼界和能力也能有很大的增长。如果没有机会参与高端项目,也不需要气馁。游戏技术领域的知识相当公开和透明,关注GDC以及其他开发会议,留心欧美新出版的技术书籍,定期扫一遍,就大致知道技术圈发生了些什么事情了,找个感兴趣的领域深入看进去,坚持几年,就会有很大的提高。
总结
总结一下这两篇写的一些观点。划一下重点,这几道是送分的必考题:
- 初学者要专注提高专业能力,即使是简单的工作,也能提高自己的能力。
- 培养自己对技术的好奇心,多看看,提升自己跨界的能力,对项目或者对自己都好。
- 培养良好的习惯,找到不被打扰的时间段,持续学习。
- 试图成为信息的集散地,帮助别人,才能帮助自己。
相关阅读:游戏程序员成长编年史(1)
|
|