Потребность в спецификации проекта программного обеспечения значительно уменьшилась с развитием более выразительных языков программирования?

16

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

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

Как я пришел к такому выводу? Вот несколько аргументов:

Обратная связь

Инструменты для написания документов или создания диаграмм дают мало отзывов. Да, есть инструменты моделирования, которые делают некоторые проверки согласованности на UML-диаграммах, но они ограничены и сопряжены с большими накладными расходами.

Без обратной связи трудно распознать и исправить ошибки.

Как только вы пишете код, вы получаете много отзывов, например:

  • Ошибки и предупреждения от компилятора
  • Результаты статического анализа кода
  • Модульные тесты

Ошибки могут быть быстро распознаны и исправлены.

консистенция

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

Рефакторинг

Существуют мощные инструменты и методы для рефакторинга кода, в то время как рефакторинг текстовых описаний или диаграмм обычно сложен и подвержен ошибкам.


Есть одно предварительное условие, чтобы эта работа работала: код должен быть достаточно легким для чтения и понимания. Это, вероятно, не может быть достигнуто с помощью Ассемблера, Базового или Фортрана, но современные языки (и библиотеки) гораздо более выразительны.

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

Фрэнк Пуффер
источник
2
Первоначальный дизайн потерял популярность из-за быстрой разработки, набирающей популярность по мере взросления отрасли. Языки становятся более выразительными, а инструменты - более легкими, что облегчает быстрое создание прототипов, обеспечивая более гибкую разработку. Я думаю, что есть какая-то причинно-следственная связь между ними.
Восстановить Монику
14
По моему опыту, «создание подробных проектных документов с большим количеством UML-диаграмм до того, как будет написана строка кода», никогда не было хорошей идеей - по крайней мере, в то время, так как я работал профессиональным программистом, а это больше, чем один. Десять лет дольше, чем существует UML. Однако создание высокоуровневого проекта перед кодированием является и было хорошей идеей, когда ожидается, что системы будут иметь определенный размер. Но UML ИМХО не подходит для этого.
Док Браун
2
Слишком ленив для правильного ответа: более выразительные языки программирования и более мощные компьютеры приводят к потребности во все более и более способных и сложных программах, что приводит к более сложным спецификациям требований.
whatsisname
2
Рекомендуемая литература: Избиение средних .
Роберт Харви
1
Я работал над проектом с полным UML-дизайном. Из которого мы генерируем код. Я пришел к выводу, что никогда не хотел делать это снова. Изменить UML было намного сложнее, чем изменить код; и большая модель UML, по крайней мере, так же громоздка, как много исходного кода. «Сгенерированный» код был труден для чтения, и генератор оставил в коде «маркеры».
Ник Кейли,

Ответы:

9

Я ставлю под сомнение предпосылку, что языки становятся все более выразительными. С сегодняшним ASP.NET-кодом на c # я пишу примерно на том же уровне, что и при написании ASP-кода в Visual Basic. Мы все еще используем c ++. Javascript добавил функции, но в целом язык не изменился. То же самое с SQL.

Я думаю, что эти другие изменения более значительны:

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

  2. Изменения в методологии развертывания. В прошлом было очень дорого ошибаться, потому что вам нужно было отправить обновленную копию вашего программного обеспечения. Таким образом, вы должны быть осторожны. С помощью веб-приложений вы можете развернуть исправления для немедленного использования и позволить себе реагировать на проблемы, а не предвидеть их, реструктурируя код по мере необходимости.

  3. Принятие шаблонов дизайна. Когда все знают шаблоны, вам вряд ли придется придумывать что-либо; Вы можете просто сказать «добавить фабрику репозитория», и ваша команда должна сделать это без необходимости видеть UML.

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

  5. Программное обеспечение меньше. Частично благодаря архитектуре SOA команды пишут небольшие программы, которые связаны между собой. Каждый отдельный компонент является менее сложным и требует меньше предварительного дизайна; Кроме того, легче изменить часть архитектуры, не нарушая общее решение, из-за перебоев, вызванных определениями интерфейса между компонентами.

  6. Гораздо больше пользы от установленных библиотек. .NET CLR предлагает множество функциональных возможностей, поэтому нет необходимости разрабатывать, скажем, схему для кэширования данных сеанса. Сторонние библиотеки, такие как jQuery UI или Bootstrap, устанавливают стандарты написания кода для работы определенным образом. Вам не нужно документировать это; команды должны иметь возможность просто использовать их.

  7. Отраслевая зрелость. Специалисты SWE узнали, что не существует такого проекта как «Battlestar Galactica», в котором вы годами годами пытаетесь достичь определенной цели; к тому времени, когда эти годы пройдут, цель изменится. Сегодня мы знаем, что время выхода на рынок гораздо важнее, чем получить все именно так, как мы этого хотим в дизайне.

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

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

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

