LINUX.ORG.RU

Его крокейшество о вредности СУБД, если архитектурно она для программ, а не живого человека

 ,


0

4

Давно уже что-то про Столярова Croco ничего не было =) А тут он повод недавно дал, расписав почему считает недопустимым использовать СУБД в архитектуре при проектировании софта. То есть, если для каких-то программ нужно хранение данных, его надо индивидуально под программу делать, а не подключать базы данных.

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

http://www.stolyarov.info/guestbook#cmt97

==============

Я придерживаюсь принципа несколько более узкого: недопустимо создание, распространение и использовние программ, для работы которых требуется СУБД.

Причины можно назвать, например, такие:

  1. СУБД — это лишняя внешняя зависимость, при том что вообще любые внешние зависимости суть хамство в отношении пользователей и мейнтейнеров;
  2. СУБД требует трудозатрат на установку, настройку и дальнейшее администрирование;
  3. СУБД способна упасть (и да, падает намного чаще, чем, скажем, тот же апач — вообще пока мои сайты жили на «традиционной» CMSке, именно СУБД была причиной всех случаев downtime моих сайтов, за исключением одного, когда на сервере физически осыпался жёсткий диск);
  4. СУБД требует от пользователя постоянно обновлять навыки, которые, возможно, больше ни для чего не нужны;
  5. СУБД хранит информацию пользователя в неочевидном для него виде; этим грешат не только СУБД, конечно, но СУБД мало того что хранят всё в бинарных файлах, которые без самой СУБД даже думать нечего разобрать, они ещё и вводят дополнительный слой хаотизации в виде схемы БД, провоцируя разработчиков софта на внедрение «решений», единственное «описание» которых остаётся в голове у автора;
  6. СУБД требует изрядных вычислительных мощностей и крадёт (а вовсе не повышает, как почему-то многие уверены) производительность.

Я, заметим, не рискну утверждать, что СУБД как сущность вообще никогда не может ни для чего применяться. Тут вопрос в том, кто на ком стоял: если главной целью является база данных как таковая, то есть вот имеется какой-то значительный объём разнородной, но при этом взаимосвязанной информации и стоит задача обеспечить его хранение и в нём поиск, причём никто заранее не знает, какие именно задачи будут решаться на этом массиве информации, какие именно поисковые запросы будут делаться и вот это вот всё, то да, СУБД вполне может оказаться адекватным решением, и даже для работы с ней могут создаваться вспомогательные программки. Это, конечно, не оправдывает существования языка SQL, который в любых его проявлениях представляет собой надругательство над здравым смыслом, но в целом СУБД как вид софта существовать, наверное, всё-таки может — но лишь в случаях, когда либо вообще нет никаких программ кроме неё самой, либо программы делаются для неё, а не она сама поддерживается для работы какой-то программы.

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

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

★★★★★
Ответ на: комментарий от Qui-Gon

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

Ещё одна фенька: засосать в коде таблицу целиком, а уже потом фильтровать и сортировать в памяти. В дев окружениях работает, потому что там таблицы обычно размером в тысячи строк. Как выкатывается в прод, кладёт сервера, потому что всосать миллион или несколько миллионов строк - либо запредельно долго, либо вызывает OOM.

Я с этим в их коде сталкивался не 1, не 2, и даже не 5 раз. Это прям устойчивый паттерн.

Chiffchaff
()
Ответ на: комментарий от Iron_Bug

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

Если не сложно глянь его код краем глаза: http://thalassa.croco.net/ - интересно мнение человека, много пишущего на Си. Хотя там не совсем Си, больше «Written in a restricted subset of C++, builds statically» - C++ но в варианте не новее 98-го года и без разных наворотов, фактически только Си с классами.

Некоторые говорят, что его код жуткое дерьмое, некоторые, что ничего особенного. По крайней мере его собственные сайты на нем работают.

anonymous
()
Ответ на: комментарий от anonymous

