Node.js Recipes
3.23K subscribers
174 photos
7 videos
1 file
622 links
По буднях нотатки по #Nodejs розробці, по вихідним огляди конференцій та доповідей (с) @galkin_nikita
Download Telegram
Как я провожу собеседования?
#principles

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

Написание кода !== составление алгоритма
Написание кода это технический навык, который не должен требовать когнитивных усилий. Для его проверки я использую live-coding c однострочными задачками. Если кандидат гуглит как вернуть Promise из функции, то он скорее всего не писал на современном JS.
Составление алгоритма это сознательная работа, требующая когнитивных усилий. Способность составлять алгоритмы проверяют задачками с Leetcode. В ходе интервью и в повседневной жизни люди по-разному выполняют алгоритмизацию, поэтому я не даю задач на алгоритмы.

Понимание !== знание
В ходе интервью задача проверить, что кандидат способен выполнять задачи на проекте. Для этого ему необходимо не знание документации, а понимание и опыт работы с тех.стэка проекта. В этом помогают вопросы "В чем различие ...?", "Зачем/Почему...?", а не "Что такое ...?" или "Дайте определение ...". Обычно, глубина понимания прямо коррелирует с систем дизайном и алгоритмизацией.

Soft-skills работают всегда
За час кандидат показывает не только свои технические навыки, но и то как он общается. Сосредоточившись на тех. составляющий собеседования кандидат показывает свои повседневные навыки активного слушания, ведения тех. дискуссии, умение признать свою ошибку или незнание.

Матрица скилов
По итогам любой работы должен оставаться артефакт. Артефактом собеседования является матрица скилов кандидата. На ее основание бизнес принимает решение о дальнейшем сотрудничестве с кандидатом. У меня это это 4-7 пунктов с пятибальной шкалой и комментариями.
Помогите лучше понимать аудиторию канала.
Через какую юрисдикцию вы получаете оплату?

PS Прошлый опрос по Seniority уровню.

Ukraine - 309
👍👍👍👍👍👍👍👍 65%
Belarus - 25
👍👍 5%
Russia - 91
👍👍👍 19%
Other - 48
👍👍 10%
👥 473 человека уже проголосовало.
#announcement #voice_chat

22 июля в 21:00 поговорим об обучение.

Гость: Сергей Немчинский, руководитель и владелец учебной компании foxmindEd. Автор youtube канала с 175к подписчиками и фразы "Здравствуйте, мои дорогие".

Вопросы:
В чем особенность IT-обучения?
Кто такие свитчеры? Как менять основной язык?
Как обучаться на джуна? Как расти до синьора
Как составлять план обучения?

Ссылка для подключения: https://xn--r1a.website/node_recipes?voicechat
До встречи в эфире!
Live stream scheduled for
Почему вам нужны знания Promise-ов в async/await коде?
#code_pattern

Async/await является основным стилем для написания асинхронного кода в современной #nodejs. Стоит помнить, что это синтаксический сахар поверх Promise chain. Поэтому для любого уровня разработчика важно понимать когда и для чего использовать такие конструкции:

➡️ Promise.all – необходимо использовать для получения значений, которые независимы. Будет прерван при первой ошибке.
➡️ Promise.race – необходимо использовать для получения первого значения или ошибки. Классический пример, это выброс ошибки по таймауту.
➡️ Promise.allSettled – необходимо использовать для получения всех значений. Ошибки не вызовут остановку, а будут частью результата.

Что дает использование этих конструкций? Вы можете запускать промисы не последовательно, а параллельно. В результате время ответа становиться быстрее.
Как писать меньше TypeScript интерфейсов?
#typescript

TL;DR Используйте Lookup Types

TypeScript позволяет писать вложенные интерфейсы. Например:

interface User {
id: number;
name: string;
contacts: {
phone: string;
email: string;
address: {
country: string;
city: string;
street: string;
}
}
}

Необходимо создать функцию updateUserContact. Распространённое решение вынести UserСontact как отдельный интерфейс, или еще хуже продублировать его. Новый интерфейс использовать как тип в функции.
Вместо этого следует использовать  Lookup Types. Это выглядит так:
type UserСontacts = User['contacts']
type UserAddress = User['contacts']['address']

