Поради сеньйорів: як прокачати знання junior Java

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

Павло Желнов , Senior Java Developer, 18 років досвіду розробки Java:

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

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

Документація класів Java

Найбільш достовірне джерело інформації, для чого служить той чи інший клас, які проблеми вирішує найкраще. Творці мови постаралися на славу, суттєво спростивши нам життя!

Книги

Чудовий засіб, звідки ми черпаємо корисну інформацію. Якщо дозволяють фінанси — краще купувати паперовий варіант, його більш приємно гортати, робити позначки. Книгу треба не просто читати, як художній роман Стівена Кінга. З книгою потрібно ретельно працювати, практично експериментуючи, долаючи всі труднощі й осмислюючи кожен крок.

На моєму столі лежать всього чотири:

Для початківців варто перегорнути Thinking in Java (Bruce Eckel)

Гуглите і знайдете

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

Практика

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

Співбесіда

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

Рекомендую також перед співбесідою переглянути ресурси, схожі на цей і перегорнути сторінки, які стосуються Java, Hibernate, Spring.

Ой, мені треба знати ще одну мову?

Не все впирається в майстерне оволодіння мовою Java. Ребром стає питання знання англійської! Коротко, як можна прокачатися в цій сфері:

Пам'ятайте, що вам часто доведеться ділитися своїми ідеями, сприймати ідеї інших — і все це на чистому англійському.

Становлення самурая

Я б ніколи не став тим, ким зараз є, якщо б не мої вчителі. На самому початку я черпав всю інформацію з книг, але код, який писав, був, як його ще називають, з душком. Я не знав, як писати краще, красивіше і більш виразно. Мене цього навчили колеги.

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

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

Смахивайте іржу з мозку. Мозок — це зброя. І воно повинно бути завжди заряджений. Тримайте це зброя у формі і воно вас не підведе:
www.codewars.com
www.codingame.com

Будьте проактивними і ваш розвиток буде стрімким і впевненим!

Андрій Паславський , Team Lead, 13 років досвіду розробки Java:

Як «увійти в ІТ» є вже 100500 статей з купою рекомендацій і порад, посилань на курси, школи тощо. На жаль, на даний момент склалася така ситуація, коли програмістів не вистачає, але при цьому у рекрутерів лежать стопки з резюме потенційних кандидатів, які хочуть увійти в ІТ». Грубо кажучи, їх три: ті, хто добре пройшли стажування від компанії або закінчили школу і отримали рекомендації; ті, хто закінчив школу, курси, стажування; і всі інші. В першу чергу, коли відкривається позиція Junior, рекрутери гортають першу папочку, можуть заглянути в другу, а до третьої практично ніколи не дістаються.

Мені здається, основне питання не в тому, як увійти в ІТ. Основне запитання: чи усвідомлюю я, що це за робота і як виділитися на тлі всіх інших?

Я працював зі студентами та просто з хлопцями, які хочуть стати програмістами. Але буквально одиниці уявляють, що таке бути розробником, що означає розробляти софт, а не писати лабораторну роботу, що значить працювати в команді?

У цьому плані допоможуть курси стажування, різні workshops та workgroups. Потрібно вміти працювати в команді. Тут вовки-одинаки нікому не потрібні (якщо тільки ви не Лінус Торвальдс, Бьерн Страуструп, Мартін Фаулер). Спробуйте скооперуватися з вашим сусідом і написати калькулятор разом (не треба придумувати МЕГА проект, просто калькулятор). Це виявиться в рази складніше і довше, ніж ви б це зробили самі. Це і буде маркер: ви ефективніше один, ніж в групі. Працюйте над собою, над своїми навичками комунікації та кооперації. Вчіться працювати в команді.

