Россия, Москва, City Business School |
Замысел. Посвящение и благодарности
Приветствие
Здравствуйте, уважаемые коллеги!
Мы начинаем увлекательное путешествие в сферу профессиональной деятельности, которая называется "программная инженерия".
О "Главе 1" "Замысел. Посвящение и благодарности" — программные инженеры в шутку начинают отсчет при запуске любой активности с "0", а не с "1". Они — непростой, но очень пытливый и интересный народ, который стремится все в своей профессиональной деятельности конкретизировать, а после чего с блеском решить любой вопрос или задачу. Эта особенность имеет определенную природу возникновения и последствия, которые отражаются на всем, за что они берутся.
Программная инженерия — это именно инженерия, а не наука или область академических знаний, и требования по ее использованию формируют однозначные и достаточно большие ожидания. У программных инженеров нет возможности подолгу разбираться в запутанных и комплексных проблемах заказчиков. Они должны, используя методы и инструменты своего ремесла, сформировать четкое и ясное представление о том, что явится результатом их деятельности и в какие сроки его можно будет достичь.
Цель программной инженерии состоит в накоплении, систематизации и последующем использовании информации, необходимой для быстрой и качественной разработки эффективного программного обеспечения.
Более формальное и строгое определение программной инженерии звучит так:
Программная инженерия (англ. software engineering) — приложение систематического, дисциплинированного, измеримого подхода к разработке, функционированию и сопровождению программного обеспечения, а также к исследованию этих подходов.
Если выразиться более абстрактно и универсально, то программная инженерия — это приложение дисциплины инженерии к созданию программного обеспечения.
Формальное определение инженерии, в свою очередь, звучит следующим образом:
Инженерия (инженерное дело) — область человеческой интеллектуальной деятельности, дисциплина, профессия, задачей которой является применение достижений науки, техники, использование естественнонаучных законов и ресурсов для решения конкретных проблем, целей и задач человечества. Инженерное дело реализуется путем применения научных знаний и практического опыта (инженерные навыки, умения) с целью создания (в первую очередь проектирования) полезных технологических и технических процессов и объектов, которые реализуют эти процессы.
Основные цели любой инженерной деятельности — создание и поэтапное усовершенствование технических приспособлений, отслеживание их результативного и бесперебойного функционирования.
На плечи инженеров ложится не только необходимость спроектировать, собрать и испытать изобретение или продукт, но и сопроводить процесс его эксплуатации. Все, что обычно делают инженеры, связано с поддержанием полного цикла работы информационного продукта.
Инженеры — это своего рода изобретатели. Их предназначение — облегчать жизнь и труд с помощью механизмов, оптимизированных принципов функционирования сложных изделий, максимизировать результаты, полученные путем использования создаваемых ими аппаратов, программ, удовлетворять нужды владельцев технических изделий, информационных систем, сервисов и автоматизированных ими процессов.
В современном мире сложно найти категории производства, социальной и общественной жизни, в которых обошлось бы без непосредственного участия инженеров или без продуктов, разработанных ими. И с каждым годом потребность в этих специалистах растет.
В инженерах нуждаются самые разные предприятия. Без них не обходятся R&D, аналитические, проектировочные, разработческие и другие направления деятельности.
Современный мир пришел к необходимости специализации ранее универсальных сфер деятельности, поэтому появилось множество профессий, которые по своей сути являются различными подактивностями профессии инженера.
Намеченная тенденция к универсализации будет только усиливаться. Это связано прежде всего с анализом, синтезом возрастающего количества данных и управлением ими. Эти данные человечество начало собирать для исследования собственной природы и предпочтений, поэтому ему необходимы более качественные продукты и сервисы, каждый из которых предназначен для определенной целевой аудитории и решает четко поставленную задачу.
Программные инженеры реагируют на это постоянным выделением отдельных активностей, ранее являвшихся составной частью инженерии.
Перечислим основных современных специалистов (их классификация, конкретизация их навыков и выполняемых ими действий будут изложены далее), каждый из которых решает задачи в своей профессиональной области, но при этом может иногда заменить коллегу из смежной активности.
- Аналитики
- Основная задача специалистов этой области состоит в исследовании определенной проблемы, задачи, ее формализации в понятном для последующего решения виде.
- Архитекторы
- Задача этих специалистов — разработка ряда вариантов высокоуровневых алгоритмов различной степени сложности и последующее соединение наиболее успешных из них в единое организационно-информационное решение, удовлетворяющее нуждам ключевых пользователей.
- Разработчики
- Эти специалисты занимаются непосредственной реализацией необходимых алгоритмов в виде надежно функционирующего продукта, удовлетворяющего первоначально выявленным требованиям к проблемам предприятия, пользователей или определенной сферы деятельности в определенных условиях его использования.
- Тестировщики
- Специалисты по тестированию выполняют выверку между первоначально зафиксированными на стадии анализа требованиями и полученным после стадии разработки инкрементом (промежуточным самодостаточным для использования результатом), сверяют его корректность и подтверждают, что внесенные изменения в функционирующий продукт не нарушили его целостности.
- Администраторы информационных систем
- Задача этих специалистов заключается в обеспечении и поддержании инфраструктуры, необходимой для осуществления рабочих процессов разработчиков и пользователей.
- Руководители производственных подразделений
- Эти сотрудники должны четко и экспертно организовать работу большого коллектива, запустить единый эффективно функционирующий процесс с определенными метриками производительности, поддерживающими достижение целевых показателей разрабатываемого продукта.
Программный инженер высокой квалификации — это тот, кто в равной мере и достаточно эффективно сможет выполнять любую из перечисленных работ. Для этого необходимо представлять себе полный, "сквозной" процесс программной инженерии и стремиться к обучению, самообучению, развитию профессиональных навыков в каждом из перечисленных профессиональных доменов. Без понимания того, какие практические действия совершает каждый из перечисленных специалистов на своем рабочем поприще, не сложится комплексного и объективного понимания значимости каждой профессии и ее влияния на конечный результат.
Как вы уже поняли, в этом курсе мы сконцентрируемся именно на программной инженерии.
Ну что же, начнем…
Как устроен этот курс?
Программная инженерия — комплексный и многогранный вид деятельности. Охватить в одном курсе все активности программной инженерии будет крайне сложно, да и незачем — для этого существует эталонная справочная литература, где приведены все типы деятельностей, из которых состоит программная инженерия (SWEBOK).
Если бы мы попытались охватить здесь все этапы процесса программной инженерии, этот курс получился бы достаточно длинным и немного эклектичным. Последовательное изложение сложного материала обычно содержит много повторений и отсылок к ранее приведенному — только так в едином издании можно сохранить целостность первоначальной идеи, заложенной в этот предмет. Но мы пойдем немного другим путем.
Наш курс состоит из трех независимых друг от друга модулей, в каждом из которых будут раскрыты основная суть и постулаты различных структурных составляющих программной инженерии:
- Базовые принципы. Введение в специальность
- Общее введение.
- Базовые знания и навыки.
- Основы компьютерной грамотности.
- Soft-навыки.
- Основные инженерные процессы программной инженерии
- Анализ.
- Проектирование.
- Разработка.
- Тестирование.
- Управленческие и дополнительные технологии и активности
- Базы данных и смежные технологии.
- Документирование.
- Сопровождение.
- Подходы к управлению программной инженерией и процессами разработки.
- DevOps.
- BizDevOps.
- Управление эффективностью информационных продуктов.
Сейчас перед вами первый модуль. Каждый из этих модулей самодостаточен, независим и может изучаться в отрыве от остальных, но наша рекомендация, отраженная в структуре курса, предполагает изучение, которое, по замыслу авторов, должно позволить от более базовой, понятной широкой аудитории информации, постепенно специализируясь, переходить к той, которая востребована различными профессиональными специализациями. Программный инженер должен в равной степени владеть всеми активностями, определяющими предмет программной инженерии.
Стоит ли читать этот курс?
Для тех, кто уже начал делать первые шаги в одном из перечисленных выше видов подактивностей программной инженерии или старается углубить и систематизировать свои знания, изучение этого курса представляется необходимым шагом на пути совершенствования в этой профессиональной сфере.
Курс направлен на формирование целостной картины о деятельности программного инженера как виде активности, которая решает прикладные задачи.
Под прикладными понимаются те задачи, решение которых приносит практическую пользу — сразу или в ближайшем будущем. Эти задачи не носят характер фундаментальных. Решением фундаментальных задач занимаются прежде всего ученые, и практическую пользу от их решения невозможно измерить на коротком временном интервале. Решение фундаментальных задач не представляет интереса для коммерческих сфер деятельности, за редким исключением, когда мы говорим о крупных технологических гигантах, зависящих в стратегии своего развития от новшеств и открытий, появление которых можно лишь прогнозировать с определенной вероятностью.
Итак, программный инженер использует в своей деятельности проверенные и подтвержденные достижения науки, ориентируясь на воспроизводимость практических результатов. Он должен давать четкие и обоснованные прогнозы о том, когда станет возможным использовать плоды его трудов. Без понимания временной точки, в которой результаты инженерной деятельности будут доступны для практического применения пользователями его продукта, программной инженерии не существует. Это основное, что должен осознавать специалист, решивший стать программным инженером.
Чтобы давать прогнозы, перерастающие в оценку с определенной долей погрешности, нужно осознавать всю сложность, комплексность и взаимозависимость различных активностей, входящих в профессию программного инженера. Квалифицированный программный инженер не должен концентрировать свое внимание только на какой-то одной активности. Если такое случается, то востребованность инженера со временем становится все более и более "узкой", а его оценки касаются только каких-то специфичных этапов процессов программной инженерии и не могут быть востребованы для высокоуровневого управленческого планирования, лежащего в основе именно той практической деятельности, за которую инженер получает свое вознаграждение.
Программная инженерия — комплексная и сложная дисциплина. Ее изучение занимает годы, особенно когда мы говорим не просто, к примеру, о концентрировании только на процессах разработки, а обо всех активностях, без понимания которых не получится быть инженером в полном смысле этого слова. Инженер, умеющий применять на практике в различных ситуациях навыки программиста, аналитика, тестировщика или менеджера, является связующей нитью всех активностей программной инженерии, и без таких сотрудников не удастся создать по-настоящему успешный и востребованный продукт.
Материал, приведенный в этой книге, не претендует на полный и достаточный сборник обо всех активностях программной инженерии, но мы постарались дать их единое и целостное описание, которое будет полезно для тех, кто заинтересован в формировании полной картины деятельности программного инженера.
Возникновение идеи курса
Идею собрать разнообразный материал о программной инженерии и ее активностям в единый курс авторы вынашивали достаточно долго. С одной стороны, базовый курс по дисциплине "программная инженерия" — это достаточно очевидная идея, но, с другой стороны, авторам было гораздо проще в течение нескольких лет создавать отдельные курсы, посвященные разным активностям программной инженерии.
Специфичный материал, описывающий работу с рисками, архитектурное проектирование, методологии организации и управления коллективом разработчиков написать намного проще, так как есть четко сформулированная идея и набор источников литературы, которым можно дополнять конкретный практический успешный опыт. Описание отдельных видов активностей полезно, когда есть необходимость систематизации знаний и изучения деталей в определенном профессиональном направлении, но оно не дает понимания целостной картины деятельности, которая должна быть сформирована у каждого профессионала для понимания своего места в профессии, направлений своего личностного развития и совершенствования.
В тот момент, когда уже был накоплен определенный опыт и наработаны навыки по целому ряду активностей, авторы пришли к необходимости полной систематизации имеющихся данных с целью создания комплексного материала, полезного для тех, кто встал вместе с нами на путь высококвалифицированного программного инженера.
Нужно отметить, что идея этой книги родилась в ожесточенных спорах между авторами о сути и назначении программной инженерии. С одной стороны, была явная точка зрения, что программная инженерия — это сугубо теоретическая дисциплина, тезисы которой являются истинными и неоспоримыми. С другой стороны, был озвучен подход, который во главу угла ставит постоянные эксперименты и пересмотр, дополнение фундаментальных теорий инженерии в соответствии с текущими условиями реального мира.
Нам кажется, что эти точки зрения дополняют друг друга и только в их симбиозе можно достичь объективного представления о том, что такое программная инженерия во всей своей полноте и многообразии.
Семья и друзья
Идея — сама по себе очень значимая субстанция. А конструктивная идея — вдвойне важный умственный артефакт.
Но просто замысел так и остается призрачным замком без кропотливого и системного труда по его воплощению. Идея — это только 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).
Согласно SWEBOK, программная инженерия включает в себя следующие десять областей знаний:
- Требования (software requirements).
- Проектирование (software design).
- Конструирование (software construction).
- Тестирование (software testing).
- Поддержка и эксплуатация (software maintenance).
- Конфигурационное управление (software configuration management).
- Управление инженерной деятельностью (software engineering management).
- Процессы инженерной деятельности (software engineering process).
- Инженерные инструменты и методы (software engineering tools and methods).
- Качество (software quality).
Несмотря на устоявшееся понимание того, из каких активностей состоит программная инженерия, правовые требования к лицензированию и сертификации профессиональных программных инженеров во всем мире отличаются. Британское общество вычислительной техники (British Computer Society) выдает лицензии инженерам программного обеспечения, которые, будучи членами Общества, могут также стать "сертифицированными инженерами", а в некоторых районах Канады, например в Альберте, Онтарио и Квебеке, инженеры по программному обеспечению могут быть и "профессиональными инженерами" или "магистрами информационных систем" (ISP), однако никаких правовых требований для данных специализаций не существует.
В последние годы значимость инженерного образования постоянно пересматривается и корректируется. Современный программный инженер должен понимать, как именно научный и технический прогресс воздействует на общество в целом. Это знание необходимо для того, чтобы создаваемые им артефакты были востребованными у широкого круга пользователей и оправдывали свое целевое назначение. Поэтому его знания не должны ограничиваться только естественнонаучными и сугубо техническими дисциплинами. Программному инженеру следует разбираться в истории, экономике, социологии, психологии, литературе, искусстве. Только так, полагают многие эксперты, можно создавать оптимальные инженерные решения. "Современные студенты должны уметь совмещать естественные и информационные науки на нано-, микро- и макроуровнях, владеть профессиональной этикой и ощущать социальную ответственность, быть творческими личностями и новаторами, иметь развитые навыки устного и письменного общения. Они должны быть готовы стать гражданами мира и понимать, какой вклад могут внести инженеры в развитие общества", — сказал президент Национальной инженерной академии США Чарльз Вест.
Профессия программного инженера требует наличия обширных профильных и общих знаний для того, чтобы создавать качественные и востребованные продукты. Тип мышления инженера должен быть одновременно математическим, логическим, предрасположенным к анализу и синтезу.
Для успешного выполнения своих профессиональных обязанностей инженер должен обладать следующими чертами характера:
- Аккуратность, иногда граничащая с педантичностью.
- Ответственность и усидчивость.
- Креативность и наличие пространственного воображения.
- Целеустремленность и инициативность.
- Уверенность в своих силах, умение отстаивать обоснованную точку зрения.
Программный инженер — это призвание. Удовлетворить все перечисленные требования способен тот, кто готов часами выполнять сложные вычисления, искать варианты решений поставленной задачи. Инженер регулярно посещает профильные форумы, курсы, повышает квалификационные показатели и приобретает новые умения.
В ответ на эти действия профессия инженера предоставляет следующие преимущества:
- Повышающийся престиж профессии
- По статистике, 80% людей, получивших профильное образование, трудоустраиваются в течение 3–6 месяцев. Благодаря разнообразию предложений от работодателей молодой специалист может выбрать наиболее интересное для него направление.
- Рост заработной платы при условии постоянного повышения профессионализма
- В случае необходимости дипломированный инженер в России всегда может повысить свои квалификационные показатели за счет обучения на коммерческих и бюджетных форумах или курсах. Люди, которые всегда готовы совершенствоваться в данной отрасли, способны занимать ключевые позиции на предприятиях с мировым именем.
- Относительно четкий перечень должностных обязанностей программного инженера
- Он зависит от направления его деятельности, поставленных задач и условий функционирования конкретного предприятия. Чаще всего такие сотрудники работают по собственному графику, который позволяет им равномерно распределить свои силы и максимально быстро добиться поставленной цели.
У должности программного инженера имеются и отрицательные стороны:
- Монотонность выполняемой работы, которая требует особой концентрации
- Малейший просчет работника или совершенная на практическом этапе ошибка создают риск снижения эффективности производства.
- Получить образование в этой области не так просто
- Мало поступить в выбранный вуз и окончить его — надо еще и посвятить несколько лет изучению ряда сложных смежных дисциплин.
Социологические исследования, проводимые как на территории СНГ, так и в странах Европы и Америки, показывают, что инженеры ориентированы на обмен идеями, мнениями, опытом. Внутри каждого профессионального сообщества, несмотря на то, что во многих современных компаниях введена индивидуальная оценка достижений, люди стремятся к взаимопомощи, обмену знаниями, коллективной деятельности. К примеру, одна из лидирующих современных культур организации коллективного труда — Agile — основным условием своей эффективности считает необходимость постоянного обучения, доверия внутри самоорганизующихся рабочих групп и делегирование принятий решений квалифицированным специалистам.
Непрерывное развитие разнообразных технологий в инженерной индустрии повышает уровень автоматизации и дифференциации труда. Это приводит к определенной индивидуализации, но значимость сообщества, в котором обсуждаются общие проблемы, достижения и совместно ищутся решения наиболее сложных и запутанных задач, только возрастает. Продукты инженерной мысли требуют коллективных усилий, а значит, постоянных и эффективных коммуникаций, и овладение техниками этих коммуникаций есть одна из главных задач программного инженера.
Многие эксперты полагают, что сегодняшний выпускник технического вуза должен уметь планировать, проектировать, производить и применять комплексные инженерные объекты, процессы и системы с добавленной стоимостью в современных условиях командной работы. Более того, он должен иметь компетенции, которые позволят ему управлять всеми этими процессами.
Для инженера важно осознавать, анализировать свой рабочий процесс, рефлексировать над ним и результатами своего труда, стремиться постоянно расширять существующие границы инженерного отношения к действительности. Понимание истоков и смысла технического творчества является одним из путей самоопределения инженера, формой развития инженерного сознания, источником развития. В процессе рассмотрения требований к профессиональным и личностным качествам инженера прежде всего следует выделить необходимость развития технического мышления, которое является синтезом мышления логического и образного. Далее мы рассмотрим, как "гуманитарные" подходы, техники и методы помогают развитию инженерного мышления. Также полезны в этом и строго технические подходы, дающие предсказуемый результат. При этом следует отметить, что техническое мышление является специфическим следствием как научного мышления, так и особого практического, экспериментального мышления.
Отдых
Сделаем небольшое отступление от темы программной инженерии и поговорим о такой важной вещи в жизни инженера, как отдых.
Жизнь, окружение, амбиции ставят перед нами цели, к которым мы стремимся. Но любое стремление должно быть разумным, ограниченным по времени и вкладываемым в него усилиям. Наша рабочая жизнь складывается из постоянных стремлений "разной степени тяжести". После того как ряд стремлений удовлетворен, необходимо восстанавливать силы для того, чтобы поддерживать и развивать новые стремления. Ведь очень часто мы ведем себя так, будто нам отпущен неисчерпаемый запас сил. Здоровье — это то, чего мы не замечаем, когда оно есть, и то, что становится заметным, когда оно исчезает. Необходимость в отдыхе появилась значительно раньше, чем человек осознал его значение — прекращение своей физической и умственной деятельности на какое-то время, чтобы дать возможность организму пополнить запасы энергии.
Отдых — это набор мероприятий по восстановлению физических и духовных сил для последующего более эффективного выполнения своих функций. Современная медицина считает, что смена вида деятельности человека позволяет уберечь организм не только от пагубного однообразия и монотонности, но и от физического истощения. К отдыху надо подходить, сознавая, что отдыхать надо прежде всего от физических действий, нервного напряжения или длительного скованного психологического состояния. Поскольку для нашего времени характерно отсутствие необходимости во время работы вкладывать мускульную энергию, человеку в часы досуга следует быть физически активным, взбодрить деятельность сердца, оживить обменные процессы организма. Такой отдых обеспечивается зарядкой, бегом, прогулками, спортивными и подвижными играми.
Для полноценного отдыха необходимо кардинально менять поток получаемых ощущений: для городского жителя будет полезным на время уезжать подальше от города, в сельскую местность, на море, в горы и т. п. Это позволит разгрузить главные мозговые центры и дать им передышку.
Кроме краткосрочного утомления существует и долгосрочное — еще более опасное для человека. Оно возникает при однообразном воздействии окружающей среды и склонно накапливаться в течение месяцев и даже лет. Если симптомы краткосрочного утомления всегда более или менее очевидны — усталость, сонливость и т. д., то симптомы долгосрочного утомления часто остаются непонятными и оттого незамеченными. Это может быть повышенная раздражительность, равнодушие, апатия, заторможенность.
Корреляция между трудом и отдыхом в короткий промежуток времени прослеживается очень просто: если ночь не спал — днем гудит голова, сложно сфокусироваться на чем-то, сосредоточенно работать.
Более длительные напряженные трудовые фазы, период которых составляет несколько месяцев, отследить значительно сложнее. Часто в планировании рабочего времени подобные фазы не учитываются. Человек наивно полагает, что будет одинаково продуктивен на протяжении длительного интервала времени.
За любой активной фазой наступает период так называемого "бездействия". Основные симптомы того, что у вас начался период бездействия:
- Спадает привычная продуктивность.
- Замедляется мыслительный процесс. Иногда тяжело вспомнить какое-то слово.
- Теряется интерес к исследованиям, новым направлениям.
- Сложно сосредоточиться, путаются мысли.
- После пробуждения быстро наступает усталость.
Если вы заметили у себя эти симптомы, это значит, что вам необходим отпуск.
Нужно сказать, что физиология человека в этом вопросе не соответствует принятому общественному мнению о том, что отпуск нужен не более чем один раз в год, независимо от типа работы, будь то интеллектуальный или физический труд. Если человек не знает об этом своем физиологическом свойстве, он начинает думать, что с ним, бедолагой, что-то не так и искать проблему в себе, переживая по этому поводу. Или же бодриться и через силу пытаться заставить себя работать (что может привести к бессоннице, нервозности, депрессии и даже расстройству психики). Но это еще не самое интересное. Было отмечено, что:
- наступление периода бездействия зависит от нагрузки в период работы;
- выход из фазы бездействия зависит от качества отдыха.
Работать на всю катушку можно максимум 2–2,5 месяца, после чего наступает период практически полного бездействия.
Если отдыхать активно (проводить большую часть времени на природе, подальше от привычных условий работы), то на восстановление сил уходит около полутора месяцев. При пассивном отдыхе (более долгом сне, участии в форумах, чтении статей/новостей, просмотре фильмов и изредка какой-то деятельности) на пополнение энергии уйдет несколько месяцев. В любом случае не рассчитывайте на быстрое восстановление сил: процесс отдыха измеряется месяцами, но никак не днями.
Для чего приведена вся эта информация?
- При планировании времени на рабочие и учебные проекты учитывайте, что ваши силы через определенное время иссякнут и вам будет необходим отдых, выраженный в кардинальной смене привычной жизни, привнесении в нее новых, непривычных активностей.
- Если вы не властны над своим временем и от вас требуется работать более 8 часов каждый день, то ищите возможность не работать в полную силу, в меру "отлынивать" от работы, проводя время в непродолжительных прогулках (20 минут) или какой-либо физической активности.
Отдых и отпуск — это время, которое необходимо, чтобы "переключить себя на другой режим", который нужен нам для ощущения полноценности, гармонии с самим собой и своей жизнью, для переживания разнообразных эмоций, получения новых впечатлений, для физического и психологического здоровья. Отпуск может быть не только летом, не обязательно две недели, не обязательно на море, но он должен быть.
Рассматривая варианты отдыха, ориентируйтесь на реальные возможности — свои и своей семьи, своего окружения. Принимайте реальность такой, как она есть, ищите для себя новые, лучшие и разнообразные варианты.
Научитесь отпускать свои убеждения, привычки и привязанности. Мы все себя до конца не знаем. Познавать себя и радости жизни можно не только на дорогих курортах и в далеких странах. Вы можете сильно (и приятно) удивиться, обнаружив, что в соседнем городке есть интересные места, а за ним — леса и озера.
Отдых является таким же необходимым для человека, как сон и питание. Он входит в понятие заботы о себе и своем жизненном равновесии. Чтобы соблюдать баланс, необходимо меняться, гибко и пластично перестраивать свое поведение и свои предпочтения под новые условия, ведь окружающий мир постоянно меняется.
Качество жизни повышается тогда, когда мы о ней заботимся, вкладываем свое внимание и время в эмоциональные переживания, а не застываем в напряжении, страхе, раздражении и обидах. Отпуск — это то, что помогает нам всем пополнить запасы положительной энергии, хорошего самочувствия, восстановить здоровье.
Этого запаса может хватить надолго — для продуктивной работы, построения хороших отношений, самореализации, развития. Но только при условии, что вы действительно отдыхаете.
Отпуск — это переключение на другое, это переживание другого, это пребывание в другом. А вот каким оно будет, это другое, — вы выбираете сами.
Стремление сделать что-то конструктивное
Инженер — это не просто профессия. Это нечто большее — воспитание, жизненная философия, образ жизни, мысли. Настоящий инженер рождается в тот момент, когда у него появляется стремление сделать что-то конструктивное и полезное — сначала только для себя, затем для семьи, друзей и, наконец, для всех окружающих.
Во время одного из семинаров по техноинновациям в Лаборатории экономико-социологических исследований НИУ ВШЭ социологи представили итоги исследования личностей инженеров, занимающихся инновационным предпринимательством. Опрос проводился в четырех странах: Тайване, Южной Корее, России и Финляндии.
Выяснилось, что для российских инженеров моменты, связанные с творчеством, креативностью, созданием чего-то нового, важнее, чем просто заработок. Для программных инженеров из других стран мир творчества менее важен. "Заработок для наших технарей, безусловно, важен, но еще значимее, чтобы получаемые деньги были связаны с производством чего-то нового. И в этом смысле они — наследники мира вдохновения, преемники советской научно-технической культуры", — констатировал Роман Абрамов, руководитель проведенного исследования.
Советская инженерия многое взяла от советского идеализма, который стал особенно проявляться в начале 1960-х годов. Одна из характерных черт того времени — это, например, постоянные переработки. Не работа от звонка до звонка для того, чтобы решить какую-нибудь узкую проблему, а творческий процесс, поиск вариантов решений, направленный на создание чего-то масштабного и полезного, того, у чего не бывает временных границ. Советская инженерная смекалка — феномен, который появился благодаря симбиозу фундаментального, универсального, широкого советского технического образования и плохого менеджмента конструкторских бюро. Зачастую инженерам приходилось работать без необходимых материалов и ресурсов. Это приводило к тому, что они вынуждены были выкручиваться и придумывать нестандартные решения, поддерживаемые имеющимися на производстве материалами.
Важная особенность инженерной культуры России — стремление изобретать сложные, нестандартные, творческие подходы, а не просто решать стандартные проблемы в рамках своей узкой области.
Основной минус такого подхода — отсутствие по-настоящему глубоких знаний в узкой области, которой занимается сотрудник. А основной плюс — в универсальности. Подобные специалисты-"эрудиты" успешнее и быстрее создают что-то новое.
"В будущем у нас в стране будет движение в сторону узкого специалиста по западной модели", — считает Абрамов. "Я брал интервью в одной инновационной компании, которая поставляет техническое оборудование для нефтегазовой отрасли. Все взрослые инженеры говорят, что молодые специалисты, которые приходят к ним на работу, — хорошие, но другие. Они нацелены на решение более узких, конкретных проблем", — отмечает он обозначенную тенденцию к последующей специализации.
По нашему мнению, одна из задач системы высшего образования заключается в переосмыслении важности специализации и корректировке в сторону синтезирования смежных дисциплин — не за счет отхода от освоения конкретных дисциплин, а за счет дополнительного образования и повышения квалификации, как важной части сертификации программных инженеров в частности и инженеров всех специальностей в целом. Именно таким образом развивается медицинское образование, когда врач имеет право на полноценную практическую деятельность только после окончания ординатуры. Иначе узкая специализация приведет к тем же недостаткам и глобальным кризисам, которые в наше время испытывает весь западный мир.
Согласованность и значимость создаваемых решений прежде всего зависит от конструктивной цельной картины не только конкретного решения, но и его операционного окружения, метасистемы и использующих его систем.
Конструктивное взаимодействие — это рабочий принцип, аппаратный или программный артефакт (сервис, продукт), призванный полноценно и комплексно решать какую-то наболевшую проблему, с которой сложно справиться в рамках заданных условий.
Конструктивное взаимодействие проявляется в личностных сферах: интеллектуальной, эмоциональной, волевой, психической. Традиционно выделяют три признака конструктивного взаимодействия:
- Целенаправленность и мотивированность.
- Согласованность и организованность.
- Целостность и структурированность.
Конструктивное взаимодействие проходит три основных этапа развития:
- сознание и принятие цели;
- теоретическое, алгоритмическое решение задачи и вступление во взаимодействие, разработка плана действий;
- анализ и проверку результативности организации предложенного взаимодействия.
Современная программная инженерия полностью приняла факт того, что важно не только произвести товар, услугу, изделие, но еще и представить его. А это значит, что появляется необходимость налаживать коммуникации не столько внутри профессионального сообщества, сколько "снаружи". Многие инженеры принимают участие в профессиональных выставках, профильно-отраслевых конференциях. Они начинают ощущать себя полноценными участниками большой рыночной игры. В этом есть вызов отрасли, большое поле для исследований и решения многих универсальных и специализированных проблем, которые позволят выйти на качественно новый уровень профессиональной зрелости.
Как ориентироваться в оформлении книги
В этом курсе большое внимание уделено визуальному оформлению информации, которая, как мы верим и надеемся, должна быть всецело воспринята и переосмыслена читателями. В дальнейшем они смогут использовать эту информацию в практической деятельности по своему усмотрению, отталкиваясь от конкретной инженерно-рабочей ситуации.
Визуальные материалы не только имеют своей целью представить конкретные данные для их лучшего запоминания, но и разработаны так, чтобы выполнять роль памяток, каждая из которых пригодится в конкретных условиях использования. Эти памятки каждый из вас сможет забрать с собой, а если будет желание — то и дополнить, расширить, сделать их более комплексными и поделиться ими с нами. Мы с нетерпением будем ждать их от вас по обозначенным каналам связи с авторами для последующего публикования.
Ниже перечислены стили форматирования данных, диаграммы, графики, таблицы, а кроме этого — множество дополнительной инфографики для каждой отдельной ситуации.
Ключевые эксперты области программной инженерии
Таким образом будут представлены фотографии, картинки с ведущими экспертами, которые сформировали и/или продолжают формировать текущий облик области программной инженерии и отдельных активностей, входящих в нее.
![](1_03.jpg)
- Волк
- Его вклад в развитие советского мульткинематографа сложно переоценить. Во многом повадки и характер этого киногероя были заимствованы у персонажа Тома из американской мультсаги "Том и Джерри".
Акцентирование внимания на отдельных моментах
Ключевая идея абзаца
Подчеркивает основные тезисы.
Уделить особое внимание
Пункты, изучению которых следует уделить особое внимание для наработки последующих практических навыков.
Дополнительная литература
Позволит дополнить и расширить тезисы и информацию, приведенные в курсе.
Метафоры, дополняющие сложный материал
Приводятся на бытовом языке для прояснения самых непонятных новичкам пунктов.
Информация для последующего обдумывания и размышлений
Приводится в "воспитательных" целях для пробуждения дополнительного интереса к излагаемому материалу.
Идеи, которые могут быть положены в основу личных проектов
Даются для возможности дальнейшего совершенствования по приведенному материалу.
Работа с шрифтами
Жирным шрифтом будут выделяться ключевые слова и термины, значение которых нужно будет сверять со словарем.
Подчеркнутым шрифтом будут выделяться предложения и комментарии, наиболее простые и базисные, которые можно сразу включить в свою профессиональную лексику, если этого до сих пор не произошло.
Комбинированный шрифт заслуживает самого большего внимания и служит для того, чтобы предостеречь читателей от основных и наиболее распространенных профессиональных ошибок.
Финализирующая информация Mind Map
Диаграммы Mind Map являются отличным инструментом, помогающим в запоминании и конспектировании наиболее важной информации, сохраняя при этом ее структурную целостность для последующего использования.
Мы постоянно используем этот инструмент для составления финализирующих презентационных слайдов или в ситуациях, когда нужно на одном листе собрать разрозненные данные в единую и целостную картину, систематизировав свои наработки.
В нашем курсе мы будем использовать этот артефакт для того, чтобы подвести итоги отдельных глав и курса в целом.
Прочее
Иллюстрации в виде схем будут использованы для подачи наиболее сложного материала в упрощенном и понятном виде.
Иллюстрации в виде инфографики применяются для визуализации наиболее значимого материала в шуточной форме, с целью повышения уровня внимания к ним слушателей и более качественного запоминания приведенного материала.
Модели BPMN используются для того, чтобы сложить разрозненные этапы в единое процессное представление, чтобы появился конкретный материальный артефакт, на основе которого можно приступить к системной работе над смоделированным процессом.
Работа над модельюBPMNдолжна приводить к повышению зрелости, оптимизации (в конкретных заданных условиях) разработанного представления процесса.
Именно для составления понятных и однозначных процессов мы и будем использовать этот вид диаграмм.
Матрицы принятия решений (DMN). Этот тип нотации выполняет роль итоговых матриц, в которых должны быть собраны основные варианты, приводящие к достижению конкретного результата, и условия, каждое из которых выполняется или нет для приведенного варианта.
Этот тип нотаций мы будем использовать для однозначной параметризации условий и вариантов развития инженерной ситуации, чтобы каждый читатель смог принять оптимальное для себя решение и понять целостность технологии, о которой будет идти речь.
Обратная связь с авторами
Мы заинтересованы в формировании профессионального сообщества, в котором можно будет делиться своим опытом, знаниями и навыками друг с другом и с сообществом в целом. Поэтому мы активно работаем над профессиональным порталом, где каждый сможет внести свою лепту в развитие направления "программная инженерия".
Каждому профессиональному направлению будет предоставлена своя площадка для формирования базы знаний и профессионального общения, но при этом отдельные активности будут собраны в единую и комплексную (как структурно, так и функционально) архитектуру.
Один человек, каким бы сильным духом, знающим и профессиональным он ни был, не сможет сделать что-то по-настоящему большое и значимое. Сила знаний — в их постоянном обогащении и передаче тем, кто их жаждет. Помните об этом, и ищите возможности научить тех, кто искренне в этом заинтересован, тому, что знаете сами на высоком профессиональном уровне.
Сейчас давать какие-то адреса и координаты для общения будет преждевременно, но к окончанию курса мы создадим ряд каналов (электронная почта, несколько социальных сетей, портал), по которым можно будет направлять свои замечания, комментарии и пожелания авторам этой книги.
Мир не стоит на месте, и мы стараемся ему соответствовать, стремясь с каждым днем становиться все лучше и лучше. И конечно, это не последний наш курс, в котором мы поделимся с широкой аудиторией своими систематизированными и выдержанными наработками.
Что и как делать не рекомендуется
В начале выбранного пути очень важным является не зацикливаться на совершенных ошибках, которые непременно будет делать инженер, какой бы квалификации он ни был (просто у этих ошибок будет разная природа возникновения и разные по силе последствия), но стремиться к постоянному экспериментированию в рамках имеющихся ресурсов. При этом важно не совершать раз за разом одни и те же ошибки. Постарайтесь преодолеть те ваши недостатки, из-за которых вы их совершаете. Это вполне возможно — при надлежащей самодисциплине.
Итак, перечислим то, чего делать не рекомендуется.
- Работать без планирования
Качественный продукт очень редко создается "на коленке" — он требует основательной и хорошо подготовленной работы над ним.
Продукт программной инженерии должен проходить следующие стадии:
- Формирование идеи.
- Проработка, проверка идеи на полезность и возможность реализации.
- Планирование работ.
- Разработка.
- Проверка (верификация и валидация).
- Улучшение (рефакторинг).
Каждому из приведенных пунктов следует уделить определенное количество усилий и времени. Новички склонны создавать продукт без предварительных раздумий. Это может работать на маленьких, некритичных, автономных приложениях, но на крупных проектах с большой долей вероятности обернется против создателя.
"Если ты зол, сосчитай до 10, прежде чем говорить. Если очень зол — то до 100" (Томас Джефферсон). Для нашего случая это следует перефразировать так: "Когда проверяешь код, сосчитай до 10, прежде чем переписать 1 строчку. Если для этого кода нет тестов — то до 100".
Прежде чем сказать что-то важное, вы обдумываете слова, чтобы потом не жалеть о сказанном. Так же избегайте написания непродуманного кода, за который однажды вам будет стыдно. Слова и код — это отображение мыслей программного инженера.
Программирование — это не просто написание строк кода, а творчество, основанное на логике и требующее непрерывного развития.
Программная инженерия — это на 90% изучение существующего продукта и его изменение посредством маленьких, легко тестируемых порций, вписывающихся в общую систему. Написание кода — это всего лишь 10% работы программного инженера.
Увлекаться чрезмерным планированием
Планировать, прежде чем нырять в написание кода, — хорошая практика. Но хорошие практики будут вредить, если не знать меры и слишком ими увлекаться.
Водой можно отравиться, если выпить ее слишком много.
Идеальный план — вещь идеальная и, как следствие, не существующая. Ищите достаточно хороший план для старта. Любой план изменится очень быстро, зато он заставит вас придерживаться спланированной структуры, которая облегчит дальнейшую работу.
Полное планирование всей программы "от А до Я" (водопадным методом) для большинства программных продуктов не годится. Разработка подразумевает непрерывную обратную связь от пользователя, и разработчик постоянно должен удалять и добавлять функционал, чего никак нельзя учесть при "водопадном планировании". Планировать следует несколько следующих элементов, структура и требования к которым абсолютно понятны и реализуемы. Каждый новый элемент надо включать в план лишь после конечной адаптации к рабочим процессам пользователей. Поэтому к планированию надо подходить вдумчиво и ответственно. Его недостаток, так же как и избыток, может принести вред.
Недооценивать важность приемлемого качества
При написании кода главными его параметрами, на которых стоит сосредоточиться, являются читабельность и понятность. Непонятный код — это не просто мусор, а мусор, который практически невозможно без проблем переработать. Смотрите на программу как на составные части, связанные общим алгоритмом. Качество вообще вещь загадочная и иллюзорная. Абсолютного качества не бывает, но уровень качества для данной конкретной ситуации оценить несложно. Оно идет от уровня заказчиков, уровня команды. И задача каждого разработчика — придерживаться принципа бойскаута: "Всегда оставляйте лагерь чище, чем вы его застали". Это может каждый.
"Пишите свой код так, будто его будет сопровождать агрессивный психопат, знающий, где вы живете" (Джон Вудс)
Не используйте слишком длинные строки. Строку длиннее 80 символов очень трудно читать. Пользуйтесь специальными инструментами для приведения кода в порядок — в каждом фреймворке их предостаточно. Следите за количеством строк в функциях и файлах. Разделяйте код на мелкие части, понятные и тестируемые. Функция больше 10 строк — слишком длинная. Не используйте двойное отрицание. Не не делайте так. Это очень плохо. Давайте переменным осмысленные, информативные, однозначные названия. Не используйте короткие, общие или опирающиеся на тип названия.
"В компьютерных науках есть только две по-настоящему сложные вещи: инвалидация кэша и именование переменных" (Фил Карлтон)
Используйте константы с содержательным названием для хранения примитивов. Не используйте "костыли" в коде ради экономии времени. Не бегите от проблем, смотрите им в лицо и побеждайте их.
Краткий код в большинстве случаев лучше длинного. Но стремление к краткости не должно вредить читабельности.
Не используйте мудреные операторы, понятные только вам, чтобы уложиться в одну строчку. Но и не удлиняйте код без особой надобности. Удаление ненужного кода — это лучшее, что вы можете сделать для улучшения любой программы.
"Измерять программирование строками кода — то же самое, что измерять авиастроительство тоннажем произведенных самолетов" (Билл Гейтс)
Не перебарщивайте с условной логикой.
Очень часто то, что хочется написать через условие, можно написать иначе, и это улучшит читаемость кода.
Не переживайте за оптимизацию, пока ее необходимость не станет явным.
Хвататься за первое решение
Новички, столкнувшись с проблемой, склонны хвататься за первое попавшееся решение, не подумав о побочных эффектах в перспективе. Хорошие решения, в отличие от первых, появляются тогда, когда вы находите разные решения и подбираете из них самое оптимальное для себя. Не перебарщивайте с раздумыванием, но и не стремитесь использовать первый попавшийся способ.
Если у вас не укладывается в голове, что у проблемы может быть несколько решений, значит, вы плохо понимаете саму проблему.
Ваша задача как профессионального инженера — найти не первое попавшееся решение, а самое простое и понятное в ваших рабочих условиях, то, которое наиболее просто реализуется, эффективно работает и легко поддерживается.
"Есть два пути написания программы: 1) сделать ее настолько простой, что в ней, очевидно, не будет недостатков; 2) сделать ее настолько сложной, что в ней никакие недостатки не будут очевидными" (Тони Хоар)
Не отступать
Другая частая ошибка начинающих инженеров — не отступать не при каких обстоятельствах, даже когда они поняли, что выбранное решение — не самое лучшее. Подход "не отступать и не сдаваться" хорош во многих сферах, но не в инженерии. Инженерам очень полезно признавать ошибки как можно раньше и чаще, чтобы изменить свое решение в сторону более подходящего для конкретной ситуации. Как только вы засомневались в решении — отбросьте его и постарайтесь переосмыслить проблему. Неважно, сколько вы вложили в этот путь, — на этом пути вы уже собрали необходимый опыт. Слишком много отрицательного опыта — это не позитивно. Не цепляйтесь за свое творение только потому, что вложили в него много времени и сил. Плохой код, модуль, артефакт должен быть отброшен ради хорошего.
- Не искать информацию в открытых и доступных источниках
Если вы не ведущий инженер самой передовой и инновационной компании в мире, то очень велика вероятность, что с вашей проблемой уже кто-то сталкивался. Ищите информацию в Интернете, чтобы сэкономить драгоценное время команды. В процессе поиска часто оказывается, что проблема чуть шире/уже, чем мы себе представляли.
Даже если вы уверены в том, что знаете все, Интернет удивит вас многообразием дополнительной информации.
Но у этого есть и обратная сторона медали. Новички любят принимать чужие решения за то, что им нужно, и бездумно копируют чужой материал. Это приемлемо только в том случае, если вы полностью ознакомились с найденным материалом и адаптировали под решение конкретных специализированных задач.
- Планировать неизвестное
Когда вы пишете новую строчку кода, как правило, начинают лезть мысли "а что, если…". И тут вы начинаете фантазировать о разных новых возможностях, которыми можно украсить программу. В большинстве случаев такие мысли вредны — на них не стоит ориентироваться.
Пишите только тот код, который вам нужен сегодня. Не пишите код, который, возможно, пригодится когда-то потом.
Всегда пишите минимум кода, необходимого сегодня и для конкретной текущей задачи. Конечно, предугадывайте и обрабатывайте экстремальные случаи, но не создавайте экстремальный функционал.
"Рост ради роста — это идеология раковой клетки" (Эдвард Эбби)
- Не писать тесты
Даже если вы специально не пишете тесты, вы тестируете свою программу вручную. Но если вы действительно считаете, что для программы не нужны тесты, то вы абсолютно точно новичок в программной инженерии.
Если вы честно восстановите картину создания программы, то отметите, что каждый раз, когда реализуется сложный фрагмент кода, вы проходите его в дебаге и отслеживаете верность результатов. Это делают все, и это хорошо.
После того как тест проделан вручную, имеет смысл вернуться к редактору и написать тест, который автоматически повторит те же самые действия, ожидая необходимых ответов.
По мере разрастания проекта/приложения у автора вряд ли войдет в привычку прогонять все тестовые кейсы, а вот пакеты автоматизированных тестов точно будут выполняться всегда, сигнализируя автору о возможных проблемах.
Если можете, создавайте проверки даже прежде самого кода.
Разработка через тестирование (TDD) влияет на то, как продумывается логика модуля, проектируются и реализуются программные элементы.
- Не подвергать сомнению существующий код
Как бы это ни было обидно и некомфортно, но в развивающемся мире программной инженерии одиночки не выживут.
Программные инженеры обязаны работать в команде и сообща.
Каждому время от времени приходится сталкиваться с кодом, назначение и логика которого будет не очевидна с первого взгляда. Новички в этой ситуации склонны обходить существующий код стороной, но это не лучшая практика.
Если вам надо добавить новый функционал в приложение, думаете ли вы в первую очередь о себе или о конечном пользователе? Если не только о себе, то вам необходимо понять, как работает текущее приложение и как созданная Вами функциональность будет влиять на него и работу в нем пользователей.
Будьте профессионалом, который смотрит на приложение глазами пользователя, ощущает его нужды и предугадывает его поведение.
Новички думают, как бы проще засунуть новый функционал в уже существующие элементы. А профессионал думает о том, как сделать его удобнее для нахождения и использования.
- Не подбирать правильные инструменты
Программная инженерия — это ремесло. Один из параметров успешности ремесленника — набор и удобство инструментов, которыми он пользуется при работе. Каждый из инструментов прекрасен для какой-то своей определенной задачи, а для другой он не подходит и может только навредить.
Молотком забиваются гвозди. Отверткой вкручиваются шурупы. Не наоборот.
Популярность инструмента не должна приводить к мысли о его универсализме. Главный параметр для выбора инструмента — это его специализация и пригодность.
Если вы знаете мало инструментов, то даже "лучший" из вашего списка по факту не обязательно будет таковым. Поэтому надо расширять свой кругозор и быть готовым браться за новые инструменты.
Профессионала характеризует то, насколько мастерски он может обойтись ограниченным набором инструментов, но это больше показатель мастерства, а не рабочий принцип. Построить дом только с помощью молотка можно, но нужно ли это? Проще и дешевле будет вложиться в набор разных инструментов, перепортить меньше строительного материала и затратить минимальное время на создание качественного сооружения.
- Изобретать колесо
В программной инженерии время от времени полезно изобретать колеса нужной формы. Это стремительно меняющаяся сфера знаний. Никакая команда не может угнаться за всеми обновлениями и новыми требованиями. Например, если нам нужно колесо, меняющее скорость своего вращения в зависимости от времени суток, то вместо переделки обычного колеса есть смысл сделать его заново. Но если вам нужно колесо для его обычных целей, то, пожалуйста, используйте обычное колесо.
В то же время, если вам нужно только колесо, не надо покупать для этого целую машину и прикручивать ее целиком к другой машине на место колеса. Не подключайте целую библиотеку ради одной-двух функций.
- Пренебрегать инспекцией кода (code review)
Инспекция кода — это не форма критики и не процедура унижения. Инспекция кода — это форма обучения, в результате которого происходит обмен знаниями и опытом. Не стоит воспринимать инспекцию как ненужный артефакт процесса разработки. С помощью этой процедуры учатся сразу двое — тот, кто осуществляет ревью и дает свои конструктивные предложения по изменению кода, и тот, кто прислушивается к обоснованной критике.
Надо принять тот факт, что программист — это вечный ученик, а инспекция кода — это одна из форм обучения.
Иногда сам "инспектор" ошибается, и тогда приходит ваш черед научить его чему-нибудь. Неправильное замечание могло возникнуть по причине неочевидности кода, и тогда, возможно, следует его доработать. Взаимный обмен знаниями крайне ценен для программистов и окупается многократно.
- Неправильно относиться к ошибкам
Ошибки — это хорошо. Они говорят о том, что инженер на правильном пути, и подсказывают, как добиться большего прогресса. Опытные программисты любят и уважают ошибки. Если вас раздражают эти маленькие прекрасные сообщения об ошибках — вам надо изменить отношение к ним.
Смотрите на ошибки как на помощников, сотрудничайте с ними, опирайтесь на них.
Некоторые ошибки следует превратить в исключения. А некоторые следует оставить как есть и позволить им уронить приложение и закрыть его.
Целостная картина личности инженера
Поговорим немного об исторических исследованиях профессии инженера. Ряд исследователей вопроса формирования и развития профессионализма, а точнее, его исходных психологических предпосылок, выявили следующие необходимые качества программного инженера (рис. 1.1 рис. 1.1):
- Сформированная мотивация на достижения, основанная на опыте социально подкрепленных успехов.
- Развитый волевой компонент психики, обеспечивающий возможность преодолевать как собственные внутренние противоречия, так и социально обусловленные препятствия достижения целей.
- Стрессоустойчивость.
- Наличие самоактуализирующейся тенденции в структуре личности.
- Креативность
- Способность созидать в ситуации неопределенности и дефицита ресурсов.
Также необходимо выделить внутренние и внешние условия, необходимые для формирования личности профессионального программного инженера.
К внутренним условиям относят:
- индивидуально-типологические свойства;
- темперамент;
- конституцию;
- базовый интеллект;
- набор потенциальных задатков и склонностей;
- наличие системных качеств, соответствующих возможности профессионального роста и развития;
- индивидуальную ресурсность человека;
- соответствие объекту управления;
- динамичность
- умение своевременно учитывать и предвосхищать изменения в сфере ответственности человека.
Внешние условия следующие:
- Наличие нетривиальной ситуации развития и контактов с яркими личностями как объектами подражания, оптимальное разнообразие стимулов социальной среды.
- Возможность удовлетворения потребности в самоактуализации, самосовершенствовании и самоуважении.
- Наличие препятствий, укрепляющих личность в процессе их преодоления.
- Наличие жизненных трудностей как способов усиления творческой адаптации личности и активизации ее духовного потенциала.
- Наличие фрустрирующих ситуаций как способов активизации личностного роста.
При этом требуется учитывать, что творческая составляющая программной инженерии является немаловажной и программным инженерам необходимо воспитывать в себе качества творческой личности. На основе исследования более 2000 биографий творческих личностей психологи составили следующий список этих качеств.
- Способность смело выбирать достойную цель, даже если она считается нереальной, и сделать ее главной целью в своей жизни.
- Умение видеть проблемы, решение которых необходимо и достаточно для достижения цели.
- Способность к планомерной работе, наличие рабочих планов на месяц, на год
- Регулярный контроль выполнения поставленных планов.
- Высокая работоспособность.
- Эффективные техники решения творческих задач, входящих в проблему.
- Умение при всех обстоятельствах отстаивать свои идеи.
Выделяя личностные особенности, которые необходимы инженеру, следует обозначить следующие (рис. 1.2 рис. 1.2):
- Долговременная выносливость
- Сопротивляемость усталости к концу дня.
- Выносливость к экстренному напряжению и перенапряжению, если приходится выполнять максимальный объем работ в экстренных ситуациях.
- Устойчивость и концентрация внимания, переключаемость внимания, т. е. способность сокращать время на "вхождение" в деятельность по выполнению новой задачи или одновременно нескольких задач.
- Сообразительность, способность быстро и дифференцированно воспринимать суть дела.
- Специальные знания по специфике выполняемой деятельности.
- Организационные способности
- Способность к рациональному планированию и организации выполняемой работы.
- Личная инициатива
- Готовность и способность решать проблемы по собственной инициативе.
- Способность к принятию решения и готовность отстаивать свои проекты, планы, разработки, несмотря на возможное сопротивление.
- Обладание навыками ведения переговоров, убеждения, что позволит адаптироваться к необходимому взаимодействию, умение убедительно аргументировать свои мысли, предложения и убеждать в необходимости применения рациональных решений.
- Умение качественно выполнять работу в ограниченное время, обладание навыками саморегуляции, умение кратко и четко излагать свои мысли, быть корректным, коммуникабельным в общении с коллегами, подчиненными и высшим руководством.
Кроме необходимых предпосылок и желания развивать требуемые навыки инженера, следует обладать огромным терпением, чтобы добиться профессионализма на этой стезе.
В извечном споре гениальности и дисциплины дисциплина всегда берет верх./eee
Именно при наличии самодисциплины любая задача будет решена. Основной залог успеха в любом деле — желание и настойчивость в его реализации.
Итак, "нулевая" глава получилась достаточно абстрактной, но очень насыщенной разнокалиберным материалом. В следующих главах мы будем поэтапно дополнять уже представленную информацию, что позволит вам углублять свое понимание программной инженерии как сферы деятельности, состоящей из различных, но самодостаточных активностей, каждая из которых является полноценной областью практических знаний. Все они в совокупности формируют единую дисциплину, которая призвана решать насущные задачи и проблемы в области информационных технологий.
Программная инженерия предлагает своему адепту подходы, шаблоны, методики, методологии, знания и все необходимые инструменты для создания востребованных и успешных программных продуктов. Это сложная, но вместе с тем интересная практическая сфера деятельности, популярность и значимость которой будут только расти. Вместе с множеством преимуществ работа в этой сфере имеет ряд недостатков, о которых необходимо знать, чтобы профессионально развиваться.
Программная инженерия — это бесконечно интересная и крайне сложная специальность. Для кого-то это минус, но те, кто решили связать свою жизнь с этой областью инженерии, видят в этом только плюс.
Каждую главу мы будем заканчивать рядом вопросов, отвечая на которые вы не только вспомните прошедший материал, но и поразмышляете о своем личном развитии и переосмыслении рабочих процессов. Приятного вам времяпрепровождения!
Вопросы для калибровки и самопроверки
- В чем состоит суть любой инженерной деятельности?
- Какие типы мышления необходимо развивать инженеру?
- Почему инженерная деятельность востребована на современных коммерческих предприятиях?
- Какие преимущества должен давать инженер своим работодателям?
- Каково назначение SWEBOK?
- Нужно ли постоянно использовать SWEBOK, или это в большей степени систематизация уже имеющихся знаний и опыта?
- Зачем инженеру нужен широкий кругозор знаний?
- Противоречит ли аналитический тип мышления синтетическому (синтезирующему)?
- Зачем необходимо время от времени отдыхать?
- Специализация или универсальность?
- Какие типы ошибок из приведенных в этой главе вы уже совершили?
- Какое, по вашему мнению, профессиональное или личностное качество является залогом успеха при освоении программной инженерии?