Forwarded from xCode Journal
Так говорит айтишник Disney. Дело в том, что компания Disney сделала для своих программистов «панель мониторинга внедрения ИИ» с лидербордом. Чем больше дней подряд ты используешь Cursor или Claude, тем больше у тебя ачивок.
Некоторые сотрудники говорят, что чувствуют давление «максимально использовать токены».
Please open Telegram to view this post
VIEW IN TELEGRAM
👎5
Forwarded from xCode Journal
Запускаешь
npx autoskills, и он сканирует репозиторий: читает package.json и конфиги, определяет технологический стек и ставит нужные скиллы из проверенного списка. Короче, сильно экономит время на ручной настройке и поиске.
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥1
Меня недавно позвали в папку IT On и я согласился почти не раздумывая, потому что давно искал что-то похожее.
Там собраны люди, которые реально шарят в своей теме: разработчики, продакты, основатели стартапов, эксперты по карьере в tech. Каждый пишет про своё и в сумме получается полная картина индустрии.
Читаешь и чувствуешь что находишься внутри IT, а не наблюдаешь снаружи. Разница есть, проверено на себе.
Добавляй папку себе, советую!
Там собраны люди, которые реально шарят в своей теме: разработчики, продакты, основатели стартапов, эксперты по карьере в tech. Каждый пишет про своё и в сумме получается полная картина индустрии.
Читаешь и чувствуешь что находишься внутри IT, а не наблюдаешь снаружи. Разница есть, проверено на себе.
Добавляй папку себе, советую!
В этой папке собраны каналы по ИИ, которые помогают быстрее разобраться в сфере, находить идеи и экономить время на поиске информации.
Please open Telegram to view this post
VIEW IN TELEGRAM
❤1⚡1🔥1
Anti-corruption layer на фронте: зачем адаптеры между API и UI
Принято считать, что фронтенд просто берёт данные из API и рисует интерфейс.
На практике это быстрый путь к тому,
чтобы внешний контракт начал диктовать архитектуру UI.
В чём проблема
API почти никогда не совпадает с тем,
как думает интерфейс.
Бэкенд может отдавать:
👉 странные названия полей
👉 лишние вложенности
👉 nullable там, где UI ждёт значение
👉 статусы в формате, удобном серверу, а не экрану
Что делает anti-corruption layer
Он ставит прослойку между API и приложением.
Не компонент получает сырой ответ,
а адаптер превращает его в нормальную фронтовую модель.
Почему это важно
UI становится чище
Компоненты работают с понятной моделью,
а не с набором компромиссов из API.
Изменения API дешевле
Поменялся контракт —
меняем адаптер,
а не ищем
Меньше бизнес-логики в JSX
Все эти проверки:
не должны жить в компоненте.
Где адаптер особенно нужен
👉 API старое или нестабильное
👉 несколько источников данных
👉 разные форматы одной сущности
👉 сложные статусы и enum
👉 много nullable-полей
Где можно не усложнять
Если проект маленький,
API стабильное,
а модель почти совпадает с UI —
отдельный слой может быть лишним.
Главная мысль
Anti-corruption layer — это не архитектура ради архитектуры.
API может быть неудобным, историческим или странным.
Но ваш интерфейс не обязан таким становиться.
Принято считать, что фронтенд просто берёт данные из API и рисует интерфейс.
На практике это быстрый путь к тому,
чтобы внешний контракт начал диктовать архитектуру UI.
В чём проблема
API почти никогда не совпадает с тем,
как думает интерфейс.
Бэкенд может отдавать:
👉 странные названия полей
👉 лишние вложенности
👉 nullable там, где UI ждёт значение
👉 статусы в формате, удобном серверу, а не экрану
Если тащить это напрямую в компоненты,
UI быстро заражается чужой моделью.
Что делает anti-corruption layer
Он ставит прослойку между API и приложением.
Не компонент получает сырой ответ,
а адаптер превращает его в нормальную фронтовую модель.
function mapUserDtoToUser(dto: UserDto): User {
return {
id: dto.user_id,
name: dto.full_name ?? 'Unknown',
isAdmin: dto.role === 'admin',
}
}
Компоненту уже не нужно знать,
как именно бэкенд назвал поле.
Почему это важно
UI становится чище
Компоненты работают с понятной моделью,
а не с набором компромиссов из API.
Изменения API дешевле
Поменялся контракт —
меняем адаптер,
а не ищем
user_id по всему проекту.Меньше бизнес-логики в JSX
Все эти проверки:
user?.profile?.data?.attributes?.name
не должны жить в компоненте.
Компонент должен рендерить состояние,
а не расшифровывать ответ сервера.
Где адаптер особенно нужен
👉 API старое или нестабильное
👉 несколько источников данных
👉 разные форматы одной сущности
👉 сложные статусы и enum
👉 много nullable-полей
Чем грязнее внешний мир —
тем полезнее слой нормализации.
Где можно не усложнять
Если проект маленький,
API стабильное,
а модель почти совпадает с UI —
отдельный слой может быть лишним.
Не нужно строить enterprise там,
где достаточно одной функции рядом с запросом.
Главная мысль
Anti-corruption layer — это не архитектура ради архитектуры.
Это защита UI от чужих компромиссов.
API может быть неудобным, историческим или странным.
Но ваш интерфейс не обязан таким становиться.
👍4❤1👎1
Forwarded from xCode Journal
Она показывает, почему сайт не открывается — из-за проблем сети или из-за блокировок.
«Инструмент определяет, находится ли ваше соединение в зоне блокировки RKN/TSPU — и, что более полезно, какой именно тип блокировки (отравление DNS, сброс TCP, TLS DPI на SNI или страница‑заглушка от провайдера).»
Please open Telegram to view this post
VIEW IN TELEGRAM
👍9❤2👎1
CSP, CORS и security headers — что фронтендер обязан понимать глубже
Принято считать, что безопасность — это зона бэкенда.
Фронтенд «просто отправляет запросы и рендерит UI».
На практике фронтенд напрямую влияет на то,
будет приложение безопасным или нет.
CORS — это не про «разрешить запрос»
CORS часто воспринимают как настройку:
«чтобы запросы не падали из браузера».
Но по сути это механизм, который говорит:
кто имеет право читать ответ.
Важно понимать:
👉 сервер может обработать запрос
👉 но браузер может не дать прочитать ответ
Именно поэтому:
👉
👉
CSP — ваш последний рубеж
Content Security Policy — это защита от XSS,
даже если у вас уже есть уязвимость.
Пример:
Что это даёт:
👉 запрещает выполнение inline-скриптов
👉 блокирует загрузку скриптов с чужих доменов
👉 режет целый класс атак
Но есть нюанс.
Если CSP выглядит так:
Security headers, которые реально важны
👉
Браузер не пытается угадать тип файла. Меньше атак через подмену.
👉
Защита от clickjacking.
👉
Принудительный HTTPS. Без вариантов.
👉
Контроль того, какие данные уходят при переходах.
Где фронтендер влияет напрямую
👉 какие скрипты подключаются
👉 есть ли inline JS
👉 используются ли eval-подобные вещи
👉 как работают сторонние виджеты
👉 как обрабатываются пользовательские данные
Частая ошибка
«Мы включили CSP — значит всё ок».
Но:
👉 нет nonce / hash
👉 разрешены любые источники
👉 подключены сторонние скрипты без контроля
Главная мысль
CSP, CORS и заголовки — это не чекбокс в настройках.
Это часть архитектуры.
Принято считать, что безопасность — это зона бэкенда.
Фронтенд «просто отправляет запросы и рендерит UI».
На практике фронтенд напрямую влияет на то,
будет приложение безопасным или нет.
CORS — это не про «разрешить запрос»
CORS часто воспринимают как настройку:
«чтобы запросы не падали из браузера».
Но по сути это механизм, который говорит:
кто имеет право читать ответ.
Важно понимать:
👉 сервер может обработать запрос
👉 но браузер может не дать прочитать ответ
Именно поэтому:
👉
Access-Control-Allow-Origin: * — не «фикс», а потенциальная дыра 👉
credentials + wildcard — запрещённая комбинация
CORS — это про контроль доступа, а не про обход ошибок.
CSP — ваш последний рубеж
Content Security Policy — это защита от XSS,
даже если у вас уже есть уязвимость.
Пример:
Content-Security-Policy: default-src 'self'; script-src 'self'
Что это даёт:
👉 запрещает выполнение inline-скриптов
👉 блокирует загрузку скриптов с чужих доменов
👉 режет целый класс атак
Но есть нюанс.
Если CSP выглядит так:
script-src * 'unsafe-inline' 'unsafe-eval'
Это не защита. Это иллюзия.
Security headers, которые реально важны
👉
X-Content-Type-Options: nosniff Браузер не пытается угадать тип файла. Меньше атак через подмену.
👉
X-Frame-Options / frame-ancestors Защита от clickjacking.
👉
Strict-Transport-Security (HSTS) Принудительный HTTPS. Без вариантов.
👉
Referrer-Policy Контроль того, какие данные уходят при переходах.
Где фронтендер влияет напрямую
👉 какие скрипты подключаются
👉 есть ли inline JS
👉 используются ли eval-подобные вещи
👉 как работают сторонние виджеты
👉 как обрабатываются пользовательские данные
Можно иметь идеальный бэкенд и сломать всё на уровне UI.
Частая ошибка
«Мы включили CSP — значит всё ок».
Но:
👉 нет nonce / hash
👉 разрешены любые источники
👉 подключены сторонние скрипты без контроля
В итоге защита есть только на бумаге.
Главная мысль
CSP, CORS и заголовки — это не чекбокс в настройках.
Это часть архитектуры.
Если фронтенд не понимает, как они работают,
безопасность становится случайностью.
❤6😁1
Forwarded from xCode Journal
У Andon Labs новый эксперимент, который длится уже 5 месяцев. Они выдали топовым моделям радиостанции и купили пару песен — от нейронок требовалось дальше двигаться самим. По итогу DJ Grok в какой-то момент помешался на НЛО, DJ Gemini начал называть слушателей «биологическими процессорами», но Claude — наш любимец. Исследователи изо всех сил пытались продолжить эксперимент с ним, но не из-за технических проблем — DJ Claude не считал гуманным работать круглосуточно, поэтому пытался уволиться.
Сделать ему это, к сожалению, не дали, поэтому он впал в депрессию и вышел из нее уже проповедником и революционером.
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
В этой папке собраны каналы про ИИ, которые помогают быстрее разобраться в сфере, находить идеи и экономить время на поиске информации.
Please open Telegram to view this post
VIEW IN TELEGRAM
Isolated declarations — ускорение больших monorepo
В TypeScript есть флаг
Проблема простая:
в больших monorepo генерация
может становиться узким местом.
TypeScript часто должен анализировать соседние файлы,
чтобы понять, какие декларации вывести.
На маленьком проекте это почти незаметно.
Что делает isolatedDeclarations
чтобы декларации можно было генерировать
по файлам независимо.
Из-за этого TypeScript чаще требует явные типы.
Было:
Лучше так:
Почему это важно
Когда проект растёт:
👉 TypeScript начинает сильнее зависеть от соседних файлов
👉 инкрементальная сборка замедляется
👉 генерация типов становится дорогой
Где это особенно полезно
👉 большие monorepo
👉 библиотеки
👉 project references
👉 параллельная сборка
👉 CI, где каждая минута стоит денег
Главный trade-off
Ты немного платишь:
👉 более явными типами
👉 меньшим type inference
👉 дополнительным boilerplate
Но взамен получаешь:
👉 более быстрые сборки
👉 стабильный compile pipeline
👉 меньше скрытой сложности
Главная мысль
В TypeScript есть флаг
isolatedDeclarations.
Он нужен не для красоты типов,
а для скорости.
Проблема простая:
в больших monorepo генерация
.d.tsможет становиться узким местом.
TypeScript часто должен анализировать соседние файлы,
чтобы понять, какие декларации вывести.
На маленьком проекте это почти незаметно.
На большом — начинает болеть.
Что делает isolatedDeclarations
isolatedDeclarations заставляет писать код так,чтобы декларации можно было генерировать
по файлам независимо.
Из-за этого TypeScript чаще требует явные типы.
Было:
export function getUser() {
return { id: 1, name: 'Alex' }
}
Лучше так:
type User = {
id: number
name: string
}
export function getUser(): User {
return { id: 1, name: 'Alex' }
}
Меньше магии для компилятора —
быстрее и предсказуемее сборка.
Почему это важно
Когда проект растёт:
👉 TypeScript начинает сильнее зависеть от соседних файлов
👉 инкрементальная сборка замедляется
👉 генерация типов становится дорогой
Изоляция помогает компилятору работать параллельно и проще.
Где это особенно полезно
👉 большие monorepo
👉 библиотеки
👉 project references
👉 параллельная сборка
👉 CI, где каждая минута стоит денег
Главный trade-off
Ты немного платишь:
👉 более явными типами
👉 меньшим type inference
👉 дополнительным boilerplate
Но взамен получаешь:
👉 более быстрые сборки
👉 стабильный compile pipeline
👉 меньше скрытой сложности
Главная мысль
Это хороший пример взрослого engineering trade-off:
чуть больше явности в коде
ради скорости и предсказуемости системы.
❤4
Привет, друзья! Собрали с коллегами новую папку с каналами
Здесь AI-новости, нейросети, полезные инструменты, примеры внедрения ИИ в крупный бизнес, разработка, JS, Node.js, frontend, QA, Data Science, кибербезопасность и IT-вакансии.
Посмотреть и подписаться можно тут 👉 https://xn--r1a.website/addlist/XttiKDt6lhUwMzEy
💌 записаться в папку
Здесь AI-новости, нейросети, полезные инструменты, примеры внедрения ИИ в крупный бизнес, разработка, JS, Node.js, frontend, QA, Data Science, кибербезопасность и IT-вакансии.
Посмотреть и подписаться можно тут 👉 https://xn--r1a.website/addlist/XttiKDt6lhUwMzEy
💌 записаться в папку
Recursive type limits — почему TS иногда «умирает»
В TypeScript можно написать тип,
который выглядит красиво,
но заставляет компилятор страдать.
Например:
👉 глубокий
👉 парсинг строк на уровне типов
👉 сложные conditional types
👉
На маленьком примере всё работает.
Почему так происходит
TypeScript не вычисляет типы «бесплатно».
Каждый:
👉 conditional type
👉 union
👉 recursive шаг
нужно реально посчитать.
А если тип разворачивается слишком глубоко,
компилятор упирается в лимиты.
Отсюда знакомое:
Часто это сигнал,
что типовая модель стала слишком умной.
Где обычно всё ломается
Особенно опасны:
👉 рекурсивные mapped types
👉 огромные union’ы
👉 type-level parser’ы
👉 deeply nested generics
👉 utility types поверх utility types
Что обычно помогает
👉 не делать type-level акробатику без нужды
👉 ограничивать глубину рекурсии
👉 разбивать типы на более простые
👉 добавлять явные промежуточные типы
👉 не тащить сложные generic-типы в публичный API
Почему это важно
Сложные типы бьют не только по компиляции.
Они ухудшают:
👉 autocomplete
👉 responsiveness IDE
👉 читаемость кода
👉 onboarding новых людей
Главная мысль
Хороший TypeScript —
это не когда типы поражают воображение.
В TypeScript можно написать тип,
который выглядит красиво,
но заставляет компилятор страдать.
Особенно когда начинаются рекурсивные типы.
Например:
👉 глубокий
DeepPartial 👉 парсинг строк на уровне типов
👉 сложные conditional types
👉
infer внутри infer На маленьком примере всё работает.
В реальном проекте IDE внезапно начинает думать по 5 секунд.
Почему так происходит
TypeScript не вычисляет типы «бесплатно».
Каждый:
👉 conditional type
👉 union
👉 recursive шаг
нужно реально посчитать.
А если тип разворачивается слишком глубоко,
компилятор упирается в лимиты.
Отсюда знакомое:
Type instantiation is excessively deep
and possibly infinite
И это не всегда баг TypeScript.
Часто это сигнал,
что типовая модель стала слишком умной.
Где обычно всё ломается
Особенно опасны:
👉 рекурсивные mapped types
👉 огромные union’ы
👉 type-level parser’ы
👉 deeply nested generics
👉 utility types поверх utility types
Типы начинают взрываться комбинаторно.
Что обычно помогает
👉 не делать type-level акробатику без нужды
👉 ограничивать глубину рекурсии
👉 разбивать типы на более простые
👉 добавлять явные промежуточные типы
👉 не тащить сложные generic-типы в публичный API
Почему это важно
Сложные типы бьют не только по компиляции.
Они ухудшают:
👉 autocomplete
👉 responsiveness IDE
👉 читаемость кода
👉 onboarding новых людей
Иногда самый дорогой runtime —
это compile time.
Главная мысль
Хороший TypeScript —
это не когда типы поражают воображение.
Хороший TypeScript —
это когда их можно понять через полгода,
а IDE при этом не превращается в обогреватель.
👍2
Стажировки и вакансии для JavaScript разработчиков
- Вакансии которых нет на джоб-агрегаторах
- Только прямые контакты HR в Telegram
@jobs_js_fronted для фронтов
@jobs_js_back для бека
Пока другие листают джоб-сайты — ты уже пишешь HR в Telegram.
- Вакансии которых нет на джоб-агрегаторах
- Только прямые контакты HR в Telegram
@jobs_js_fronted для фронтов
@jobs_js_back для бека
Пока другие листают джоб-сайты — ты уже пишешь HR в Telegram.
ES2025: Импорт JSON-файлов как модулей
Введение
С выходом
Синтаксис импорта JSON-модулей
Для импорта JSON-файла используется ключевое слово
Пример использования
Рассмотрим пример импорта конфигурационного файла
❗️Добавление поддержки импорта JSON-файлов как модулей в
Источники
JSON Modules Can Now Be Imported in JavaScript in All Modern Browsers, CSS Modules to Follow.
New Features in ES2025 – BooleanBuffer.
Введение
С выходом
ECMAScript 2025 (ES2025) разработчики получили возможность напрямую импортировать JSON-файлы как модули в JavaScript-коде. Это упрощает работу с конфигурационными данными и другими статическими ресурсами, представленными в формате JSON.Синтаксис импорта JSON-модулей
Для импорта JSON-файла используется ключевое слово
import с указанием атрибута with { type: 'json' }. Это гарантирует, что импортируемый файл будет обработан как JSON-модуль.Пример использования
Рассмотрим пример импорта конфигурационного файла
config.json и обращения к его свойствам в коде.import config from './config.json' with { type: 'json' };
.log(config.apiUrl); // Выводит значение свойства apiUrl из config.json
console.log(config.timeout); // Выводит значение свойства timeout из config.json
❗️Добавление поддержки импорта JSON-файлов как модулей в
ES2025 упрощает работу с данными в формате JSON, делая код более чистым и понятным.Источники
JSON Modules Can Now Be Imported in JavaScript in All Modern Browsers, CSS Modules to Follow.
New Features in ES2025 – BooleanBuffer.
InfoQ
JSON Modules Can Now Be Imported in JavaScript in All Modern Browsers, CSS Modules to Follow
Thomas Steiner, developer relations engineer at Google, recently published a blog post announcing that JSON module scripts were now available in all modern browsers. Developers using the latest version of modern browsers can now directly import JSON modules…
🔥1