Скільки б ви не працювали в ІТ — завжди будете вчитися. Не вийде пройти курси «столяра» і піти працювати на завод». У кожного мізки працюють по-різному, тому ви повинні самі знайти форму навчання, яка для вас буде максимально ефективною (я не можу сказати, що для вас буде краще: пробувати писати свої Pet projects або проходити online курси один за іншим). Вчіть вчитися. Навички самонавчання необхідний в нашій індустрії, т. к. і через 10 років ви будете продовжувати вчитися.

Ходіть/їздите на конференції, вони потрібні в першу чергу для Junior. Так, може бути дорого, але це дасть розуміння того, що зараз в тренді; зможете завести корисні знайомства і зануритися в світ людей, які займаються ІТ вже роки/десятиліття. Може бути десь зустрінете людину, яка скаже, що у нього є робота для вас. І взагалі це fun, потрібно отримувати задоволення від того, чим ви займаєтеся.

Заведіть свій аккаунт на GitHub і викладайте туди свої Pet projects. Це важливо! Роботодавець зможе оцінити, з якими мовами працюєте, які технології вивчаєте і як розвивається. Він зможе запостити якісь баги, причіпки, рекомендації і подивитися, як спілкуєтеся, як реагуєте і як працюєте над помилками. Вас можуть навмисно спровокувати — вчіться працювати з клієнтами, вони бувають різні». Здоровий гумор тут вітається.

Також дуже важливо розуміти різницю між розробником і програмістом. Погуглите про це, в інтернеті вже написано багато статей на цю тему. Але окремо я хочу виділити навичка «транспонування свого досвіду». Неможливо засвоїти і вивчити все, але можна навчитися проводити аналогії і застосовувати свій досвід в області, де ніколи не працювали. Потрібно навчитися аналізувати і бачити загальні ідеї. Цьому навчитися складно, але спробуйте почати з patterns: Java Patterns, Design Patterns, Enterprise Patterns. Це багаторічний накопичений досвід, який вже розклали по поличках для вас. Не нехтуйте цим!

Зробіть ІТ своїм хобі, працюйте над собою в цій області факультативно. Так, компанія і проект, де будете працювати, визначать вже конкретний стек технологій і буде зрозуміло, що потрібно вивчати. Але не зупиняйтеся на цьому. Як тільки станете виконувати свою роботу від паркану до паркану» — в якийсь момент перестанете розвиватися, а ІТ-індустрія не любить цього. Через деякий час не будете котируватися на ринку і втратите кваліфікацію.

Андрій Слободяник , Tech Lead, 11 років досвіду розробки Java:

Перше, чого має навчитися навіть не розробник, а взагалі будь-IT-фахівець — це вміння друкувати наосліп . Так, більшу частину часу програміст читає спечу/код/доки, в перервах думає, а не барабанить по клавішах, аки хакер у фільмі. Так, в сучасних IDE є автопідстановка. Але, як би там не було, айтішник, постійно переводить погляд між клавіатурою і монітором, виглядає дивно і навряд чи працює ефективно. Не всі тренажери однаково корисні, головний принцип — покласти правильно руки і освоювати всю клавіатуру відразу, рекомендую KeyTo/VerseQ.

Другою умовою зростання я бачу процес Code Review . Недостатньо, щоб код просто працював, для джуніора (і не тільки) потрібен погляд з боку з приводу підходів, компонування коду, фреймворків і т. д. Інакше є ризик швидко зловити ефект Даннинга-Крюгера. Технічно небезпечні місця також допоможуть відловити статистичні аналізатори коду — FindBugs, Sonar etc.

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

Приклад з Java:

public void congrats() {
 Date today = new Date();
 if (today.getMonth() == 1 && today.getDay() == 1)
 System.out.println("Happy New Year!");
}

Тут баг, але куди більша проблема в тому, що незрозуміло, як перевірити цей метод. Інша крайність — це написання занадто «відкритих» класів. Знайти баланс повинен допомогти попередній і наступний пункт.

Четверте. Не копіпаст! А намагатися переиспользовать код. Ідеї, як розбити його на частини, черпаємо в шаблонах проектування .

