Співбесіда на java-програміста (java-developer interview)

Це продовження циклу статей про співбесіду на java-програміста:

Java-related технології і фреймворки народжуються і вмирають, а без знання java core далеко не заїдеш. Як можна знати Hibernate, але не знати JDBC і SQL? Як можна розбиратися в Spring MVC або Struts, але при це плавати в сервлетах? Як можна користуватися блокуючими чергами, екзекьюторамі і локами, але при цьому не розуміти, як працюють wait / notify? Для мене це досі залишається загадкою.

З іншого боку, мене іноді дивують питання співробітників, які вони задають кандидатам. Навіщо питати про Vector і Hashtable - на дворі вже скоро 4-е тисячоліття. Або "навіщо потрібен UNION"? Так і хочеться відповісти - для SQL-ін'єкцій. На рахунок патернів проектування і UML я взагалі мовчу - невже досі не награлися? Але це ще півбіди. Іноді інтерв'юери самі допускають досить грубі помилки. Про це трохи пізніше.

Питання співбесіди по Core Java

Для позицій типу Senior ці питання можна пропустити. Але іноді все ж варто перестрахуватися.

1. Модифікатори в Java.

Особливо глибоко питати не потрібно - коротко про призначення і варіантах використання. Можна запитати про контекстах використання цих модифікаторів (клас / поле / метод). Детальні питання про модифікатори доступу, розширенні модифікаторів при спадкуванні, перевизначення і приховування методів, модифікатор abstract і final для класів / методів краще залишити для питань по ООП в Java. Детальний знання модифікаторів synchronized і volatile можна перевірити в питаннях по многопоточности.

2. Ієрархія колекцій в Java.

Розглядаємо Collection, Set, List, Queue, Map і їх основні реалізації. Можна в принципі запитати про методи, які є в інтерфейсі Collection, але краще не треба. Варто поцікавитися, якими колекціями людина користувалася, але знову ж таки без фанатизму. Нагадую, Vector і Hashtable (і Stack до речі теж) - минуле століття, тим більше в разі роботи з legacy кодом завжди можна подивитися сорци. Ще можна поговорити про масивах, а наступний код може привести до цікавого діалогу:

З приводу властивостей і контракту equals / hashCode запитати варто і про поломку колекцій теж, але сильно не захоплюйтеся, так як це може привести до улюбленого питання більшості інтерв'юерів про пристрій HashMap. У свою чергу це безпосередньо веде нас до питань про структурах даних, алгоритмах і їх складності. Моя думка з цього приводу - з алгоритмами добре знайомі Олімпіадники і ті, у кого в університеті це викладалося на належному рівні. Мені, наприклад, в цьому плані не пощастило ні з тим, ні з іншим. І розбирався в алгоритмах / АТД по ходу своєї роботи тільки тоді, коли виникали відповідні завдання або просто був час і бажання почитати і усвідомити. В результаті - quick sort, merge sort, radix sort напишу; hash map, linked list, binary search tree напишу; semaphore, thread pool, blocking queue теж напишу. Щось ще потрібно? Окей, напишу.

Що робити, якщо шило все ж заважає і хочеться хоч раз в житті показати свої найглибші знання в області алгоритмів і структур даних і без того наляканому кандидату. Почнемо з того, що такі питання варто задавати тільки senior розробнику і тільки якщо завдання такого плану зустрічаються на проекті досить часто (що зустрічається досить рідко). Так вже й бути, запитуйте про пристрій HashMap і швидкості пошуку, про влаштування LinkedList і складності операцій над ним. Можна попросити, щоб людина своїми словами розповів, звідки в quick / merge sort береться log2 n. Можна ще якусь задачу алгоритмічну задати. Але пам'ятайте, можливо з цією людиною вам ще доведеться працювати в одній команді.

3. Ієрархія винятків і помилок.

Тут як би все зрозуміло, але буває, що люди не знають елементарних речей. Варто запитати про ієрархію, про checked і unchecked помилках / винятки, коли використовуються ті чи інші, як і коли їх потрібно обробляти. Можна навіть почати невеликий діалог з приводу OutOfMemoryError. Якщо людина знайома з JDBC, можна поговорити про SQLException і поцікавитися, воно chekced або unchecked і нормально чи це на думку кандидата.

Відповідь на це питання можна знайти тут

4. Вкладені класи в Java.

Деякі вважають, що це питання не потрібен. Особисто я так не думаю. Варто запитати про класифікацію, варіантах використання, про порушення інкапсуляції і найцікавіше - навіщо вони потрібні на думку кандидата.

Питання по ООП в Java

