Будете ли вы работать над пробелами в знаниях, выявленными на собеседовании?

Ответ

Да, обязательно. Собеседование — это ценная обратная связь. Я систематизирую вопросы, которые вызвали затруднения, и создаю персональный план обучения для ликвидации этих пробелов.

Мой алгоритм действий:

  1. Анализ: Сразу после собеседования фиксирую темы, где были неточности (например, тонкости работы CompletableFuture, детали сборки мусора в JVM).
  2. Изучение: Углубляюсь в тему через документацию (Oracle Java Docs), авторитетные книги («Java Concurrency in Practice», «Effective Java») и технические статьи.
  3. Практика: Закрепляю теорию написанием кода, решением задач на LeetCode/HackerRank или созданием учебного проекта.
  4. Конспектирование: Веду технические заметки (например, в формате Markdown) для закрепления и быстрого повторения.

Пример для пробела в многопоточности:

// Тема: Правильная синхронизация доступа к shared mutable data
public class Counter {
    private final AtomicLong count = new AtomicLong(0); // Вместо volatile/long

    public void increment() {
        count.incrementAndGet(); // Атомарная операция, решает проблему race condition
    }

    public long get() {
        return count.get();
    }
}
// Изучаю: разницу между volatile, synchronized, атомарными классами из java.util.concurrent.atomic.

Постоянное обучение и адаптация — ключевые навыки современного разработчика.

Ответ 18+ 🔞

Да ты посмотри, какая, блядь, дисциплина! Прямо как в армии, ёпта. Ну ладно, слушай сюда, разбираем по косточкам.

После любого собеса, особенно если где-то обосрался, я делаю нехитрый ритуал. Не чтобы грусть-тоску развеять, а чтобы в следующий раз не быть таким же мудаком. Вот мой священный план, блядь:

  1. Разбор полётов. Пока не остыло, сажусь и тупо выписываю, на каких вопросах меня, сука, подвесили. "А расскажите про фазы сборки мусора в G1" — ой, всё. "Чем thenApply отличается от thenCompose?" — да похуй, казалось. Вот эти все пиздопроебибны и есть моя слабость.
  2. Закапываюсь в говно. Беру эту тему, которая меня сломала, и лезу в неё с головой. Не в википедию, блядь, а в нормальную документацию, в толстые книжки, которые все хвалят, но нихуя не читают. Типа "Java Concurrency in Practice" — там, бля, такие глубины, что волосы дыбом.
  3. Руки чешутся. Теория — это, конечно, охуенно, но пока сам не напишешь код, который сломается из-за гонки данных, нихуя не поймёшь. Лезу на LeetCode, ищу задачки именно по этой теме, либо пишу маленькую демку, где этот принцип можно потрогать.
  4. Конспект для будущего мудака. Чтобы через месяц не охуеть от собственной забывчивости, пишу краткую выжимку. Типа "Володя, запомни: volatile — только видимость, для атомарности нужен synchronized или AtomicInteger, ёбта".

Вот, например, меня спросили про потокобезопасный счётчик, а я начал про synchronized молоть, хотя есть же красота:

// Тема: Как не обосраться с общими данными в потоках
public class Schetchik {
    private final AtomicLong schet = new AtomicLong(0); // Вот он, красавец! Не просто long, а атомарный!

    public void pribav() {
        schet.incrementAndGet(); // Эта штука не даст двум потокам нахулиганить одновременно
    }

    public long posmotri() {
        return schet.get();
    }
}
// И вот теперь я сижу и вникаю: а когда тогда `volatile`, а когда `synchronized`, а когда этот `AtomicLong`? Овердохуища нюансов, блядь.

Короче, суть в чём: если после собеса просто поныть и забыть — ты конченый. А если сесть, разобрать свои косяки и их починить — это и есть тот самый скилл "быстро учиться", про который все в резюме пишут. Без этого — пидары налетят и сожрут на следующем же интервью.