Некоторые говорят, что его код жуткое дерьмое, некоторые, что ничего особенного.

То что croco советует, пригодно лишь для «по пальцам сосчитать» разработчикам, которые создают новые технологии.
А начинающим изучение ЯП такие советы не полезны.

anonymous
()
Ответ на: комментарий от anonymous

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

anonymous
()
Ответ на: комментарий от anonymous

Если не сложно глянь его код краем глаза: http://thalassa.croco.net/

В версии 0.3.53 сходу видны ошибки, совершаемые неопытными C++никами.

Например, в lib/scriptpp/cmd.hpp определяется класс ReadStream, который владеет внешним ресурсом (и этот ресурс в деструкторе закрывается). Но этот класс не защищен от копирования. При копировании произойдет копирование значения ReadStream::f и последующее двойное освобождение в деструкторе.

Аналогично в lib/scriptpp/conffile.hpp в классе ReadConfigFileToVector есть владеющий голый указатель vec, но нет защиты от копирования этого класса.

Как я понимаю, он компилируется с включенными исключениями (не видно ключика -fno-exceptions в его Makefile), при этом в коде используется обычный new и не видно средств обеспечения exception safety. Т.е. видны ручные new/delete, не используется RAII для защиты от возможных исключений. Можно посмотреть, например, конструктор и деструктор для IniFileParser::Parameter в lib/inifile/inifile.cpp:

IniFileParser::Parameter::Parameter(const char *aname, const char *aval)
{
    name = new char[strlen(aname)+1];
    strcpy(name, aname);
    if(aval) {
        value = new char[strlen(aval)+1];
        strcpy(value, aval);
    } else {
        value = 0;
    }
    next = 0;
}

IniFileParser::Parameter::~Parameter()
{
    delete[] name;
    if(value)
        delete[] value;
    if(next) delete next;
}
eao197 ★★★★★
()
Ответ на: комментарий от Iron_Bug

я не представляю себе, как писать веб на Си с нуля, да ещё и без баз данных. это будет что-то слишком маниакальное.

Я пытался. Давно, правда, лет 15 уж прошло. Я тогда внезапно вспомнил про CGI и после какого-то срача тут с Эдиком решил, что почему бы и нет. Ну, если вкратце, надолго меня не хватило. И это было больно :) Сугубо если только совсем уж упоролся, то можно таким заниматься, но вот нужно ли, это другой вопрос (если по фану, то вопрос отпадает, но нужен очень сильный и упоротый фан).

Zhbert ★★★★★
()
Ответ на: комментарий от olegd

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

О да. Это было ещё в далёкие советские годы и сохранилось в различных окологосконторах до сих, правда без всяких новомодных названий. Я проходил на практике → надо закрывать этап по проекту, для этого нужно отчитаться «заказчику», что денежка правильно «оприходована». И начинается цирк: рисовать одну гайку в масштабе 5:1, чтобы на формат А3 или даже А2 влезало, потому что «ыффективность» считалась по количеству форматов, приведённых к А4, и чем больше, тем лучше.

А на последнем псевдозаводе, где я удосужился вступить в дерьмо поработать за пару недель до моего прихода закончился этак дебилизма, когда KPI считали за количество соединений в сборках в SolidWorks или количество операций в дереве модели. Ох и насмотрелся я ИДИОТИЗМА в последствия этого…

Zhbert ★★★★★
()
Ответ на: комментарий от Qui-Gon

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

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

Zhbert ★★★★★
()

Скажем так, не так чтобы он и не прав. Я много раз встречал как люди тянут sqlite для хранения туда, где он им нахрен не сдался и хватило бы самого обычного key-value с бакетами. А там до кучи какой-нибудь ORM сразу же, ну чтоб не писать скуль и на ровном месте, для хранения пары десятков значений, порой даже статических, где хватило бы чуть ли не текстовика, вот это вот всё.

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

