software-development
January 23, 2023

Что такое говнокод

Уверен вы уже слышали этот термин и не раз, ниже на реальных примерах я расскажу как обстоят дела и почему все так плохо. Берите лопаты и надевайте галоши — сейчас будем копать.

Девиз нашей любимой отрасли

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

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

Пример первый: Кто понял жизнь тот не спешит

Начнем с нетленного:

void get_tomorrow_date( struct timeval *date )
  {
    sleep( 86400 ); // 60 * 60 * 24
    gettimeofday( date, 0 );
  }

Что тут происходит:

Смысл функции — получить завтрашнюю дату от указанной. Реализовано это в виде паузы длиной в день: программа засыпает на день и затем отдается текущая дата.

Казалось бы выдуманный и детский пример — ну кто будет ждать целый день? Ведь пользователь заметит такое.

Все бы так и было, но на свете есть фоновая обработка и планировщики, где такое встречается повсеместно.

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

Пример второй: Эталонная безопасность

Какие хеши, пароли и безопасность? Кому это надо когда есть банальное и работающее:

if(e.password == '23f9dg'){
    $('#editable').show(0);
}

Да, это проверка авторизации с помощью зашитого в код пароля.

Пикантности прибавляет то что это Javascript и весь код виден в браузере.

Такой говнокод — частый гость во всяких доморощенных модулях для WordPress, самопальных CMS и блог-движках на PHP.

Ну и в прошивках WiFi-роутеров, где есть веб-интерфейс. Но у вас конечно же такого нет, я надеюсь.

Пример третий: Все взять и посчитать

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

    // сколько сегодня зарегестрировалось по приглашению
    public function getTodayCount() {
	$query = self::select("select * from invites where date='" . date("Y.m.d") . "'");
	return count($query);
    }

Что за дичь тут творится:

Функция отдает в виде числа количество приглашений на сегодняшнюю дату. Вместо того чтобы запросить из базы одно лишь число, используя синтаксис SQL вроде select count(*) и дать базе самой подсчитать свои записи, происходит выкачивание всех записей из базы и их подсчет. В памяти приложения разумеется.

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

В чем тут проблема?

Ну например записей может быть миллион или даже два. Очевидно что на таких объемах все сломается.

Еще это большая нагрузка на базу данных, сеть и всю цепочку обработки данных:

выборку с данными надо сформировать, передать и распарсить — соответственно.

Вообщем, хорошего тут ничего нет.

Пример четвертый: Импортозамещение

Несколько однотипных примеров для понимания масштаба:

function confirmDialog(sMessage) {
    if (confirm(sMessage)) {
        return true;
    } else {
        return false;
    }
}
..
function print(){
    window.print() ;
}
..

function document_write($text)
{
	document.write($text);
	return false;
}
..
function nik_slashes(&$value)     {
     return (stripslashes($value));
}

Что это:

Берем системную функцию, оборачиваем в свою, вызываем. Называем «собственной разработкой».

Зачем такое делать?

Ну например чтобы раздуть объем кода проекта: представьте что всего блока выше можно было и не делать — приложение работало бы и без него.

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

Но объем такого говнокода может быть очень большим — месить делать его просто, а результат визуально выглядит серьезно. Поэтому и лепят.

Мои тяжелые рабочие будни

Итого

Абсолютно ничего хорошего в говнокоде нет.

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

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

И да поможет вам ассенизатор )