обычная картина по утрам в моей комнате=

Михаил Г-ский

Моя жизнь, мои достижения | Записки другого мизантропа

Previous Entry Share Next Entry
Про DataLife Engine (DLE) CMS
WHY face
mixoil
(keywords: DLE — говно, DataLife Engine — говно)

Сразу предупреждаю не специалистов: ниже содержится профессиональное техническое глумление.

Краткое содержание: DLE (DataLife Engine) насыщен объективными, измеримыми научным методом ошибками как в структуре базы данных, так и в программном коде. Эти ошибки, в ряде случаев, приводят к значительному замедлению работы сайтов, во всех случах: делают невозможной профессиональную доработку движка. То есть, его можно с грехом пополам дорабатывать, но делать этого не стоит, слишком высокий maintenance cost.




Мне досталась интеграция одной моей системы (нетипового проекта высокой степени новизны и выше средней сложности) в сайт на некоем движке DLE (вроде я когда-то что-то такое слышал, но раньше не сталкивался).

Хочется плакать кровавыми слезами, причём как от кода, так и даже от структуры базы данных.

Сначала я был в шоке, потом я плакал, потом я смеялся, потом — всё это одновременно.

Напишу только про базу данных — иначе, если рассматривать и описывать систематические анти-паттерны в коде, то нужно надолго бросать всю остальную работу :-)



dle_admin_logs:
ip: varchar(16) — Могу сделать признание: в 2000-ом году, когда MySQL ещё была в третьих версиях и я только начинал её осваивать (как и веб-разработку в целом), а интернет был в сто раз меньше и подсказать было некому, я тоже так делал. Правда, достаточно пятнадцати символов, что ясно и козе.

dle_banned:
date: varchar(15) — дата как строка?! ООООК...
ip: varchar(50) — было 16, стало 50...

dle_comments:
date: datetime — ВНЕЗАПНО :-D
autor: varchar(40) — (я не опечатался, так в оригинале) эти поля мне особенно нравятся, дальше с ними будут происходить весьма занимательные метаморфозы.
email: varchar(40) — за такую «щедрую» длину и-мейла — мои бурные аплодисменты, переходящие в овации.
ip: varchar(16)
is_register — autor is register, all your base are belong to us :-)

dle_email:
Тут просто совершенно не тот контент, которого я ожидал по названию.
В этой таблице хранятся шаблоны системных писем («вы зарегистрировались», всякое такое).
Причём мне особенно нравится, что, в принципе-то, система позволяет задать для сайта несколько языков (весьма через задницу), но эти шаблоны писем единые для всех языков сайта: вот и приходят нам уродцы, когда одно и то же содержание перечислено на трёх языках в одном письме (не буду показывать пальцем, но такие письма всё ещё рассылает «Неволя»; впрочем, это ещё хуйня по сравнению с их хранением паролей в открытом виде).
В другом месте я совершенно случайно заметил, что и при отключении сайта на maintenance, сообщение «Простите, сайт не работает» нельзя разбить по языкам, и оно ещё и редактируется исключительно без WYSIWYG-редактора.
Лишний раз убеждаюсь, что многоязычность массовыми разработчиками освоена слабо.

dle_files:
author: varchar(40) — однако, вдруг грамотно!
date: varchar(15)

dle_flood:
ip: varchar(40) — колеблясь между 16 и 50, кто-то выбрал 40. Ну, шоб наверняка :-)

dle_images:
author: varchar(40) — хм, снова грамотно...
date: varchar(15)

dle_links:
only_one: tinyint(1)
replacearea: tinyint(1)
WHY such names?! :-(
Почему only_one, но replacearea?
Почему replacearea, но only_one?
Фантастишь...

dle_login_log:
ip: varchar(16)
date: int(11) UNSIGNED — о, хоть unsigned...

dle_logs:
member: varchar(40) — не отпирайтесь, мы уже знаем, что имеется в виду "autor":-D
ip: varchar(16)

dle_lostdb:
lostname: mediumint(8)
lostid: varchar(40)
Нет слов. name — это цифра, а id — это слово (свобода — это рабство, мир — это война, и т. д.)
Интересно, это вообще работает и это просто такой тонкий юмор (всякое встречается)? :-)

