首先,无论采用哪种方法,我们都为用户(即客户,项目发起人,最终用户或客户)编写软件。 其次,无论采用哪种方法,我们都会逐步编写,逐一发布功能和错误修复。 也许我在这里说的是绝对显而易见的话,但重要的是要记住,每个新版本都应该首先满足用户而不是我们程序员的需求。 换句话说,我们将大任务分解成较小的部分的方式应该以用户为目标,这就是为什么您始终自上而下工作的原因。 让我们通过一个实际的例子来了解我的意思。
假设我受我的一个朋友委托创建了一个与wc非常相似的单词计数命令行工具。 他答应为此工作向我支付200美元,而我答应他我将以两种增量交付产品-Alpha版和Beta版。 我向他保证过我会在周六发布Alpha版本,在周日发布Beta版本。 第一次发行后,他要付给我$ 100,第二次发行后,他要付给我。
我将用C书写,他将以现金支付。
该工具非常原始,只花了我几分钟的时间编写。 看一看:
#include <stdio.h>
#include <unistd.h>
int main() {
char ch;
int count = 0;
while (1) {
if (read(STDIN_FILENO, &ch, 1) <= 0) {
break;
}
if (ch == ' ') {
++count;
}
}
if (count > 0) {
++count;
}
printf("%d\n", count);
return 0;
}
但是,让我们成为专业人士,不要忘记构建自动化和单元测试。 这是一个可以同时完成这两个任务的简单Makefile
:
all: wc test
wc: wc.c
gcc -o wc wc.c
test: wc
echo '' | ./wc | grep '0'
echo 'Hello, world! How are you?' | ./wc | grep '5'
现在,我从命令行运行make
并获得以下输出:
$ make
echo '' | ./wc | grep '0'
0
echo 'Hello, world! How are you?' | ./wc | grep '5'
5
全部干净!
我准备拿起我的200美元。 等等,交易是提供两个版本并分两期获得现金。 让我们稍微备份一下,然后思考-如何将这个小工具分为两部分?
首先,让我们先发布工具本身,然后再构建自动化和测试。 这是一个好主意吗? 我们可以交付任何软件而无需先通过测试运行它吗? 如果不将测试与它一起提供,如何确定它能正常工作? 我的朋友会对我发布未经测试的任何内容有何看法? 这将是一个尴尬。
好的,让我们先释放Makefile
, wc.c
释放wc.c
但是,我的朋友将通过几次测试而手头没有产品怎么办? 这个第一版绝对是毫无意义的,我不会得到我的100美元。
现在我们到了本文的重点。 我要说的是,每一个新的增量都必须为产品增加一些价值,因为它是客户而不是我们的程序员所感知的。 Makefile
绝对是有价值的工件,但对我的朋友没有任何价值。 他不需要,但我需要。
这就是我要做的。 我将发布该工具的框架,以测试为后盾,但具有完全虚拟的实现。 看它:
#include <stdio.h>
int main() {
printf("5\n");
return 0;
}
我将相应地修改Makefile
。 我将禁用第一个测试,以确保构建通过。
我的工具可以用吗? 是的,它确实。 它算单词吗? 是的,它对某些输入有用。 对我的朋友有价值吗? 明显! 他可以从命令行运行它,并且可以传递文件作为输入。 但是,由于计数,他将始终获得数字“ 5”。 那真是令人遗憾,但它是Alpha版本。 他并不期望它能完美运行。
但是,它可以正常工作,并得到测试的支持,并且已正确打包。
我刚才所做的是一种自上而下的设计方法。 首先,我创造了一些可以为客户带来价值的东西。 我确保它也满足我的技术目标,例如适当的单元测试范围和构建自动化。 但是对我来说,最重要的目标是确保我的朋友收到了……并付给我钱。
翻译自: https://www.javacodegeeks.com/2015/03/code-for-the-user-not-for-yourself.html