Node.js Recipes
1.85K subscribers
49 photos
1 file
229 links
По будням заметки по #Nodejs разработке, по выходным обзоры конференций и докладов (с) @galkin_nikita
Download Telegram
to view and join the conversation
Во вчерашнем опросе по мастер-классам нет возможности оставлять комментарии. Вот ответы на вопросы из лички:
Почему нельзя проголосовать сразу за несколько?
Потому что я буду готовить их по одному.
А можно мастер-класс на тему ...?
Добро пожаловать в обсуждения под этим постом.

Буду обновлять на основание ваших вопросов.
Вчера в рамках KubeCon анонсировали новую сертификацию KCNA – Kubernetes and Cloud Native Associate. Пока она находиться в бета-тесте, релиз будет до конца года.

Сертификация предназначена для начинающих Cloud разработчиков. Ее рекомендуют как часть обучения перед CKA/CKAD/CKS. Отличие от вышеназванных сертификаций в заданиях: вместо практических задач, будут тесты.

– Анонс в блоге
– Ссылка на сертификацию
Как и что настроить в #git?

1️⃣Указать имя и емейл
Зачем? Чтобы комиты были залинкованы с вашей учеткой в github/gitlab.
git config --global user.name "Your Name"
git config --global user.email you@example.com
Можно настроить для каждого репозитория отдельно. Важно, если вы overemployed.
2️⃣Подключить ssh ключ
Зачем? Чтобы не вводить логин и пароль каждый раз
1. Generating a new SSH key
2. Add your SSH key to the ssh-agent
3. Adding a new SSH key to your GitHub account
или полная документация
3️⃣Изменить текстовый редактор
Зачем? Чтобы использовать привычный редактор, а не vim.
git config --global core.editor "code --wait"
Данный пример установить visual code как git редактор. Проверить можно git commit без флага -m.
4️⃣Автогенерация .gitignore
Зачем? Чтобы экономить время во время старта нового репозитория
1. Откройте gitignore.io.
2. Выберите node, операционку, IDE и т.д.
3. Сохраните в .gitignore вашего репозитория
4. Добавляйте специфичные для вашего проекта файлы, а не для тех. стэка.
5️⃣Использование глобального .gitignore
Зачем? Чтобы не закинуть в git вещи специфичные для вашего окружения.
Сохраните вещи из 4️⃣ в ~/.gitignore_global
git config --global core.excludesfile ~/.gitignore_global
Хорошая практика держать там .env файл

Из комментариев:
Начинающему техлиду стоит использовать .gitattributes для выставления конца строки на уровне репозитория с помощью core.autocrlf. Тогда джуны сидящие на Windows не буду страдать.
Что прокачивать, если вы Team Lead?
#principles

Ребята в @tlbootcamp сделали отличную карту навыков и компетенций для тимлидов – tlroadmap.io. Карта представлена в виде mindmap-а. Каждая ветка имеет теорию, практику и обоснование, почему этот блок важен. Работа над картой происходит коллективно через GitHub.

PS На прошлой неделе не было заметок. Я был полностью погружен в изменения структуры на основном проекте. Мне добавили обязанностей Engineering Manager-а. Так что мне снова нужны инженеры. Пост с вакансией будет чуть позже.
Node.js Developer Wanted!

Чтобы пользователи не пропускали тренировки, а в их телефонах раздавались оповещения об новых ачивках мне в команду нужен Cloud/Node.js инженер. Команда часть HomeFitness стартапа Formelife.

Детали:
👎 созвон в конце дня с Кремневой долиной
👎 нельзя разводить холивары о технологиях, политике или ковиде
👍 крутой тэхстек (GCP, Node.js)
👍 зарплата реально выше рынка
👍 адекватный менеджмент

На фото MacBook M1/16GB для инженера, у которого сегодня первый день. Увы, не в моей команде. Помогите найти инженера, чтобы у меня было время на канал и сон.
Как и зачем настраивать healthchecks/probes?
#kubernetes #cloud

В реальных проектах трафик, который идет на Node.js приложение сначала проходит через какой-то из инфраструктурных элементов. Это могут быть load balancer, API Gateway, оркестратор (kubernetes/Docker Swarm) и т.д. Кроме маршрутизации трафика инфраструктура отвечает за перезапуск и масштабирование приложения. Для этого ей необходимо сообщить, что приложение работает с помощью healthcheck. Инструментов много, поэтому рецепт рассматривает healthcheck только для kubernetes. В остальных инструментах принципы и реализация аналогичны.

Как правило healthcheck это конкретный http endpoint, который отдает 200 если приложение работает. Он может проверять доступность зависимостей, памяти, процессора и т.п. В Nest.js для этого используется terminus. В kubernetes помимо http healtcheck можно настроить tcp или bash команду – может быть полезно для worker-ов без http.

