Костя 8Бит | Fullstack AI
951 subscribers
90 photos
2 videos
2 files
62 links
Канал для разработчиков Frontend & Backend с полезными материалами по разработке, поиску работы и работе с AI.

Я 8 лет в веб-разработке, сейчас работаю Lead AI Fullstack Engineer и внедряю AI агентов.
@kostya_xxxx

Курс по AI: Kostya-it.pro/ai
Download Telegram
0809(3).mp4
11.8 MB
Как подготовиться к любому собеседованию по фронтенду

В начале года набрал много ребят на менторство и часто я им повторял одно и тоже. Появилась идея систематизировать знания. Запихнуть все в одно место: вопросы с собесов, отдельные уроки, софт часть, которая очень важна.

20 января я обратился к классному дизайнеру Никите . Обсудили основные ветки приложения, нужный функицонал и началось проектирование системы. К середине марта дизайн был готов, началась плотная разработка. К 20 маю MVP было готов и мои ребята уже начали взаимодействовать.

Фидбек мне понравился, платформа зашла.
Через время подумал продавать платформу как отдельный продукт.

Если хотите грамотно подготовиться к собеседованию, можно использовать мою платформу. Доступ всего за 900р

Демо платформы: https://kostya-it.pro/demo
👍63🔥3👎1
Добавил новую фичу и все опять сломалось

👨‍💻Я сталкивался с таким сотни раз, когда добавлял фичу и приходилось переписывать/рефачить код.

🏠Особенно эта проблема преследовала меня на старых проектах. На новых пиши как хочешь - все будет работать.
А вот через время уже 15 раз подумаешь куда добавить эту функцию или переписать все к чертовой матери.


Как этого избежать?

Для себя я выявил несколько путей:
1. Грамотно спроектированная архитектура
Код должен быть не просто «рабочим», а предсказуемым. Новая фича не должна превращаться в бомбу замедленного действия

2. Консистетность. Одинаковые правила написания кода
Если каждый напишет «по-своему», то проект превратиться в мусорку. Нужно грамотно описать правила кода.

3. Централизация и переиспользумость
Желательно писать свои функции, сервисы, адаптеры, которые будут использоваться по всему проекту. Положи в одно место адаптер денормализации и радуйся, нежели использовать десяток адаптеров "на месте".


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

🫡Сталкивались ли вы с таким?
Как думаете что нужно для грамотной архитектуры?
Please open Telegram to view this post
VIEW IN TELEGRAM
7🔥5❤‍🔥2🤝1
Я стал тупым из-за ChatGPT

🚀Лично мне нейронные сети ускорило решения многих вопросов. Что я бы делал 2-3 дня могут теперь сделать за день. Сгенерировать код, написать текст, выстроить план, учесть множество контекстов. Уверен так у многих.

😡Но многие принимают нейронку за священный грааль и отказываются думать сами. Я уже не первый раз подобные случаи: нейронка не дала правильного ответа, поэтому сам не буду искать, нейронка выдает плохой результат поэтому ручками сам редактировать не в силах.

😖Уже видел несколько раз примеры, когда ребята вместо того чтобы выучить теорию пытаются решить задачи на собесе за счет нейронки, лажая уже 10-ый раз подряд.

🖥Учитывая скорость распространения нейронок скоро откажемся сами думать и дадим все на откуп машине. И это реально страшно. Наш мозг - мышца. Если его не тренировать, он атрофируется.

Мой тейк: нужно проверять, дорабатывать, спорить с ответами нейросети.

Сделано ChatGPT 4.1 19 сентября 10:00

Окей, вот цельный пост в одном стиле, без повторов и разрывов — можно сразу ставить в канал:

Хочешь, я предложу вариант покороче — на 2–3 абзаца, чтобы читалось быстрее и заходило в формат «быстрого поста»?
Please open Telegram to view this post
VIEW IN TELEGRAM
👍82🤝2
Я убил архитектуру приложения

Продолжение поста о том как можно упростить себе работу и уменьшить боль.

