- Что такое программная инженерия
- Кто такой программный инженер
- Связь программной инженерии с другими дисциплинами
- Маркеры программной инженерии
- Программный инженер и программист: разница в создаваемых продуктах
- Стандарты программной инженерии
- Инструменты программной инженерии
-
Пройди тест и узнай, какая сфера тебе подходит:
айти, дизайн или маркетинг.Бесплатно от Geekbrains
Программная инженерия – широкая область знаний в сфере IT, охватывающая не только программирование, но также аналитику, менеджмент, проектирование программных комплексов и многое другое. Программный инженер отличается от программиста масштабом решаемых задач и подходами, которые для этого используются.
Сегодня это одно из наиболее перспективных направлений развития высоких технологий. Без инженерии невозможно создание сложных дорогих программных продуктов, которые решают не одну, а десятки проблем пользователей. Подробнее о том, что такое программная инженерия, какие задачи решает, вы узнаете из нашего материала.
Что такое программная инженерия
Термин «программная инженерия» или «технология программирования», как он звучал в СССР, появился достаточно давно, еще в начале 70-х годов XX века. В то время затраты на программное обеспечение стали сравнимы со стоимостью вычислительной техники (или, как ее называли, «железа»), поэтому потребовалось новое научное направление, в рамках которого удалось бы сократить время на разработку программ и снизить их стоимость.
Программная инженерия и программирование – это как профессионал и любитель. Научиться писать простенькие программы может любой желающий, скоро на это будут способны и носители «искусственного разума». Но такие «изделия» невозможно сравнить по качеству исполнения с фирменным программным обеспечением, особенно когда вопрос касается быстродействия, надежности и экономии вычислительных ресурсов.
Программирование – это составление перечня команд, управляющих входными данными для работы вычислительной системы. Результатом выполнения задания будет набор выходных показателей, указывающих на то, что созданная для конкретных целей сложная система функционирует нормально.
Программные инженеры – это профессиональные программисты, имеющие представление о том, какие процессы и ограничения применяются при разработке решений, как эти решения влияют на устойчивость и безопасность работы сложных систем, и способные создать программные продукты, качественно решающие поставленные задачи.
Связь программной инженерии с другими дисциплинами
Программная инженерия существует не в вакууме, а тесно связана с такими дисциплинами, как информатика и системотехника, и часто появляется следом за бизнес-реинжинирингом. Рассмотрим подробнее это направление программной инженерии.
Информатика (computer science) – научная дисциплина, в которой при помощи математических методов определяют формальные основы вычислимости. В нее входят математическая логика, теория грамматик, методы построения компиляторов, математические формальные методы, используемые в верификации и модельном тестировании и т.д. На первый взгляд информатика и программная инженерия между собой очень похожи, но прикладное применение каждой из дисциплин разное.
Программная инженерия имеет более практический характер и помогает решать проблемы производства, информатика – это научные разработки математизированных подходов к программированию.
Системотехника (system engineering) – это комплекс инженерных дисциплин, направленных на разработку и создание различных искусственных систем в энергетике, телекоммуникации, встроенных систем реального времени и т.д. Программное обеспечение в этом случае зачастую становится частью системы, управляя непосредственно оборудованием. Такие системы относятся к программно-аппаратным, поэтому программисты, разрабатывающие для них ПО, должны очень хорошо разбираться и в работе самой аппаратуры.
Бизнес-реинжиниринг (business reengineering) – это модернизация бизнеса в отдельно взятой компании за счет внедрения новых методов работы на базе современных информационных систем. Процесс может касаться внутреннего переустройства компании, либо направлен на создание нового клиентского сервиса. Чаще всего эти два процесса взаимосвязаны.
Бизнес-реинжиниринг обычно проводят перед внедрением информационной системы, чтобы упорядочить делопроизводство, а затем уже его автоматизировать.
Кто такой программный инженер
Программная инженерия обеспечивает появление на свет безопасных, надежных и качественных программных продуктов, не теряющих этих свойств в течение всего периода эксплуатации. Их сначала проектируют, затем пишут, тестируют и сопровождают в ходе решения пользовательских задач.
Основные составляющие программной инженерии:
- знакомство с сутью процесса и разработка его математической или физической модели (при необходимости);
- уточнение целей и задач, для решения которых должны использоваться программные методы, построение алгоритма программы;
- поиск готовых процедур и написание недостающих блоков для разработанного алгоритма решения задачи в одном из языков программирования;
- прогон, отладка (устранение ошибок), тестирование и сборка программного продукта.
входят в ТОП-30 с доходом
от 210 000 ₽/мес
Скачивайте и используйте уже сегодня:
Топ-30 самых востребованных и высокооплачиваемых профессий 2023
Поможет разобраться в актуальной ситуации на рынке труда
Подборка 50+ бесплатных нейросетей для упрощения работы и увеличения заработка
Только проверенные нейросети с доступом из России и свободным использованием
ТОП-100 площадок для поиска работы от GeekBrains
Список проверенных ресурсов реальных вакансий с доходом от 210 000 ₽
В ходе знакомства с постановкой задачи перед началом работы по созданию ПО программный инженер старается найти ответы на следующие вопросы:
- можно ли решить проблемы сложной системы путем использования только одной программы;
- какие конкретно задачи будут решать каждая из написанных или готовых программ;
- как можно ускорить решение задач с помощью привлечения уже готовых программных комплексов, написания новых программных блоков или их комбинации.
Когда станет понятно, будет ли это новый продукт с «нуля», или компоновка уже существующих процедур с написанием недостающих кодов, программный инженер ставит перед собой совсем другие вопросы:
- какие блоки ПО необходимо логически связать, чтобы они работали в новом продукте как единое целое;
- по каким критериям будут выбираться возможности дальнейшего расширения продукта;
- насколько доступным должен быть программный код и комментарии к нему, чтобы можно было разобраться в работе создаваемого программного продукта;
В ходе тестирования ПО возникают совершенно отличные от предыдущих вопросы, на которые надо найти ответ:
- может ли созданный продукт работать в условиях различной вычислительной техники, начальных временных установок, в разных операционных средах и программном окружении;
- показал ли тестируемый продукт свою эффективность в плане экономии ресурсов вычислительной техники, продемонстрировал ли он устойчивость в работе, надежность, аккуратность исполнения, удобство установки, обслуживания и сопровождения;
- удобен ли созданный продукт для пользователей;
- способен ли работать новый продукт при некорректном вводе начальных данных и в случае сбоев при взаимодействии объектов сложной системы;
- способен ли программный продукт улучшить защиту и безопасность от внешних воздействий, нет ли в нем не предусмотренных разработчиком возможностей или дефектов;
- сопровождает ли новый продукт все изменения и/или ошибки доступным для понимания любым пользователем сообщением;
- правильно ли ведется системный журнал, в котором фиксируются все возникающие ошибки, чтобы в дальнейшем их смог проанализировать и исправить любой приглашенный программист, а не только автор ПО;
- используется ли самый современный язык программирования, наиболее подходящий для оптимизации ПО в процессе создания нового программного продукта.
Маркеры программной инженерии
Кем можно работать в программной инженерии? Это не будет обычный программист, ограничивающий себя рамками простого написания программ. Кругозор программных инженеров гораздо шире и включает в себя такие категории, как удовлетворение потребностей и решение проблем. Ведь совершенно необязательно на каждом шагу писать программу.
Многие задачи можно решить с помощью уже существующих разработок или их комбинаций. А если действовать на опережение, то появления каких-то сложностей можно и вовсе избежать. Поэтому проектирование хороших программных комплексов требует предварительно составленного плана, чтобы в дальнейшем не возникало никаких проблем.
Прежде чем приступить к программированию, инженеру надо ответить на ряд вопросов:
- Какого результата я должен добиться?
- Что я могу еще сделать для решения задачи, кроме того, что напишу программу?
- Каким образом получение результата станет проще с помощью программы?
Качественные программные коды понятны, легко читаются, их можно дополнить новыми элементами, они замечательно работают с другими программами, сопровождение этого ПО не создает головной боли. При создании таких кодов неприемлемы громоздкие обходные пути, выбранные в силу каких-то личных причин.
Один из важнейших принципов инженерии программного обеспечения – возможность постоянного обновления продукта, которая закладывается еще на стадии его начального проектирования. Приложения расширяют, поскольку пользователям требуются новые возможности и хочется еще большего удобства применения.
Каждая отдельная часть ПО малоэффективна. Польза программного обеспечения проявляется в момент взаимодействия его компонентов друг с другом, когда они обмениваются данными и выдают нужный результат.
Все это должно учитываться при проектировании программ. Какие события они будут отслеживать? Какими сообщениями обмениваться с пользователем? Как будет организована авторизация?
Еще одна характерная черта качественных программ – это чистота кода, а не множество тестов или количество отчётов о покрытии. Простая проверка: этот код сможет прочитать другой инженер? Или еще проще: я, как автор этого кода, смогу прочитать его по прошествии некоторого времени?
Читабельность кода очень важна. К большому сожалению, хороших метрик чистоты кода пока не существует. Иногда помогают шаблоны и методики проектирования, но этого не хватает. Грамотные программные инженеры полагаются на свой опыт и интуицию, формируя в себе чутье на чистоту кода. Можно сравнить с талантом писателя: огромный словарный запас – это еще не гарантия того, что вы сможете написать связный и понятный текст.
Программы требуют отладки. Хорошее ПО позволяет делать это легко и просто. При возникновении в программах ошибок формируются понятные сообщения, на основе которых ведется единый журнал ошибок для последующего анализа с назначением ответственных за их исправление. Когда приходит отчет об очередной ошибке, специалист должен ее исправить и наладить работу ПО.
Скачать файлДля этого у него должен быть доступ в недра системы, чтобы отловить возникновение данной ситуации в любой момент времени, и возможность сверить полученные результаты от работы любой части системы.
Когда программные инженеры разрабатывают свои комплексы, они обязательно проводят проверку их работы в самых невероятных условиях – на вычислительной технике с разными ресурсами, в любой точке мира, на всех типах экранов. Например, если вы разрабатываете браузерное приложение, то оно должно работать во всех браузерах.
При разработке программного обеспечения инженеры стараются предусмотреть все варианты событий и протестировать их. Сначала проверяется работа приложения в штатном режиме, без каких-либо происшествий (happy path), а затем проводится тестирование возможных сбоев и ошибок. Иногда программисты пишут код для симуляции этих проблемных ситуаций, а затем уже пишут основной код, который успешно проходит тестовый режим.
Читайте также!
Программные инженеры понимают, что требования к ПО часто бывают размытыми и неполными. Талантливому инженеру надо знать не то, как написать решение, а что должно в него входить.
Программный инженер и программист: разница в создаваемых продуктах
Хорошие программные инженеры работают быстро и качественно, но за это они требуют достойную оплату. Сто раз подумайте прежде, чем попытаться сэкономить на приглашении опытных программистов. Чем более грамотного специалиста вы наймете, тем быстрее получите решения всех проблем, выполненные аккуратно и надежно, устойчивые и простые в сопровождении. А в не очень далеком будущем заметно уменьшатся и ваши общие расходы.
Каждая программа использует компьютерные ресурсы, которые стоят денег. Эффективность работы программного инженера состоит в том, что написанные им программы будут эти ресурсы расходовать очень экономно. Например, как один из способов – подключение кэширования для часто используемых данных. А кроме этого еще тысячи различных инструментов, помогающих ускорить выполнение программ и повысить их эффективность.
Решить задачу сможет и начинающий программист, но его программа обойдется вам гораздо дороже по сравнению с эффективным ПО опытного программиста.
Дело в том, что хорошие программные продукты изначально проектируются с точки зрения удобства пользователей (UX). С появлением современной вычислительной техники было проведено множество исследований и сделан ряд открытий на тему взаимодействия человека с компьютером. И чем больше информации удается получить, тем лучше могут быть создаваемые приложения.
Рассмотрим несколько примеров на предмет важности удобства использования:
- Если разрабатывается форма ввода адресов электронной почты, то в хорошей программе будут игнорироваться регистры букв и даже пробелы по краям. Пользователь не должен следить за клавишей CapsLock, программа и так знает, что e-mail состоит только из прописных букв. При вводе новых адресов должна стоять проверка на их корректность, а в случае ошибки пользователь сразу получает соответствующее уведомление. Это может быть и очевидная проверка на наличие символа «@», и выявление менее заметных ошибок, типа «gmail.cmo».
- Если для получения результата пользователь должен перейти по ссылке, то хорошая программа запомнит, откуда он перешел, и после выполненного действия вернет его обратно. Также удобная программа запомнит уже внесенные данные и выполненные действия, если в дальнейшем они понадобятся пользователю. Например, вы зашли на Expedia как гость и ищете нужный авиарейс, но потом все-таки решили создать аккаунт. Программа сохранит в нем предыдущую историю ваших поисков, чтобы вы могли ее просматривать, заходя с разных устройств.
- Хорошую программу проектируют с учетом потребностей пользователя. Поставьте себя на его место, а не просто навешивайте дополнительные функции.
на курсы от GeekBrains до 08 декабря
Важнейшие свойства приложений, по которым можно отличить работу профессионала от любителя – это такие процессы программной инженерии, как надёжность, защищённость и безопасность. Опытные программисты хорошо понимают, что все написанные ими решения должны быть в первую очередь безопасными и защищенными.
Приложение также должно быть устойчиво к некорректному вводу данных, плохим способам взаимодействия и плохим состояниям. Добиться этого не просто трудно, а очень трудно.
Пользователи вносили и будут вносить плохие или ошибочные данные: кто-то по рассеянности, а кто-то намеренно, стараясь взломать программу и добраться до представляемых ею ресурсов. Человек, на которого возложили ответственность за недавний провал Equifax, предъявил компании обвинения в том, что во всем публичном ПО не было предусмотрено защиты от ввода ошибочных и вредоносных данных.
Проблема защищенности возникает и с вводом правильных данных. Пользователи часто забывают свои пароли – сколько попыток они могут использовать? Программа блокирует пользователей, если они так и не вспомнили свой пароль?
А если еще кто-то пытается их заблокировать? Ваша программа разрешает вводить пароли при незашифрованном соединении? А если вход осуществляется с необычного для этого пользователя IP-адреса? Что должна сделать программа, если его действия похожи на робота?
Как вы защищаете своих клиентов от межсайтового скриптинга и фальшивых запросов, от атак «человек посередине» и простого социального фишинга? Вы предусмотрели в программе, что надо делать, если вдруг начались DDoS-атаки на ваши серверы? Это лишь небольшая часть задач, связанных с защищенностью приложения, которые вы должны решить.
Испорченное или поврежденное ПО надо восстановить – такое случается и с самыми хорошими системами. Если вы об этом не думаете и не готовитесь к плохому сценарию, то вы работаете не по специальности программная инженерия, а просто составляете небезопасные программы.
Порой ошибки в программе остаются невидимыми – предусмотреть и исправить все возможные дефекты наш мозг просто не в состоянии. Поэтому опытные программные инженеры хорошо понимают всю ценность тех инструментов, которые помогают им писать устойчивое и безопасное программное обеспечение.
Стандарты программной инженерии
Со временем основные области программной инженерии были систематизированы и подведены под единый международный стандарт, который охватывает и регламентирует почти все процессы, происходящие в сложных системах. Для каждого проекта, с учетом его особенностей и технических характеристик, всегда можно подобрать стандартные процедуры, которые регламентируют необходимые процессы.
На их основе формируются профили стандартов для похожих типов проектов и/или предприятий. Производство программных продуктов давно поставлено на промышленную основу благодаря тому, что процессы стандартизации и сертификации прочно вошли и в программную инженерию.
Ищете самую востребованную и высокооплачиваемую профессию? Станьте DevOps-инженером с нуля. Присоединяйтесь к нашему курсу, где вы освоите все необходимые навыки для работы в индустрии разработки программного обеспечения. Получите практический опыт в автоматизации процессов, контейнеризации, управлении конфигурациями. Научитесь автоматизировать процессы разработки и внедрения ПО, организовать непрерывную интеграцию и доставку (CI/CD), работать с облачными сервисами, Docker и Kubernetes. Запишись сейчас и открой двери в мир возможностей DevOps.
Наиболее известные международные стандарты программной инженерии:
- ISO/IEC 12207 — Information Technology — Software Life Cycle Processes — Процессы, происходящие при работе программных средств. В стандарт входят определения базовых понятий, таких как программный продукт и жизненный цикл программного продукта.
- SEI CMM — Capability Maturity Model (for Software) — модель степени профессионализма при разработке ПО. В стандарте содержится информация о том, каким должен быть уровень профессионального мастерства при разработке программного обеспечения.
- PMBOK — Project Management Body of Knowledge — Стандарт по управлению проектами.
- SWBOK — Software Engineering Body of Knowledge — Стандарт по программной инженерии. В него входят описания направлений по разделам (областям знаний) программной инженерии.
- ACM/IEEE CC2001 — Computing Curricula 2001 – Академический образовательный стандарт в области компьютерных наук. В него входят четыре основных раздела: Computer science, Computer engineering, Software engineering и Information systems, по каждому из которых определены области знаний, состав и планы рекомендуемых курсов.
Сегодня в рамках стандарта SWBOK разрабатывается расширенная версия стандартов по программной инженерии, в которую вошли пятнадцать направлений:
- Software Requirements — требования к программному обеспечению.
- Software Design — проектирование программного обеспечения.
- Software Construction — конструирование программного обеспечения.
- Software Testing — тестирование программного обеспечения.
- Software Maintenance — сопровождение программного обеспечения.
- Software Configuration Management — управление конфигурацией ПО.
- Software Engineering Management — управление проектом информационных технологий.
- Software Engineering Process — процесс программной инженерии.
- Software Engineering Models and Methods — модели и методы разработки ПО.
- Software Engineering Professional Practice — описание критериев профессионализма и компетентности разработчика программного обеспечения.
- Software Quality — качество программного обеспечения.
- Software Engineering Economics — экономические вопросы разработки программного обеспечения.
- Computing Foundations — основы вычислительных технологий, которые применяют в разработке программного обеспечения.
- Mathematical Foundations — базовые математические законы и понятия, которые используют в разработке программного обеспечения.
- Engineering Foundations — базовые понятия инженерной деятельности.
Инструменты программной инженерии
Программные инструменты поддерживают процессы рабочего цикла ПО. С их помощью автоматизируются простые, часто повторяющиеся действия, что снимает с инженера рутинную работу и дает возможность сконцентрироваться на творческой реализации процессов. Зачастую такие инструменты проектируются для поддержки конкретных (частных) технологий программной инженерии, снижая административную нагрузку, связанную с их применением в ручном режиме.
CASE (Computer-Aided Software Engineering) – набор инструментов и методов программной инженерии для проектирования ПО. Программы, созданные с помощью этого набора, отличаются высоким качеством, отсутствием ошибок, очень просты и удобны в обслуживании.
Инструменты (CASE) программной инженерии (Software Engineering Tools):
- Инструменты работы с различными требованиями (Software Requirements Tools).
- Инструменты проектирования (Software Design Tools) — создают и проверяют программный дизайн. (SADT/IDEF, UML, BPMN/BPEL, Microsoft DSL и т.п.)
- Инструменты конструирования (Software Construction Tools) полностью соответствуют понятию «конструирование», входящему в стандарт SWEBOK. Они необходимы в процессе производства и передачи программного текста (например, исходного кода), подготовленного для машинного выполнения.
- Редакторы (program editors). Необходимы для создания и модификации программ и разработанной для них документации.
- Компиляторы и генераторы кода (compilers and code generators). Неинтерактивные (командные) трансляторы исходного кода. К этому классу относятся компиляторы и редакторы в интегрированных средах программирования, а также текстовые процессоры, компоновщики/загрузчики и генераторы кода, автоматически создающие исходный код приложения.
- Интерпретаторы (interpreters). Их зачастую объединяют с компиляторами и генераторами кода, чтобы подготовить исходный код к исполнению.
- Отладчики (debuggers). Эти инструменты также участвуют в процессе конструирования программного обеспечения, их задача – вылавливать ошибки.
- Инструменты тестирования (Software Testing Tools).
- Генераторы тестов (test generators). Помогают разрабатывать сценарии тестирования.
- Средства выполнения тестов (test execution frameworks). С их помощью создается контролируемая среда, необходимая для исполнения тестовых сценариев, в которой отслеживается поведение тестируемого объекта.
- Инструменты оценки тестов (test evaluation tools). Поддерживают оценку результатов выполнения тестов – помогают определить, в какой степени и где именно обнаруженное поведение объекта соответствует ожидаемому.
- Средства управления тестами (test management tools).
- Инструменты анализа производительности (performance analysis tools).
- Инструменты сопровождения (Software Maintenance Tools). Очень важный набор инструментов, обеспечивающий сопровождение созданного программного обеспечения, способного модифицироваться.
- Инструменты облегчения понимания (comprehension tools). Работа с ними помогает человеку понять принцип действия программы. В качестве примера можно рассмотреть различные средства визуализации.
- Инструменты реинжиниринга (reengineering tools). Эти инструменты помогают проводить реинжиниринг, описанный в стандарте SWEBOK «Software Maintenance».
- Инструменты конфигурационного управления (Software Configuration Management Tools). Они делятся на три категории:
- Инструменты отслеживания (tracking) ошибок, расширений и проблем.
- Инструменты управления разными версиями.
- Инструменты сборки и выпуска. Управляют задачами сборки и выпуска продуктов, а также включают средства инсталляции.Инструменты конфигурационного управления (Software Configuration Management Tools). Они делятся на три категории:
Читайте также!
HTTP: особенности и использование протоколаПодробнееСредства управления деятельностью по программной инженерии и информационным технологиям делятся на три категории:
- Инструменты, обеспечивающие планирование и отслеживание проектов.
- Инструменты, управляющие рисками.
- Инструменты количественной оценки.
Инструменты поддержки процессов (Software Engineering Process Tools):
- Инструменты программного моделирования.
- Инструменты управления проектами ПО.
- Инструменты конфигурационного управления, обеспечивающие работу актуальных версий всего комплекса составляющих проекта.
- Ролевые платформы разработки программного обеспечения, которые охватывают все стадии жизненного цикла ПО и являются следующим этапом развития интегрированных средств разработки и CASE-инструментов в части поддержки «смежной» деятельности – управления требованиями, работ по конфигурационному управлению с поддержкой управления изменениями, тестирования и оценки качества.
- Инструменты обеспечения качества (Software Quality Tools). Средства делятся на две категории:
- Инструменты инспектирования. Используются для поддержки обзора (review) и аудита ПО.
- Инструменты (статического) анализа. Эти средства используются для анализа программных блоков, данных, выполненных работ и зависимостей.