alexgriss.tech – Telegram
alexgriss.tech
1.25K subscribers
27 photos
5 videos
63 links
Я — Александр Григоренко, фронтенд-архитектор и продуктовый инженер.

Пишу о зрелом инженерном мышлении, лидерстве, архитектуре и продуктовой разработке, создаю образовательный проект Web Audio Lab.

Сайт: https://alexgriss.tech
ТГ: @astroscientist
Download Telegram
Как я стал официальным переводчиком книги издательства O'Reilly про Web Audio API

Хочу поделиться своим необычным достижением: я стал официальным переводчиком книги издательства O’Reilly. Я перевёл на русский язык книгу Бориса Смуся Web Audio API (O’Reilly, 2013). В процессе работы над собственным образовательным проектом, я начал изучать API и наткнулся на эту книгу на английском языке. Сначала я просто её конспектировал, но полезной информации было так много, что постепенно мои конспекты превратились в полноценный перевод. Тогда у меня появилось желание довести работу до конца — чтобы у русскоязычных разработчиков тоже был доступ к этим знаниям.

Когда перевод был готов, я написал автору на электронную почту. Оказывается, Борис знал русский язык, более того, он родился в Ленинграде и эмигрировал в Канаду в детском возрасте, поэтому он был польщён моим письмом и любезно согласился прочитать мой перевод. Он поддержал идею и связал меня с Хелен Монро, Head of Rights издательства O'Reilly. Вместе с ней мы согласовали все детали, и я получил официальное разрешение на публикацию перевода под лицензией CC BY-NC-ND.

Более подробно эту историю можно прочитать в моём анонсе книги на Хабре: https://habr.com/ru/articles/946754/

Эта книга не просто творчество веб-энтузиаста, а практически официальное издание от создателей спецификации API. Автор книги Борис Смусь в те годы работал в Chrome на позиции ведущего DevRel-инженера. Книга была написана при непосредственном участии Криса Роджерса — создателя Web Audio API и главного разработчика его реализации в WebKit/Chrome. Книга объясняет устройство звука и его цифровую обработку на JavaScript. Несмотря на то что она вышла 12 лет назад, теоретическая часть не устарела и остаётся ценнейшим источником знаний.

Теперь перевод доступен свободно и легально:

👉 Читать книгу

Оригинал книги доступен по адресу webaudioapi.com, там же можно найти примеры кода из книги. На сайте также будет размещена ссылка на мой перевод.

Если вы обнаружите неточности или ошибки в переводе — пишите мне на адрес dev@alexgriss.tech.



⚡️ Кроме того, я продолжаю разрабатывать проект Web Audio Lab — интерактивную платформу для изучения Web Audio API и синтеза звука. Я запустил лендинг, на котором вы можете оставить свою электронную почту, чтобы быть в курсе обновлений: webaudiolab.com.

Желаю вам приятного чтения и погружения в глубокую и захватывающую тему цифровой обработки звука на JavaScript!
Please open Telegram to view this post
VIEW IN TELEGRAM
1🔥2710👏9👍1
Почему нейросети заменят программистов, но не смогут заменить разработчиков

Недавно я попросил Cursor навайбкодить лендинг для webaudiolab.com. Я специально сформулировал краткий запрос, чтобы увидеть, как он справится с неполной постановкой задачи: сделай одностраничный лендинг с простой формой email-подписки в самом центре страницы на фоне анимированной визуализации воспроизведения музыки.

Агент ничего не уточнил и сразу же начал выполнять работу: составил план разработки, развернул проект на Vite + React и через три минуты выдал результат. В нижнем правом углу страницы располагался еле заметный блок с маленькими пляшущими прямоугольниками, а в центре торчал огромный заголовок с текстом «Музыка играет!» (круто, спасибо!). Форма подписки была сделана нормально, но почему-то лежала на стеклянной скевоморфной подложке, хотя такого требования не было.

Представьте, что к вам пришёл менеджер с такой задачей. Сначала вы бы запросили дизайн и чёткое ТЗ, а затем провели бы следующие несколько часов (или дней) в согласовании деталей, прежде чем приступить к реализации. В этом и есть принципиальное отличие между разработчиком и ИИ. ИИ подходит к решению задачи формально и не задаёт «лишних» вопросов, тогда как ответственный разработчик сразу замечает неопределённость и пытается ей управлять. Разработчик сформулирует ограничения и критерии успеха, уточнит неизвестные, примет необходимые технические решения и связанные с ними риски и только после этого начнёт кодить.