> Централизация и переиспользумость
🕚Тут буду говорить про то, чтобы одинаковая логика была реализована один раз в одном месте и дальше использовалась по всему проекту.

🔄 Пример: Централизованный кэш API


// страница товаров
if (sessionStorage.getItem("products")) {
return JSON.parse(sessionStorage.getItem("products")!);
} else {
const products = await api.getProducts();
sessionStorage.setItem("products", JSON.stringify(products));
return products;
}


такая ситуация не очень хороша, т.к. каждый экран сам кэширует результаты API


// services/cacheService.ts
export async function withCache<T>(key: string, fetcher: () => Promise<T>): Promise<T> {
const cached = sessionStorage.getItem(key);
if (cached) return JSON.parse(cached);

const data = await fetcher();
sessionStorage.setItem(key, JSON.stringify(data));
return data;
}


тут вынесли кэширование в отдельный сервис и он будет использоваться в одном месте.


const products = await withCache("products", () => api.getProducts());


То есть, если мы захотим поменять sessionStorage на localStorage мы сделаем это в одном месте. Если без сервиса, во всех 30-40-50 мест.


🔚Делая итог, главная идея такая:

1. Вынести повторяющуюся/общую логику в сервисы, адаптеры, валидаторы, утилиты.

2. Сделай одну центральную точку правды.
Тогда изменения не будут ронять весь проект.
Please open Telegram to view this post
VIEW IN TELEGRAM
😭43
90% резюме разработчиков = шлак

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

90% резюме были такие:

- Писал код на Node.js
- Делал задачи на реакте

Ну тут неудивительно что никто на собес пригласит.

Рекрутер, глядя на такое резюме, думает:
"Круто, конечно. но только какой толк от этих действий? Метрики выросли? Устранился техдолг? Бизнес заработал больше бабок?"

Формулу, которой нужно пользоваться:
X -> Y -> Z

Где X - что сделал (достижение)
Y - как это было измерено (цифры, метрики, результат)
Z - за счет чего это сделано

Пример:

Внедрил BFF-сервис (X), что сократило количество сетевых запросов фронтенда к микросервисам на ~40% (Y), за счёт агрегации данных в единое API (Z)



Если переписать достижения по такой формуле рекрутеры и нанимающие менеджеры в 10 раз будет проще понять что вы делали на работе. Другой вопрос где писать и брать эти метрики.
👍4❤‍🔥22
Ты никогда не решишь задачи на лайфкодинге

Собеседования с каждым годом сложнее и процесс входа везде повышается в 10 раз.

Но главный сюр, что многие нанимающие менеджеры дают задачи на кодинге, который сами не решат.


Пару примеров:

1. У меня был собес год назад в одну известную компанию связанную с бронированием отелей. Должно было быть 3 секции по 30 мин.
Первые 2 секции закончил за 30 минут, а вот когда перешла очередь третьей задачи началось веселье.
Сначала 10 минут мне не могли обьяснить в чем суть задачи, потом когда начал решать выяснились доп условия. А в конце когда я спросил: "Как решать правильно?"
"А мы сами не знаем, тут только говнокодом могу решить"


2. Второй пример другого разработчика с которым знаком.
Тимлид начал набирать еще одно разработчика в команду и начал давать на собесе задачку уровня medium с литкода.
Мой знакомый спросил: "А ты бы сам решил ее, не зная предварительно условий?". Тимлид ответил: "Думаю нет"


Найм сломался, но новый делать мы не будем.
😁84🙈2
С нуля за полгода в бигтех на 185к

Продолжаю серию мини-интервью. Можно почитать первое и второе интервью.

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


1. Расскажи немного о себе: чем занимался до обучения и как вообще пришёл в идею войти в IT?