П'яте. Використовувати існуючі бібліотеки . Задуматися і загугліть, що завдання, наприклад, склеювання рядків через кому, можливо, вже десь вирішена. І на швидку руку кешувати які-небудь результати в Map теж не найкраща ідея.

Шосте. Не генерувати код з допомогою IDE і аналогічних утиліт. Безумовно, він потрібен, але навіщо захаращувати їм вихідні коди проекту? Швидше за все, цю генерацію можна включити в збірку. Наприклад, для getters/setters та інших фіч підключаємо Lombok.

Загалом, намагаємося поменше писати, читати і думати побільше.

Андрій Білицький, Software Architect, 7 років досвіду розробки Java:

Для початку хочу сказати, що позиція Senior Java developer має досить умовний характер, оскільки в різних компаніях і навіть на різних проектах в одній компанії люди на цій позиції можуть мати різний рівень кваліфікації, перелік обов'язків, зарплату і т. д. В даній замітці я хочу вказати на загальні напрямки розвитку і книги, які допоможуть вирости в професійному плані, а не отримати тайтл «Senior». У зв'язку з цим подальші рекомендації будуть носити загальний характер.

Щодо знань : існує матриця компетенцій програміста, її легко знайти в інтернеті, наприклад, тут (1 частина , 2 частина ). Ці таблиці допоможуть приблизно зрозуміти, де ви знаходитесь, і в якому напрямку варто працювати. Список літератури за посиланням дивитися не варто — він там, судячи з усього, для прикладу.

З літератури по Java я б порекомендував «Effective Java» Joshua Bloch — було багато видань, краще брати останнім (начебто є російською) та «Java Concurrency in Practice» Brian Goetz — книга 2006 року, але, на мій погляд, до цих пір найбільш актуальна книга по багатопоточності в Java (наскільки я знаю, не переводилася на російську). За OOP/OOD я б рекомендував почитати GoF (тобто російською) або Head First Design Patterns — оскільки вважаю, що знання патернів для Java-розробника — це must have. А для загального розвитку — «The Pragmatic Programmer» Andy Hunt і Dave Thomas (тобто російською). В ній у форматі невеликих заміток і рад описані принципи і типові проблеми з рішеннями, які в цілому є в індустрії (не дивлячись на те, що книга видана в 1999, більша частина все ще актуальна).

Кейси та корисні поради, на мій погляд, не дуже працюють, оскільки неможливо отримати досвід, самостійно не набивши шишок. Єдине, що можу порадити, — читайте хороші книжки і працюйте по максимуму, любіть те, що ви робите, і тоді все вийде. Це може звучати банально, але я зустрічав розробників з трьома роками досвіду, у яких було більше знань, ніж у фахівців з 10-15 роками досвіду. Все питання в бажанні і, відповідно, тимчасових інвестиції, у тому числі і поза роботи. Удачі!

Євген Хіст , Java Tech Lead, 7 років досвіду розробки Java:

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

Одним з таких проектів є Docker , який за останні роки зробив революцію в збірці, тестування і розгортання додатків. Docker дозволяє «упаковувати» додаток з усім оточенням і залежностями в контейнер. Цей контейнер може бути запущений на будь-якій системі, що підтримує Docker, в рази швидше і споживаючи набагато менше ресурсів, ніж системи віртуалізації. Використовуючи Docker, запуск контейнера з RabbitMQ або Redis для інтеграційних тестів і його зупинка після їх виконання стає тривіальною задачею. Почати знайомство з Docker і його екосистемою можна з безкоштовних інтерактивних браузерних курсів Katacoda . На цьому майданчику також можна знайти інтерактивні курси по системі контролю версій Git , Continuous Continuous Integration і Delivery з використанням Jenkins і системою управління кластером контейнерів Kubernetes .

Spring Boot сьогодні настільки популярний, що якщо ви досі не знаєте, варто ознайомитися. Офіційна документація Spring Boot відмінно підійде для цього.

