Чем занимаются разработчики ПО

Мысли о том, что общепринятые стереотипы о разработке ПО не отражают сути этой деятельности, у меня появились достаточно давно. Поэтому хочу изложить свое видение. Возможно, оно поможет вам взглянуть на эту область под другим углом.

Итак, что является конечным продуктом? «Ну тут все очевидно», — скажете вы. Программа, которая облегчает человеку интеллектуальный труд, автоматизирует процессы. Программа — это набор инструкций, которые исполняет компьютер.

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

Разработчики ПО были бы не нужны, если бы Заказчик мог четко выразить свои желания на языке, понятном компьютеру. Но есть две проблемы. Первая — это то, что очень небольшая часть населения планеты может излагать свои мысли в виде низкоуровневых команд. Вторая намного более серьезная. Заказчик:

  • очень редко знает и понимает, что на самом деле ему нужно;
  • далеко не всегда может описать ту область, которую он хотел бы автоматизировать (причем заметьте: до мельчайших деталей и подробностей).

Заказчику нужен посредник. Человек, который сможет его понять, проанализировать и упорядочить знания Заказчика. Этим первым посредником между заказчиком и компьютером является Аналитик. С одной стороны, этот человек должен обладать знаниями предметной области, которую он автоматизирует; с другой стороны — уметь общаться с людьми, стоящими на шаг ближе к компьютеру.

Следующим звеном цепи является Aрхитектор ПО, понимающий, что должна представлять из себя система в целом. Для больших и сложных систем этот человек необходим. Он проектирует крупные блоки, из которых состоит система. Но если посмотреть под другим углом, то Архитектор преобразует знания, полученные от Аналитика, в описание модели. Эта модель уже описана языком, который учитывает особенности функционирования компьютеров, на ней меньше терминов из предметной области и больше технических. Но все же, на этом этапе присутствуют термины неформального, человеческого языка.

Последним в цепочке создателей ПО является Программист. Это именно тот человек, который находится на границе формального и неформального языков. Все предыдущие участники процесса имели возможность передавать свою мысль по цепочке, используя слова обычного языка. Программист — это тот, кто уже не может этого делать. Машина его не поймет. Любая неточность или недосказанность либо будет не принята компьютером, либо будет интерпретирована согласно правилам по умолчанию. Например, в языках с нечеткой типизацией вы можете написать 3 + «Вова», но то, что в результате получится, очень сильно зависит от правил используемого языка.

Программиста можно сравнить с таможенником, который стоит на границе территории людей и компьютеров. Он не может пропустить на территорию машин даже мелкую неточность.

Именно между Программистами и разработчиками, использующими человеческий язык, чаще всего бывают конфликты. Последние либо по незнанию, либо из-за лени, либо по каким-то другим причинам взваливают ответственность за формализацию знаний предметной области на Программиста. И это далеко не всегда хорошее решение. Программист додумывает сам и создает инструкции компьютеру исходя из своего собственного опыта и понимания задачи. Вторая тема для конфликта — это непонимание ограничений и особенностей функционирования компьютеров. Программисту может быть навязано решение, которое не учитывает этих особенностей. Все равно что заставлять переводчика говорить о часах с индейцем амазонского племени, у которого нет понятия времени [3].

Дальше все просто — формальный язык обрабатывается автоматически и преобразовывается в элементарные команды. И программа работает или … не работает. Самый плохой случай — когда она работает, но работает не так, как предполагал Заказчик.

Пусть меня извинят другие участники процесса создания ПО: Тестировщики, Дизайнеры, Системные администраторы и Администраторы приложений, Технические писатели и Менеджеры проектов. Я упростил процесс создания ПО, чтобы донести главную мысль: создатели ПО — это технические переводчики с языка людей на язык машин.

Естественно, что хорошим переводчиком может быть только тот, кто хорошо знает оба языка, а кроме знаний языка еще и обладает знаниями той области, в которой осуществляется перевод.

Разработчики все время играют в «испорченный телефон»: Аналитик пытается разобрать бормотание Заказчика, Архитектор старается втиснуть сказанное Аналитиком в структуру модели или откорректировать саму модель, а Программист — преобразовать то, что ему говорят, на формальный язык [1]. Компьютер, выполняя инструкции, показывает заказчику то, что на самом деле он «понял». И процесс начинается снова…

Выводы

Процесс разработки ПО — это перевод описания и требований предметной области на формальный язык. Для упрощения процесса и устранения неточностей разработчики должны создавать, развивать и использовать язык предметной области [2].

Разработчики, позволяющие себе неточности в речи, пренебрежение терминами, игнорирующие четкие определения, просто не понимают сути того, что они делают.

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

Заказчик очень часто не понимает внутренней «кухни» при разработке ПО, поэтому (особенно для небольших приложений) один программист выступает во всех ролях сразу: аналитик, архитектор, тестер, ну и т. д. И хорошо, если ему хватает квалификации справиться со всеми этими ролями.

С развитием вычислительной техники языки, которые «понимают» компьютеры, становятся все более высокоуровневыми. Программист оперирует абстракциями, которые включают в себя большое количество низкоуровневых машинных команд. Думаю, через несколько десятков лет профессия разработчика ПО сильно трансформируется в связи с развитием ИИ. Основной задачей разработчика будет выяснение и структуризация требований, а не написание алгоритмов. Ведь самое сложное — это понять другого человека. 🙂

 

Литература

1. Эмиль Манукян, Программисты и человеческий фактор.
2. Эрик Эванс, Предметно-ориентированное проектирование (DDD). Структуризация сложных программных систем.
3. Джейсон Палмер, Амазонское племя без концепции времени.