Джон Ву
источник
3
Наша промышленность уже созрел ... немного. Пункт 5 - безусловно самое важное изменение; это положительно влияет на все остальные. Но тот факт, что мы меняем все наши технологии каждые 5 лет, говорит о том, что нам еще предстоит пройти долгий путь, и выразительность языка (единственная вещь, которая является относительно стабильной во времени, потому что значимое улучшение в этой области является настолько трудоемким), больше выгод, чем вы считаете.
Роберт Харви
1
Это еще не весь прогресс: главное, вперед, изящно, было изобретение компилятора. Но мы по-прежнему учим блок-схемы, абстракцию кода ассемблера (и многие другие устаревшие практики). Наверное потому что мы забыли почему?
Ctrl-Alt-Delor
6

Я бы поспорил за нет .

По простой причине, что

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

Никогда не считался «идеальным», так как экстремальное программирование существует с 1990-х годов . И как вы говорите:

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

Был спор давным-давно. Например, эта легендарная статья 1992 года: что такое дизайн программного обеспечения .

Выше показано, что вы можете иметь «экстремальный» процесс с высоко эволюционной архитектурой и итеративным подходом без необходимости в сложных языках или IDE.

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

Euphoric
источник
6

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

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

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

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

JimmyJames
источник
3

Я думаю, что вы забыли цель иметь проектные документы в первую очередь!

Проектная документация (требования, варианты использования, макеты и т. Д.) Позволяет нам описать, понять и обсудить систему на высоком уровне. Количество оставленных деталей в таких документах, делает их полезными.

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

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

JacquesB
источник
Конечно, документация высокого уровня, которая не касается деталей, абсолютно необходима. Но это именно то, что я ожидаю от хорошего языка программирования. Это должно позволить писать код на разных уровнях детализации. Код не должен быть неструктурированным беспорядком инструкций низкого уровня.
Фрэнк
@FrankPuffer диаграмма стоит 100000 LoC.
RubberDuck
1
@RubberDuck Мне приходит в голову, что способность (или ее отсутствие) генерировать различные полезные диаграммы из кода может быть мерой выразительности языка. Там нет диаграммы, которую вы можете нарисовать, которая не может быть выражена на каком-то языке. Вопрос заключается в том, может ли этот язык передавать ту же информацию так, чтобы ее можно было легко написать или прочитать.
JimmyJames
1
@RubberDuck: в некоторых случаях диаграммы имеют смысл, например, для объяснения общей архитектуры. Но я не думаю, что они должны быть по умолчанию. Есть определенно хорошие и полезные диаграммы, но, к сожалению, большинство UML, которые я видел, скорее сбивают с толку, чем помогают. И что еще хуже, он часто отличается от фактической реализации.
Фрэнк
Мне нравится, что вы упоминаете создание диаграмм @JimmyJames. Я предпочитаю поколение над созданием вручную. У вас есть очень верное замечание, но мне интересно, если это функция выразительности или инструментов.
RubberDuck
1

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

Это дальше, чем вы предполагаете. Даже такие вещи, как зависимые типы (которые, как я понимаю, теоретически довольно многообещающие) существуют уже несколько лет.

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

Модульные тесты

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

Более того, написание хороших тестов (которые не нужно будет редактировать с каждым рефакторингом, но все равно будет отлавливать достаточно ошибок) довольно сложно.

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

Вероятно, проще использовать инструмент тестирования документации на данный момент.

Есть одно предварительное условие, чтобы эта работа работала: код должен быть достаточно легким для чтения и понимания.

К сожалению, разработка языков, которые не только чрезвычайно выразительны, но и чрезвычайно удобочитаемы, трудны. Такие языки, как Go, отдают приоритет читабельности, и это мешает мысли на более высоком уровне.

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


источник