Крім цих знань кваліфікований розробник повинен володіти навичками проектування ПО. Багато основні принципи і парадигми сформульовані понад 10 років тому і досі залишаються актуальними.

Почати я рекомендую з основ об'єктно орієнтованого дизайну (OOD). В блозі Роберта Мартіна є відмінні статті про принципи дизайну класів SOLID і принципах зв'язності (cohesion) і зачеплення (coupling) пакетів. Більш докладно ці питання Роберт Мартін розкриває в книзі «Agile Principles, Patterns, and Practices in C#». Незважаючи на наявність C# в назві книги, вона буде корисна і Java розробникам.

З виходом Java 8, крім об'єктно-орієнтованого підходу, розповсюдження отримав функціональний підхід. Лямбда-вирази, java.util.Optional, java.util.Stream, java.util.concurrent.CompletableFuture і Flow API (java.util.concurrent.Flow) в JDK 9. Щоб розібратися з цією темою рекомендую цикл статей «An Introduction to Functional Programming in Java 8» . Також набирає популярність пов'язане з функціональним підходом реактивне програмування (Reactive Streams , RxJava , Reactor ). Почати знайомство з цією темою можна з безкоштовною міні-книги від InfoQ «The InfoQ eMag: Reactive Programming with Java» .

Domain-driven design — це ще один набір принципів і підходів до проектування ПО, який заслуговує уваги розробників Java. Почати знайомство з цією темою можна також з безоплатної книги від InfoQ «Domain Driven Design Quickly» . Більш детальніше про цю тему можна почитати в міні-книзі Еріка Еванса «Domain-Driven Design: Tackling Complexity in the Heart of Software».

Говорячи про проектування ПО не можна не згадати Мартіна Фаулера і його книги. В блозі Мартіна можна знайти безліч корисних статей про проектування ПО. Також рекомендую до прочитання його книги «Patterns of Enterprise Application Architecture» і «NoSQL Distilled: A Brief Guide to the Emerging World of Polyglot Persistence».

Багато корисних статей можна знайти на IBM developerWorks . До таких можна віднести досить старий, але все ще актуальну серію статей про стратегії роботи з транзакціями . Також про операції в Java можна прочитати в безкоштовну книгу від InfoQ «Java Transaction Design Strategies» .

«The Data Model Resource Book» — це серія книг в 3 частинах про проектуванні, яка заслуговує уваги. «The Data Model Resource Book, Vol. 1: A Library of Universal Data Models for All Enterprises», «The Data Model Resource Book, Vol. 2: A Library of Data Models for Specific Industries», «The Data Model Resource Book Volume 3: Universal Patterns for Data Modeling». Звичайно, не обов'язково один в один використовувати моделі даних, описані в цих книгах. Знайомство з ними дозволить краще зрозуміти принципи проектування моделі даних, запозичити якісь прийоми і уникнути помилок.

Говорячи про професійний розвиток не можна не згадати YouTube. Часто, користуючись пошуком, можна знайти корисні відео з доповідями і лекціями. Хочу порекомендувати 2 канали, на яких кожне відео заслуговує уваги: Devoxx Conferences і GOTO Conferences .

І, наостанок, лайфхак. Користуйтеся шпаргалками DZone Refcardz , щоб освіжити в пам'яті бібліотеки, фреймворки та підходи. Наприклад, перед співбесідами.

Євген Годун , Senior Java Developer, 5 років досвіду розробки Java:

В кар'єрі програміста я б виділив три основних вектора розвитку, в бік яких треба було почати працювати ще вчора, так що після прочитання відразу берися до справи!

Англійська мова. Як і навіщо?

Ну, по-перше, Java написана англійською мовою. Якщо серйозніше, то на stackoverflow , який буде вашим самим відвідуваним сайтом на перших порах, набагато більше відповідей на англійській. Плюс документація до всіх фреймворкам англійською. Плюс книги не так швидко переводяться, як хотілося б. Плюс, якщо у вас розподілена команда, то хлопці з Америки досить рідко спілкуються російською (у мене є такий знайомий американець, який закінчує всі мітинги фразою «Dobriy vecher». Але це швидше виняток). Тому тут схалтурити не вийде.