Як продовження, на цьому ж прикладі можна поговорити про розширення / звуження типів в аргументах переобумовлених методів в разі, якби в Java список формальних параметрів не входив би в сигнатуру методу.

6. Паттерни проектування

Нагадую, не варто глибоко питати про патернах проектування. І ні в якому разі не повчайте кандидата розповідями про те, "наскільки вони корисні" і "як їх правильно реалізовувати". До речі, з приводу краси / зрозумілості коду і швидкості його написання мій друг каже наступне: "Щоб уміти круто хачіть на Java, потрібно дохера хачіть на Java".

Каталог патернів проектування можете знайти тут

Питання співбесіди по многопоточности в Java

7. Нить в Java.

Хочу присвятити цій темі цикл статей: одним абзацом не звільнишся. Якщо коротко, запитаєте, навіщо потрібна багатопоточність, що таке монітор об'єкта, запитаєте про модифікатори syhcnronized і volatile, методах wait / notify / notifyAll, а так само про пакет java.util.concurrent. А наступний фрагмент коду повинен привести до досить цікавого розмови:

Питання, пов'язані з базами даних

Для початку варто задавати питання по ANSI SQL. Далі, в залежності від СУБД, що використовується на проекті, можна питати про важливі відмінності її діалекту. Отже, нехай людина розповість про основні елементи баз даних - таблицях, процедурах, функціях, констрейнтів і т.д. Про констрейнтів можна розпитати трохи докладніше. Варто поцікавитися, як людина розуміє null в базах даних. Переходьте до агрегатних функцій і про те, як вони працюють з null, не забудьте про group by і having. Можна дати пару маленьких задачок на цю тему (див. Завдання 1-2 нижче). Розпитайте про типах join і дайте пару задачок (див. Завдання 3-4 нижче).

Завдання 1. Дана таблиця T з колонкою A цілого типу, яка містить значення 10, 20, 30, null. Чому дорівнюватимуть результати виразів "AVG (A)" і "SUM (A) / COUNT (*)"?

Завдання 2. Дано таблицю T з колонкою A цілого типу. Напишіть запит, який поверне всі позитивні значення зустрічаються в таблиці більше одного разу.

Завдання 3. Дано таблиці T1 і T2. У кожній є колонка A цілого типу. Значення в першій таблиці - 1, 2, а в другій - 2, 3. Що повернуть запити з inner join, left / right / full outer join і cross join виду "select T1.A, T2.A from T1. Join T2 on T1.A = T2.A ".

Задчие 4. Дано 2 таблиці з колонками A цілого типу. Напишіть запит, який поверне всі значення колонки А з першої таблиці, для якої немає відповідності в колонці A другий.

Тут теж без особливих збочень. Запитайте про Connection, Statement, PreparedStatement, CallableStatement, ResulSet, навіщо кожна з цих сутностей потрібна. Можна поцікавитися про те, чим вони є: абстрактними классамм, конкретними класами або інтерфейсами і чому.

Ще питання - як створити з'єднання в JDBC, яким чином краще додавати велику кількість записів в таблицю, ну і обов'язково про транзакції і autocommit. Мало не забув - питання про рівні ізоляції транзакцій вважаю як мінімум дивним - в наступний раз, коли вирішите його ставити, згадайте, скільки разів з рівнями ізоляції стикалися особисто ви.

Читайте на блозі детальний туторіал по JDBC.

Питання співбесіди з веб-програмування

Для початку треба запитати про HTTP в цілому. Що таке хедери запиту, які взагалі типи запитів бувають, що таке HTTP Status Code.

Далі потрібно запитати про клас HttpServlet, в якому вигляді можна працювати із запитом і відповіддю. Що таке сесія (HttpSession) і як її отримати. Не забудьте запитати про ServletFilter і варіанти їх використання.

Організм вимагає сну. Статтю завершу через деякий час. Удачі всім.

А ви ніколи не задаєте питання по речах, які "кожен поважаючий себе розробник відмінно знає", але мало хто може обгрунтувати? На мій погляд, іноді це може показати, наскільки людина любить і вміє займатися сам дослідженнями (а значить, підвищує свій рівень), + наскільки він довіряє своєму досвіду, наскільки постам в блогах і форумах, наскільки документації, книг і ісходникам. Правильної відповіді тут не може бути, тому що в будь-який таке питання можна заглиблюватися нескінченно. Але в міру поглиблення це показує те, наскільки глибоко кандидат розуміє ті чи інші аспекти.

