Поради сеньйорів: як прокачати знання junior Go
Поради сеньйорів — постійна рубрика, в якій досвідчені фахівці діляться практичними порадами з джуниорами — загальні лайфхаки по навчанню, які книги та ресурси читати, які навички освоювати і багато іншого. У цьому випуску говоримо про Go.
Іван Данилюк , Core Go developer в Status.im
15 років в ІТ (5 з них в Go)
Мова Go вважається однією з найпростіших для вивчення, але нехай це не вводити в оману — як правило, простою її знаходять досвідчені розробникі, а джуніори можуть мати труднощі в розумінні тих чи інших аспектів мови. Цьому є дві причини:
- мінімум магії — Go дуже мало промов робить за вас, тому від програміста очікується чітке розуміння, з чим він працює і який результат хоче мати;
- нестандартний підхід до об'єктно-орієнтованого програмування — Go немає класів та наслідування, і часто людям складно уявити, як взагалі можна будувати абстракції без цього (багато хто думає, що ООП — це і є клас, але це не так).
З чого починати вивчення?
Однозначно починати потрібно з проходження офіційного Go Tour (українська версія ) — інтерактивного туру, який дасть 90% розуміння синтаксису та головних концепцій мови. Наступним має бути також офіційний документ Effective Go (переклад російською ), який проходити по всім ключовим ідіоматичним конструкціям та концепціям Go. З мого досвіду, 70% всіх запитань новачків по Go мають відповіді у цьому документи. Також для початку варто ознайомитися з коротеньким How To Write Go Code . Оскільки Go є достатня простою мовою, причому схожою на C та С-подібні мови, для більшості людей на Go Tour та Effective Go достатня одних вихідних. Специфікація мови також коротенька, раджу в неї заглядати як на головне джерело істини в незрозумілих ситуаціях.
А далі від універсальної поради немає — комусь краще вчити мову по книжках, хтось ліпше сприймає відеокурси, а інші прагнуть вивчати одразу на практиці. Гарна новина в тому, що останній варіант в Go працює (це називається bottom-up learning) — ви можете відкривати мову крок за кроком, програмуючи та вивчаючи її на ходу. Альо вісь деякі ресурси та книги для тих, хто любити спочатку вивчити цілком та повністю і потім застосовувати.
Книги:
- чудова The Go Programming Language від легендарного автора Брайана Кернігана (перекладена російською );
- безкоштовна An Introduction to Programming in Go Free ;
- Go Programming Blueprints — цікава книга з акцентом на приклади реальних програм, від постановки завдання до імплементації.
Курси:
- курс Essential Go від Jeremy Saenz — колись його прослухав і був дуже вражений рівнем підготовки курсом, можу сміливо радити;
- курс на Udemy — Go: The complete developer guide — чув дуже позитивні відгуки про нього;
- «Підбірка кращих онлайн-курсів по Go» станом на 2018 рік.
Які можуть бути труднощі?
Найбільші труднощі виникають через спробу писати на Go як на інших мовах. Це нормально, і сильно залежить від попереднього досвіду розробника, але важливо з самого початку прийняти, що Go — це є нова мова. І не просто нова, а й в деяких моментах дуже відмінна від мейнстріму мов програмування. Ці відмінності можуть збивати з пантелику на початку — відсутність виключень, класів та дженериків, автоматичне форматування коду, вплив маленької/великої літери змінної на видимість, тощо — альо самє смороду є причиною такого стрімкого успіху Go. Мені свого часу допомогло прийняти та «дати шанс» цим відмінностям, як не дивно, ті, що називають «appeal to authority» — знаючий, що авторами Go є такі легенди computer science як Роб Пайк та Кен Томпсон — я просто довірився їх досвіду і прийняв як факт, що я є в рази менш досвідчений за цих гігантів. І це було дуже мудре рішення.
Проте в Go, як і в будь-якій мові, є свої підводні камені. Про них є купа гарних статей , проте зі свого досвіду я співак, що більшість з них можна уникнути, якщо з самого початку ознайомитись, як Go працює «під капотом» — принаймні, як реалізовані інтерфейси, слайси/масиви та вказівники. Саме на цю тему є стаття з візуалізаціями «How To Avoid Go Gotchas» (переклад російською ).
Також нерідко доводиться чути, що не одразу дається розуміння, як працювати з concurrency-примітивами в Go. Насправді, це достатня проста тема — її просто потрібно один раз правильно зрозуміти. Тут можу порадити свою спробу візуалізувати concurrency в Go — «Visualizing Concurrency in Go» (переклад російською та відеодоповідь ) та дуже вдалу книгу «Concurrency in Go» .
Як розвиватись далі?
Якби я міг дати лише одну пораду тут, то це було б одне слово — open-source. Проекти з відкритим кодом, яких безліч на гітхабі, — це не просто безцінне джерело кодом, на якому можна вчитися, але й, без перебільшення, найкраща школа для будь-якого розробника.
Go тут займає особливу позицію, тому що це об'єднання єктивно перша мова в світі, яка розроблялася з урахуванням соціального аспекту програмування. Саме це пояснює невпинне зростання використання Go для open-source проектів . В Go дуже мало що потрібно, щоб ваша першу програму було не соромно викласти на Github, що стимулює це робити частіше.
Коли ви публікуєте свій код або контріб'ютите в інший проект, це одразу дає розуміння, що на ваш код будуть дивитись інші (досвідчені) розробникі, і змушує вас приділяти увагу чистоті та зрозумілості коду, писати юніт-тести та коментарі — іншими словами, природними шляхом вчить вас найкращим практикам програмування.
Наостанок, можу порадити приєднатись до українського Go community — ми регулярно проводимо мітапи у Києві , Львові та Харкові , перекладаємо та пишемо статті , виступаємо на міжнародних конференціях та проведення воркшопи. Також у нас є дуже затишний та дружній Slack-чатик , в якому є канали і для новачків, і для HR-менеджерів з пропозиціями Go вакансій, яких з кожним місяцем все більше і більше. Приєднуйтесь!
Андрій Севастьянов , Software developer в Depositphotos
21 рік досвіду в IT
Мабуть, я почну з загальних рекомендацій і поступово буду переходити до Go.
Git . Рекомендація перша відноситься до того, щоб опанувати методологію розробки з git. По-перше, більшість проектів на Go розробляються з використанням git, і з ним ви будете часто стикатися у повсякденній роботі. По-друге, зараз популярно давати в резюме посилання на профіль в github, і якщо роботодавець захоче туди подивитися, то грамотно оформлені коміти будуть плюсом. Таким чином, ви прокачиваете дисципліну розуму, систематичність, допускає менше помилок і допомагаєте іншим краще розуміти ваш код. Що таке грамотне оформлення? Я б почав з двох пунктів:
- Коміти повинні бути невеликого розміру. Чим менше комміт, тим простіше зрозуміти, навіщо він був потрібен. Також при його перегляді куди легше помітити помилки. Коли ж один в одному коммите три тисячі рядків було додано і ще півтори було змінено, то розібратися в ньому дуже складно.
- Комміт повинен мати змістовне повідомлення. Часто це посилання на помилку/завдання. Коли ви дивитеся код, то бачите, що цей код робить. Але часто незрозуміло, навіщо це робиться. І, на мій погляд, найкраще місце для того, щоб описати це, є не коментар, а повідомлення коміта. Тоді команда git blame може дати багато цінної інформації тим, хто буде дивитися код.
Брати кращі практики у інших . Більшість Go коду доступно на github. Ви можете вибрати будь-який вас зацікавив проект і стежити за ним, або навіть брати участь у його розвитку. В результаті кількість досвіду участі у проектах множиться на два. Тільки є небезпека перестаратися і підписатися на багато проектів, але не брати участь ні в одному з них :)
Не обмежувати себе . Третя рекомендація більше пов'язана з тим, що не варто обмежувати себе вивченням тільки Go і його особливостей. Намагайтеся дивитися на світ IT ширше, загальна ерудиція теж дуже цінується і дозволяє більш комплексно підходити до вирішення проблем. Мова програмування Go був розроблений в тому числі і для написання мережевих демонів, тому найчастіше ви вже будете мати певний досвід в мережевих взаємодій, багатопоточності і трохи в базах даних. Також Go виявився зручним і для написання деякої загальної логіки, зайняв проміжне положення між C і C++. Тому має сенс і далі розвиватися в цих областях. Для прокачування навичок, на мій погляд, краще всього підійде будь-яка цікава особисто вам завдання, рішення якої мотивувало б вас. Втім, якщо вже програмуєте на Go, то велика ймовірність, що у вас вже є прагнення до найрізноманітніших знань, і тепер важливо оформити це своєю перевагою.
Багатопоточність в програмуванні — це джерело багатьох проблем. І, відповідно, було запропоновано багато методів, як ці проблеми можна, якщо не подолати, то хоча б полегшити. Гоурутины разом з каналами — це ще один метод вирішення цих проблем. Але щоб стати профі, бажано все-таки ознайомитися і з іншими підходами. Тут є багато тем для вивчення. Можна опуститися на рівень нижче і подивитися на те, які засоби для роботи з багатопоточністю є операційна система, і як ці кошти використовуються в Go для створення примітивів мови. Можна вивчити підхід у мові Rust, коли при написанні програми даються деякі підказки компілятору щодо часу життя та доступу до різним змінним, щоб він міг на етапі компіляції перевірити потокобезопасность багатьох ділянок коду. Можна подивитися на співпрограми (наприклад, їх реалізація в Lua). Ну і зовсім зацікавлені можуть опуститися на рівень ядра і подивитися, що працює там і чому багато з цього небажано використовувати в звичайному додатковому коді. Також один з цікавих підходів можна знайти в мові Ada. В якості завдань для тренування багатопоточності можна брати різного роду моделювання системи, в якій взаємодіють багато агентів. Наприклад, поведінка людей в супермаркеті, поведінка машин на дорогах і т. п., коли природним чином кожному агенту відповідає власна гоурутина.
Мережеве програмування , на мій погляд, це, насамперед, досвід в реалізації протоколів. Мережеві API загалом більш або менш однакові в різних мовах, а ось при практичній реалізації протоколів можуть виникати різні нюанси. Тут для навчання можна брати різні Torrent-протоколи, багато протоколів можна знайти в розподілених Blockchain рішеннях, I2P, ... Беремо, що цікаво, і розбираємося. Або приєднуємося до активних розробок, наприклад, swarm
Бази даних . Тут ситуація така, що в більшості випадків, якщо брати реляційні бази даних кшталт Oracle, MS SQL, то там вже вироблені класичні підходи і великі фреймворки. У разі Go часто може зустрітися якась нестандартна задача, яка потребує вертолітне бачення і нестандартні рішення. Тому я б порадив прокачувати загальну ерудицію. Цікавою є книга «Сім баз даних за сім тижнів» , в якій розглянуто досить різні приклади баз даних (класичні реляційні, графові, ключ-значення, ...). Не зашкодить.
Алгоритмічний код в загальному випадку має мало залежностей і є, по суті, перемелюванням байтів, який має мало залежностей з іншими бібліотеками. Тут мова програмування Go опинився посередині між C і C++. При написанні алгоритмічного коду на C треба битися з великою кількістю простих рутинних завдань, як то меджментом пам'яті, стратегією обробки помилок, аскетичністю мовних засобів. З іншого боку, З++ дуже великий язик з масою нюансів, «гострий, подібний бритви, якою легко поранитися», що вимагає великого порогу входження. І якщо ви хочете поліпшити себе саме в області, то, напевно, має сенс ознайомитися з цими двома мовами хоча б для того, щоб потім прочитати GoForCPPProgrammers .
Приймайте участь у конкурсах! Час від часу проводяться різні конкурси, які можуть бути цікаві рязработчикм на Go. Наприклад, в минулому році проходив Highload Cup . Беріть участь в таких конкурсах і покращуйте свої навички. Удачі вам у вивченні, не втрачайте мотивацію!
Іван Кутузов , Technical leader (Golang expert) у SoftServe
13+ років досвіду в ІТ (3 з них у Go)
Golang (Go) — це мова програмування народжена всередині Google, дизайн якої, базується на принципі KISS. За рахунок цього код більш подібний до С, а нові конструкції та типи нікого мову ефективною та сучасною.
Розробка базується на тих самих вічних та загальних принципах computer science: структури даних, теорія алгоритмів, розуміння, що таке чистий код, як створювати тести та навіщо потрібно використовувати об'єктно-орієнтований підхід. Багато інформації можна знайте англійською мовою (у мене вже склалось враження, що це більше не є перешкодою).
Багато інформації та посилань зібрано на Wiki-сторінці github проекту golang (code — як розпочати, effective — перші best practices), повертайтесь туди годину від годині. Тож перше, з чого варто розпочати, — це познайомитись із синтаксисом та конструкціями. Це можна зробити, пройшовши GoTour , Golang tutorial series , online книгою Learning Go або пройти курс GoBootCamp .
Знання синтаксису і вміння читати код не зроблять вас професіоналом, але дадуть можливість створювати власні програми та набратись досвіду з існуючих рішень.
Одразу переходьте до практики: оберіть собі завдання і сконцентруйтеся на її виконанні, працюйте так, наче виконуєте замовлення (від запису вимог, моделювання, кодування, тестування різним чином і запуск на зовнішній платформі). Завдання може бути з довільної області, основна порада на даному етапі — зверни більш прості речі, які ви можете опанувати за вихідні: обмінюватись інформацією через файли або internet, зтягувати інформацію за лінкою або декодувати JSON, обробляти або генерувати зображення.
Був випадок, коли завдання розробки сервісу обміну повідомленнями студент вирішив оформити через GUI для консолі (це ще та собі морока). Через це він драматично відстав від загального потоку і ледь встиг показати результат наприкінці курсу. Навчиться тримати фокус на задачі і додавати фічі у стилі еволюції (етапами, кожна нова після завершення роботи над попередньою). Ми стараємось постити матеріали workshop-ів , альо можна знайте й інші варіанти . Приклади рішень з коментарями ( web ), система виконання малих завдань з фідбеком від інших виконавців .
Go багато рішень вже готові у standard library, альо, щоб якісно їх використовувати, варто розуміти, для чого кожен з пакетів , яке його основне призначення та які його обмеження. Мова дозволяє нам сфокусуватись над рішенням задачі, а не обиранням того чи іншого framework-y. Набір сторонніх пактів можна дивитись через ресурс пошуку go-search.org або серед список визнанних awesome-go , які вже розподілені за категоріями.
Для мене було важко опанувати концепцію interface та concurrency на початку. Тож потрібна ваша наполегливість у практиці та додаткові статті, перегляд доповідей з конференцій та мітапів. Раджу звернути увагу на наступних авторів: Dave Cheney , William Kennedy , Mat Ryer , Ivan Danyliuk , Francesc Campoy . Слідкуйте за їх активністю через twitter, переглядайте виступи та читайте статті. Перевіряйте свої гіпотези, повторюйте те, що побачили, прочитали. Має з'єднання явитись розуміння, де, коли і для чого вони потрібні.
Тримайте основний фокус на практиці. Переходьте до більш складних та комплексних проектів. Створіть сервіси, яким будете користуватись, бота для telegram, тулзу, яка буде знаходити подібні фото тощо. Під час розробки у вас буде виникати купа запитань, відповіді на які легко знайті у статтях або запитати у спільноти . Долучіться до open source проекту, це надасть вам якісний досвід взаємодії з іншими інженерами, ви отримаєте відгук на роботу і це буде значним плюсом під час проходження співбесіди.
Технологія вивчається через практику, спроби та помилки . Вчіться на помилках інших, перевіряйте себе , чи не повторюєте ви їх. Також варто спробувати інтегрувати ваше рішення із суміжними технологіями, розуміти, коли та як їх використовувати: Git, Docker, Kubernetes (will be plus), PostgreSQL, MongoDB, Redis, RabbitMQ, AWS etc. Наприклад, якщо розробляли систему пошуку інформації в Internet, додайте статистику, зробіть відстеження прогресу виконання, можливість продовжувати роботу після зупинки сервісу або розбийте складну задачу між кількома різними процесами та узгодьте їх роботу між собою.
Ознайомтесь із загальними алгоритмами, як будуються захищені рішення, надійні до введених даних користувачем, великої кількості та навмисно заплутані. Валідація даних — грає важливу роль під час розробки API сервісів, розуміння існуючих типів атак та слабких місць системи дає вам новий напрямок розвитку та вдосконалення. Додайте валідацію даних до вашої системи, пройдіться по OWASP top 10 і перевірте, чи не вразлива вона.
Обов'язково приділить увагу тестуванню, benchmarks для перевірки та виявлення ліпшого алгоритмом, performance аудити вашого рішення, його оптимізацію. Часто зустрічаю помилку передчасної оптимізації, це робить код складним для розуміння та підвищує ризик помилок. Golang має великий потенціал, якщо його правильно використовувати. Відстежуйте та оптимізуйте вузькі місця, це може бути геть не ті, що ви передбачали. Go test, go test bench, go tool pprof — ваші помічники у цьому. Розуміння теорії тестування стане у нагоді, можна починати з перегляду виступів The Art of Testing . Які є типи тестування, для чого вони використовуються, які інструменти існують для цього (багато з них розроблені на Golang). Це розширити ваш арсенал інструментів, і також буде гарним плюсом на співбесіді.
За моїм досвідом, маючи базу з програмування, достатня 3-5 місяців для переходу на production level використання технології Go (звісно, найефективніший варіант — це приєднатись до команди). Процес вдосконалення безперервний, більш розширений список літератури для всіх рівнів можна знайте на github . Працюйте з ним регулярно.
Сергій Мариеха , DevOps Engineer в MacPaw
7+ років досвіду в ІТ (3 з них у Go)
Go — відносно молодий мову програмування. Багато хто просто обожнюють його, багато хто вважає дивним, незграбним, недостатньо виразним. Що ж, кожному своє, але не можна не відзначити, що мова стрімко зростає.
Якщо ви вибрали Go — нудно вам не буде. Саме прикольне, що є в Go — це не фічі самої мови, це його спільнота. Воно неймовірно чуйне, доброзичливе і атмосферний. Якими б складними не були для вас перші кроки, не бійтеся задавати питання, навіть якщо вони здаються вам дурними.
Алгоритми і структури даних. Так, так, так! Не навчайте їх для галочки, навчайте їх для себе! Швидше за все, ви просто будете ганяти запити між JSON/gRPC API, а завдання, пов'язані з алгоритмами, ви будете зустрічати тільки на співбесідах, але важливо розуміти, що ці знання завжди будуть актуальними і завжди згодяться, коли саме під цю нестандартну задачу не виявиться готового рішення чи бібліотеки, яка б задовольняла ваші потреби.
Книги. Почати, мабуть, варто з хорошої книги. Книг по Go є вже досить багато, але лише кілька з них варті уваги і дійсно можуть називатися книгами, а не брошурами. Я б виділив The Go Programming Language від Алана Донована і Брайана Кернигана.
Офіційна документація. Go володіє прекрасною документацією, де ви знайдете відповіді на більшість своїх запитань.
Раджу приділити особливу увагу розділу Effective Go , який присвячений конвенцій написання ефективного идеоматического коду. Не зайвим буде ознайомитися зі специфікацією , а також з моделлю пам'яті .
Шпаргалки. Часто забуваєш найпростіше. Go by Example на якийсь час стане постійно відкритою вкладкою в браузері.
Читайте класику. Як я вже казав, саме круте в Go — це його спільнота. За роки існування у нього з'явилися лідери думок, чиї думки, пости в блогах, твіти і, звичайно ж, код, підривали маси розробників бурхливими обговореннями, що вело до нового витка розвитку мови. Багато з постів стали буквально «класикою». Наведу лише деякі з матеріалів:
-
Go Proverbs — ідіоми мови від його творця
-
Go for Industrial Programming by Peter Bourgon ·
-
Go: the Good, the Bad and the Ugly
-
50 Shades of Go: Traps, Gotchas, and Common Mistakes for New Golang Розробники
-
Standard Package Layout by Ben Johnson
-
Understand Go pointers in less than 800 words or your money back by Dave Cheney
-
How to avoid Go gotchas — відмінний пост Вані Данилюка!
Будьте в тренді. Фоловте в Twitter активних учасників Go спільноти, читайте Хабр, спілкуйтеся на Reddit, звичайно ж, читайте офіційний блог Go і вступайте до співтовариства Slack, ходіть на митапы і конференції, підписуйтесь на канали в Telegram (наприклад, на мій @golangdigest ). Експериментуйте з новими підходами і технологіями. Якщо коротко — намагайтеся бути в тренді всіх новинок, це допоможе вам рости і тримати свою ринкову вартість.
Нетворкінг. Бути активним членом спільноти дуже корисно. Спілкування з фахівцями з різних компаній допоможе вам розширювати свій кругозір і розуміти, як працюють за межами вашої компанії. Також це допоможе придбати корисний коло знайомств і отримати рекомендації при зміні компанії.
Тренуйтеся. Вирішуючи завдання, ви виробите навик бачити певні шаблони рішень, як тільки ви зустрічаєтеся з проблемою.
LeetCode і HackerRank допоможуть вам у цьому. Почніть контрибьютить в open source, заведіть пет проект, просіть хороших фахівців ревьювить ваш код. Адекватно сприймайте критику.
Не здавайтеся. Коли вам здається, що для вирішення якогось завдання вам не вистачає мізків і ви перепробували все-все, і вже готові кинути цю затію — не здавайтеся. Відкладіть завдання, переведіть фокус на щось інше, відпочиньте і поверніться до неї з новими силами.
Любите те, що робите. Якщо вам не в кайф те, що ви робите, не варто себе змушувати. Займіться тим, що приносить вам задоволення. Гроші можна заробляти і в інших сферах.
Опубліковано: 16/08/18 @ 08:05
Розділ Блоги
Рекомендуємо:
Навіщо IT-компанії цінності і як їх відразу не закинути
Українське ІТ у 90-ті та на початку 2000-х: перші офіси компаній
.NET дайджест #24: поліпшення в Rider і protobuf-net tools, міграція проекту на PackageReference
Ruby/Rails дайджест #20: перша передрелізна версія Rails 5.2.1, версія 2.0.0 гема Pundit, цікаві матеріали з RubyHACK 2018
Финстрип Липень 2018. 65К. Літо — доходи стоять