У багатьох компаніях є курси англійської для працівників (це хороше запитання на співбесіді, коли hr-и питають, чого б тобі хотілося дізнатися про нас). З додатків я б порадив Lingualeo , і так як найкращі інвестиції-це у себе, я б порадив придбати преміум аккаунт, 22$ в рік не такі великі гроші. Ну і після досягнення певного рівня — читання книг в оригіналі, а останній level — читання професійних книг в оригіналі. Далі тільки Шекспір і Eminem в караоке.

Вміння програмувати. Як і навіщо?

Може вам потрібно буде з'їздити у відрядження до Америки, і ви не будете знати що таке червоно-чорне дерево . Або (велика ймовірність) на співбесіді вас будуть питати про алгоритм Дейкстри і його складність. Або (найменша імовірність) у вас буде проект, на якому вам знадобляться ці знання. У будь-якому випадку, вирішувати подібні завдання, підбирати правильні структури даних, це як кунг-фу, і справжній майстер повинен знати, навіть якщо ніколи не застосовує. Особливо це важливо, якщо у вас немає профільної освіти, а ви одразу почали вивчати програмування з ООП.

З приводу алгоритмів нещодавно прочитав хорошу і не складну книгу, в якій описуються основні алгоритми і структури даних: Грокаем алгоритми . Ну і в принципі є багато курсів з даної теми на udemy і coursera.

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

Практика, практика і ще раз практика. Як і навіщо?

Читати книжки, дивитися відео і розуміти, що відбувається — це одне, написати працюючий код — зовсім інше. Не бійтеся «забруднити руки» і розбиратися в технологіях, які є на вашому проекті, або затребувані на ринку, на маленьких проектах. Не обов'язково піднімати громіздкі системи або малювати красивий UI, щоб зрозуміти, як працює autowiring або написати Restful API для своєї сутності. Так ви наступите на корисні граблі, запам'ятайте, чому так, а не по-іншому, і станете менше вірити в магію. Також дуже корисно розбиратися у всьому шляху запиту в системі: від кліка або відправки форми до бази даних і назад, розуміння — запорука успіху.

Берете і пишете:) Подумайте, який додаток було б корисно, складіть собі ТЗ, і вперед до працюючого коду!

Можна ще довго розтікатися думками по древу, але ось ще кілька пунктів, які доповнюють вищезазначене:

  1. Підготуйтеся до сертифікації і здайте її. Це заповнить всі прогалини у вашому розумінні Java core і дасть вам відчутну перевагу.
  2. Не соромтеся задавати питання старшим товаришам, від вас не будуть вимагати багато чого, але ви повинні викрити правильний момент, щоб запитати — не відразу, як тільки щось не виходить, але і не через кілька днів після дедлайну.
  3. Книги: Чистий код і Java. Ефективне програмування . Також багато чого можна шукати в серії Heads first, якщо хочете простіше, будь то Javascript або Патерни проектування.
  4. Дивіться відео конференцій або ходите на конференції. Моя порада — ходіть на доповідачі, а не на теми. Серед моїх фаворитів — Микола Алименков, Євген Борисов, Джош Лонг. А за підсумком можна зробити ще й доповідь всередині компанії, щоб краще розібратися в темі.

Не припиняйте вчитися і буде вам щастя!

Опубліковано: 22/06/17 @ 07:00
Розділ Блоги

Рекомендуємо:

DOU Проектор: CoLiTec — астрософт, від якого залежить безпека Землі
Все, що вам потрібно знати про формати звітів у тестуванні З
Кейс Kwork – сэкономил 1800 руб. и получил 25 ТИЦастых ссылок
Как заставить контент работать эффективнее для увеличения поискового трафика
Как за 1.5 месяца сделать 1027500 рублей на трафике по бизнес-планам