Тест несправедлив к базе данных. find_hashes_csv - это по сути один запрос, а база каждую итерацию вынуждена выполнять много оверхеда, типа парсинга SQL-запроса, обмен данными между процессами. И и со всем этим она умудряется работать лишь немного медленнее чем ваш алгоритм. Предлагаю, справедливости ради, переписать тест для базы чтобы запросы отправлялись батчами.
Вся эта ситуация напомнила историю про неразменный пятак из "Понедельник начинается в субботу" Стругацких, не могу удержаться, чтобы не процитировать:
Hidden text
Я вышел на площадь и остановился перед киоском с газированной водой. Я точно помнил, что мелочи у меня нет, и знал, что придется разменивать бумажку, и уже готовил заискивающую улыбку, потому что продавщицы газированной воды терпеть не могут менять бумажные деньги, как вдруг обнаружил в кармане джинсов пятак. Я удивился и обрадовался, но обрадовался больше. Я выпил газированной воды с сиропом, получил мокрую копейку сдачи и поговорил с продавщицей о погоде. Потом я решительно направился домой, чтобы скорее покончить с ЕУ и ТО и заняться рационал-диалектическими объяснениями. Копейку я сунул в карман и остановился, обнаружив, что в том же кармане имеется еще один пятак. Я вынул его и осмотрел. Пятак был слегка влажный, на нем было написано «5 копеек 1961», и цифра «6» была замята неглубокой выщерблинкой. Может быть, я даже тогда не обратил бы внимания на это маленькое происшествие, если бы не то самое мгновенное ощущение, уже знакомое мне, – будто я одновременно стою на проспекте Мира и сижу на диване, тупо разглядывая вешалку. И так же, как раньше, когда я тряхнул головой, ощущение исчезло.
Некоторое время я еще медленно шел, рассеянно подбрасывая и ловя пятак (он падал на ладонь все время «решкой»), и пытался сосредоточиться. Потом я увидел гастроном, в котором утром спасался от мальчишек, и вошел туда. Держа пятак двумя пальцами, я направился прямо к прилавку, где торговали соками и водой, и без всякого удовольствия выпил стакан без сиропа. Затем, зажав сдачу в кулаке, я отошел в сторонку и проверил карман.
Это был тот самый случай, когда психологического шока не происходит. Скорее я удивился бы, если бы пятака в кармане не оказалось. Но он был там – влажный, 1961 года, с выщерблинкой на цифре «6». Меня подтолкнули и спросили, не сплю ли я. Оказывается, я стоял в очереди в кассу. Я сказал, что не сплю, и выбил чек на три коробка спичек. Встав в очередь за спичками, я обнаружил, что пятак находится в кармане. Я был совершенно спокоен. Получив три коробка, я вышел из магазина, вернулся на площадь и принялся экспериментировать.
Эксперимент занял у меня около часа. За этот час я десять раз обошел площадь кругом, разбух от воды, спичечных коробков и газет, перезнакомился со всеми продавцами и продавщицами и пришел к ряду интересных выводов. Пятак возвращается, если им платить. Если его просто бросить, обронить, потерять, он останется там, где упал. Пятак возвращается в карман в тот момент, когда сдача из рук продавца переходит в руки покупателя. Если при этом держать руку в одном кармане, пятак появляется в другом. В кармане, застегнутом на «молнию», он не появляется никогда. Если держать руки в обоих карманах и принимать сдачу локтем, то пятак может появиться где угодно на теле (в моем случае он обнаружился в ботинке). Исчезновение пятака из тарелочки с медью на прилавке заметить визуально не удается: среди прочей меди пятак сейчас же теряется, и никакого движения в тарелочке в момент перехода пятака в карман не происходит.
Итак, мы имели дело с так называемым неразменным пятаком в процессе его функционирования. Сам по себе факт неразменности не очень заинтересовал меня. Воображение мое было потрясено прежде всего возможностью внепространственного перемещения материального тела. Мне было совершенно ясно, что таинственный переход пятака от продавца к покупателю представляет собой не что иное, как частный случай пресловутой нуль-транспортировки, хорошо известной любителям научной фантастики также под псевдонимами: гиперпереход, репагулярный скачок, феномен Тарантоги... Открывающиеся перспективы были ослепительны.
У меня не было никаких приборов. Обыкновенный лабораторный минимальный термометр мог бы дать очень много, но у меня не было даже его. Я был вынужден ограничиваться чисто визуальными субъективными наблюдениями. Свой последний круг по площади я начал, поставив перед собой следующую задачу: «Кладя пятак рядом с тарелочкой для мелочи и по возможности препятствуя продавцу смешать его с остальными деньгами до вручения сдачи, проследить визуально процесс перемещения пятака в пространстве, одновременно пытаясь хотя бы качественно определить изменение температуры воздуха вблизи предполагаемой траектории перехода». Однако эксперимент был прерван в самом начале.
Когда я приблизился к продавщице Мане, меня уже ждал тот самый молоденький милиционер в чине сержанта.
– Так, – сказал он профессиональным голосом.
Я искательно посмотрел на него, предчувствуя недоброе.
– Попрошу документики, гражданин, – сказал милиционер, отдавая честь и глядя мимо меня.
– А в чем дело? – спросил я, доставая паспорт.
– И пятак попрошу, – сказал милиционер, принимая паспорт.
Я молча отдал ему пятак. Маня смотрела на меня сердитыми глазами. Милиционер оглядел пятак и, произнеся с удовлетворением: «Ага...», раскрыл паспорт. Паспорт он изучал, как библиофил изучает редкую инкунабулу. Я томительно ждал. Вокруг медленно росла толпа. В толпе высказывались разные мнения на мой счет.
– Придется пройти, – сказал наконец милиционер.
Мы прошли. Пока мы проходили, в толпе сопровождающих было создано несколько вариантов моей нелегкой биографии и был сформулирован ряд причин, вызвавших начинающееся у всех на глазах следствие.
В отделении сержант передал пятак и паспорт дежурному лейтенанту. Тот осмотрел пятак и предложил мне сесть. Я сел. Лейтенант небрежно произнес: «Сдайте мелочь», и тоже углубился в изучение паспорта. Я выгреб из кармана медяки. «Пересчитай, Ковалев», – сказал лейтенант и, отложив паспорт, стал смотреть мне в глаза.
– Много накупили? – спросил он.
– Много, – ответил я.
– Тоже сдайте, – сказал лейтенант.
Я выложил перед ним на стол четыре номера позавчерашней «Правды», три номера местной газеты «Рыбак», два номера «Литературной газеты», восемь коробков спичек, шесть штук ирисок «Золотой ключик» и уцененный ершик для чистки примуса.
– Воду сдать не могу, – сказал я сухо. – Пять стаканов с сиропом и четыре без сиропа.
Я начинал понимать, в чем дело, и мне было чрезвычайно неловко и муторно при мысли, что придется оправдываться.
– Семьдесят четыре копейки, товарищ лейтенант, – доложил юный Ковалев.
Лейтенант задумчиво созерцал кучу газет и спичечных коробков.
– Развлекались или как? – спросил он меня.
– Или как, – сказал я мрачно.
– Неосторожно, – сказал лейтенант. – Неосторожно, гражданин. Расскажите.
Я рассказал. В конце рассказа я убедительно попросил лейтенанта не рассматривать мои действия как попытку скопить денег на «Запорожец». Уши мои горели. Лейтенант усмехнулся.
– А почему бы и не рассматривать? – осведомился он. – Были случаи, когда накапливали.
Я пожал плечами.
– Уверяю вас, такая мысль не могла бы прийти мне в голову... То есть что я говорю – не могла бы, она действительно не приходила!..
Лейтенант долго молчал. Юный Ковалев взял мой паспорт и снова принялся его рассматривать.
– Даже как-то странно предположить... – сказал я растерянно. – Совершенно бредовая затея... Копить по копейке... – Я снова пожал плечами. – Тогда уж лучше, как говорится, на паперти стоять...
– С нищенством мы боремся, – значительно сказал лейтенант.
– Ну правильно, ну естественно... Я только не понимаю, при чем тут я, и... – Я поймал себя на том, что очень много пожимаю плечами, и дал себе слово впредь этого не делать.
Лейтенант снова изнуряюще долго молчал, разглядывая пятак.
– Придется составить протокол, – сказал он наконец.
Я пожал плечами.
– Пожалуйста, конечно... хотя... – Я не знал, что, собственно, «хотя».
Некоторое время лейтенант смотрел на меня, ожидая продолжения. Но я как раз соображал, под какую статью уголовного кодекса подходят мои действия, и тогда он придвинул к себе лист бумаги и принялся писать.
Юный Ковалев вернулся на свой пост. Лейтенант скрипел пером и часто со стуком макал его в чернильницу. Я сидел, тупо рассматривая плакаты, развешанные на стенах, и вяло размышлял о том, что на моем месте Ломоносов, скажем, схватил бы паспорт и выскочил в окно. В чем, собственно, суть? – думал я. Суть в том, чтобы человек сам не считал себя виновным. В этом смысле я не виновен. Но виновность, кажется, бывает объективная и субъективная. И факт остается фактом: вся эта медь в количестве семидесяти четырех копеек юридически является результатом хищения, произведенного с помощью технических средств, в качестве каковых выступает неразменный пятак...
– Прочтите и подпишите, – сказал лейтенант.
Я прочел. Из протокола явствовало, что я, нижеподписавшийся Привалов А. И., неизвестным мне способом вступил в обладание действующей моделью неразменного пятака образца ГОСТ 718-62 и злоупотребил ею; что я, нижеподписавшийся Привалов А. И., утверждаю, будто действия свои производил с целью научного эксперимента без каких-либо корыстных намерений; что я готов возместить причиненные государству убытки в размере одного рубля пятидесяти пяти копеек; что я, наконец, в соответствии с постановлением Соловецкого горсовета от 22 марта 1959 года, передал указанную действующую модель неразменного пятака дежурному по отделению лейтенанту Сергиенко У. У. и получил взамен пять копеек в монетных знаках, имеющих хождение на территории Советского Союза. Я подписался.
Лейтенант сверил мою подпись с подписью в паспорте, еще раз тщательно пересчитал медяки, позвонил куда-то с целью уточнить стоимость ирисок и примусного ершика, выписал квитанцию и отдал ее мне вместе с пятью копейками в монетных знаках, имеющих хождение. Возвращая газеты, спички, конфеты и ершик, он сказал:
– А воду вы, по собственному вашему признанию, выпили. Итого с вас восемьдесят одна копейка.
С гигантским облегчением я рассчитался. Лейтенант, еще раз внимательно пролистав, вернул мне паспорт.
– Можете идти, гражданин Привалов, – сказал он. – И впредь будьте осторожнее. Вы надолго в Соловец?
Да что ChatGPT? Я неоднократно встречал людей, которые по первому впечатлению выглядели как грамотные образованные специалисты, пока не начнешь задавать вопросы на понимание. И тут то оказывалось, что знания в голове есть, но они как книги в библиотеке - расставлены по полочкам в алфавитном порядке, но понимания взаимосвязей нет. И такие люди заканчивали школы с золотой медалью, ВУЗы с красными дипломами, но решать практические задачи (за пределами задачек из учебника) - не могли и не понимали, в чем проблема и что не так с их знаниями.
Я думаю, что данная задача проверяет совсем не умение писать сортировку работать с большими файлами. На мой взгляд тут проверяется, насколько человек умеет видеть нечеткие моменты в задаче и задавать уточняющие вопросы, ДО того, как начнет писать код. Т.е. если получив задачу кандидат пошел сразу писать, код, то ему до сеньора-помидора еще как до луны пешком. А если задавать правильные вопросы, и обсудить все детали, то возможно писать ничего и не придется (например, окажется, что можно использовать готовое решение или например данные изначально можно получить в отсортированном виде из источника). Что конечно не отменяет того, что все же надо уметь написать код, который отсортирует за час 100 Гб файл.
Если хотите ощущения прозрения - стоит разобраться, как эти типы устроены под капотом. Осознаёте всю мощь тайпингов, когда обнаружите, что под там в большинстве случаев - пара строчек кода...
Хорошо, когда есть выбор. Про ddd и чистую архитектуру согласен конечно, но это для больших энтерпрайзных проектов, а небольшие пэтпроекты, там смысла нет это все городить, там можно схему атрибутами набросать
Это намекает на то, что у всякой задачи свои методы решения.
Так и есть. SFC хороший пример адекватного инструмента для своей предметной области. Для "широкого круга проектов" он не подходит. А "спагетти" можно и с помощью визуальных языков наворотить. Только вот языки общего назначения обычно дают способы борьбы со спагетти-кодом, а low-code далеко не всегда...
развитие LowCode подходов для более широкого круга проектов позволит значительно оздоровить и перебалансировать рынок SoftWare-разработки
Ничего подобного не случится и не надейтесь.
Сложность предметной области проекта никуда не денется, просто частично перенесется на уровень "заранее заготовленных кусков идеального кода", которые еще кто-то должен спроектировать, предусмотрев все краевые условия, ограничения и возможные сценарии использования (что требует гораздо большей квалификации).
Как вы сами отмечаете, low-code подход давно известен, но не получил широкого распространения, и это как бы намекает...
Спасибо! Действительно понятное (для программиста) объяснение. Про двойную запись и зачем она нужна знал, но как работает не получалось в голове уложить.
Samsung Galaxy S2 - пластиковая крышка на защелках. Повредил разъем для зарядки и ходил несколько месяцев со сменным аккумулятором - один заряжался, другой был в телефоне. За это время крышка не расшаталась, хотя открывал ее каждый день если не чаще. А если бы и расшаталась - была запасная, стоила почти ничего. Как же я скучаю по этому малышу ((
Танки помимо того, что шли в комплекте с денди еще давали бесценный опыт командной игры. И второе, пожалуй и стало причиной их бешенной популярности. Пойти с приятелем после школы играть в марио означало что кто-то будет смотреть как другой играет. Совсем другое дело, если это были танчки. А эмоции, когда ты прикрываешь базу, а твоего боевого товарища подбили - непередаваемы!
Видимо автор сталкивался с ситуациями, когда операторы, имея возможность компенсировать недосвет другими способами, предпочитали крутить исо, убивая картинку.
Тест несправедлив к базе данных. find_hashes_csv - это по сути один запрос, а база каждую итерацию вынуждена выполнять много оверхеда, типа парсинга SQL-запроса, обмен данными между процессами. И и со всем этим она умудряется работать лишь немного медленнее чем ваш алгоритм.
Предлагаю, справедливости ради, переписать тест для базы чтобы запросы отправлялись батчами.
Вся эта ситуация напомнила историю про неразменный пятак из "Понедельник начинается в субботу" Стругацких, не могу удержаться, чтобы не процитировать:
Hidden text
Да что ChatGPT? Я неоднократно встречал людей, которые по первому впечатлению выглядели как грамотные образованные специалисты, пока не начнешь задавать вопросы на понимание. И тут то оказывалось, что знания в голове есть, но они как книги в библиотеке - расставлены по полочкам в алфавитном порядке, но понимания взаимосвязей нет. И такие люди заканчивали школы с золотой медалью, ВУЗы с красными дипломами, но решать практические задачи (за пределами задачек из учебника) - не могли и не понимали, в чем проблема и что не так с их знаниями.
Я думаю, что данная задача проверяет совсем не умение писать сортировку работать с большими файлами. На мой взгляд тут проверяется, насколько человек умеет видеть нечеткие моменты в задаче и задавать уточняющие вопросы, ДО того, как начнет писать код.
Т.е. если получив задачу кандидат пошел сразу писать, код, то ему до сеньора-помидора еще как до луны пешком. А если задавать правильные вопросы, и обсудить все детали, то возможно писать ничего и не придется (например, окажется, что можно использовать готовое решение или например данные изначально можно получить в отсортированном виде из источника).
Что конечно не отменяет того, что все же надо уметь написать код, который отсортирует за час 100 Гб файл.
Если хотите ощущения прозрения - стоит разобраться, как эти типы устроены под капотом. Осознаёте всю мощь тайпингов, когда обнаружите, что под там в большинстве случаев - пара строчек кода...
Хорошо, когда есть выбор. Про ddd и чистую архитектуру согласен конечно, но это для больших энтерпрайзных проектов, а небольшие пэтпроекты, там смысла нет это все городить, там можно схему атрибутами набросать
Статья выглядит как перевод, причем не очень качественный.
Так и есть. SFC хороший пример адекватного инструмента для своей предметной области. Для "широкого круга проектов" он не подходит.
А "спагетти" можно и с помощью визуальных языков наворотить. Только вот языки общего назначения обычно дают способы борьбы со спагетти-кодом, а low-code далеко не всегда...
Спасибо, статья замечательная!
Прочитал, осознал, ушел плакать...
Ничего подобного не случится и не надейтесь.
Сложность предметной области проекта никуда не денется, просто частично перенесется на уровень "заранее заготовленных кусков идеального кода", которые еще кто-то должен спроектировать, предусмотрев все краевые условия, ограничения и возможные сценарии использования (что требует гораздо большей квалификации).
Как вы сами отмечаете, low-code подход давно известен, но не получил широкого распространения, и это как бы намекает...
Спасибо! Действительно понятное (для программиста) объяснение. Про двойную запись и зачем она нужна знал, но как работает не получалось в голове уложить.
Ну так лень ведь )))
Интересный сервис, спасибо за наводку!
Замечательно написано! Аж захотелось пойти попреподавать второкласникам...
А у меня кресло сгорело.
Samsung Galaxy S2 - пластиковая крышка на защелках. Повредил разъем для зарядки и ходил несколько месяцев со сменным аккумулятором - один заряжался, другой был в телефоне. За это время крышка не расшаталась, хотя открывал ее каждый день если не чаще. А если бы и расшаталась - была запасная, стоила почти ничего. Как же я скучаю по этому малышу ((
Это не ddos. Это хабраэффект.
Танки помимо того, что шли в комплекте с денди еще давали бесценный опыт командной игры. И второе, пожалуй и стало причиной их бешенной популярности. Пойти с приятелем после школы играть в марио означало что кто-то будет смотреть как другой играет. Совсем другое дело, если это были танчки. А эмоции, когда ты прикрываешь базу, а твоего боевого товарища подбили - непередаваемы!
Из предыдущего контекста вроде выходит, что автор имел в виду отсутствие механизмов репликации в SQlite.
Видимо автор сталкивался с ситуациями, когда операторы, имея возможность компенсировать недосвет другими способами, предпочитали крутить исо, убивая картинку.