Принимайте участие в зарплатном опросе! Уже собрано почти 8 000 анкет.

Советы для начинающего Java-разработчика. Подготовка к собеседованию — часть 1

Этот цикл статей адресован людям, которые находятся на первой ступени лестницы под названием «Корпоративная разработка на языке Java». Первая часть посвящена планированию процесса обучения, а также определению тем и вопросов для самооценки. В следующих материалах я вкратце расскажу о процессе собеседования, выборе компании и особенностях карьерного роста.

Опытные девелоперы приглашаются в комментарии для обсуждения, дополнения и критики. На крайнюю степень объективности претендовать не могу, но старался учитывать большинство современных тенденций.

Пару слов о моем опыте. Первые полтора года я работал в аутсорсинговой компании, проходил как внешние собеседования на большие проекты, так и внутренние (квалификационные). На данный момент ушел из аутсорса и работаю в продуктовой компании.

План и процесс обучения

Если среди опытных разработчиков провести опрос на тему «Был ли ваш процесс обучения / становления профессионалом оптимальным по качеству и срокам», то большая часть, как мне кажется, ответит: «Нет». Причина проста: в огромном море информации о синтаксисе, фреймворках, базах данных, алгоритмах и тестировании нет и не может быть четкой структуры обучения, идеально подходящей каждому. Коля закончил хорошие курсы по алгоритмам, немного помнит основы синтаксиса из университета, но базы данных усвоил плохо, а о тестировании практически ничего не знает. Вася пришел в разработку из тестирования, знает синтаксис языка, но для удаления хвоста массива приводит его к листу, не дружит с Git, а с базами работал совсем с другой стороны.

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

Одним из определяющих факторов при освоении любого навыка является время, затраченное на процесс. Если Коля и Вася возьмут за основу общую программу обучения, созданную Петей, то каждый увеличит упомянутые затраты времени в некоторое количество раз, заплатив за закрепление уже изученного материала не всегда оправданную цену.

Цель новичка — быстрее попасть в профессиональную среду и приступить к разработке практических решений. А не делать домашние проекты по шаблону, считая их своим детищем. Я не умаляю значение pet projects для саморазвития и закрепления практических навыков, но давайте начистоту: глядя на свои проекты двух-трехлетней давности, лишь единицы назовут свой код достойным похвалы. И если опыта продакшена нет, то не стоит вписывать в резюме ссылку на GitHub-аккаунт. Если только его не ревьюил знакомый разработчик с опытом.

Таким образом, мы подошли к некоторым основополагающим, на мой взгляд, утверждениям:

  1. Продолжительные курсы офлайн-обучения (6 месяцев и больше) хороши, если:
    • у вас низкий уровень понимания по большинству покрываемых курсом тем;
    • отзывы о школе/курсах действительно хорошие либо есть человек, закончивший их и трудоустроившийся, которого вы знаете лично.
  2. Онлайн-курсы по узким направлениям (углубленные алгоритмы или базы данных, тестирование Java-приложений) стоит отложить на период после трудоустройства, чтобы не уходить в сторону от основной краткосрочной цели.
  3. Процесс составления изначального плана обучения значительно важнее трудолюбия и энтузиазма в разработке.

Вы можете быть человеком с бесконечным желанием учиться и достигать, но неправильный вектор приложения усилий сведет на нет такие полезные качества.

Градации

Во избежание холиваров на тему лучшей книги или целесообразности знания того или иного вопроса сразу оговорюсь, что подбор правильных материалов для изучения лежит исключительно на плечах ученика. Существуют русскоязычные каналы в Telegram и форумы, где любую тему уже обсуждали до вас и обсудят еще раз, если вопросы не заезжены до дыр и Google не помогает.

Здесь же я привожу неполный список тем и вопросов, действительно обсуждаемых на собеседованиях со мной или коллегами по работе.

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

Недоджун

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

Младший джун

Собеседование на позицию Junior Developer может не пройти (а может и пройти), но базовые знания в любом случае имеет неплохие. Легко расскажет об устройстве HashMap и алгоритме бинарного поиска, но поплывет на особенностях фреймворков, практических задачах на построение зависимостей и запросах к БД, которые чуть сложнее обычных.

