id software的编程原则

简介: # Id software是如何在6年内只靠不到10个人开发28款游戏的 > 原文: [https://blog.usejournal.com/programming-principles-from-id-software-bed83e762210](https://blog.usejournal.com/programming-principles-from-id-softwa

Id software是如何在6年内只靠不到10个人开发28款游戏的

原文: https://blog.usejournal.com/programming-principles-from-id-software-bed83e762210
原作者:Alex Loukissas
译者:祝坤荣(时序)

作为1990年代最具标志性的视频游戏公司,id Software开发了如德军总部3D, Doom,雷神这样大名鼎鼎的游戏。在最近的访谈中(https://www.youtube.com/watch?v=KFziBfvAFnM), John Romero(https://en.wikipedia.org/wiki/John_Romero)(id(id)的合伙人),介绍了他们公司的编程原则,就是这个让他们在很短时间内,用如此小的团队产出如此多高质量的产品。
可以将这个比作如Lampson在系统设计的timeless论文(https://www.microsoft.com/en-us/research/wp-content/uploads/2016/02/acrobat-17.pdf)一样。大多数原则是很常见的而到今天仍是有意义的。


image.png
每2.35月就有一个新游戏。哇哦
进过这些编程原则是针对视频游戏开发的,大部分也适用于常规的软件开发。在这篇博客,我会用我的思路来解释这些原则,并用Romero的幻灯片的截图作为引用。我也会尝试将游戏开发的原则普世化。

原则1:尽管做(并要做得好)

这不是代表要过度复杂化你产品当前的版本。实际上,这也是一种解释了迭代开发的实践。开发一样能将一件事做的很好的东西并不断的优化它。保证你在每个迭代中都有很高的质量要求。
image.png

原则2:时刻保证你的代码可运行

在访谈中,Romero提到他们是如何写了一段跳出一副图片的代码来处理用户遇到错误的场景的。通过加入好的缺省配置和容错,他们保证游戏仍然可以运行。如果他们没有做这些,用户在遇到bug时会不能玩下去,直到bug被修复(丧失生产力)。你可以想象到这对于一个逐渐变大的工程师团队有多重要。关于这点有一个实践的例子就是ReactJS中的defaultProps(https://reactjs.org/docs/react-component.html#defaultprops) 。
image.png

原则3:保持简单

这并不新奇。叫他Occam’s Razor(https://en.wikipedia.org/wiki/Occam%27s_razor)或者KISS原则(https://en.wikipedia.org/wiki/KISS_principle),让东西尽可能的保持简单是永恒不变的好建议。
image.png

原则4:花时间打造伟大的工具

在他的分享中,Romero提到他打造了一个叫TED的关卡编辑器。他开发TED的时间收获了可观的利息,工具帮他们快速地一个接一个的交付了游戏,这极大的提高了生产效率。在那段时间,能帮助加速开发者生产力的开发者工具有爆发式增长。但如果手头没有货,可以尝试确认下是否一个内部工具可以帮你的开发者保持最高的生产效率(即使是这个工具开发需要从主产品线上占用资源)。
image.png

原则5:彻底地测试你的代码

这覆盖了大多数高效工程师团队的最佳实践: (a)尽可能多的吃你自己产品的狗粮(https://en.wikipedia.org/wiki/Eating_your_own_dog_food);(b;(b)) 不要委托别人(比如,QA工程师,或更糟,用户)来发现你代码中的bug;(c)尽可能的为你的代码写足够多的测试。
image.png

原则6: 尽快修复bug

我们对这个非常严格(https://agentrisk.com/),这是我们从我们上一次(https://en.wikipedia.org/wiki/Bugsense)创业带过来的实践。在我们的日常站会,我们保证任何新bug有最高优先级并且尽快修复。很明显,不是所有的bug都是平等的,所以这里通过基于业务相关性的判断来决定。
image.png

原则7:使用优秀的开发系统

这条可能只针对游戏开发领域。在其他情况下,你想从开发转到测试阶段可能就会走一条不同的路了。比如,你可能想让用户在恶劣条件的移动设备上运行你的应用,或他们是通过高延迟的2G网络来访问你的web应用。确保他们没有一个糟糕的用户体验。
image.png

原则8: 为产品的当前版本编写代码

这句可以翻译成“不要将超过限制的历史代码和实现转移到你的新产品上”。这条比较棘手并且一般跟原则4绑在一起。作为工程师,我们经常想要从头开始写。在这里有经验的工程领导力很重要。通常,选择尝试一种新的实现可以有不错的收益(就像开发工具一样)。比如,当Slack开始规模增长,他们将他们的V1.0实现整个迁移到一个全新架构(https://softwareengineeringdaily.com/2020/02/27/slack-frontend-architecture-with-anuj-nair/),获得了很大收益。我们自己也有类似的经历,从Python迁移到Elixir,获得了一个更健壮的代码库和增长的开发效率。
image.png

原则9:使用好的组件抽象

这很难。如果你曾经开发并维护过API,你肯定知道如果将事情做对有多难(尤其是在第一次)。在他的访谈中,Romero举了一个将火炬与火焰和其他相关对象封装到函数的例子。他们需要移动或更新所有同级的火炬实例,如果是更细粒度的抽象会导致他们忘记更新/移动那些火焰。他们花了很多时间设计这个并想要在第一次做对。这些key8i在开发和调试阶段获得回报。
image.png

原则10: 在编程是从同伴收集反馈

这里可以在开发时通过code review来解决。在产品里更加复杂的部分,可能需要高级架构师保证。在任何情况下,确保你是在鼓励交流和收集反馈的文化。
image.png

原则11:给与编码者创造的自由

切洋葱可以有很多方法。让你的编码人员有创造的自由,让他们使用自己的方案来解决他们面对的问题。只要确保执行同一种编码规范,这样团队中的任何人都可以快速熟悉代码库。对于编码美学的追求会浪费有价值的时间,所以最好将这个问题留给机器和自动格式化。这不表示在code review中发现次优实现不被鼓励。只是需要将精力放在那些明显的错误上。
image.png

感谢阅读!

我希望这篇文章能帮到你。下面是整个演讲的连接(https://youtu.be/KFziBfvAFnM)。我建议你也读一读 Masters of Doom(https://en.wikipedia.org/wiki/Masters_of_Doom)(()译者注: 国内书名 Doom启示录),这本书描写了id software更细节的幕后故事。感谢 Jon V 和 Diwaker Gupta对初始草稿版给予的建议。

目录
相关文章
|
7月前
|
人工智能 前端开发 算法
自由编程学习资源:free-programming-books
`free-programming-books` 是一个GitHub上的开源项目,旨在收集和整理免费的编程学习资源,涵盖了各种编程语言、框架、工具和范畴。这个项目的目标是为广大的学习者提供高质量、免费且易于获取的学习资料,促进技术知识的传播和共享。
357 2
自由编程学习资源:free-programming-books
|
存储 安全 Java
对于 basis 管理员来说,ABAP Platform 意味着什么
对于 basis 管理员来说,ABAP Platform 意味着什么
247 0
对于 basis 管理员来说,ABAP Platform 意味着什么
带你读《计算机组成与体系结构:性能设计(英文版·原书第10版)》之三:A Top-Level View of Computer Function and Interconnection
本书以Intel x86体系结构和ARM两个处理器系列为例,将当代计算机系统性能设计问题与计算机组成的基本概念和原理紧密联系起来,介绍了当代计算机体系结构的主流技术和最新技术。本书作者曾13次获a得美国教材和学术专著作者协会颁发的年度最佳计算机科学教材奖。目前,他是一名独立顾问,为众多计算机和网络制造商、软件开发公司以及政府前沿研究机构提供服务。
|
C++ 容器
读书笔记 effective c++ Item 54 让你自己熟悉包括TR1在内的标准库
1. C++0x的历史渊源 C++标准——也就是定义语言的文档和程序库——在1998被批准。在2003年,一个小的“修复bug”版本被发布。然而标准委员会仍然在继续他们的工作,一个“2.0版本”的C++标准预计在2009年被发布(虽然所有的工作很有可能在2007年底被完成)。
1173 0
|
C++
读书笔记 effective c++ Item 32 确保public继承建立“is-a”模型
1. 何为public继承的”is-a”关系 在C++面向对象准则中最重要的准则是:public继承意味着“is-a”。记住这个准则。 如果你实现一个类D(derived)public继承自类B(base),你在告诉c++编译器(也在告诉代码阅读者),每个类型D的对象也是一个类型B的对象,反过来说是不对的。
859 0
|
新零售 程序员
抽象的艺术 - Business Platform
"Art,古希腊拉丁语Ars,艺术。技巧、想象力、美学、环境的融合创造物。" ### Abstract a=F/m。牛顿第二定律:“物体加速度的大小跟作用力成正比,跟物体的质量成反比,且与物体质量的倒数成正比;加速度的方向跟作用力的方向相同。”这是抽象的一个简单例子,简单的公式,描述了经典物理学时期日常各种物体加速的根本原理。作为程序猿,我们在完成各种业务需求的时候,可以发现一些可以抽象出
2822 0
|
C++
读书笔记 effective c++ Item 18 使接口容易被正确使用,不容易被误用
1. 什么样的接口才是好的接口 C++中充斥着接口:函数接口,类接口,模板接口。每个接口都是客户同你的代码进行交互的一种方法。假设你正在面对的是一些“讲道理”的人员,这些客户尝试把工作做好,他们希望能够正确使用你的接口。
943 0
|
C++ 安全
读书笔记 effective c++ Item 19 像设计类型(type)一样设计类
1. 你需要重视类的设计 c++同其他面向对象编程语言一样,定义了一个新的类就相当于定义了一个新的类型(type),因此作为一个c++开发人员,大量时间会被花费在扩张你的类型系统上面。这意味着你不仅仅是一个类的设计者同时是一个类型设计者。
910 0