День открытых дверей по курсу «Golang Developer. Professional» 18.02.2020 в 20:00 | OTUS
Запланируйте обучение с выгодой в Otus!
-15% на все курсы до 20.11 Забрать скидку! →
Выбрать курс
Проходил 18 февраля 2020 года в 20:00

День открытых дверей
Всё о курсе «Разработчик Golang»

День открытых дверей онлайн

День Открытых Дверей — отличная возможность задать все вопросы по разработке на Golang, узнать подробнее о программе курса, особенностях онлайн-формата, навыках, компетенциях и перспективах, которые ждут выпускников после обучения.

Также преподаватель расскажет о себе и своём профессиональном опыте. Запишитесь на онлайн-трансляцию и задайте свой вопрос в прямом эфире!
Преподаватель
Антон Телышев

О курсе

Golang Developer. Professional
129 000 ₽ 109 650 ₽
5 месяцев
Начало 28 ноября

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

Программа также подходит для быстрого перехода к углубленным темам Go с других языков программирования:

Для тех, у кого уже есть опыт разработки на других языках …

Программа курса
Модуль 1
Начало работы с Go
Модуль 2
Concurrency в Go
Модуль 3
Стандартные библиотеки и практики
Модуль 4
Работа с сетью и БД
Модуль 5
Микросервисы
Модуль 6
Проект
Начало работы с Go
В первом модуле мы посмотрим на Go как на язык программирования. Рассмотрим основные синтаксические конструкции и их выполнение в runtime. Основное внимание уделим конструкциям, уникальным для языка Go, которых нет в другом языке.
Знакомство с курсом / ДЗ
разобраться с базовым инструментарием Go.после занятия вы сможете:приступить к написанию программ на Go.
28 ноября, 20:00 — 21:30
Лектор: Олег Венгер
Домашние задания: 1
ДЗ
Hello, OTUS!. Необходимо написать программу, печатающую в стандартный вывод перевернутую фразу
```
Hello, OTUS!
```

