LINUX.ORG.RU

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

 ,


0

4

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Поверьте - проще. Если отбросить SHM то в целом состояние гораздо более предсказуемое.

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

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

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

lockless - это очень редко где нужно. но можно раскорячиться, если нужна прямо очень высокая производительность. оно тоже не сложное, в принципе, просто гораздо реже применяется. и оно жрёт ресурсы. по сути, это copy-on-write, реализованный в юзер-спейсе.

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

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

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

если ты понимаешь, как работать с расшаренными объектами, то нет проблем. если не понимаешь, то начинаются рассказы про «непредсказуемость».

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

пример: простейший однопоточный dns сервер получил запрос мгновенно в памяти нашёл ответ и тут же ответ отослал, тут же ползёт за следующим.

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

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

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

пример: простейший однопоточный dns сервер получил запрос мгновенно в памяти нашёл ответ и тут же ответ отослал, тут же ползёт за следующим.

А зачем тут многопоточность? Просто потому, что так можно и молодежно?

eao197 ★★★★★
()
Ответ на: комментарий от s-warus

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

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

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

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

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

Я не до конца понимаю зачем вы отрицаете очевидное.

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

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

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

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

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

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

фанатизм любой опасен.

s-warus ★★★★
()
Ответ на: комментарий от bugfixer

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

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

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

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

Ну да, ну да, ну да.

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

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

Как не стыдно: non-blocking IO никто не отменял.

bugfixer ★★★★★
()
Ответ на: комментарий от s-warus

с этим соглашусь. фанатизм не нужен нигде.

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

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

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

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

А как так вышло, что тупой он, а что ты будешь делать и сколько тебе платить решает тоже он?

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

Ваще легко:

  • Относительное время выполнения задач
  • Относительное количество жалоб на низкое качество кода от лида команды
  • Количество часов психотерапии, которые приходится проводить сотруднику
  • Количество конфликтов внутри команды, которое порождает сотрудник
anonymous
()
Ответ на: комментарий от Iron_Bug

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

Ну ты породила кучу дорогих флашей кеш-линий (а любая синхронизация это флаш кеш-линии) на пустом месте. И ради чего? Если это не долгие compute-bound задачи, чем меньше треды синхронизируются, тем лучше. В идеале они все прибиты по одной штуке на ядро и никто даже в ядро не ходит, потому что сисколы это тоже дорого.

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

тренируйтесь, пишите код - и всё у вас получится. ещё раз повторю: там нет ничего сложного, если включать мозги.

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

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

тренируйтесь, пишите код - и всё у вас получится.

Да как бы с середины 1990-х тренируюсь, тренируюсь, а каждый раз, когда приходится упарываться голой многопоточностью, на обычных mutex-ах и condition_variables, даже не опускаясь до atomic-ов, неизбежно приходит понимание, что я недостаточно умен для этого :(

ещё раз повторю: там нет ничего сложного, если включать мозги.

Позволю себе не поверить.

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

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

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

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

можешь не верить, но это так.

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

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

Ещё как породила. Многопроцессность != многопоточность в том разговоре, который сейчас идет. Если у тебя нет синхронизации между тредами – это многопоточность, потому что общей памяти (и необходимости её синхронизировать) – нет.

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

там нет ничего сложного

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

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

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

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

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

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

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

с чего это она вдруг «сраная»-то?

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

срутся там только неосиляторы.

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

у остальных проблем нет.

У кого не пишет – конечно нет. Нет синхронизации – нет проблем.

но это не проблема сишки

Конечно, это проблема сишных программистов. Поэтому-то они все и перестали на C писать.

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

Мы много раз этот бред читали, а дальше-то что?

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

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

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

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

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

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

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

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

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

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

но я вас оставлю в покое. сидите в своей пещере и бойтесь всего и дальше. нам больше работы достанется :)

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

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

это твоё заявление, без каких-либо аргументов и личного опыта

Это базированный факт.

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

Это все было прекрасно давным-давно. Когда у тебя процессор на 96 ядер, сеть 400 Gib/s и диски выдают по 7 MIOPS, а задержки записи приближаются к наносекундам, внезапно оказывается, что лочить кешлинию на каждый чих – дорога. И проще вообще ничего не лочить. А если ничего не лочить, то и шареная память не нужна.

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

вот когда у всех в мире будут такие ноутбучеки - тогда и вернёмся к этому разговору. а пока что мир не настолько офигел от излишков денег, чтобы разбрасываться «лишними» ресурсами. но даже на 96-ядерном проце параллельные вычисления быстрее :)

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

вот когда у всех в мире будут такие ноутбучеки - тогда и вернёмся к этому разговору. а пока что мир не настолько офигел от излишков денег, чтобы разбрасываться «лишними» ресурсами. но даже на 96-ядерном проце параллельные вычисления быстрее :)

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

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

однако, студентам я всё же рекомендую

Так как мелькает не первый раз не могу не поинтересоваться: вы преподаёте? Формально вовлечены в образовательный процесс?

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

А non-blocking IO, это, зачастую, тред в пространстве ядра.

Возможно. Но один на устройство. А не 100500 потоков в user space ломящихся в одну дверь. И в контексте синхронизации - всё это напрочь спрятано от юзера. И «волосы становятся мягкими и шелковистыми», или как там было.

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

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

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

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

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

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

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

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

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

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

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

Iron_Bug ★★★★★
()

Почитал я и другие высказывания Столярова. В чем-то удивительный человек. Ментально и опытом застрял в 90-х. Чуть ли не все его рассуждения на тему, что есть правильно и неправильно - это опыт 90-х.

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

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

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

Если не понимает, то вовсе не разработчик.
Хотя как учитель весьма талантлив и пожалуй «на своём месте».

anonymous
()