Как инженеры, мы все "проектируем" артефакты (здания, программы, схемы, молекулы ...). Это действие (дизайн-глагол), которое дает какой-то результат (дизайн-существительное).
Я думаю, что мы все согласны с тем, что дизайн-существительное отличается от самого артефакта.
Ключевым видом деятельности в программном бизнесе (на самом деле, в любом бизнесе, где необходимо улучшить конечный артефакт продукта) является понимание «дизайна (существительное)». Тем не менее, как сообщество, мы, похоже, почти полностью терпим неудачи при его записи, о чем свидетельствует количество усилий, которые люди прикладывают для повторного обнаружения фактов о своей кодовой базе. Попросите кого-нибудь показать вам дизайн своего кода и посмотреть, что вы получите.
Я думаю, что дизайн программного обеспечения имеет:
- Явная спецификация того, что должно делать программное обеспечение и насколько хорошо оно это делает
- Явная версия кода (эта часть проста, у всех есть)
- Объяснение того, как каждая часть кода служит для достижения спецификации (например, связь между фрагментами спецификации и фрагментами кода)
- Обоснование , почему этот код так , как это (например, почему конкретный выбор , а не другой)
То, что НЕ является дизайном, - это особый взгляд на код. Например, [не указывать конкретно] диаграммы UML не являются проектами. Скорее, это свойства, которые вы можете получить из кода, или, возможно, свойства, которые вы хотели бы получить из кода. Но, как правило, вы не можете получить код из UML.
Почему после 50 с лишним лет создания программного обеспечения у нас нет регулярных способов выразить это? (Не стесняйтесь противоречить мне с явными примерами!)
Даже если мы это сделаем, большая часть сообщества, кажется, настолько сосредоточена на получении «кода», что дизайн-существительное в любом случае теряется. (ИМХО, пока дизайн не станет целью разработки, с артефактом, извлеченным из проекта, мы не собираемся обойти это).
Что вы видели в качестве средства для записи дизайна (в смысле, я описал это)? Явные ссылки на статьи были бы хорошими. Как вы думаете, почему конкретные и общие средства не были успешными? Как мы можем изменить это?
[У меня есть свои идеи, которые отражают вышеприведенную точку зрения, но я заинтересован в ответах других людей ... и трудно реализовать мою схему [[и, возможно, в этом реальная проблема: -]]]
РЕДАКТИРОВАТЬ 2011/1/3: Один из потоков ответов намекает на то, что «документация» (предположительно, текстовая, в частности неформальная) может быть адекватной. Думаю, мне следует уточнить, что я не верю в это. Инструменты CASE появились на сцене начиная с 80-х годов, но ранние инструменты в основном просто захватывали пиксели для диаграмм того, что вы нарисовали; в то время как инструменты были, возможно, коммерчески успешными, они действительно были не очень полезны. Ключевым моментом было то, что, если дополнительные «конструктивные» артефакты формально не интерпретируются, вы не сможете получить серьезную помощь инструмента. Я полагаю, что то же самое относится к любой долгосрочной полезной форме захвата дизайна: если у нее нет формальной структуры, она не будет иметь никакого реального использования. Текстовые документы в значительной степени не проходят этот тест.
источник
Ответы:
Я думаю, что есть несколько причин, почему мы все еще не очень хороши в этом.
Люди долгое время, хотя программное обеспечение было похоже на дома, и использовали процессы и идеи из строительства. «Архитектор программного обеспечения» - это название, которое хотели все программисты. За последние десять лет архитектор программного обеспечения практически вымер. Идея каскадных процессов, когда у вас сначала есть архитектор, говорящий о том, как должно работать и выглядеть программное обеспечение, а затем заставляет людей составлять диаграммы того, как оно должно быть сконструировано, и, наконец, заставляет обезьяну кода реализовывать эти приятные рабочие потоки / диаграммы UML для спецификации, эта идея заключается в том, что сейчас широко высмеивают. Так что на самом деле вся индустрия в течение 40 лет шла по неверному пути.
Инструменты, которые мы используем, постоянно меняются и совершенствуются. Программирование - логическая головоломка, и мы придумываем лучшие идеи и методы, чтобы абстрагировать эту головоломку и сделать ее понятной. То, как мы моделируем это, должно развиваться с той же скоростью, но отстает. Усовершенствованные методы абстрагирования от головоломки программирования также означают, что мы можем увеличить сложность. И так мы делаем. Программирование всегда лежит на гранях сложности, с которой мы, программисты, можем справиться.
Создание способов описания программы - это своего рода абстракция. Если нам удастся придумать хороший способ абстрагирования программного обеспечения, мы также можем поместить эту абстракцию непосредственно в инструменты разработки и, следовательно, добавить еще одну абстракцию / упрощение в программирование. Это случалось много раз. Примерами таких абстракций являются функции, классы и библиотеки.
Следовательно; Если у вас есть успешная и точная модель программного обеспечения, эта модель будет эквивалентна программному обеспечению. Что делает все усилия бессмысленными, что, в свою очередь, подтверждает пункт 1 выше: моделирование программного обеспечения гораздо менее полезно, чем считалось ранее. Вместо этого лучше извлечь данные о программном обеспечении из кода. Создание модели UML из того, как на самом деле выглядит код, гораздо более поучительно, чем создание модели UML и попытка реализовать эту теоретическую модель.
источник
Вас может заинтересовать обзор литературы по отслеживанию программного обеспечения. В произвольном порядке:
Обратите внимание, что это только вершина айсберга, и я уверен, что я пропустил некоторые ключевые документы.
С другой стороны, моя собственная работа над Arcum была для программистов средством выразить IDE использование сквозных идиом дизайна. После этого программисты могут преобразовать свой исходный код для использования альтернативных реализаций:
Кстати, Arcum также связан с вашей работой в DMS.
источник
UML для программы такой же, как планы для здания, на мой взгляд. Планы сами по себе не являются проектом без курса, для этого вам нужны спецификации материалов (используемые инструменты кода), общий вид здания (некоторое схематическое представление всего программного обеспечения, включая проекты с графическим интерфейсом), то, как здание расположено в окружающей среде. (четкая схема того, как программное обеспечение взаимодействует с другими / внедряется в ОС), как оно соотносится с климатом и почвой (взаимодействие с оборудованием), ... Множество книг по дизайну пытаются определить это, но, как и при В науке много вещей, у каждого ученого есть свое определение.
Я также не согласен с вашим наблюдением, что вы не можете получить код из UML. Вы можете, если у вас есть дополнительная информация, упомянутая. Но настоящий код больше не дизайн, это артефакт. Вы не можете извлечь реальные камни и бетон из плана, но вам нужен план, чтобы поместить реальные камни и бетон в правильную форму и правильное место.
В этом свете мне показалась интересной следующая статья (я встречал ее в другом контексте, когда искал программное обеспечение для графов, но тем не менее ...). Графический подход для описания дизайна имел смысл для меня, хотя, на мой взгляд, это только часть дизайна. Интересно, что этот подход дает основу для понимания и рефакторинга проектов (в отличие от рефакторинга программного обеспечения), как указано в следующих статьях:
Вермелингер и Фьядейро
Цанталис и др.
Существует множество других подходов для описания (части) дизайна, таких как структурированный дизайн (HIPO Charts) или интегрированный дизайн программы , шаблоны проектирования , ...
Тем не менее, пока нет установленного отраслевого стандарта, вряд ли найдется «обычный» способ выразить это. Даже после 50+ лет. И, честно говоря, если ваша компания найдет хороший способ выразить дизайн, поделитесь им со всем миром?
источник
Исходя из своего личного опыта, я бы сказал, что мы неплохо фиксируем дизайн программного обеспечения. У нас есть база данных требований и проектных документов для каждой функции, которую мы когда-либо реализовывали на нашей платформе. Я полагаю, что мое обстоятельство может быть уникальным. Вот несколько вещей, о которых стоит подумать.
Каждый человек в моей команде имеет диплом инженера ... в основном EE или CE. Инженерия учит вас дизайну как часть учебной программы.
Я думаю, что есть много так называемых разработчиков программного обеспечения, которые происходят из CS. Разработка программного обеспечения не является неотъемлемой частью большинства программ CS. Я не говорю, что все профилирующие специалисты CS плохо разбираются в дизайне, но я бы поспорил, что у большинства нет формального образования, которое их этому научило. Я думаю, что многие люди предполагают, что если вы можете программировать, вы можете разрабатывать программное обеспечение, что не соответствует действительности. Учитывая, что многие программисты не имеют инженерного образования, неудивительно, что во многих программных проектах нет команды, которая хорошо разбиралась в дизайне.
источник
Я вижу две проблемы.
Во-первых, чертовски трудно поддерживать синхронизацию кода и документации. Если они разделены, они будут расходиться, и документация станет бесполезной. Программисты пытались использовать инструменты для их синхронизации (например, CASE-инструменты), но эти инструменты попали между программистами и их кодом, что принесло больше вреда, чем пользы. Одна из ключевых идей доменного дизайна (Evans, 2004) заключается в том, что хороший дизайн действительно сложен, поэтому, чтобы извлечь из него что-то, вы должны:
Другая большая проблема с тем, как мы занимаемся дизайном, заключается в том, что наши методы проектирования недостаточно математичны. Утечка абстракций не позволяет делать из них убедительные выводы, а мир строго прикладной логики и ясной правды называется математикой, от которой программисты в основном избегают.
Те немногие математические инструменты, которые у нас есть, такие как формальные методы, очень громоздки.
Map-Reduction - хороший пример математики в программировании. Основная идея заключается в следующем: если у вас есть ассоциативная бинарная операция, вы можете очень легко распределить ее выполнение. Бинарная операция - это функция с двумя параметрами, ассоциативность подразумевает, что (a + b) + c = a + (b + c)
a1 + a2 + ... + a99 + b1 + b2 + ... + b99 + c1 + c2 + ... + c99
(a1 + a2 + ... + a99) + (b1 + b2 + ... + b99) + (c1 + c2 + ... + c99), где As, Bs и Cs могут быть добавлены в разных местах, их результаты собраны и подытожил в кратчайшие сроки.
Уменьшение карты - смехотворно простая идея. Это можно описать на одном листе бумаги. Если вы можете предположить, что читатель имеет твердое понимание концепции ассоциативности, если помещается на довольно маленьком листе бумаги. Теперь попытайтесь объяснить кому-то map-проводить без использования термина «ассоциативность» или косвенной ссылки на него. Попробуй.
Разработка программного обеспечения без математических абстракций - это все равно что пытаться делать архитектуру, даже не пытаясь изучать геометрию.
Возможно, Haskell сможет это исправить со временем. Использование концепций из теории категорий для описания программ выглядит многообещающе для меня. Теория категорий настолько абстрактна, что даже математики мало ее используют, но, очевидно, категории, которые являются абстрактными до неузнаваемости, кажутся достаточно абстрактными для описания структуры программного обеспечения. Мы узнаем. Медленно.
источник