dle_mail_log:
id: int(11) UNSIGNED
user_id: int(11) SIGNED — ну, ребята, они же рядом стоят, а вы — unsigned/signed... и что же это вы изменяете прекрасному полю autor varchar 40? :-)
mail: varchar(50) — ого, теперь целых пятьдесят в одном и-мейле — щедрость безгранична... :-D

dle_pm:
id: int(11) UNSIGNED
user: mediumint(8) SIGNED — снова... :-(
date: int(11) UNSIGNED
folder: varchar(10) — мощная задумка... по нагрузке сразу и на вычисления, и на БД... :-/
sendid: int(10) — и это в таблице, в которой есть имена полей user_from и pm_read...

dle_poll:
frage: varchar(200) — ВАУ!!! Йя воль, натюрлихь, Берлин ист ди хауптштадт Дойчлянд унд дас ист фантастишь! :-]
(Не вру, это именно в значении «вопрос», в таблице «голосования».)

dle_poll_log:
member: varchar(40) — я не понял, а куда делся "autor"?!!

dle_post:
autor: varchar(40) — нет-нет, всё в порядке, вот он, родной... :-D
date: datetime — чёрт возьми, кто-то знает тип данных datetime, но не знает, как по-английски пишется «автор»...

dle_post_extras:
eid: int(11) SIGNED — (что-то новенькое...)
editor: varchar(40) — да-да, больше синонимов для бога синонимов :-)
Есть поля news_id, news_read, allow_rate, vote_num, view_edit, disable_index, related_ids, даже зачем-то user_id (причём int(11) SIGNED), но editdate (кстати, int(11) SIGNED — такого ещё не встречалось)

dle_post_log:
expires: varchar(15)

dle_question:
question: varchar(255)
answer: text
Обожаю такие реализации :-)
Мало того, что «вы не умничайте, а вот нас хрен заткнёшь, будем отвечать, сколько захотим», так ещё и ни цепочек (я недавно писал «с нуля», написал переписку с цепочками за два или три часа), ни языков, ни автора ответа...

Это оказались «Вопросы и ответы для защиты от спама».
Вопросы в question, правильные ответы — в answer, по одному на каждую строку.
Многоязычность? Ну, может, каким-то раком и реализована...
(facepalm.jpg)

dle_read_log:
id: int(11) UNSIGNED
news_id: int(11) SIGNED
ip: varchar(16)
В таблице только три этих поля, так что её делал один человек, а не один начал, а другие кончали.
Как видим, слово unsigned он знает — так почему же всего лишь в трёх полях всё сделано так через жопу?!.. :-(

dle_rss:
url: varchar(255) — 255?! Да что вы говорите (ржунимагу)? :-D
Есть поля allow_main, allow_rating, allow_comm, text_type, max_news, но lastdate (int(11) UNSIGNED; особо мне нравится, что id здесь же smallint(5) SIGNED).

dle_sendlog:
user: varchar(40) — Да, да! Ещё, ещё! :-D
date: int(11) UNSIGNED

dle_spam_log:
ip: varchar(16)
email: varchar(50)
date: int(11) UNSIGNED

dle_static:
allow_br, allow_template, template_folder, allow_count и disable_index, но grouplevel, metadescr, metakeys и metatitle.

dle_static_files:
author: varchar(40) — а-х-ха-ха-ха-ха-ха-ха-ха-ха-а ROFL
date: varchar(50) — в «авторе» хоть слово правильно «выговорили», так ниже дата у них строкой, они просто сногсшибательны...

dle_subscribe:
name: varchar(40) — а они молодцы, их не остановить :-D
email: varchar(50)

dle_tags:
id: int(11) AUTO_INCREMENT (конечно же, SIGNED)
news_id: int(11)
tag: varchar(100)
Кроме того, что я плохо понял, зачем такая структура (id здесь избыточен), так это же даже ещё производительнее, чем folder как varchar в dle_pm :-)

