Статьи

Код для пользователя, а не для себя

Во-первых, независимо от методологии, мы все пишем программное обеспечение для наших пользователей (таких как клиенты, спонсоры проектов, конечные пользователи или клиенты). Во-вторых, независимо от методологии, мы пишем постепенно, выпуская функции и исправляя ошибки по одному. Может быть, я говорю что-то совершенно очевидное здесь, но важно помнить, что каждая новая версия должна в первую очередь удовлетворять потребности пользователя, а не нас, программистов. Другими словами, способ, которым мы разбиваем большую задачу на более мелкие, должен быть ориентирован на пользователя, и поэтому вы всегда работаете сверху вниз . Давайте посмотрим, что я имею в виду на практическом примере.

Деликатесы (1991) Жан-Пьера Жоне

Деликатесы (1991) Жан-Пьера Жоне

Скажем, мой друг заключил контракт на создание инструмента командной строки для подсчета слов, очень похожего на wc . Он пообещал заплатить мне 200 долларов за эту работу, и я пообещал ему, что поставлю продукт в два этапа — альфа и бета-версия. Я обещал ему выпустить альфа-версию в субботу и бета-версию в воскресенье. Он собирается заплатить мне 100 долларов после первого релиза, а остальные — после второго.

Я напишу на С, а он заплатит наличными.

Инструмент очень примитивен, и на его написание у меня ушло всего несколько минут. Посмотрите на это:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
#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 который делает их обоих:

1
2
3
4
5
6
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 из командной строки и получаю следующий вывод:

1
2
3
4
5
$ make
echo '' | ./wc | grep '0'
0
echo 'Hello, world! How are you?' | ./wc | grep '5'
5

Все чисто!

Я готов получить свои 200 долларов. Подождите, сделка заключалась в том, чтобы доставить две версии и получить наличные двумя частями. Давайте немного вернемся назад и подумаем — как мы можем разбить этот маленький инструмент на две части?

Сначала подумайте, давайте сначала выпустим сам инструмент, а затем построим автоматизацию и тестирование. Это хорошая идея? Можем ли мы поставить какое-либо программное обеспечение, не запустив его сначала с тестом? Как я могу быть уверен, что это работает, если я не отправляю тесты вместе с ним? Что мой друг подумает о том, чтобы я выпустил что-нибудь без тестов? Это было бы полным смущением.

Хорошо, давайте сначала wc.c Makefile а затем wc.c Но что мой друг сделает с парой тестов и без продукта в руках? Этот первый релиз будет абсолютно бессмысленным, и я не получу свои 100 долларов.

Теперь мы подошли к сути этой статьи. Я пытаюсь сказать, что каждый новый шаг должен увеличивать ценность продукта, как он воспринимается клиентом, а не программистами. Makefile , безусловно, ценный артефакт, но он не представляет никакой ценности для моего друга. Ему это не нужно, но мне это нужно.

Вот что я собираюсь сделать. Я выпущу скелет инструмента, поддержанный тестами, но с абсолютно фиктивной реализацией. Посмотри на это:

1
2
3
4
5
#include <stdio.h>
int main() {
  printf("5\n");
  return 0;
}

И я изменю Makefile соответственно. Я отключу первый тест, чтобы убедиться, что сборка прошла успешно.

Мой инструмент работает? Да. Считает ли это слова? Да, это так для некоторых входов. Имеет ли это значение для моего друга. Очевидно! Он может запустить его из командной строки и передать файл в качестве входных данных. Хотя он всегда получит число «5» в результате подсчета. Это облом, но это альфа-версия. Он не ожидает, что это сработает идеально.

Тем не менее, он работает, он поддерживается тестами и правильно упакован.

То, что я только что сделал, это подход сверху вниз к дизайну. Прежде всего, я создал то, что обеспечивает ценность для моего клиента. Я удостоверился, что это также удовлетворяет моим техническим задачам, таким как надлежащее покрытие модульных тестов и автоматизация сборки. Но самой важной целью для меня было убедиться, что мой друг что-то получил … и заплатил мне.

Ссылка: Код для пользователя, а не для себя, от нашего партнера по JCG Егора Бугаенко в блоге About Programming .