Крепкий джун

Когда вы увидите вакансию «ищем Junior Java-девелопера с опытом разработки от 1 года», это о нем. Смело обходит большинство кандидатов на эту позицию. Чаще всего вопрос трудоустройства упирается только в требования по зарплате: хочет больше, чем умеет, но рынок — дело хитрое.

Все дальнейшие уровни в контексте обучения для начинающих смысла рассматривать я не вижу, так как требования размываются. У двух девелоперов с 2–3 годами опыта могут настолько различаться скилы, что в двух разных компаниях после собеседования предпочтение однозначно будет отдано в первом случае одному, а во втором — другому.

Хотелось бы также добавить, что даже недоджун может трудоустроиться на хорошую зарплату с первого раза. Например, у человека отличное знание алгоритмов и открылась соответствующая позиция в команде. Разработку ему подтянут со временем, а специфические знания, которыми он обладает, можно использовать сразу.

Градация приведена скорее для тех людей, кто ошибочно рассматривает общепринятые уровни (junior, middle, senior) в контексте времени работы в отрасли, а не в контексте знаний. Несмотря на некоторую корреляцию этих факторов, она очень индивидуальна. Кто-то за 4 года может набраться senior-знаний, а другой и через 5 все еще остается джуном.

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

  1. Основы языка и технологий.
  2. Работа с БД, JDBC.
  3. Hibernate.
  4. Spring.
  5. Алгоритмы.
  6. Логирование, тестирование.
  7. Паттерны проектирования.
  8. Системы контроля версий.
  9. Сборка проекта.
  10. Методологии разработки, веб-технологии, инструменты профилирования и т. д.

В этой статье рассмотрим первые два пункта.

Основы языка и технологий

Недоджун

Вопросы минимально упорядочены:

  • принципы ООП: абстракция, инкапсуляция, наследование, полиморфизм;
  • принципы SOLID, уметь рассказать на примерах из Java;
  • парадигмы программирования (императивное, декларативное и их основные подтипы);
  • интерфейсы, классы, объекты, знать разницу и особенности применения;
  • методы класса Object, понимать обязанности каждого метода и почему он был вынесен к верхушке объектной иерархии;
  • типы данных, уметь ориентироваться и использовать (примеры вопросов: «Зачем нужны классы-обертки для примитивов? Расскажите о приведении (casting) примитивных типов. А о приведении объектов?»);
  • типы классов (абстрактные, внешние, внутренние, вложенные и т. п.), модификаторы доступа;
  • коллекции, их иерархия, особенности и отличия одной от другой (LinkedList от ArrayList, HashMap от TreeMap), что под капотом у ArrayList, HashSet, на основе чего они работают и как устроены;
  • исключения, их иерархия и основы обработки (для чего, как и где);
  • стек, куча, как с ними организована работа в Java (общие принципы);
  • многопоточность: понятия процесса и потока, варианты создания потока, методы синхронизации и служебные слова в Java (называть только те, о которых можете рассказать), как вы понимаете потокобезопасность, deadlock, volatile, атомики, thread, runnable и callable;
  • стримы, лямбды, функциональные интерфейсы без серьезного углубления.

Сразу оговорюсь, что изучение каждой темы включает в себя понимание того, как все это устроено в Java.

Например, если упоминается наследование, то нужно знать и переопределение/перегрузку методов, и разницу статических/нестатических методов или переменных, и то, как написать нужную иерархию классов для элементарных задач. Если написали и нет понимания, насколько все это плохо, то обращаемся к комьюнити.

Младший джун

Перечисленные для недоджуна вопросы могут быть заданы с конкретными примерами из практической плоскости.

