LINUX.ORG.RU

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

 ,


0

4

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

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

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

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

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

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

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

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

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

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

★★★★★
Ответ на: комментарий от 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
()
Ответ на: комментарий от anonymous

Если не понимает, то вовсе не разработчик.

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

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

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

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

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

В этих вопросах нужно относиться с уважением к другим.
Ведь «серебряной пули» - нет.

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

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

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

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

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

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

Хотя справедливости ради сейчас пересмотрел сообщения Столярова. Он настроен не вообще против языков со сборкой мусора, а против императивных языков с GC. Это уже несколько менее ретроградно, но все равно в текущих реалиях дико выглядит. На Java, C# на том же Python написаны гигатонны кода, в том числе для критических пррименений, языки развиваются и только гуру знает как они там все ошибаются.

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

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

Миллионы леммингов не могут ошибаться?

anonymous
()