Чтобы добиться желаемого результата от Cursor, мне пришлось взять ответственность на себя: сначала решить задачу в голове, затем расписать детали и на каждом шаге направлять ИИ в нужную сторону. Сам он так и не додумался использовать Web Audio API для анализа и визуализации звука, а всё время пытался сэмулировать работу аудиоанализатора, дойдя до самописной реализации быстрого преобразования Фурье. Лишь после того как я задал чёткие рамки и ограничения, агент стал реально полезным.

В около-tech сообществе не стихают апокалиптические настроения о том, что ИИ якобы заменит программистов и лишит их работы. Ну, может, программистов и заменит, но не разработчиков. ИИ хорош в написании кода и следовании чётким инструкциям, однако он не умеет учитывать последствия своих решений. Его главная задача — выдавать эффективные и правдоподобные ответы на запросы пользователя. У ИИ нет мотивации отвечать за результат, потому что он не несёт ответственность за свои ошибки: его нельзя уволить или понизить в должности.

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



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

Формулирование задачи: в чём состоит, зачем нужна задача, что изменится после её выполнения?

Что есть сейчас: текущее состояние системы, как сейчас работает то, что нужно изменить?

Критерии готовности (definition of done): как понять, что задача решена и решена правильно?

Контекст: где и как будет использоваться результат?

Ограничения: какой должен быть стек, дизайн, есть ли особые требования к производительности, поддержке, деплою?

Out of scope: что точно не входит в задачу?

Неизвестные: что требует уточнения до начала работы?
Please open Telegram to view this post
VIEW IN TELEGRAM
👍127🔥6🆒3👌1
Хочу делиться историей разработки своего проекта Web Audio Lab, который я создаю, чтобы помогать другим разработчикам освоить Web Audio API и основы цифрового звука через практику и эксперименты. Это будет интерактивная платформа для обучения креативному программированию.

Идея проекта выросла из моего личного интереса: мне хотелось не только слушать чужую музыку, но и научиться создавать свою. Поэтому я давно экспериментирую с программами вроде Logic Pro или Ableton, которые называются секвенсорами или DAW (digital audio workstation). Работа в них очень похожа на разработку: ты управляешь чем-то технически сложным, но при этом находишься в творческом процессе и сразу же видишь, а точнее слышишь результат. Однако порог входа в DAW довольно высок. Тебе нужно освоить не только сложный интерфейс самой программы, но и теорию цифрового звука, синтеза, обработки, разобраться в плагинах, а ещё понимать музыкальную теорию и законы музыкального жанра, в котором ты хочешь работать. Поэтому создание музыки — это безусловно творческая задача, но настолько многослойная и требовательная, что далеко не каждому хватает мотивации пройти этот путь.

Когда в 2011 году появился стандарт Web Audio API, я сразу увидел в нём огромный потенциал для обучения этим сложным вещам. От первых демо от команды Google Chrome было ощущение чистой магии: в браузере можно было поиграть на виртуальном пианино, запустить визуализатор как в Windows Media Player (олды помнят), собрать драм-машину — прямо как в больших настольных DAW. Главное отличие и преимущество для меня заключалось в том, что я мог через код заглянуть во внутренности того, как устроена работа со звуком, а не просто тыкать в кнопки в интерфейсе программы.

Кстати, эти демки всё ещё доступны в интернете и до сих пор производят впечатление: https://googlechromelabs.github.io/web-audio-samples/.


Выше я упоминал плагины для DAW — это такие надстройки над основной программой, которые способны довольно сильно расширять её функционал. Большая их часть пишется на JUCE, фреймворке на C++, ставшем стандартом в индустрии. Это тоже программирование, но куда более требовательное, чем в Web Audio API. Здесь нужно знать много сложной математики, DSP-алгоритмы (digital sound processing) и учитывать низкоуровневые детали языка C++. Поэтому каждый такой плагин — это результат большого инженерного и творческого труда целых команд разработчиков, а их цена часто сопоставима со стоимостью самой DAW.

Web Audio API демократизирует разработку, делая доступным то, что раньше требовало специализированных знаний и софта: теперь сложную обработку звука можно программировать прямо в браузере, на привычном JavaScript. Но за всё время существования у стандарта так и не появилось полноценной образовательной среды. За почти 15 лет вышло всего пара книг, отдельные туториалы и множество разрозненных статей. Но цельного, современного и практического курса до сих пор нет.

Недавно я сделал перевод книги издательства O'Reilly про Web Audio API, который доступен на моём сайте: https://alexgriss.tech/web-audio-api-book.