Dark_SavanT ★★★★★
()
Ответ на: комментарий от frunobulax

А это вообще в принципе про добровольно-принудительную систему обучения.

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

Iron_Bug ★★★★★
()
Ответ на: комментарий от Iron_Bug

если есть желание, открываешь свою

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

Qui-Gon ★★★★★
()
Ответ на: комментарий от Iron_Bug

да вроде как пошла обратная тенденция - стране (да и миру в целом) нужны неквалифицирванные дешовые приматы, а бабы все гениев рожают. Вот и приходится всякое ЕГЭ придумывать чтобы не дай б-г не выучились а так дебилами и остались.

Qui-Gon ★★★★★
()
Ответ на: комментарий от olegd

вполне простые и прозрачные правила вычисления KPI

увеличивают число строк кода

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

Iron_Bug ★★★★★
()
Последнее исправление: Iron_Bug (всего исправлений: 1)
Ответ на: комментарий от Qui-Gon

да уж ЕГЭ в его современном виде - это вообще ниже всяких плинтусов. только совсем тупой и ленивый не проползёт. там можно процентов 30 набрать даже тыкая галочки случайным образом.

Iron_Bug ★★★★★
()
Ответ на: комментарий от Iron_Bug

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

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

Qui-Gon ★★★★★
()
Ответ на: комментарий от Qui-Gon

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

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

но я всё равно не верю ни в какие формальные «счётчики эффективности». разработка - слишком сложный и многогранный процесс. его не формализовать какой-то мерой.

Iron_Bug ★★★★★
()
Последнее исправление: Iron_Bug (всего исправлений: 2)
Ответ на: комментарий от olegd

Статья заканчивается рекламой логгера Perfexpert, требующего 4 ядра и 100Г памяти, и работающего поверх PostgreSQL :)

этот мир болен. что в голове у тех, кто пишет такой софт?

Iron_Bug ★★★★★
()
Ответ на: комментарий от anonymous

да прям! с чего вдруг-то? какое-то сектантство.

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

Iron_Bug ★★★★★
()
Ответ на: комментарий от Zhbert

ну, написаны же HTTP-серверы на Си и отлично работают. но да, там много гемора из-за кучи стандартов. их сложно писать и отлаживать.

а в CGI писать вообще тривиально. там и писать-то нечего особо. но это довольно уныло: там просто куча разных кейсов. впрочем, весь веб такой.

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

Iron_Bug ★★★★★
()
Последнее исправление: Iron_Bug (всего исправлений: 1)
Ответ на: комментарий от Iron_Bug

логгера Perfexpert, требующего 4 ядра и 100Г памяти, и работающего поверх PostgreSQL

этот мир болен. что в голове у тех, кто пишет такой софт?

Учитывая, при каких нагрузках его применение обосновано, требования не слишком напрягают.

olegd ★★★
()
Ответ на: комментарий от olegd

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

О - оптимизация. такое ощущение, что в неё сейчас вообще не умеют, от слова совсем.

Iron_Bug ★★★★★
()
Последнее исправление: Iron_Bug (всего исправлений: 2)
Ответ на: комментарий от Iron_Bug

ещё и «многопоточность не нужна», оказывается. а мужики-то и не знали.

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

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

Поэтому обидно увольняться, когда все основные проблемы с легаси решены :)

olegd ★★★
()
Ответ на: комментарий от Iron_Bug

О - оптимизация. такое ощущение, что в неё сейчас вообще не умеют, от слова совсем.

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

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

olegd ★★★
()
Ответ на: комментарий от Iron_Bug

Он вообще то хитлер. Но в общем-то он тоже не особо то утилизировал а исподьзовал на тяжелых низкоквалифицированных работах. Арбайт махт фряй или как там у них было.

Qui-Gon ★★★★★
()
Ответ на: комментарий от Zhbert

когда ещё не было или не умели в контроль версий

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

monk ★★★★★
()
Ответ на: комментарий от olegd

