Lazin

12 февраля 2018, Санкт-Петербург, Россия

# Понедельник 57 твитов

Здравствуйте, меня зовут Женя и я ал^W почти каждый день пишу код на С++ последние 13 лет.

9:16

Несмотря на весь прогресс, все по прежнему плохо. Инфраструктура и рядом не стояла по сравнению с Go, Js и прочей е… twitter.com/i/web/status/9…

9:18

Да, кстати, IDE для С++ по прежнему оставляют желать лучшего. Даже CLion - так себе. Более или менее работают (не с… twitter.com/i/web/status/9…

9:20

С другой стороны, с тулингом все стало довольно неплохо. CMake, CLang, sanitizers (thread/address/UB).

9:23

C++ это ужасный (но иногда единственный) выбор для OSS проекта. Ужасный потому что людей, способных реализовать сло… twitter.com/i/web/status/9…

9:26

Каждый проект, мой в том числе, реализует свой собственный стек для сборки, тестирования и распространения, с котор… twitter.com/i/web/status/9…

9:28

Управление зависимостями это отдельная тема. Во первых его нет. Если вы пишете код в Linux то все не так печально,… twitter.com/i/web/status/9…

9:30

Скажем в Ubuntu 16.04 есть свежий lz4 который умеет streaming, вы написали код, сделали git push, а на CI у вас Ubu… twitter.com/i/web/status/9…

9:32

Вы собрали свой deb пакет и положили его в свой ppa репозиторий для убунты. Через неделю приходит чувак, который ис… twitter.com/i/web/status/9…

9:33
@backendsecret что на счет rust

я уже пишу на с++, зачем мне еще один? :) twitter.com/zysyg/status/9…

9:36
@backendsecret lifetimes, borrow checker, и прочие фишки, не дающие выстрелить себе в ногу и сделать всякие use after free?

Не помню когда в последний раз делал ошибку, которую это все могло бы предотсвратить. Ну и еще у меня есть coverity… twitter.com/i/web/status/9…

9:45
@backendsecret А что скажете о conan.io ?

Ничего не скажу, чтобы не соврать. Не использовал достаточно долго, чтобы иметь свое мнение. twitter.com/__pewpew__/sta…

9:46
@backendsecret C++, большие деньги и маленькие задержки?

и большая куча legacy twitter.com/krems5/status/…

9:46

Помимо этого, когда я в последний раз на него смотрел, там было принято писать кучу unsafe кода. Это малость defeat… twitter.com/i/web/status/9…

9:50

Иллюстрация того, насколько все плохо - github.com/RoaringBitmap/…. Авторы проекта добавили специальный скрипт, собира… twitter.com/i/web/status/9…

9:56

Можно использовать git submodules, но это работает только если зависимость использует ту же систему сборки что и вы… twitter.com/i/web/status/9…

9:59

Самая жопа это конечно packaging. Я собираю пакеты на CI сервере и раздаю их через packagecloud.io, помимо… twitter.com/i/web/status/9…

10:08
@backendsecret В bazel эту проблему частично победили. Там можно делать ссылки на внешние репозитории в гите и подк… twitter.com/i/web/status/9…
10:09
@backendsecret Собственно то, почему люди и любят докер.

Ну в общем да, но он решает половину проблем. Он не решает проблему управления зависимостями. twitter.com/ctrlok/status/…

10:15

Пожалуй расскажу немного о достоинствах, о том почему я написал Akumuli на С++. Итак.. 1/n

10:51
@backendsecret Неужели настолько необходимо разрабатывать на батарейке? У меня практически всегда есть розетка под… twitter.com/i/web/status/9…

Я как-то летел в самолете 8 часов (+/-) и почти все время писал код в QtCreator, который был запущен в VMware Playe… twitter.com/i/web/status/9…

10:56

Во первых это тулинг. GNU tool-chain, LLVM tool-chain, CMake, valgrind, linux-tools и тд. Скажем, GCC сейчас умеет… twitter.com/i/web/status/9…

12:29

Я могу запустить свое приложение и построить профиль производительности, в котором можно будет увидеть не только вр… twitter.com/i/web/status/9…

12:32

гонки, UB и тд.
Второе преимущество это interoperability. Можно без проблем использовать любую библитеку с Сишным и… twitter.com/i/web/status/9…

12:34

попробуйте сделать динамическую библиотеку на Go или чем нибудь еще кроме Си или С++. Вам придется из-за одной библ… twitter.com/i/web/status/9…

12:35