Именно таким я задумал свой проект Web Audio Lab. Это будет интерактивная платформа, где соединяются разные форматы обучения: текст, звук, интерактив, программирование и геймификация. Современные технологии позволяют строить такие «интегративные» продукты, где обучение работает сразу на нескольких уровнях восприятия. В итоге я разрабатываю пространство для экспериментов со звуком и креативного программирования. Периодически я буду рассказывать о том, как развивается мой проект, делиться техническими деталями разработки. Для меня важно делиться этим с комьюнити, рассказывать о процессе создания продукта, о технических и продуктовых решениях.



Если вы тоже работаете над своими пет-проектами, расскажите о них в комментариях. Хочется узнать, какие идеи вы воплощаете и что для вас самое важное в этом процессе.
Please open Telegram to view this post
VIEW IN TELEGRAM
8🔥6👍4👏1
Ну что же, я собрал минимально рабочую версию Web Audio Lab и хочу поделиться результатами. Напомню, что это мой образовательный проект для изучения Web Audio API и принципов работы с цифровым звуком прямо в браузере.

Концепция Web Audio Lab вдохновлена Codecademy, только вместо обычной консоли код визуализируется на канвасе в виде аудиографа. В центре интерфейса три ресайзбл панели, каждая из которых позволяет изучить тему со своего угла. Слева — теория с текстами уроков, интерактивными виджетами и описаниями практических заданий. В центре — редактор кода. Если код выполнен успешно, то на канвасе в правой панели отрисуется аудиограф, который был запрограммирован в коде. Так студент учится не просто писать код, а видеть и слышать, как он превращается в звук.

📚 Уроки

Тексты уроков хранятся в MDX-файлах — это продвинутый markdown с возможностью встраивания React-компонентов. Они помогают обогатить процесс изучения теории через визуализации и интерактивные виджеты. У каждого урока есть список заданий, которые проверяются автоматически после выполнения кода.

🖼️ Код

Редактор кода построен на библиотеке CodeMirror 6 с кастомной тёмной темой и подсветкой синтаксиса. Код можно отформатировать через Prettier, который установлен как обычная зависимость и не блокирует UI-поток при исполнении. По нажатию на Run code весь код студента отправляется в iframe-песочницу, где он выполняется в безопасном окружении — без доступа к DOM, сети и системным API, что делает окружение безопасным и предсказуемым.

🧩 Песочница

Здесь происходит самое интересное. Код в песочницу передаётся с помощью Broadcast Channel API вместе с правилами проверки. Внутри iframe создаётся специально пропатченный AudioContext, который перехватывает вызовы всех методов в коде студента и строит из этих вызовов модель аудиографа. Каждый вызов ctx.createOscillator() или osc.connect(gain) фиксируется как узел или связь между узлами. Также система записывает для каждого узла заданные в коде параметры, например, osc.frequency.value = 440. Таким образом, песочница формирует полное описание аудиографа, которое потом визуализируется на канвасе.

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

Если всё успешно — песочница отправляет сообщение обратно в основное приложение всё через тот же канал Broadcast Channel API, урок отмечается как выполненный, а канвас показывает собранный граф.

🎛 Канвас

Для визуализации аудиографа используется React Flow — библиотека для отображения схем на бесконечном канвасе. Каждый узел — это отдельный модуль обработки или визуализации звука: осциллятор, усилитель, фильтры и т.д. В рамках процесса обучения граф нельзя менять вручную на канвасе, можно только управлять воспроизведением. Менять граф можно только через изменения в коде и повторную генерацию графа.

⚙️ Технологический стек

Vite + SWC + TS + React — стабильная и быстрая сборка и современная архитектура.
Vanilla Extract + vanilla-sugar — моя собственная UI-библиотека, о которой я писал выше, VE показывает себя отлично.
Zustand — простая, модульная модель состояния: для редактора, уроков и визуализации графа. Процессы в приложении довольно тяжёлые и медленные и не требуют гранулярной реактивности, поэтому zustand оказался оптимальным выбором для управления состоянием.

🚀 Что дальше

Сейчас базовая связка теория -> практика -> проверка -> визуализация работает стабильно. Следующий шаг — разработка учебной программы, написание уроков и добавление деталей к существующим решениям. Когда первый модуль будет готов, я выложу демо-версию, чтобы можно было попробовать вживую, поэтому обязательно следите за обновлениями в канале!

Если интересно, напишите, какую часть проекта хотелось бы разобрать подробнее.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍15🔥7👏32
Привет всем новым и старым читателям канала! 👋
Решил обновить закреп, чтобы вам было проще узнать обо мне и найти ключевые посты.

