# Понедельник 44 твита
Привет!
Я Игорь @kamyshev_code, работаю в команде веб-платформы @aviasales, мы делаем жизнь фронтендеров в компан… twitter.com/i/web/status/1…
9:04Я буду рассказывать в основном про инфраструктурные штуки, но если интересно будет что-то другое — пишите.
9:05План примерно такой: в понедельник говорим о мониторинге и метриках, во вторник про микрофронтенды, в среду про кон… twitter.com/i/web/status/1…
9:06А темы на выходные пусть останутся сюрпризом 🤓
9:06Давайте начнем с мониторинга фронтенда, мы делаем это с необычной стороны
9:30Когда мы начинали отслеживать метрики, мы не сильно понимали, какие инсайты хотим из них получить
9:31Поэтому решили сначала спроектировать систему сбора максимально широкого спектра метрик, а потом, когда придумаем ч… twitter.com/i/web/status/1…
9:31Система сбора метрик получилась простая как железная дорога — Node.js-приложение, которое по HTTP готово отдавать к… twitter.com/i/web/status/1…
9:32Написали этот сервис (дальше я буду называть его экспортером) и начали придумывать, какие метрики нам будут полезны
9:32Мы хотели следить за общим качеством сайта. Первое, что пришло в голову — отслеживать фон ошибок. Сколько пользоват… twitter.com/i/web/status/1…
9:34У нас уже был Rollbar, куда писались все ошибки. Добавили в экспортере запрос к API, чтобы получить число ошибок и… twitter.com/i/web/status/1…
9:34А потом поняли, что получившийся график очень сильно колеблется. Во-первых, ночью меньше людей пользуются нашим сай… twitter.com/i/web/status/1…
9:35Короче, этот график показывал по большей части посещаемость сайта.
9:35Решили нормировать его на число посещений. У нас уже используется snowplow, как транспорт аналитических событий. Ср… twitter.com/i/web/status/1…
9:35Добавили чтение кафка-стрима, парсинг сообщений (отдельный квест распарсить формат snowplow), учет числа посещений.… twitter.com/i/web/status/1…
9:36Получилось как-то так pic.twitter.com/vtDEjpj5Qo
9:43Потом еще много допиливали этот график, но подробности, кмк, уже не так интересны.
9:43Кроме качества, очень хотелось смотреть еще и на производительность. Перформанс — сложно оцениваемая шутка. Оценка… twitter.com/i/web/status/1…
10:04Взяли из web.dev/vitals/ — Largest Contentful Paint и Cumulative Layout Shift. Вообще, основных метрик три… twitter.com/i/web/status/1…
10:04Тут уже тысячу раз рассказывали, что значат эти метрики. Если пропустили, почитайте на сайте web.dev/vitals/
10:05К счастью, и LCP и CLS можно собирать через npm-пакет lighthouse. Правда ему требуется запущенный Хром. Пришлось в… twitter.com/i/web/status/1…
10:05И, кстати, именно с ним мы хапанули гавна — есть какой-то плавающий баг, который приводит к появлению зомби-процесс… twitter.com/i/web/status/1…
10:06Девопсы очень ругались, а мы очень чинили. К сожалению, до конца пофиксить так и не получилось, но сейчас это происходит не часто.
10:06Получилось в итоге как-то pic.twitter.com/zag8TKgSHf
10:10Сейчас экспортер собирает еще Speed Index, Total Blocking Time, Time to Interactive, First Contentful Paint и Perfo… twitter.com/i/web/status/1…
10:13Третья категория метрик, которые хотелось собирать — размеры ресурсов. Мы не хотели брать эту информацию из кода, потому что:
10:141. Не весь код, котрый грузится на сайте наш — есть рекламные сетки, трекеры, внешний шрифты и еще чорт знает что
10:142. Хочется знать сколько именно трафик прилетит в браузер — уже после всех сжатий и оптимизаций
10:14И мы решили задачу прямо в лоб — запускаем браузер через puppeteer и записываем размеры всех скачанных ресурсов по… twitter.com/i/web/status/1…
10:14Результат выглядит примерно так pic.twitter.com/Zc55F7fK4v
10:17Сейчас к разработке экспортера подключились продуктовые команды — они добавили сбор более подробных таймингов стран… twitter.com/i/web/status/1…
10:18Расскажите, как вы мониторите свои фронтенды (и мониторите ли вообще)?
10:18Кроме фронтендов, наша команда заведует рядом бекенд-сервисов на Node.js. К ним, конечно, тоже нужен мониторинг. На… twitter.com/i/web/status/1…
11:15Мы собираем число запросов в секунду на входящем nginx по статусам ответа, если не-200 ответов становится больше че… twitter.com/i/web/status/1…
11:15Смотрим на время ответа сервиса — медианное, 99-перцентиль и 99.99-перцентиль, шлем алерты, если видим деградацию.… twitter.com/i/web/status/1…
11:15Да, все наши сервисы живут в Кубернетесе, оттуда можно удобно брать потребляемую контейнерами память и CPU. Смотрим… twitter.com/i/web/status/1…
11:15Ну и главное, мы собираем метрики внутреннего состояния Node.js через библиотеку github.com/siimon/prom-cl…. Она отдае… twitter.com/i/web/status/1…
11:15лаг ивент-лупа (сколько таска в ивент-лупе ждет, пока ее возьмут) и число открытых хэндлов (сколько сейчас открыто… twitter.com/i/web/status/1…
11:15Если лаг ивент-лупа становится слишком большим — нужно что-то делать. Пока просто шлем алерт в Слак, в перспективе… twitter.com/i/web/status/1…
11:16Мониторите Node.js-приложения? На какие показатели смотрите?
11:16@jsunderhood Подняли недавно sitespeed.io, еще есть debugbear.com. Оба про метрики производительности.
Эти инструменты мониторинга фронтенда выглядят клево. Кажется, стоит попробовать их.
@jsunderhood Подняли недавно sitespeed.io, еще есть debugbear.com. Оба про метрики производительности.
11:18
@MaximKislov Это не те цифры, зато стабильные. Мы смотрим не на абсолютные цифры, а на их колебания.Ну и думаем,… twitter.com/i/web/status/1…
Я что-то сразу не подумал, что нужно объяснить, почему нас не пугает, что данные собраны в лаборатории, а не с реал… twitter.com/i/web/status/1…
@MaximKislov Это не те цифры, зато стабильные. Мы смотрим не на абсолютные цифры, а на их колебания.
Ну и думаем,… twitter.com/i/web/status/1…
11:32
У меня на сегодня все 🤗 пишите вопросы (не обязательно про мониторинг)
А это вид с горы недалеко от офиса. pic.twitter.com/g6I3k7IXjF
11:54О, я забыл рассказать, что у меня есть телеграм-канал, куда я пишу чуть менее фронтендерские штуки. Подписывайтесь🤓
13:28# Вторник 28 твитов
Сейчас выходит много отчетов про изменения на удаленке. Есть и очень положительные, есть и отрицательные. Но не сто… twitter.com/i/web/status/1…3:00
Сегодня расскажу как мы делали новый сервис, который в перспективе должен контролировать почти все страницы на… twitter.com/i/web/status/1…
10:01Сейчас у нас есть Реакт-приложение, оно при сборке рендерится в строку и кладется в html
10:02У этой схемы есть несколько проблемок — сложно контролировать, неудобно дебажить, нельзя показать разным пользовате… twitter.com/i/web/status/1…
10:02Поэтому мы решили сделать новый сервис, который будет прямо на лету генерировать html из Реакт-компонентов. И посмо… twitter.com/i/web/status/1…
10:02В итоге получилось, что каждый виджет — отдельное Реакт-приложение, которое рендерится в своей ноде и об окружающем… twitter.com/i/web/status/1…
10:02Но, реальный мир жесток — часто виджетам приходиться общаться друг с другом.
10:02На тот момент, у нас было два кейса, когда виджетам нужно пообщаться. Мы решили сделать систему, которая будет:
10:02а. хорошо подходить под эти два конкретных кейса
10:03б. легко заменяется на что угодно другое, не аффектит виджеты и вообще стоит максимально в стороне
10:03Второе требование возникло, потому что мы понимали, что эти два кейса — это не конец. А предвидеть что будет дальше не могли.
10:03У нас было три прототипа, и только последний показался нормальным. Первые два выкинули даже не дописав.
10:03Сейчас оно работает примерно так: каждый виджет получает маленький ивент-эммитер. В него можно бросать события, а можно читать.
10:32Виджет может кидать-читать только «свои» события, то есть виджет никогда не зависит от другого виджета
10:32А чтобы связать два виджета мы используем специальные функции (мы назвали их релейшнами), которые по сути мапят соб… twitter.com/i/web/status/1…
10:32Релелейшн знает о двух виджетах и хранит всю логику их связи.
10:33Когда закончили делать финальный прототип, поняли, что получился кустарный RxJS. Но решили пока не переписывать на него, мало ли что.
10:33А как вы организовываете общение независимых фронтенд-приложений?
10:33@jsunderhood Вообще, было бы интересно послушать чей-нибудь опыт по работе с метриками gc на ноде. Может среди подп… twitter.com/i/web/status/1…10:53
Сделал пример релейшна, чтобы было понятно что он делает. Этот уведомляет первый виджет об изменениях во втором. pic.twitter.com/wYmcDQ7TpL
10:53Кроме общения непосредственно виджетов между собой, нужно было решить задачу общения старого монолитного приложения с виджетами.
11:10Решили просто как-то просунуть ему ивент-эммитер и разрешить кидать-читать сообщения.
11:11Сделали просто — в новом приложении с виджетами кладем ивент-эммитер в глобальную переменную, а в старом приложении достаем.
11:11Но в такой схеме есть проблема, мы не гарантируем какой бандл загрузиться первым, старого приложения или нового.
11:11В итоге в ивент-эммитере сделали накопление событий, а в старом приложении проверяем, если ивент-эммитера нет — жде… twitter.com/i/web/status/1…
11:11Не самое красивое решение — зато простое и работает ¯\(ツ)/¯
11:11На сегодня все.
Сорян, получился короткий день, завтра расскажу больше.
Вот вам фоточка со вчерашней горы, но в д… twitter.com/i/web/status/1…
11:50Шапка сегодня не понадобилась, но это только потому, что мне некогда было ее надеть
Давайте поможем Лене найти коллег. Классная команда, крутой продукт, ремоут ферст и вот это все 🤗… twitter.com/i/web/status/1…
Шапка сегодня не понадобилась, но это только потому, что мне некогда было ее надеть
15:26
# Среда 53 твита
Давайте сегодня обсудим конфигурацию сборки. Я довольно долго уже пытаюсь найти способ конфигурировать бандлер без… twitter.com/i/web/status/1…
11:00Кек, эта проблема вроде звучит супер-просто. Ну конфигурация, ну напиши и ладно. Но нет!
11:00Вообще, в простом случае конфигурация сборщика — это просто один файл, в котором описано все что нужно. Для вебпака… twitter.com/i/web/status/1…
11:01Это js файл, то есть в нем может выполняться произвольный код для создания финальной конфигурации. В типичном прило… twitter.com/i/web/status/1…
11:01У вас может возникнуть закономерный вопрос — почему вообще конфигурация сборки зависит от каких то аргументов коман… twitter.com/i/web/status/1…
11:06Причин может быть несколько. Как минимум, для разработки и для продакшена обычно используется чуть-чуть разных конф… twitter.com/i/web/status/1…
11:06С другой стороны, сейчас довольно часто создаются фронтенд-приложения с SSR, а код который исполнится на клиенте и… twitter.com/i/web/status/1…
11:06Ну и куча более экзотических вариантов специфичных для конкретного приложения.
11:06Короче, вариативность конфигурации бандлера — это важно.
11:06У кого какие есть боли связанные с конфигурированием инструментов?
11:06@jsunderhood Современные инструменты сборки не умеют переиспользовать между собой промежуточные результаты своей ра… twitter.com/i/web/status/1…11:26
Самый простой способ сделать конфиг изменяющимся под нужды приложения — просто прямо в файле конфигурации завязатьс… twitter.com/i/web/status/1…
11:27Но, кажется, это не очень управляемая история.
Вносить правки в конфиг становится просто невозможно. pic.twitter.com/e3x0bK534K
11:29Число вариантов сборки растёт быстро — дев-клиент, дев-сервер, прод-клиент, прод-сервер. Уже 4, а пока только два п… twitter.com/i/web/status/1…
11:30Впервые я столкнулся с этой проблемой на одном из проектов @BreadheadStudio
11:30У нас было 4 конфиг-файла, в которых просто было много копи-паста. И когда решили принести в проект TypeScript, сде… twitter.com/i/web/status/1…
11:30Тогда я подумал (не очень хорошо, как выяснилось) и решил общие части конфигурации вынести в специальный файл, а сп… twitter.com/i/web/status/1…
11:31В целом, получилось неплохо, но осталось дублирование между дев-клиентским и дев-сервеным конфигами, и между прод-к… twitter.com/i/web/status/1…
11:32А еще было дублирование между дев-серверным и про-серверным конфигами, и соответсвенно между дев-клиентским и прод-клиентским.
11:32И тогда я решил сделать просто — все специфичное для среды разработки вынести в отдельный файл и расширять его в сп… twitter.com/i/web/status/1…
11:32Короче, получилось 5 файлов с «базовыми» конфигами и 4 файла со «специфичными» конфигами. Да, я тогда был не сильно… twitter.com/i/web/status/1…
11:33В итоге, стало только хуже и мы вернули все обратно, копи-паст, так копи-паст.
11:33Следующий заход оказался удачнее. Я посмотрел прекрасный доклад youtube.com/watch?v=Tg8IVb…
11:39И очень проникся этой идеей — вся конфигурация должна быть описана в одном файле. Просто нужно описывать ее на боле… twitter.com/i/web/status/1…
11:39То есть, если именно в этом варианте конфига нужен хот-релоадинг, это должно определяться одной строкой — withHotRe… twitter.com/i/web/status/1…
11:39Тогда я попробовал разбить весь конфиг на атомарные части и собрать финальную версию из этих кусочков.
11:40Получилось как-то так pic.twitter.com/G3iZD0BVuq
11:41Конечно, это тоже не вариант — кусочки конфига слишком маленькие. Но можно объединить подход с общими бизонами наст… twitter.com/i/web/status/1…
11:41В итоге, я экспериментировал с разными вариантам комбинации конфигов несколько лет, и, как мне кажется, нашёл достаточно удобный подход.
11:41Основные штуки (транспиляция TS, например) вынесена в общий базовый конфиг, он расширяется через небольшие функции,… twitter.com/i/web/status/1…
11:41Выглядит это примерно вот так в реальном проекте. Здесь withDefaults — тот самый базовый конфиг, а все остальное —… twitter.com/i/web/status/1…
11:43Внутри эти функции выглядит супер-просто, они всего лишь добавляют/расширяют поля конфига. Есть правило — функция-р… twitter.com/i/web/status/1…
11:43А как вы боретесь со сложностью и дублированием в конфигурации сборки?
11:43Вообще, из-за неадекватной сложности при настройке вебпака, я полюбил @parceljs. Для огромного числа проектов в нем… twitter.com/i/web/status/1…
12:00Для всех своих простых пет-проектов я использую именно его. И в @SamokatRu мы использовали parcel для всех внутренних веб-приложений.
12:00Если у вашего приложения нет специфичных требований — смело берите @parceljs, это очень классное решение.
12:00Пару месяцев назад начал делать пет-проект на @sveltejs, они очень советуют использовать бандлер @RollupJS. И вот о… twitter.com/i/web/status/1…
12:00Еще, сегодня хотел пошарить довольно больший список докладов, которые считаю супер-крутыми. 👇
12:12Последний доклад, который я посмотрел. Он про написание своего рендерера для реакта (вместо react-dom). Очень позна… twitter.com/i/web/status/1…
12:13Доклад про то как работает голова. Почему опен-спейсы — это отстой, как правильно отдыхать и вот это все.
12:14Альтернативный взгляд на проектирование приложений. В докладе весь код приводится на C#, но подходы применимы к люб… twitter.com/i/web/status/1…
12:14Контракты — способ убедиться, что программа получает корректные данные на границах (общение по сети, взаимодействие… twitter.com/i/web/status/1…
12:15Обычно все разговоры про ФП заканчиваются на маленьких изолированных примерах кода. Доклад про построение функциона… twitter.com/i/web/status/1…
12:18Всех нас занимают вопросы: «Как стать лучшим инженером?», «Как расти профессионально?». На них в целом, похоже нет… twitter.com/i/web/status/1…
12:21Я уверен, что мы должны знать как работают инструменты, которыми пользуемся. Например, веб-разработчики должны пони… twitter.com/i/web/status/1…
12:21При создании приложения очень важно сохранить гибкость. То есть с течением времени сложность внесения изменений не… twitter.com/i/web/status/1…
12:22youtu.be/fwWA6Bugg_c
youtube.com/watch?v=wRxO5k…
Пара докладов про акторы. Тема специфическая, но, кмк, очень интересная.
12:23Отойду на собес, вернусь и продолжим 😇
12:24Не вышло, сори, затянулся собес, завтра закончу тред 🤗
13:50@jsunderhood У нас похожий подход, только мы в конце пишем чистый конфиг без мёржев. И.е. есть ф-и типа configureSc… twitter.com/i/web/status/1…
Там в треде очень классный подход к конфигурированию сборок.
@jsunderhood У нас похожий подход, только мы в конце пишем чистый конфиг без мёржев. И.е. есть ф-и типа configureSc… twitter.com/i/web/status/1…
15:16
# Четверг 43 твита
Про кастомное решение для инструментирования кода и упрощения работы с компонентными фреймворками в браузере.
8:48Для людей, которые только пришли в индустрию большая проблема расти в ней. Это проблема, у нее нет решения, которое… twitter.com/i/web/status/1…
8:48Вот и все. Кстати, обо всех этих докладах я рассказывал в канале t.me/kamyshev_code сразу как посмотрел их, подписывайтесь.
8:51Кажется, у нашем нестабильном JS-мире многие не знают какие бывают системы типизации и чем они отличаются.Написал… twitter.com/i/web/status/1…
9:49Чем сильная типизация отличается от слабой? В чём особенности динамической и статической типизации? Какая система т… twitter.com/i/web/status/1…
Четверг — это последний «серьезный» рабочий день. То есть, почти не рабочий. Поэтому, сегодня я хочу показать вам с… twitter.com/i/web/status/1…
10:05Вообще, на мой взгляд, большая часть из них волне пригодна к реальному использованию. Но я не уверен.
10:05В JS есть классная штука — Iteration protocols (developer.mozilla.org/en-US/docs/Web…), она позволяет создавать свои объекты, кот… twitter.com/i/web/status/1…
10:05В обычной жизни я не очень часто создаю такие объекты — как то не приходится. Но, это может быть удобно.
10:05Например, функция range из lodash (та которая создает массив с числами) имеет довольно простой интерфейс (3 аргумен… twitter.com/i/web/status/1…
10:05Эту функцию можно переписать и использовать таким вот образом. pic.twitter.com/xS9958cE0f
10:06Я согласен, разница почти никакой =) Но я же предупредил, что сегодня будут просто размышления о необычном JS-е!
10:06Я не буду сразу рассказывать, как такую функцию написать, чтобы у вас было время развлечься. Присылайте свои решения!
10:06Окей, решение @ottey_xela верное )
А вот мое решение. Наверное, оно не самое элегантное, но какое есть. pic.twitter.com/Rai4OfS36G
11:15Вообще, мне очень нравятся итераторы и генераторы! Однажды у меня была задача получить из API с пагинацией все эле… twitter.com/i/web/status/1…
11:15Мне показалось забавным, что снаружи это можно представить просто как асинхронный интератор —… twitter.com/i/web/status/1…
11:16Очень интересно, что вызывающий код даже не знает в какой момент будет запрошена новая пачка данных, для него кажды… twitter.com/i/web/status/1…
11:16Реализовать такую функцию можно через асинхронные генераторы. Код довольно простой pic.twitter.com/QdxMdrKEgF
11:17Оказывается, что эту функцию можно использовать не только для получения всех элементов, но и для более полезной шту… twitter.com/i/web/status/1…
11:17Любопытно, что обработчик скролла не думает, какими пачками и когда будут загружены посты. Он просто просит следующ… twitter.com/i/web/status/1…
11:17How to listen to Mouse Events in 2020:
А еще с асинхронными интераторами можно странно (но весело) подписываться на события twitter.com/johnlindquist/…
How to listen to Mouse Events in 2020:
codesandbox.io/s/ecstatic-cla… pic.twitter.com/94QZnr6prm
11:21
Другая забаваная особенность JS — это внутреннее состояние регулярок. После вызова метода test регулярка запоминает… twitter.com/i/web/status/1…
11:22Какие интересные штуки в JS знаете? 🤣
11:22Бонусный тред на сегодня — книжки, которые нужно прочитать любому разработчику (или разработчице), порядок важен👇
11:24Роберт Мартин, Clean Code: A Handbook of Agile Software Craftsmanship (Чистый код)
Эта книга о хорошем программиро… twitter.com/i/web/status/1…
11:25Джон Сонмез, Soft Skills: The Software Developer’s Life Manual (Путь программиста)
Исчерпывающая инструкция о жизн… twitter.com/i/web/status/1…
11:26Владстон Феррейра Фило, Computer Science Distilled: Learn the Art of Solving Computational Problems
Сложность алго… twitter.com/i/web/status/1…
11:26Роберт Мартин, The Clean Coder: A Code of Conduct for Professional Programmers (Идеальный программист)
Методы, инс… twitter.com/i/web/status/1…
11:27Чад Фаулер, Passionate Programmer (Программист-фанатик)
Сборник практических советов и рекомендаций, касающихся си… twitter.com/i/web/status/1…
11:28Роберт Мартин, Clean Architecture. A Craftsman’s Guide to Software Structure and Design (Чистая архитектура)
Прямы… twitter.com/i/web/status/1…
11:28Брюс Тейт, Seven Languages in Seven Weeks: A Pragmatic Guide to Learning Programming Languages (Семь языков за семь… twitter.com/i/web/status/1…
11:29Джордж Спаффорд, Кевин Бер, The Phoenix Project: A Novel about It, Devops, and Helping Your Business Win (Проект «Ф… twitter.com/i/web/status/1…
11:30Эрик Эванс, Domain-Driven Design: Tackling Complexity in the Heart of Software
Книга рассказывает о систематическо… twitter.com/i/web/status/1…
11:31Это определенно не все хорошие книги, но эти я считаю "масиридами", их нужно прочесть однозначно.
11:31Если хочется поделиться с кем-нибудь этим списком, у меня есть специальная страничка
11:32На сегодня все🙌
Завтра мне удаляют зуб мудрости, так что не уверен, насколько я буду способен писать штуки в твитт… twitter.com/i/web/status/1…
12:46Кстати, по моим фотографиям вы могли подумать, что тут нет ничего кроме моря. Это не так — у нас есть настоящий гор… twitter.com/i/web/status/1…
12:47@jsunderhood Вместо чтения книжек я всем и всегда рекомендую писать код.После написанных и выброшенных 100К строк… twitter.com/i/web/status/1…
Интересная мысль со стороны практики💁♂️
@jsunderhood Вместо чтения книжек я всем и всегда рекомендую писать код.
После написанных и выброшенных 100К строк… twitter.com/i/web/status/1…
13:15
@jsunderhood Мысль из разряда «знание есть припоминание: припомни мне теорему Ферма». Никакое педаляние не снимая с… twitter.com/i/web/status/1…
Я больше придерживаюсь все таки позиции, что читать книжки полезно. Если не делать из них культа.
@jsunderhood Мысль из разряда «знание есть припоминание: припомни мне теорему Ферма». Никакое педаляние не снимая с… twitter.com/i/web/status/1…
13:24
@mudasobwa @jsunderhood Или появится понимание, что выбрасывание кода - это норма. Или не появится понимания 🤷. В л… twitter.com/i/web/status/1…
Тоже возможно. Я встречал много разработчиков, которые за 10 лет написали много разного кода, но программировать та… twitter.com/i/web/status/1…
@mudasobwa @jsunderhood Или появится понимание, что выбрасывание кода - это норма. Или не появится понимания 🤷. В л… twitter.com/i/web/status/1…
13:24
@jsunderhood Есть Immediately-invoked Function Expression (IIFE), но также сразу вызываться могут объекты. Иногда э… twitter.com/i/web/status/1…
Кстати, кмк, это почти всегда лучше switch/case.
@jsunderhood Есть Immediately-invoked Function Expression (IIFE), но также сразу вызываться могут объекты. Иногда э… twitter.com/i/web/status/1…
13:30
@jsunderhood @meowthsli Запросто.Из того, что сходу приходит на ум, и что будет действительно полезно:
— Introdu… twitter.com/i/web/status/1…
В дополнение к треду про книжки чувак принёс свой список. Не могу ручаться за его адекватность правда, не читал.
@jsunderhood @meowthsli Запросто.
Из того, что сходу приходит на ум, и что будет действительно полезно:
— Introdu… twitter.com/i/web/status/1…
14:00
О, кстати Type-Driven Development у меня в списке для чтения.
14:03# Пятница 29 твитов
@jsunderhood @akmt_dev @SosnovMax Ну и ты сходи нахуй, и нет, это не постирония.Я брезгую фронтендом, для него в… twitter.com/i/web/status/1…
Я вчера показал вам книжки которые советует этот чувак. Теперь я ещё больше не уверен, что к его советам стоит прис… twitter.com/i/web/status/1…
@jsunderhood @akmt_dev @SosnovMax Ну и ты сходи нахуй, и нет, это не постирония.
Я брезгую фронтендом, для него в… twitter.com/i/web/status/1…
8:21
Ладно, кажется, я пережил стоматологические штуки. Только говорить не получается. Здорово, что можно писать в твиттер.
8:43@jsunderhood Моё имхо, то нюанс в том что каждую книгу надо прочитать в своё время. Сначала ты сталкиваешься с проб… twitter.com/i/web/status/1…
Во, еще одно взвешенное мнение про книжки, лайк.
@jsunderhood Моё имхо, то нюанс в том что каждую книгу надо прочитать в своё время. Сначала ты сталкиваешься с проб… twitter.com/i/web/status/1…
8:46
Пятница — самый нерабочий день из рабочих. В нашей команде в пятницу принято делать особенные — пятничные — задачки.
8:47Пятничная задачка — это что-то веселое, экспериментальное, полезное для продукта и приятное для разработчика. Поэто… twitter.com/i/web/status/1…
8:47И я хочу, чтобы вы выбрали тему на день 🤓 Я могу рассказать про свои факапы (для которых уже истёк срок НДА), или р… twitter.com/i/web/status/1…
8:47@jsunderhood Я всем рекомендую "Designing Data-Intensive Applications: The Big Ideas Behind Reliable, Scalable, and… twitter.com/i/web/status/1…
Кстати, прямо сейчас читаю эту книжку, в t.me/kamyshev_code пишу конспект 😉
@jsunderhood Я всем рекомендую "Designing Data-Intensive Applications: The Big Ideas Behind Reliable, Scalable, and… twitter.com/i/web/status/1…
8:53
Мне кажется, что надувать щеки и показывать какой ты классный, никогда не факапишь и вообще молодец — глупо. Все ош… twitter.com/i/web/status/1…
10:27Самый старый и самый скучный. Я когда-то делал сайты на PHP за небольшие деньги, и на одном из них была самописная… twitter.com/i/web/status/1…
10:27Соответсвенно, достаточно было угадать имя таблицы с пользователям и можно было вписать туда нового пользователя с… twitter.com/i/web/status/1…
10:27Кстати, никто не заметил, сайт проработал пару лет, контора закрылась, все хорошо.
10:27Любопытно, что потом, через 5 лет я встретил сайт, который делала серьёзная студия с такой же проблемой. Это вообще популярная уязвимость.
10:27Однажды я делал небольшой бекенд на Node.js, в нем был запрос на получение всех записей пользователя. Через пару не… twitter.com/i/web/status/1…
10:28Я очень долго искал проблему, пока не понял, что криво написал запрос через TypeORM, я получал все записи (не тольк… twitter.com/i/web/status/1…
10:28Забавно, что два бага в сумме дали корректно работающую программу и проблему мы заметили только из-за нагрузки на п… twitter.com/i/web/status/1…
10:28Как-то раз я делал сайт, и из-за криворукости переодически приходилось лазить руками в базу, чтобы исправить какие-то проблемки.
11:15База была в контейнере на сервере и в нормальной жизни вообще не торчала наружу — доступ до неё был только внутри локальной сети на сервере.
11:15Но чтобы залезть туда со своего компьютера, я ее высовывал наружу. И в однин прекрасный момент забыл спрятать обратно 🤪
11:15А потом обнаружилось, что на сайте сломалось все — на клиенте любой запрос заканчивался ошибкой 500.
11:15В логах были странные сообщения — схема базы не соответствовала представляем приложения о схеме. Я зашёл в базу, а… twitter.com/i/web/status/1…
11:16Это, пожалуй, был самый страшный факап в моей жизни.
11:16Но, все закончилось плюс-минус хорошо, базу восстановили из бекапа и кажется, заказчик не имел претензий. И, даже,… twitter.com/i/web/status/1…
11:16После следующего факапа я приучил себя читать исходный код используемой библиотеки 😝
12:08Делал приложение, которое должно было поддерживать не самые свежие браузеры (типо ie11). И после очередного релиза… twitter.com/i/web/status/1…
12:09В консоли сообщение, что const — это не понятно. Логично, да.
12:09Оказалось, что одна из библиотек поставлялась в современном js, и мы не бабелили ее, конечно. Исправили быстро, но было неприятно.
12:09С тех пор я топлю за то, чтобы библиотеки ВСЕ поставлялись в виде максимально современного js, а я бы уже сам решил… twitter.com/i/web/status/1…
12:09И тогда же привык смотреть что вообще на зависимость которую я ставлю, читать ее исходные тексты и смотреть, что п… twitter.com/i/web/status/1…
12:10На этом все, простите, но челюсть болит так, что даже сериал смотреть тяжело, не то что писать что-то осмысленно.
12:10# Суббота 24 твита
Вчера посмотрел доклад про рефлексию в TypeScript и снова подумал, что декораторы вроде и не стоит использовать, а… twitter.com/i/web/status/1…
Что думаете о декораторах в JS/TS?
Вчера посмотрел доклад про рефлексию в TypeScript и снова подумал, что декораторы вроде и не стоит использовать, а… twitter.com/i/web/status/1…
1:31
Меня все еще мучает зуб (вернее, его отсутствие), но давайте я кратенько расскажу про новые странные веяния фронтендов.
10:11Все вокруг шутят, что в мире фронтенда новый фреймворк появляется каждую неделю. Штош, было бы здорово, но основные… twitter.com/i/web/status/1…
10:11Вебпак 5 не принёс ничего кардинально нового, Реакт 17 вообще вышел из фич. Мейнстримовый фронтенд стагнирует и не… twitter.com/i/web/status/1…
10:11Я, если честно, не верю, что одна из них станет популярной в обозримом будущем, но, мне кажется, что на их основе в… twitter.com/i/web/status/1…
10:11Помните статью про то что фронтенды собираются неадекватно долго? habr.com/ru/company/vds…
10:11Ну правда же очень медленно. Один из моих рабочих проектов на топовом MacBook Pro 13 собирается 160 секунд. А на мо… twitter.com/i/web/status/1…
10:11И с этим ничего не поделать — медленно, долго. Вероятно, эту проблему нельзя решить с помощью JS-тулинга.
10:12Сейчас набирает популярность esbuild (github.com/evanw/esbuild) — это бандлер js написанный на go. И он прямо блейзи… twitter.com/i/web/status/1…
10:12Я пока не пробовал его в бою, только на небольших демо-проектах, но выглядит он впечатляюще.
10:12Кто-нибудь использует esbuild для продакшна?
10:12Другое интересное решение, связанное со сборкой проекта swc (github.com/swc-project/swc) — это компилятор js/ts, напис… twitter.com/i/web/status/1…
10:20Конечно, в нем пока сильно меньше возможностей (swc.rs/docs/compariso…), но для многих проектов они и ненужны.
10:20Следующая интересная штука, это замена nvm, снова написанная на Rust — fnm (github.com/Schniz/fnm). В нем я вижу… twitter.com/i/web/status/1…
10:21RSLint (github.com/RDambrosio016/…) — это как ESLint, только быстро. Меня очень утомляет долгий линтинг большого проек… twitter.com/i/web/status/1…
10:21Пока этот проект совсем сырой (намного сырее первых трёх), но пощупать уже можно.
10:21Это касалось тулинга вокруг разработки. Теперь давайте обсудим библиотеки, которые помогают строить приложения проще, надежнее, быстрее.
10:25Пару недель назад попробовал @sveltejs и он оказался интересным.
twitter.com/kamyshev_code/…
Меня последнее время очень прет @sveltejs, вот тут делился первыми впечатлениями —twitter.com/kamyshev_code/… Если вы н… twitter.com/i/web/status/1…
Пару недель назад попробовал @sveltejs и он оказался интересным.
10:25
twitter.com/kamyshev_code/…
Другая интересная штука — @stenciljs
Это по сути способ писать веб-компоненты, а потом использовать их в приложен… twitter.com/i/web/status/1…
10:27Стейт-менеджеры нового поколения — мой краш: @EffectorJS, recoiljs.org, reatom.js.org. Я совсе… twitter.com/i/web/status/1…
10:28Но после любого пет-проекта на любом из них, возвращаться к написанию логики внутри редакса — жуткая боль.
10:28@jsunderhood как svelte, но без магии. С виду похож на реакт с хуками, но жизненный цикл проще
Вот ещё советуют solid (github.com/ryansolid/solid)
@jsunderhood как svelte, но без магии. С виду похож на реакт с хуками, но жизненный цикл проще
10:59
@jsunderhood Мне нравится история про тулинг на быстрых языках. Но развитие и поддержка для таких инструментов каже… twitter.com/i/web/status/1…
Вот те же мысли абсолютно
@jsunderhood Мне нравится история про тулинг на быстрых языках. Но развитие и поддержка для таких инструментов каже… twitter.com/i/web/status/1…
11:59
@jsunderhood Если забыть о проблемах декораторов и жестко ограничивать их применение, то они конечно дают возможнос… twitter.com/i/web/status/1…
Очень хорошая мысль
@jsunderhood Если забыть о проблемах декораторов и жестко ограничивать их применение, то они конечно дают возможнос… twitter.com/i/web/status/1…
13:45
# Воскресенье 27 твитов
Так уж получилось, что я живу в Таиланде. И тут есть пара особенностей, относящихся к работе.
7:51Все время, что я тут живу, меня поражают розетки. Везде в Таиланде делают розетки, которые понимают ЛЮБЫЕ вилки.
7:51Все зарядки из России работают, тостер с британской вилкой — работает, местная техника с китайскими вилками — работает.
7:51Ну чудо же! Мечтаю, чтобы во всем мире применили эту тактику.
7:52Зимой 2019 я жил месяц на Кипре. Там британские вилки-розетки и это было довольно неудобно — приходилось использова… twitter.com/i/web/status/1…
7:52Примерно половину года тут низкий сезон — не очень жарко и очень дождливо. В целом кайф, но есть нюанс.
7:52Интернет во время сильного дождя либо становится жутко медленным, либо полностью ломается.
7:52Во время сильного ветра иногда выключается даже свет. После таких дней, в офисе обычно половина зарядок от ноутбуков сгорает, кек.
7:52По очевидными причинам в магазинах продаются компьютеры с тайскими буквами на клавиатуре. Чтобы купить компьютер то… twitter.com/i/web/status/1…
7:53Ну, понятно, с русскими буквами клавиатуру тут достать нельзя. Я сначала очень волновался что будет супер-неудобно, но нет — быстро привык.
7:53Интересно, что даже не привычная по форм-фактору клавиатура айпада без русских букв не вызывает проблем.
7:53Не так сильно относится к работе, но — тут очень хорошая медицина.
7:53Правда довольно дорогая, но правильная страховка покрывает все кейсы. В начале лета надорвал связку в лодыжке. Все… twitter.com/i/web/status/1…
7:54Когда приехал с травмой в больничку, почувствовал себя в фильме — медбрат помог выйти из машины, усадил на кресло-к… twitter.com/i/web/status/1…
7:54Весь стафф был супер-вежливым, все хорошо говорили по английски. По больнице меня катали на кресле.
7:54После наложения гипса отвезли в комнату восстановления — всякие беговые дорожки, тренажеры, небольшая лестница пост… twitter.com/i/web/status/1…
7:54Мне показали два вида костылей, я выбрал одни и меня научили ими пользоваться — нарядили в специальную обвязку, что… twitter.com/i/web/status/1…
7:55А вот с оплатой была беда — сумма за тот день была больше 500 баксов, такие траты страховая не одобряет без согласо… twitter.com/i/web/status/1…
7:55В пятницу ездил удалять зуб мудрости. Это не входит в страховку, я должен был оплатить все сам, поэтому поехал не в… twitter.com/i/web/status/1…
7:55Пару недель назад у меня очередной раз воспалилась восьмерка, я приехал в эту клинику, они сделали рентген-фото, по… twitter.com/i/web/status/1…
7:55В четверг я закончил пить антибиотики, и уже в пятницу приехал удалять зуб. Операцию заняла около часа, больно не б… twitter.com/i/web/status/1…
7:55На следующей неделе нужно будет съездть к ним, снять швы. Пока — это был лучший контакт со стоматологами в моей жизни.
7:56В целом, жить на Пхукете прикольно, но немного раздражает деревенскость. Хочется в город.
7:56Приятный бонус — билеты до Бангкока по 60 баксов. Доехать до аэропорта и потом от аэропорта до дома стоит примерно столько же, кек.
7:59Пишите вопросики, расскажу подробнее про отдельные аспекты жизни на райском острове.
8:00На этом все 🥳 спасибо вам, было весело.
До вечера ещё готов отвечать на вопросы, ну и если что, пишите в личный ак… twitter.com/i/web/status/1…
9:51# Ссылки
github.com
- https://github.com/siimon/prom-client
- https://github.com/evanw/esbuild
- https://github.com/swc-project/swc
- https://github.com/Schniz/fnm
- https://github.com/RDambrosio016/RSLint
- https://github.com/ryansolid/solid
other
- https://web.dev/vitals/
- http://aviasales.ru/about/vacancies
- https://t.me/kamyshev_code
- https://t.me/thai_ecaspates
- https://www.youtube.com/watch?v=Tg8IVbvturM
- https://www.youtube.com/watch?v=GIHrPm_YAIc&list=WL
- https://www.youtube.com/watch?v=wRxO5ky7S8g&feature=share
- https://www.youtube.com/watch?v=aMP6j6um4Ss
- https://youtu.be/ytX7Dv3K7Go
- https://youtu.be/8MOZ44j_zFw
- https://youtu.be/fwWA6Bugg_c
- https://youtu.be/7HXIrEsmlzM
- https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Iteration_protocols
- https://read.kamyshev.me/
- https://habr.com/ru/company/vdsina/blog/518266/
- https://swc.rs/docs/comparison-babel
- https://recoiljs.org/
- https://reatom.js.org/
- https://aplusii.com/