В Akumuli у меня есть библиотека, в которой живет весь код БД, поэтому БД можно использовать как встраиваемую, поэт… twitter.com/i/web/status/9…

12:37
@backendsecret Давай сразу по делу.
1/ женщина может быть программистом?
2/ на собеседовании просишь писать код н… twitter.com/i/web/status/9…

1/ любая конкретная женщина может быть, а может не быть программистом
2/ мы даем компьютер
3/ ни о чем не говорит в… twitter.com/i/web/status/9…

12:40
@backendsecret на Rust можно

Можно, но она потянет за собой его runtime. Не думаю что это большая проблема, но все же. Помимо этого, существуют… twitter.com/i/web/status/9…

12:45

Мне тут подсказывают, что нужно написать что-нибудь полезное, хотя бы один раз за всю неделю. Попробую рассказать п… twitter.com/i/web/status/9…

15:17

Итак, две даты, которые нужно знать - 28 марта и 31 октября. В эти дни происходит переход на DST и обратно. Если вы… twitter.com/i/web/status/9…

15:19

Один из моих коллег как-то раз был разбужен среди ночи возмущенным начальством из-за того, что режим работы несколь… twitter.com/i/web/status/9…

15:21

Поэтому первый совет, который вам обычно дают - используйте UTC - универсальное координированное время. Это очень х… twitter.com/i/web/status/9…

15:22

Во первых, UTC на конкретной машине может идти назад! Есть такой специальный демон, под названием ntpd, который зан… twitter.com/i/web/status/9…

15:24

2. если часы спешат сильно - просто перевести их назад. Это причина, почему часто одним из требований к системе (на… twitter.com/i/web/status/9…

15:25

Но это еще не все. Есть еще високосные секунды :) Насколько я помню, Unix time в POSIX совместимых системах работае… twitter.com/i/web/status/9…

15:30

Если вы получаете метки времени с секундной точностью, то все ОК. Если с точностью выше секунды, то у вас снова время идет вспять :)

15:31

Тут идет речь про обычные метки времени. Помимо этого, существует т.н. монотонное время, которое назад точно никогд… twitter.com/i/web/status/9…

15:33

Но, его нельзя передавать за пределы приложения, т.к. оно не имеет смысла за ее пределами, не всегда совпадают с ре… twitter.com/i/web/status/9…

15:35

Если вы регистрируете время неких событий из внешнего мира, вам нужно реальное время, в которое добавляются високос… twitter.com/i/web/status/9…

15:35

Еще такой интересный момент, связанный с leap seconds. Ни одна известная мне библиотека для работы с временем их не… twitter.com/i/web/status/9…

15:37

Вы распарсили в своем коде на python две метки времени и посчитали разницу между ними? Это значение не учитывает leap seconds.

15:38

ВСЕ ПЛОХО!

даже если вы храните метки времени в UTC

15:39

И тут наступает время рассказать про те ситуации, когда время нельзя хранить в UTC (PTSD момент). Rule of thumb - е… twitter.com/i/web/status/9…

15:41

Вы хотите запланировать собыите, которое произойдет ровно через сутки, в 14:00, получаете метку времени, добавляете… twitter.com/i/web/status/9…

15:44

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

15:45

Помимо этого, стоит учитывать, что вычисления в локальном времени не всегда корректны, т.к. некоторые библиоетки дл… twitter.com/i/web/status/9…

15:47
@backendsecret И это еще не все, буквально недавно была ситуация когда из-за сбоя NTP сервера нашего датацентра, вр… twitter.com/i/web/status/9…
15:47

Если я ничего не путаю, в python все работает именно так.
Помимо этого, хранить метки времени из будущего в UTC нел… twitter.com/i/web/status/9…

15:50

метка времени может уехать на час в одну или другую сторону. За последние 10 лет, в РФ трижды меняли DST (ЕМНИП) сн… twitter.com/i/web/status/9…

15:52
@backendsecret И вот тут не лишним будет отметить, что функции ожидания в примитивах синхронизации STL от gcc испол… twitter.com/i/web/status/9…
15:52

Помимо UTC есть еще GPS time. Время, которое используют для координации в системе GPS. Оно по настоящему монотонно… twitter.com/i/web/status/9…

15:54

Еще один факт - не все смещения таймзон кратны одному часу. Indian Standard Time - UTC +5:30 например. Поэтому если… twitter.com/i/web/status/9…

15:56

