Как разбирать чужой код

Первый вопрос ревьюера — какова цель этого кода. Без цели нельзя выдать вердикт «хороший» или «плохой». Дальше — анализ выбора инструментов.

Суть

Разбор чужого кода — практика, которая учит больше, чем написание собственного. Видишь чужие решения, ловишь паттерны, распознаёшь анти-паттерны. AsForJS заводит отдельную рубрику code review, где разбирает чужие фрагменты.

Алгоритм разбора

  1. Какова цель кода? Без неё вердикт невозможен
  2. Какие требования? Производительность, читаемость, гибкость
  3. Какой контекст? Прототип, продакшн, библиотека, бизнес-логика
  4. Кто его пишет дальше? Уровень команды
  5. Что меняется чаще? Сначала это
  6. Уже потом — оценивать конкретные решения

Пример: Array.from + два вложенных for

Чужой код из видео по Vue с конструкцией:

const matrix = Array.from({ length: n }).fill(
  Array.from({ length: m }).fill(0)
);
  • Не про понятность — выглядит сложнее, чем new Array(n)
  • Не про производительность — fill одним и тем же массивом (баг!)
  • Не про надёжность — все строки матрицы это одна ссылка
  • Вердикт: попытка выпендриться, ни одна цель не достигнута

Что искать в чужом коде

  • Дублирование — повторённые куски, которые можно вынести
  • Магические числа2048 в коде, не объяснённое константой
  • Циркулярность там, где не нужно — очередь не должна быть circular
  • Преаллокация — массив на 2048 элементов хорошо, на 2 — нет
  • GC-нагрузка — мелкие объекты в горячем пути плохо
  • Избыточная типизацияconst/let не делают код быстрее

Что разбирать вслух

  • Какие альтернативы есть
  • Почему автор выбрал именно так
  • Что было бы при изменении требований
  • Где границы применимости
  • Какой паттерн или идиома стоит за кодом

Принцип «нагрузка на GC»

  • Массивы при росте → дёргают GC
  • Списки → плодят мелкие объекты, тоже GC
  • Unrolled list — компромисс: массивы фиксированной длины в связном списке
  • Знание этих компромиссов — суть JS-оптимизации

Принципы пропорций

  • Короткая функция
  • Короткий модуль
  • Короткий рядок
  • Не слишком большая, не слишком маленькая
  • Между математиками (a+b) и филологами (numberOfIdentifierOfClient)

Антипаттерны разбора

  • Сразу выдавать вердикт без цели
  • Применять свой стиль вместо контекста
  • Игнорировать историю кода (легаси на N лет имеет причины)
  • Bike-shedding по форматированию
  • Молчать там, где нужно объяснить

🎓 Источники

  • 🎓 [Code Review: Array.from и два вложенных for] · AsForJS · 2025-11-12 · YouTube
    • Тезисы: первый вопрос ревьюера — цель кода; const не про производительность; разбор Array.from.fill; хороший код пишут единицы
  • 🎓 [Code Review как это и зачем] · 2019-10-22 · YouTube
  • 🎓 [👏 Дія відкрила код - Diia code review] · 2024-03-20 · YouTube
  • 🎓 [🧑‍💻 Node.js HTTP Proxy — ревью примеров кода] · 2023-11-29 · YouTube
  • 🎓 [💡 Зачем GoF, SOLID, GRASP, если есть AI] · 2025-12-15 · YouTube
    • Тезисы: FixedQueue, unrolled list, три указателя; AI плодит классы; magic number 2048