Что такое говнокод
Уверен вы уже слышали этот термин и не раз, ниже на реальных примерах я расскажу как обстоят дела и почему все так плохо. Берите лопаты и надевайте галоши — сейчас будем копать.
Думаю очевидно что я не могу показывать примеры кода из моих реальных проектов, чтобы не подгорели жопы не словить проблем с владельцами. Поэтому все примеры ниже взяты из интернета.
Тем не менее, каждый пример говнокода ниже встречается в живых проектах на регулярной основе. А некоторые проекты из одного только говнокода и состоят. Поехали.
Пример первый: Кто понял жизнь тот не спешит
Начнем с нетленного:
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));
}Берем системную функцию, оборачиваем в свою, вызываем. Называем «собственной разработкой».
Ну например чтобы раздуть объем кода проекта: представьте что всего блока выше можно было и не делать — приложение работало бы и без него.
Справедливости ради, такое часто встречается как результат неубранной отладки — ставить точку останова в отладчике умеют не все, поэтому куда чаще встречается оборачивание плюс логирование вызовов.
Но объем такого говнокода может быть очень большим — месить делать его просто, а результат визуально выглядит серьезно. Поэтому и лепят.
Итого
Абсолютно ничего хорошего в говнокоде нет.
Его наличие в вашем проекте — однозначный показатель очень плохих внутренних процессов: нехватки времени, компетенций или наплевательского отношения к своей работе.
А значит очень скоро ваш проект развалится, будучи похороненным под этими каловыми массами. Поэтому чем раньше вы возьметесь за голову и займетесь чисткой — тем больше шансов не потонуть.