Быстро Дешево и Качественно

Разработка программного обеспечения (ПО) является одной из самых технологичных и интеллектуальных отраслей современной экономики. Находясь в этой сфере не первый десяток лет, мы ежедневно сталкиваемся с вопросами оценки трудоемкости и сроков реализации той или иной IT задачи. В данной статье описаны факторы, определяющие стоимость разработки программного продукта, и приведены аргументы, объясняющие существенную разницу между написанием небольших типовых программ и разработкой полноценного программного обеспечения.

Предисловие

Любой проект рано или поздно проходит этап расчета и согласования бюджета. Однако в сфере разработки ПО этот шаг часто вызывает споры и недоумение – почему так дорого и почему так долго? Эти вопросы возникают даже у опытных заказчиков и инвесторов, кто знаком с IT индустрией. Надо сказать, что порой и сами разработчики могут существенно ошибаться в интуитивной оценке реальной стоимости проекта. Попробуем разобраться, почему так происходит.

Быстро Дешево и Качественно

Основная причина эмоциональной недооценки кроется в широчайшем распространении пользовательских программ и устройств. Смартфоны, компьютеры и всевозможные гаджеты стали настолько обыденной вещью, что мы привыкли и стали воспринимать сложные операционные системы и интеллектуальное поведение программ как нечто само собой разумеющееся.

Компьютеры, ноутбуки, смартфоны, планшеты – во всех этих привычных устройствах сосредоточен многолетний труд тысяч людей, причем авторы и создатели программного обеспечения потратили годы на обучение и собственное развитие, прежде чем сделать то, чем мы пользуемся каждый день. Именно поэтому разработчики – одна из самых высокооплачиваемых профессий, и найти по-настоящему профессиональных высококлассных разработчиков очень непросто.

Кодер – программист – разработчик

Любой может спеть в караоке, не каждый возьмется петь даже в кругу друзей и знакомых, и только единицы поют так, что их слушают другие люди, покупают альбомы и платят за билеты на концерты. Точно так же и в IT: каждый может начать программировать, некоторые могут написать программу для своих нужд, но далеко не каждый может стать разработчиком и создавать программное обеспечение для широкого применения. Для этого нужны годы обучения, целеустремленность и большой опыт работы.

Инструментом создания ПО является язык программирования, другими словами – программный код. Написание инструкций на языке программирования – это кодирование. Эту работу выполняет программист (coder), он действует как переводчик: переносит нужный алгоритм в понятный компьютеру язык. Программист, в общем случае, не участвует в создании алгоритма, он работает по дизайн-документу (design document), в котором описан алгоритм и методы его реализации.

Ты программист?

В данном контексте слово дизайн – это не оформление чего-либо, радующее глаз, а буквальный перевод английского слова design = проектирование, разработка. Дизайн-документ готовят аналитики и разработчики (software engineers) – те люди, которые понимают бизнес-требования проекта и знают технологии достижения результата.

Не путайте программирование и разработку программного обеспечения

Разницу между программированием и разработкой проиллюстрируем на обобщенном перечне функций программиста и разработчика.

Функции программиста (coder):

  • Владеет языком(-ами) программирования
  • Соблюдает стандарты написания кода, принятые в организации (code convention)

Функции разработчика (software engineer):

  • Владеет несколькими языками программирования
  • Внедряет и соблюдает стандарты написания кода (code convention)
  • Занимается анализом и проектированием систем
  • Досконально понимает архитектуру решения, его сильные и слабые стороны
  • Способен провести анализ проблем и обеспечить надежность работы программы в различных окружениях
  • Владеет вопросами безопасности, надежности, конфиденциальности информации
  • Умеет прогнозировать время и трудоемкость этапов работ
  • Соблюдает культуру написания кода, принципы наследуемости и переиспользования
  • Постоянно изучает новые профильные техники и стандарты
  • Видит задачу в целом и понимает потребности бизнеса
  • Оценивает перспективы решения в среднесрочной и долгосрочной перспективе
Скажи что-то на программистском

Результат деятельности разработчика не оценивается количеством строк кода. Результатом является рабочий инструмент – программа, сервис, алгоритм, который обладает следующими свойствами:

  • Решает поставленную задачу
  • Удобен в использовании
  • Имеет техническое описание выполняемой функции и правил использования
  • Содержит инструкцию по разворачиванию и запуску
  • Имеет список ограничений и возможных побочных эффектов
  • Имеет описание отката версии в случае непредвиденных ошибок
  • Обладает переносимостью между различными рабочими окружениями

