Запитай в рекрутера

Java є однією з найпопулярніших мов програмування. Незважаючи на те, що її перша версія вийшла в 1996 році, мова продовжує розвиватися. На мою думку, це один з основних факторів (крім, звісно, всіх інших плюсів, які надає Java), які підтримують інтерес до цієї мови програмування. З одного боку, завдяки такому поважному «віку» на Java було створено багато проєктів,  котрі зараз перейшли в категорію “legacy” і потребують розробницької підтримки. З іншого боку, постійно зростає кількість нових проєктів на Java. Завдяки цьому ринок Java вакансій в Україні і у світі є таким великим.

Ще один фактор - Java Virtual Machine використовується як середовище для виконання інших мов програмування. Найвідомішими з них є Scala, Kotlin, Groovy, Clojure. Зараз все частіше зустрічаються вакансії для Java програмістів з елементарними знаннями однієї з цих мов. Особливо популярною комбінацією є Java + Scala. Компанії готові витрачати ресурси на навчання програмістів мови Scala за умови упевненого володіння Java.

Але ж якими навичками і знаннями має володіти Senior Java/Scala розробник? Розділимо ці знання на категорії і розглянемо кожну категорію окремо:

  • Java (Scala) ecosystem knowledge;
  • General software engineering skills;
  • Soft Skills.

 ТОБІ МОЖЕ
БУТИ ЦІКАВО…
Autonomous Driving проєкт для Java/Scala розробників

Java (Scala) ecosystem knowledge

Перше і очевидне: Senior Java/Scala розробник повинен дуже добре знати самі мови програмування Java і Scala, популярні бібліотеки і фреймворки.

Обов’язковим є володіння інструментами для автоматизації, управління, компіляції та збірки програм, такими, наприклад, як Maven, SBT (Scala Build Tool). Водночас незнання якоїсь конкретної технології, бібліотеки чи фреймворку не є мінусом девелопера. У наш час нові бібліотеки/фреймворки з’являються все частіше; створюються нові версії існуючих, з додатковими функціями. Senior розробнику зовсім не потрібно детально знати кожну з них. Перевагою досвідченого розробника якраз і є те, що він здатен швидко опанувати нову технологію і почати застосовувати її на проєкті, вивчаючи її функціонал детальніше вже в процесі розробки.

Другим важливим пунктом є знання JVM (Java Virtual Machine), JMM (Java Memory Model) і Java Memory Management. Сюди ж я відношу навички Java Troubleshooting. Вважаю цей пункт одним з найскладніших насамперед через те, що девелопер будь-якого рівня не так часто зустрічається з цим на практиці. І все ж розуміння того, що відбувається в runtime, як працює ClassLoader і Garbage collection, очікується на посадах Senior рівня. Я особисто вважаю це виправданим: кому ще, як не Senior девелоперу, вирішувати проблему з NoSuchMethodError або OutOfMemoryError?

Третім пунктом я виділяю знання JDK/Scala internals - не тільки на рівні API, але й того, що відбувається «під капотом». Це допомагає Senior Java/Scala девелоперу прийняти правильне рішення, яку ж реалізацію того чи іншого інтерфейса використати в конкретному випадку.

Окремо хотілося б виділити знання Collection Framework. Важко зустріти програму, де він не застосовується. Розуміння складності різних операцій над колекціями дозволяє писати ефективніший код з точки зору швидкодії та/або пам’яті.

Java multithreading concurrency також є популярною темою для запитань на інтерв’ю. Досить часто про це можуть запитувати, навіть якщо напряму це не використовується на проєкті. Справа в тому, що програма рідко працює в одному потоці, і такі знання можуть знадобитися при виникненні проблем зі швидкодією або для звичайного debug на віддаленому сервері, де немає можливості відкрити JMX порти.

 ПЕРЕГЛЯНЬ ВІДКРИТІ
ВАКАНСІЇ ДЛЯ…
Java та Java/Scala девелоперів

Що ж до Scala розробників, то велика частина їхніх проєктів пов’язана з розподіленими обчисленнями і Big Data. Тому поширеною вимогою є знання Spark, Flink, Akka. З найчастіше вживаних бібліотек варто згадати Scalaz і Cats.


General software engineering skills

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

Java в першу чергу була розроблена як об’єктно-орієнтована мова програмування. Scala також підтримує цю концепцію. Тому перше, про що хочеться згадати - це знання ООП і вміння використовувати його на практиці. Важливими є розуміння і застосування паттернів проектування, а також SOLID принципів.