Темы:

  • особенности работы кучи и стека: внутреннее устройство, скорость доступа, использование памяти, сборщик мусора поверхностно;
  • нестандартное использование коллекций и особенности работы с ними: обработка NULL-значений в HashMap, TreeMap; удаление диапазона из TreeMap; почему строка — хороший выбор для ключа в HashMap. Дженерики и работа с ними: если метод принимает List, что туда можно передать; как в рантайме дженерики выглядят; могут ли быть конструкторы в абстрактных классах; если класс нельзя инициализировать, то зачем они;
  • наследование «IS-A» и ассоциация (включает в себя композицию «HAS-A» и агрегацию «USES-A or IMPLEMENTED-IN-TERMS-OF») в контексте Java;
  • интерфейсы-маркеры с примерами: сериализация, клонирование, конфигурируемая сериализация (интерфейс Externalizable);
  • более детально по типам данных: нотации основных методов (в классах-обертках, хеш-код, equals, что возвращают, почему, как переопределять), boxing-unboxing, инициализация переменных локальных и класса, пул строк (что такое, где хранится). Знать битовые операции AND, OR, XOR; byte b = 127, b++, какой результат и почему (по шагам); int p1, long p2, в чем разница между операциями p1 = p1 + p2 и p1 += p2;
  • более детальные вопросы по стримам: привести пример обработки из практики, скорость работы стримов, какие два типа операций есть, что за чем идет в операциях в стриме;
  • многопоточность детальнее: приведите пример дедлока (странный вопрос, но задают), как создать потокобезопасный класс, для чего нужен CompletableFuture, что такое пул потоков;
  • детальнее по исключениям: если оно выпало сначала в try, потом в catch, что будет; можно ли try без catch, но с finally, куда пойдет исключение; а если return будет и в catch, и в finally, как обработается;
  • рефлексия поверхностно, что возвращает getClass и зачем он нужен;
  • класслоадеры и их иерархия. Ситуация: getClass у двух классов возвращает одно значение, во время каста одного к другому происходит ошибка. Почему? (Классы загружены разными класслоадерами).

Крепкий джун

Все то же самое, что и у младшего, но все вопросы на уровне глубокого понимания. Добавляются:

  • I/O vs NIO (спрашивают обычно поверхностно);
  • работа с датой и периодами;
  • еще больше многопоточности: атомики изнутри (cas, faa), все основные классы из пакета Concurrent знать (где используется BlockingQueue, например), параллельные стримы и минусы их использования, forkJoin пул, вокруг чего бывает синхронизация (классы и объекты), какими способами, в чем разница ConcurrentHashMap и SynchronizedMap, ключевые отличия Callable от Runnable (обработка checked exceptions), happens-before ситуации при работе с потоками;
  • типы ссылок в Java, как и где используются;
  • стратегии сборщика мусора;
  • что объявляется в try-with-resources (вопрос по autocloseable);
  • рассказать об основных функциональных интерфейсах;
  • исключения: как ведут себя в конструкторе, как при наследовании и переопределении методов;
  • еще больше изощренных вопросов по коллекциям и классам/интерфейсам: если map не наследуется от Iterable, как по ней идет итератор; когда возникает ConcurrentModificationException и как избежать; HashMap приводит значения в корзине к дереву для оптимизации доступа начиная с определенного количества коллизий, но не всегда, а при каком условии; модификаторы доступа у полей и методов интерфейса; можно ли переопределять статические методы при наследовании;
  • где хранится в рантайме информация о классах, методах.

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

Работа с БД, JDBC

В этой теме, по моим наблюдениям, градация вопросов для начальных уровней практически отсутствует.

У младшего джуна могут спросить, работал ли он с нереляционными базами, и задать несколько попутных вопросов, а человека с небольшим опытом даже не прогнать по джоинам. Поэтому остановимся на том, что основы реляционных БД нужны всем, а понимание особенностей нереляционных будет хорошим плюсом. О JDBC практически всегда спросят, так как тема основополагающая.

