Фото: Iñaki del Olmo на Unsplash
Вступ
У світі технологій завжди є щось нове, чого можна навчитися — будь-то мова, фреймворк чи інструмент. Під час навчання в школі нас вчили Java та Python за однією і тією ж структурованою програмою: спочатку знайомство з синтаксисом для написання методів, циклів та інших базових речей, після чого йшли тести та проєкти.
Однак, коли я почав свою першу роботу після університету, мені довелося вивчати Ruby самостійно, і для цього я змушений був створити свою власну “структуру навчання”. Оперуючи своїм шкільним досвідом, я звернувся до інтерактивних уроків з Ruby, які розбивали такі концепції, як хеші, цикли та функції lambda на розділи, кожен з яких завершувався тестом для закріплення матеріалу.
Пройшло 3 роки, і я вирішив знову взятися за вивчення нової мови! Цього разу це Go. У цій статті я поділюся тим, що я зробив інакше цього разу, розмірковуючи над тим, що спрацювало (і що не спрацювало) при вивченні Ruby.
Що я дізнався з моїх помилок у Ruby
Коли я тільки почав вивчати Ruby, я припускав, що всі мови програмування мають однакову основу. Я вірив, що як тільки я освою синтаксис, я зможу швидко писати код і ефективно працювати в команді. Я не міг помилятися більше.
Були кілька факторів, що затримували мій вклад на початку, такі як недостатнє розуміння мови та нехтування часом для кращого розуміння бізнес-контексту та проблем. Однак для простоти цієї статті я зосереджуся на недостатньому розумінні саме мови.
Ось 2 помилки, які я зробив:
Помилка №1: Надмірно фокусувався на знайомстві з синтаксисом Ruby
Так, я став знайомий із синтаксисом Ruby через уроки, але все ж я мав труднощі з написанням коду, який був би “читабельним” і “підтримуваним” досвідченими розробниками Ruby. Наприклад, існують деякі ідіоматичні конструкції, які вважаються більш читабельними та виразними. Тому вони більше відповідають практикам Ruby.
Помилка №2: Не читав достатньо коду для розуміння практик Ruby
Замість того, щоб витратити час на читання та вивчення існуючих кодових баз Ruby, я одразу почав писати код. Хоча мій код працював, він не відповідав стандартам для того, щоб бути “готовим до виробництва”. Ця недбалість призвела до довгих перевірок коду, оскільки я намагався привести свої внески до загальноприйнятих практик Ruby. Як результат, мені знадобилося більше часу, щоб підготувати “готовий до виробництва” код і отримати його в продакшн.
Ключовий висновок для мене був у тому, що розуміння синтаксису мови не повинно бути пріоритетом для ефективного внеску. Я повинен був витратити час на розуміння принципів і філософії, які стоять за цими практиками, щоб допомогти мені краще відповідати конвенціям та практикам мови. Розмірковуючи про ці помилки, я зрозумів, що мені потрібно вдосконалити свій процес навчання.
Вдосконалення мого процесу навчання для Go
З Go я вдосконалив свій процес навчання та застосував ці 5 методів, щоб краще вивчити Go за останні 2 тижні. Більш детально я розповім про них у цій частині:
- Метод №1: Візьміть книгу для читання
- Метод №2: Підкріпіть навчання відео на YouTube та іншими матеріалами
- Метод №3: Створіть простий додаток і візьміться за практику
- Метод №4: Читайте більше коду
- Метод №5: Рефакторинг коду
Примітка: Хоча приклади в цій частині більше стосуються Ruby і Go, ці методи можуть бути корисними для вивчення будь-якої мови (або навіть фреймворків)
Метод №1: Візьміть книгу для читання
Протягом цих 3 років роботи інженером я зрозумів, що книги містять цілу гаму знань, яку лише треба відкрити.
Я обрав Pro Go від Адама Фрімена з наступними двома цілями:
- Зрозуміти основні концепції Go — розуміння того, коли, чому та як їх застосовують у реальних сценаріях.
- Отримати уявлення про принципи та філософії, необхідні для написання додатку на Go.
Ось короткий огляд того, що я дізнався, використовуючи книгу як ресурс для навчання порівняно з інтерактивною платформою для кодування:
Читання книги
- В Go немає концепції наслідування (це було найбільше 🤯 для мене). Натомість, заохочується композиція через використання конкретних типів.
- В Go немає концепції класів, замість цього використовуються функції, типи та інтерфейси, оскільки Go має інший підхід до об'єктно-орієнтованого програмування (OOP).
- Використання вказівників для управління виділенням пам'яті.
- ...багато іншого.
Інтерактивна платформа для кодування
- Написання циклу for в Ruby.
- Поширені методи пошуку, використовувані в Ruby, наприклад
.one?
,.any?
. - Синтаксис хешів в Ruby, наприклад, хеші з символізованими або строковими ключами.
Я зрозумів, що книга як ресурс не тільки надає синтаксис і шаблони використання, але й пропонує більш глибокий досвід навчання, де я не тільки дізнавався про що і як, що дають інтерактивні платформи, але й коли та чому ці концепції застосовуються.
Примітка: Якщо ви новачок у програмуванні, почати з інтерактивної платформи може бути більш корисно. Однак, якщо ви вже досвідчений розробник, я знайшов, що книга може дати кращий старт.
Метод №2: Підкріплення навчання відео на YouTube та іншими матеріалами
На цьому етапі стало зрозуміло, що Go фундаментально відрізняється від мов, до яких я звик, оскільки в ньому немає концепції класів та наслідування. Це означає, що мій підхід до написання коду на Go потребує деяких змін. Саме тоді я натрапив на добре пояснене відео від Ентоні про як потрібно по-іншому мислити, пишучи Go, особливо якщо ви приходите з іншого фону програмування.
Розуміння принципів та філософії написання коду на Go також було важливим для мене, щоб виправити помилку, яку я згадував у Помилці №1 в попередньому розділі. Я знайшов документ від Дейва Чені, де він поділився про написання підтримуваних додатків на Go, що стало дуже корисним посиланням, до якого я планую повертатися, поки освоюю Go.
Метод №3: Створення простого CRUD додатку і практика
Цей підхід дуже схожий на “проектну” частину шкільної програми, оскільки я вважаю, що це був один з найкращих способів перевірити свої знання, застосувавши те, що я навчився в Методах №1 та №2.
Основна мета тут — почати з малого і простого, створивши CRUD додаток. Тримати проект маленьким і простим допомагає мені краще зосередитися на тому, щоб спочатку змусити працювати функціональність, не турбуючись занадто сильно про написання ідеально чистого та підтримуваного коду — ці покращення можуть бути пізніше. Великі методи? Повторювані реалізації? Не хвилюйтеся, завжди можна повернутися і вдосконалити їх пізніше.
Зайнявшись практикою, я також виявив кілька випадкових підводних каменів Go, що поглибило моє розуміння того, як я можу краще застосувати їх на практиці. Ось кілька прикладів підводних каменів, які я зустрів:
Конвенції великих та малих літер
- Малі літери для приватних полів і великі для публічних полів.
- Методи з великими літерами можуть бути експортовані та використовувані іншими пакетами.
Нульові значення вказівників
Хоча структури не мають “порожнього” значення, вказівники на структури мають, і порожнє значення — це null
. Наприклад, додавання вказівника *
до PercentageDiscount
має інше значення порівняно з Price
, коли поля не ініціалізовані.
Price
повертає 0, оскільки це нульове значення для типу float64, а PercentageDiscount
повертає null
, оскільки це нульове значення для вказівників.
Метод №4: Читайте більше коду
Це те, як я виправив свою Помилку №2, і, ймовірно, один з моїх найбільших висновків на ранніх етапах моєї кар'єри, де я зрозумів, що не слід лише зосереджуватися на написанні більшого обсягу коду, а також варто більше читати код.
Читання більшої кількості коду допомогло мені кількома способами:
- Навчитися краще орієнтуватися в кодовій базі.
- Перевіряти своє розуміння того, що робить код (на щастя, ми зараз живемо в еру, де є ChatGPT, тому завжди можна звернутися за допомогою!)
- Ідентифікувати деякі загальні шаблони проєктування, які я можу прийняти для покращення підтримуваності коду.
Можливо, ви запитаєте, де можна знайти більше коду для читання? На мою думку, найкращий спосіб почати — це переглядати відкритий код популярних бібліотек/пакетів. Наприклад, я вибрав пакет mux, оскільки я вже використовував його для обробки HTTP маршрутизації у моєму CRUD додатку.
Метод №5: Рефакторинг коду
Нарешті, я провів рефакторинг коду, який я написав у Методі №3. Це дало мені можливість повернутися до того, що я вважав недосконалим, і покращити це, зокрема зменшити дублювання коду та більш чітко дотримуватися конвенцій Go, застосовуючи мої знання з вищезгаданих методів.
Висновок
Підсумовуючи, вивчення нової мови програмування — це набагато більше, ніж просто знання синтаксису. Також важливо розуміти “коли” і “чому” концепції застосовуються, що можна дізнатися через читання книг, практичну роботу та вивчення більших кодових баз.
Ключовий висновок: навчання ніколи не закінчується — завжди є більше, що можна дізнатися, і кожна помилка — це можливість для росту ✨
Перекладено з: Learning a new programming language: What I did differently when picking up Go?