Привет, меня зовут Герман, мне 25 лет, до IT я работал ведущим и активно участвовал и организовывал массовые мероприятия (бывало до 5 штук в неделю), подрабатывал на корпоративах, работал в новогоднюю ночь ведущим, в общем, по полной программе занялся этим ремеслом.
Но в моменте начал осозновать, что истинного удовольствия, мне не приносит эта работа. Да, мне нравится общаться с людьми, мне легко устананавливать контакт с человеком, но быть "клоуном" у пьяной аудитории мне быть не хотелось. Буквально в ту же неделю, когда ко мне начало приходить осознание себя и того, что мне не подходит моя работа и она лишь пережиток из детства, появился Константин, который протянул мне руку из мира айти! Он явным образом мне подсветил, что можно в короткое время обучиться и перейти в новую сферу. Так я недолго думая начал обучаться с ним.

2. С какими трудностями сталкивался в начале?

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

3. Что оказалось самым полезным в процессе обучения?

Самое полезное в обучении:
1. Реальные примеры из практики моего ментора
2. Четкая структура материала
3. Консультации с другими опытными специалистами
4. Моральная поддержка, постоянная обратная связь

4. Что тебе больше все запомнилось/удивило на собеседованиях?

На собеседованиях меня удивило, что тебя очень часто оценивают как человека, а не специалиста.
На собеседованиях применив одну фишку в разговоре с собеседником, ты можешь завоевать его признание и получить оффер, поэтому всегда слушайте своего ментора, который дает вам ОС по вашим собесам.
Удивило как невероятно сильно прокачивает просмотр собственных собеседований и анализ своих действий и слов (смотреть нереально кринжово, но это +200% к навыку прохождения собесов)
Ну и просто шокирует в моменте, что ты с наставником можешь крутануть опыта на 4-5 лет и тебе поверят на собесе, прислав вкусный оффер.

5. Что изменилось после обучения и получения работы — в навыках, мышлении, возможностях?

После получения работы, я понял, что я до этого вообще не думал бошкой (Ребята, работа в айти требует умственных усилий).
Работа в айти дала мне свободу перемещения. Удаленка - кайф.
И, конечно, работа в айти дала мне ощущение того, что я что то могу, я действительно считаю это своим достижением, самореализацией, к которой я смой придти благодаря Константину.

6. Какой совет ты бы дал тем, кто только начинает учиться?

Совет простой - не тупите, сейчас куча возможностей. Думайте о том, что время будет убегать сквозь пальцы все быстрее.
Не бойтесь менять свою жизнь.
10😘31🔥1
Выгорание


😰 Я как и многие в СНГ не сильно серьезно отношусь к выгоранию.
Несколько недель назад появилось какое-то бессилие и отсутствие мотивации, хотя обычно энергии до кучи. Вместо обычного рабочего дня не хотелось ничего.

😤 Тут я начал понимать что подхожу к тому самому выгоранию.
Вообще одно самых важных признать, что выгорание действительно есть.

Мой список действий как я начал выбираться:
- перестать работать как не в себя
- бегит, атжумания спорт и ежедневные прогулки по 10к+ шагов
- поехать в отпуск
Самый лучший и простой способ. На солнце сразу появляется больше энергии, желания жить и отдыхать.

Главное в такие моменты услышать себя и осознать что нужен отдых.
🤩118💋5👎1🆒1
Написал фичу, а через час все поломалось.

👨‍💻Бывало ли такое что ты начинаешь писать фичу, а через час понимаешь: код расползается, вся структура ломается, и уже неясно — где бизнес-логика, а где UI?

💻На самом деле, это боль большинства разработчиков. Многие разработчики не всегда знают как спроектировать конкретную таску

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

🚀Теперь мой путь можно пройти не за 8 лет, а всего за 3 часа

Я записал свой интенсив в котором ты сможешь проектировать фичи правильно, будешь понимать куда относить бизнес-логику, а куда UI и станешь понимать архитектуру лучше 80% разработчиков.

На интенсиве ты:
- Освоишь теоретическую базу FSD, чтобы понимать архитектуру
- Отработаешь проектирование фич на практике
- Получишь домашку на реальном макете с кодом, чтобы закрепить навык

Записывайся прямо сейчас — скидка 50% до 24 октября

Посмотреть бесплатный урок

Получить доступ (Оплата РФ)

Получить доступ (Оплата не из РФ)
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥64❤‍🔥3👎1🆒1
Миддлы больше не нужны