Наприклад - чи швидко працює Reflection в Java? Будь-який студент знає що повільно? Чудово, а чому? Чи не хмикати, спробуйте описати детально процес прямого виклику методу в JVM (може кандидат згадає про invokevirtual, наприклад, і інші байткод), і як виконується виклик через reflection? Через JNI і вимагає перемикання з JVM-коду в нативний і назад? Відмінно, а в чому полягає перемикання контексту і чому вона дорого (до речі, а дорого - це скільки?). А ви знаєте, що виклик через refledction можна дуже сильно прискорити, якщо перед ним викликати setAccessible (true)? А ви знаєте, що для часто планування для створюється Java-stub, через який в подальшому виконуються прямі виклики?

- Якщо кандидат дійшов до сюди - робіть оффер

Дякую за статтю, Костя, і хотілося б запитати ... як на твій погляд, чи є шанс пройти співбесіду на посаду junior'a зі знанням тільки core java і SQL? (Плюс ООП і патерни)

2 sasha: краще порозбирали хоча б на найпростішому рівні з технологіями, які зараз "в моді". Зайвим точно не буде. Тим більше з такими базовими знаннями на джуніора точно візьмуть без проблем.

Ще не завадило б вибрати собі для початку деякий напрямок і порозбирали трохи глибше в ньому. Природно, потім спеціалізацію можна буде змінити. Головне, щоб зараз ви змогли зацікавити роботодавця. приклади:

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

У моїй практиці питання на співбесіді слабо співвідносилися з тим, чим доводилося займатися потім. Згодом це просто починає дратувати. Навіщо в вакансії перераховувати 22 технології, якщо доведеться займатися двома-трьома? Навіщо на співбесіді питати про будь-яку спірну муть? Давати просто дурні приклади. Для стрес-тесту кандидата?

Самий реалістичний варіант - поговоріть з кандидатом про те, що він реально робив у минулому, які проблеми бачив і як вирішував. Самі (!) Зіставте почуте з тим, що йому доведеться робити і оціните ризики. Багато "незнання" насправді дуже дешеві в сенсі їх вирішення. Наприклад, ціна питання може бути 2 дня за книжкою. Це напружить компанію? Скоріше немає. Але якщо людина в принципі не вміє абстрактно мислити, то чи потрібен він компанії на програмістської посади?

Так ось таке питання: наявність Oracle Certified Java Programmer (колишній SCJP) отриманого за півроку до співбесіди задовольнить цікавість роботодавця або кожен раз доведеться заново згадувати матчастину?

Спочатку про себе, так вийшло що в своїй практиці писав починаючи від ASM закінчуючи @Formula, і Lotus Script для Lotus Notes, в тому числі і Java, С ++. Доводилося як підбирати так і працювати в командах. Зараз виріс до ПМ-а.

Так ось що для себе визначив, з негативу в пошуках кандидатів:

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

2) "Гаджетоманія" - перша і основна проблема будь-яких проектів. Поясню, манія спробувати щось новеньке, новенький сирої модуль, БД, технологію итд ... завжди майже з 100% вірогідністю шкодить проекту, призводить до необгрунтованих витрат, нестабільності додатки, і головного болю у цілих відділів, і компаній. Крім випадків коли це обгрунтовано природно, але знову таки застосовуючи нову технологію свідомо йдемо на ризик.

Що для себе позитивного зазначив:

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

Для чого всі ці питання на співбесіді? Таке відчуття, що менталітет у нашого брата ніколи не зміниться. Хто там з роботодавців .... Ось Вам нормальне доросле рішення! Підготуйте нормальні тести на папері з тих питань, які реально застосовуються у вашій практиці і штовхайте кандидатам! Якщо відсотків на 80-90 підходить, тоді вже і базікайте про "любові" і інші достоїнства! Або скористайтеся нормальним адекватним онлайн сервісом для вирішення завдань. Не будьте минулим століттям. Та й кандидатам буде з вами легше і приємніше спілкуватися, а то таке відчуття, що постійно на співбесідах доводиться мірятися одним місцем, у кого воно більше, перепрошую за прямоту)). З приводу цікавих проектів, то все що було цікавого вже давно не новина, все вже зробили і реалізували. Назвіть хоч один проект, який можна назвати цікавим? Чого програміст середнього рівня не зможе реалізувати і вивести на екран? Або сеньйор? Завдання різного рівня вирішують люди відповідні. Сеньйори вирішують серверні завдання, мідл клієнтські. Ну а Джуніор будують сервлети і малюють інтерфейси. Все на своїх місцях. Так що Господа роботодавці, викиньте весь цей мотлох зі своєї голови з питаннями і дайте знають хлопцям заробляти Вам на хліб.