Опубликовано в Профессии
Пять ошибок начинающих разработчиков: как их избежать
За время работы мы общались с десятками ребят, которые только входят в ИТ, и собрали пять самых частых ошибок начинающих разработчиков. Рассказываем, как их избежать и сэкономить себе время — в первом учебном проекте и на работе.
1. Пренебрежение тестами
«У нас нет времени писать тесты» — знакомая отговорка начинающих разработчиков. Но время, которое ты сэкономил сейчас, легко потратить на отладку того, что сломалось в проде. Особенно если это случилось в пятницу вечером.
Мы не призываем добиваться стопроцентного покрытия любой ценой. Высокий процент покрытия сам по себе не гарантирует, что тесты обнаружат важные ошибки. Начинать стоит со сценариев, где сбой приведёт к потере денег, данных или доступа.
Без базовых проверок важных сценариев проект превращается в минное поле. Каждый новый релиз — русская рулетка: ты надеешься, что ничего не упадёт. Но надежда — плохая стратегия.
Как не наступить на эти грабли
- Пиши модульные тесты для отдельных правил: расчёта скидки, проверки ограничений или изменения статуса заказа.
- Добавляй интеграционные проверки там, где код взаимодействует с базой данных или внешним сервисом.
- Проверь несколько ключевых сквозных сценариев: регистрацию, вход и оформление заказа. Для платежей используй тестовое окружение провайдера, а не реальные списания.
- Запускай проверки автоматически перед объединением изменений. Исправляешь ошибку — добавь тест, который поможет поймать её повторное появление.
Проверяй не только успешный путь. Что произойдёт, если платёжная система не ответит или пользователь дважды отправит запрос? Тесты уменьшают риск регрессий, но не делают систему неуязвимой.
2. Копирование кода без проверки: Ctrl+C, Ctrl+V — и в бой
Копировать код из интернета — норма. Мы все этим занимаемся. Но есть разница между тем, чтобы взять идею и адаптировать её, и слепым вставлением куска, который ты даже не пытался понять.
В нашей практике встречались проекты, где найденное или сгенерированное решение добавляли без проверки, а позже выяснялось: оно рассчитано на другое окружение. Другая версия языка, устаревшая библиотека, неприменимые ограничения — и пример уже не работает так, как ожидалось.
Как не наступить на эти грабли
Потрать время, чтобы разобраться, как работает готовое решение, прежде чем тащить его в проект. Потому что теперь это твой код. И если он сломается — тебе с ним разбираться.
- Сформулируй, что код должен делать: какие данные получает, что возвращает и какие побочные эффекты создаёт.
- Разберись в важных операциях и зависимостях. Сверь используемые методы и версии с официальной документацией.
- Проверь обычный случай, пустые и некорректные данные, отказы зависимостей и доступ к чужим данным.
- Адаптируй решение под проект, добавь тесты и проверь условия использования, если заимствуешь чужой код.
Ответ ИИ — заготовка для проверки, а не подтверждение правильности. Не передавай внешним помощникам пароли, токены и закрытый код без разрешения команды. Хороший критерий готовности: ты можешь объяснить решение коллеге и понимаешь, где оно перестанет работать.
3. Хранение ключей и паролей в коде
Ключ доступа к сервису или строка подключения с паролем в коде — как ключи от дома под ковриком. Закрытый репозиторий тоже не стоит считать хранилищем секретов: содержимое доступно участникам и может оказаться в копиях, сборках или журналах.
Как не наступить на эти грабли
- Для локальной разработки держи реальные значения вне отслеживаемых файлов. Добавь
.envв.gitignore, а в.env.exampleоставь только названия переменных и безопасные заглушки. - Перед коммитом проверь
git statusиgit diff --cached: важен не только список файлов, но и содержимое подготовленных изменений. - Подключи проверку на секреты. Она дополняет ручной просмотр, но не заменяет его.
- На сервере используй хранилище секретов или защищённый механизм платформы. Ограничивай права и срок действия ключей.
Не все конфигурационные файлы запрещено хранить в репозитории — нельзя коммитить именно секреты. И переменные окружения не являются сейфом: они могут попасть в диагностические данные.
Если ключ уже утёк, сначала отзови или замени его и сообщи команде. Удаления строки новым коммитом недостаточно: значение может сохраниться в истории и копиях. Затем проверь использование ключа и согласуй дальнейшую очистку.
4. Микросервисы с первого дня
«Мы сразу сделаем на микросервисах, чтобы было круто» — знакомый план. Но если у тебя пять пользователей и три эндпоинта, сначала стоит понять, какую проблему ты решаешь. Пока твоя задача — сделать продукт.
Микросервисы без понятной причины на старте — это как пытаться построить небоскрёб, когда тебе нужен просто гараж.
Несколько сервисов означают сетевые отказы, согласование данных, отдельное развёртывание и более сложную диагностику. Это оправданная цена, когда она решает конкретную проблему, а не делает схему презентабельнее.
Когда достаточно монолита
Для небольшого нового продукта разумная отправная точка — модульный монолит: одно приложение с понятными границами частей. Разделяй ответственность, контролируй зависимости и пиши тесты. Этот подход помогает сначала разобраться с предметной областью; его преимущества и ограничения разбирает Мартин Фаулер в статье о старте с монолита.
Микросервисы нужны не только при высокой нагрузке. Причинами могут быть независимые релизы команд, отдельное масштабирование компонентов или изоляция сбоев. Но сначала нужны понятные границы и готовность поддерживать распределённую систему.
Если приложение тормозит, сначала измерь причину. Иногда проблема в запросе к базе, а не в отсутствии микросервисов. Не усложняй архитектуру раньше, чем можешь объяснить, какую проблему это решит.
5. Ошибки приложения: не раскрывай внутренности системы
Упала база данных, и пользователь видит стектрейс с названиями таблиц и путями к файлам. Знакомая картина?
Показывая пользователю внутренности системы, ты даёшь злоумышленнику карту: раскрываешь детали технологий, структуру базы и пути к файлам. Не факт, что этого хватит для атаки, но помогать ему точно не стоит.
Как не наступить на эти грабли
- Отключи отладочный режим в рабочем окружении и настрой единый обработчик неожиданных ошибок.
- Показывай понятное сообщение без внутренних деталей. Например: «Сервис временно недоступен». Не обещай, что команда уже исправляет сбой, если это неизвестно.
- Возвращай подходящий код ответа:
500— для неожиданной серверной ошибки,503— для временной недоступности. Ошибки ввода требуют отдельной обработки, а не универсального ответа500. - Сохраняй необходимые диагностические детали в защищённых логах, а пользователю при необходимости выдавай идентификатор обращения для поддержки.
При этом «всё остальное — в логи» — плохое правило: пароли, токены, платёжные реквизиты и лишние персональные данные туда попадать не должны.
Безопасность не требует делать сообщения бесполезными. Если человек ввёл дату в неверном формате, можно объяснить, как её исправить, не раскрывая устройство сервера.
Чек-лист начинающего разработчика перед релизом
- Тесты: важные сценарии и основные отказы проверены, проверки запускаются автоматически.
- Заимствованный код: ты понимаешь решение, проверил совместимость и можешь объяснить его ограничения.
- Секреты: реальные ключи не попали в подготовленный коммит, клиентский код или логи.
- Архитектура: сложность оправдана задачей, а не желанием попробовать модную технологию.
- Ошибки: пользователь получает понятный ответ, а команда — достаточно данных для диагностики без утечки чувствительной информации.
Что в итоге?
В разработке нет места автопилоту. Каждое решение должно быть осознанным. И каждый выбор должен учитывать контекст.
Пиши тесты, не копируй код бездумно, прячь чувствительные данные, начинай с простой архитектуры и не раскрывай пользователю лишнего. Это не сложные правила, но они спасают от множества головных болей.
Применяй их как рефлекс — и код будет служить тебе, а не наоборот. Помни: твоя работа — это не просто писать код. Твоя работа — создавать систему, в которой приятно работать и которую не страшно развивать.
Куда двигаться дальше
Если только знакомишься с разработкой, прочитай статью о том, кто такой бэкенд-разработчик и с чего начать обучение.
Хочешь разобрать свой проект и понять, что улучшать дальше? Выбери ментора и обсуди подходящий формат работы с ним.