写点什么

改 3 行代码不应该花一整天的时间

  • 2022-01-10
  • 本文字数:1743 字

    阅读完需:约 6 分钟

改3行代码不应该花一整天的时间

我曾在 5 家不同的软件公司工作过,做过游戏开发、手机开发和网页开发。在这些工作经历中,有一个话题一直没有得到应有的关注:迭代时间。原本我打算写一篇关于构建时间的文章,但我认为,迭代时间的视角能够更准确地切中要害。我将迭代时间定义为看到代码变更按照预期工作所花费的时间


这篇文章的目的是帮助你反思当前的开发过程。你的管道中是否有某些部分花费了过多的时间?是否有方法做一些调试工具,使变更测试更容易?单元测试是否会带来好处,但你却一直回避它,只因它的前期成本比较大?


2014 年,我以实习生的身份加入了 FIFA 团队。3A 游戏开发世界对于我来说是全新的体验。我记得当我看到我的桌面有 16 个(也许更多?)CPU 核心时,眼睛瞪得像铜铃。而后我按照指示进行设置,被告知初始构建至少要 30 分钟,在此之后增量构建将会变快。

 

虽然增量构建确实快得多,但编译一行代码变更仍然很可能需要至少 10 秒种。当时作为一名相对稚嫩的 C++开发人员,我犯了很多语法错误。每次我修改代码,都要等待 15 秒,看看我做错了什么

改 3 行代码需要一整天的时间

 

在等待时间里,我可能会随便上网搜点什么,试着想想其他的变更,或者看看聊天工具上的即时消息。毫无疑问,我的注意力可能被分散了,一分钟之后我才想起来去看看编译状态。

 

编译只是第一步。现在需要将应用程序打包部署到我所使用的平台上。当我首次打开 PS Vita、任天堂 3DS 和任天堂 Wii 时,要等 30 秒钟左右,游戏才可以在主机上运行。而后我需要启动游戏,导航到我正在改的那个游戏功能,最终可能看到我的变更。

 

我经常负责改竞赛的逻辑。测试这里的变更可能意味着要在职业模式中过上几个赛季,才能测出改了什么。不开玩笑地说,改 3 行代码需要一整天的时间,这样才能知道它实际上是否正确运行。

调试工具


我最终转向了较新的平台,被安利了一个“试验台”。它精简了一些包,试图通过只关注特定的代码区域来减少迭代时间。我找到职业模式试验台之后,就几乎再也没有运行过游戏。这个测试平台将在几秒钟内构建,并包含各种调试功能。这一切都运行在个人电脑上,事情变快了。

 

我很兴奋!但我观察了一下周围的人,我发现很多人很明显不知道如何利用这个工具。相反地,他们在沿用启动整个游戏的老方法,即通过 UI 手动导航到他们需要测试变更的功能。我很快就成为了这个试验台的拥护者,并频繁地添加新功能,使开发新内容变得更容易。

 

我仍然需要偶尔运行完整的游戏,但这个测试平台让我能够快速试验并了解代码是如何运行的,从而让我保持专注。它还使我能够以合理的(以我的标准来看)速度来修复实际的问题。

单元测试


最后,我换了团队,我发现这个团队已经在开始做单元测试了。虽然我当时有一些单元测试的经验,但我从未在游戏开发中使用过。

 

有人向我简单介绍了代码、各种测试,以及如何运行。我发现测试包基本上只包含我们团队特定游戏领域的代码。一次全新的构建可能需要 10 秒,之后的增量构建可能不到 1 秒。

 

很难强调这个阈值有多重要。实际情况是,在不到一秒钟内编译(和运行)测试,我现在可以持续关注这一个任务。编译和逻辑错误在所难免。但当我能够快速发现错误并重新编译时,就进入了一种流畅的状态。

 

第一次,我开始喜欢在工作中编写代码了。重构和移动大块代码是件轻而易举的事。修改别人的代码变得容易得多,并且知道我没有造成什么破坏。变更代码焦虑症消失了

 

我接着重写了竞赛逻辑,以加快速度并添加单元测试。各种各样的边缘情况,使单元测试成为确保覆盖所有主要内容的完美方法。

 

当我最终离开这家公司时,我感觉倍儿爽,因为我留下了一个有自我检查的系统。我花了很多时间去弄清楚一些东西应该如何工作,这些都被编入了测试规格说明书中。

结语