Профессиональный разработчик предоставляет гарантию на работу программного решения и обеспечивает консультационную поддержку Заказчика по согласованному регламенту.

Результативность – неотъемлемая черта настоящего разработчика

Нацеленность на результат в виде рабочего программного инструмента является отличием профессионального разработчика. Для этого необходимо погрузиться в проект и учесть все факторы, влияющие на жизненный цикл решения. Сюда входят не только технические аспекты, такие как выбор архитектуры, но и маркетинговые требования, рыночная ситуация и прочие внешние факторы. Очень часто для реализации крупного проекта необходимо сначала сделать прототип – небольшой фрагмент программы для демонстрации и принятия решений. Многим специалистам не нравится такой порядок, они называют прототипы костылями, но опытный и зрелый разработчик воспринимает прототипирование как часть естественного процесса разработки в рамках реальной жизни.

«Умный в гору не пойдет, умный гору обойдет», – говорит народная мудрость, раскрывая еще один секрет результативности и нацеленности на результат. Действительно, бывают ситуации, когда буквальное написание кода не требуется или требуется в минимальном объеме. Некоторые задачи можно решить имеющимися программными модулями и компонентами, состыковав их и настроив на выполнение нужной функции. Для этого необходимы опыт и кругозор, а также постоянный поиск и изучение нового в быстроменяющемся мире IT.

Вам нужно спасти принцессу

Подготовка ПО для публикации

На финишной прямой появляются технические документы, инструкции по использованию ПО, методики внедрения и эксплуатационные регламенты, учебные планы и служба поддержки. Это важнейший момент жизненного цикла разработки, и нельзя недооценивать его важность. Посмотрите на просторах гитхаба, какое бесчисленное множество разработок брошено на стадии, когда вроде бы все уже работает и осталось только дать решение людям, но у разработчика не хватило профессионализма довести разработку до публикации.

Когда наконец пройдены трудные участки согласования ТЗ, архитектурных изысканий, проектирования, прототипирования, разработки, отладки и тестирования – наступает финишная прямая, на которой приложение оформляется для того, чтобы научить людей им пользоваться. Здесь на помощь приходит командная работа: нужны специалисты по документированию, инженеры по внедрению и обучению, сотрудники службы поддержки.

Качество кода

Культура разработки проявляется в написании качественного кода, который, как крепкое здоровье и закалка, обеспечивает долгую и продуктивную жизнь проекту. Качественный код должен быть:

  • оформлен
  • легко читаем
  • структурирован
  • снабжен комментариями
  • лаконичен

Эти критерии относятся к общепринятому стандарту оформления кода и вместе с дополнительными правилами, принятыми в организации, составляют специальный регламент оформления кода (code convention).

Процесс разработки – это не только написание непосредственно работающей части кода, но и создание дополнительных частей, выполняющих функцию автоматического тестирования (unit test). В команде разработчиков существуют правила контроля кода (code review), когда коллеги проверяют код друг друга перед публикацией. Это сокращает количество ошибок, позволяет обмениваться полезными практиками и обеспечивает осведомленность команды общим состоянием проекта.

Все эти мероприятия увеличивают время разработки. В разных проектах увеличение может составить и 20%, и 50%, в зависимости от архитектуры и сложности задачи. Но это увеличение с лихвой окупается в долгой перспективе. Любой программный проект может содержать ошибки, но качественный код позволяет максимально быстро их локализовать и исправить. Проект с качественным кодом легко расширяем, наследуем, его легко интегрировать с другими информационными системами (ИС).

Архитектура системы

Оптимизация – признак профессионального решения

Были времена, когда разработчики укладывали в несколько сотен килобайт очень широкую функциональность. Приложения, написанные на ассемблере, С/C++, Pascal имели крошечный размер и фантастическую производительность – достаточно вспомнить сложные по графике и сценарию игры, умещавшиеся на дискете и работавшие на самых примитивных компьютерах. Сейчас, конечно, нет таких аппаратных ограничений, как 20 лет назад, но все же вычислительные ресурсы не безграничны и системные требования для работы ПО будут влиять на будущие издержки эксплуатации.

Не уделяя внимания оптимизации, можно получить решение, которое не справится с нагрузкой в рабочем режиме или потребует неоправданно больших затрат на формирование окружения, что сведет на нет все преимущества от внедрения ПО. Заказчик откажется от такого приложения ввиду больших эксплуатационных расходов. Качество оптимизации выявляется на нагрузочном тестировании, что, в свою очередь, требует стендов, специальных инструментов и, зачастую, волонтеров. Поэтому оптимизация является одним из обязательных этапов профессиональной разработки ПО.