dle_usergroups:
В этой таблице 88 полей, почти все — флаги (tinyint(1)).
Она просто анмейнтейнбл, вдаваться в детали даже не хочется.
Ряд CMS и CRM решили эту проблему хранением в форматах JSON или XML, что идеально для версионирования и обслуживания. Занудные олдфаги вроде меня порой используют биты, что, при наличии минимальной документации, тоже ментейнится безо всяких проблем.
Как ауторы рассматриваемого движка учились программировать, что даже не догадались использовать ни биты, ни JSON/XML в качестве флагов?.. :-(

dle_users:
banned: varchar(5) — не поверите: сюда записывается "yes" (цитирую: (...) AND $member_id['banned'] != 'yes').
email: varchar(50)
name: varchar(40)
lastdate: varchar(20)
reg_date: varchar(20)
land: varchar(100) — видимо, снова фатерляндия в жопе заиграла.
icq — сразу понятно, какой приблизительно эпохи движок, несмотря на 2014-й год выпуска...
logged_ip: varchar(16)
restricted_date: varchar(15) — почему не 20???
Это поразительно, но поле user_group всё-таки int, а не varchar.

dle_views:
id: int(11)
news_id: int(11)
Unsigned? Нет, не слышали.

dle_vote:
category: text
date: varchar(25)
start: varchar(15)
end: varchar(15)
Смею предположить, судя по увиденному выше, что start и end — даты.
Особо понравился опрос, который идёт в комплекте «из коробки»:
«Оцените работу движка:
 Лучший из новостных<br />Неплохой движок<br />Устраивает ... но ...<br />Встречал и получше<br />Совсем не понравился»
(Запомните, дети — никогда так не делайте.)
Лючщий, канэшна. Однозначно.
Что, кстати, тоже говорит об уровне интеллектуального развития авторов, несмотря на разработку с 2004-го года (за это время даже школьники уже выросли бы).

dle_vote_result:
ip: varchar(16)
name: varchar(40)

Во всех таблицах id — то unsigned, то нет (в основном, конечно же, signed). Перечислять, где какие, уже просто лень (поздно начали попадаться unsigned, я тогда уже далеко зашёл по списку).



В общем, из 39 таблиц базы данных не нашлось ни одной технически грамотной.
(Лексически грамотные встречаются, но даже с этим проблемы.)

Цитата из программного кода (да, там так прямо в коде и написано; кому вообще может понадобиться многоязычность в back-end?), здесь прекрасно всё, но завершение — особенно бесподобно:
if ($chmod_value == 777 ) return "File {$url['path']} is in the folder, which is available to write (CHMOD 777). For security purposes the connection files from these folders is impossible. Change the permissions on the folder that it had no rights to the write.";
(Вспомнилось незабвенное "You're right, I'm left, she's gone".)

Коллеги! С таким уровнем владения английским нужно не выёбываться с этими непонятными вам php, javascript и SQL, а писать на родном «языке 1С», где всё на русском и «каждый бухгалтер может сам доработать для себя нужную функциональность»*.
(* — ложь.)

Я глумлюсь, конечно...
(«Я глумлюсь, следовательно, я существую.» (с))

Последние штрихи для самых сильных читателей:

Пароли хранятся в md5 (пздц), который наложен дважды (пздц2).
Нет, я серьёзно, слово "пароль" становится "e242f36f4f95f12966da8fa2efd59992", но в базу записывается md5 от этого: "0071c590456eed568122a658be38d664".
$md5_password = md5( $md5_password );, я не шучу.

Запрос "SELECT * FROM _users WHERE {$where_name} AND password='{$md5_password}'" прекрасен, я считаю.
Прекрасно в нём всё — и звёздочка, и совершенно не избыточный пароль в запросе, и LIMIT 1 :-)

$username = $db->safesql(trim( htmlspecialchars( stripslashes($username), ENT_QUOTES, $config['charset'])));
Ого... то есть, safesql ничего из этого не делает ROFL?! :-D

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

Это же просто наебалово.

И вот такая дрянь, как я недавно видел то ли на Хабре, то ли в CMS Magazine — четвёртая по популярности среди движков «из коробки» в зоне ru.
Беда.

Смотрю я на всё это (данный пример, по своему дебилизму, один из самых «тяжёлых», но ужасающе низкий уровень качества — мягко говоря, не редкость) и невольно думаю, что как ни крути, а имеет смысл лицензировать право на программирование... :-(

Завершу цитатой с Хабра (из статьи полуторалетней давности, по другому вопросу, не про DLE):
«Письмо разработчикам я так и не написал, потому что каждый раз начинал его словами "Вы совсем оху....?"»

?

Log in

No account? Create an account