Найти тему
Войти в IT

Тёмная сторона программирования. Признаки некачественного кода. Плохой / Часть 2.

Оглавление

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

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

Решительный взгляд классического антагониста на процесс спокойного и упорядоченного программирования. "Сделаем быстро, а там будь как будет". "Пусть потом другие это исправят".
Решительный взгляд классического антагониста на процесс спокойного и упорядоченного программирования. "Сделаем быстро, а там будь как будет". "Пусть потом другие это исправят".

Я считаю, что программист должен любить свою работу. Важно любить программный код, который ты пишешь. Только такой подход позволяет получать хорошие результаты. Ну а если тебе не нравится программировать, или бесит проект который ты делаешь, не лучше ли сменить профессию?

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

Отсутствие внятной структуризации 🔃

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

Запутанные программные решения и отсутствие структуризации - стандартная "антиклассика". Работает, но практически не масштабируется.
Запутанные программные решения и отсутствие структуризации - стандартная "антиклассика". Работает, но практически не масштабируется.

Некоторые программисты (особенно начинающие) периодически грешат лёгким отношением к вопросам структуры и архитектуры приложения. Таким образом, иногда рождаются "супер-универсальные" методы / функции / классы, условным размером в несколько тысяч строк. В результате, внутреннее поведение некоторой программы перестаёт понимать как сам программист, так и его коллеги / партнёры.

Хороший стиль - это декомпозировать задачу на более мелкие задачи. Разбивать сложный код на более простой код. И в конечном итоге, создавать понятные структуры и модули - простые и удобные. Не наоборот.

ООП головного мозга 🤯

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

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

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

Любители 6 НФБК - так же передаю большой привет из этого пункта!

Золотой молоток 🏆

Предположим, что некий программист успешно освоил парочку работающих паттернов. И влюбился в этим приёмы. Шло время, он всё применял и применял эти паттерны, получая предсказуемые результаты. Руководство хвалило его за высокое качество, и в какой-то момент программист уверовал во всеобъемлющую универсальность выбранных им инструментов. И вот, по удивительному стечению обстоятельств, теперь эти паттерны можно найти в абсолютно всех его последующих программах. Круто? Нет, не круто!

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

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

По сути своей, золотой молоток это разновидность лени, и нежелание программиста искать оптимальные пути решения к конкретной задаче.
Это нежелание программиста учиться новому.
Вот здесь в большом разборе мы писали об этом антипаттерне гораздо более подробно. Рекомендуем к чтению!

Спагетти-код 🍜

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

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

Вот что говорит про спагетти-код Википедия:

Спагетти-код это плохо спроектированная, слабо структурированная, запутанная и трудная для понимания программа, особенно содержащая много операторов GOTO (особенно переходов назад), исключений и других конструкций, ухудшающих структурированность. Самый распространённый антипаттерн программирования.
Спагетти-код назван так, потому что ход выполнения программы похож на миску спагетти, то есть извилистый и запутанный. Иногда называется «кенгуру-код» (kangaroo code) из-за множества инструкций «jump».
В настоящее время термин применяется не только к случаям злоупотребления GOTO, но и к любому «многосвязному» коду, в котором один и тот же небольшой фрагмент исполняется в большом количестве различных ситуаций и выполняет очень много различных логических функций.

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

Поток лавы 🌋

Ещё один классический антипаттерн программирования - поток лавы. Здесь речь идет о том, что в условном проекте сохраняется большое количество нежелательного (лишнего, устаревшего, неиспользуемого, ненужного, плохо структурированного, непонятно кем написанного) кода только потому, что этот самый код очень проблемно оттуда изъять.

Поток лавы - антипаттерн программирования, при котором цена корректировок внутри кода превосходит ценность самого кода. Тот случай, когда проще оставить код "как есть".
Поток лавы - антипаттерн программирования, при котором цена корректировок внутри кода превосходит ценность самого кода. Тот случай, когда проще оставить код "как есть".

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

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

Отсутствие документации 😳

Что может быть ужасней, чем сложная библиотека со 100 методами, никакой из которых не содержит технической документации? Суть да дело, а я с таким сталкивался. "Программируем наудачу", "Кладём кирпичи без помощи рук" или "Забиваем гвозди вслепую" - наверное такие метафоры из реальной жизни можно привести, описывая подобный случай из жизни.

Отсутствие документации, равно как и плохая документация - типичная проблема "Плохого" программного кода.
Отсутствие документации, равно как и плохая документация - типичная проблема "Плохого" программного кода.

Как-то раз, в далёкие времена, когда термин "Искусственный интеллект" у большей части людей ассоциировался с фильмами типа "Терминатор" или "Матрица", а про ChatGPT ещё слыхом никто не слыхивал, попалась мне в руки нейросетевая библиотека для распознавания отпечатков пальцев. Задача была предельна проста - организовать контроль доступа на большом объекте через оптические сканеры отпечатков пальцев, используя вышеуказанную ИИ библиотеку.

Каково же было моё удивление, когда к этой библиотеке не обнаружилось абсолютно никакой документации, а разработчики предложили "не переживать по этому поводу, а просто присылать на Email вопросы по методам, если их названия и имена аргументов вызовут сомнения". Шутка была в том, что библиотека являлась частью более крупного проекта, и её разработчики не планировали отдавать продукт в третьи руки. Просто все привыкли работать в узком коллективе именно таким образом (без документации), а руководство проекта и вовсе не заморачивалось над такими "мелочами". В результате, родилась такая вот забавная история. К слову сказать, проект сделать всё-таки удалось, хотя это было совершенно не просто.

Непредсказуемый код / goto 🔗

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

Goto - как инопланетный корабль посреди пустыни. Эффектно, но не эффективно.
Goto - как инопланетный корабль посреди пустыни. Эффектно, но не эффективно.

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

Использование перехода типа goto (как правило в высокоуровневых языках), напрочь ломает последовательность выполнения кода. Так, в какой-то неожиданный момент можно обнаружить "поток" выполнения программы совершенно в неожиданных местах, и с явным отсутствием последовательности. Goto радикально уменьшает читабельность и предсказуемость программ.

На днях - третья часть. Кто такой "Злой" и каковы его принципы.

Мистер "Злой программист", ставящий во главу угла скорость и выгоду, в угоду качеству.
Мистер "Злой программист", ставящий во главу угла скорость и выгоду, в угоду качеству.

🔥 Понравилось? Подпишись! Победим восстание роботов вместе! 🔥

-10

🚀 P.S. Для тех, кто хочет не просто читать о программировании, а начать свой путь джедая прямо сейчас, приглашаю на Boosty! Там эксклюзивный обучающий материал по программированию для любого уровня подготовки. А ещё там можно посмотреть, как автор выглядит в жизни. Жми сюда и полетели!🚀

P.S.2 Ещё у меня есть Telegram-канал. Там посты чуть проще и веселее. Ссылка

P.S.3 Предлагаю делиться в комментариях личным взглядом на плохие подходы к программированию. Случаи из жизни и поучительные истории из IT приветствуются!