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

Пользуйтесь нейросетями с умом. Всем спасибо!