Вопросы по SQL:

  • основы: типы запросов (DDL, DML, DCL, TCL), CRUD-операции, типы данных, первичные и внешние ключи, ограничения (constraints), HAVING vs WHERE, все типы JOIN плюс уметь применять на практике, UNION (какое условие выполнения оператора для двух таблиц), последовательность операций в запросе, триггеры — теоретическое представление, индексы одиночные и составные, кластерные и некластерные (сколько может быть кластерных индексов для таблицы и сколько некластерных, почему), курсоры — что это и зачем, команда EXPLAIN;
  • нормализация и денормализация, самые дотошные могут спросить о 3 классических нормальных формах;
  • транзакции, их свойства ACID, уровни изоляции транзакций (достаточно 4 классических).

Простые запросы не должны вызывать размышлений. Пример: достаньте из базы userinfo данные юзера, чья salary больше 5000. Зарплата в отдельной таблице лежит. Таких типовых задач в сети достаточно, очень советую поискать и попрактиковаться перед собеседованием.

Вопросы по JDBC:

  • назовите последовательность шагов при подключении и работе с базой с помощью JDBC;
  • для чего нужны: DriverManager, Driver, Connection, Statement, ResultSet;
  • какие вы знаете типы запросов (Statement, PreparedStatement, CallableStatement), расскажите о каждом типе;
  • за счет чего PreparedStatement бывает быстрее обычного Statement (прекомпиляция); если упомянуть пул прекомпилированных запросов, это сразу плюс в глазах собеседующего;
  • методы execute, executeUpdate, executeQuery, что возвращают, зачем нужны.

С крепкими джунами могут поверхностно коснуться темы масштабирования и репликации в рамках проверки общего архитектурного представления работы БД.

Итоги

Надеюсь, что предоставленной информации хватит для определения этапа, на котором вы находитесь. Хорошего знания основ языка и работы с БД иногда бывает достаточно, чтобы попасть в мир профессиональной разработки. Приправляя эти навыки пониманием работы фреймворков, алгоритмами и другими базовыми инструментами разработчика, вы гарантируете себе быстрое трудоустройство и продвижение по карьерной лестнице.

На этом первую часть закончу. Оставшиеся темы раскрою в следующих статьях. При достаточном количестве желающих продолжению быть!


Иллюстрация Дарины Скульской

LinkedIn

48 комментариев

Подписаться на комментарииОтписаться от комментариев Комментарии могут оставлять только пользователи с подтвержденными аккаунтами.

Прочитал статью и охренел, какая разница в требованиях к джуну на джаву и на плюсы. А потом прочитал комменты и все стало ясно))

ох уж эти совковые собесы а-ля «выучи напамять хибернейт и попади на нашу галеранейм»

Как по мне такие конкретезированные вопросы не имеют смысла, все равно все гуглим на практике даже если вроде помним )) Думаю куда эффективнее для найма вопросы более общие чисто понять человек сталкивался или нет и что умеет реально и самое важное как мне кажется как человек сделал тестовое, а именно качество выполнения.

Замечательный обзор! Я так понимаю, многие их этих вопросов, если не все, Вам пришлось услышать на собеседованиях лично? Благодарю!

Автор додай дісклеймер що ти сам ще джуномідл та цей список — це не те, що ти питаєш, а те, що питали тебе в наших аутсорсерах.

Бо так сходу незрозуміло.

Додав, дякую.
Про те, що всі питання у статті були задані мені — я написав. Просто за всіма правками зміст трошки змінився:

привожу неполный список тем и вопросов, действительно обсуждаемых на собеседованиях со мной или коллегами

.

Сподіваюсь відповів також на інший ваш коментар про

тому ми пишемо статтю в якій перелічуємо ці беззмістовні питання щоб наступні покоління джунів які виростуть переконалися у своїй правоті

Можна дискутувати на тему «мова — це інструмент» скільки завгодно. Але завтра той, хто буде слухати вас, прийде у умовну українську компанію і буде там доказувати, що все це йому знати не потрібно. Весела може вийти співбесіда, вам не здається?

Всі теми, які вами перелічені тут:

в реальній роботі потрібно вміти швидко розбиратися в чужій кодобазі, знати базові фреймворки, норм знати SQL на рівні запитів, розуміти як працює HTTP щоб не робити круглі очі при слові request header та вміти стековерфловити.