Особенно "весело" писать всякие органайзеры, где пользователь может запланировать мероприятие, а потом в этот день… twitter.com/i/web/status/9…

15:58
@backendsecret А также Непал с 5:45 и всякие острова в Тихом океане, где время одинаковое, но дата может на сутки отличаться

Самый смешной случай был с одним из диспетчерских управлений СО ЕЭС, которое (вместе со всеми энергетиками региона)… twitter.com/i/web/status/9…

16:04

Мне тут напоминают, что в Сиднее, на время олимпиады в 2000м году, ввели DST.

16:07
@backendsecret Миссы с помощью каких инструментов ты профайлишь, cachegrind?
16:49
@backendsecret Вроде есть TAI clock, реализация от автора s6-supervisor skarnet.org/software/skali…
16:58

# Вторник 21 твит

Вчера я написал о том, что все библиотеки для работы со временем сломаны. Сломаны они в предсказуемых местах, поэто… twitter.com/i/web/status/9…

10:31

Там есть все те же проблемы что и везде, но! метка времени там, это на самом деле две метки времени. Когда вы получ… twitter.com/i/web/status/9…

10:33

а если вы захотите вывести метку времени в лог, будет использоваться обычная метка времени. Монотонной метки времен… twitter.com/i/web/status/9…

10:34

В общем, как обычно с golang, за вас подумали и решили что вам лучше подходит, заодно добавили защиту от дурака.

10:35

По поводу Go. Я делаю на нем один свой pet проект, поэтому довольно много кода приходится писать. Это love-hate rel… twitter.com/i/web/status/9…

10:37

