There will be no singularity – Telegram
There will be no singularity
1.99K subscribers
248 photos
15 videos
5 files
995 links
Smartface, technologies and decay
@antonrevyako
Download Telegram
По ссылке ниже показано как хороша жизнь без наркотиков (зачеркнуто) у джавистов, которые используют mysql и jooq.

https://stackoverflow.com/a/60165985/521799

Если вы не знаете что такое jooq, то я расскажу. Это такая страшная ORM для джавистов, где есть отдельный DSL (свой язык), который билдится в sql.

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

Фанаты jooq называют это simple hack, кстати :)
​​я посмотрел ^.
Разговор шел с героем этого твита:

https://news.1rj.ru/str/nosingularity/252

Никаких особенных откровений не было. Выгнали пхпэшников, которые не знают sql, взяли тех, которые знают. 10 лет страдали, теперь не страдают. Что мешало не страдать - не рассказали :)

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

Но rocket science при этом не происходит.

Почему не подумали до этого - хз. Зачем рассказывать какие вы балбесы - хз.
​​открытое письмо, блин :)

@jitbit написал как он решал боль с тринарным оператором:

https://news.1rj.ru/str/devfounder/18

У меня есть пара комментариев, которые явно не тянули на отдельную статью, но теперь можно :)

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

Это плохо по многим причинам, но основная причина в том, что разные люди могут подразумевать разное, а компилятор совсем другое :)

Я стараюсь придерживаться принципа more verbose и искренне вам советую.

Например, в нашем конфиге линтера включено правило, которое запрещает в тринарных операторах писать так:
a ? 1 : 2

нужно обязательно написать конкретно:
a != null ? 1 : 2

Больше букв? Больше. Но, как говорится, есть нюанс :)
"" ? 1 : 2

Результат равен 2.
оО скажете вы. «Сюрприз!», - скажет js.

Или еще одна вещь, которая пила мне кровь, и мы, кажется, тоже запретили ее в линтере.
Это дефолтные значения параметров в функциях.

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

Что тут такого?
Описана, например, функция getData(query, limit=100), которая, допустим, выбирает что-то из базы с заданным лимитом. В коде она будет выглядеть как
getData(‘...’)
Сколько времени придется потратить, прежде чем новый программист в этом проекте поймет почему у него иногда возвращаются не все данные?
Зависит от опыта, но это явно не 5 минут.
Как сэкономить себе и другим нервы и время? заведите рядом константу или передавайте это значение из конфига.

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

1,2.map(console.log)

Что ожидается? Две строки со значениями элементов в консоли. А что будет?
1,0
2,1

wtf? В колбек map передается две переменных - значение и номер в массиве. А console.log выведет все, что ей передали.
Конкретно в этом случае это безвредно, но так будет не всегда :)

И последний пример, показывающий важность статического анализа.
Есть в js вещь, которую без типов и стат анализа не сделать, и она портит жизнь всем js/flow/ts разработчикам в мире. Это конструкция вида

array.includes(value)

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

1,2.includes(object)

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

1,2.includes(object.field)

Один раз я потратил 5 часов, когда искал эту багу.
После чего я попросил запилить ворнинг для линтера, который будет орать на все .includes
Лучше я проверю это место руками и задизейблю это правило для конкретной строки, чем пропущу это место.

Какие выводы, кроме того, что js и питон плохие языки и даже статические типизаторы вас не спасут?

1) изучайте разные языки для расширения кругозора. В функциональных языках невозможно делать if без else и рекурсивную функцию без описанного условия выхода. И тринарному оператору нельзя существовать без правой части.
Если вы будете делать так же в своем коде, завтрашний вы скажет вам спасибо :)

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

3) используйте статические анализаторы и статическую типизацию в языках, где нет нормальной типизации. Велика вероятность, что это сэкономит вашей компании много денег, а вас не лишит места в этой компании :)

Кстати, скоро я выкачу первую версию статического анализатора для sql, поэтому готовьте ваши запросы :)
​​И, конечно же, этот пост был бы не полным без этой картинки
а еще кривой бот сожрал квадратные скобки у всех массивов. ЪУЪ!
Forwarded from I hate overtime
This media is not supported in your browser
VIEW IN TELEGRAM
И вместо пятничного мема вот вам гифка на случай важных переговоров.
Если что, это Robert Martin, автор Clean Code
Апдейт из обсуждения поста
https://news.1rj.ru/str/nosingularity/261
в чате канала:

1) дефолтные значения параметров не спасут вас от попадания туда undefined. Пример:
const parseString = (str = '') => {console.log(str)};
parseString(undefined);


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

3) parseString(str = '') это не тоже самое, что parseString(val || '')