Очевидное – невероятное или техническое задание – это не уголовный кодекс

Программное обеспечение должно быть удобным, а удобство складывается из интуитивно понятного интерфейса и множества нюансов, которые сопровождают действия пользователя. Приведу несколько простых примеров:

Культура разработки проявляется в написании качественного кода, который, как крепкое здоровье и закалка, обеспечивает долгую и продуктивную жизнь проекту. Качественный код должен быть:

  • При переходе на страницу с полем ввода, курсор должен автоматически оказаться в этом поле, чтобы пользователю не приходилось лишний раз кликать мышью
  • Кнопка ОК должна быть справа, а CANCEL слева, а не наоборот (если не предусмотрено иное)
  • При выводе денежных сумм должен присутствовать разделитель разряда и два знака после запятой (не один и не три, а именно два)
  • Если перед полем с отображением числа стоит пояснение, то оно должно заканчиваться двоеточием, а не тире, чтобы не было ощущения, что число отрицательное
  • Если пользователь вводит ошибочные данные, то система должна сообщить, где возникла ошибка, а не заставлять гадать пользователя
  • Выпадающий календарь для ввода даты рождения не должен начинаться от Рождества Христова, чтобы не приходилось пролистывать 2 тысячи лет для установки корректной даты
  • Поля ввода должны автоматически воспринимать различные форматы и корректировать вводимые данные, например, заменять Caps Lock.
  • В интерфейсе должны действовать общепринятые горячие клавиши
  • Кнопка OK должна становиться активной лишь после заполнения всех обязательных полей

Мы не замечаем, когда все эти мелочи присутствуют в приложении, но если что-то из очевидного не работает, то это бросается в глаза и оставляет неприятный осадок.

Очень часто начинающие разработчики сетуют на недостаточно подробное техническое задание. Но заполнение технического задания детальным описанием всех нюансов раздувает его объем, и в итоге важные вещи могут быть упущены. Для разработчика-профессионала техническое задание не должно превращаться в уголовный кодекс с многостраничным описанием стандартов удобства (usability) и всего, что делать нельзя.

Ответственность, надежность, безопасность

Программное обеспечение должно не просто выполнять поставленную задачу, оно должно делать это надежно и достоверно. Для этого в приложении должны быть предусмотрены механизмы обработки ошибок для всевозможных сценариев использования интерфейса.

Но этого мало, качественное приложение должно быть устойчиво к деструктивным воздействиям, таким как перебор пароля, инъекции скриптов и прочие атаки. Своими действиями злоумышленник может вызвать сбой в работе программы или получить доступ к конфиденциальным данным. В этом случае цена ошибки в ПО, на жаргоне «дыра в безопасности», может привести к существенным потерям. Все это вопросы ответственности и профессионализма команды разработки.

Верхушка айсберга, или любой прораб на глаз прикинет, что почем в ремонте квартиры

В начале статьи мы говорили о том, что оценка стоимости и продолжительности разработки программного обеспечения – отнюдь не простая задача. Нам часто приходится слышать аналогию со строительными работами: опытный прораб может довольно точно прикинуть смету расходов на ремонт квартиры или постройку загородного дома. Однако нужно понимать, что эти работы являются типовыми и предсказуемыми. В программировании тоже есть типовые работы вроде создания сайта или разработки личного кабинета.

Но что скажет прораб, когда его попросят оценить не квартирный ремонт, а, к примеру, отделку машинного зала производственной линии по обогащению руд редкоземельных металлов? Да еще и с применением серной и плавиковой кислот? И в условиях крайнего севера? Или вообще на экспериментальной станции на Марсе?

Сравнение не надуманное. Стандартные задачи решаются стандартными программами, но создание новых программный решений сродни научной деятельности и космическим путешествиям. Чтобы достигать самых амбициозных целей, необходимо планомерно и системно двигаться вперед, вооружившись лучшими методиками и практиками.

Что в итоге?

Очевидно, что один человек не может в полной мере удовлетворить столь широким требованиям к процессу разработки и финальному результату. Именно поэтому разработка программного обеспечения ведется командой профильных специалистов и термин «разработчик», в большинстве случаев, означает компанию, предоставляющую услугу разработки программного обеспечения (software development company).

Добавить комментарий

Ваш электронный адрес не будет опубликован. Обязательные для заполнения поля помечены *

Отправить