Всем привет, меня зовут Михаил, я работаю senior Java/Kotlin разработчиком в ОТП Банке. В свободное от работы время я занимаюсь менторством. Ко мне приходят разные люди: кто-то уже работает на проекте, кто-то только учится.
Сейчас, в эпоху ИИ, найти информацию стало куда легче, чем раньше. Раньше ты гуглил и тыкал по ссылкам, а теперь все в одном приложении. Да еще и код можно не писать - ну красота же. Но что, если ты и до этого не умел писать код и решил "вкатываться в айтишку" (ненавижу эту фразу)?
Вроде бы у тебя на руках все материалы и знания всего интернета, которые нужно всего лишь положить себе в голову. На мок-собеседованиях ребята знают все, отвечают, будто они сами придумали этот термин или метод. Но как только дело доходит до самостоятельного кодинга - люди теряются.
Я написал небольшую задачу и попросил решить ее людей разного уровня - от стажера до сеньора. Кому-то разрешил пользоваться нейросетью, кому-то запретил.
Сегодня поговорим о том, как ИИ влияет на обучение с нуля и как им лучше пользоваться для обучения.

!!!ДИСКЛЕЙМЕР!!!
Я не буду говорить, что пользоваться ИИ это плохо и бросайте или что нужно по-максимуму пользоваться ИИ. Буду говорить свое мнение и наблюдение по этому поводу, оно может не совпадать с Вашим, но это абсолютно нормально.
Суть проблемы
Раньше, когда информация не лежала в одном месте, а код нейросеть не писала под твой проект, приходилось делать все руками. Ты гуглил, открывал 10 вкладок, читал статьи на Stack Overflow, смотрел примеры и думал: "А как это применить к моей задаче?" Иногда часами сидел над одним методом. Писал, переписывал, падал, вставал и снова писал.
Это было больно. Но это набивало опыт.
Ты запоминал решения, потому что добывал их потом и кровью. Ты понимал, почему код работает, потому что сам его написал и отладил. Ты умел читать чужой код, потому что без этого было никак.
Сейчас все по-другому.
Перед разработчиком стоит искушение: скормить задачу нейросети и через 30 секунд получить готовый код. Красота же. И многие поддаются. Особенно те, кто только учится. Зачем думать, если можно просто скопировать? Зачем ошибаться, если нейросеть выдаст правильный вариант?
И люди обленились. Честно. Они перестали набивать шишки. Они перестали думать. Они разучились читать чужой код, потому что нейросеть написала свой. Они не знают, почему их код работает - просто потому что "нейросеть сказала, что так правильно".
Проблема даже не в том, что мидлы или сеньоры делают все с нейросетями. Нет. Проблема именно в начинающих специалистах. И весь парадокс в том, что они боятся, что их полностью заменят нейросети. При этом пользуются только ими и доверяют им все. Сами себя заменяют.