Обратите внимание, что всегда используются квадратные скобки и кавычки, а не точка. Такая нотация позволяет делать union внутри квадратных скобок или использовать keyof. В завершение пример близкий к продакшен коду:

function updateUserContact<T extends keyof User["contacts"]>(
user: User,
contactType: T,
contact: User["contacts"][T]
): void {
// ...
}
Live stream started
Audio
#voice_chat

Гость: Сергей Немчинский, руководитель и владелец учебной компании foxmindEd. Автор youtube канала с 175к подписчиками и фразы "Здравствуйте, мои дорогие".

Вопросы:
В чем особенность IT-обучения?
Кто такие свитчеры? Как менять основной язык?
Как составлять план обучения?

Книга, о которую рекомендует Сергей это "Цель. Процесс непрерывного совершенствования" Элияху Голдратт

Chrome Extension для удобного контроля скорости видео.
Какие вопросы необходимо решить при внедрение WebSockets?
#architecture

Вот список вопросов, которые я задаю при внедрение WS на проекте.
Какую бизнес задачу решают real-time updates от сервера? Определяет нужны WS, SSE или GraphQL Subscriptions.
Какие клиенты будут использоваться: браузер, мобильные и т.д? Определяет нужен ли fallback, если WS не доступен. Ключевой аргумент в извечном споре socket.io VS ws
Может ли клиент подписываться на конкретный поток сообщений? Определяет механизм создания подписок и поведения в момент пере-подключения.
Какие ACL нужны? Определяет поведения системы в момент подключения, отправки/принятие сообщений и создание подписок.
Где мы разворачиваем? Определяет перечень технологий, которые мы сможем использовать. Например, в AWS есть WS на serverless.
Microservices in the Cloud with Kubernetes and Istio
#worth_seeing

Сегодня в рекомендациях видео трехлетней давности с Google I/O' 18. Докладчик Sandeep Dinesh показывает как в микросервисной архитектуре переложить вопросы маршрутизации, оркестрирования, canary-releases и т.д с уровня кода на уровень инфраструктуры.
WebTransport
#worth_seeing

Два месяца назад я рекомендовал посмотреть интро видео об HTTP/3. Этот протокол открывает возможность для использования WebTransport. Сегодняшнее видео как раз объясняет, что это и какие проблемы решает.

Данная технология не готова к использованию для широкого круга проектов. Рецепт сделан подсветить направление в котором двигается веб-разработка.

Ссылки по теме:
- WebTransport Explainer
- Experimenting with WebTransport
Kafka Summit
#conference

На следущей неделе, 27-28 июля, пройдет бесплатная онлайн конференция Kafka Summit. Целевая аудитория конференции это разработчики использующие Kafka в продакшене. Лишь небольшая часть #nodejs проектов используют данную технологию. Большинство используют Rabbit или очереди от cloud-провайдеров. Тем не менее о данной технологии стоит иметь представление. В этом может помочь не конференция, а bootcamp который обновили в предверии конференции. Подробней по ссылкам:
- https://www.confluent.io/training/learn-confluent/
- https://www.confluent.io/certification/
Как документировать асинхронное API?
#architecture #service

TL;DR Используйте AsynAPI

Упрощенно говоря существует только два способа взаимодействия: Req/Res и Pub/Sub. Еще эти способы называют синхронный и асинхронный.

При Request/Response клиент отправляет запрос на сервер, сервер начинает работу и отправляет ответ клиенту, как только работа будет выполнена. При Publish/Subscribe вместе запроса публикуется событие и ответ не требуется. Некоторые buzzword используемые при PubSub: WebHooks, Event-driven architectures, CQRS.

REST является классическим способом создания Web API и реализует Req/Res взаимодействие. Для его описания традиционно используют OpenApi, старое название Swagger.

