Так уж случилось, что некоторое время назад довелось мне преподавать студентам дисциплину «Технология разработки программного обеспечения».
А как говориться, лучший способ научиться чему-либо — это учить этому чему-либо других. Во-первых, в процессе подготовки учебного материала приходится систематизировать свои знания, а это всегда полезно. Во-вторых, неправильно обходиться только своими знаниями, всегда нужно работать с дополнительными источниками информации — литературой, веб-ресурсами и т.п. В обычной жизни обычно всем этим (систематизацией своих знаний и изучением нового) заниматься лень, поэтому оно выполняется припадками, по мере надобности. А регулярные лекции стимулируют такие занятия.
Правда относительно книг у меня есть свое мнение. Вообще-то почти все, что я собираюсь рассказать, в том или ином виде сообщается в учебной литературе, связанной с технологией разработки программного обеспечения. Причем сообщается в гораздо более тщательном и подробном изложении. Но поскольку программирование является относительно новой дисциплиной, частные вещи, о которых говориться в книгах, часто устаревают или перестают быть актуальными. А для изложения общих принципов книга не нужна, общие принципы вполне можно уместить в одной статье и они никогда не перестанут быть актуальными.
Поскольку на форуме (и тем более в данном блоге) я появляюсь редко, тему я сделаю закрытой, чтобы ее не засоряли боты. Продолжения будут выкладываться прямо в данном топике (во всяком случае буду надеятся, что данную тему не постигнет судьба начинаний «[NET] *», остановившихся на третьем дне).
Но вначале нужно определиться с понятиями.
Технология разработки программного обеспечения имеет довольно косвенное отношение непосредственно к разработке (написанию программного кода). Ключевым здесь является слово «технология». При первом приближении, технологией разработки ПО можно назвать процесс превращения исходных данных задачи в готовый программный продукт.
Кстати, в первом посте будет только вводная часть, поэтому любому, кто писал ПО на заказ, все сказанное будет знакома. Подробности будут в следующих постах.
Часто программисты считают свою профессию чем-то творческим, что не поддается контролю и учету. Это не так. Разработка ПО — это инженерная дисциплина. В дальнейшем я чаще всего буду использовать для аналогий строительство мостов, это самая удобная и подходящая аналогия.
Когда необходимо построить мост через реку, никто не ожидает, что архитектор моста засядет перед кульманом в ожидании вдохновения. Строительство моста — это определенный процесс, который состоит из множества этапов, каждый из которых подробно описан в регламентах и стандартах, может быть подвергнут исчислению и спрогнозирован. Такой типовой мост может построить (спроектировать) любой толковый архитектор.
Вначале собираются исходные данных — ширина реки, характеристики грунта и берегов, требуемая грузоподъемность, сейсмические условия и многое другое. Это то, что при разработке программного продукта называется сбором исходных данных (платформа, количество пользователей, запланированная нагрузка и т.д.). От того, насколько полно эти данные будут собраны, будет зависеть, что получится в результате.
Кроме исходных данных к проектируемому мосту могут предъявляться какие-то дополнительные требования. Например, если река судоходная, то мост должен быть разводным. Если по мосту предполагается прокладывать железнодорожное полотно, то должна обеспечиваться относительная неподвижность полотна моста. Могут быть и другие требования, в том числе конфликтующие друг с другом.
Следующий этап — на основе собранных данных нужно определить тип моста — консольный, балочный, арочный, вантовый и т.п. Это — выбор архитектуры. Причем выбор должен осуществляться не спонтанно. Во-первых, конструкция моста может быть обусловлена требованиями к мосту. Во-вторых, при выборе окончательного варианта важными факторами могут быть стоимость и сроки строительства. Творчество (и талант) архитектора проявляется не в том, что он будет изобретать что-то новое в архитектуре мостов, а в том, что он может выбрать оптимальный вариант, учитывая множество разнообразных и порою противоречивых требований.
В разработке программного обеспечения этот этап также называется выбором архитектуры — конвейерная обработка, система клиент-сервер, событийная архитектура и т.д.
После того, как выбрана архитектура, начинается этап детализации. Если говорить о мостах, это выбор материалов и проработка деталей конструкции. Если говорить о программном обеспечении, это выбор инструментов разработки, регламенты на техническую документацию и т.п. Ну и кроме того, при разработке программного продукта часто целесообразно бывает использовать образцы (паттерны) программирования, чтобы сократить сроки разработки и повысить качество.
Несмотря на то, что разработка программного продукта коррелирует с архитектурой (проектированием и строительством), есть все же и принципиальные отличия. Основное отличие — это то, что выпуск продукции практически не занимает ресурсов.
После того, как проект моста полностью готов, по этому проекту начинают строительство, которое может занять немало времени. В случае разработки программного обеспечения, сама разработка (написание программного кода) является одновременно и этапом проектирования, и этапом строительства. А запись готового программного кода на носители может производиться автоматически и не занимать много времени и ресурсов.
Что вытекает из сказанного?
Что весь процесс разработки ПО всегда можно (и нужно) разбить на ряд этапов. Каждый этап можно оценить по сложности, временным затратам, произвести оценку качества и таким образом контролировать ход работ. А контроль нужен, во-первых, чтобы выдержать сроки создания, во-вторых, обеспечить качество продукта.
Другими словами, программист ничем не лучше архитектора или конструктора, и в программировании точно также нужно использовать стандарты, регламенты, методики, как и в более традиционных инженерных науках.
Небольшое отступление для тех, кто не считает программирование производством и кто считает, что шаблоны в программировании — это безусловно плохо, а оригинальность и необычность — это безусловно хорошо.
Например, есть задача получить азотную кислоту. Способов решения этой задачи — множество. Принципиально их можно поделить на лабораторные методы и промышленные методы.
В лаборатории проще всего получить азотную кислоту, нагревая селитру и серную кислоту. Это самый простой и доступный способ. Есть множество других способов, которые позволяют получить азотную кислоту с минимальным процентом посторонних примесей и с высокой концентрацией. Или за минимальное время. Или в условиях невозможности нагрева смеси.
Однако в производстве самый распространенный способ получения азотной кислоты — это окисление аммиака на платиновой решетке (катализаторе). В лабораторных условиях это не самый лучший способ — он дорог и сложен — однако в промышленных масштабах это сейчас самый оптимальный и эффективный способ.
Сторонники того, что программирование это творчество — это лаборанты. Для них процесс зачастую важнее, чем результат. Для них фреймворк NET — это платиновая решетка там, где достаточно таблетки сухого горючего.
Сторонники промышленного способа — это бизнес. Поэтому они не спорят, хорош NET или нет, они используют те инструменты, которые эффективны. А NET — эффективен.
Правда не стоит забывать и того, что основой для любых промышленных технологий всегда является лаборатория, все промышленные методы вышли именно из нее. И всегда есть вероятность того, что в лаборатории найдут более эффективный способ для промышленного применения. Правда среди «лаборантов» есть довольно много «алхимиков», которые может и считают, что изобретают что-то новое, а по факту просто переводят химикаты, не понимая (не в полной мере понимая) механизма химических реакций. Кто-то из них со временем поумнеет, кто-то так и останется «алхимиком», который только и умеет смешивать соду с кислотой.
Что-то я отвлекся на химическую тематику.
Итак, все профессии нужны, все профессии важны.
Но если речь идет о производстве программного продукта, говорить стоит только о промышленных способах.
Поэтому нужно знать разницу между «программой» и «программным продуктом».
Программный продукт — это конечный результат процесса разработки программного обеспечения. В первую очередь это непосредственно программа (или программы, в случае программного комплекса), которую можно использовать независимо от разработчиков. Это означает, что программа будет функционировать на любом компьютере, соответствующим системным требованиям, и что пользоваться программой пользователь сможет самостоятельно, без помощи разработчиков. Как минимум, это означает, что программный продукт поставляется в комплекте с документацией (эксплуатационной документацией) и на носителях, с которых возможно произвести установку программного продукта (дистрибутив).
Продолжение следует.