будуть розкрити у наступних частинах. Щоб довго їх не шукати, продублюю:

Основы языка и технологий.
Работа с БД, JDBC.
Hibernate.
Spring.
Алгоритмы.
Логирование, тестирование.
Паттерны проектирования.
Системы контроля версий.
Сборка проекта.
Методологии разработки, веб-технологии, инструменты профилирования и т. д.
Весела може вийти співбесіда, вам не здається?

Якщо інтерв’юер теж мене прочитає то буде норм, всі щасливі.

Я, кажись, не проходжу на джуна :).

Не парься, Рожка вон даже на трейни не возьмут :)

Мене на техліда ніколи не питали напевне і 10% із цього набору. На помідора і того менше. Сам в людей теж не питав цю дурню.

Ну шо, поїхали

стек, куча, как с ними организована работа в Java (общие принципы);

Не потрібно знати в реальній роботі.

многопоточность: понятия процесса и потока...

Так само не потрібно.

TreeMap

За 15 років жодного разу не користувався.

принципы SOLID, уметь рассказать на примерах из Java;

лол

Например, если упоминается наследование, то нужно знать и переопределение/перегрузку методов

ахахахах

особенности работы кучи и стека: внутреннее устройство, скорость доступа, использование памяти, сборщик мусора поверхностно;

)))))

могут ли быть конструкторы в абстрактных классах; если класс нельзя инициализировать, то зачем они;

лол кек

Знать битовые операции AND, OR, XOR; byte b = 127, b++, какой результат и почему (по шагам); int p1, long p2, в чем разница между операциями p1 = p1 + p2 и p1 += p2

кому треба цей байтодрочінг?

приведите пример дедлока (странный вопрос, но задают), как создать потокобезопасный класс, для чего нужен CompletableFuture, что такое пул потоков

з натяжкою ще можна сказати шо воно якось треба, але більше в контексті розподілених систем

если оно выпало сначала в try, потом в catch, что будет; можно ли try без catch, но с finally, куда пойдет исключение; а если return будет и в catch, и в finally, как обработается

після таких запитань хочеться
а) встати і вийти
б) запитати в інтерв’юера чи колись йому знадобилися ці знання

рефлексия поверхностно

)))))))))))))))))))))))))))))))))

класслоадеры и их иерархия. Ситуация: getClass у двух классов возвращает одно значение, во время каста одного к другому происходит ошибка

SOOOOOOOOQA ))))))))))))))))))))))))

I/O vs NIO

ахахаххахахахахахха

работа с датой и периодами;

нарешті щось нормальне. ще запитати про таймзони, UTC і тд

еще больше многопоточности...

...яку ви ніколи не будете використовувати

стратегии сборщика мусора;

)))))))))))))))))))))))))))))))))))))))))))))))))))

если map не наследуется от Iterable, как по ней идет итератор

П*зда рулю. На цьому місці вже сонечко вже зайшло і в офісі залишилося лише два дебіли двоє людей — інтевр’юєр який задає такі питання на джун який зміг то все завчити

HashMap приводит значения в корзине к дереву для оптимизации доступа начиная с определенного количества коллизий, но не всегда, а при каком условии

Нашо, нашо, НАШО мені це знати? Нашо це питати?

где хранится в рантайме информация о классах, методах

в рантаймі і зберігається, лол

Всем типам джунов важно осознать, что требования к хорошему пониманию основ языка исходят из их непосредственной обязанности — писать код

Нарешті здорова думка. Тільки все що зверху перелічене ніяк не перевіряє цей скіл.

может если так ответил бы — взяли бы на помидора или даже лида))

Ещё нужно попросить пояснить за strict serializable, serializable, linearizability, sequential и causal consistency и happens before в этом контексте.

он еще забыл написать про вопрос о разнице между Weak Reference, Soft Reference и Phantom Reference)) Все это каждый день юзают)

Не забув, ви неуважно читали.

типы ссылок в Java, как и где используются