👶Начиная примерно с конца 2021 начала 2022 года джуны перестали быть интересны для любого бизнеса на 95%. С развитием нейронок в 2025 джуны не нужны никому. Cursor или Codex за 20$ сэкономит вам тысячи долларов с джунов.


🤖А что с миддлами? Их не заменят? Как бы не так.
Уже сейчас многие разработчики с большим опытом ищут работу месяцами. А что будет когда нейронка будет делать 90% их работы?
Спад спроса неизбежен на разработчиков без развития новых навыков.

Ну что же тогда делать?
Я вижу несколько вариантов развития:
- Fullstack направление
- бекенд направление с определенными языками (Golang, Rust)
- DevOps/MLOps/Cyber security
- качнуть навыки до сеньора/архитектора

🤯Решение — прокачать навыки и уметь проектировать архитектуру.

Это будет полезно для тех, кто:

🏠хочет понимать, как проектировать архитектуру фронтенда: модульность, паттерны, масштабирование;

🚀хочет вырасти до уровня, который не заменят нейронки.


Специально для этого я составил интенсив, в котором можно прокачать навыки.

🔥 На интенсиве ты:

Научишься проектировать код, который живёт годами.

Узнаешь все о Feature Slice Design.

Сможешь попрактиковаться в проектировании приложения.


Посмотреть бесплатный урок

Получить доступ (Оплата РФ)

Получить доступ (Оплата не из РФ)
Please open Telegram to view this post
VIEW IN TELEGRAM
👍65🔥4🤡2
Я уеду из России лишь забрав её с собой

🌍 ✈️ В 10-е был огромный хайп среди айтишников о том, как все уезжают или хотят уехать в другую страну, потому что там гораздо лучше.
Сотни или даже тысячи статей на Хабре про релойкет в Германию/США/Пакистано-Британию.
И я, также будучи подростком, думал, как это круто — поехать в какую-нибудь Швецию и там жить, или переехать по Blue Visa в Германию 🇸🇪🇩🇪.

Когда начался ковид, в 2020–2021 зарплаты в айти начали расти, и я начал уже нормально зарабатывать, чтобы путешествовать 💸. И какое было удивление, что оказывается, в России вообще очень хорошо. Миллионы плюсов начинаешь замечать, когда уедешь далеко от дома 🌟.

Зарплаты в РФ у типичного программиста могут быть на том же уровне, но при этом стоимость жизни сильно меньше, а сервис и услуги — на гораздо лучшем уровне.
Хоть где-то есть банковское приложение лучше Тинькофф? Нигде! 🏦
Хоть где-то есть город лучше Москвы? Думайте 🏙️.

И это не пост ватника о том, как в Европе «загнуться», а о том, как стоит замечать мелочи, которых нет в других местах 👀.

Лично для меня плюсы жизни в РФ:

- Высокая инженерная культура в айти 💻

- Уровень зарплаты сеньора (300–600 тыс.) спокойно покрывает хороший уровень жизни 💰

- Лучший сервис в мире 🌐

- Автоматизация на высочайшем уровне 🤖

- Вкусная еда 🍲

- Светловолосые славянки 👩‍🦳

Грибоедов, "Горе от ума".
- Гоненье на Москву! Что значит видеть свет.. .
Где ж лучше?
- Где нас нет.
Please open Telegram to view this post
VIEW IN TELEGRAM
11🔥4🤡4💋3
Не становись TeamLead никогда

Тимлид — это вроде бы логичное развитие карьеры:
💼 больше власти, 💰 больше денег, 🤓 больше интересных задач (нет).

Но никто не рассказывает о сложностях этой работы.

Да, ты начинаешь писать код в разы меньше,
но при этом начинаешь отвечать за всё.

⚙️Упала сборка? Идёшь решать.

Не успел релиз? Ты виноват.

Разработчик написал говнокод? Нужно учить.


Когда я управлял командой, я вечно засиживался до вечера:
правил задачи, настраивал CI/CD, оценивал и декомпозировал таски.
И всё это — за добавку к зарплате в +50–150 тысяч.