Но как язык это что-то жуткое. Чего только стоит обработка ошибок. В коде на Go слишком часто можно встретить `val,… twitter.com/i/web/status/9…

10:46

Отдельного упоминания заслуживает стандартная библиотека. Там очень много сильно странного. Вышеупомянутый package… twitter.com/i/web/status/9…

10:48

Если вы хотите использовать таймаут, то придется использовать другую функцию - DialTimeout (ведь Пайк считает что п… twitter.com/i/web/status/9…

10:49

Самое ужасное это vendoring и работа с зависимостями. Слежу за одним проектом на Go на Github-е, в один прекрасный… twitter.com/i/web/status/9…

10:53
@backendsecret Вот на обработку ошибок гнать не надо. В других языках тоже пустой catch написать можно. Самое главн… twitter.com/i/web/status/9…

главная претензия это не игнор ошибок, а километровые простыни кода, щедро усеяные if err != nil {...} twitter.com/borovikov/stat…

10:56

которые чаще всегд делают `return nil, err` и все, код который в языке с исключениями писать не надо

10:57
@backendsecret Тебе просто специальной клавиатуры не хватает pic.twitter.com/sSZe7Yud2v
10:59
@backendsecret Pragmatic! Practical! Non-academic!
10:59
@backendsecret Скрлько ты знаешь человек, способных написать радежный код на с++, который бы работал, с исключениям… twitter.com/i/web/status/9…

В С++ это сложно только из-за свойств языка. Нужно осилить RAII и основы написания exception safe кода. В языках с… twitter.com/i/web/status/9…

11:14

С другой стороны, в обработке ошибок в Go есть кое что хорошее, это хорошее - panic. Скажем в С++ сейчас мало кто и… twitter.com/i/web/status/9…

11:18

В результате получается, что код, который работать уже не должен, продолжает работать. Нарушения инвариантов должны… twitter.com/i/web/status/9…

11:20
@backendsecret Если посмотреть на это с другой стороны, то vendoring и dep management в Go это как раз самое сильно… twitter.com/i/web/status/9…

Разница в том что история изменений в гите портится. Стараешься делать атомарные коммиты и писать нормальные commit… twitter.com/i/web/status/9…

11:25

С другой стороны это учит думать о том, что ты не просто зависимость в проект притащил, но семизначное количество с… twitter.com/i/web/status/9…

11:27
we are all going to die pic.twitter.com/fAUyR2S9hX
11:35
@flex_ferrum @backendsecret Еще есть байка про то, что в Новосибирске граница UTC+6/UTC+7 таймзон раньше проходила… twitter.com/i/web/status/9…
15:24

# Среда 24 твита

@backendsecret Тоже дело стиля. Атомарный вендоринг, атомарные апдейты завендореных библиотек. Комментарии вида “Ve… twitter.com/i/web/status/9…

Это все конечно возможно, но ты начинаешь делать работу мейнтейнеров и вся эта работа смешивается с историей измене… twitter.com/i/web/status/9…

9:02

Попробую развернуть немного. Давным давно, не дистрибутивы не существовали и администраторы сами собирали все инстр… twitter.com/i/web/status/9…

9:05

Мало того что вам нужно было все собирать самостоятельно. Вам нужно было подписываться на списки рассылки и следить… twitter.com/i/web/status/9…

9:08

... и публикуют пакеты. Администратор просто устанавливает готовые пакеты. Для упрощения жизни были придуманы утили… twitter.com/i/web/status/9…

9:10

Тут появляется Роб Пайк и заявляет что все это лишнее. Удобнее всего деплоить single binary без зависимостей (таки… twitter.com/i/web/status/9…

9:13

Для многих проектов это именно то что нужно. Проблема только в том, что теперь программист должен следить за проект… twitter.com/i/web/status/9…

9:15
@backendsecret Рибейс зло надо описать merge
гайд чтобы пользоваться рибейсом грамотнo. Вроде как при пуле не разрешать комитать

Имеется ввиду `git pull --rebase origin branch_name`. Тут будут рибейзиться только твои локальные изменения, которы… twitter.com/i/web/status/9…

9:17

первое "не" тут лишнее конечно, double negation прямо как в AAVE!

9:19
@backendsecret Можно сделать вендоринг на сабмодулях. Тогда версия зависимости будет пришита к репозиторию

Лучше уж сделать fork репозитория и мерджить upstream вручную. Submodules довольно геморно удалять, плюс ты все рав… twitter.com/i/web/status/9…

9:22
@backendsecret К этому рано или поздно все придут. Вот хороший пример github.com/aptible/superc…
9:23
@backendsecret Ну и да, аргумент, «а вот тут писать код не надо, оно само» — мягко говоря, слабенький.

А потом эти люди пишут костыли, для ручной генерации stack trace-ов из ошибок. twitter.com/CuredPlumbum/s…

11:58

Пожалуй настало время рассказать про разработку Akumuli. Вот обзорная статья на Хабре - habrahabr.ru/post/345974/.

14:31

Когда-то давно я прочитал книгу Малкольма Гладуэлла, название которой не помню, что-то про outliers, в которой расс… twitter.com/i/web/status/9…

14:40

но, во многих случаях, это довольно точная нижняя граница для оценки необходимого опыта. В общем, я впечатлился и р… twitter.com/i/web/status/9…

14:42

Я пользуюсь одним простым правилом. Стараюсь сделать что-нибудь каждый день. Пусть это всего 20 минут кодинга, либо… twitter.com/i/web/status/9…

14:45

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

14:47

И в те моменты, когда ты не пишешь код, есть время подумать над тем что делать дальше. И вот это "подумать" у меня… twitter.com/i/web/status/9…

14:50

Дольше всего в проекте живет код для сжатия данных. Я написал свое сжатие для time-series еще до того как была опуб… twitter.com/i/web/status/9…

15:03

тупо использовали Gorilla paper с небольшими изменениями. Поэтому их алгоритм очень медленно работает (Gorilla это… twitter.com/i/web/status/9…

15:04

Сам алгоритм описан вот здесь - docs.google.com/document/d/1yL…

Для тестирования я использовал фаззинг (american fuzzy lop… twitter.com/i/web/status/9…

15:11

Я надеюсь рано или поздно перейти с AFL на libfuzzer, так как сейчас фаззинг очень медленный и долгий. Вот хорошая… twitter.com/i/web/status/9…

15:12

Почему не стоит? Представьте, что существует такой input, который можно будет сжать и получить результат, который п… twitter.com/i/web/status/9…

15:16
В общем, знайте, что если у человека есть миллиард открытого выдроченного софта в открытом домене или, не дай бог,… twitter.com/i/web/status/9…

Узнаю себя
mobile.twitter.com/vasilenkos/sta…
(на самом деле нет)

17:06

# Четверг 4 твита

@backendsecret ты же можешь ещё и наш подкаст посоветовать послушать, кому интересно! ;)
bit.ly/1srvAcw
9:29
@backendsecret но ведь и для C++ придётся притащить весь рантайм (он просто меньше по объёму будет)

Ну в общем то да. Не факт что меньше. Часть libstdc++ это хедеры с кучей шаблонов, раздувающие размер исполняемого… twitter.com/i/web/status/9…

9:33
@backendsecret А не хочешь пачку твитов про время объединить в блог-пост?

Так ведь это и есть самый настоящий блог, с приставкой "микро", но тем не менее :) twitter.com/dronnix/status…

9:34
@backendsecret У Питера Норвига есть эссе на данную тему (в т.ч. ссылается на Malcolm Gladwell)
norvig.com/21-days.html
9:35

# Пятница 42 твита

@backendsecret Основная проблема в том что influxDB сжимает всего по тысяче значений в блоке, чтоточ мало. Остальное вторично

Изолированный алгоритм работает довольно медленно на любых батчах. Там очень много битовых операций, сдвиги, маски… twitter.com/i/web/status/9…

8:58

Сегодня я планирую вещать про многопоточность и разработку серверных приложений. Начну пожалуй с одного распростран… twitter.com/i/web/status/9…

9:01

мьютексы, лучше используйте атомарные операции или lock-free алгоритмы, это быстрее. Это полная глупость. Во первых… twitter.com/i/web/status/9…

9:03

многопоточке, но ей уделяется слишком мало внимания, как правило. Если у вас есть, скажем, 32 процессора и каждый и… twitter.com/i/web/status/9…

9:05

... мьютекса no contention. Когда вы пытаетесь оценить эффективность того или иного алгоритма, не нужно смотреть на… twitter.com/i/web/status/9…

9:07

High contention это тяжелая операция, no/low contention это практически no-op - десятки наносекунд.

9:08

На этом строятся производительные параллельные алгоритмы. Расскажу на примере Akumuli. В Akumuli есть понятие сесси… twitter.com/i/web/status/9…

9:10

каждый элемент данный относится к тому или иному временному ряду. Каждый временной ряд хранится в центральной табли… twitter.com/i/web/status/9…

9:15

перемещает его в свой локальный кэш, обращение к локальному кэшу тоже защищено мьютексом (другим), только к нему об… twitter.com/i/web/status/9…

9:17

... в тот же ряд, она захватит lock "центральной" таблицы, обнаружит что ряд существует но уже используется другой… twitter.com/i/web/status/9…

9:19

Почему это быстро работает? Потому что обычно, с вероятностью близкой к 100% каждый клиент будет записывать свой на… twitter.com/i/web/status/9…

9:21

захвачен один раз для каждого временного ряда, а мьютекс сессии, будет захватываться только из потока этой сессии,… twitter.com/i/web/status/9…

9:23

Вот так это выглядит на 32х ядерном инстансе - akumuli.org/akumuli/2017/0… pic.twitter.com/FJoqAa7Jp4

9:25

Если надо, я могу про код на бумажке и женщин, вы только скажите. twitter.com/blazernere/sta…

9:25

К атомарным операциям все вышесказанное тоже относится в равной степени. Атомарная переменная в которую пишут десят… twitter.com/i/web/status/9…

9:28

Счетчики в многопоточном окружении оптимизируются с использованием ровно тех же принципов, для примера можно заглян… twitter.com/i/web/status/9…

9:31

На своей локальной машине вы можете не заметить деградацию производительности, т.к. код часто пишется на слабых маш… twitter.com/i/web/status/9…

9:35
@backendsecret А что насчёт memory ordering, приходилось ли тюнить атотомики( очень много видел их использование то… twitter.com/i/web/status/9…

Я пишу только под x86, там strong memory order по умолчанию, поэтому подобный тюнинг ничего не дает :) Но, эти флаг… twitter.com/i/web/status/9…

9:37

использовать acquire/release. На правильной арх. это будет быстрее, но помимо этого, это сделает код более понятным… twitter.com/i/web/status/9…

9:39

Lock-free это та же ерунда. Если у вас есть LF очередь, которая находится под high contention, то это медленно :) М… twitter.com/i/web/status/9…

9:45

Одно из таких применений, которое я видел не скажу где, заключалось в том, что LF очередь использовалась для взаимо… twitter.com/i/web/status/9…

9:47

Если бы там использовалась обычная синхронизация, все могло бы встать колом (deadlock).

9:48
@blazernere @backendsecret Нене мне нравится, продолжайте? Кстати у вас есть блог про программирование, а то в твит… twitter.com/i/web/status/9…

У меня есть мой персональный твиттер (там в основном про еду) и блог на akumuli.org - там на английском… twitter.com/i/web/status/9…

9:51
Красота - это когда что-то "печется" без простоя twitter.com/backendsecret/…
11:24

Тут недавно одни чуваки из какого-то университета в Британии опубликовали статью про свою БД с кучей тестов, в кото… twitter.com/i/web/status/9…

11:49

Вот их табличка с результатами для сжатия (нужно учитывать что influxdb не хранит дубликаты, а в некоторых датасета… twitter.com/i/web/status/9…

12:00

Вот табличка с результатами тестирования скорости записи (не нашел сколько же точно значений в каждом row). Ну и "D… twitter.com/i/web/status/9…

12:26

Ну и последний график на сегодня - скорость агрегации. Нативная агрегация есть только в Akumuli и у этих чуваков. pic.twitter.com/IfDLl20AcV

12:30

Еще один аспект разработки многопоточных приложений, который часто упускают из вида, это балансировка нагрузки. Час… twitter.com/i/web/status/9…

12:32

Это работает в простых случаях, например data parallelism с кучей одинаковых задач. В более сложных случаях, нагруз… twitter.com/i/web/status/9…

12:34

Для data parallel приложений тут все довольно просто, т.к. давно придуман алгоритм task stealing, который сидит уже… twitter.com/i/web/status/9…

12:36

Насколько я знаю, scheduler в golang использует task stealing. В этой статье есть хорошее описание - en.wikipedia.org/wiki/Work_stea…

12:41

Но помимо data parallel приложений, которые можно побить на fine grained задачи, которые можно выполнять таким спос… twitter.com/i/web/status/9…

12:44

приходят по очереди, поэтому их нельзя выполнять параллельно, используя несколько worker-ов. Чтобы распараллелить п… twitter.com/i/web/status/9…

12:45

потом промежуточный результат Х1 кладется в межпоточную очередь, из которой его выбирает второй поток, там он обраб… twitter.com/i/web/status/9…

12:47

В идеале, у вас получится задействовать столько ядер, сколько у вас потоков в пайплайне. В идеале = каждый этап пай… twitter.com/i/web/status/9…

12:50

вы получите последовательное приложение. В этом случае, нужно постараться пересмотреть структуру приложения и разби… twitter.com/i/web/status/9…

12:52

через которые передаются данные, будет постоянно забита, а другая часть - наоборот. Поэтому если у вас есть приложе… twitter.com/i/web/status/9…

12:53

Это можно делать динамически, но это уже совсем не просто. Вот например интересный проект github.com/RaftLib/RaftLib э… twitter.com/i/web/status/9…

13:03
@backendsecret Эти бенчмарки вообще ни о чем не говорят. Ни про репликацию, ни про consistency write-ов тут ни слов… twitter.com/i/web/status/9…

Там нет ничего про репликацию потому что все крутится на одной машине. Тестовая конфигурация описана в статье. twitter.com/meln1k/status/…

13:52

В этой статье описывается стек для мониторинга на основе Kubernetes, Sonar и Akumuli - itnext.io/monitoring-on-…

14:32
@backendsecret На какой ide akumuli пишешь?

Код на С++ в QtCreator. Код на python и typescript в Visual Studio Code. twitter.com/truetobetrue/s…

17:06

# Суббота 6 твитов

Попробовал себя недавно в роли фронтендера github.com/akumuli/akumul… До этого никогда не писал на typescirpt.

На дру… twitter.com/i/web/status/9…

11:43

Очень долго возился с Grunt.js файлом, потом мне посоветовали забить и взять готовый шаблон для graphana плагина. Н… twitter.com/i/web/status/9…

11:48

Тулинг просто отличный. В VSCode просто ставится плагин и начинает работать подсветка/автодополнение/навигация по п… twitter.com/i/web/status/9…

11:51

Самое главное разочарование в фронтенде, это верстка. Там нет ничего сложного, но люди до сих пор пишут руками все… twitter.com/i/web/status/9…

11:53

На самом деле, я считаю что каждый backend разработчик, должен хоть немного уметь обращаться со всеми этими fronten… twitter.com/i/web/status/9…

11:55
@backendsecret более того, у бэкэндера нет выбора, он обязан понимать, что происходит на фронте. На время разработк… twitter.com/i/web/status/9…

На самом деле, можно работать над какой-нибудь подсистемой, с которой фронтенд напрямую не взаимодействует. Но част… twitter.com/i/web/status/9…

12:00

# Воскресенье 2 твита

Сегодня я пол дня провел в самолете и ничего хорошего не написал. Зато ударно поработал над проектом, т.к. в самоле… twitter.com/i/web/status/9…

23:28

И на этом пожалуй стоит попрощаться. С вами был @Lazin, всем спасибо за внимание, вы хорошее комьюнити :)

23:32

other