Разработка программного обеспечения как будто в худшую сторону отличается от других дисциплин информатики.

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

А теперь я работаю с разработкой ПО, и это невыносимо скользкая тема. Ни одна концепция точно не определена. Результаты оцениваются с характеристиками «обычно» или «в целом». Сегодняшние исследования могут или не могут помочь завтрашней работе. Новые подходы часто опровергают предыдущие методы, а сами ярко горят недолгое время, а потом выходят из моды, когда всплывают их ограничения. Мы верили в структурное программирование. Затем начали верить в языки четвёртого поколения, потом в объектно-ориентированные методы, потом в экстремальное программирование, а теперь, может быть, в open source.

Но программирование — это именно то место, где происходит контакт шины с асфальтом. Мало кого волнует, действительно ли $P$ равняется $NP$, чисто ради красоты вопроса. Компьютерная область имеет дело с компьютерами. Это написание программ для решения реальных человеческих проблем и работа этих программ на реальных машинах. Согласно тезису Чёрча-Тюринга, всё компьютерное оборудование по существу эквивалентно. Так что пока компьютерная архитектура классная, реальным ограничением в информатике остаётся проблема создания программного обеспечения. Нам нужны программы, которые можно собрать за разумное время и за разумную стоимость, которые работают примерно так, как планировали дизайнеры, и работают без ошибок.

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


Рисунок 1: Яркая линия в информатике

Темы выше этой линии принадлежат к разработке программного обеспечения. Области исследования ниже этой линии — основные предметы информатики. У последних есть ясные, формальные результаты. Для открытых проблем в этой области мы ожидаем получения новых результатов, которые будут формально сформулированы. Эти темы основаны друг на друге: криптография на сложности, а компиляторы на алгоритмах, например. Более того, мы верим, что доказанные результаты в этих областях останутся таковыми и через 100 лет.

Так что это за яркая линия, и почему ниже неё нет ни одной из тем программирования? Линия — это качество под названием «прямое человеческое участие». У разработки ПО есть такое качество, а у традиционной информатики его нет. Результаты из дисциплин ниже линии могут быть использованы людьми, но эти результаты напрямую не подвержены влиянию людей.

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

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

Это наблюдение приводит к Тезису Коннелла:

Разработка программного обеспечения никогда не будет строгой дисциплиной с подтверждёнными результатами, поскольку в неё вовлечена деятельность человека.


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

  • Что должна делать эта программа? (требования, юзабилити, безопасность)
  • Как должна выглядеть программа внутри, чтобы её легко было починить и модифицировать? (архитектура, дизайн, масштабируемость, переносимость, расширяемость)
  • Как долго займёт её написание? (оценка)
  • Как мы должны её разрабатывать? (кодирование, тестирование, измерение, конфигурация)
  • Как следует эффективно организовать работу команды? (менеджмент, процесс, документация)

Все эти проблемы вращаются вокруг людей.

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

Прежде чем перейти к последствиям моего утверждения, рассмотрим три вероятных возражения:

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


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

Статистические результаты в программировании уже опровергают этот тезис.


Эти методы в целом решают проблему оценки и включают в себя Function Point Counting, COCOMO II, PROBE и другие. Несмотря на свой математический вид, эти методы не являются доказательствами или формальными результатами. Такая статистика — просто попытка квантифицировать субъективный человеческий опыт по прошлым софтверным проектам и экстраполировать его на будущие проекты. Иногда работает. Но внешне строгие формулы в этих схемах — это свинья с губной помадой, если использовать современное выражение. Например, одна из формул в COCOMO II выглядит так: $PersonMonths = 2.94 ? Size^B$, где $B = 0.91 + 0.01 ? ? SF_i$, а $SF$ — это набор из пяти факторов масштабирования, таких как «гибкость разработки» и «сплочённость команды». Сама формула выглядит строго, но в ней доминирует показатель, составленный из человеческих факторов.

Формальные процессы разработки, такие как метод «чистой комнаты», постепенно находят строгие, доказуемые методы. Они поднимают яркую линию, чтобы перенести под неё ранее размытые темы.


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

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

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


Например, Дэвид Парнас в 1972 году написал замечательную научную статью «О критериях разложения системы на модули». Она описывает простой эксперимент, который Парнас провёл с альтернативными стратегиями дизайна ПО, одна с сокрытием информации, а другая с глобальной видимостью данных. Затем на основе этого маленького эксперимента он вывел несколько заключений и привёл рекомендации. Ничего в статье не является доказанным, и Парнас не гарантирует, что следуя рекомендациям каждый получит аналогичный результат. Но статья содержит мудрые советы и сильно повлияла на популярность объектно-ориентированных языков программирования.

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