Я — Александр Григоренко, фронтенд-архитектор и продуктовый инженер, в профессии больше 13-ти лет. За это время успел поработать в разных проектах — от небольших западных стартапов до крупного российского бигтеха.

Для меня веб-разработка — это творческая профессия, в которой соединяются технологии, архитектура, эстетика, а также продуктовое и бизнес-мышление. Мне интересно всё, что делает разработку осознанной: инженерная культура, лидерство, карьерное планирование, ценности и личная философия. Я часто поднимаю эти темы у себя в канале.

🧑🏻‍💻 Самые важные посты о профессии, которые помогут лучше узнать мой подход:

Про мой взгляд на фронтенд-разработку и профессиональные ценности
• 5 выводов о разработке проекта с нуля: часть 1, часть 2
Подготовка к разработке с нуля и проектирование архитектуры
• Фронтенд-психология: почему UX-законы важны не только для дизайнеров: часть 1, часть 2
Как правильно и осознанно уйти из проекта
Почему я отказался внедрять тёмные паттерны и не получил оффер на фронтенд-лида
Как я пришёл к цифровому минимализму и приручил хаос
Главный принцип лидерства, которого нет в Амазоне

⚙️ Технические статьи:

CSS-in-JS умер — да здравствует CSS-in-JS!
Vanilla Extract — высокая кухня в мире стилизации
Как построить свою UI-библиотеку на базе Vanilla Extract
Как я стал официальным переводчиком книги издательства O'Reilly про Web Audio API

🎛 Ещё я создаю образовательную платформу Web Audio Lab для изучения Web Audio API и основ цифровой обработки звука. Я делаю этот проект с нуля и делюсь процессом у себя в канале.

Также я пишу лонгриды у себя на сайте и на Хабре.

Если у вас есть какие-либо вопросы — вы можете оставить их в комментариях или написать мне лично.
Please open Telegram to view this post
VIEW IN TELEGRAM
10👍6🔥4🤝21
Главный принцип лидерства, которого нет в Амазоне

Возможно, вы уже читали пост-откровение Дмитрия Свиридкина про уход из Amazon: https://nekrolm.github.io/blog.html. Если вкратце, Дмитрий рассказывает о хроническом стрессе, который за три года работы привёл его к выгоранию и психосоматическим проблемам. Стресс был связан с переработками и попытками соответствовать принципам лидерства Amazon. Но, как мне кажется, автор мог сам долгое время не замечать, как движется к выгоранию, пытаясь подняться по карьерной лестнице.

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


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

Я тоже столкнулся с выгоранием в начале карьеры, потому что хотел делать больше, круче и быстрее, чем реально мог себе позволить. Тогда у меня не было карьерной стратегии, я не думал о work-life balance, я просто хотел скакать по грейдам и увеличивать цифры зарплаты, взваливая на себя всё больше задач и ответственности. Я хотел соответствовать образу идеального айтишника, который меняет мир к лучшему за 300к в наносекунду.

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

Я вижу решение в том, чтобы начать задавать себе сложные, но важные вопросы. Нравится ли мне то, что я делаю? Приносит ли мой продукт кому-то реальную пользу, делает ли он чью-то жизнь хоть немного лучше или комфортнее? Согласен ли я со своим руководством в самых важных вопросах? Хорошо ли ко мне относятся на работе? Чего я хочу от своей карьеры через 5, 10, 15 лет? Что в моей жизни есть кроме работы?

Я бы дополнил принципы лидерства Амазона самым важным принципом, который вывели ещё древние греки: познай самого себя. Нельзя заставить себя быть лидером, просто повторяя корпоративные лозунги, не понимая собственных мотивов и ценностей.
👍176🔥42
Иерархия потребностей проекта

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

Согласно Маслоу, у человека не могут появиться более сложные потребности, пока не удовлетворены базовые. Проще говоря, только сытый человек может начать задумываться о саморазвитии. На практике, конечно, всё устроено сложнее: мы почти всегда ощущаем весь спектр потребностей одновременно. Вопрос не в том, какие потребности у нас есть, а как именно мы расставляем приоритеты. Ведь часто мы начинаем с более возвышенных — просто потому, что они приятнее или привычнее. Поэтому в обществе так много нищих поэтов и бизнесменов с хроническими заболеваниями.

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

Маслоу выделял следующие уровни потребностей (от низших к высшим):

• Физиологические потребности
• Потребности в безопасности
• Социальные потребности
• Потребность в уважении и признании
• Потребность в самореализации, эстетике, духовном развитии