Через WebSockets является дву-направленным протоколом, что позволяет создавать на его основе как Req/Res, так и Pub/Sub взаимодействие. Чаще всего WS используют именно для оповещений со стороны сервера, т.е для Pub/Sub. Естественно его следует описывать, использовать Documentation First подход. Для этого и был создан AsynAPI. Он позволяет описывать асинхронное взаимодействия не только по WS, но и по другим протоколам. Рекомендую к использованию.
Как следить за устареванием кода?
#nodejs_api #typescript

В разработке существует жизненный цикл. Вы можете увидеть его этапы в #nodejs документации в виде stability index. Часть методов помечена как Legacy, т.е. их не стоит использовать как прямо, так и через библиотеки. Аналогичный подход можно использовать в своей кодовой базе. Для этого следует использовать JSdoc @deprecated. Пример:
/** @deprecated use newFunction instead **/
function oldFunction() {...}

Проверку использования устаревшего кода можно переложить на eslint. Для javascript проектов для этого используется правило import/no-deprecated.

В typescript есть перегрузка функций и устареть может только часть сигнатур. Пример:
function example(userOrId: User): void
/** @deprecated use with User instead of user_id **/
function example(userOrId: number): void
Поэтому для typescript проектов следует использовать eslint-plugin-deprecation.
В комментариях к одному из рецептов меня спросили, что я думаю по поводу практик описанных в nodebestpractices. Я думаю, что знать об этом отличном репозитории нужно каждому #nodejs разработчику. Собственно эта заметка призывает вас прочитать его содержимое.
👍1
Подборка книг для прокачки, когда ты уже Senior
#list

Начну с хорошей цитаты:
A good book gets better at the second reading. A great book at the third. Any book not worth rereading isn’t worth reading. – Nassim Taleb

Читать и перечитывать книги я предпочитаю на O'Reilly. Рецепт о том как это делать тут.

Собственно вот список книг, которые я рекомендую:
📕Cloud Native ставит парадигму Cloud Native мышления и дает конкретные рецепты реализации.
📕Refactoring: Improving the Design of Existing Code класика от Мартина Фаулера переписанная с JavaScript примерами
📕Web Scalability for Startup Engineers настольная книга, как проектировать и создавать масштабируемые веб-проекты
📕Programming TypeScript на текущий момент лучшая из книг по TypeScript

Как вы видите в списке отсутствуют книги по #nodejs. Дело в том, что пока я не прочитал ни одной книги, сфокусированной именно на Node.js, которую мне хотелось бы перечитать.
Подборка задач для прокачки, когда ты уже Middle
#list

Сегодня в обзоре список типичных задач #nodejs разработчика не связанных с написанием кода. Все задачи носят практический характер, поэтому я формулирую их в виде ACTION с помощью TOOL. Инструмент можно менять в зависимости от проекта и его тех.стека. Кстати о проекте, я предполагаю что у вас есть проект под эти задачи. Это может быть или основной, или ваш pet проект.

Спроектировать REST API с помощью OpenAPI
Настроить CI/CD с помощью GitHub Actions
Описать архитектуру в draw.io
Описать фичу с помощью plantuml
Добавить систему оповещений с помощью бота (telegram, slack, discord)
Добавить внешнюю систему мониторинга uptime с помощью freshping.io (это бесплатный аналог pingdom). Если работает с GCP, то используйте alerts
Добавить продуктовую аналитику с помощью mixpanel
Сделайте отчет с помощью datastudio или любого другого business intelligence tool
Working with WebSockets on AWS
#worth_seeing #aws

Для постоянных читателей рубрики не будет новостью, что AWS предлагает serverless websockets. Я делился соответствующим видео с OpenJS World 2020.

Сегодня у нас более подробное видео от Ryan Lewis. Доклад сделан в рамках youtube-канала, а не конференции. Формат – live coding . В нем докладчик не только рассказывает что, но и показывает как. В рамках конференций это самый сложный формат. В записи его делать проще, что однако не умоляет ценность рекомендуемого видео.

Расскажу о докладчике. Райан делает материалы по AWS, serverless и JavaScript. Для начинающего #nodejs разработчика будет полезна его бесплатная книга "The Cloud Developer Workbook", где собранны 100 базовых упражнений для изучения AWS.