很少被教的软件开发基础

我经常想忘掉,在没有经验的团队里开发软件有多糟糕。他们的大部分开发实践和Hobbes关于原始人的描述类似。生活是“孤独、贫穷、肮脏、野蛮和短暂的”。就像原始人一样,这些人认识不到更好的生活是什么样子。

生活不必是这样的。我推崇的工具是软件,拷贝它们是自由的,唯一的成本就是人们需要学习该工具的时间。缺乏的是了解,人们需要知道如何使用这些工具,他们需要知道这些工具解决什么问题。最重要的是,他们需要知道这些工具是现成的。

下面是我认为基础工具的概览,它们是我认为合理的工具,缺少它们就像缺少电力和抽水马桶。悲催的是,它们都没有出现在我的计算机科学教育里。

备份

这适用于每个人,但是大量技术高手没有备份,我对此感到吃惊。如果你缺少备份,你将最终失去重要数据。我希望每个人在小学时就经历过硬盘坏掉的遭遇。就算丢失数据的几率很低,也要吸取备份的教训。

不管你用什么操作系统,备份总是比安装容易:

特性的代价

忠告:这是一个汽车的类推。

下图展示了几款车型过去数年的重量变化:

几种汽车车型的车身重量逐年变化图

这么多年,这些汽车重量就高了不少。这种趋势不仅仅体现在汽车上。波音737-100在1968年首航时、不载人的重量有30吨,一架现在的737-900却有44吨,甚至战斗机重量也增加了。喷火战斗机(Spitfire)MkIA【注4】空载1,953kg,七年后,Mk24重量达到3,247kg

重量增加是一件坏事吗?通常不是。设计师不会无理由地增加重量。汽车比过去更加安全,它们更加舒适,有更多的特性:空调、助力转向、自动变速器、气囊。同样,一架现代737在运送更多乘客和货物的同时,可以飞得更远。更重的喷火战斗机因为拥有更大的发动机,可以携带更多的武器和燃油。这是一项交易:特性越多,所以重量越大。

为什么我在讨论机身和汽车呢?

下面这些图展示了某些流行开源项目的代码行数。先看httpd

httpd代码行数逐年变化图

你的工作不是写代码

我足够幸运到和一个充满激情工程师的小团队一起工作,他们真的在意他们的客户。如果你不那么幸运,你可以把这封信分享给你的工程师团队。

亲爱的工程师们:

你的工作不是写代码。

我明白。你认为你被雇来写代码的。实际上,你的整个面试过程是围绕着你写的代码怎么样。我确信你做的非常好了。

不过,这不是你的工作。

你的工作是为我们的用户改善产品。如果你想为产品获取技术,那么你的工作就是以提高公司的主要绩效指标的方式来为用户改善产品。老实讲,你对第二点不会一直有太多的控制权。然而,你应当对第一点有大量的控制权!

当然,如果你想做好工作,就意味着你或许不得不改变你当前的一些行为。

首先,你需要确保你写的代码(顺便提一句,写代码仍然是在你工作时要做到的主要部分之一)是按照期望在运行,甚至在用户的机器上。

你知道吗?我们的用户很可能没有、为高分辨率配置的巨大Thunderbolt显示器的全新MacBook Air,也没有运行着最新的Chrome?我确认过。他们当中大部分人使用的是超过4年的笔记本上的IE浏览器,因此有时候你开发的东西在他们的机器上运行不正常。他们仍然是我们的用户,为他们改善产品仍然是你的工作,因此要确保你写的代码在一定规模的环境下运行正常。

实际上,你通常需要确保运行在生产环境上的代码。我真的不关心你的代码是否运行在本地。如果你的代码只是运行在本地,那么我唯一的选择就是连同你的电脑一起卖掉,这样用户就能使用我们的软件了,这真的行不通。

为了避免这种情况,你需要检查生产环境上的变化。每一次都如此。记住,你的工作不只是发布,而是为我们的客户发布一些代码来改善我们的产品。如果你没有检查它是否按照期望运行,你就不知道它将来是否正常。

当然,为了检查生产环境变化,你将需要确保代码真正被合并以及推送到了生产环境。我的意思是,如果你只是让修改数小时或数天处于未推送状态,你就不能真正检查生产环境上的变化。推送你的代码,整合到生产环境,然后运行,确认一下。

如果你处于不能做持续部署(Continuous Deployment)的环境里,很明显是很难做到的,不过这个理论仍然值得坚守。无论什么时候,当你的代码整合到生产环境里了,你都要负责到底。确信它按照既定方式运行——让我们的产品对用户变得更好。

另一件需要记住的地方就是,有时候用户做了让人惊奇的事情,这意味着,你的代码运行在完美条件下的测试,是远远不够的。你需要确保你的代码甚至在错误情况、没有数据,以及当用户做了点击回退按钮、错误地使用了两个账号等一些你可能没有期望到的操作时,能够做一些合理的响应。

这不容易,这意味着你将不得不花时间考虑我们用户可能要做的不同操作。但是,这是你工作的重要一部分,因为如果他们经常找不到bug、或临界情况、或死角,将为用户极大地改善产品。

你的工作中还有一项重要的部分。你需要确保我们能够衡量我们是否都做好了工作。这意味着添加指标和分析,便于我们测试修改带来的效果。如果你期望你编写的代码能够提高用户参与度(在某些地方提高用户体验),那么你需要有一种方式来了解你是否做到了。你该怎样知道工作完成了?正如我上面提到的,在你为用户改善了产品之前,你的工作是没有完成的。

我知道你在想什么。这将花很多时间!我的效率将大大降低!

不是这样的。你将更加有效率,因为你将真正忙于你的工作。如果你