Деды писали код
Каждый день — один совет по программированию в моем личном телеграм-канале @deadcode0x
#330 Именованные параметры в JavaScript Одна из самых лучших вещей, появившихся в JavaScript за последние годы — это возможность использова
#323 Монетарные значения должны быть целочисленными Как известно, [0.2 + 0.1 = 0.30000000000000004](https://en.wikipedia.org/wiki/Floating-point_arithm
#320 Плавно вводи ресурсы в эксплуатацию Допустим, у тебя система хранения с линейным масштабированием. Добавил новый сервер — расширилось м
#318 Создавай хелперы для межмодельного кода Вот есть пользователь (`User`), вот есть купоны на скидки (`PromoCode`). Тебе нужно применить одно
#313 Fallback в коде: что, если не получилось? Если в коде что-то не получилось (нет ответа от базы, API недоступен, платеж не прошел и т.д.) то в
#309 Exceptions — зло Exceptions полностью ломают логику твоего кода. Когда кто-то его выбрасывает, управление переходит
#306 Стоит ли автоматизировать эту задачу? Есть простой способ узнать ответ на этот вопрос. Сколько по времени будет стоить выполнение этой з
#305 Не показывай лоадер сразу Юзер заполняет форму, кликает submit, форма отправляется на сервер, сервер думает. На время размышл
#303 Даты обновлений в таблицах Хорошей привычкой при проектировании баз данных должна стать привычка добавлять поля `createdAt` и
#302 Возврат неуспешного результата из функции в JS
#296 Код не для исполнения Иногда можно писать код, который никогда не будет исполняться, но который очень важно чтобы никто д
#295 Есть два крона Простой кейс: твой сервис [работает на двух или трех серверах](../293/) и у тебя есть задача, котор
#293 Есть два сервера Практически любая задача должна выполняться минимум двумя серверами. Если один умрет - второй подхв
#290 /health/ check Полезно пользоваться сервисами, которые мониторят аптайм твоего продукта и шлют уведомляшки в случа
#281 Как принимать платежные уведомления Почти все платежные системы устроены одинаково. Ты отправляешь своего пользователя на страницу плат
#257 Атомарная выборка только одной записи Представь простую очередь задач в SQL. У каждой есть уникальный ID, поле статуса (новая, в работе,
#252 Как написать отдельную документацию Самая тяжелая задача для программиста — написать отдельную документацию. Отдельную, то есть не комм
#249 Тяжелый способ вносить большие изменения У тебя есть четыре базы пользователей и три метода входа/регистрации. Гора логики! Теперь нужно доб
#247 Карантин для данных вместо удаления Дело в том, что удаление данных — относительно дорогая процедура для большинства систем хранения да
#244 Самый удобный файловый формат Это текстовый файл, где одна строка — одна запись в JSON (без перевода строк). В начале такого фай
#235 Быстрая загрузка данных в базу Не бойся тупорылых решений там, где они абсолютно уместны. Иной раз самый практичный способ загрузи
#231 Соблюдай единый стиль в мелочах Пример из реального проекта:
#228 Moving Average в реальной жизни Представим себе сервис, в котором ты мониторишь количество активных пользователей. Точное значение
#225 Moving Average для чайников Стоит чаще пользоваться скользящими средними значениями (по-русски Moving Average) вместо точных ци
#222 Меньше комментариев! В [прошлом совете](../221/) я просил тебя записывать мысли в комментариях, чтобы сохранить знания и
#221 Больше комментариев! Пиши в комментариях идеи, которые привели к появлению этого алгоритма. Код останется на долгие годы
#217 Test-driven development в реальной жизни Есть такой подход к разработке: сначала пишется юнит-тест на несуществующий код, затем тест падает,
#209 Простейший журнал Допустим, у тебя есть формат хранения и ты хочешь сделать так, чтобы данные в файле всегда были цел
#208 Простой интеграционный тест Самый простой приемочный (acceptance) тест на сложные системы — это простучать систему по самому ос
#205 Не стесняйся строить хеши Когда ты перемешиваешь в памяти разные структуры данных — не стесняйся строить себе по дороге полез
#204 Давай не будем? Зачем тебе делать огромный запрос к базе для выборки видосиков, если потом окажется, что к тебе еще
#199 Как правильно валидировать email Это нетривиальный вопрос. Кроме всем известного `юзер@домен.ком` существует больше десятка валидных
#189 Передача подписанных данных через броузер Классический сервис: восстановление пароля. Классическое решение: создаем ссылку с уникальным токен
#186 Долго ли умеючи Транзакции с базой данных нужно открывать и закрывать как можно быстрее. Внутри транзакции категори
#179 // FIXME В программировании, как и в беседе, важно не отвлекаться на посторонние вещи. Поэтому я пишу сначал
#177 Имена булевых переменных Булевые переменные должны начинаться с глагола to be: isAvailable, shouldReload, hasBeenDownloaded.
#174 Легкий способ документировать код Никто не любит писать документацию на код. Никто не любит писать комментарии. Программиста это либо
#170 Tocken bucket Скажем, что тебе нужно вызывать функцию не чаще чем несколько раз в секунду, но иногда чаще, но не
#168 Возвращайся поскорее Чем глубже у тебя вложенность кода, тем тяжелее в нем ориентироваться. Вот типичный код:
#166 Название структуры и ее члена должны быть одинаковыми Стремись, чтобы у тебя было единообразие названий, когда пишешь цикл или работаешь с множествами. Е
#163 Заголовок бинарного формата Когда разрабатываешь собственный бинарный формат хранения данных, обязательно придумай ему заголово
#159 Вынеси отдельно запись и чтение структур данных Когда ты работаешь над бизнес-логикой, тебе меньше всего хочется отвлекаться на низкоуровневые особ
#153 Нормализация парсинга Когда парсишь CSV-файлы или строковые значения из внешнего мира, обрати внимание, что человеческие
#151 Всегда возвращай Content-Length ...в http-сервере. Думаешь, это очевидно? Колупаясь в исходниках различных фреймворков я заметил, ч
#148 Научись расставлять пустые строки В статьях есть параграфы. В книгах есть абзацы. В коде тоже нужно научиться расставлять пустые стр
#142 Файлы следует сохранять атомарно Допустим, ты пишешь простенький кеш для скачивания файлов, чтобы твой код не качал одно и то же по
#137 Больше классов! Не стесняйся создавать отдельный класс для каждой маленькой сущности, если у нее есть **понятное им
#132 Дрифтуй во сне Очень часто `sleep()` заслуживает, чтобы в него добавили небольшой рандомчик. Все задачи по разгреб
#129 setInterval() не нужен Допустим, нужно разбирать очередь. Типовой подход: раз в пару секунд спрашивать `SELECT * FROM queu
#123 Не смешивай данные и метаданные Типовая ситуация: ты пишешь кеш. Запись в кеше — это сами данные и unixtime, когда они были получен
#122 Позволь себе красоту Абсолютно не надо стесняться кода, написанного исключительно ради красоты. Причем красота — это не
#121 Опасность девелоперских костылей в продакшне В девелопменте всегда есть соблазн временно отключить проверку паролей. Типичный вариант:
#120 «Режим репетиции» в скриптах По-русски это называется «dry run». Любой скрипт, выполнение которого стоит дорого, должен иметь ре
#119 Легкий способ начать рабочий день Вечером сохрани себе в TODO на утро какую-нибудь быстро выполнимую и маленькую задачу (но не тривиа
#118 Самый лучший способ временно спрятать код Нет, это не `/* .. */` Самый лучший способ временно убрать код — это `if (0) { .. }` Выключенный
#117 Простой способ получить неравномерное распределение случайных чисел Среднее из двух рандомных значений — простой способ получить неравномерное распределение с пиком посередине.
#116 Полезно указывать тип данных, возвращаемых функцией Для простых типов можно указывать результат одним словом:
#115 Все строки для людей — в двойных кавычках, все строки для компьютера — в одинарных Так можно с первого взгляда определить, кому адресована строка в коде. Вот пример, где в интерфейс
#114 Полезно перечислять названия параметров в названии функции Так будет проще читать код. Вообще, не стоит бояться длинных идентификаторов. Бояться надо непонятн
#113 «Волшебные» строки нужно определять в константы На опечатку в константе будет ругаться компилятор, а на опечатку в волшебной строке — нет, и ошибка вылезет только в рантайме.