在很多方面,我都很感激自己在电子艺界的那段时光。我多次看到长期工程计划生根发芽带来了真正的日常收益,而这就是其中的一次。

 

在某些时候,有人会站出来说:“测试这些变更需要很长时间,有没有更好的方法?”这个问题我们每天都应该问问自己。

 

原文链接:3 Lines of Code Shouldn't Take All Day

 

译者简介:


冬雨,小小技术宅一枚,从事研发过程改进及质量改进方面的工作,关注编程、软件工程、敏捷、DevOps、云计算等领域,非常乐意将国外新鲜的 IT 资讯和深度技术文章翻译分享给大家,已翻译出版《深入敏捷测试》、《持续交付实战》。

 

2022-01-10 10:182910

评论

发布
暂无评论
发现更多内容

小树系统开发案例(源码)丨小树机器人系统开发流程

系统开发咨询1357O98O718

干货 | 万字详解整个数据仓库设计体系

五分钟学大数据

大数据 数据仓库 28天写作 3月日更

使用“零信任”,不惧“内部威胁”!

龙归科技

管理 数据完整性 零信任 内部威胁

uniapp实现音视频通讯

anyRTC开发者

uni-app 音视频 WebRTC 跨平台 sdk

【实战问题】-- 并发的时候分布式锁setnx细节

秦怀杂货店

Java 分布式 高并发

MySQL的锁

一个大红包

3月日更

在线数据迁移,数字化时代的必修课 —— 京东云数据迁移实践

京东科技开发者

数据库 数据迁移

【LeetCode】设计停车系统Java题解

Albert

算法 LeetCode 28天写作 3月日更

高频量化交易系统开发功能丨量化交易机器人系统开发详情

系统开发咨询1357O98O718

「 视频云大赛 — 大咖驾到 」下一代技术新浪潮,正由视频云驱动

阿里云视频云

阿里云 音视频 intel

uni-app跨端开发H5、小程序、IOS、Android(三):理解uni-app框架MVVM思想

黑马腾云

微信小程序 uni-app android iOS Developer 3月日更

Python 打印回车换行

HoneyMoose

马特机器人系统开发(成品案例,快速上线)

系统开发咨询1357O98O718

Python if __name__ == ‘main’ 的作用介绍

HoneyMoose

论文免费开源:NB-IoT智慧路灯监控系统

不脱发的程序猿

28天写作 论文 3月日更 NB-IoT智慧路灯 大学生毕业

fil挖矿系统开发|fil挖矿系统软件APP开发

系统开发

一文搞懂三级管和场效应管驱动电路设计及使用

不脱发的程序猿

28天写作 电路设计 三极管 3月日更 场效应管

LeetCode题解:213. 打家劫舍 II,动态规划(不缓存偷盗状态),JavaScript,详细注释

Lee Chen

算法 大前端 LeetCode

Java面试必看!阿里(嵩山版)分布式核心原理笔记来了

Java架构追梦

Java 阿里巴巴 架构 面试 架构分布式

区块链电子发票平台,区块链电子发票优势

13530558032

Continue 玩转像素点,Python 图像处理学习的第 3 天

梦想橡皮擦

28天写作 3月日更

百度大脑开放日重庆站-智能物流专场报名啦

百度大脑

百度大脑 智能物流 智能物流开放日 重庆站

万物摩尔定律

soolaugust

AI

「面试高频」秒杀架构的设计套路,你值得拥有

我爱娃哈哈😍

架构设计 架构设计实战 秒杀架构

源中瑞智慧社区解决方案,社区服务平台

13530558032

IPFS云矿机系统开发|IPFS云矿机APP软件开发

系统开发

华为云应用服务网格最佳实践之从Spring Cloud 到 Istio

华为云开发者联盟

微服务 Spring Cloud istio 华为云 服务网格

一个合格的CloudNative应用:程序当开源软件编写,应用配置外置

华为云开发者联盟

云原生 华为云 Cloud Native CCE CSE

收藏!Linux常用命令合集

roseduan

Linux

跟我学ModelArts丨探索ModelArts平台个性化联邦学习API

华为云开发者联盟

AI 联邦学习 API 华为云 modelarts

Python 生成 QR 二维码

HoneyMoose

  • 扫码加入 InfoQ 开发者交流群
改3行代码不应该花一整天的时间_语言 & 开发_Adam Berg_InfoQ精选文章