Выпуск 042 · сентябрь 2026 · сейчас публикую

$

Заметки с рабочего стола программиста — о коде, системах и странном удовольствии от отладки в 2 часа ночи.

Я Максим Жабин — инженер-программист, пишущий о ремесле. TypeScript сегодня, Rust завтра, ассемблер для души. Новое эссе раз в две недели, по вторникам.

142
эссе опубликовано
8.2k
постоянных читателей
2d
с последнего коммита
чашек кофе
листай вниз
JavaScript·TypeScript·Rust·Go·WebAssembly·PostgreSQL·Redis·Docker·Kubernetes·Linux·NeoVim· JavaScript·TypeScript·Rust·Go·WebAssembly·PostgreSQL·Redis·Docker·Kubernetes·Linux·NeoVim·
// последние заметки

Свежие записи

все посты
01
JavaScript
11.12.24 — 8 мин чтения

О тихом насилии неявных преобразований

JavaScript позволит сложить [] с {} — и ещё скажет спасибо. Полевой справочник по граблям.

читать эссе
02
Компиляторы
10.28.24 — 14 мин чтения

Лексер своими руками в воскресный вечер

Забудьте про регэкспы. Забудьте про генераторы. Двести строк switch — и вы поймёте что-то новое о каждом языке, которым когда-либо пользовались.

читать эссе
03
Обработка ошибок
10.14.24 — 6 мин чтения

Почему я убрал все try/catch из своего кода

Типы Result, каналы ошибок и любопытное спокойствие, когда всё падает громко — хотя бы в разработке.

читать эссе
// сниппет недели

useTypewriter() — хук, который оживляет первый экран этой страницы.

Мигающее приветствие наверху страницы — не CSS-анимация, а настоящий React-хук. Печатает, ждёт, стирает, повторяет. Нажмите «копировать» и вставьте в свой проект.

  • ноль зависимостей
  • ~30 строк, полная типизация
  • безопасная очистка при размонтировании
React TypeScript Хуки
useTypewriter.ts
// Самоочищающийся хук печатной машинки. Без зависимостей, ~30 строк.
import { useState, useEffect } from 'react';

export function useTypewriter(
  words: string[],
  speed = 80,
  pause = 1800,
) {
  const [text, setText] = useState('');
  const [i, setI] = useState(0);
  const [del, setDel] = useState(false);

  useEffect(() => {
    const word = words[i % words.length];
    const delay = del ? speed / 2 : speed;

    const t = setTimeout(() => {
      setText(del
        ? word.slice(0, text.length - 1)
        : word.slice(0, text.length + 1));
    }, delay);

    if (!del && text === word) {
      const p = setTimeout(() => setDel(true), pause);
      return () => { clearTimeout(t); clearTimeout(p); };
    }
    if (del && text === '') {
      setDel(false);
      setI(i + 1);
    }
    return () => clearTimeout(t);
  }, [text, del, i, words, speed, pause]);

  return text;
}
usage.tsx
function Hero() {
  const greeting = useTypewriter([
    'hello, traveler.',
    'you found /dev/log.',
    'console.log(love)',
  ]);

  return <h1>{greeting}</h1>;
}
// архив

Старые посты

142 эссе о программировании, написанные за четыре года. Здесь — отфильтровано по свежести, полный индекс лежит в JSON.

09.30.24
Скрытая цена абстракции
Каждый добавленный слой — это слой, который придётся отлаживать. Размышление о том, когда остановиться.
11 мин
09.18.24
Простой текст переживёт нас всех
О выборе форматов, которые откроет даже операционная система ваших внуков.
5 мин
09.02.24
Сборка мусора, но по-личному
Чему трассирующие сборщики мусора могут научить вас, отпуская сайд-проекты.
9 мин
08.21.24
Письмо себе-джуну о синдроме самозванца
Восемь вещей, о которых мне хотелось бы услышать в первый год написания кода за деньги.
7 мин
08.07.24
Я написал базу данных на Go в 200 строк
WAL, LSM-дерево и HTTP API. Удивительно, как далеко можно уйти за одну субботу.
16 мин
07.24.24
Хватит использовать useEffect для всего
Большинство эффектов — признание того, что ваша модель состояния неверна. Немного переобучения.
6 мин
// оставайтесь на связи

Раз в две недели. По вторникам.

Одно эссе. Без трекинга, без рекламы и без всяких «10x». Отписка в один клик — я даже не обижусь.

Подписка пока не подключена. Скоро здесь появится рабочая форма.
Без спама
Одно письмо раз в две недели. Вот и всё.
Без трекинга
Селфхостинг на сервере за $5. Никакой аналитики.
Без пейволла
Бесплатно навсегда. Или пока не кончится кофе.