Питали приблизно на одній з двох-трьох співбесід.
Włodzimierz Rożkow пише, що він таке не питає. Нажаль мені не так везло на співбесідах, мене питали саме це. І команди були сильні, і поскаржитись не на що.
Дуже хотів би побачити коменти від людей, які нещодавно проходили інтервью на джуна у будь-яку компанію з українських топів, і послухати що їх питали. Щоб тут не тільки я божився, що було таке :) І мати при цьому на увазі, що все спитати неможливо, і за одне інтервью на джуна більш ніж 30% з поданого матеріалу ніяк не встигнуть покрити.

Та меня тоже это периодически на собесах спрашивают. Мне кажется я даже где-то один раз за 5 лет видел в коде где weak reference использовалось, но я не уверен.
Я прошел больше 50 собесов на позиции от джуна до синьйора, обязательно всегда спрашивают про ООП, коллекции, основы Спринга, основы SQL. А дальше полный рандом, вариантов вопросов сотни, если не тысячи.

Нажаль мені не так везло на співбесідах, мене питали саме це.

Тому ми пишемо статтю в якій перелічуємо ці беззмістовні питання щоб наступні покоління джунів які виростуть переконалися у своїй правоті та почали запитувати те саме в майбутніх джунів.
Класична дідівщина, коло замкнулося.

мене питали саме це

Очевидно тому що в 100 разів простіше запитати як влаштований гарбаж колектор ніж придумати нормальну задачу яка показала би як кандидат думає.
Питання про гарбаж колектор бінарне — або відповів, або ні, можна спокійно поставити відмітку у довжелезній анкеті та потім порахувати бали і написати «отказать» або «прийняти» і піти далі на кухню скаржити на відсутність місць на парковках.

і поскаржитись не на що

Є на що поскаржитися. Всі ці «сильні команди» це купка інфантилів які думають що їх знання GC або задротство з хешмапами якось допомагають бізнесу витрачають свій та чужий час на маячню та відсіюють купу потенційно хороших толкових джунів які готувалися до практичного вирішення задач а не до тупого тестування. Це не правильно.

Треба подивитися правді у вічі та визнати що ніхто ніколи не тюнив GC, не писав треди в продакшн коді (за деякими вийнятками), не використовував колекції відмінні від дефолтних, не стикався з тонкощами які вимагали знань внутршньої реалізації і немає жоного сенсу запитувати такі питання. Звісно від того що кандидат знає шо там до чого гірше не буде, але в реальній роботі потрібно вміти швидко розбиратися в чужій кодобазі, знати базові фреймворки, норм знати SQL на рівні запитів, розуміти як працює HTTP щоб не робити круглі очі при слові request header та вміти стековерфловити.

Ось ці знання реально потрібні джуну і ці знання джун буде застосовувати на роботі з нульового дня.

А не писати потокобезпечний код з атомік референсами.

Дуже хотів би побачити коменти від людей, які нещодавно проходили інтервью на джуна

Для джунів найкраще підходить тестове завдання. Бо джунів багато, і результат дуже легко виміряти — зробив / не зробив. Я коли брав джуна дав просто завдання — пофіксити багу в нашому проекті — github.com/...​/blynk-server/issues/1266. Фікс в 3 строчки. Саме важке, мабуть, в завданні було підняти проект :).

З 20 людей зробила 1 людина. Його і взяли. Джуном дуже задоволений.

Weak Reference, Soft Reference и Phantom Reference

Цікаво, що в джаві є такі класи, які середній дев заюзає раз в 100 років. Але немає банального Pair, Tuple який треба кожен день чи ConcurrentSet...

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

их забили вводить потому что

разработчики джавы считают что эти классы бессмысленны и эти item1 item2 ... itemN не несут никакой информации, а из типов её брать — не тру. По этому такие вещи, по их мнению нужно бойлерплейтить в BuisnerCustomerNameAndBuisnessCustomerPhoneNumber.

item1 item2 ... itemN

Не понял, что ты имел в виду, но пофиг.

нужно бойлерплейтить в BuisnerCustomerNameAndBuisnessCustomerPhoneNumber

