【译】Software development is a loser’s game

321 阅读7分钟

原标题虽然是这个意思,但是文章的实际内容,其实想要表达的意思是,开发者被软件打败了,有点标题党的意思,这个标题我就不翻译了,不然感觉可能会引起争议,但是我觉得原文章作者提出的很多观点都是不错的,所以想要翻译搬运,如果这侵犯了原作者的权益,望告知我会删除的

原文链接 Software development is a loser’s game | by The Hosk | Medium

良好的代码或许不能救你于水火,但是糟糕的代码会要了你性命 #HoskWisdom

我并不是在说开发者是失败的,但是大多数的软件开发者并没有征服软件开发,而是被软件开发征服。

开发者之所以被困挣扎,是因为他们不知道自己在玩什么游戏,也不知道应该使用什么样的最佳战术。

你需要知道软件开发是一个怎样的游戏,并且使用有效的游戏技巧去游玩。

在编写代码的过程中,代码会不会出错不重要,因为代码总是会出现错误,需要重点注意的是,代码什么时候会出错,并且以最简单的方式修复它。

赢家与败将

在查尔斯-埃利斯的文章 Loser’s Game 中, 他指出,职业网球是赢家的游戏,关键在于主动攻击获得高分,而业余网球是使用不同的策略,即控制自己失去的分数,然后等待对手犯错失去更多分数,让对手自己输掉游戏从而成为赢家。

"在专业网球比赛中,大约80%的分数是赢的;在业余网球比赛中,大约80%的分数是输的。换句话说,职业网球是一个赢家的游戏--最终结果由赢家的行为决定,而业余网球是一个输家的游戏--最终结果由输家的行为决定。这两种游戏在其基本特征上完全不一样。它们是相反的。"——查尔斯-埃利斯

同样的游戏,但是有完全不同的玩法和策略

“职业网球被称为赢家的游戏。胜利取决于主动进攻,比对手获取更多的分数,而不是等下我们要说的那样,职业网球要做的是专注于获得比对手更高的分数,通过主动出击赢得更多的分数来取胜。而业余网球几乎完全不同。业余网球很少主动出击,而是一直在关注自己如何更少的失分。在这样的比赛中,赢家得到高分是因为对手失去的分数太多。”——查尔斯-埃利斯

软件开发的游戏

我从事软件开发将近20 年了,我参与过众多的软件开发项目。以我个人的经历来看,80% 的开发者都是业余人士,20% 是专业人士。

我为什么这么说呢?

业余软件开发者不喜欢做以下这些事情:

  • 开发标准
  • 单元测试
  • 设计模式 / SOLID 原则
  • 学习和设置 DevOps 和 ALM
  • 优化打包构建
  • code review
  • 代码分析 / 解决方案审查

如果你想要和开发团队里的同事合作,那大概率不会做上面这些事情,因为团队中的大多数开发人员也都不是专业人士。

“把主动的权利交给了对手,自己陷入一个被动的状态,尽量控制自己失去的分数,等待对手犯错去赢得比赛,因为他是一个业余爱好者,(可能也没有读过这本书),所以他并不知道自己在玩一个陷入被动的游戏。”——查尔斯-埃利斯

大多数开发者都低估了编写代码质量的重要性,并高估了他们在工作中开发软件的能力。他们在写代码时认为写代码很容易,而且代码第一次就能成功。

业余爱好者

如果大多数开发者都是业余爱好者,我们就应该把软件开发当做一个业余游戏来对待,我们把注意力集中在减少业余者容易犯的错误上。

业余开发者的目的在于让代码可以工作,其他活动会拖慢这个过程。在这之上的步骤都以编写简单的代码,快速定位 Bug为目的,让我们在保证速度的同时能尽量保证质量。而 ALM/Devops 允许快速的无错误部署,从而实现快速反馈。

提高编写代码的效率的最佳方式在于,专注于代码质量,减少可能会出现的 Bug,而不是用简单粗暴的速度编写代码。

项目/开发团队越大,修改 Bug、错误、误差的代价就越大。团队的问题会耽误很多人的时间,中的应该是通过实施上述内容来及时止损。

我参与过一些项目,最终被无数的 bug 杀死了,后期发现的很多问题使得用户流失,并且上线有运营风险。

反转

如果我们把软件开发当作专业游戏来对待,那我们要做的就不是写出可以工作的代码,而是花时间在如何避免写出糟糕的代码和 Bug之上。

“像我们这样的人,通过努力去做到始终如一的不犯错,而不是试图变得非常聪明也是很了不起。”——查尔斯-埃利斯

业余开发者认为快速的编写代码是生产上线的最快方式。实际上大的方法和复杂的代码创造了一个代码库,他的复杂度会不断增加,每增加一行代码都会增加开发难度。这种方法只适用于一两个开发人员工作的小项目。

错误的代价

你发现 bug 的时间离写下他的时间越远,那修复难度也会随着时间逐渐增加。例如,你在生产环境发现了一个 bug ,你要先弄明白他是做什么的,然后重新编写他的逻辑,然后修复他的问题,在每个环境中部署测试,最后再到生产环境。

如果你在单元测试的时候就发现了错误,你可以很快的将他修复,从而减少对其他开发人员和测试人员的影响。

我们可以在开发过程中加入简单的步骤来捕捉 bug,以避免 Bug 影响用户使用体验,这是比较有效的方法。

我们都知道大多数的开发团队大多都是业余的,他们很容易让自己陷入被动的境界,开发团队把更多的精力都花在了等待 Bug 出现在事后去修复他,而不是假设成员都是专业的开发者也是非常合理的情况。

成功对于开发者来说并不是第一次就写出正确的代码,而是不断地使代码变得更好。

或者引用查尔斯-埃利斯的话

"专业人员赢得分数,而业余人员则失去分数"。

推荐阅读

我最后总结一下作者的论点,就是代码质量很重要,而我们要学会主动的去有意识的控制代码的质量,在早期的时候就进行自测,避免出现问题,当然可能在我们这边的工作环境中,或者说大多数的工作环境中,我们可能要么没时间,要么有心无力,或者一些其他的因素困扰,从而使得我们没有办法做到像作者说的那些事情,但是我觉得,我个人认为,写代码有三个层次,Make it work,Make it right,Make it better,而很多时候我们与很多大佬的分水岭我个人认为,就在于大佬总是会希望 Make it right, Make it better,而我们很多时候 都止于 Make it work,Make it right,当然我觉得每个人工作所求不同,都会有自己的追求,只要自己开心可以接受现实,就可以,我只是分享一下自己的观点,欢迎大家一起合理讨论。