4) «ide подсвечивает параметры функции». Не любая, не все и не всегда. Кроме того, ide это делает только в процессе написания кода. Когда код написан, уже никто ничего не подсвечивает.
Если уровень понимания кода во время его написания отличается от уровня понимания во время его чтения, такой код называется write only.
Это плохо, тк дебажить и рефакторить такой код становится очень тяжело.

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

6) типы не спасут от нарушения сервером (фронтом) контракта. Типы для этого не предназначены. От нарушения контракта спасают схемы контрактов и обязательная валидация объектов по этим контрактам. Для json это json-schema. Но так же есть другие форматы, где схема присутвует by design

7) покажи конфиг. Показываю:
https://github.com/acmecryptocorp

Замечу, что создавал и поддерживал этот конфиг отдельный умный разработчик :)

8) js плохой язык. Большенство плохие. Часть при этом еще и скучные. Но с хорошими языками сложная ситуация - вы либо не сможете на них писать, либо не будет желания писать ни на чем, кроме них, а таких вакансий довольно мало.
Бэкам рекомендую посмотреть haskell, фронтам elm.

В далеких планах у меня переезд с flow на go, и хочу замерять скорость перехода.
Буду держать вас в курсе :)
​​Пока в чате бурлит дискуссия, вот еще один скриншот :)
​​https://habr.com/ru/company/piter/blog/489660/

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

Предвижу тред на 300 каментов :)

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

Я уже давал ссылку о том, сколько данных теряет кластер монги, но не грех повторить:

https://aphyr.com/posts/284-jepsen-mongodb

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

Но aggregation framework это, на мой взгляд, кровь из глаз.

И при любом шаге в сторону при хранении данных в ненормализованном виде приходит пушной зверёк.

Там, кстати, еще есть про редис, рекомендую.

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

Еще мне нравится neo4j. Надеюсь, что когда-нибудь дойдут руки до одного проекта с графами.

Я уже рассказывал, что Miro (ex-realtimeboard) очень долго хранили все в redis. И теперь из-за этого имеют довольно некрасивый api.

Есть всякие экзотические штуки типа foundationDB, tarantool, и прочего, но я, к сожалению, не слышал о их применении в проде за пределами компаний, которые их разработали.
Добавлю, что для хранения json идеально подходит postgresql, особенно после появления jsonpath в 12 версии
И да, я знаю, что stripe используют mongo в качестве основной базы. От этого становится особенно страшно за благополучие всех, использующих его компаний.

Что я только не повидал за годы работы с процессингами. Отсутствие монги не гарантирует хороший сервис. Но ее присутствие гарантирует много проблем.
​​Красные вырываются вперёд...

https://blog.cloudflare.com/cloudflares-gen-x-servers-for-an-accelerated-future/

Клаудфлара рассказывает о своих новых серверах, в которых будут стоять кремни от AMD.

Как говорится, ушла эпоха.
Интересно, все те дыры в процах синих повлияли на выбор?

У меня, кстати, был десктоп на AMD. С тремя, сцк, ядрами :)

А еще, внезапно выяснилось, что у меня нет ни одного компа с видюхой от NVIDIA - все от INTEL или AMD. Поэтому фак ю, а не CUDA :(

Клаудфлара, кстати, большие молодцы. Вот пост о том, как они заменили elastic на clickhouse и сэкономили пикап денег:

https://blog.cloudflare.com/http-analytics-for-6m-requests-per-second-using-clickhouse/

Вот это видно - умеют люди в unit-экономику, не то что dhh со своими RoR (https://news.1rj.ru/str/nosingularity/215)
​​В личку пришла ругань по мотивам https://news.1rj.ru/str/nosingularity/268, связанная с neo4j.
Говорят, что некачественный продукт :(
И это плохо, потому как из всех графовых баз эта казалась самой грамотной.

Есть еще redis-graph, но тут, сами понимаете, зависит от размера базы. Если засовывать что-то большое, то либо придется продать органы Безосу, либо покупать optane и мучаться самим...
​​Вот сложно им было в json, придумали yaml. Нате, получите :)

https://twitter.com/chrisjrn/status/1232016100038266880

norway == no
namibia == na
ontario == on

Последние два, видимо, шутка :)

ps: https://noyaml.com/
Forwarded from addmeto
Все, режим тестирования закончился - Amazon запустили свой первый полностью автоматизированный ретейл магазин Amazon Go Grocery. Ни кассиров, ни касс, ничего такого - сканируйте свой QR-код на входе, набирайте товары и выходите, деньги спишутся с вашего счета. При этом все автоматическое и работает, не важно сколько вы стояли у полки, не важно сколько раз вы передумали и клали товары обратно на полку - важно только что вы вынесли из магазина.

Удобно, кажется в следующий визит в Штаты надо будет заглянуть в Сиетл хотябы ради этого https://www.geekwire.com/2020/amazon-goes-bigger-first-amazon-go-grocery-new-seattle-store-using-cashierless-technology/