Что такое качество кода?

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

Мы также продемонстрируем важность создания культуры качественного кода и ее влияние на наше ремесло здесь, в команде Scribd iOS. При этом я познакомлю вас с единственным допустимым измерением качества кода:

Глядя на рисунок выше, можно подумать: "Кто хочет оказаться в комнате справа, когда есть выбор?". Чтобы достичь высокого уровня удовлетворенности качеством нашего кода, мы должны думать не только о самом коде — проект и код внутри него являются просто отражением видения поддерживающей команды. Командное видение, которое может сосредоточиться не только на создании приложений и доставке функций, но и на поддержании качества кода. Эти атрибуты определяют культуру: культуру качественного программного обеспечения.

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

Почему мы должны заботиться о качестве кода?

Снижение качества увеличивает время разработки.

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

— Первый закон программирования

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

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

Для получения дополнительной информации, пожалуйста, прочитайте о Непрерывном дизайне и Эволюционном дизайне.

Почему вы должны заботиться о качестве кода?

Чистый код — это код, написанный тем, кому не все равно.

— Майкл Фезерс

С точки зрения разработчика качество кода является индикатором общего состояния системы. Мы должны помнить, что пишем для VIP-персон — наших товарищей по команде и клиентов, а не только для себя. И да, есть вещи похуже, чем когда другие неправильно понимают вашу работу. Более серьезная (и более распространенная) опасность заключается в том, что вы неправильно поймете свою работу. Мы обязаны принять ценности и методы, ведущие к созданию высококачественного программного обеспечения.

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

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

Как мы измеряем качество кода?

Зрение — это способность; видение, искусство.

— Джордж Перкинс Марш

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

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

  • Надежность
  • Читаемость
  • Простота
  • Последовательность
  • Тестируемость
  • Удобство обслуживания
  • Понятность
  • Модульность
  • Эффективность

Как снизить качество кода?

Качество — это не действие, это привычка.

— Аристотель

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

  • Ошибки и потенциальные ошибки
  • Отсутствие стандартов кодирования
  • Запахи кода
  • Анти-шаблоны
  • Дублирование кода
  • Отсутствие модульных тестов
  • Плохое распределение сложности
  • Слишком мало или слишком много комментариев
  • Объекты Бога
  • Мертвый код
  • Большие классы
  • Цикломатическая сложность
  • Циклические ссылки
  • Сильная связь
  • Злоупотребление статическими функциями
  • Дизайн спагетти
  • Злоупотребление наследованием

Как повысить качество кода?

Код читается гораздо чаще, чем пишется, поэтому планируйте соответствующим образом.

— Рэймонд Чен

Чтобы улучшить общее качество кодовой базы, нам нужно начать с культуры команды и/или компании. Качество кода может быть эффективно достигнуто только тогда, когда все драйверы движутся в одном направлении — на это можно влиять и направлять правильное общение, планирование и инновации.

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

  • Совместный дизайн
  • Парное программирование
  • Проверки кода
  • Коллективная ответственность
  • Практика тестирования
  • Автоматические инструменты

Как мы автоматизируем качество кода?

Обнаружение неожиданного важнее, чем подтверждение известного.

- Джордж Э. П. Бокс

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

  • Статический анализ
    Можно использовать, чтобы избежать тонких проблем программирования, а также помогает обеспечить чистоту кода, предотвращая переопределения переменных, неиспользуемые функции, недостижимые потоки и магические числа.
  • Форматеры кода
    Незначительные отклонения от наших стандартов кодирования могут быть оперативно исправлены с помощью форматирования кода ловушки перед фиксацией.
  • Линтеры кода
    Основные отклонения от наших стандартов кодирования можно заблаговременно исправить с помощью ошибок компилятора — для выявления проблемных областей — и предупреждений — для уведомления разработчика о незначительных проблемах (например, TODO, лишние пробелы, и т.д.).
  • Непрерывная интеграция
    Цель непрерывной интеграции — предотвратить слияние кода, если какой-либо из инструментов обнаружит проблему. Следование этой системе позволяет команде анализировать архитектуру и проекты в обзорах кода, а не обсуждать тривиальные предложения.

Вывод

Любой дурак может написать код, понятный компьютеру. Хорошие программисты пишут код, понятный людям.

— Мартин Фаулер

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

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