Источник: https://pages.cs.wisc.edu/~remzi/Naur.pdf

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

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

Программа "Жизнь, смерть и возрождение"

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

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

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

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

Построение методов и теорий

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

Что же касается употребления тех или иных видов обозначений или формализации, то опять-таки это может быть лишь второстепенным вопросом, поскольку первичный элемент, теория, не выражен и не может быть выражен, и поэтому не возникает вопроса о форме ее выражения.

Из этого следует, что в представлении построения теорий для основной деятельности по программированию не может быть правильного метода.

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

Первый аргумент заключается в том, что разработка программного обеспечения должна основываться на научных методах и поэтому должна использовать процедуры, аналогичные научным методам. Недостаток этого аргумента заключается в предположении, что существует такая вещь, как научный метод, и что он полезен для ученых. Этот вопрос был предметом многочисленных дискуссий в последние годы, и вывод таких авторов, как Фейерабенд [1978], опираясь на свои иллюстрации из истории физики, и Медавар [1982], рассуждая как биолог, состоит в том, что понятие научный метод как набор ориентиров для практикующего ученого ошибочен.

Второй аргумент, который может показаться противоречащим отказу от метода в теории построения теорий, заключается в том, что, согласно опубликованным отчетам, использование определенных методов было успешным. На этот аргумент можно ответить, что методически удовлетворительное исследование эффективности методов программирования до сих пор, по-видимому, никогда не проводилось. Такое исследование должно было бы использовать хорошо зарекомендовавшую себя технику контролируемых экспериментов (см. [Brooks, 1980] или [Moher and Schneider, 1982]). Отсутствие таких исследований объясняется отчасти высокой стоимостью, которая, несомненно, была бы понесена при таких исследованиях, если бы результаты были значительными, отчасти проблемами оперативного установления концепций, лежащих в основе так называемых методов в области программ. разработка. Большинство опубликованных отчетов о таких методах просто описывают и рекомендуют определенные методы и процедуры, не устанавливая их полезность или эффективность каким-либо систематическим образом. Тщательное исследование пяти различных методов, проведенное Ч. Флойдом и несколькими сотрудниками [Floyd, 1984], приводит к выводу, что представление о методах как о системах правил, которые в произвольном контексте и механически приведут к хорошим решениям, является иллюзией. Остается влияние методов в обучении программистов. Этот вывод полностью совместим с теорией построения взглядов на программирование. Действительно, с этой точки зрения качество теории, построенной программистом, будет в значительной степени зависеть от знакомства программиста с модельными решениями типовых задач, с методами описания и верификации, а также с принципами структурирования систем, состоящих из многих частей в сложных схемах. взаимодействия. Таким образом, многие вопросы, связанные с методами, имеют отношение к построению теории. В чем точка зрения построения теорий расходится с точкой зрения методологов, так это в вопросе о том, какие методы использовать и в каком порядке. В представлении построения теорий это должно оставаться полностью на усмотрение программиста, принимая во внимание реальную проблему, которую необходимо решить.

Статус программистов и представление построения теории

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

Выводы

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