Всем привет, меня зовут Михаил, я работаю 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 или миграции на создание таблиц я уже давно устал – пусть это сделает помощник. А что-то посложнее оставит мне!
Пользуйтесь нейросетями с умом. Всем спасибо!
Автор: MishaBucha


