Деды писали код
Каждый день — один совет по программированию в моем личном телеграм-канале
@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
«Волшебные» строки нужно определять в константы
На опечатку в константе будет ругаться компилятор, а на опечатку в волшебной строке — нет, и ошибка вылезет только в рантайме.