На мой взгляд, эта модель универсальна. Её можно применить не только к человеку, но и к любой развивающейся системе: к компании, команде, проекту и даже к кодовой базе. У любой системы есть свои «физиологические» и «духовные» уровни, и она начнёт ломаться и рушиться, если постоянно путать их местами.

Так как мой канал о разработке, я хочу сфокусироваться именно на том, какие потребности есть у разработки и бизнеса относительно кодовой базы проекта — чтобы тот развивался предсказуемо и стабильно. Итак, уровни потребностей проекта:

⚙️ Код работает, проект запускается

Код должен работать — он может быть абсолютно ужасным, но должен запускаться и решать задачу. Его можно разрабатывать: дев-сборка не падает, настроен git-репозиторий и минимальный CI/CD. Этого вполне достаточно, чтобы протестировать идею.

🛡 Код не разваливается при изменениях

На этом уровне начинает появляться предсказуемость. В проекте настроен линтинг, форматтер, прекоммит-хуки, CI может отловить критичные ошибки. Есть простая архитектура и понятные границы ответственности. Если что-то ломается — это можно быстро откатить и починить. Самые базовые сценарии покрыты тестами и отлажены.

🤝 Над кодом может полноценно работать команда

Это уже зрелый уровень проекта, у которого есть кодстайл, сложились архитектурные и технические соглашения, работает code review. Процессы git и релизов полностью налажены. Есть культура принятия решений, ведения документации, онбординга. Команда умеет договориваться, есть чёткое разделение ответственности.

🏆 Код вызывает уважение и гордость команды

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

🌱 Код вдохновляет других

На этом уровне код не просто живёт в рамках одного продукта, он начинает влиять на другие команды. Лучшие решения выходит за рамки проекта, демонстрируются на конференциях, в статьях, становятся частью open source. Работа становится творчеством, поощряются эксперименты. В решениях ценится не только польза, но и их эстетическая сторона.



В любом деле важно соблюдать иерархию потребностей. Необходимо сначала построить прочный фундамент и следить за его устойчивостью, чтобы система могла стабильно развиваться. Тогда красота, инновации и удовольствие перестают быть случайностью и становятся закономерностью.
Please open Telegram to view this post
VIEW IN TELEGRAM
7👍5🔥4🆒2
Хочу поделиться с вами тем, над чем я усиленно работал последний месяц.

Я уже рассказывал, что разрабатываю Web Audio Lab — интерактивную образовательную платформу для изучения Web Audio API и принципов обработки и синтеза цифрового звука. В этом проекте я впервые столкнулся с задачей изолированного исполнения кода, который в Web Audio Lab пишется в отдельной панели со встроенным редактором. Задача оказалась очень глубокой и интересной, и я понял, что хочу разобраться в вопросе досконально, чтобы сделать всё по уму.

В результате моих исследований и экспериментов появилась большая обзорная статья — Руководство по архитектуре браузерных песочниц: как работает изоляция JavaScript-кода.

Эта статья — моя попытка систематизировать все существующие архитектурные подходы к изоляции кода в JavaScript, в первую очередь внутри браузера. Из статьи вы узнаете очень много про внутренности JavaScript и браузерных движков, про классические и не очень подходы к созданию песочниц, про новые пропозалы в стандарт ECMAScript, про виртуализацию Node.js-окружений и про многое-многое другое.

Статья доступна на Хабре: https://habr.com/ru/articles/965830

И на моём сайте: https://alexgriss.tech/blog/javanoscript-sandboxes

Желаю приятного чтения и погружения в тему! Буду рад вашим комментариям и вопросам, а особенно буду благодарен, если вы поставите плюсики на Хабре и поможете этой статье выйти в топы!
1🔥19👏74👍3
Когда я только начинал писать свою статью про песочницы, я и не думал, к чему это всё придёт и в какое повествование выстроится. Хочу рассказать о процессе и о том, как моя статья превратилась из обзора существующих подходов в целое инженерное расследование.

В статье я уделяю целую главу теме изоляции глобального объекта от пользовательского кода, который выполняется в песочнице. Если честно, я рассчитывал, что просто покажу, что в JavaScript невозможно изолировать глобальный объект, я даже заранее выбрал название для главы про это: «Как изолировать глобальный объект и почему он всё равно протечёт». Дальше в моей голове логика статьи складывалась просто — вот почему надо запускать код только в <iframe> или воркерах, вот как это делать, всем спасибо, до свидания.