Kubernetes позволяет сконфигурировать несколько видов healthcheck. В документации они еще называются probes. Рассмотрим каждый из них:
– Liveness показывает, что контейнер работает. Если не будет 200 ответа, то Kubernetes перезапустит контейнер.
– Readiness показывает, что контейнер доступен для трафика. Если не будет 200 ответа, то Kubernetes не будет отправлять на него запросы. Пример из реального проекта – WS сервер отдавал 200 ответ пока не количество подключений не превышало лимит.
– Startup показывает, что контейнер успешно запустился. Редко используется для Node.js приложений, так как спроектирован для долго запускающихся контейнеров.

Ссылки по теме:
🔗 The Twelve-Factor App
🔗 Configure Liveness, Readiness and Startup Probes
🔗 Kubernetes Liveness and Readiness Probes: How to Avoid Shooting Yourself in the Foot
🔗 Liveness probes в Kubernetes могут быть опасны
Какие вопросы задать, чтобы проверить уровень TypeScript?
#typescript

Сегодня поделюсь подборкой моих вопросов для интервью по TypeScript. Естественно без ответов, иначе как мне потом их на собеседованиях спрашивать.

1. Как используется тип unknown?
2. Что такое генерики?
3. Какая последняя новинки в TypeScript вам больше всего понравилась и почему?
4. Чем ключевое слово type отличается от interface?
5. Когда и как используется тип never?
6. Что такое директивы в typescript? Какие и зачем вы используете?
7. Расскажите о пространствах имен типов и пространстве имен переменных на примере выражения class User implements Person {...
8. Как используется tsconfig.json?
9. Что такое guard и как они используются?
10. Как вы дебажите typescript код?

В ходе собеседования я не только задаю вопросы, но и отправляю примеры кода для обсуждения. Для этого лучше всего подходит share на TypeScript Playground. Вот пример.
Что такое стоимость владения софтом и из чего она состоит?
#principles

На прошлых выходных у меня был запрос на консалтинг от CEO одной украинской продуктовой компании. Ключевой вопрос был: "На какой архитектуре нам стоит начинать новые проекты в компании – на микросервисах или монолите?" Боль как представителей украинского бизнеса, так и разработчиков не умение брать на себя ownership. Эта концепция хорошо расписана в Amazon Leadership Principles.

Для софта его стоимость владения (ownership cost) состоит из стоимости создания (development cost) и стоимости поддержки (maintenance costs). В outsource компаниях не принято следит за этими параметрами. Новый проект нужно запилить как можно быстрее, т.е. уменьшаем development cost за счет увеличения стоимости поддержки. А в легаси не дай бог тебе уменьшить maintenance cost – это будет означать меньше работы и денег от заказчика. В продукте же один из главных вопросов от разработчиков: "Как мы будет поддерживать то что разработали?"

Приведу конкретные примеры. Далее OC – Ownership Cost, DC – development cost, MC – maintenance costs.
– Тесты или TypeScript уменьшают OC, за счет уменьшение MC, но увеличения DC. Почему: вносить изменения в код можно с меньшими рисками, что-либо поломать.
– Линтинг, код-стайл уменьшает MC. Почему: читать становиться проще!
– Внутренний, легаси или экзотический фреймворк увеличивает OC и MC. DC как правило тоже увеличивается. Почему: находить и онбоардить новых разработчиков сложней.
– DevOps процессы – уменьшают OC, причем существенно. Почему: автоматизация деплоя, разворачивание и мониторинг инфраструктуры все это уменьшает MC и требует сравнительно не больших затрат в DC.

В завершение дам ответ на вопрос из начала рецепта: "микросервисы VS монолит". Ownership cost для микросервисов дороже пока не появилась проблема масштабирования нагрузок (железо не справляется) и/или команды разработки (больше 20 человек).
Топ 10 ошибок в Nest.js проектах.
#nestjs

У Nest.js отличная документация, понятная архитектура кода и декларативных подход. Это позволяет начинать писать реальный код разработчикам переходящих в #nodejs с других языков. Приведу список типичных ошибок на уровне кода. Сокращение MS обозначает microservices.

1. Забыть добавить enableShutdownHooks, поэтому приложение не может корректно завершать свою работу.
2. Использование Hybrid application (http + ms) вместо разделения по процессам. В результате возникают проблемы в фильтрах ошибок.
3. Выкидывание наследников HttpException в MS. Аналогично в другую сторону. А добавьте сюда еще GraphQL/WS/custom контексты. В результате трансформация ошибок происходит не правильно.
4. Смешание входящих и исходящих DTO и/или моделей data-layer. В результате код получается короче, но сильнее связанный.
5. Наличие только одного уровня тестов из unit/e2e пары. В результате тестировать сложнее.
6. Не понимание работы export/import Nest.js модулей и провайдеров. В результате происходят ошибки в DI.
7. Не использование custom decorator-в и pipe. В результате код теряет свою декларативность.
8. Расширение сторонних интерфейсов (например Request) в ts, а не d.ts файле. В результате какой-то из процессов не делает его import.
9. Цикличные связи без forwardRef. В результате код просто не стартует.
10. Отсутствие логирования (в том числе запросов в БД). В результате troubleshooting очень затруднен.

В завершение скажу, что ошибки на уровне проектирования и архитектуры приложения проектозависимы.
Вот так выглядит пирамида тестирования с точки зрения #Nodejs разработчика.
- Linting обеспечивает соблюдения код-стайла и отлавливает возможные ошибки синтаксиса. Используеться eslint.
- Type checking проверяет типы или js doc c помощью TypeScript.
- Unit tests не требуют запуска отдельного Node.js процесса. Тестируют отдельные функции или методы с помощью Jest. Активно используют моки. Позволяет мерять уровень покрытия кода тестами. Использует подходы white box testing.
- Integration tests требуют запуска Node.js процесса. Проверяют бизнесу логику c помощью Jest и различных библиотек по работе с API/Bus/etc. Моки если и используются, то только на уровне 3rd-pary. Использует подходы gray box testing.
- e2e требуют запуска не только Node.js процесса, но и клиентского кода. Т.е. запускает все приложения BE+FE. Имитирует поведение пользователя, проверяя бизнесу логику всего приложения. Использует подходы black box testing. Зона отвественности QA-ев.
На следущей неделе конференция Fwdays: JS is back! ​​

В течение основного дня (27 ноября) будет мой доклад "Разработка на Node.js в 2022: тренды и приемы". Его можно послушать бесплатной в рамках Free Ticket

В дополнительный день (1 декабря) будет мой воркшоп Nest.js tips and tricks. Для просмотра нужен Full Ticket. Промокод для его покупки 👉 node_recipes_fwdays

Программа: https://bit.ly/3DCco0E

До встречи в эфире!
Как сделать object deep clone?
#nodejs_api

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

Native JavaScript предлагает два варианта копирования:
– Через spread оператор const copied = { ...original }
– Через Object.assign const copied = Object.assign({}, original)

Эти варианты работают только на первом уровне объекта. Для глубокого копирования необходимо использовать рекурсию или пакеты (см lodash.cloneDeep). В простых случаях можно использовать JSON.parse(JSON.stringify(obj)), но имейте ввиду так можно потерять данные.

Текущий способ для Node.js это использование модуля v8:
const v8 = require('v8');
const copied = v8.deserialize(v8.serialize(original))

Но через год это измениться. Задача настолько часто встречается, что разработчики JS движков придумали structuredClone. Пока внедрено только в Firefox 94 и Node.js v17.
Как технологии будут востребованы для Node.js разработки в 2022?
#tech_stack #list

Попробую предсказать тренды 2022.

Будут экспоненциально расти, т.е. стоит учить на опережение:
OpenTelemetry для метрик разработки
Headless CMS (нужны для JAMstack)
– Интеграция, использование и/или переход с NoCode решений (бизнес делает на них прототипы, которые нужно развивать или переписывать с 0)

Будут продолжать расти, т.е. стоит учить чтобы быть в тренде:
– API поверх AI или data-science моделей. Продолжение роста за счет персонализаций. Гуглить Internet Of Behavior
– Crypto, всякие смарт контракты, NFT – да-да в мире слишко много денег
– Internet of Things. Для начала попробуйте сделать свой Smart Home

Будут по-прежнему востребованы, т.е. учить не поздно:
– TypeScript как основной язык для сложных проектов
– DevOps практики CI/CD с помощью Gitlab или GitHub Actions, 12 factor
– Cloud инструменты в любом на ваш выбор провайдере AWS, GSP, Azure
– GraphQL на базе Apollo Server
TypeStack и NestJS
#nestjs

Сегодня обзор новостей по TypeStack. Описание этого стэка говорит само за себя: Decorator based frameworks and libraries for Node and browser. Он важен для NestJS комьюнити: routing-controllers – вдохновитель NestJS, а class-validator/class-transformer входят в NestJS стэк.

Стоить отметить две проблемы class-validator/class-transformer, во-первых их редко обновляют – нет маинтейнеров, во-вторых имеют версии 0.*. Это означает возможность breaking changes между минорными релизами. Позиция Камиля, создателя NestJS, по этому поводу была я не вижу значительных проблем.

А теперь хроника событий:
12 октября выявленная security issue в class-validator
– фикса нет вплоть до 28 октября, поэтому Камиль делает форк, который можно установить как @nestjs/class-validator. Аналогичные форк есть и для class-transformer.
– 20 ноября наконец-то выходят фиксы, но с брейкинг чеджами.
– команда NestJS рассматривает переход на форки в рамках 9 версии, которая не известна когда будет.

Какие выводы из этой истории:
– Во-первых, обновите пакет если вы еще этого не сделали
– Во-вторых, используйте в CI/CD npm audit, чтобы знать о проблемах сразу
– Во-третьих, проверьте может ли ваш код перейти на @nestjs/class-validator, как более поддерживаемый.
– В-четвертых, думайте о технической инфляции и рисках.
#announcement #partner_material

Присоединяйся к NIX TESTATHON!
Проверь, на что ты способен в условиях ограниченного времени и полной свободы действий!

На протяжении 4 часов ты будешь тестировать Android-приложение. Твоя цель — вместе с командой обнаружить и описать самые интересные и значимые дефекты и проблемы. В результате ты сможешь повлиять на качество и развитие одного из харьковских стартапов в целом.

Когда: 4 декабря, с 10:30 до 18:30
Где: в чате Discord
Формат: онлайн

Мы приглашаем тестировщиков уровня Junior+ и Middle.

Чтобы стать участником NIX TESTATHON, сделай три простых шага:
🔸отправь заявку до 29 ноября
🔸выполни небольшое тестовое задание (всего три вопроса)
🔸получи приглашение и подключайся к тестатону!

Ссылку на тестовое задание мы отправим на твою почту после регистрации.
Сегодня черная пятница. Поэтому поделюсь топ-3 моих покупок за последние несколько лет, которые позволили быть производительней.

3️⃣ Годовая подписка на Linux Academy.
Опыт использования: c 2018 по 2020
Подводные камни: в момент слияния с acloud.guru были тех. сложности и я перестал ими пользоваться, как сейчас не знаю.
Результат: разобраться с новой технологией или подготовиться к сертификации было очень просто. Готовился по ним к Elastic Certified Engineer и Certified Kubernetes Application Developer.
2️⃣ Стол с регулируемой высотой для работы стоя/сидя.
Опыт использования: 3 года.
Подводные камни: столешницу лучше заказать под себя, чтобы попасть в дизайн и был удобный вырез с подпоркой для рук.
Результат: после овертаймов перестала болеть спина.
1️⃣ MacBook на M1.
Опыт использования: с сентября 2021
Подводные камни: простой перенос с intel процессора не подойдет, все нужно ставить с нуля, чтобы быть на arm версии. Работа с docker чуть усложнилась
Результат: все стало работать быстрее – тайпскрипт+nest.js рестартиться на 40% быстрее, gatsbyjs собирается 15 секунд вместо 50. Сам ноут работает тише и дольше – батарея держит 8-12 часов.
Через несколько минут стартует мой доклад на онлайн конференции: https://fwdays.com/en/event/js-autumn-fwdays-2021
Слады: https://speakerdeck.com/galkin/node-dot-js-development-in-2022
После доклада небольшой голосовой чат в дискорде: https://discord.gg/8sNcQUYTua
Вопросы так же можно задать под этим постом.
OpenJS Foundation дает скидки на Node.js Cerfification. Напомню их две: Node.js Services Development Certification и Node.js Application Development Certification.

Варианты:
– МегаБандл: обе сертификация и тренинги к ним –$1150 $399
– Бандл: одна сертификация + тренинг – $575 $199
– Обе сертификации –  $375 $187.50

Лично я рекомендую брать просто сертификацию без тренинга. Тренинги у Linux Foundation мне всегда казались слабоватыми.

Источник
Как проверить, что строка timezone или encoding?
#nodejs_api

Для того, чтобы проверить что строка является таймзоной можно использовать Internationalization модуль.

function isTimezone(str) {
try {
Intl.DateTimeFormat(undefined, { timeZone: str });
return true;
} catch (ex) {
return false;
}
}

Для проверки кодировки (encoding) можно использовать Buffer.isEncoding.

Собственно цель сегодняшнего рецепта напомнить, что часть buildin modules в #nodejs являются глобальными и их не нужно импортировать.
Вышла новая версия Node.js v16.13.1

В него входят:
– обновление npm с 8.1.0 до 8.1.2
– обновление V8 9.4.146.19 до 9.4.146.24
– обновление c-ares (отвечает за работу с DNS)

Единственное значимое изменение это багфикс в dns.resolve4. Теперь он корректно обрабатывает домены с дефисом.

Мое личное мнение, необходимость обновлять проекты – низкая.