Праксеологический анализ деятельности программистов

(выступление на школе-семинаре по Р-технологии в г. Одессе. 2-9 сентября 1985)

Применение общепромышленных стандартов в разработке программных средств - одна из актуальнейших задач технологии программирования. Однако решение этой задачи осложняется тем, что не определено достаточно чётко само понимание программного изделия. Явно или неявно под изделием понимается текст программы, что приводит зачастую к неразрешимым проблемам. Например, производительность труда оценивается как количество строк, или операторов, или байт, отлаженных за месяц или за год. Очевидно, что оценка эта неточна и неэффективна, более того - она некорректна по определению, поскольку количество операторов (как и любая другая характеристика текста программы) отражает не столько свойства работы, которую нужно было сделать, сколько свойства инструмента, которым эта работа делалась. Следовательно, вместо изделия мы изучаем инструмент, но называем его изделием, и характеристики инструмента мы используем для оценки количества и качества изделий (приведённый способ измерения производительности труда нелеп ещё и потому, что, фактически, объём работы измеряется после окончания работы тем, кто её делал).

Корректное в экономическом и философском смысле определения изделия, оборудования и материала позволило бы решить многие из имеющихся проблем. В данной работе делается попытка такого определения на базе праксеологии, т.е. науки о человеческой деятельности (Т. Котарбинский. Трактат о хорошей работе. М. Экономика. 1975). Праксеологический подход позволяет подойти к проблеме с некоторых общих позиций и, в частности, заставляет пересмотреть наше понимание деятельности программиста. Говоря "программное изделие" мы предполагаем, что оно кем-то изготавливается, и этот кот-то - именно программист, поскольку других участников производства вроде бы нет. Далее, поскольку программист работает только над текстом программы, мы вынуждены признать, что именно программа и есть программное изделие. Однако, не всякая деятельность в сфере производства есть изготовление, и не всякий продукт труда есть изделие (и праксеология это убедительно доказывает). Например, продукт труда водителя автокара есть изменение координат некоего предмета, но не сам предмет. Хотя водитель и участвует в изготовлении, но лично он ничего не изготавливает. Следовательно, прежде чем говорить об изготовлении программистом чего-то, следует доказать, что деятельность программистов - это действительно изготовление, а не, например, транспортировка, и что оценивать её нужно именно в штуках/час, а не тонно-километрах. Далее, даже если программист и в самом деле изготавливает что-то, то следует доказать, что это что-то и есть программное изделие, а не, например, станки для изготовления программных изделий. Вполне может оказаться, что программист не участвует в собственно изготовлении программных изделий, а только подготавливает производство.

Итак, следует рассмотреть концепцию программного изделия. Прежде всего отметим, что с праксеологической точки зрения, само существование термина "программное изделие" вполне оправдано (см. книгу Р. Гантера "управление проектированием..."). Р. Гантер замечает, что программное изделие легко копируется, и в этом его основное отличие от промышленного изделия.

Это замечание весьма существенно. Оно заставляет нас быть осторожнее в выборе терминов и предостерегает от произвольного переноса понятий массового производства (т.е. копирования) в программное производство. В свете этого замечания деятельность программиста есть разработка, а не изготовление. В частности, это означает, что к этой деятельности неприменимо определение производительности труда как объёма продукции, выпускаемой в единицу времени - здесь уместнее определять её как время, затраченное на разработку, учитывая, что все разработки - разные.

Итак, по Гантеру, картина программного производства видится такой: группа программистов разрабатывает и изготавливает образец изделия. Затем образец начинает тиражироваться. Экземпляры, записанные на магнитные носители, распространяются, обслуживаются, сопровождаются и т.д. Следовательно, и Р. Гантер считает изделием именно программу (вообще говоря, загрузочный модуль).

Однако, на самом деле, тот физический объект, которым мы пользуемся и который поэтому следует называть программным изделием, не является программой. Он функционирует под управлением программы, но это не одно и то же. Этот объект обнаруживает значительную независимость от программы. Исследуя его как чёрный ящик, мы не сумеем определить, какая из множества возможных программ им управляет. Мы посылаем на вход сигнал и на выходе получаем ответ. В этом смысле мы пользуемся не программой, а неким физическим объектом, с которым мы можем обмениваться сигналами. Именно этот объект и есть программное изделие. Это, кстати, корректно и с точки зрения праксеологии: один из её постулатов гласит, что изделием может быть только материальный объект. Все прочие результаты человеческой деятельности называются иначе: "продукт труда". Праксеологически корректно назвать изделием программиста текст программы на некотором носителе (например, следы карандаша на бумаге или намагниченные участки диска). Но мы, взаимодействуя с программным изделием, не взаимодействуем с этими следами и намагничиваниями, т.е. изделие программиста не есть программное изделие, а есть некое промежуточное изделие, необходимое для производства собственно программного изделия.

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

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

Итак, программное изделие - это физически существующий объект. Естественно предположить, что этим объектом является процессор вычислительной машины вкупе с работающей на нём программой. Прежде всего, отметим, что процессор сам по себе является лишь изделием материального производства. Но это изделие - всего лишь часть программного изделия. Разница между процессором и программным изделием почти такая же, как между родившимся ребёнком и тем, который получился из него в результате воспитания. Не учитывая даже физическое развитие тела ребёнка, мы можем сказать, что, по крайней мере, структура физических взаимосвязей у него в мозгу - другая. Рождение ребёнка есть акт физического производства (как и изготовление процессора): ребёнок есть изделие родителей; в дальнейшем ребёнок становится уже изделием воспитателей (в нашем случае, процессор вкупе с программой - изделие программиста).