Я уверенно открыл Cursor, набросал базовую реализацию песочницы на основе Function() и стал экспериментировать. Идея заключалась в том, чтобы, применив все возможные хаки, в итоге локализовать утечку или несколько утечек, которой может воспользоваться опасный код. Если внутри песочницы есть доступ до глобала, то через него можно натворить немало бед: например, дёргать какие угодно методы бэка, подменив интерфейс функции fetch. Я хотел найти эти утечки и показать их в статье как железобетонный аргумент в пользу песочниц на основе <iframe>. Однако чем больше лазеек мне удавалось закрыть, тем сильнее таяла моя уверенность, что хотя бы одна останется незакрытой.

Вообще, JavaScript — прекрасный язык, потому что мало какой другой содержит столько подводных камней и неочевидных приколов. Я не говорю уж про совсем известные всем выкрутасы языка, связанные с приведением типов и [object Object], но как вам, например, это?


console.log(true.constructor.constructor("return this")());


Или это?


console.log(function*() {}.constructor("return this")().next().value);


Обе эти строчки вернут window, и очевидно, что лучше не давать никому возможности выполнять этот код в eval() или Function().

JavaScript прекрасен ещё и тем, что на каждый выкрутас у него есть выкрутас ответный. Конкретно для этих примеров ответный выкрутас состоит в том, чтобы обнулить конструкторы для всех примитивов и функций через Object.defineProperty() во всём приложении. Да, в теории это может поломать что-то другое, но такова цена изоляции.

Важно ещё то, что если бы я не закопался в этот вопрос, я бы так и не узнал про существование Realms — сущности из спеки ECMAScript, в которой и живёт глобальный объект со всеми стандартными объектами языка. Не осознал бы, что <iframe> и воркеры дают нужную изоляцию именно потому, что создают для себя новые Realms и совершенно независимый глобальный объект. Не обнаружил бы целую вселенную альтернативных подходов к изоляции внутри одного Realm вроде Secure ECMAScript, на основе которых работают даже устройства для умного дома, и которым я уделил целую главу в своей статье. А ещё не понял бы, что эти альтернативные подходы по сути делают то же самое, что делал я, пытаясь изолировать глобальный объект, но делают это профессионально и даже вплоть до организации proposals в стандарт языка.

В общем, этот процесс был очень увлекательным и познавательным и ещё сильнее влюбил меня в JavaScript, в котором постоянно можно открывать что-то новое, даже если кажется, что уже всё понятно и исследовано.

Поэтому ещё раз приглашаю вас прочитать мою статью про песочницы, я постарался передать в ней этот дух инженерных приключений :)



Наверняка у вас тоже были какие-то неожиданные открытия, связанные с языком, фреймворком или любимой технологией, поделитесь в комментариях.
Please open Telegram to view this post
VIEW IN TELEGRAM
9🔥9👏5
Креативное программирование и современные методики обучения

В последние дни я полностью переключился на создание контента уроков для Web Audio Lab. В процессе я понял важную вещь: я не хочу делать традиционный академический курс. Такой формат повышает порог входа и утомляет — особенно разработчиков, которым и так постоянно приходится переваривать кучу теории. Формат учебника не передаёт атмосферу исследования, игры и экспериментов. А в моём проекте именно эксперимент — главный элемент и метод обучения.

Чтобы нащупать подходящую методику обучения, я начал искать примеры того, как другие разработчики строят образовательные курсы и подходы. И здесь меня сильно затянуло в мир creative coding — направления в веб-разработке, где JavaScript используется как платформа для творческих экспериментов и наглядного изучения научных идей.

Самая дружелюбная точка входа в creative coding — это библиотека p5.js. Она позволяет даже новичкам в программировании очень быстро начать воплощать свои визуальные или звуковые идеи. Вокруг p5 выросло тёплое сообщество художников-инженеров, которые создают визуализации, генеративную музыку и графику, программируют игры, а также моделируют физические явления и процессы прямо на JS. Для примера: интерактивная визуализация генерации ландшафта на p5.

Ещё больше примеров из мира 🖼️ — здесь: https://editor.p5js.org/p5/sketches.


Если соединить доступность и наглядность p5.js и академическую глубину, может получиться такой проект как The Nature of Code. Это интерактивная книга Даниэля Шиффмана, в которой доступно разобраны сложные физические феномены и процессы: случайность, фракталы, частицы и даже клеточные автоматы, генетические алгоритмы и нейронные сети — всё это подаётся не просто в виде формул и теоретических выкладок, а через визуализацию и примеры кода на p5, позволяющих симулировать эти феномены и процессы. Очень советую познакомиться с этой книгой.