у вас что-то не то с разработчиками.

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

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

Iron_Bug ★★★★★
()
Последнее исправление: Iron_Bug (всего исправлений: 1)
Ответ на: комментарий от olegd

эээ.. а как оптимизация противоречит написанию нормального кода? понятно, что для начала не нужно писать говнокод. а оптимизация - это уже потом.

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

Iron_Bug ★★★★★
()
Последнее исправление: Iron_Bug (всего исправлений: 1)
Ответ на: комментарий от Iron_Bug

да уж ЕГЭ в его современном виде - это вообще ниже всяких плинтусов. только совсем тупой и ленивый не проползёт. там можно процентов 30 набрать даже тыкая галочки случайным образом.

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

// Капча какая-то отмороженная пошла: нажмите на объект, который движется иначе. И несколько 3D-моделе каких-то петель, которые вращаются. По наитию прошел ))

anonymous
()
Ответ на: комментарий от anonymous

я вообще про баллы не говорю. тесты - это ненормально. нормально - это полноценные экзамены, письменные и устные, по всем профильным предметам. а не какие-то «баллы».

в наше время «ЕГЭ» - это был один большой экзамен по всему изученному, и ты перед комиссией пишешь ответы (полные решения задач, доказательства теорем и прочее) и отвечаешь устно на любые вопросы по всему курсу изученных предметов. вот это экзамен. а тесты - это чушь собачья.

Iron_Bug ★★★★★
()
Последнее исправление: Iron_Bug (всего исправлений: 1)
Ответ на: комментарий от Iron_Bug

многопоточность - это удобно, практично и надёжно. конечно, если есть голова на плечах

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

anonymous
()
Ответ на: комментарий от anonymous

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

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

Iron_Bug ★★★★★
()
Последнее исправление: Iron_Bug (всего исправлений: 1)
Ответ на: комментарий от Iron_Bug

я вот, кстати, его код не смотрела.

я не представляю себе, как писать веб на Си с нуля

Я пытался развернуть. Как я понял, это не веб-сервер, а CGI-программа. Т.е. веб-сервер надо отдельно разворачивать (apache, nginx, lighttpd и т.д.)

И там «restricted subset of C++».

Jullyfish
()
Ответ на: комментарий от Jullyfish

а, ну CGI гораздо проще. всю основную работу по сетевым протоколам делает HTTP-сервер, а ты только обрабатываешь запросы на верхнем уровне. это нормальный подход.

Iron_Bug ★★★★★
()
Ответ на: комментарий от Iron_Bug

я вообще про баллы не говорю. тесты - это ненормально. нормально - это полноценные экзамены, письменные и устные, по всем профильным предметам. а не какие-то «баллы».

ЕГЭ по математике состоит из двух частей: в 1-й надо записать численный ответ. Во второй - написать развернутое решение.

Можешь сама посмотреть пример профильного задания по математике: https://www.samarov.ru/math/mathege/2024_profile.pdf

Так что ЕГЭ - это давно не выбор вариантов при тестировании, фактически это письменный экзамен.

anonymous
()
Ответ на: комментарий от Iron_Bug

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

Лукавите. Писать многопоток значительно сложнее. А писать эффективный многопоток не пересинхронизированный вусмерть могут вообще немногие. Про lockless я вообще молчу.

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

Сильно.

bugfixer ★★★★★
()
Последнее исправление: bugfixer (всего исправлений: 1)
Ответ на: комментарий от anonymous

Это профильная математика, а есть ещё «базовая», я её по приколу сдавал в 16 году (её не обязательно сдавать, если сдаёшь профильную). Как я помню, там просто тест.

Jullyfish
()
Ответ на: комментарий от bugfixer

Писать многопоток значительно сложнее.

А альтернатива в виде многопроцессовости вряд ли сильно проще если нужно большими объемами данных обмениваться между разными процессами.

eao197 ★★★★★
()