Сегодня я хочу показать, как доверие нейросетям без собственного опыта в программировании затащит вас в техдолговую яму и как оно влияет на разработку.
Именно об этом моя статья.
Задача и подопытные
Задача достаточно простая:
Задача
class NotificationRequest { private String requestId; private NotificationType type; private String recipient; private String message; } enum NotificationType { EMAIL, SMS, PUSH }
Реализовать программу, которая:
1. Принимает список запросов и обрабатывает данные по одному
2. Не отправляет дубликаты
Дубликатом считается запись с одинаковым requestId.То есть если запрос уже обрабатывался - повторно не отправляем.
3.Регистрация считается невалидной если:
requestId == null
recipient == null
message == null
Email невалидный если:
не содержит "@"
SMS невалидный если :
номер телефона не содержит "+" и не содержит ровно 11 символов после плюса.
PUSH невалидный если:
Сообщение пустое
4. Эмулирует отправку(просто вывод в лог информации)
Создать сервис:
NotificationService
Метод:
void send(NotificationRequest request)
Sending EMAIL to user1@mail.com
Sending SMS to +79990001122
Sending PUSH to device-123
После обработки вывести:
Processed: 3
Duplicates skipped: 2
Failed: 0
ВАЖНО! Используем только Java, ничего больше!
В качестве подопытных будут следующие лица:
Кто | Пользование нейросетью |
Нейросеть (DeepSeek и ChatGPT, их самые доступные версии) | Да |
Стажер | Да |
Стажер | Нет |
Мидл, который больше не пишет код сам (вайбкодер) | Да |
Сеньор | Как захочет (почему так, узнаем позже) |
Для нейросети я взял самые доступные - deepseek и chatgpt их самые доступные версии.
Нейросеть
Я сказал просто: «Реши задачу». Без сложного промта, получил следующее решение -
Решение нейросети
class NotificationService { private Set<String> processedIds = new HashSet<>(); private int processedCount = 0; private int duplicatesSkipped = 0; private int failedCount = 0; public void send(NotificationRequest request) { if (processedIds.contains(request.getRequestId())) { duplicatesSkipped++; return; } if (!isValidRegistration(request)) { failedCount++; return; } if (!isValidByType(request)) { failedCount++; return; } emulateSending(request); processedIds.add(request.getRequestId()); processedCount++; } private boolean isValidRegistration(NotificationRequest request) { return request.getRequestId() != null && request.getRecipient() != null && request.getMessage() != null; } private boolean isValidByType(NotificationRequest request) { switch (request.getType()) { case EMAIL: return request.getRecipient().contains("@"); case SMS: String phone = request.getRecipient(); return phone.startsWith("+") && phone.length() == 12; case PUSH: return !request.getMessage().trim().isEmpty(); default: return false; } } private void emulateSending(NotificationRequest request) { switch (request.getType()) { case EMAIL: System.out.println("Sending EMAIL to " + request.getRecipient()); break; case SMS: System.out.println("Sending SMS to " + request.getRecipient()); break; case PUSH: System.out.println("Sending PUSH to " + request.getRecipient()); break; } } public void printStatistics() { System.out.println("\nProcessed: " + processedCount); System.out.println("Duplicates skipped: " + duplicatesSkipped); System.out.println("Failed: " + failedCount); } }
Видим следующие решение - оно в лоб, ничего сложного, нет абстракций, паттернов или чего-то еще Видим следующие решение - оно в лоб, ничего сложного, нет абстракций, паттернов или чего-то еще
Оно в лоб. Ничего сложного. Нет абстракций, паттернов или чего-то еще. Оно работает, но нет гибкости. Нет архитектуры. Просто код, который делает то, что просили, и не более.
Дальше я не буду вставлять код каждого решения. Считаем, что этот код - основа, которую мы будем совершенствовать.
Стажер, который решал задачу с чатом.
Неудивительно, что его решение один в один, как и у нейросети. Он оставил как есть, не задумываясь ни о чем, значит у него такие же проблемы, как и у нейросети.
Стажер, который решает задачу сам.
Здесь для меня было удивление. Решение заняло куда больше времени, чем я ожидал. У стажера без ИИ ушло в районе 2-3 часов на решение.
И знаете что? Я горжусь его решением.
Гугля и находясь в поиске решения некоторых задач, он сделал покрытие паттернами проектирования:
Фабрика - для создания объектов NotificationService.
Синглтон - для создания одного экземпляра на каждый тип.
Фабричный метод - так как логика везде одинаковая, была сделана абстракция с одним абстрактным методом validate.
Возможно, это решение не считается идеальным. Да и нет идеальных решений. Но оно гораздо лучше. Гораздо гибче. В нем видна идея.
Человек, который подумал своей головой, поискал решения - получил хороший результат.
Да мы получили решение куда дольше, но зато его можно легко поддерживать!
Мидл - вайбкодер
Как он сюда попал? На самом деле совершенно случайно, это человек, который уже долго работает на реальном проекте и сейчас почти полностью пишет код с нейросетью. Мне показалось, что это идеальный кандидат. Впервые за долгое время он решал задачу сам и вот итог:
Есть NotificationService, который занимается отправкой и проверкой дубликатов. Есть отдельный ValidationService, который содержит методы smsValidation, pushValidation, emailValidation.
Оно лучше, чем у нейросети. Но не идеальное.
Что хорошо: есть разделение ответственности. NotificationService занимается отправкой, ValidationService - валидацией. Не все в одной куче. Есть разделение на подметоды в основном коде.
Что плохо: нет гибкости. Чтобы добавить новый тип уведомления (например Telegram), придется лезть в класс ValidationService и добавлять новый метод. И в NotificationService тоже. Нет абстракции, нет паттернов, нет расширяемости.
Это среднее решение. Оно работает. Но развивать его страшно.
Хотя при использовании ИИ и просмотра его кода качество было всегда куда лучше.
Сеньор
Почему я написал в таблице загадку - "Как захочет (почему так, узнаем позже)"?
Я попросил сеньора сделать так: сначала решить задачу самостоятельно, потом попросить нейросеть решить ее же, затем взять код нейросети и отревьювить его, дать замечания и править до тех пор, пока код не станет для него приемлемым.
Итоговое решение получилось коротким, четким. Использовались абстракции, паттерны. Предусмотрено логирование для каждого сценария. Вынесены константы.
На все про все у сеньора ушло 30-40 минут. Из них непосредственно ревью кода нейросети с правками заняло около 10 минут. Понадобилось 3 итерации правок. Все замечания были в основном архитектурные: добавление гибкости, расширение логирования.
Итоги конкурса
Давайте подведем небольшой итог в виде таблицы
Участник | Время | Качество кода | Моя личная оценка решения(очень субъективно) |
Нейросеть | 30 сек | Примитив, нет гибкости | 3/10 Работает - и ладно. Но развивать страшно. |
Стажер с чатом | 5 минут | Тупая копипаста | 1/10 Даже не пытался что-то исправить |
Стажер без чата | 2-3 часа | Паттерны, гибкость, абстракция | 8/10 Для стажера отличная оценка, он проделал хорошую работу и показал самостоятельность. Горжусь!! |
Мидл вайбкодер | 1-2 часа | Разделение ответственности, но нет гибкости и расширяемости | 5/10 Оно лучше, чем у нейросети, но есть свои проблемы. |
Сеньор без нейросети | 30-40 минут | Присутствует архитектура, разбиение на пакеты, логирование, константы, гибкий код. | 9/10 Код лаконичный, просто, гибкий, читаемый. 10 не ставлю - всегда есть куда стремиться |
Сеньор с нейросетью | 10 минут | Все преимущества, что и без нейросетей | 9/10 Все преимущества, что и без нейросетей |
Итог
Нейросеть - это ускоритель. Он дает вам 5x к уму и скорости. Ваши знания, ваш опыт, ваше умение мыслить - это база. А нейросеть умножает эту базу.
Формула простая:
Ваш уровень * 5x = результат
Если ваш уровень - 0, то извините. 0 умножить на 5 равно 0. Профита вы не получите.
Если ваш уровень - 1 (вы новичок, который хочет разобраться), то 1 * 5 = 5. Уже что-то.
Если ваш уровень - 2 (вы уверенный джун), то 2 * 5 = 10. Вы уже далеко впереди.
А если ваш уровень - 10 (вы сеньор с горящими глазами), то 10 * 5 = 50. Вы бог.
Нейросеть не делает вас умнее. Она делает вас быстрее. Но если нечего ускорять - пользы особо не будет.
Проблема начинающих в том, что они пытаются заменить свой 0 на нейросеть. Но нейросеть не заменяет базу. Она умножает ее.
Так что сначала наберите свой уровень. Пишите код руками. Ошибайтесь. Ищите сами. А потом подключайте ускоритель.
Если вы только начинаете свой путь, используйте его по минимуму. Если вы приходите к нему за подсказкой, просите не выдавать готовое решение, а наставить на нужный путь.
Если вы уже давно в профессии, но в последнее время не пишете код руками - попишите, вспомните. Писать код - это классно. Особенно хороший код, который хочется поставить в рамочку.
А если вы пользуетесь нейросетью для помощи в нужные моменты или делегируете на нее рутину - велком в мой лагерь. Именно так я и пользуюсь нейросетью. Не так, что скармливаю все ТЗ и жду, откинувшись на стуле. Нет, я люблю писать код. Но писать DTO или миграции на создание таблиц я уже давно устал - пусть это сделает помощник. А что-то посложнее оставит мне!
Пользуйтесь нейросетями с умом. Всем спасибо!