В Web Audio Lab я хочу сделать что-то похожее по духу, но с бОльшим упором на непосредственно программирование. Мне важно объяснять принципы работы со звуком не абстрактно, а через живой опыт: когда звук можно буквально потрогать, поменять, увидеть и услышать разницу. Так, чтобы теорию можно было подтвердить экспериментами в одном и том же бесшовном учебном пространстве. Пока что я продолжаю исследования и проектирую идеальный формат для Web Audio Lab, буду писать здесь о своих открытиях.
Please open Telegram to view this post
VIEW IN TELEGRAM
6🔥4👍22
Сегодня с большим удовольствием залипал на Spotify Wrapped — это интерактивная статистика по итогам всех прослушиваний музыкальных треков за год в приложении. В этом году он особенно круто сделан с точки зрения визуала и залипательности.

Музыка — это моя главная страсть наряду с программированием. Я слушаю очень много музыки в течение дня, и во время работы тоже. Поэтому мне хочется поделиться этой своей стороной жизни в канале. Тем более проект Web Audio Lab, о котором я много рассказываю, напрямую связан со звуком, так что это будет в тему :) В этом году я много слушал шугейз, блэкгейз и похожие жанры — это шумная, текстурная музыка, которая отлично помогает мне держать фокус.

Давайте познакомимся поближе? Поделитесь в комментах своими музыкальными итогами года — из Spotify, Яндекс Музыки или чем вы ещё пользуетесь, интересно посмотреть, что вы слушали в этом году 👇
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
7👍3🔥3
Media is too big
VIEW IN TELEGRAM
Хочу поделиться одним хобби-проектом, который я навайбкодил на прошедшей неделе. Это каталогизатор музыкальных альбомов, в котором я теперь собираю цифровую коллекцию своих самых любимых пластинок.

Я слушаю музыку альбомами и воспринимаю именно музыкальный альбом как отдельное произведение искусства. Альбом — это не только набор треков, но и обложка, которая сама по себе может быть артом, это то, как оформлен физический носитель, это некая концепция, которая стоит за всей работой. Я бы хотел иметь физическую коллекцию винила, но в последнее время я часто переезжаю и возить её за собой было бы накладно, а коллекционировать музыку альбомами хочется.


Поэтому я создал Vinilyst — декстопный оффлайн-каталогизатор. Мне было лениво кодить всё руками, и я решил выступить в этом проекте больше как лид, продуктовый менеджер и архитектор, а разработку делегировать Cursor. Получилось очень даже неплохо, хоть и не без моего вмешательства в код в некоторых особенно заковыристых местах.

Раз кодил курсор, я сосредоточился на выборе стека и промптах. В плане технологий я смог попробовать кое-что новое для себя, например, Tauri — фреймворк для запуска веб-приложений на декстопе. В отличие от Electron он не тащит целый браузер в бандл, а использует встроенный в ОС WebView, поэтому и размер приложения меньше, и расход оперативной памяти ниже. Также я попробовал Dexie — очень удобную обёртку над IndexedDB, которая скрывает все странности нативного стандарта.

Формулировать промпты мне помогал ChatGPT, я же просто задал структуру, в которой они должны быть прописаны и дальше генерировал из своих продуктовых идей готовые инструкции для модели. Получился такой полуавтоматический конвейер: я вайблю в чатике с ChatGPT → ChatGPT формализует мои идеи в инструкции для Cursor → Cursor кодит через Opus 4.5.

Я на 100 процентов доволен этим опытом и тем, что получилось. Это было чисто продуктовое творчество без особых инженерных потугов и позволило мне отдохнуть от кодерской рутины и получить массу удовольствия от процесса. Понятно, что большую часть кода писал Cursor и проект завайблен на 95%. Поэтому я не рассматриваю его как часть своего портфолио и не стал бы выпускать его как публичный продукт. Как минимум потому, что я не смогу гарантировать стабильность его работы. Но я точно могу порекомендовать такой формат разработки для личного удовольствия, экспериментов и поддержания творческого тонуса.
11👍7🔥6
Про когнитивное трение и заметки в один клик

В последнее время меня раздражает не столько отсутствие инструментов, сколько их избыток и переусложнённость. В эпоху супер-аппов и постоянно меняющихся интерфейсов особенно не хватает надёжных простых приложений, которые делают ровно то, что от них ждёшь. Даже на банальные действия приходится тратить лишние когнитивные усилия. По отдельности они почти незаметны, но за день их накапливается слишком много.

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