Для переворота строки следует воспользоваться возможностями
[golang.org/x/example/stringutil](https://github.com/golang/example/tree/master/stringutil).

Кроме этого необходимо исправить **go.mod** так, чтобы для данного модуля работала
команда `go get`, а полученный **go.sum** закоммитить.

Подробности:
https://github.com/OtusGolang/home_work/tree/master/hw01_hello_otus

Процесс сдачи домашнего задания:
https://github.com/OtusGolang/home_work/wiki/[Студентам]-Процесс-сдачи-ДЗ
Синтаксис языка
узнать про основные конструкции, типы и структуры данных (СД) языка.
После занятия вы сможете:
использовать основные типы языка;
пользоваться основными СД языка.
5 декабря, 20:00 — 21:30
Особенности языка и типовые ошибки / ДЗ
узнаете внутреннее устройство слайсов и мап, поговорим о распространенных ошибках.
после занятия вы сможете:
избегать ошибок при работе со строками и указателями;
не совершать ошибок при работе с ссылочными типами Go;
избегать ошибок, связанных с областью видимости.
9 декабря, 20:00 — 21:30
Лектор: Дмитрий Копылов
Домашние задания: 1
ДЗ
Распаковка строки. Необходимо написать Go функцию, осуществляющую примитивную распаковку строки,
содержащую повторяющиеся символы/руны, например:
* "a4bc2d5e" => "aaaabccddddde"
* "abcd" => "abcd"
* "3abc" => "" (некорректная строка)
* "45" => "" (некорректная строка)
* "aaa10b" => "" (некорректная строка)
* "aaa0b" => "aab"
* "" => ""
* "d\n5abc" => "d\n\n\n\n\nabc"

Как видно из примеров, разрешено использование цифр, но не чисел.

В случае, если была передана некорректная строка, функция должна возвращать ошибку.
При необходимости можно выделять дополнительные функции / ошибки.

Подробности:
https://github.com/OtusGolang/home_work/tree/master/hw02_unpack_string

Процесс сдачи домашнего задания:
https://github.com/OtusGolang/home_work/wiki/[Студентам]-Процесс-сдачи-ДЗ
Лучшие практики работы с ошибками / ДЗ
Поговорим про ошибки и практики работы с ними. Вы узнаете, что такое паника, почему не стоит паниковать и как пользоваться отложенным вызовом функции.
После занятия вы сможете:
правильно обрабатывать ошибки;
создавать собственные типы ошибок.
12 декабря, 20:00 — 21:30
Лектор: Алексей Романовский
Домашние задания: 1
ДЗ
Частотный анализ . Необходимо написать Go функцию, принимающую на вход строку с текстом и
возвращающую слайс с 10-ю наиболее часто встречаемыми в тексте словами.

Если слова имеют одинаковую частоту, то должны быть отсортированы **лексикографически**.

* Словом считается набор символов, разделенных пробельными символами.

* Если есть более 10 самых частотых слов (например 15 разных слов встречаются ровно 133 раза,
остальные < 100), то следует вернуть 10 лексикографически первых слов.

* Словоформы не учитываем: "нога", "ногу", "ноги" - это разные слова.

* Слово с большой и маленькой буквы считать за разные слова. "Нога" и "нога" - это разные слова.

* Знаки препинания считать "буквами" слова или отдельными словами.
"-" (тире) - это отдельное слово. "нога," и "нога" - это разные слова.

## Пример
```
cat and dog, one dog,two cats and one man
```
Топ 7:
- `and` (2)
- `one` (2)
- `cat` (1)
- `cats` (1)
- `dog,` (1)
- `dog,two` (1)
- `man` (1)

При необходимости можно выделять дополнительные функции / ошибки.

Подробности:
https://github.com/OtusGolang/home_work/tree/master/hw03_frequency_analysis

Процесс сдачи домашнего задания:
https://github.com/OtusGolang/home_work/wiki/[Студентам]-Процесс-сдачи-ДЗ
Тестирование в Go
после занятия вы сможете:
писать юнит-тесты к программам на Go, узнаете о “золотых” файлах.
16 декабря, 20:00 — 21:30
Лектор: Алексей Романовский
Продвинутое тестирование в Go
после занятия вы сможете:
писать юнит-тесты к программам на Go.
19 декабря, 20:00 — 21:30
Лектор: Алексей Романовский
Интерфейсы изнутри / ДЗ
узнать как интерфейсы устроены внутри и как их эффективно использовать;
пользоваться type assertion и type switch.
23 декабря, 20:00 — 21:30
Лектор: Олег Венгер
Домашние задания: 1
ДЗ
LRU-кэш. Необходимо реализовать LRU-кэш на основе двусвязного списка.

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

## 1) Реализация двусвязного списка
Список имеет структуру вида
```text
nil <- (prev) front <-> ... <-> elem <-> ... <-> back (next) -> nil
```

Необходимо реализовать следующий интерфейс List:
- Len() int // длина списка
- Front() *ListItem // первый элемент списка
- Back() *ListItem // последний элемент списка
- PushFront(v interface{}) *ListItem // добавить значение в начало
- PushBack(v interface{}) *ListItem // добавить значение в конец
- Remove(i *ListItem) // удалить элемент
- MoveToFront(i *ListItem) // переместить элемент в начало

**Считаем, что методы Remove и MoveToFront вызываются только от существующих в списке элементов.**

Элемент списка ListItem:
- Value interface{} // значение
- Next *ListItem // следующий элемент
- Prev *ListItem // предыдущий элемент

Сложность всех операций должна быть O(1),
т.е. не должно быть мест, где осуществляется полный обход списка.

## 2) Реализация кэша на основе ранее написанного списка
Необходимо реализовать следующий интерфейс Cache:
- Set(key Key, value interface{}) bool // Добавить значение в кэш по ключу.
- Get(key Key) (interface{}, bool) // Получить значение из кэша по ключу.
- Clear() // Очистить кэш.

Структура кэша:
- ёмкость (количество сохраняемых в кэше элементов)
- очередь \[последних используемых элементов\] на основе двусвязного списка
- словарь, отображающий ключ (строка) на элемент очереди

Элемент кэша хранит в себе ключ, по которому он лежит в словаре, и само значение.
Для чего это нужно понятно из алгоритма работы кэша (см. ниже).

Сложность операций `Set`/`Get` должна быть O(1), при желании `Clear` тоже можно сделать О(1).

Алгоритм работы кэша:
- при добавлении элемента:
- если элемент присутствует в словаре, то обновить его значение и переместить элемент в начало очереди;
- если элемента нет в словаре, то добавить в словарь и в начало очереди
(при этом, если размер очереди больше ёмкости кэша,
то необходимо удалить последний элемент из очереди и его значение из словаря);
- возвращаемое значение - флаг, присутствовал ли элемент в кэше.
- при получении элемента:
- если элемент присутствует в словаре, то переместить элемент в начало очереди и вернуть его значение и true;
- если элемента нет в словаре, то вернуть nil и false
(работа с кешом похожа на работу с `map`)

Ожидаются следующие тесты:
- на логику выталкивания элементов из-за размера очереди
(например: n = 3, добавили 4 элемента - 1й из кэша вытолкнулся);
- на логику выталкивания давно используемых элементов
(например: n = 3, добавили 3 элемента, обратились несколько раз к разным элементам:
изменили значение, получили значение и пр. - добавили 4й элемент,
из первой тройки вытолкнется тот элемент, что был затронут наиболее давно).

Подробности:
https://github.com/OtusGolang/home_work/tree/master/hw04_lru_cache

Процесс сдачи домашнего задания:
https://github.com/OtusGolang/home_work/wiki/[Студентам]-Процесс-сдачи-ДЗ
Concurrency в Go
Второй модуль мы посвятим одной из самых главных тем Go - конкуррентности. Познакомимся с горутинами и каналами, с тем, как устроена память и сборка мусора в Go. Научимся писать конкуррентно-безопасные программы.
Горутины и каналы
начать работу с горутинами.
после занятия вы сможете:
реализовать передачу данных между горутинами с помощью канала.
26 декабря, 20:00 — 21:30
Лектор: Олег Венгер
Примитивы синхронизации в деталях / ДЗ
после занятия вы сможете:
пользоваться частью механизмов синхронизации в Go;
бороться с «гонками» в Go.
9 января, 20:00 — 21:30
Лектор: Юра Рубаха
Домашние задания: 1
ДЗ
Параллельное исполнение. Необходимо написать функцию для параллельного выполнения заданий в n параллельных горутинах:
* количество создаваемых горутин не должно зависеть от числа заданий, т.е. функция должна запусать n горутин для параллельно обработки заданий и, возможно, еще несколько вспомогательных горутин;
* функция должна останавливать свою работу, если произошло m ошибок;
* после завершения работы функции (успешного или из-за превышения m) не должно оставаться работающих горутин;
* если задачи работают без ошибок, то выполнятся `len(tasks)` задач (т.е. все задачи);
* если в первых m задачах происходят ошибки, то всего выполнится не более n+m задач.

Нужно учесть, что задания могут выполняться разное время, а длина списка задач
`len(tasks)` может быть больше или меньше n.

Значение m <= 0 трактуется на усмотрение программиста:
- или это знак игнорировать ошибки в принципе;
- или считать это как "максимум 0 ошибок", значит функция всегда будет возвращать
`ErrErrorsLimitExceeded`;
- на эту логику следует написать юнит-тест.

Подробности:
https://github.com/OtusGolang/home_work/tree/master/hw05_parallel_execution

Процесс сдачи домашнего задания:
https://github.com/OtusGolang/home_work/wiki/[Студентам]-Процесс-сдачи-ДЗ
Дополнительные примитивы синхронизации
после занятия вы сможете:
пользоваться полным набором механизмов синхронизации.
13 января, 20:00 — 21:30
Лектор: Юра Рубаха
Concurrency patterns / ДЗ
узнать больше о конкурентности в Go.
после занятия вы сможете:
применять concurrency-паттерны на практике.
16 января, 20:00 — 21:30
Лектор: Юра Рубаха
Домашние задания: 1
ДЗ
Пайплайн. Необходимо реализовать функцию для запуска конкуррентного пайплайна, состоящего из стейджей.

Стейдж - функция, принимающая канал на чтение и отдающая канал на чтение,
а внутри в горутине выполняющая полезную работу:
```golang
func Stage(in <-chan interface{}) (out <-chan interface{}) {
out = make(<-chan interface{})
go func() { /* Some work */ }()
return out
}
```

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

Т.е. пайплан из 4 функций по 100 мс каждая для 5 входных элементов **должен выполняться
гораздо быстрее**, чем за 2 секунды (4 * 100 мс * 5).

Также **должна быть реализована возможность остановить пайплайн** через
дополнительный сигнальный канал (`done`/`terminate`/etc.).

При необходимости можно выделять дополнительные функции.

**Нельзя менять сигнатуры исходных функций.**

Для большего понимания см. тесты.

Подробности:
https://github.com/OtusGolang/home_work/tree/master/hw06_pipeline_execution

Процесс сдачи домашнего задания:
https://github.com/OtusGolang/home_work/wiki/[Студентам]-Процесс-сдачи-ДЗ
Go внутри. Планировщик
познакомиться с устройством планировщика Go;
узнать, когда именно происходит «переключение» горутин.
20 января, 20:00 — 21:30
Лектор: Алексей Романовский
Go внутри. Память и сборка мусора
получить базовую информацию об устройстве памяти в Go;
узнать о механизме GC в Go.
23 января, 20:00 — 21:30
Лектор: Олег Венгер
Стандартные библиотеки и практики
В третьем модуле мы познакомимся с основными функциями стандартной библиотеки Golang, а также наиболее популярными open-source библиотеками. Научимся взаимодействовать с операционной и файловой системами из Go, поговорим о понятиях рефлексии и кодогенерации, а также рассмотрим инструменты профилирования программ, написанных на Go.
Работа с вводом/выводом в Go / ДЗ
узнать тип Buffer;
рассмотреть стандартные интерфейсы: Reader, Scanner, Writer, Closer;
узнать блочные устройства, Seeker;
работа с data intensive apps;
работа с Regex.
27 января, 20:00 — 21:30
Лектор: Алексей Романовский
Домашние задания: 1
ДЗ
Утилита для копирования файлов. Необходимо реализовать утилиту копирования файлов (упрощенный аналог `dd`).

Тулза должна принимать следующие аргументы:
* путь к исходному файлу (`-from`);
* путь к копии (`-to`);
* отступ в источнике (`-offset`), по умолчанию - 0;
* количество копируемых байт (`-limit`), по умолчанию - 0 (весь файл из `-from`).

Особенности:
* offset больше, чем размер файла - невалидная ситуация;
* limit больше, чем размер файла - валидная ситуация, копируется исходный файл до его EOF;
* программа может НЕ обрабатывать файлы, у которых неизвестна длина (например, /dev/urandom);

Также необходимо выводить в консоль прогресс копирования в процентах (%),
допускается использовать для этого стороннюю библиотеку.

Юнит-тесты могут использовать файлы из `testdata` (разрешено добавить свои, но запрещено удалять имеющиеся)
и должны чистить за собой создаваемые файлы (или работать в `/tmp`).

При необходимости можно выделять дополнительные функции / ошибки.

Подробности:
https://github.com/OtusGolang/home_work/tree/master/hw07_file_copying

Процесс сдачи домашнего задания:
https://github.com/OtusGolang/home_work/wiki/[Студентам]-Процесс-сдачи-ДЗ
Конфигурация и логирование
познакомиться с механизмами логирования и конфигурирования в Go.
30 января, 20:00 — 21:30
Лектор: Алексей Романовский
CLI / ДЗ
после занятия вы сможете:
работать с операционной системой из программы на Go.
3 февраля, 20:00 — 21:30
Лектор: Алексей Романовский
Домашние задания: 1
ДЗ
Утилита envdir. Необходимо реализовать утилиту `envdir` на Go.

Эта утилита позволяет запускать программы, получая переменные окружения из определенной директории:
- если директория содержит файл с именем `S`, первой строкой которого является `T`, то
`envdir` удаляет переменную среды с именем `S`, если таковая существует, а затем добавляет
переменную среды с именем `S` и значением `T`;
- имя `S` не должно содержать `=`; пробелы и табуляция в конце `T` удаляются; терминальные нули (`0x00`) заменяются на перевод строки (`\n`);
- если файл полностью пустой (длина - 0 байт), то `envdir` удаляет переменную окружения с именем `S`.

---
Пример использования:
```bash
$ go-envdir /path/to/env/dir command arg1 arg2
```
Если в директории `/path/to/env/dir` содержатся файлы:
* `FOO` с содержимым `123`;
* `BAR` с содержимым `value`,

то вызов выше эквивалентен вызову
```bash
$ FOO=123 BAR=value command arg1 arg2
```
---

Также необходимо, чтобы:
* стандартные потоки ввода/вывода/ошибок пробрасывались в вызываемую программу;
* код выхода утилиты совпадал с кодом выхода программы.

При необходимости можно выделять дополнительные функции / ошибки.

Юнит-тесты могут использовать файлы из `testdata` или создавать свои директории / файлы,
которые **обязаны** подчищать после своего выполнения.

Подробности:
https://github.com/OtusGolang/home_work/tree/master/hw08_envdir_tool

Процесс сдачи домашнего задания:
https://github.com/OtusGolang/home_work/wiki/[Студентам]-Процесс-сдачи-ДЗ
Рефлексия
познакомиться с механизмом рефлексии в Go.
6 февраля, 20:00 — 21:30
Кодогенерация и AST
познакомиться с механизмом кодогенерации в Go;
разобрать использование AST;
после занятия вы сможете:использовать библиотеки использующие кодогенерацию, писать собственные.
10 февраля, 20:00 — 21:30
Лектор: Алексей Романовский
Дженерики в Go / ДЗ
узнать механизмы обобщенного программирования с использованием дженериков;
рассмотреть внутренние механизмы работы, примеры использования.
13 февраля, 20:00 — 21:30
Лектор: Дмитрий Копылов
Домашние задания: 1
ДЗ
Валидатор структур. Необходимо реализовать функцию
```golang
func Validate(v interface{}) error
```
, валидирующую публичные поля входной структуры на основе структурного тэга `validate`.

Функция может возвращать
- или программную ошибку, произошедшую во время валидации;
- или `ValidationErrors` - ошибку, являющуюся слайсом структур, содержащих имя поля и ошибку его валидации.

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

Если у поля нет структурных тэгов или нет тэга `validate`, то функция игнорирует его.

Типы полей, которые обязательно должны поддерживаться:
- `int`, `[]int`;
- `string`, `[]string`.

_При желании можно дополнительно поддержать любые другие типы (на ваше усмотрение)._

Необходимо реализовать следующие валидаторы:
- Для строк:
* `len:32` - длина строки должна быть ровно 32 символа;
* `regexp:\\d+` - согласно регулярному выражению строка должна состоять из цифр
(`\\` - экранирование слэша);
* `in:foo,bar` - строка должна входить в множество строк {"foo", "bar"}.
- Для чисел:
* `min:10` - число не может быть меньше 10;
* `max:20` - число не может быть больше 20;
* `in:256,1024` - число должно входить в множество чисел {256, 1024};
- Для слайсов валидируется каждый элемент слайса.

_При желании можно дополнительно добавить парочку новых правил (на ваше усмотрение)._

Допускается комбинация валидаторов по логическому "И" с помощью `|`, например:
* `min:0|max:10` - число должно находится в пределах [0, 10];
* `regexp:\\d+|len:20` - строка должна состоять из цифр и иметь длину 20.

Подробности:
https://github.com/OtusGolang/home_work/tree/master/hw09_struct_validator

Процесс сдачи домашнего задания:
https://github.com/OtusGolang/home_work/wiki/[Студентам]-Процесс-сдачи-ДЗ
Профилирование и оптимизация Go программ / ДЗ
познакомиться с инструментами профилирования в Go.
после занятия вы сможете:
писать бенчмарки в Go;
профилировать программы на Go;
использовать практики оптимизации кода на Go.
17 февраля, 20:00 — 21:30
Лектор: Дмитрий Копылов
Домашние задания: 1
ДЗ
Оптимизация программы. Вам дан исходный код функции `GetDomainStat(r io.Reader, domain string)`, которая:
* читает построчно из `r` пользовательские данные вида
```text
{"Id":1,"Name":"Howard Mendoza","Username":"0Oliver","Email":"[email protected]","Phone":"6-866-899-36-79","Password":"InAQJvsq","Address":"Blackbird Place 25"}
{"Id":2,"Name":"Brian Olson","Username":"non_quia_id","Email":"[email protected]","Phone":"237-75-34","Password":"cmEPhX8","Address":"Butterfield Junction 74"}
{"Id":3,"Name":"Justin Oliver Jr. Sr.","Username":"oPerez","Email":"[email protected]","Phone":"106-05-18","Password":"f00GKr9i","Address":"Oak Valley Lane 19"}
```
(осторожно, в отличие от конкретной строки файл целиком не является валидным JSON);
* подсчитывает количество email-доменов пользователей на основе домена первого уровня `domain`.

Например, для данных, представленных выше:
```text
GetDomainStat(r, "com") // {}
GetDomainStat(r, "gov") // {"browsedrive": 1, "twinte": 1}
GetDomainStat(r, "edu") // {"quinu": 1}
```

Для большего понимания см. исходный код и тесты.

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

Нельзя:
- изменять сигнатуру функции `GetDomainStat`;
- удалять или изменять существующие юнит-тесты.

Можно:
- писать любой новый необходимый код;
- удалять имеющийся лишний код (кроме функции `GetDomainStat`);
- использовать сторонние библиотеки по ускорению анмаршалинга JSON;
- добавлять юнит-тесты.

**Обратите внимание на запуск TestGetDomainStat_Time_And_Memory**
```bash
go test -v -count=1 -timeout=30s -tags bench .
```

Здесь используется билд-тэг bench, чтобы отделить обычные тесты от тестов производительности.

## Оформление пул-риквеста
В идеале к подобным пул-риквестам пишут бенчмарки и прикладывают результаты работы benchstat, чтобы сразу было видно, что стало лучше и насколько.

Подробности:
https://github.com/OtusGolang/home_work/tree/master/hw10_program_optimization

Процесс сдачи домашнего задания:
https://github.com/OtusGolang/home_work/wiki/[Студентам]-Процесс-сдачи-ДЗ
Работа с сетью и БД
Go чаще всего используется для написания сетевых сервисов. В четвертом модуле мы изучим, как работать с сетью в языке Go. Рассмотрим стандартные протоколы и форматы, а также напишем простой web-сервер. Отдельное внимание будет уделено обработке ошибок, возникающих при работе с сетью. Дополнительно в данном модуле мы поговорим о работе с SQL и gRPC.
Контекст и низкоуровневые сетевые протоколы / ДЗ
после занятия вы сможете:
работать с контекстом в Go;
использовать инструменты отладки сетевых проблем.
27 февраля, 20:00 — 21:30
Лектор: Дмитрий Копылов
Домашние задания: 1
ДЗ
Клиент TELNET. Необходимо реализовать крайне примитивный TELNET клиент
(без поддержки команд, опций и протокола в целом).

Примеры вызовов:
```bash
$ go-telnet --timeout=10s host port
$ go-telnet mysite.ru 8080
$ go-telnet --timeout=3s 1.1.1.1 123
```

* Программа должна подключаться к указанному хосту (IP или доменное имя) и порту по протоколу TCP.
* После подключения STDIN программы должен записываться в сокет,
а данные, полученные из сокета, должны выводиться в STDOUT - всё происходит конкурентно.
* Опционально в программу можно передать таймаут на подключение к серверу
(через аргумент `--timeout`) - по умолчанию `10s`.
* При нажатии `Ctrl+D` программа должна закрывать сокет и завершаться с сообщением.
* При получении `SIGINT` программа должна завершать свою работу.
* Если сокет закрылся со стороны сервера, то при следующей попытке отправить сообщение программа
должна завершаться (допускается завершать программу после "неудачной" отправки нескольких сообщений).
* При подключении к несуществующему серверу, программа должна завершаться с ошибкой соединения/таймаута.

При необходимости можно выделять дополнительные функции / ошибки.

Подробности:
https://github.com/OtusGolang/home_work/tree/master/hw11_telnet_client

Процесс сдачи домашнего задания:
https://github.com/OtusGolang/home_work/wiki/[Студентам]-Процесс-сдачи-ДЗ
Работа с SQL / ДЗ
после занятия вы сможете:
работать с SQL в Go.
3 марта, 20:00 — 21:30
Лектор: Александр Хохлов
Домашние задания: 1
ДЗ
Заготовка сервиса Календарь. Необходимо реализовать скелет сервиса «Календарь», который будет дорабатываться в дальнейшем.

Описание того, к чему мы должны придти, представлено [в техническом задании](https://github.com/OtusGolang/home_work/blob/master/hw12_13_14_15_calendar/docs/CALENDAR.MD).

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

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

Подробности:
https://github.com/OtusGolang/home_work/blob/master/hw12_13_14_15_calendar/docs/12_README.md

Процесс сдачи домашнего задания:
https://github.com/OtusGolang/home_work/wiki/[Студентам]-Процесс-сдачи-ДЗ
Работа с NoSQL
на занятии вы познакомитесь с распространенными NoSQL БД, узнаете области их применения;
после занятия вы сможете:работать с NoSQL в Go.
6 марта, 20:00 — 21:30
Лектор: Дмитрий Копылов
Работа с HTTP
после занятия вы сможете:
работать с HTTP в Go.
10 марта, 20:00 — 21:30
Работа с gRPC
после занятия вы будете знать внутреннее устройство Protobuf, сможете писать обратно совместимые Protobuf схемы;
генерировать gRPC сервисы.
13 марта, 20:00 — 21:30
Работа с gRPC ч.2 / ДЗ
Углубите знания по работе с gRPC в Go.
17 марта, 20:00 — 21:30
Домашние задания: 1
ДЗ
API к Календарю. Необходимо реализовать HTTP и GRPC API для сервиса календаря.

Методы API в принципе идентичны методам хранилища и [описаны в ТЗ](./CALENDAR.MD).

Для GRPC API необходимо:
* создать отдельную директорию для Protobuf спецификаций;
* создать Protobuf файлы с описанием всех методов API, объектов запросов и ответов (
т.к. объект Event будет использоваться во многих ответах разумно выделить его в отдельный message);
* создать отдельный пакет для кода GRPC сервера;
* добавить в Makefile команду `generate`; `make generate` - вызывает `go generate`, которая в свою очередь
генерирует код GRPC сервера на основе Protobuf спецификаций;
* написать код, связывающий GRPC сервер с методами доменной области (бизнес логикой);
* логировать каждый запрос по аналогии с HTTP API.

Для HTTP API необходимо:
* расширить "hello-world" сервер из [ДЗ №12](./12_README.md) до полноценного API;
* создать отдельный пакет для кода HTTP сервера;
* реализовать хэндлеры, при необходимости выделив структуры запросов и ответов;
* сохранить логирование запросов, реализованное в [ДЗ №12](./12_README.md).

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

**Можно использовать https://grpc-ecosystem.github.io/grpc-gateway/.**

Подробности:
https://github.com/OtusGolang/home_work/blob/master/hw12_13_14_15_calendar/docs/13_README.md

Процесс сдачи домашнего задания:
https://github.com/OtusGolang/home_work/wiki/[Студентам]-Процесс-сдачи-ДЗ
Микросервисы
В пятом модуле мы рассмотрим вопросы архитектуры web-сервисов, в частности популярную на данный момент микросервисную архитектуру. Рассмотрим вопросы интеграционного тестирования, развертывания и эксплуатации приложений.
Монолит и микросервисы
получить представление о популярных архитектурах сложных систем.
20 марта, 20:00 — 21:30
Лектор: Дмитрий Копылов
Кэширование
получить представление о кэшировании, разобрать часто встречающиеся механизмы и стратегии кэширования в Go.
24 марта, 20:00 — 21:30
Лектор: Алексей Романовский
Очереди сообщений / ДЗ
получить представление об очередях сообщений и событийно-ориентированной архитектуре.
после занятия вы сможете:
работать с RabbitMQ из Go.
27 марта, 20:00 — 21:30
Домашние задания: 1
ДЗ
Кроликизация Календаря. Необходимо реализовать "напоминания" о событиях с помощью RabbitMQ (кролика).
Общая концепция описана в [техническом задании](./CALENDAR.MD).

Порядок выполнения ДЗ:
* установить локально очередь сообщений RabbitMQ (или сразу через Docker, если знаете как);
* создать процесс Планировщик (`scheduler`), который периодически сканирует основную базу данных,
выбирая события о которых нужно напомнить:
- при запуске процесс должен подключаться к RabbitMQ и создавать все необходимые структуры
(топики и пр.) в ней;
- процесс должен выбирать сообытия для которых следует отправить уведомление (у события есть соотв. поле),
создавать для каждого Уведомление (описание сущности см. в [ТЗ](./CALENDAR.MD)),
сериализовать его (например, в JSON) и складывать в очередь;
- процесс должен очищать старые (произошедшие более 1 года назад) события.
* создать процесс Рассыльщик (`sender`), который читает сообщения из очереди и шлёт уведомления;
непосредственно отправку делать не нужно - достаточно логировать сообщения / выводить в STDOUT.
* настройки подключения к очереди, периодичность запуска и пр. настройки процессов вынести в конфиг проекта;
* работу с кроликом вынести в отдельный пакет, который будут использовать пакеты, реализующие процессы выше.

Процессы не должны зависеть от конкретной реализации RMQ-клиента.

В результате компиляции проекта (`make build`) должно получаться 3 отдельных исполняемых файла
(по одному на микросервис):
- API (`calendar`);
- Планировщик (`calendar_scheduler`);
- Рассыльщик (`calendar_sender`).

Каждый из сервисов должен принимать путь файлу конфигурации:
```bash
./calendar --config=/path/to/calendar_config.yaml
./calendar_scheduler --config=/path/to/scheduler_config.yaml
./calendar_sender --config=/path/to/sender_config.yaml
```

После запуска RabbitMQ и PostgreSQL процессы `calendar_scheduler` и `calendar_sender`
должны запускаться без дополнительных действий.

Подробности:
https://github.com/OtusGolang/home_work/blob/master/hw12_13_14_15_calendar/docs/14_README.md

Процесс сдачи домашнего задания:
https://github.com/OtusGolang/home_work/wiki/[Студентам]-Процесс-сдачи-ДЗ
Docker
получить представление о Docker контейнере и образе.после занятия вы сможете: докеризировать своё приложение.
31 марта, 20:00 — 21:30
K8s / ДЗ
получить представление о оркестраторе Kubernetes, его архитектуре и внутренних компонентах; разобраться с ресурсами K8s и манифестами.
10 апреля, 20:00 — 21:30
Домашние задания: 1
ДЗ
Докеризация и тестирование календаря.
Helm
познакомиться с шаблонизатором Helm и его синтаксисом.
14 апреля, 20:00 — 21:30
Мониторинг / ДЗ
после занятия вы сможете:
мониторить свои приложения.
17 апреля, 20:00 — 21:30
Домашние задания: 1
ДЗ
Шаблонизация манифестов сервиса календаря. - Развернуть кластер K8s (minikibe/k3s/microk8s)
- Написать k8s манифесты для процессов приложения календаря (deployment, service, ingress)
- Написать helm chart для шаблонизации манифестов, создать values файл с дефолтными значениями
Тестирование микросервисов
писать интеграционные тесты для своего приложения.
21 апреля, 20:00 — 21:30
System Design
получить представление о разработке высоконагруженных систем.
24 апреля, 20:00 — 21:30
Проект
Проект, разрабатываемый студентами, будет представлять собой реализацию микросервиса с полным набором компонентов, таких как: ядро, работа с хранилищем, конфигурация и логгирование, работа с очередями сообщений, liveness пробы, Makefile, юнит и интеграционные тесты, статический анализ кода, файлы для деплоя, Dockerfile'ы и пр.
Проектная работа. Вводное
выбрать тему проектной работы, обсудить и начать выполнять её;
спланировать работу над проектом;
получить ответы на возможные вопросы о проекте;
ознакомиться с регламентом работы над проектом.
28 апреля, 20:00 — 21:30
Домашние задания: 1
ДЗ
Проект. выбрать тему;
подтвердить тему в чате с преподавателем;
предоставить промежуточные наработки на промежуточное ревью;
предоставить финальную версию проекта к дедлайну.
Консультация по проектам
получить ответы на вопросы, возникшие во время выполнения проектной работы;
получить ответы на вопросы по ДЗ и курсу в целом.
5 мая, 20:00 — 21:30
Итоговое занятие
узнать, как получить сертификат об окончании курса, как взаимодействовать после окончания курса с OTUS и преподавателями, какие вакансии и позиции есть для выпускников (опционально - в России и за рубежом) и на какие компании стоит обратить внимание.
12 мая, 20:00 — 21:30

Преподаватель

Антон Телышев
Ведущий Golang-разработчик цифровой платформы для pro-беттинга
Успел побывать разработчиком в Mail.Ru Group и Лаборатории Касперского, а также техническим руководителем разработки в “Центре недвижимости от Сбербанка” (ДомКлик).

Окончил бакалавриат и магистратуру в МГТУ им Н.Э. Баумана (кафедра “Компьютерные системы и сети (ИУ6)”). Учился в Технопарке Mail.Ru, где впоследствии преподавал Подготовительную программу по С++.

В свободное время веду Telegram-канал о Golang (@gouniverse).

Основные технические навыки:
Golang
Python
C++

F.A.Q.: Наиболее часто задаваемые вопросы:

Нужно ли оплачивать обучение до Дня открытых дверей, если я хочу гарантированно попасть в группу?
Да, мы рекомендуем заранее оплатить обучение, чтобы гарантированно попасть в группу. В период проведения Дня открытых дверей резко возрастает количество желающих обучаться, поэтому может случиться так, что к окончанию Дня открытых дверей мест в группе не останется
Кто будет проводить День открытых дверей?
Проводить День открытых дверей будет преподаватель курса.
Как принять участие в Дне открытых дверей?
Для того, чтобы принять участие в Дне открытых дверей, оставьте свой e-mail в поле регистрации на мероприятие. Перед началом Дня открытых дверей мы пришлем вам ссылку, пройдя по которой, вы сможете присоединиться к вебинару.
Какие вопросы будем обсуждать на Дне открытых дверей?
На дне открытых дверей мы поговорим о проекте OTUS (о программе курса, почему мы не принимаем в группы новичков, почему учиться у нас интересно, но сложно), карьерных перспективах выпускников (почему вероятность карьерного роста у лучших студентов стремится к 100%), учебном процессе (оплатах, оценке знаний, сертификатах и прочих аспектах). Также ведущий мероприятия с радостью ответит на все ваши вопросы.
Черная пятница в Otus! ⚡️
Скидка 15% на все курсы до 20.11 →