Як стати джуном, якого найматимуть
Усім привіт! Мене звати Влад, я — Junior Go Engineer у Solidgate, продуктовій фінтех-компанії, що допомагає інтернет-бізнесам зі всього світу зручно та безперешкодно приймати платежі.
Ще трохи менше ніж рік тому я відкладав пошук роботи «на потім», а вже влітку отримав три запрошення на співбесіди, після яких мав два офери. У цій статті я хочу поділитися своїм досвідом, процесом проходження інтерв’ю та, головне, розповісти про роль навчання у формуванні мого кар’єрного шляху. Окремо поділюся корисними ресурсами та порадами для тих, хто зараз вивчає Go або зацікавлений цією мовою.
Мені подобається книга «The Art of Doing Science and Engineering» американського математика та інформатика Річарда Геммінга. На початку він наголошує на тому, що обсяг накопичених людством знань стрімко зростає:
«Відомим є той факт, що приблизно з часів Ісаака Ньютона загальний масив знань подвоюється за обсягом кожні 17 років».
Виокремлю одну з головних тез книги: навчання та цілеспрямованість — якості, що допомагатимуть вам залишатися конкурентоспроможним та рухатися в будь-якому напрямку, який ви оберете:
«Ви повинні розвивати здатність вивчати нові галузі знань, коли вони з’являються, щоб не залишитися позаду, як багато хороших інженерів у довгостроковій перспективі».
How it started
Програмуванням я цікавився ще зі школи — насамперед тому, що ним займався мій старший брат. Він же й підказував мені, в якому напрямку рухатися. Моїми «першими кроками» була розробка невеличких піксельних аркад. Так я розробив Explosive Dungeon, а через рік ми з другом допрацювали цю гру на Unity та опублікували її в Google Play.
Хоч надалі ми й не змогли її оновлювати, а очікуваного охоплення досягти так і не вдалося, досвід командної роботи був корисний для нас обох. Ми навчилися комунікувати стосовно технічних питань, формувати завдання один для одного та отримали просте уявлення про цикл розробки.
Я також переглядав різноманітні гайди на YouTube, читав (чи принаймні починав читати) книги для початківців з вивчення JavaScript, Python та навіть Ruby. Утім, я розумів, що мені бракує послідовності: робив я чимало, проте чіткого розуміння якоїсь конкретної мови чи суміжних технологій у мене не було.
У пошуках мови для вивчення я досліджував статті та статистику й вирішив зупинитися на Go. Тоді це була відносно нова мова, про яку в моєму оточенні чули доволі мало людей — та водночас вона була на слуху серед розробників і вважалася перспективною. Я побачив у Go можливість зробити ставку на щось, що із часом набуватиме дедалі більшої значущості, якраз поки я просуватимусь у вивченні.
Раджу звернути увагу на сайт roadmap.sh/golang, тут поступово описано, в яку тему за якою слід заглиблюватись у вивченні Go та не тільки, а до деяких тем надаються додаткові навчальні ресурси.
Ще один хороший курс — офіційний A Tour of Go або знайдений мною нещодавно Learn Go with Tests, що відразу навчає і мови, і написанню різних тестів.
Вивчення Go я розпочав, занурившись у розробку невеличких проєктів. Першим із них був телеграм-бот, що дає можливість підписатися на сповіщення про ротацію безкоштовних ігор в Epic Games Store, над яким я працював разом із братом. Окрім Go, я також використовував SQLite як основну базу даних для збереження інформації про користувачів. Структура коду, авжеж, була далеко не найкращою, адже ніякого уявлення про належну її організацію в мене тоді не було. Мабуть, саме тому від моменту написання бот пережив уже 2 рефакторинга та наразі переписаний братом на Rust, а кількість його користувачів нещодавно перейшла відмітку в 9 000.
Іншим моїм проєктом був бот для вивчення наголосів — однієї зі складових ЗНО з української мови — створений якраз у процесі підготовки до нього. Розробка цього бота стала для мене нагодою ще трішки повправлятися з SQL та складнішими залежностями в таблицях, а також більш складній логіці роботи.
Тоді я також спробував реалізувати «розумний» підбір слів, який полягав у меншому відсотку потрапляння вже вивчених користувачем слів до тестів (дешевий і сердитий «ML»). Дивлячись на код зараз, складно стримати сліз — чи то від гордості, чи то сорому — поки не зрозумів, але бот працює вже четвертий рік, а тисячі користувачів вивчили десятки тисяч наголосів. Підтримую я його й досі, особливо актуальним це стає навесні, коли учні починають активно готуватися до екзаменів та періодично його перенавантажують.
Хоча ці проєкти багато чого навчили, із часом я почав відчувати, що мені слід поглибити теоретичне розуміння мови, інших інфраструктурних технологій та загальних інженерних підходів. Тоді я почав шукати структуровані навчальні ресурси. Одного разу мені трапився курс Стівена Грейдера «Go: The Complete Developer’s Guide» на Udemy. Навіть попри те, що я багато вивчив самостійно, цей курс звернув мою увагу на теми, які мені слід було б розглянути детальніше та зацікавив мене в проходженні інших курсів.
Що я робив далі
Після вступу до університету та початку навчання довелося взяти невелику паузу у Go і натомість більше працювати із С++, що дало мені уявлення про більш системний рівень розробки та складніші концепції, а згодом — алгоритми, структури даних тощо.
Навесні 2023 року мої друзі в університеті розповіли мені про початок набору на навчання в Genesis & KMA Software Engineering School третьої ітерації — літній курс із програмної інженерії від компанії Genesis та Києво-Могилянської академії. Тоді я вирішив не подаватися на програму, адже побачив, що вона позиціонується для розробників щонайменше Junior-рівня, і, проглянувши тестове завдання минулого року, засумнівавсь у своїх силах. Чи було це рішення оптимальним? Думаю, так, адже тоді я поставив перед собою ціль: підготуватися до наступного відбору та пройти на навчання.
Важливим відкриттям на шляху підготовки для мене стали курси Тревора Солера, що, хоч і побудовані навколо вивчення Go, усе ж покривають і більш загальні теми. Його курси охоплюють архітектуру проєктів, шаблони проєктування, конкурентність, тестування, веброзробку, бази даних, мікросервіси та багато іншого. Проходження цих курсів дало мені, перш за все, багато практичного досвіду роботи з більш складними системами, ніж я мав до цього, а, по-друге, познайомило мене з PostgreSQL, RabbitMQ, Redis, Docker, K8s, Mongo, gRPC тощо.
Ці курси були для мене найбільш корисними та покрили велику кількість тем, розуміння яких мені бракувало:
Building Modern Web Applications with Go
Working with Microservices in Go
Working with Concurrency in Go
Та окремо курси з паттернів проєктування:
Вивчаючи нове, я був умотивований рухатися далі: закінчуючи один курс, відразу починав проходити наступний. Так я пройшов мінімум вісім сумарною тривалістю в близько сто годин. Найприємнішим для мене був очевидний зріст у тому, як пишу код, як структурую проєкти, як використовую на практиці певні патерни. Різницю між моїм старим кодом та тим, який я писав уже тоді, було помітно.
У той час я паралельно працював над двома проєктами. Ідея одного з них — бота для організації подорожей — виникла в мене, коли ми з друзями збиралися в поїздку до Львова. Хотілося мати можливість просто із чату записувати якісь цікаві місця, які ми збиралися відвідати, та відразу переглядати їх на мапі. Технічною ж метою розробки для мене було скористатися технологіями, досвіду, з якими я ще не мав досвіду до цього: NoSQL (Firebase Firestore), Redis, Google Maps API, Heroku, новими можливостями Telegram API тощо.
Другим проєктом була платформа для IT-освіти Plaja, яку я розробляв як великий курсовий проєкт. Досвід роботи над Plaja дав мені базові знання з архітектури баз даних, розробки API, надав більше контексту щодо того, як підходити до створення масштабних сервісів. Я також займався фронтенд-частиною, а дуже доречним тоді для мене став курс із розробки Web-застосунків, який я згадував раніше. Фронтенд я писав на SvelteKit та TypeScript. Хоч я і спробував «пропітчити» ідею цієї платформи своєму викладачеві, необхідних порад тоді, на жаль, не отримав, тому завершити роботу мені не вдалося. Та Plaja залишається моєю мрію і досі.
- Шукайте можливості розробляти пет-проєкти. Можливо, є якась проблема, яку б ви хотіли вирішити, а, можливо, такої проблеми немає — тоді створіть її са... тоді подумайте про те, що було б корисно, наприклад, для вас та що вам цікаво.
- Використовуйте різні технології. Корисно принаймні мати уявлення про найбільш відомі з них, аби вибудовувати розуміння того, де та що було б доречно використовувати: не просто в теорії, а на практиці. Цей підхід також допоможе зрозуміти, що саме вам до вподоби.
Другий курс. Весна 2024
У квітні анонсували початок Software Engineering School 4.0, до якого я готувався весь рік. Певен, я був першим поміж зареєстрованих. Згодом розпочався відбір, виконання тестового завдання, інтерв’ю... і мене прийнято на навчання! Так окупилися мої старання.
Протягом літнього курсу інженери з різних компаній екосистеми проводили лекції на теми, пов’язані з архітектурою, інфраструктурою, технологіями, SDLC тощо. Виконуючи домашні завдання, ми поступово покращували свої проєкти: від рефакторингу й написання тестів до перебудови всієї архітектури, упровадження івент-брокерів, SAGA, налагодження CI/CD тощо.
Утім, чи не найважливішим аспектом цього досвіду була робота з ментором. За всіма учасниками були закріплені досвідчені інженери з різних компаній. Моїм ментором, наприклад, був Tech Lead Влад із Solidgate, до команди якого я згодом долучився. Ментори консультували щодо домашніх завдань, давали поради та проводили code review (до речі, після того, як пари учасників провели його самостійно одне для одного — що теж було цікавим досвідом).
На мій погляд, найбільш важливим аспектом менторства є те, що ви працюєте з людиною, яка вже має більший рівень експертності у сфері й роки досвіду за плечима. Ментор може поділитися з вами своїм досвідом, матеріалами, що допомогли навчатися йому самому, — загалом тим, що вам власноруч було б складно відшукати. У моєму випадку Влад ділився різними нюансами щодо Go та порадив кілька гарних джерел для вивчення.
Добірка корисних матеріалів по Go, які я для себе відкрив на цьому етапі:
Effective Go — офіційна стаття розробників мови про ідіоматичний стиль написання коду, що містить чимало цінних порад.
Uber Go Style Guide — стиль написання коду, який використовують у компанії Uber.
Common Go Mistakes — 100 типових помилок у Go та як їх не допускати.
Також щиро раджу звернути увагу на блог VictoriaMetrics і окрему велику добірку порад від автора цих блогів: Golang Practical Tips. Гарними прикладами статей VictoriaMetrics є наступні:
Go Maps Explained: How Key-Value Pairs Are Actually Stored
Slices in Go: Grow Big or Go Home
How Protobuf Works — The Art of Data Encoding
Slices in Go: Grow Big or Go Home
Їхні блоги — абсолютний must-read для тих, хто хоче розібратися з тим, як усе в Go влаштовано на глибинному рівні.
За підсумками навчання на школі я вкотре відчув той «ітеративний крок», коли між кодом, який я писав раніше, і тим, який пишу зараз, було помітно різницю. Я також познайомивсь із чималою кількістю крутих людей, які й зараз сприяють моєму розвитку. Але одним із головних досягнень було запрошення на співбесіду від трьох компаній, однією з яких були Solidgate. Після тижня, сповненого різних інтерв’ю, я отримав два офери, зробив вибір і наразі працюю з платежами саме там.
Інтерв’ю: як це було
Ці інтерв’ю були для мене першими в житті, а тому в підготовці я був доволі серйозний. Почав я її з того, що знайшов добірку питань, що можуть задавати на співбесідах Go-інженерам від Junior до Senior, та прописав відповідь на кожне з них. Також розбирав і більш загальні питання, що стосувалися мереж, баз даних, патернів проєктування тощо.
Корисними для підготовки до інтерв’ю були для мене наступні добірки:
Співбесіда з Go. 200+ запитань для Junior, Middle, Senior
180+ питань на співбесіду Golang для Junior, Middle та Senior
Розібравши більшість із цих питань, я використовував ChatGPT для проведення собі mock-інтерв’ю, що також було доволі корисно, а десь так виглядав промпт:
«You’re interviewing me for a Junior Go Engineer position. Please ask me relevant technical questions, including some more advanced ones. Correct me when I’m mistaken.»
Оскільки співбесідувався я паралельно в три компанії, то щодня протягом тижня у мене було по
Ось кілька порад зі власного досвіду щодо проходження співбесід.
- Запамʼятовуйте та занотовуйте те, на що не змогли відповісти. За можливості обговоріть такі питання з інтервʼюером, щоб краще в них розібратися та отримати пораду. Адже співбесіда — ще одна можливість навчитися чогось нового, а не просто екзамен. Якщо таке питання прозвучить ще раз, то вам важливо показати, що ви не залишили його без уваги.
- Якщо ви ще не маєте комерційного досвіду й вас про це запитують — не відповідайте «Ні, не маю». Згадайте натомість про якісь цікаві проєкти, якими ви займалися. Можливо, серед них були й командні — що навіть краще, якщо ви брали в них активну участь. Якщо таких проєктів немає, то робіть щось просто зараз, адже їхня наявність у резюме — великий плюс для вас як кандидата.
- «Живіть цікаво — ходіть у театр, читайте книжки, тренуйте улюблену обізь’яну...» — не жарт. Питання про книги, наприклад, траплялося мені щонайменше тричі. Якщо є можливість, читайте хоча б наукову чи історичну літературу, і не стверджуйте категорично, що читання — не для вас. Це нерідко грає велику роль, демонструючи вашу зацікавленість у навчанні та розвитку.
- Розповідайте про свою мотивацію, щоб показати, що ви знаєте, чого прагнете та куди хочете рухатися далі.
How it’s goin’
Я працюю в Solidgate уже девʼятий місяць. Моя команда обслуговує як і найбільш наближені до кінцевого користувача платіжні інтерфейси, так і внутрішні платформи для команд підтримки. За час роботи я встиг зробити чимало технічних покращень внутрішніх сервісів та реалізувати деякі бізнес-функції, із якими навіть ви можете зустрітися від платежу до платежу.
Якщо підсумовувати, то домен, у якому ми функціонуємо, точно не з найпростіших, а мої завдання періодично переростають у виклики, вирішити які просто «в лоб» не вдасться. Утім, розв’язуючи такі завдання, я з кожним разом відчуваю, як дізнаюся щось нове.
Наостанок ще кілька книг та блогів, які я можу порадити:
Network Programming with Go — книга із загальним, дуже детальним описом роботи мереж та мережевих протоколів і написання оптимізованих вебзастосунків на Go.
PostgreSQL 16 Internals — книга з детальним описом роботи Postgres та її тонкощів.
Practical Go: Real world advice for writing maintainable Go programs — блог одного з розробників та контриб’юторів Go. Блог Мартіна Фаулера — багато статей на тему розробки.
Отож, десь так виглядає мій шлях. Сподіваюся, що кожен знайде в цій статті щось корисне й для себе та надихнеться торувати власний: можливо, у розробці, а можливо навіть у фінтеху. Найважливіше — не залишатися на місці, працювати над цікавими проєктами, вчитися та знаходити близьких по духу людей.
Тож шукайте можливості — і вони знайдуть вас. До наступних зустрічей у стрічці! :)
19 коментарів
Додати коментар Підписатись на коментаріВідписатись від коментарів