/learn-go-with-tests-ru

Перевод книги «Learn Go with Tests» на русский язык. Russian translation of Learn Go with Tests.

Primary LanguageGoMIT LicenseMIT

Изучите Go через тестирование

Три гофера разных цветов: один думает о еде, другой готовит, третий убирает. Надпись: Red, Green, Refactor.

Обложка нарисована Denise

Go Report Card

Форматы для чтения

Доступные переводы

Поддержите меня

Я горжусь тем, что предлагаю эту книгу для свободного использования, бесплатно. Однако, если вы хотите поддержать меня или выразить благодарность, то можете воспользоваться следующими пунктами:

Почему мне стоит это читать?

  • Узнайте о языке Go с помощью написания тестов.
  • Погрузитесь в TDD с головой. Go хороший язык для этого, потому-что он прост для изучения и в нём отлично реализованы тесты из коробки.
  • Получите уверенность, что вы можете писать надежные и хорошо протестированные системы на Go.
  • Посмотрите видео или почитайте, почему юнит-тестирование и TDD важны.

Оглавление

Основы Go

  1. Установка Go - Настройте рабочее окружение для комфортной работы.
  2. Привет, мир! - Объявляйте переменные, константы, используйте ветвления, напишите вашу первую программу на Go и тест для неё. Синтаксис подтестов и замыканий.
  3. Числа - Укрепите знания синтаксиса для функций и изучите новые пути улучшения документации вашего кода.
  4. Циклы - Узнайте о цикле for и для чего нужны бенчмарки.
  5. Массивы и Слайсы - Научитесь работать с массивами, слайсами, len, range, изучите вариативные функции и покройте тестами программу.
  6. Структуры, методы и интерфейсы - Погрузитесь в методы, узнайте об интерфейсах, структурах и табличных тестах.
  7. Указатели и ошибки - Узнайте об указателях и обработке ошибок в Go.
  8. Карты - Научитесь пользоваться картами для хранения данных.
  9. Управление зависимостями - Получите представления об управлении зависимости и как это связано с использованием интерфейсов и пакета io.
  10. Мокинг (имитация) - Возьмите существующий не протестированный код и используйте DI с мокингом для написания тестов.
  11. Многопоточность - Узнайте как писать многопоточный код и как сделать вашу программу быстрее.
  12. Оператор Select - Научитесь красиво и элегантно синхронизировать асинхронные процессы.
  13. Рефлексия - Получите основы о рефлексии в Go.
  14. Синхронизация - Узнайте о пакете sync, который включает в себя WaitGroup и Mutex.
  15. Использование context - Используйте пакет context для управления и закрытия долгих процессов.
  16. Property-based testing (использование предикатов) - Попрактикуйтесь в TDD с помощью Roman Numerals заданий и получите основы PBT.
  17. Использование math - Научитесь использовать пакет math и нарисуйте часы с использованием SVG.
  18. Чтение файлов - Читайте файлы и обрабатывайте их.

Создание приложения

После погружения в Go пришло время написать свое собственное приложения, используя полученные знания о большинстве важных аспектов языка и как применять TDD.

Каждая глава построена по принципу итеративности и зависит от предыдущей. Приложение обрастает новыми функции шаг за шагом.

Новые понятия будут представлены, чтобы научиться писать качественный код, но большинство материала будет зависеть от стандартных библиотек языка, которые были в предыдущей главе.

В конце главы вы получите полное представление о том, как писать программы на языке Go, покрытые при этом тестами, что особенно требуется для любого серьезного приложения.

  • HTTP-сервер - Мы создадим приложение, которое получает HTTP-запросы и отвечает на них.
  • JSON, маршрутизация и вложения - Мы создадим наши собственные запросы, которые возвращают JSON и разберемся как устроена маршрутизация HTTP-запросов.
  • IO и сортировка - Мы сохраним и прочитаем наши данные с диска и научимся эти данные сортировать.
  • Командная строка и структура проекта - Используем нашу кодовую базу для нескольких приложений и прочитаем ввод из командной строки.
  • Пакет time - Установим активности на определенный период времени с помощью пакета time.
  • Веб-сокеты - Узнаем как написать и протестировать сервер, который использует веб-сокеты.

Частые вопросы и ответы

Я часто сталкиваюсь с популярным вопросом от моих студентов:

Как я могу протестировать функцию, которая сначала делает x, затем y, а в конце z?

Если у вас есть подобные вопросы – заведите новый тикет на GitHub и я постараюсь найти время и написать маленькую главу о том, как решить эту проблему. Я чувствую, что такой контент ценнее, поскольку это настоящие проблемы вокруг тестирования.

  • Вызовы OS-команд - Пример как мы можем вызывать OS-команды для того, чтобы получить данные и сохранить нашу бизнес-логику способной для тестирования.
  • Создание собственных ошибок - Пример как мы можем создавать собственные ошибки, чтобы улучшить тесты и сделать код удобным для дальнейшей работы.
  • Context-независимый Reader - Узнаем как TDD дополняет io.Reader с отменой. Основываясь на статье "Context-aware io.Reader for Go".
  • Проектирование HTTP-хандлеров - Тестирование HTTP-хандлеров кажется болью для большинства разработчиков. Мы найдем основные проблемы и научимся проектировать HTTP-хандлеров правильно.

Дополнения / Обсуждения

  • Почему? - Посмотрите видео или почитайте о том, почему юнит-тестирование и TDD важны.
  • Введение в дженерики - Научитесь как писать функции которые принимают аргументы с дженериками и напишите свою собственную структуру данных.
  • Анти-паттерны - Маленькая глава об анти-паттернах в TDD и юнит-тестировании.

Внести свой вклад в развитие проекта

  • Данный проект находится в стадии разработки, поэтому не стесняйтесь связаться и предложить свои идеи.
  • Прочитайте как правильно контрибьютить в проект.
  • Есть идеи? Создайте новый запрос!

Обо мне

У меня есть опыт обучения Go для разработчиков и я попробовал разные пути: от команды, которая просто интересуется Go, до написания высокоэффективных систем на языке.

Не работающие подходы

Прочитать книгу

Мы пробовали применить подход, который обсуждался в синей книге и каждую неделю обсуждать следующую главу вместе с решением задач.

Мне нравится эта книга, но она требует высокий уровень вовлеченности. Эта книга детально описывает концепты, которые в целом полезны, но это значит что прогресс будет медленным и незаметным – это не для всех.

Небольшое количество людей хотело бы прочитать главу X и решать задачу, при этом большинство людей этого не делали.

Решать часть задач

Решение задач интересное занятие, но обычно их полезность довольна мала при изучении языка. Мы вряд ли будем использовать горутины для решения каких-то задач.

Другая проблема, когда у вас есть несколько уровней энтузиазма. Некоторые люди просто хотят изучить больше концепций языка чем другие и, когда они показывают что они уже сделали, то заканчивают особенностями языка, о котором другие не знают.

Это создает в обучении проблемы, вызывает не структурированность и отсутствие документации, тестов.

Работающие подходы

До этого момента самый эффективный путь был медленно изучать основы языка с помощью go by example, пробовать их запустить локально и смотреть на общую картину. Это немного более интерактивный подход, чем "прочитай главу X и выполни домашнее задание".

После этого вы получаете прочную базу по грамматике языка и поэтому можете начать проектировать какие-либо системы.

Это можно сравнить с практикой игры на гитаре, когда вы начинаете изучать гаммы и как их играть.

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

Работающие подходы для меня

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

Я бы хотел изучить основные концепты и затем укрепить их с помощью идей с тестами. Тесты подтверждают, что мой код корректен и документируют особенности, которые я изучил.

Из моего опыта обучения с группой или самостоятельно, я пытаюсь попробовать создать что-то, что может быть полезно другим разработчикам и командам. Написание маленьких тестов поможет улучшить ваши навыки в проектировании программного обеспечения и даст основы для новых высокоэффективных систем.

Для кого эта книга

  • Любому, кто заинтересовался в изучении Go.
  • Любому, кто уже немного знаком с Go, но хочет изучить TDD подход.

Что мне потребуется для прохождения?

  • Компьютер и установленный терминал, которым вы хорошо пользуетесь.
  • Установленный Go.
  • Текстовый редактор кода.
  • Небольшие познания в программировании. Понимание концепции ветвлений, что такое переменная, функция и т.д

Обратная связь

  • Создавайте новые тикеты/предлагайте изменения здесь или отметьте меня в Twitter.

Лицензия MIT

Логотип нарисовал egonelbre, спасибо!