💡Но главный прикол:
сеньором я могу работать 3–4 часа в день и получать 450,
а тимлидом — по 8–9 часов за 600 (дай бог).

Перед увольнением из одной крупной компании,
в которой я работал, мне предложили хорошо апнуть зарплату, чтобы я не уходил.
Хотели поднять зп до уровня моего инженеринг-менеджера.

Да, я тогда хорошо перформил,
но она управляла тремя командами одновременно,
а зарплаты у нас были одинаковые.
Вот и думайте.

Значит, не нужно развиваться в менеджмент?
👉Нужно — но только если тебе реально в кайф эта работа.

Лично для меня это одна из худших позиций,
но это не значит, что она не подойдёт вам.
Я лишь описываю свой опыт и своё нежелание быть тимлидом.
Please open Telegram to view this post
VIEW IN TELEGRAM
4👍41🔥1
💡 Как учиться новому: на примере ИИ

В последнее время начал изучать тему ML, ИИ, ИИ-агентов и концепций вокруг них.

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

Для обучения я делаю так:
1️⃣ Вбиваю информацию о том, что мне нужно знать, от самого простого к самому сложному.
2️⃣ Смотрю видео на YouTube, желательно с визуализацией, так материал легче воспринимать.
3️⃣ Если встречается термин или код, который я не понимаю, прошу нейронку объяснить это как 5-летнему.
4️⃣ Если при объяснении нейронкой появляется новый термин, который я не знаю — вбиваю его и повторяю процесс 🔄.

Важно понимать: за один вечер всё выучить нельзя. Нужно планомерно каждый день двигаться в одну точку, и картина постепенно начнёт складываться 🧩.

🧠 Мозг лучше усваивает информацию через постепенное погружение и визуализацию.

📒 Также полезно завести заметки, куда можно скидывать материалы и записывать важные идеи.

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

Не гонитесь за тем, чтобы выучить всё сразу. Главное — каждый день делать небольшой шаг вперёд.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4🤓21❤‍🔥11😁1🏆1🤗1👾1
🔥 Оффер на 450к бекендером

Я никогда не проходил собеседования на бэкенд-разработчика.
Я работал фуллстеком и бэком в разные годы: 2018, 2019, 2022, но ни разу не был на нормальном собеседовании по бэкенду и не знал, что вообще спрашивают 😅

Приехав из отпуска 23.10, начал готовиться к собесам — изучать всю информацию, отсмотрел десяток реальных собесов и начал откликаться.
Предварительно, конечно, тщательно расписал легенду, почитал детальнее про БД и т.д.

💬 29.10 — первое собеседование.
Оказалось супер простое.
Спросили про мой опыт, архитектуру, БД, микросервисы — и всё.
Дальше пошли софт-вопросы.
35 минут собеса — и оффер на 250к.
Это был разогрев на миддла 🚀

🤖 30.10 —
первая техничка в большую компанию на проект с ИИ.
Вместо обычных вопросов про Event zLoop, изоляцию транзакций и БД — был жёсткий System Design.

Задача:
спроектировать с нуля приложение и рассказать про все возможные сложности:

- какие будут сервисы

- какие протоколы

- какие ручки

- как работать с БД

- как интегрироваться с LLM

- RAG, векторные БД, контекст

🧠 01.11 — вторая техничка.
Самопрезентация и второй этап System Design.

Задачи:

1.
Сделать приложение для радиоуправления машинами с видеопередачей 🚗📹

2.
Сделать игру Minecraft на супер слабых мощностях 🎮

За 40 минут нужно было рассказать концепцию работы клиента с сервером и самой машиной + организовать видеопередачу максимально быстро.
Во второй задаче — сделать игру с подпиской на события и бесконечным реальным миром 🌍

После этих этапов приходит оффер на 450к 💰

Проект для меня очень интересный, можно использовать ИИ в реальной работе и писать ИИ-агентов 🤖
Please open Telegram to view this post
VIEW IN TELEGRAM
10💋6👍2🍾1
Как планировать свое развитие

У меня в голове постоянно поток мыслей 💭 — что сделать, чтобы улучшить жизнь, зарабатывать больше и при этом оставаться счастливым 😊

И среди этих мыслей всегда есть развитие в рамках работы 👨‍💻.
Но если не переводить всё это «на бумагу» — наступает тревога от количества задач, и потом приходит прокрастинация 🌀

Мой способ — майндмепы

Я всегда составляю mind map.
Она помогает визуализировать цели, понять, что важнее, и выставить акценты 🎯

(На скрине — мой майндмеп на конец 2022 года)

Когда держишь всё в голове — не хватает «оперативки» на анализ.
А когда всё перед глазами — решения находятся в 10 раз проще.

🧩 Инструменты, которые реально упрощают жизнь

🗂️ Notion

🧱 Obsidian

💬 Даже просто заметки в Telegram

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

Что делаю после

После составления роадмапа я делаю анализ, ресерч и добавляю полезные материалы 📚
Со временем карта меняется вместе со мной 🛠️
Please open Telegram to view this post
VIEW IN TELEGRAM
6😍2💋2
Учимся общаться с рекрутерами

На данном скрине веду переговоры по поводу тестового задания в 2021

Учимся и берем на заметку 💅💅
Please open Telegram to view this post
VIEW IN TELEGRAM
😁15🤷‍♂3❤‍🔥11
Бесплатный анализ вашего резюме

🤖 Сделал ИИ-агента(нет), который анализирует резюме.

В моем моем тг боте можете проанализировать резюмешку и получить рекомендации 🤩

@kostya_web_dev_platform_bot

Команда /resume
Please open Telegram to view this post
VIEW IN TELEGRAM
💋4🔥3🍌2👍1
Вам никуда не деться от ИИ 🤖

Сейчас на каждой конференции миллион докладов о том как внедрили ИИ, как все круто. Но при этом компании внедрившие ИИ не говорят о сверх выручках или оптимизации процессов, а даже наоборот нанимают сотрудников обратно.

Но раз результатов нет, откуда такой хайп? 🤔

Индустрия новая, буквально с 2023 только начала жить полной жизнью. 🌱

Во-первых, эффект от внедрения новых инструментов можно ли почувствовать сразу?
Вот вам волшебная палочка: «Щас она вам пицот миллионов принесёт, вот прям за два дня». Ага, щас 🪄

На первых этапах любая новая технология не экономит ресурсы, а наоборот — требует их. 📈

Нужно миллиард всего: новые роли, новые процессы, обучение сотрудников 🧑‍🏫

Это не ускоряет работу сразу, а замедляет её. 🐌

Второе: ИИ не заменяет людей, он ускоряет решение задач и меняет задачи 👨‍💻

ИИ как новый уровень автоматизации, требующий человеческого надзора 🔍

Третье: мы сейчас в такой точке истории где меняется все.

Сейчас меняется все. ИИ как один из фактор слома старой системы и рождения новой. И рождение новой может ускориться благодаря чему?)

Все понимают:
кто сейчас не начнёт разбираться, тот завтра останется далеко позади

Вопроса «заменит — не заменит» нет,
вопрос кто успеет встроиться, а кто будет в догоняющих

change by design or change by disaster?
Please open Telegram to view this post
VIEW IN TELEGRAM
❤‍🔥7💋1
Без отдыха ты выгоришь

☔️ В этом году погода в Питере ужасная. 1 месяц лета и небо вечно свинцового света.

Из-за этого энергии было мало и уже начал чувствовать себя обессиленным и немотивированным.

Последний раз ездил куда-то отдыхать в конце января (в Батуми 🤣🤣🤣).

В середине октября резко взял билеты и поехал в Дубай 🍫 на недельку. Разнообразно отдохнул: гидрик, квадрик, пустыня, море, вкусная еда.

И вуаля, приезжая домой чувствую жесткий заряд энергии. Куча энергии что-то делать, творить, работать.
Солнышко ☀️, море 🌊 и теперь можно снова погромировать 🤓

Друзья, не забывайте отдыхать !
👍9👌3💯21