Введение в программную инженерию
Покупка
Тематика:
Программирование и алгоритмизация
Издательство:
ИНТУИТ
Год издания: 2016
Кол-во страниц: 118
Дополнительно
Курс является практическим сборником информации, которая необходима для комплексного понимания сути специальности программной инженерии и направлена на формирование знаний, требуемых для отработки навыков, способствующих успешному профессиональному старту.
Тематика:
ББК:
УДК:
ОКСО:
- ВО - Бакалавриат
- 09.03.03: Прикладная информатика
- 09.03.04: Программная инженерия
ГРНТИ:
Скопировать запись
Фрагмент текстового слоя документа размещен для индексирующих роботов
Введение в программную инженерию 2-е издание, исправленное Никитин И.А. Цулая М.Т. Национальный Открытый Университет “ИНТУИТ” 2016 2
Введение в программную инженерию/ И.А. Никитин, М.Т. Цулая - М.: Национальный Открытый Университет “ИНТУИТ”, 2016 Курс является практическим сборником информации, которая необходима для комплексного понимания сути специальности программной инженерии и направлена на формирование знаний, требуемых для отработки навыков, способствующих успешному профессиональному старту. (c) ООО “ИНТУИТ.РУ”, 2020-2016 (c) Никитин И.А., Цулая М.Т., 2020-2016 3
Замысел. Посвящение и благодарности Здравствуйте, уважаемые коллеги! Мы начинаем увлекательное путешествие в сферу профессиональной деятельности, которая называется “программная инженерия”. О “Главе 1” — программные инженеры в шутку начинают отсчет при запуске любой активности с “0”, а не с “1”. Они — непростой, но очень пытливый и интересный народ, который стремится все в своей профессиональной деятельности конкретизировать, а после чего с блеском решить любой вопрос или задачу. Эта особенность имеет определенную природу возникновения и последствия, которые отражаются на всем, за что они берутся. Программная инженерия — это именно инженерия, а не наука или область академических знаний, и требования по ее использованию формируют однозначные и достаточно большие ожидания. У программных инженеров нет возможности подолгу разбираться в запутанных и комплексных проблемах заказчиков. Они должны, используя методы и инструменты своего ремесла, сформировать четкое и ясное представление о том, что явится результатом их деятельности и в какие сроки его можно будет достичь. Цель программной инженерии состоит в накоплении, систематизации и последующем использовании информации, необходимой для быстрой и качественной разработки эффективного программного обеспечения. Более формальное и строгое определение программной инженерии звучит так: Программная инженерия (англ. software engineering) — приложение систематического, дисциплинированного, измеримого подхода к разработке, функционированию и сопровождению программного обеспечения, а также к исследованию этих подходов. Если выразиться более абстрактно и универсально, то программная инженерия — это приложение дисциплины инженерии к созданию программного обеспечения. Формальное определение инженерии, в свою очередь, звучит следующим образом: Инженерия (инженерное дело) — область человеческой интеллектуальной деятельности, дисциплина, профессия, задачей которой является применение достижений науки, техники, использование естественнонаучных законов и ресурсов для решения конкретных проблем, целей и задач человечества. Инженерное дело реализуется путем применения научных знаний и практического опыта (инженерные навыки, умения) с целью создания (в первую очередь проектирования) полезных технологических и технических процессов и объектов, которые реализуют эти процессы. Основные цели любой инженерной деятельности — создание и поэтапное усовершенствование технических приспособлений, отслеживание их результативного и бесперебойного функционирования. На плечи инженеров ложится не только необходимость спроектировать, собрать и испытать изобретение или продукт, но и сопроводить процесс его эксплуатации. Все, что обычно делают инженеры, связано с поддержанием полного цикла работы информационного продукта. Инженеры — это своего рода изобретатели. Их предназначение — облегчать жизнь и труд с помощью механизмов, оптимизированных принципов функционирования сложных изделий, максимизировать результаты, полученные путем использования создаваемых ими аппаратов, программ, удовлетворять нужды владельцев технических изделий, информационных систем, сервисов и автоматизированных ими процессов. В современном мире сложно найти категории производства, социальной и общественной жизни, в которых обошлось бы без непосредственного участия инженеров или без продуктов, разработанных ими. И с каждым годом потребность в этих специалистах растет. В инженерах нуждаются самые 4
разные предприятия. Без них не обходятся R&D, аналитические, проектировочные, разработческие и другие направления деятельности. Современный мир пришел к необходимости специализации ранее универсальных сфер деятельности, поэтому появилось множество профессий, которые по своей сути являются различными подактивностями профессии инженера. Намеченная тенденция к универсализации будет только усиливаться. Это связано прежде всего с анализом, синтезом возрастающего количества данных и управлением ими. Эти данные человечество начало собирать для исследования собственной природы и предпочтений, поэтому ему необходимы более качественные продукты и сервисы, каждый из которых предназначен для определенной целевой аудитории и решает четко поставленную задачу. Программные инженеры реагируют на это постоянным выделением отдельных активностей, ранее являвшихся составной частью инженерии. Перечислим основных современных специалистов (их классификация, конкретизация их навыков и выполняемых ими действий будут изложены далее), каждый из которых решает задачи в своей профессиональной области, но при этом может иногда заменить коллегу из смежной активности. Аналитики Основная задача специалистов этой области состоит в исследовании определенной проблемы, задачи, ее формализации в понятном для последующего решения виде. Архитекторы Задача этих специалистов — разработка ряда вариантов высокоуровневых алгоритмов различной степени сложности и последующее соединение наиболее успешных из них в единое организационноинформационное решение, удовлетворяющее нуждам ключевых пользователей. Разработчики Эти специалисты занимаются непосредственной реализацией необходимых алгоритмов в виде надежно функционирующего продукта, удовлетворяющего первоначально выявленным требованиям к проблемам предприятия, пользователей или определенной сферы деятельности в определенных условиях его использования. Тестировщики Специалисты по тестированию выполняют выверку между первоначально зафиксированными на стадии анализа требованиями и полученным после стадии разработки инкрементом (промежуточным самодостаточным для использования результатом), сверяют его корректность и подтверждают, что внесенные изменения в функционирующий продукт не нарушили его целостности. Администраторы информационных систем Задача этих специалистов заключается в обеспечении и поддержании инфраструктуры, необходимой для осуществления рабочих процессов разработчиков и пользователей. Руководители производственных подразделений Эти сотрудники должны четко и экспертно организовать работу большого коллектива, запустить единый эффективно функционирующий процесс с определенными метриками производительности, поддерживающими достижение целевых показателей разрабатываемого продукта. Программный инженер высокой квалификации — это тот, кто в равной мере и достаточно эффективно сможет выполнять любую из перечисленных работ. Для этого необходимо представлять себе полный, “сквозной” процесс программной инженерии и стремиться к обучению, самообучению, развитию профессиональных навыков в каждом из перечисленных профессиональных доменов. Без понимания того, какие практические действия совершает каждый из перечисленных специалистов на своем рабочем поприще, не сложится комплексного и объективного понимания значимости каждой профессии и ее влияния на конечный результат. Как вы уже поняли, в этом курсе мы сконцентрируемся именно на программной инженерии. Ну что же, начнем… 5
Как устроен этот курс? Программная инженерия — комплексный и многогранный вид деятельности. Охватить в одном курсе все активности программной инженерии будет крайне сложно, да и незачем — для этого существует эталонная справочная литература, где приведены все типы деятельностей, из которых состоит программная инженерия (SWEBOK). Если бы мы попытались охватить здесь все этапы процесса программной инженерии, этот курс получился бы достаточно длинным и немного эклектичным. Последовательное изложение сложного материала обычно содержит много повторений и отсылок к ранее приведенному — только так в едином издании можно сохранить целостность первоначальной идеи, заложенной в этот предмет. Но мы пойдем немного другим путем. Наш курс состоит из трех независимых друг от друга модулей, в каждом из которых будут раскрыты основная суть и постулаты различных структурных составляющих программной инженерии: 1. Базовые принципы. Введение в специальность Общее введение. Базовые знания и навыки. Основы компьютерной грамотности. Soft-навыки. 2. Основные инженерные процессы программной инженерии Анализ. Проектирование. Разработка. Тестирование. 3. Управленческие и дополнительные технологии и активности Базы данных и смежные технологии. Документирование. Сопровождение. Подходы к управлению программной инженерией и процессами разработки. DevOps. BizDevOps. Управление эффективностью информационных продуктов. Сейчас перед вами первый модуль. Каждый из этих модулей самодостаточен, независим и может изучаться в отрыве от остальных, но наша рекомендация, отраженная в структуре курса, предполагает изучение, которое, по замыслу авторов, должно позволить от более базовой, понятной широкой аудитории информации, постепенно специализируясь, переходить к той, которая востребована различными профессиональными специализациями. Программный инженер должен в равной степени владеть всеми активностями, определяющими предмет программной инженерии. 6
Стоит ли читать этот курс? Для тех, кто уже начал делать первые шаги в одном из перечисленных выше видов подактивностей программной инженерии или старается углубить и систематизировать свои знания, изучение этого курса представляется необходимым шагом на пути совершенствования в этой профессиональной сфере. Курс направлен на формирование целостной картины о деятельности программного инженера как виде активности, которая решает прикладные задачи. Под прикладными понимаются те задачи, решение которых приносит практическую пользу — сразу или в ближайшем будущем. Эти задачи не носят характер фундаментальных. Решением фундаментальных задач занимаются прежде всего ученые, и практическую пользу от их решения невозможно измерить на коротком временном интервале. Решение фундаментальных задач не представляет интереса для коммерческих сфер деятельности, за редким исключением, когда мы говорим о крупных технологических гигантах, зависящих в стратегии своего развития от новшеств и открытий, появление которых можно лишь прогнозировать с определенной вероятностью. Итак, программный инженер использует в своей деятельности проверенные и подтвержденные достижения науки, ориентируясь на воспроизводимость практических результатов. Он должен давать четкие и обоснованные прогнозы о том, когда станет возможным использовать плоды его трудов. Без понимания временной точки, в которой результаты инженерной деятельности будут доступны для практического применения пользователями его продукта, программной инженерии не существует. Это основное, что должен осознавать специалист, решивший стать программным инженером. Чтобы давать прогнозы, перерастающие в оценку с определенной долей погрешности, нужно осознавать всю сложность, комплексность и взаимозависимость различных активностей, входящих в профессию программного инженера. Квалифицированный программный инженер не должен концентрировать свое внимание только на какой-то одной активности. Если такое случается, то востребованность инженера со временем становится все более и более “узкой”, а его оценки касаются только каких-то специфичных этапов процессов программной инженерии и не могут быть востребованы для высокоуровневого управленческого планирования, лежащего в основе именно той практической деятельности, за которую инженер получает свое вознаграждение. Программная инженерия — комплексная и сложная дисциплина. Ее изучение занимает годы, особенно когда мы говорим не просто, к примеру, о концентрировании только на процессах разработки, а обо всех активностях, без понимания которых не получится быть инженером в полном смысле этого слова. Инженер, умеющий применять на практике в различных ситуациях навыки программиста, аналитика, тестировщика или менеджера, является связующей нитью всех активностей программной инженерии, и без таких сотрудников не удастся создать по-настоящему успешный и востребованный продукт. 7
Материал, приведенный в этой книге, не претендует на полный и достаточный сборник обо всех активностях программной инженерии, но мы постарались дать их единое и целостное описание, которое будет полезно для тех, кто заинтересован в формировании полной картины деятельности программного инженера. Возникновение идеи курса Идею собрать разнообразный материал о программной инженерии и ее активностям в единый курс авторы вынашивали достаточно долго. С одной стороны, базовый курс по дисциплине “программная инженерия” — это достаточно очевидная идея, но, с другой стороны, авторам было гораздо проще в течение нескольких лет создавать отдельные курсы, посвященные разным активностям программной инженерии. Специфичный материал, описывающий работу с рисками, архитектурное проектирование, методологии организации и управления коллективом разработчиков написать намного проще, так как есть четко сформулированная идея и набор источников литературы, которым можно дополнять конкретный практический успешный опыт. Описание отдельных видов активностей полезно, когда есть необходимость систематизации знаний и изучения деталей в определенном профессиональном направлении, но оно не дает понимания целостной картины деятельности, которая должна быть сформирована у каждого профессионала для понимания своего места в профессии, направлений своего личностного развития и совершенствования. В тот момент, когда уже был накоплен определенный опыт и наработаны навыки по целому ряду активностей, авторы пришли к необходимости полной систематизации имеющихся данных с целью создания комплексного материала, полезного для тех, кто встал вместе с нами на путь высококвалифицированного программного инженера. Нужно отметить, что идея этой книги родилась в ожесточенных спорах между авторами о сути и назначении программной инженерии. С одной стороны, была явная точка зрения, что программная инженерия — это сугубо теоретическая дисциплина, тезисы которой являются истинными и неоспоримыми. С другой стороны, был озвучен подход, который во главу угла ставит постоянные эксперименты и пересмотр, дополнение фундаментальных теорий инженерии в соответствии с текущими условиями реального мира. Нам кажется, что эти точки зрения дополняют друг друга и только в их симбиозе можно достичь объективного представления о том, что такое программная инженерия во всей своей полноте и многообразии. Семья и друзья Идея — сама по себе очень значимая субстанция. А конструктивная идея — вдвойне важный умственный артефакт. Но просто замысел так и остается призрачным замком без кропотливого и системного 8
труда по его воплощению. Идея — это только 5% успеха, а остальные 95% — тяжелый и изматывающий каждодневный труд. Какого бы вида этот труд не был, он забирает много умственных и физических сил, которые необходимо постоянно возобновлять. Кроме сил требуется вдохновение, направляемое на создание наиболее сложных и эмоциональных частей по-настоящему востребованного курса. И мы хотим сказать большое спасибо всем, кто был и остается с нами, кто придавал и придает нам сил, дает нам вдохновение и поддержку — словами, интересными и честными рассуждениями, поступками, свидетельствующими о чистой и неподдельной любви и дружбе. Родственный и близкий круг общения наиболее сильно способствует развитию и успеху в какой бы то ни было профессиональной деятельности. Семья и близкие друзья — это настоящая экосистема, формирующая личность, делающая ее лучше и подталкивающая к постоянному развитию. Задача каждого состоит в том, чтобы развиваться самостоятельно, помогать развиваться своему окружению, верить и доверять ему. Таким образом, мы получаем столь опасную, но очень мощную рекурсию, которая по сути является бесконечным развивающимся циклом. Именно при таких условиях возможно безостановочное развитие всех тех, кто составляет профессиональное сообщество или семью. Но для того, чтобы быть участником этого “семейного” потока, необходимо сохранять искренние отношения, постоянно и без устали работать над своим близким семейным кругом. То же касается и наиболее искренних и честных друзей, с которыми вы идете по жизни рука об руку. Большое спасибо нашим женам, детям, родственникам, близким друзьям, коллегам. Именно вы настоящие соавторы этого курса, именно благодаря вам он появился на свет и теперь живет и развивается в различных формах и проявлениях. Практическая деятельность Основные исторические сведения о возникновении профессии инженера берут свое начало со II века до нашей эры. “Инженерами” в тот период истории называли создателей и операторов военных машин. “Гражданский инженер” — понятие, которое появилось в XVI веке в Голландии (а затем в Англии, Пруссии и России) применительно к строителям мостов, дорог. Разработка программного обеспечения является достаточно “молодой” отраслью инженерной науки. С развитием языков программирования совершенствовались и методики, применяемые для создания программного обеспечения, в результате чего в конце 90-х годов XX века появилось направление “программная инженерия” (Software Engineering). Компьютерное сообщество IEEE (Computer Society of the Institute for Electrical and Electronic Engineers) к 2004 году сформировало Руководство к своду знаний по программной инженерии (Guide to the Software Engineering Body of Knowledge, SWEBOK). 9
Согласно SWEBOK, программная инженерия включает в себя следующие десять областей знаний: 1. Требования (software requirements). 2. Проектирование (software design). 3. Конструирование (software construction). 4. Тестирование (software testing). 5. Поддержка и эксплуатация (software maintenance). 6. Конфигурационное управление (software configuration management). 7. Управление инженерной деятельностью (software engineering management). 8. Процессы инженерной деятельности (software engineering process). 9. Инженерные инструменты и методы (software engineering tools and methods). 10. Качество (software quality). Несмотря на устоявшееся понимание того, из каких активностей состоит программная инженерия, правовые требования к лицензированию и сертификации профессиональных программных инженеров во всем мире отличаются. Британское общество вычислительной техники (British Computer Society) выдает лицензии инженерам программного обеспечения, которые, будучи членами Общества, могут также стать “сертифицированными инженерами”, а в некоторых районах Канады, например в Альберте, Онтарио и Квебеке, инженеры по программному обеспечению могут быть и “профессиональными инженерами” или “магистрами информационных систем” (ISP), однако никаких правовых требований для данных специализаций не существует. В последние годы значимость инженерного образования постоянно пересматривается и корректируется. Современный программный инженер должен понимать, как именно научный и технический прогресс воздействует на общество в целом. Это знание необходимо для того, чтобы создаваемые им артефакты были востребованными у широкого круга пользователей и оправдывали свое целевое назначение. Поэтому его знания не должны ограничиваться только естественнонаучными и сугубо техническими дисциплинами. Программному инженеру следует разбираться в истории, экономике, социологии, психологии, литературе, искусстве. Только так, полагают многие эксперты, можно создавать оптимальные инженерные решения. “Современные студенты должны уметь совмещать естественные и информационные науки на нано-, микро- и макроуровнях, владеть профессиональной этикой и ощущать социальную ответственность, быть творческими личностями и новаторами, иметь развитые навыки устного и письменного общения. Они должны быть готовы стать гражданами мира и понимать, какой вклад могут внести инженеры в развитие общества”, — сказал президент Национальной инженерной академии США Чарльз Вест. Профессия программного инженера требует наличия обширных профильных и общих знаний для того, чтобы создавать качественные и востребованные продукты. Тип мышления инженера должен быть одновременно математическим, логическим, предрасположенным к анализу и синтезу. Для успешного выполнения своих профессиональных обязанностей инженер должен 10