Длительный спор о том, что же такое программирование - искусство, наука или производство - не был бы столь отвлечённым, как это может показаться на первый взгляд. Дело в том, что от того, как мы понимаем свою деятельность, зависит выбор организации и методологии. Люди, считающие программирование искусством, работают, как вдохновённые одиночки, у которых главная цель - самовыражение. Люди, считающие программирование наукой, используют научные формы общения и фактически ставят целью доказать, что программная система с некоторыми заданными свойствами может существовать. Понятно, что в условиях, когда программные средства признаны продукцией производственно-технического назначения, такое неверное понимание программирования как деятельности будет существенно тормозить развитие производства программ. Р.Гантер [1] считает, что это вызвано тем, что большинство программистов имели математическое, а не инженерное образование.
В последнее время положение существенно изменилось. В литературе стали обсуждаться проблемы промышленного производства программ, появились технологии программирования, ориентированные на инженерный стиль мышления. Этот процесс следует лишь приветствовать, однако нужно соблюдать определённую терминологическую осторожность, поскольку невольная подмена терминов моет привести к неразрешимым проблемам. Наиболее яркий пример тому - так называемый СТП-способ оценки производительности труда программистов. У этого способа есть различные вариации - от грубого подсчёта строк программы до формул Холстеда, но суть остаётся одна: результатом работы программиста считается текст программы. Этот способ неэффективен и неточен, не говоря уже о том, что он вообще нелеп (объём работы определяется после её окончания тем, кто её делал), однако именно он используется во всём мире, за неимением лучшего. При внимательном рассмотрении видно, почему этот способ даёт столь большой разброс: программа - это работа, проделанная конкретным инструментом, и свойства работы (в том числе объем и сложность) растворились в свойствах инструмента, а и инструменты разные и неудивительно, что результаты получаются столь ненадёжными.
Прежде чем переносить промышленные стандарты в программирование, следует конкретно определить такие понятия, как изделие, инструмент, технология применительно к производству программных средств. Пока это понятия определены весьма произвольно: говоря "программное изделие", мы предполагаем, что оно кем-то изготавливается, и этот кто-то именно программист, поскольку других участников производства вроде бы нет. Поскольку программист работает с текстом программы, мы вынуждены признать, что именно программа и есть программное изделие, а отсюда прямой путь в тупики, аналогичные СТП-способу.
Однако, если немного вдуматься, не всякая деятельность в сфере производства есть изготовление, и не всякий продукт труда есть изделие. Экономическая наука под изделием всегда понимает физически существующий объект, а не прочие результаты человеческой деятельности называют продуктами труда [2] Так, продукт труда водителя автокара есть изменение координат некоего предмета, но не сам предмет. Хотя и водитель участвует в производственном процессе, но лично он ничего не производит. Поэтому, прежде, чем использовать в программировании промышленные стандарты и методологию изготовления, следует доказать, что деятельность программиста есть именно изготовление, а не транспортировка, например.
И даже, если программист действительно что-то изготовляет, следует доказать, что именно это и есть программное изделие, а не подложим, станки для изготовления программных изделий. Вполне вероятно, что программист не участвует сам в производстве программных изделий. Вполне вероятно, что программист не участвует сам в производстве программных изделий, он только подготавливает это производство.
Итак, следует подробнее рассмотреть концепцию программного изделия. Наиболее чётко она изложена в [1]. Группа программистов разрабатывает и изготовляет образец изделия. Затем образец тиражируется, распространяется и обслуживается. Гантер считает, что программное изделие отличается от промышленного только тем, что легко копируется. Это замечание весьма существенно. В свете этого замечания даже при имеющемся понимании программного изделия, деятельность программистов есть разработка, а никак не копирование (изготовление), и производительность труда уже нельзя определять объемом продукции, выпускаемой в единицу времени - её нужно определять временем, затрачиваемым на разработку, учитывая, что все разработки разные!
Очевидно, в данном понимании программным изделием считается текст программы в машинных кодах. Однако это не совсем так. Тот физический объект, с которым мы взаимодействуем, который мы используем и поэтому можем назвать изделием, не есть программа. Он управляется программой, или даже создаётся программой, но никак не является программой, т.е. её текстом в том или ином виде.
Рассмотрим простой пример. В нашем мозгу понятие факториала существует как физический объект, в виде определённой связи конкретных нейтронов. Когда мы пишем программы вычисления факториала мы фактически передаём это понятие машине. Мы сами понимаем, что такое факториал, и в промежутке между началом и концом выполнения программы машина тоже "понимает", что такое факториал. Более того, это понятие существует в машине как физический объект, как совокупность меняющихся магнитных полей, и вот этот объект мы уже вправе назвать изделием.
Нам могут возразить, что программное изделие не обязано быть физически существующим, поскольку процесс его создания и использования носит сугубо информационный характер. Но и изготовление болта носит информационный характер - мы можем понимать его как процесс записи на носитель информации о длине, размере и направлении резьбы и т.д. Тот факт, что физические усилия преобладают в этом процессе, не говорит о его сугубой неинформационности. Если бы вместо нажатия клавиши на дисплее мы должны были бы бить по ней кувалдой, программирование считалось бы тяжёлым физическим трудом.
Рассматривая болт как изделие, мы можем видеть в нём как минимум три составляющих:
- информационную, или понятие: болт длины такой-то, резьба такая-то;
- физическую, или носитель: конкретное физическое вещество;
- технологическую, или программу: как болт был изготовлен.
Мы можем один и тот же болт вытачивать или штамповать, изготавливать его из различных сортов стали, но это будет одно и то же изделие, если информационная составляющая останется неизменной. Точно так же понятие факториала мы можем изготовить различными программами (технологиями на различном оборудовании (ЭВМ), но это будет одно и то же понятие: факториал. Существенное отличие факториала от болта заключается в том, что материал болта настолько долговечен, что болт может использоваться длительное время после изготовления; носитель же факториала, т.е. динамическая комбинация магнитных полей, недолговечен, и понятие существует в машине только, в момент выполнения программы (впрочем мы можем изготовить существующую микросхему, и тогда понятие станет полноправным изделием). Суть дела от этого не меняется, меняется только размер интервала между изготовлением и использованием - для болта - годы, для факториала - доли секунды.
Итак, программное изделие - это не текст программы, а совокупность понятий, которые во время выполнения программы "оживают" и существуют как физические объекты. Такая концепция позволяет по-новому взглянуть на деятельность программистов.
Эта деятельность состоит из двух частей - конструкторской и технологической. Конструкторская деятельность заканчивается с утверждением спецификаций: понятия составляющие изделие, определены и определены связи между ними. Технологическая деятельность (собственно программирование) заключается в описании технологии изготовления этих понятий. Поскольку производство весьма автоматизировано, программисты обычно сосредотачивают усилия на программах, пренебрегая описанием технологии на ручных участках. Печальные результаты общеизвестны: вполне отлаженные системы оказываются неработоспособными. Выход из положения, видимо, заключается в том, что официально необходимо признать программистов технологами а стандарты ЕСТПП распространять не на подготовку их деятельности, а на саму деятельность. Программы и руководства обслуживающему персоналу должны выполняться в соответствии с ЕСТД. Собственно производство программных изделий происходит в ВЦ, на которых используют программы, поэтому именно туда надо переносить стандарты массового производства.
В заключение следует отметить, что данная
концепция программного изделия не является
законченной и логически завершённой, и поэтому
открыта для критики. Цель данной работы
заключается в том, чтобы привлечь внимание к
некоторым важным, на наш взгляд, проблемам
программирования, которые сейчас незаслуженно
игнорируются. Данная концепция - одна из
возможных альтернатив существующей концепции,
попытке преодоления инерции мышления.
Литература
1.Р.Гантер. Методы управления проектированием программного обеспечения. М., Мир, 1981. 388 с.
2.Т.Котарбинский. Трактат о хорошей работе. М.,
Экономика, 1975, 270с.
Опубликовано: Тезисы докладов краевой
научно-практической конференции "Проблемы и
опыт внедрения ЭВМ, АСУ, АСУ ТП", Красноярск, 1986.
С.45-51.
© Алексей Бабий 1986