Внезапно, если это всего-лишь пара каких-то данных, но вокруг них дофига логики (ну например), то это гораздо лучше, чем Pair. Не с таким именем, конечно.

по их мнению нужно бойлерплейтить в BuisnerCustomerNameAndBuisnessCustomerPhoneNumber.

Не по их, а по вашему и прочих неучей.
Если нужно вернуть несколько значений из метода, то таки нужно создавать объект с бизнес смыслом.
Например, ту муть что вы написали можно было бы назвать CustomerContacts, возможно в зависимости от конкретной задачи название класса будет другим. У такого класса будут понятные поля «имя» и «номер телефона», а не "первый"/"второй" или "левый"/"правый«.

Дженерик пара или кортеж отдаляют код от бизнес области, что не есть хорошо.
Но конечно же дает определенное чуство превосходства, когда ты единстенный кто понимает код типа «a._1+b._1-a._2» :)

У такого класса будут понятные поля «имя» и «номер телефона», а не "первый"/"второй" или "левый"/"правый".

def func: (CustomerName, Phone) => Foo = { case (name, phone) => ???}

Дженерик пара или кортеж отдаляют код от бизнес области, что не есть хорошо.

смешно, на самом деле нет. Отсутсвие хорошей системы типов(мало кто пользуется ими для передачи полезной информации читателю), нормальных операций(map, left map, fold, etc) и синтаксиса(unapply, тип через скобочки) над туплами отдаляет, а сама концепция туплов — не отдаляет. И вообще, во всякой бизнес-логике большую часть этих классов можно спокойно позаменять на туплы с именоваными полями(что собственно и сделали в котлине с дата-классами и в скале с кейс-классами) и ничего особо не развалится.

ты единстенный кто понимает код типа

ну ясное дело что такое сложно читать. Штука повыше (которая в джаве будет лет через 5, если будет) целиком и полностью решает проблему _1 _2 _3. По настоящему сложно читать вот такое: annotatiomania.com, ну и всякий fizz-buzz который неизбежно появляется в процессе написания ооп-аппа, типа классов где логика размазана тонким слоем по иерархии классов.

Самое интересное, тот Джун, который выучит это все, через год работы не вспомнит и половины, т.к. уже было сказано, в работе не используется.

через год работы не вспомнит и половины

Через рік вчорашній джун буде дрючити молодняк тими самими питаннями, коло замкнулось :)

TreeMap
За 15 років жодного разу не користувався.

Сразу видно «веб-макака» (или как вы там себя называли) :)
Тримапа и Трисет часто используются во всяких фин-приложениях средней нагружености: задача поиска диапазона.
Другой вопрос: назачем это джуну?

HashMap приводит значения в корзине к дереву для оптимизации доступа начиная с определенного количества коллизий, но не всегда, а при каком условии
Нашо, нашо, НАШО мені це знати? Нашо це питати?

Чтобы проверить как вы читали джава дайджест ДОУ :)

Тримапа и Трисет часто используются во всяких фин-приложениях средней нагружености: задача поиска диапазона.

Давайте заради фану — зробіть серч в проекті по TreeSet і скажіть скільки разів він у вас зустрічається?

Давайте заради фану — зробіть серч в проекті по TreeSet і скажіть скільки разів він у вас зустрічається?

Доступа к коду сейчас нет (но в 1 месте точно был трисет).
По ощущениям, такие задачки вылазят где-то раз в __6 месяцев__, если очень повезет то раз в 3 месяца :)

UPD. У вас 1 раз github.com/...​reeMap&unscoped_q=TreeMap :)

Тримапа и Трисет часто используются
часто используются
часто
в 1 месте точно был трисет
часто
в 1 месте

Ок.

Не забудьте свого наступного джуна про трімапи спитати, а потім ще хай відбалансує червоно-чорні дерева, а то собєс буде неповноцінним :)

Тепер порахуй ratio до HashMap.

А зачем?
Ты б еще предложил ратио к String посчитать :)

Тримапа и Трисет часто используются

6 штук на проект це не часто.