Можно провести ещё одну аналогию. В определённом смысле работа программиста сродни работе писателя: некие нетекстовые информационные образы, имеющиеся у него в мозгу, и тот и другой описывают при помощи некоторого текста, доступного читателю (процессору); последний же, пользуясь текстом, выстраивает в мозгу (или моделирует это выстраивание) тот же информационный объект, но уже опять в нетекстовом виде. Разница лишь в том, что в мозгу человека этот образ закрепляется в нетекстовом виде, процессор же вынужден моделировать его заново. Так вот, праксеология утверждает, что изделием писателя является познавший субъект, который после чтения книги изменился чисто физически (точнее, изменились физически некоторые структуры в его мозгу). В этом смысле мы и говорим, что программным изделием является "познавший" процессор. Текст же книги, как и текст программы, есть на самом деле технология изготовления этого изделия. И, так же, как одну и ту же мысль можно выразить пословицей и многостраничным романом, один и тот же информационный образ, одно и то же понятие или связь между понятиями можно описать разными программами. Важно отметить, что при всей разности этих программ изделие получается одно и то же. Это кажется странным, но ведь и болт остаётся болтом, независимо от того, вытачивали мы его или штамповали.

Итак, мы подошли к выводу, что программное изделие создаётся в ходе выполнения программы. Однако, после выполнения процессор перестаёт быть "познавшим", а значит, и изделие перестаёт существовать. Пользоваться же изделием мы можем только если оно существует, а значит, мы вынуждены признать, что использование программного изделия совпадает по времени с его изготовлением. В этом на самом деле нет ничего необычного. В силу того, что процессор не знает, а лишь моделирует знание, он не может хранить в себе информационный объект, как это делает человек, но может по программе воссоздать требуемую часть объекта. Программное изделие обладает, следовательно, любопытной особенностью: оно существует (точнее - проявляется) не целиком, а по частям, как известный Чеширский Кот. К тому же фазы изготовления и использования совпадают для него со временем его физического существования.

Все вышеприведённые рассуждения могут показаться игрой со словами: какая разница, считаем ли мы изделием программу или процессор, её выполняющий. Однако предложенный взгляд на программное изделие позволяет существенно переопределить понятия и переставить акценты в схеме, предложенной Гантером.

Прежде всего, мы по-новому определяем фазы жизненного цикла изделия. Точнее говоря, фазы остаются прежними, но изменяется их наполнение. Изменения касаются трёх фаз: технологической подготовки производства, изготовления и использования.

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

Фаза изготовления - это выполнение программы. Деятельность человека сводится к обеспечению исправности оборудования и соблюдению технологии на ручных участках. Результат деятельности - конкретный экземпляр программного изделия, существующий, впрочем, только во время выполнения программы.

Из этой схемы следует ряд любопытных выводов. Например, поскольку изделие изготавливается во время работы программы, мы вынуждены признать, что обслуживающий персонал ЭВМ (операторы и т.д.) есть участники производства. Но это производство предельно автоматизировано, и этот факт не бросается в глаза. Программисты, занимаясь, по сути дела технологической подготовкой производства, уделяли внимание только автоматизированным участкам этого производства, но слабо обеспечивали ручные. Это приводило к тому, что, несмотря на корректность программ, программное изделие получалось бракованным. Фактически системщики выполняли роль доморощенных технологов и исправляли грехи, допущенные разработчиками. Теперь, когда мы понимаем истинную подоплёку всего процесса, следует узаконить статус технолога в программном производстве и соответственно его регламентировать.

Далее. Поскольку собственно массовое производство программных изделий происходит в ВЦ, в котором запускают программы, стандарты массового производства должны переноситься именно туда, а не на разработку ПС. Такой подход ставит всё на свои места. Как, например, понимать производительность труда на этапе изготовления? Мы можем сказать, что, поскольку изготовление изделия совпадает с его использованием, нам нужно сделать столько изделий, сколько раз ими придётся воспользоваться. Так же как есть быстрая технология изготовления промышленного изделия, есть и быстрая технология изготовления программного изделия: на скорость влияет как алгоритм, так и быстродействие процессора, время выполнения ручных операций, доступность ресурсов и т.д.

Далее. Устраняется терминологическая путаница, связанная с понятием надёжности. Теперь, когда мы отделили программу от программного изделия, мы можем отделить надёжность программы от надёжности изделия. Надёжность изделия, очевидно, определяется в основном надёжностью процессора. Надёжность же программы (т.е. технологии) - это то, что называется робастностью, или живучестью, т.е. и это устойчивость технологии к её нарушениям. Если программа способна выдать неверный результат при неверных данных, это не означает ненадёжности технологии. Это означает, что эта технология была предназначена для совсем другого изделия.

Далее. Изменяется понимание деятельности разработчиков. Это технология и очевидно, что стандарты ЕС ТПП должны распространяться не на подготовку их деятельности, а на саму эту деятельность. То, что сейчас называется технологией программирования - на самом деле технология разработки технологий.


© Алексей Бабий 1985