Java підтримує концепцію функціонального програмування, починаючи з версії 8. В Scala ж парадигма функціонального програмування закладена з першої версії. Останнім часом в Java/Scala застосунках використовуються обидві концепції: ООП і функціонального програмування. Для Scala це виправдане з огляду на використання існуючих бібліотек, спроєктованих в ООП стилі і реалізованих на Java. Тому наступним пунктом є знання функціонального програмування.

Незалежно від мови програмування, для Senior девелопера є важливим знання комп’ютерних наук - насамперед, алгоритмів і структур даних. Але варто зауважити, що ситуація сильно відрізняється в Україні і у європейських країнах або США. В Україні подібних вакансій не так багато. Тому, навіть якщо розробник не знає алгоритми і структури даних або знає їх поверхнево, шанси отримати роботу Senior девелопера у нього все одно досить високі у порівнянні з США (принаймні, станом на момент написання статті).

Наступними важливими пунктами є навички проєктування систем (System Design), знання best practices і їх застосування. Сюди ж віднесемо і досвід хмарних обчислень, які останнім часом вимагаються майже в кожній Java/Scala вакансії (і не тільки).

Останнє, про що хотілося б згадати у цій категорії, це навички використання інтегрованого середовища розробки. Це може здатися банальним пунктом, але дуже часто зустрічаються девелопери, які не використовують IDE ефективно. Вміле користування «гарячими клавішами», рефакторінг за допомогою IDE значно підвищують ефективність роботи. На практиці зустрічаються програмісти, які підлаштовують текстовий редактор vim під себе і завдяки цьому працюють ефективніше, ніж деякі користувачі IntelliJ IDEA, хоча остання є набагато простішою у використанні.

 ТОБІ МОЖЕ
БУТИ ЦІКАВО…
25 років Java, або Як це - бути Java розробником?

Soft Skills

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

Перше - це вміння працювати в команді. Хтось може спитати: «А що, можна не вміти працювати в команді?!». Насправді, можна. Одразу згадується випадок з практики, коли один з Senior інженерів «не визнавав» нових членів команди (незалежно від їхнього рівня) перші кілька місяців. Це «невизнання» виливалося в ігнорування повідомлень в месенджері (команда була розподіленою). Якщо заглиблюватися в причини, то, напевне, таку поведінку можна пояснити небажанням ділитися знаннями про сферу, яку інженер покриває. Але це погана стратегія в перспективі. Набагато краще, якщо ти ділишся знаннями і водночас вчишся сам. Тому на співбесідах нерідко можуть запитати про те, як ви ставитеся до парного програмування. Таким чином інтерв’юер сподівається зрозуміти, наскільки людина є командним гравцем (хоча відповідь на це запитання може і не розкривати навички командної взаємодії повною мірою).

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

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

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

Звичайно, у ході роботи над проєктами трапляються і складніші ситуації. Тут можна порадити методику, яку я намагаюся застосовувати на практиці. Це зовсім не є обов’язковою навичкою Senior інженера (якщо він водночас не Team Lead), але, як то кажуть, «nice to have». Ця методика називається «Ситуаційне лідерство» (Situational leadership theory). Вона розрахована насамперед на менеджерів і Team Lead-ів, але я вважаю, що її принципи можна і потрібно використовувати в технічній комунікації з колегами, особливо, якщо це, наприклад, нові колеги, які проходять onboarding.

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

До будь-якої з трьох категорій можна додати ще чимало пунктів, але я намагався виділити декілька основних, на які я звертаю увагу, співбесідуючи Senior Java/Scala девелоперів. На мою думку, це мінімум, котрим  повинен володіти Senior Java/Scala Engineer. Звичайно, додатково слід враховувати специфіку проєкту/компанії - для кожного вона буде своя.

Підсумок

Так чи інакше, тримати всі знання світу в голові, навіть якщо це один тільки світ ІТ, не вдасться. На щастя, зараз існує багато інструментів, які дозволяють швидко знайти потрібну інформацію або нагадати щось, якщо ви це забули. Користуватися такими інструментами Senior інженеру не соромно, а, навпаки, необхідно: це підвищує продуктивність. Закінчу статтю твітом Tim Dierks (Director Of Engineering – Google) на підтвердження цього: