Сколько зарабатываете?
Anonymous Poll
18%
не зарабатываю
1%
до 15.000
2%
от 15.000 до 30.000
4%
от 30.000 до 50.000
7%
от 50.000 до 80.000
11%
от 80.000 до 120.000
15%
от 120.000 до 180.000
43%
от 180.000
😁16👀7❤2🐳2
Forwarded from xCode Journal
Такую статистику показало новое исследование. Больше половины работодателей в России сталкивались с приукрашенным резюме у кандидатов. При этом чаще всего врут разработчики ПО, за ними идут тестировщики и руководители проектов.
А вот меньше всего обманывают эйчаров датасаентисты, аналитики, сетевые инженеры и специалисты технической поддержки.
Please open Telegram to view this post
VIEW IN TELEGRAM
😁8👍5❤2🔥1
Баланс: pet-проекты vs работа
Каждый разработчик хоть раз ловил себя на мысли: “Хочу сделать свой проект. Но после работы нет ни сил, ни желания писать код.”
И вот тут начинается борьба между желанием развиваться и желанием просто отдохнуть.
✅ Pet-проекты — это топливо для роста.
Ты пробуешь новые технологии без дедлайнов, без легаси и без код-ревью с “а зачем тут вообще useMemo?”.
Это та самая зона, где возвращается интерес к разработке, особенно когда на работе монотонные задачи.
Но.
🙅♂️ Pet-проект не должен превращаться во вторую работу.
Если ты после 8 часов продакшена садишься за ещё 4 часа кода — это не развитие, это выгорание в красивой обёртке.
И так: как найти баланс?:
Итог:
Работа — даёт стабильность.
Pet-проекты — дают развитие.
Отдых — даёт энергию, чтобы выдержать первые два пункта.
Главное — не забывать, что кодить “в кайф” иногда важнее, чем кодить “всё время”.
Каждый разработчик хоть раз ловил себя на мысли: “Хочу сделать свой проект. Но после работы нет ни сил, ни желания писать код.”
И вот тут начинается борьба между желанием развиваться и желанием просто отдохнуть.
Ты пробуешь новые технологии без дедлайнов, без легаси и без код-ревью с “а зачем тут вообще useMemo?”.
Это та самая зона, где возвращается интерес к разработке, особенно когда на работе монотонные задачи.
Но.
Если ты после 8 часов продакшена садишься за ещё 4 часа кода — это не развитие, это выгорание в красивой обёртке.
И так: как найти баланс?:
🔘 Делай pet-проекты короткими и законченными.
Маленький тул или демо — лучше, чем вечный “стартап мечты”.🔘 Ставь себе ограничение по времени.
Например, кодишь только 2 вечера в неделю.🔘 Не чувствуй вины, если не делаешь ничего.
Отдых — тоже часть продуктивности.
Мой личный опыт:
Pet-проекты реально помогают не терять интерес к коду.
Но только когда они не конкурируют с отдыхом, а заменяют бессмысленный скролл YouTube чем-то, что тебя вдохновляет.
Итог:
Работа — даёт стабильность.
Pet-проекты — дают развитие.
Отдых — даёт энергию, чтобы выдержать первые два пункта.
Главное — не забывать, что кодить “в кайф” иногда важнее, чем кодить “всё время”.
Please open Telegram to view this post
VIEW IN TELEGRAM
❤22🔥4🐳3
Storage API в 2025: что, где и когда хранить
Хранение данных в браузере — это не просто localStorage.setItem().
Современные API дают кучу способов работать с кэшем, оффлайном и большими объёмами данных.
Главное — понимать, какой инструмент для чего.
💛 LocalStorage — для простого и быстрого
💛 IndexedDB — когда данных много
💛 Cache Storage API — для сетевых запросов
💛 Best Practices
📍 Итог:
Браузер — уже не просто “тонкий клиент”.
Он умеет кэшировать, хранить и синхронизировать данные не хуже бэкенда.
Главное — не пихать всё в localStorage и думать, что этого достаточно
Хранение данных в браузере — это не просто localStorage.setItem().
Современные API дают кучу способов работать с кэшем, оффлайном и большими объёмами данных.
Главное — понимать, какой инструмент для чего.
- Объём: до ~5MB
- Синхронный API (блокирует поток)
- Только строки✅ Идеально для:
- Настроек интерфейса (тема, язык)
- Состояния, не критичного к потере🙅♂️ Не подходит для:
- Частых записей
- Больших данных
- Асинхронных операций🔘 Частая ошибка: хранить JWT или токены авторизации.
Не делай так — XSS и ты в опасности. Лучше HttpOnly cookie.
- Асинхронная, ключ-значение база прямо в браузере
- Поддерживает сложные структуры (объекты, Blob, файлы)
- Работает оффлайн✅ Идеально для:
- SPA с оффлайн-режимом
- Кеширования запросов
- Локальных кэшей для heavy UI (например, таблицы на тысячи строк)🙅♂️ Минусы:
- API громоздкий (лучше использовать обёртки вроде Dexie.js)
- Не всегда очевидное управление версиями
Используется вместе с Service Worker.
Позволяет сохранять ответы от fetch и выдавать их оффлайн.✅ Идеально для:
- PWA и offline-first приложений
- Кэширования статики (CSS, JS, картинки)
- Быстрых перезапусков SPA🙅♂️ Не путай с LocalStorage — это не просто “сохранил строку”, а полноценный HTTP-кеш.
🔘 Комбинируй: IndexedDB для данных, Cache для запросов, LocalStorage для мелочей.🔘 Удаляй устаревшие версии данных (особенно при обновлении схем).🔘 Не храни чувствительные данные — браузер ≠ сейф.🔘 Проверяй лимиты хранилища (navigator.storage.estimate() — underrated).🔘 Используй Background Sync, если нужно синхронизировать оффлайн-данные.
Браузер — уже не просто “тонкий клиент”.
Он умеет кэшировать, хранить и синхронизировать данные не хуже бэкенда.
Главное — не пихать всё в localStorage и думать, что этого достаточно
Please open Telegram to view this post
VIEW IN TELEGRAM
❤15👍5🔥4👀3🐳1
Quantum CSS и ML-оптимизация верстки — будущее фронтенда?
Звучит как хайп, но тренд реальный:
всё чаще ML-алгоритмы применяются не только для генерации кода, но и для оптимизации CSS, DOM и layout-процессов.
Что такое Quantum CSS
ML-оптимизация верстки
Что нас ждёт
Мой вывод
А как ты относишься к идее ML-CSS?
Хотел бы, чтобы браузер сам решал, какие стили тебе нужны — или всё-таки контроль должен оставаться за человеком?
Звучит как хайп, но тренд реальный:
всё чаще ML-алгоритмы применяются не только для генерации кода, но и для оптимизации CSS, DOM и layout-процессов.
Что такое Quantum CSS
Если коротко — это концепция (а не фреймворк), где браузер или сборщик анализирует и оптимизирует стили на уровне движка, не дожидаясь ручной оптимизации от разработчика.
Mozilla когда-то начала этот путь с Project Quantum (оптимизация движка Firefox), и идея живёт:
браузер сам решает, как рендерить части DOM параллельно и какие CSS-правила реально нужны в viewport.
Главная цель:
ускорить перерисовку и минимизировать “CSS-инфляцию” — когда у проекта тысячи неиспользуемых классов и стилей.
ML-оптимизация верстки
ML-модели уже умеют анализировать структуру страницы и:
выявлять дублирующиеся CSS-паттерны;
предлагать оптимальную архитектуру классов (например, по BEM или atomic-подходу);
предсказывать layout shifts и предлагать фиксы для CLS;
автоматически “чистить” стили после деплоя (CSS pruning с учётом поведения реальных пользователей).
Что нас ждёт
Через пару лет мы можем прийти к IDE, которая:💛 отслеживает реальное использование на проде,💛 сама обучается оптимизировать layout.
Типа “GitHub Copilot для CSS”, но с реальной экономией трафика и FPS.
Мой вывод
CSS медленно превращается из “ручного ремесла” в систему адаптивной оптимизации.
И если сейчас мы думаем “как проще написать стили”,
то скоро будем думать “как обучить модель писать и обслуживать их за нас”.
А как ты относишься к идее ML-CSS?
Хотел бы, чтобы браузер сам решал, какие стили тебе нужны — или всё-таки контроль должен оставаться за человеком?
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥11❤2👎2🐳1👀1
Нативные API, о которых все забывают: File System, Clipboard, Web Share
Иногда кажется, что фронтенд уже придумал всё — фреймворки, SSR, рендеринг в стримах, use-сотый-хук.
А потом натыкаешься на Web API, которые о которых раньше не слышал.
🔘 File System Access API
🔘 Clipboard API
🔘 Web Share API
✅ Граница между «вебом» и «десктопом» становится всё тоньше.
То, что раньше было возможно только в Electron или нативных приложениях, сегодня работает прямо в браузере.
И это открывает довольно интересные UX-возможности — от локальных IDE до оффлайн-редакторов и менеджеров файлов.
Иногда кажется, что фронтенд уже придумал всё — фреймворки, SSR, рендеринг в стримах, use-сотый-хук.
А потом натыкаешься на Web API, которые о которых раньше не слышал.
Позволяет работать с файлами прямо на диске пользователя — читать, писать, сохранять без танцев с input[type=file].
Почти VS Code в браузере.
Отлично подходит для локальных редакторов, playground'ов, PWA-приложений.
Но важно: требует HTTPS и согласия пользователя (пожалуй это и хорошо).const handle = await window.showSaveFilePicker();
const stream = await handle.createWritable();
await stream.write("Hello world!");
await stream.close();
Уже давно не просто document.execCommand('copy').
Можно копировать/вставлять не только текст, но и изображения, HTML, JSON.
Если делаете дашборд, таблицы, визуальные тулзы — must have.await navigator.clipboard.writeText("Copied!");
const image = await navigator.clipboard.read();
Штука, которая превращает ваш сайт в «родное» приложение.
Позволяет вызвать системное окно шаринга (например, переслать ссылку в Telegram или Mail прямо из браузера).
Особенно удобно для мобильных PWA.await navigator.share({
noscript: "Frontend Magic",
text: "Проверь этот пост!",
url: location.href
});
То, что раньше было возможно только в Electron или нативных приложениях, сегодня работает прямо в браузере.
И это открывает довольно интересные UX-возможности — от локальных IDE до оффлайн-редакторов и менеджеров файлов.
Please open Telegram to view this post
VIEW IN TELEGRAM
❤9👍6⚡3
Forwarded from xCode Journal
ИИ-ассистент будет теперь доступен везде — так что ему можно будет поручать задачи или просить что-то объяснить. Плюс браузер будет подстраиваться под пользователя из-за встроенной памяти. Это новая эпоха поиска, официально.
Будет доступно бесплатно на macOS.
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥4🐳3⚡1❤1😁1
Может, вам тоже знакома эта ситуация: работа в команде, где каждый день — это вызов? Или, возможно, вы хотите «запомниться» коллегам? Давайте посмотрим на проверенные методы, которые гарантированно обеспечат вам статус в офисе... правда, не самый положительный.
✅ Метод «Википедии»
Не можете найти общий язык с коллегами? Заведите раздел в корпоративной вики, где будете подробно описывать все «косяки» ваших товарищей. Скриншоты, временные метки и даже свидетели – всё в помощь! Через год у вас будет целая энциклопедия непроверенных данных, а новые сотрудники точно оценят вашу внимательность. Главное — не забывайте развивать «историю».✅ Техника «Zoom-бомбинга»
Следующий уровень: не бояться вмешиваться в чужие встречи. Особенно когда это ретроспективы других команд. Ну, а если коллега с начальником один на один? Скажите, что у вас «появился важный вопрос», и добавьтесь в Zoom-сессию. Так вы точно «услышите» не только своё мнение.✅ Стратегия «Героического непонимания»
Получил задачу, которую сразу не понял? Не спеши спрашивать. Поищи ошибки в коде, перепиши часть проекта и создай несколько гипотез. И только когда дедлайн уже на носу, напиши в чат: «Кто-нибудь понимает, о чём речь?» Ты же герой, и время для вопросов настало лишь накануне релиза.✅ Метод «Git-археологии»
Каждая ошибка коллеги должна стать поводом для расследования. И неважно, что это было два года назад. «А вот в коммите от марта ты сделал то же самое!» Найди старые косяки и просто забудь про свой собственный вклад в проект.✅ Стратегия «Собеседование саботажа»
Приехали на собеседование? Отлично! Теперь нужно создать атмосферу для будущих разработчиков. Садитесь в телефоне, задавайте вопросы, не относящиеся к теме, и жалуйтесь на отсутствие талантов. Главное — дайте понять, что молодёжь не та.
Please open Telegram to view this post
VIEW IN TELEGRAM
❤8🐳3👀1
Тестирование — это не просто «привет, юнит-тесты» и «проверим кнопку». Когда речь идет о больших приложениях с кучей состояний, анимаций и взаимодействий, интерфейсы становятся одним из самых уязвимых мест. И, если не тестировать интерфейсные взаимодействия должным образом, то рано или поздно придётся искать баги, скрытые за пользовательскими проблемами.
✅ Интерактивность и поведение: Простой пример — форма, которая не отправляется после клика, или чекбокс, который не обновляет свой статус. Такие вещи сложно отловить вручную, но они могут стать причиной огромного недовольства пользователей.✅ Кросс-браузерность и адаптивность: Интерфейс может выглядеть идеально в Chrome, но ломаться в Safari или на мобильном. С тестами таких проблем можно избежать, проверяя поведение компонентов на разных устройствах и браузерах.✅ UI/UX баги: Строго говоря, это не «классовые» баги, а проблемы, которые влияют на восприятие приложения. Несоответствие дизайну, неправильные анимации — всё это может уйти незамеченным в процессе обычного тестирования, но сказаться на восприятии вашего продукта.
👀 Cypress: Простой и мощный инструмент для энд-ту-энд тестирования. Он позволяет тестировать, как ваш интерфейс ведет себя в реальных сценариях: клики, заполнение форм, навигация, и многое другое. Cypress особенно удобен для динамичных SPA-приложений, где важно протестировать все возможные переходы и взаимодействия.👀 Если вам нужно больше гибкости, попробуйте Playwright. Он поддерживает тестирование нескольких браузеров и идеально подходит для тестирования UI на разных платформах, таких как Chrome, Firefox и WebKit. А ещё, в отличие от Cypress, Playwright поддерживает тестирование мобильных устройств из коробки.👀 React Testing Library: Если вы работаете с React, этот инструмент поможет вам тестировать компоненты с учётом пользовательских взаимодействий. Он фокусируется на тестах, которые проверяют не только логику, но и правильное поведение в контексте UI. Например, как компоненты реагируют на пользовательский ввод или как они отображаются при разных состояниях.👀 В случае, если вам нужно тестировать поведение интерфейса в браузере, Puppeteer — это тот инструмент, который поможет вам автоматизировать тесты в реальных браузерах. Это идеальный выбор для UI-тестов, где важен контроль над браузерными событиями и точность.
Please open Telegram to view this post
VIEW IN TELEGRAM
❤6👍3👀2
Алоха коллеги.
Помогите улучшить контент 🤝
Хочу делать канал ещё интереснее и полезнее для вас.
Ответьте, пожалуйста, на 6 коротких вопросов — это займёт пару минут, а ваше мнение очень важно для меня!
https://docs.google.com/forms/d/e/1FAIpQLSf5K_4EzVd3piPXfM9B5dw2AiMHEEWU2y7_gNNAxUgpUuCMNA/viewform?usp=header
Помогите улучшить контент 🤝
Хочу делать канал ещё интереснее и полезнее для вас.
Ответьте, пожалуйста, на 6 коротких вопросов — это займёт пару минут, а ваше мнение очень важно для меня!
https://docs.google.com/forms/d/e/1FAIpQLSf5K_4EzVd3piPXfM9B5dw2AiMHEEWU2y7_gNNAxUgpUuCMNA/viewform?usp=header
Google Docs
Анкета для улучшения контента
Ответь на вопросы максимально честно🤝
👀5⚡2❤2
В JavaScript есть много мощных инструментов, которые не всегда получают должное внимание. Proxy и Reflect — это как раз те штуки, которые часто остаются за кадром. Но на самом деле, их возможности могут существенно упростить разработку, если знать, как правильно использовать. Давайте взглянем на несколько реальных примеров, где Proxy и Reflect могут быть полезными.
// Представьте, что вам нужно отследить, кто и когда обращается к объекту. Вместо того чтобы забивать код десятками console.log, можно просто использовать Proxy для перехвата. Теперь любое обращение к объекту будет логироваться. Это очень удобно, если вы работаете с большими стейтами, как в Vue или MobX.
const user = { name: "Alex", age: 25 };
const loggedUser = new Proxy(user, {
get(target, prop) {
console.log(`GET ${prop}`);
return Reflect.get(target, prop);
},
set(target, prop, value) {
console.log(`SET ${prop} = ${value}`);
return Reflect.set(target, prop, value);
}
});
loggedUser.name; // GET name
loggedUser.age = 26; // SET age = 26// Proxy может отловить некорректные значения и не дать им попасть в бизнес-логику. С таким подходом можно сделать простые data-models без классов и лишнего кода. Валидация и контроль за данными — проще не бывает.
const product = new Proxy({}, {
set(target, prop, value) {
if (prop === 'price' && value < 0) {
throw new Error("Цена не может быть отрицательной");
}
return Reflect.set(target, prop, value);
}
});// Reflect — набор методов для безопасной работы с объектами. Они выполняют стандартные операции, но предотвращают неожиданные ошибки и обеспечивают предсказуемое поведение.
Reflect.get(obj, 'key'); // вместо obj.key
Reflect.set(obj, 'key', 'value'); // возвращает true/false, не выбрасывает ошибки
// Комбо с Proxy выглядит так:
const safe = new Proxy(obj, {
get: (t, p) => Reflect.get(t, p),
set: (t, p, v) => Reflect.set(t, p, v)
});Please open Telegram to view this post
VIEW IN TELEGRAM
👍12❤4🐳1
Многие, когда слышат термин utility-first CSS, сразу думают о Tailwind. Но на самом деле это не просто фреймворк, а подход к верстке. Tailwind лишь помог сделать этот подход популярным. Давайте разберёмся, что это за стиль и как его можно применить.
<!-- В классическом CSS мы описываем сущности. Utility-first CSS — это немного другой подход. Вместо того чтобы описывать компоненты, мы описываем свойства. Каждый класс — это атомарная единица стиля, которая выполняет одно действие. Когда нужно собрать сложный элемент, мы комбинируем несколько таких атомов, чтобы получить нужный результат -->
<button class="bg-black text-white rounded-lg px-4 py-2">Click</button>• Открыл HTML и сразу видишь, как выглядит элемент. Нет нужды прыгать по CSS-файлам, чтобы понять, как что-то стилизовано.
• Изолированность без сложных каскадов. Нет таких длинных цепочек, как .card .button.active:hover. Всё работает локально и предсказуемо.
• Нужно создать новый элемент? Просто комбинируешь существующие утилиты, без копирования и написания новых классов. Не нужно писать «ещё одну кнопку, только поменьше».
• Если нужно изменить отступы, это быстрее, чем искать, где в CSS заданы padding. Например, меняем класс px-4 на px-6 и сразу видим результат.
Этот подход можно применить и без фреймворка.
— Заведи слой утилит в обычном CSS:
.flex { display: flex; }
.gap-2 { gap: 0.5rem; }
.text-sm { font-size: 14px; }
— Используй CSS custom properties для хранения токенов, как --color-primary, --space-sm.
— Используй PostCSS или UnoCSS, чтобы собирать утилиты динамически.Если команда не договорится об atomic naming и начнёт использовать названия вроде text-12px flex1 mt-8px, это может привести к путанице и усложнить понимание кода. Особенно это критично в проектах без дизайн-системы, где утилиты могут превратиться в хаос. В таких ситуациях лучше использовать гибридный подход, комбинируя утилитарный стиль с обычными компонентами, чтобы обеспечить масштабируемость и переиспользование блоков.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7👎7❤1
Псевдо-класс :not() — одна из самых мощных фич CSS, которую часто используют для исключений, но мало кто знает, что она может делать намного больше. В этом посте мы разберемся, как можно использовать
:not() для улучшения гибкости и точности ваших стилей.Вы наверняка знаете, что :not() используется для исключения элементов с определенным классом или позицией в списке. Например, стиль применяется ко всем элементам .link, кроме последних в списке. Однако :not() позволяет комбинировать несколько условий. Код применяет стиль ко всем img без атрибута class и не являющихся первыми детьми в родительском элементе. Это возможно благодаря тому, что :not() принимает несколько селекторов, разделённых запятыми.
/* Базовое применение */
.link:not(:last-child) {
margin-left: 1rem;
}
/* Применение для всех img, кроме тех, у которых есть атрибут class */
img:not([class], :first-child) {
margin-block-start: var(--ds-typography-img-margin-block-start, var(--_ds-typography-main-margin));
}Что если вы хотите применить стиль только к тем элементам, которые не содержат в себе определённого соседа? Это легко сделать, используя комбинацию :not() и :has(). В примере стиль background-color: lightblue применяется ко всем параграфам <p>, за которыми не следует элемент <h2>. Это позволяет точно контролировать, какие элементы подвергать стилизации, не добавляя лишних классов или элементов разметки.
<body>
<h1>Париж</h1>
<p>Столица и крупнейший город Франции...</p>
<h2>История</h2>
<p>Париж вырос на месте поселения...</p>
<p>Поселение располагалось на безопасном острове...</p>
</body>
/* Применяем стиль только к параграфам, за которыми не следует элемент h2 */
p:not(:has(+ h2)) {
background-color: lightblue;
}Псевдо-класс :not() — это просто огонь-фича для тех, кто любит делать код проще и понятнее. Он позволяет исключать элементы по разным условиям, что значительно упрощает создание сложных селекторов. В отличие от старых методов, :not() даёт вам больше свободы и точности.
С его помощью можно создавать более чистые и понятные разметки, которые легко подстраиваются под изменения в структуре документа. Это как улучшенная версия селекторов :first-child или :last-child, только с гораздо большими возможностями.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍10❤3🐳1
Тестирование — это не просто «привет, юнит-тесты» и «проверим кнопку». Когда речь идет о больших приложениях с кучей состояний, анимаций и взаимодействий, интерфейсы становятся одним из самых уязвимых мест. И, если не тестировать интерфейсные взаимодействия должным образом, то рано или поздно придётся искать баги, скрытые за пользовательскими проблемами.
✅ Интерактивность и поведение: Простой пример — форма, которая не отправляется после клика, или чекбокс, который не обновляет свой статус. Такие вещи сложно отловить вручную, но они могут стать причиной огромного недовольства пользователей.✅ Кросс-браузерность и адаптивность: Интерфейс может выглядеть идеально в Chrome, но ломаться в Safari или на мобильном. С тестами таких проблем можно избежать, проверяя поведение компонентов на разных устройствах и браузерах.✅ UI/UX баги: Строго говоря, это не «классовые» баги, а проблемы, которые влияют на восприятие приложения. Несоответствие дизайну, неправильные анимации — всё это может уйти незамеченным в процессе обычного тестирования, но сказаться на восприятии вашего продукта.
👀 Cypress: Простой и мощный инструмент для энд-ту-энд тестирования. Он позволяет тестировать, как ваш интерфейс ведет себя в реальных сценариях: клики, заполнение форм, навигация, и многое другое. Cypress особенно удобен для динамичных SPA-приложений, где важно протестировать все возможные переходы и взаимодействия.👀 Если вам нужно больше гибкости, попробуйте Playwright. Он поддерживает тестирование нескольких браузеров и идеально подходит для тестирования UI на разных платформах, таких как Chrome, Firefox и WebKit. А ещё, в отличие от Cypress, Playwright поддерживает тестирование мобильных устройств из коробки.👀 React Testing Library: Если вы работаете с React, этот инструмент поможет вам тестировать компоненты с учётом пользовательских взаимодействий. Он фокусируется на тестах, которые проверяют не только логику, но и правильное поведение в контексте UI. Например, как компоненты реагируют на пользовательский ввод или как они отображаются при разных состояниях.👀 В случае, если вам нужно тестировать поведение интерфейса в браузере, Puppeteer — это тот инструмент, который поможет вам автоматизировать тесты в реальных браузерах. Это идеальный выбор для UI-тестов, где важен контроль над браузерными событиями и точность.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7❤1
Связность и сцепленность. Почему код живёт или умирает.
Недавно наткнулся на пост Темы Сенюкова из Кинопоиска про Cohesion и Coupling. Кажется, это одни из тех базовых понятий, которые ты вроде знаешь, но понимаешь только после кучи сделанных ошибок.
С опытом начинаешь видеть закономерность: код умирает не потому, что «технология устарела» или «всё переписали на React 19». Он умирает, потому что у него нарушен баланс — внутри всё плохо связано, а снаружи всё переплетено.
Когда связность (cohesion) низкая — модуль делает всё подряд: загружает данные, форматирует дату, логирует аналитику и варит кофе юзеру. Заходишь туда через полгода — и не понимаешь, что и где.
Когда сцепленность (coupling) высокая — любое изменение где-то «там» ломает всё «здесь». Изменили API? Привет, бесконечный refactor. Поменяли store? Упало полстраницы.
В какой-то момент я перестал смотреть на код просто как на функции и компоненты. Теперь я думаю о нём как о «разговорах» между кусками приложения. Хороший код — это когда эти разговоры короткие и по делу. Плохой — когда все орут непонятно что.
Вот пара мыслей, которые реально помогают:
🟢 Делайте компоненты, которые умеют ровно одно. Остальное пусть решают «соседи».
🟢 Прокидывайте зависимости явно — пусть всё, что нужно компоненту, приходит снаружи.
🟢 Разделяйте слои. Данные, логика, UI — три мира, не обязанные знать детали друг друга.
🟢 И самое главное — не бойтесь «резать» код. Маленькие куски легче понимать, менять и тестировать.
✅ Это те вещи, которые определяют, живёт ли ваш проект дольше полугода
Недавно наткнулся на пост Темы Сенюкова из Кинопоиска про Cohesion и Coupling. Кажется, это одни из тех базовых понятий, которые ты вроде знаешь, но понимаешь только после кучи сделанных ошибок.
С опытом начинаешь видеть закономерность: код умирает не потому, что «технология устарела» или «всё переписали на React 19». Он умирает, потому что у него нарушен баланс — внутри всё плохо связано, а снаружи всё переплетено.
Когда связность (cohesion) низкая — модуль делает всё подряд: загружает данные, форматирует дату, логирует аналитику и варит кофе юзеру. Заходишь туда через полгода — и не понимаешь, что и где.
Когда сцепленность (coupling) высокая — любое изменение где-то «там» ломает всё «здесь». Изменили API? Привет, бесконечный refactor. Поменяли store? Упало полстраницы.
В какой-то момент я перестал смотреть на код просто как на функции и компоненты. Теперь я думаю о нём как о «разговорах» между кусками приложения. Хороший код — это когда эти разговоры короткие и по делу. Плохой — когда все орут непонятно что.
Вот пара мыслей, которые реально помогают:
🟢 Делайте компоненты, которые умеют ровно одно. Остальное пусть решают «соседи».
🟢 Прокидывайте зависимости явно — пусть всё, что нужно компоненту, приходит снаружи.
🟢 Разделяйте слои. Данные, логика, UI — три мира, не обязанные знать детали друг друга.
🟢 И самое главное — не бойтесь «резать» код. Маленькие куски легче понимать, менять и тестировать.
✅ Это те вещи, которые определяют, живёт ли ваш проект дольше полугода
Telegram
ТОП - Тёма о программировани
Cohesion и Coupling 🧩🔗
Здарова, работяги!
Если очень коротко: хорошая архитектура — это высокая связность внутри модулей (cohesion) и низкая связанность между ними (coupling). Эти два термина отлично объясняют, почему код либо живёт годами, либо рассыпается…
Здарова, работяги!
Если очень коротко: хорошая архитектура — это высокая связность внутри модулей (cohesion) и низкая связанность между ними (coupling). Эти два термина отлично объясняют, почему код либо живёт годами, либо рассыпается…
👍12❤2
Когда мы работаем с анимациями в CSS, важно учитывать, какие свойства задействованы. Некоторые из них могут значительно снизить производительность страницы, тогда как другие обеспечат плавность и быстрое отображение.
Анимация свойств, таких как width, height, margin, padding, top и left, требует от браузера выполнения нескольких ресурсоёмких шагов: Reflow (пересчёт размеров и расположения элементов), Repaint (перерисовка частей страницы) и отображение на экране. Эти процессы могут значительно замедлить работу страницы, особенно при большом количестве элементов, что негативно сказывается на её производительности.
Для повышения производительности веб-анимаций рекомендуется использовать свойства, обрабатываемые графическим процессором (GPU), вместо центрального процессора (CPU). Это позволяет избежать лишних вычислений и ускоряет отображение, особенно при анимации таких свойств, как transform (например, translate, scale, rotate) и opacity (прозрачность). В этих случаях браузеру не нужно пересчитывать размеры элементов или перерисовывать всю страницу, так как изменения происходят на уровне графики, что значительно улучшает производительность.
/* Когда вы анимируете left, браузер выполняет перерасчёт и перерисовку страницы. Этот способ медленный, так как каждый сдвиг элемента требует выполнения операций reflow и repaint. */
.element {
transition: left 0.5s ease;
}
/* При использовании transform, браузер просто сдвигает элемент на графическом уровне, избегая дополнительных перерасчётов. Здесь браузер применяет изменения только на уровне GPU, что делает анимацию плавной и быстрой. */
.element {
transition: transform 0.5s ease;
}Please open Telegram to view this post
VIEW IN TELEGRAM
👍15🔥9❤3
При создании форм часто встречаются обязательные поля. Они могут быть заполнены верно или нет. Для стилизации этих состояний обычно используют псевдо-классы
:valid и :invalid. Эти классы применяются сразу после загрузки страницы, даже если пользователь ещё не успел взаимодействовать с полем. Это может раздражать из-за некорректного отображения. Рассмотрим, как можно исправить и улучшить ситуацию.<<!-- Первое поле с логином зелёное (корректно заполнено). Второе поле с паролем красное (пусто и недействительно) -->
<body>
<form class="form">
<div class="form__group">
<label for="name">Введите логин</label>
<input id="name" type="text" value="melnik909" required>
</div>
<div class="form__group">
<label for="password">Введите пароль</label>
<input id="password" type="password" required>
</div>
<button>Войти</button>
</form>
</body>
<style>
input:invalid {
box-shadow: 0 0 10px red;
}
input:valid {
box-shadow: 0 0 10px green;
}
</style>Для предотвращения преждевременного применения стилей добавлены псевдо-классы
:user-valid и :user-invalid, которые активируются при взаимодействии пользователя с полем. Стили применяются только после ввода данных. Давайте заменим старые псевдо-классы на новые:input:user-invalid {
box-shadow: 0 0 10px red;
}
input:user-valid {
box-shadow: 0 0 10px green;
}Please open Telegram to view this post
VIEW IN TELEGRAM
👍9❤5🔥2
Forwarded from xCode Journal
Please open Telegram to view this post
VIEW IN TELEGRAM
😁38👎4🔥4👍2👀2
#react #вакансия
Позиция: Fullstack Web Developer (React + Next.js)
Компания: MiningPool
Формат работы: удаленка
Занятость: полная
Вилка: $2500-$4000
Ты построишь клиентский кабинет: UI для мониторинга, биллинга, управления воркерами и токенами. Это роль с упором на React и Next.js, с лёгкой интеграцией backend API, аутентификацией и авторизацией.
Зоны ответственности:
* Реализация интерфейса Dashboard: статистика хешрейта, состояние воркеров, лимиты и токены доступа, история начислений
* Интеграция с Clerk (аутентификация, RBAC)
* Подключение REST API (на Rust)
* Фронтовая бизнес-логика: генерация воркеров, отображение статусов, установка ограничений
* Создание простых визуализаций (charts, таблицы, фильтры)
Технологии:
* React, Next.js, Tailwind, shadcn/ui
* Clerk SDK (auth)
* REST API (axios, react-query или SWR)
* PostgreSQL (через API), Supabase.
Требования:
* 2+ года опыта с React / Next.js
* Уверенная работа с REST API и Auth SDK
* Умение быстро проектировать UI на Tailwind или shadcn
* Знание баз данных на уровне SQL и умение читать EXPLAIN — большой плюс
Для связи и отправки резюме:
@dishsh
Позиция: Fullstack Web Developer (React + Next.js)
Компания: MiningPool
Формат работы: удаленка
Занятость: полная
Вилка: $2500-$4000
Ты построишь клиентский кабинет: UI для мониторинга, биллинга, управления воркерами и токенами. Это роль с упором на React и Next.js, с лёгкой интеграцией backend API, аутентификацией и авторизацией.
Зоны ответственности:
* Реализация интерфейса Dashboard: статистика хешрейта, состояние воркеров, лимиты и токены доступа, история начислений
* Интеграция с Clerk (аутентификация, RBAC)
* Подключение REST API (на Rust)
* Фронтовая бизнес-логика: генерация воркеров, отображение статусов, установка ограничений
* Создание простых визуализаций (charts, таблицы, фильтры)
Технологии:
* React, Next.js, Tailwind, shadcn/ui
* Clerk SDK (auth)
* REST API (axios, react-query или SWR)
* PostgreSQL (через API), Supabase.
Требования:
* 2+ года опыта с React / Next.js
* Уверенная работа с REST API и Auth SDK
* Умение быстро проектировать UI на Tailwind или shadcn
* Знание баз данных на уровне SQL и умение читать EXPLAIN — большой плюс
Для связи и отправки резюме:
@dishsh
❤3👎3🔥2🐳1