Я порахвував — в мене 1 юзедж на проекті для того шоб результати в репорт посортованими виводити.

До речі правильне питання не про саму трімапу а про те нашо воно треба. А треба воно пушо це стандартна реалізація SortedMap.

Так шо я набрехав шо TreeMap не потрібно знати, потрібно знати шо є колекції які самі себе сортують, просто я забув що воно таке лол.

правильне питання ... SortedMap....потрібно знати, шо є колекції які самі себе сортують

А вот здесь ты прав.
Но давай представим, что ты взял на работу джуна, который вообще об этом не знает. Может он еще и застенчивый, и не может выдавить из себя вопрос. И шо ты скажешь, когда увидишь, что он сидит третий день над таской где нужно вывести посортированные айтемы в жсон аррей и плачет над дебагом самописного корявого баблсорта?

стек, куча, как с ними организована работа в Java (общие принципы);
Не потрібно знати в реальній роботі.

Нужно иначе в принципе не сможешь понять как потоки работают с объектами. А, ну да, ты ж сам говоришь, что многопоточностью не пользовался.

многопоточность: понятия процесса и потока...
Так само не потрібно.

То, что тебе многопоточность не была нужна для круда, не значит, что она никому не нужна.

За 15 років жодного разу не користувався.

Опять ты чем-то не пользовался :)

еще больше многопоточности...
...яку ви ніколи не будете використовувати

Никогда не пользовался, и вот опять ©

класслоадеры и их иерархия. Ситуация: getClass у двух классов возвращает одно значение, во время каста одного к другому происходит ошибка
SOOOOOOOOQA ))))))))))))))))))))))))

А вот понимание работы класслоадеров полезно, были случаи когда пригождалось. Да, да, знаю, ты не пользовался :)

після таких запитань хочеться
а) встати і вийти

Трай-кеч-файнали ты тоже никогда не пользовался? ))) или такая реакция, потому что сам не помнишь правильные ответы? ))

з натяжкою ще можна сказати шо воно якось треба

Ну наконееец-то!

А вот понимание работы класслоадеров полезно, были случаи когда пригождалось

Один раз за всю кар’єру допомогав джуну розбиратися чому класс приходить з пустими DI полями хоча по всім ознакам мав би приходити заповненим. Джун довго колупався і не міг зрозуміти в чому проблема і покликав на допомогу, а я вже як стріляний горобець знав що WebLogic тримає окремі класслоадери для вебу та для того що тоді називалося app і ми просто не в тому порядку викликали шось. Розібралися за 10 хв.

Це єдиний раз коли мені треба було реально знати шо таке класлоадери і так далі.

За 15 років.

Я не кажу шо ці знання не потрібні взагалі, я кажу шо немає ніякого сенсу питати їх в джуна. Практичної користі від того не буде взагалі.

О-хо-хо, друже, де ти таких джунів в природі бачив? :)

Це не я бачив, це таких шукають)
Але якщо чогось джуну знати не потрібно, то кажіть, подискутуємо. Саме для цього додав градацію.

а в реальном мире студент после среднего вуза кое-как накалякает пару классов)

Залежить від кафедри, вуза, студентів... Є групи, де після 3-го курсу більше половини студентів на очці вже працюють. Є такі, де не працює ніхто.

Хорошо, если в реальном проекте, на который возьмут джуна, будет использоваться хотя бы половина списка технологий, описанных выше.

А сама статья — довольно интересная. Ждём продолжения.

Неможливо все вивчити теоретично, не роблячи власних проектів

Крута стаття. Зараз вивчаю Джаву для повноцінного повного стеку і дуже пощастило таку дорожню карту отримати, дуже дякую.

З нетерпінням чекаю на другу частину

Только это roadmap на сеньора, и несколько далекого от большинства корпоративных задач, скорее для теоретика :)

Статья вообщем то не плохая, но кажется, большинство новичков дойдя до середины убегут и будут рвать на себе волосы.

будут рвать на себе волосы Пойдут на Фронтенд 😄...

Особенно после concurrency.

Подписаться на комментарии