Другие области исследований в том же духе — это паттерны дизайна, стили архитектуры, рефакторинг на основе сомнительных методов, гибкая методология разработки и визуализация данных. Эти дисциплины могут частично содержать проверенные результаты, но в целом нацелены на системы, которые изначально содержат человеческое участие. Чтобы внести ясность: ключевые темы информатики (ниже яркой линии) — жизненно важные инструменты для любого разработчика. Знания алгоритмов важны при проектировании высокопроизводительных приложений. Теория массового обслуживания помогает проектировать ядро операционной системы. Методология «чистой комнаты» тоже полезна в некоторых ситуациях. Анализ статистики может пригодиться при планировании похожих проектов с похожей группой участников. Но формализм — это просто необходимое, а не достаточное условие для хорошей разработки. Давайте для примера рассмотрим строительство и архитектуру (то есть дома и здания).

Представьте блестящего инженера-строителя, лучшего в мире эксперта по строительным материалам, зависимости деформаций от напряжений, распределению нагрузок, защите от сдвига ветров и подземных толчков, и т. д. Этот парень занесён в записные книжки архитекторов во всех странах, чтобы звонить ему для консультаций по каждому строительному проекту. Будет ли этот мифический инженер-строитель настолько же хорош в проектировании зданий, которые он анализирует? Совсем нет. Он может теряться в разговорах с клиентами, неспособен проектировать приятные для проживания места, его фантазии не хватает, чтобы придумать решения для новых проблем, и он до чёртиков скучен. Техника строительства полезна для реальных архитекторов, но её недостаточно для хорошего проекта. Удачная архитектура требует креативности, концепции, междисциплинарного мышления и гуманизма.

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

Выражение признательности
Благодарю Стива Гомера за дискуссию, которая разожгла мой интерес к этому вопросу.

Комментарии (13)


  1. San_tit
    08.08.2017 15:00
    +4

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


  1. bmmshayan
    08.08.2017 15:47
    +8

    Сало кого волнует
    наверное опечатка, хотя наверное кого-то волнует и сало.


    1. m1rko Автор
      08.08.2017 15:49
      +3

      Вот нельзя работать голодным, такие опечатки получаются… :(


  1. saboteur_kiev
    08.08.2017 15:51

    В математике есть аксиомы — определенные утверждения, которые принимаются всеми математиками как однозначное утверждение, которое нельзя понять двояко.

    В программировании, кроме «нарисуй мне линию с координатами x, толщиной y», есть «нарисуйте 7 парралельный перпендикулярных линий, и одна в форме котенка...»

    В математике есть формулы, которыми полностью отражается то, что хочет сказать математик в своих выводах.

    В программировании полная документация, которая описывает все, что нужно выполнять программе — это сам код. И он невероятно далек от изначального ТЗ.

    В общем основные выводы в статье и так очевидны…


    1. Ckpyt
      09.08.2017 16:55

      Немного не так. Обычно ТЗ не полностью детализировано. ВСЕГДА есть нюансы, которые остаются на совести программиста.
      К примеру, у меня на собеседовании дали задачу: есть чайник, газовая плита, коробок спичек, кран с водой. Вскипятите чайник.
      Так вот, я не смог вскипятить чайник.
      Я забыл про атмосферное давление. Температура кипения в горах ниже 100 градусов, которые были четко заданы.
      Я корректно проверил наличие спичек в коробке, наличие воды в чайнике и в кране, я думал, что предусмотрел все…


      1. saboteur_kiev
        11.08.2017 00:27

        Вы невнимательно прочитали мой комментарий. Я и написал, что ТЗ невероятно далеко от кода.


  1. vasIvas
    08.08.2017 16:05
    +1

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

    Странно что человеку хотят навязать математический образ мышления машины.


  1. Carburn
    09.08.2017 00:14
    +4

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


  1. cher-nov
    09.08.2017 02:07

    А тем временем, один из создателей UML упорно пилит очередную таблетку от всего, которая решит все наши проблемы ещё раз:


    В настоящее время Якобсон возглавляет проект SEMAT, посвящённый созданию единой теории, способной стать фундаментальным научным основанием для процесса разработки программного обеспечения. Ядро SEMAT было одобрено комитетом по стандартизации OMG и принято как свободный стандарт. Активно продвигает инициативу и принимает участие в написании статьи в английской Википедии, посвящённых проекту.

    https://ru.wikipedia.org/wiki/Якобсон,_Ивар
    https://en.wikipedia.org/wiki/SEMAT
    http://semat.org/


    1. Minotaurus
      09.08.2017 18:34

      «комитетом по стандартизации OMG»

      если подумать об одной из расшифровок OMG, страшно предположить, что они там настандартизируют.


  1. vlad_molchanov
    09.08.2017 18:34

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


    1. kgnk
      09.08.2017 20:35

      Порог вхождения в программирование стремительно падает. Хорошо это или плохо покажет время.


      В вебе. например, куча людей, которые думают, что если пишут с помощью JQuery, то знают javascript. Те, кто занимаются вёрсткой, обычно, не знают как происходит рендер страницы. Те, кто пишут на C#, частенько не вникают в особенности работы компилятора. И так можно продолжать еще очень долго.


      Пока что конца света не случилось.


      1. vasIvas
        09.08.2017 22:56

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