Мой идеальный UX для заметочника предельно прост. Он позволяет записать мысль буквально в один клик, без выбора режимов, без подготовки, без необходимости думать о заголовках и форматировании. На рабочем столе должна быть одна кнопка, тап по которой сразу открывает экран ввода с автофокусом и включённой клавиатурой. Такой UX предполагает минимум трений и раздумий, но на практике ни одно из популярных приложений под это не заточено.

Возьмём, например, Google Keep — стандартный заметочник для Android. У меня телефон Pixel 10 и раньше я активно пользовался Keep: выносил виджет на рабочий стол и... терпел кучу неудобств и лишних микродействий. Нужный мне виджет с предпросмотром последних заметок — это громоздкая бандура размером 4×3 клетки, которая занимает полэкрана. Из-за этого виджет приходится выносить на отдельный рабочий стол и каждый раз делать лишний свайп. Плюс на виджете ещё четыре кнопки, которые мне не нужны: для создания списков, аудио, рисунков и фото. На экране редактора нет автофокуса в поле ввода, а самих полей два — для заголовка и текста. Когда я где-то на ходу выгружаю мысль из головы, последнее, что мне нужно — это придумывать для неё заголовок. В Apple Notes, кстати, это сделано ещё тупее: автофокус сразу стоит в заголовке, и любой текст вводится огромным шрифтом.

В какой-то момент я понял, что не хочу мириться с тем, что такое простое действие требует столько внимания. Я решил оптимизировать этот процесс и сделать своё приложение, продумав UX так, чтобы ни одно действие не ощущалось лишним, а когнитивная нагрузка была ровно такой, какой ожидаешь интуитивно.

В итоге я разработал Instant Notes — тщательно продуманное приложение для быстрых текстовых заметок. В нём два виджета: кнопка 1×1 для мгновенного перехода к созданию заметки и блок 1×3 с кнопкой и двумя последними записями. Один тап — и вы сразу в поле ввода с открытой клавиатурой. Никаких заголовков, просто текст с одним важным удобством: списки, начатые с дефиса, автоматически продолжаются по Enter. Заметки сохраняются по мере ввода, поэтому можно не переживать, что что-то потеряется. Можно сохранять заметки и из других приложений, например, пошарить ссылку из браузера. Я также добавил экспорт и импорт заметок в JSON, чтобы не потерять их при переезде на другое устройство. Приложение написано на нативном Android-стеке — Kotlin + Jetpack Compose, с минимумом магии и максимумом предсказуемости, в духе самого UX.

Я сознательно оставил в Instant Notes только один сценарий — быстро выгрузить мысль из головы в текст. Я пользуюсь приложением уже неделю и вижу, насколько реально уменьшилось раздражение от, казалось бы, такой мелочи.

.apk для установки я оставил в первом комментарии. Если заметите странности в работе приложения, напишите, пожалуйста, что именно сломалось и как это воспроизвести.


Мораль: простые задачи не должны требовать повышенного внимания пользователя. Если инструмент постоянно раздражает, значит он плохо спроектирован и не заточен под решение конкретной задачи. Обратите внимание, где именно возникают микротрения в приложениях, над которыми вы работаете — чаще всего именно там и скрываются самые очевидные улучшения.
2🔥95👍52
Закрытая группа для создателей проектов

Я уже рассказывал в канале, что разрабатываю образовательную платформу Web Audio Lab. Это довольно амбициозный проект, и порой я остро чувствую, как непросто продвигаться в нём одному. В разработке таких проектов много неопределённости и затыков, длинных периодов изучения нового, и долго может не быть видимых результатов.

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

Формат группы очень простой: раз в неделю будет приходить напоминание о том, что пора поделиться своим прогрессом: что удалось сделать, где возникли затыки и какие планы на следующие 7 дней. Это поможет не выпадать из процесса разработки, сохранять темп и видеть, что другие люди проходят через похожие этапы. Всё остальное — в свободном режиме: в группе можно будет обсуждать любые вопросы о технологиях, дизайне, маркетинге, бизнесе и т.д.


Мне хочется, чтобы эта группа была не просто клубом по интересам, а рабочим инструментом, который помогает двигаться вперёд. Поэтому я решил ввести символическую плату за участие — 100 рублей в месяц через @tribute. Это не монетизация, а способ задать минимальный порог вовлечённости и сохранить рабочий тон внутри сообщества. Подписку можно отменить в любой момент, первые три дня пробные.

Если вы сейчас делаете свой проект и не хотите проходить этот путь в одиночку, напишите мне в личку: @astroscientist. Расскажите кратко, над чем вы работаете и что бы хотели от такого сообщества. Я планирую собрать небольшую, но живую группу, поэтому хочу для начала пообщаться лично.
🔥123👍2