Slide 1

Slide 1 text

Из Python в Go и обратно Андрей Минкин (Mad Devs)

Slide 2

Slide 2 text

Кто я? CTO в Mad Devs 5+ лет админил 5+ лет кодил на Python 5+ лет кодил на Go 15+ лет в IT Докладчик, ментор и активно делюсь опытом

Slide 3

Slide 3 text

Mad Devs работает с Консалтинг и разработка EdTech FinTech Транспорт и логистика Блокчейн DevOps E-commerce

Slide 4

Slide 4 text

Disclaimer В докладе не будет объективности, чего-то поучительного, а просто много набросов, субъективщины и личного опыта и набитых шишек и куча непонятных отсылок и мемчиков Кто поймет, тот поймет (с)

Slide 5

Slide 5 text

Кому будет полезен доклад Go разработчикам, которые не знают о Python Python разработчикам, которые изучают Go Разработчикам, которые хотят послушать доклад по фану Люди, которые сомневаются в выборе Go как языка для своего сервиса

Slide 6

Slide 6 text

А вообще, формат доклада должен быть таким Душевный Холивар Под Пенное

Slide 7

Slide 7 text

No content

Slide 8

Slide 8 text

Что было в 2014 Я тимлид в Namba Taxi Стек: Python (Django/Twisted) / Ruby (eventmachine) / Node.js (socket.io) Доклад

Slide 9

Slide 9 text

Что было в 2014 Плагина для Idea для Go нет Вимом тогда я не пользовался Был какой-то liteide, который не очень заходил Метод с маленькой буквы не публичный

Slide 10

Slide 10 text

Останусь пока на питоне

Slide 11

Slide 11 text

Я в 2015 Поддержка Python 2 закончится в 2020 На Python 3 мало библиотек Переезд на Python 3 заставляет усомниться в правильности выбора профессии

Slide 12

Slide 12 text

На Go буду писать

Slide 13

Slide 13 text

Второе погружение в Go

Slide 14

Slide 14 text

О, есть сообщество О, есть плагин для idea О, есть готур О, а на Go можно программировать Что изменилось

Slide 15

Slide 15 text

Бекенд рассылки пуш нотификаций

Slide 16

Slide 16 text

Go vs Python: Первые впечатления err := something() if err != nil { return nil, err } try: something() except e: raise

Slide 17

Slide 17 text

Нужно обрабатывать каждую ошибку?

Slide 18

Slide 18 text

А может быть нет? defer func() { if err := recover(); err != nil { fmt.Println(err) } }() err := something() if err != nil { panic(err) }

Slide 19

Slide 19 text

Не огорчай его

Slide 20

Slide 20 text

Стадии принятия Don’t just check errors, handle them gracefully Это ведь похоже на TDD Зато мой код более очевиден.

Slide 21

Slide 21 text

Обработка ошибок конечно надоедает, но 1. Код становится понятнее 2. Код становится предсказуемее 3. Приходится мириться с if err != nil

Slide 22

Slide 22 text

Но постоянно писать это конечно надоедает.

Slide 23

Slide 23 text

Concurrency

Slide 24

Slide 24 text

Python vs Go: Concurrency/async/threading Event Loop aka Reactor - Twisted - Asyncio - async/await Threads/ThreadPool CSP go

Slide 25

Slide 25 text

Python Twisted Asyncio async/await

Slide 26

Slide 26 text

Threads/Processes

Slide 27

Slide 27 text

Go Goroutine Channels wait/error groups Mutexes Race detector Все достаточно просто для понимания

Slide 28

Slide 28 text

Как сделать асинхронный код на Python?

Slide 29

Slide 29 text

Как сделать асинхронный код на Python? Написать его на Go

Slide 30

Slide 30 text

Как сделать асинхронный код на Python? Написать его на Go

Slide 31

Slide 31 text

К чему пришли Python + Go для всего Хорошо работает - Производительность - Time to market - Качество

Slide 32

Slide 32 text

А давай вообще все писать на го?

Slide 33

Slide 33 text

Чтобы нам не написать API на Go?

Slide 34

Slide 34 text

Чтобы нам не написать API на Go? Что же выбрать? Iris или echo?

Slide 35

Slide 35 text

Iris 1. Много звезд 2. Отличная активность проекта 3. Много закрытых issues 4. Достаточно понятный и простой код 5. Хороший роадмап

Slide 36

Slide 36 text

Взяли бы?

Slide 37

Slide 37 text

Что такое iris на самом деле Переписанная история Сквош коммитов Постоянно измененная API Да и вообще подробнее тут

Slide 38

Slide 38 text

Чему я научился Код библиотеки нужно ревьюить с многих сторон - Проверять код на качество - Проверять наличие звезд - Активность ничего не значит, если тул работает хорошо

Slide 39

Slide 39 text

Echo Хороший подход к дизайну Стабильное API Активное сообщество Достаточно удобно использовать и писать REST API

Slide 40

Slide 40 text

No content

Slide 41

Slide 41 text

No content

Slide 42

Slide 42 text

Что не так с API на Go Очень много ручной работы при написании REST API - Генераторы - Reflect - Очень много бойлерплейта Выгода не очень очевидна - Если только нет требований к максимальному перформансу

Slide 43

Slide 43 text

На питоне это было бы быстрее

Slide 44

Slide 44 text

Как обновить Go в продакшне

Slide 45

Slide 45 text

А почему весь мой код на Go такой плохой? Нет читаемости Код запутанный Сложно писать тесты

Slide 46

Slide 46 text

SOLID? Тесты? - Нужда заставила - Кодить по модулям - прикольно - Так вот как выглядит SOLID

Slide 47

Slide 47 text

Я был типичным питонистом - Django, если в web разработке - Про SOLID не слышал - Действует в рамках шаблонов - Пользуется pytest, unittest

Slide 48

Slide 48 text

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

Slide 49

Slide 49 text

Первый шаг к пониманию SOLID Тестовый фреймворк - Оформляй пакет как модуль в питоне - Напиши тест вместо проверки в main.go - Тестовый фреймворк удобен из коробки - А еще есть бенчмарки

Slide 50

Slide 50 text

Следующий шаг Еще раз читаем - Чистый код - Чистая архитектура

Slide 51

Slide 51 text

Что не так с SOLID в Python? Нет интерфейсов __init__ все портит

Slide 52

Slide 52 text

Python class Animal: def __init__(self, name: str): self.name = name def get_name(self): pass

Slide 53

Slide 53 text

Go type Animal struct { Name string }

Slide 54

Slide 54 text

No content

Slide 55

Slide 55 text

А дело вот в этом Кошелек Миллера Как писать читаемый код

Slide 56

Slide 56 text

Спустя 5+ лет программирования на Go что получил + Больше друзей в сообществе + Больше знакомых + Лучшее понимание SOLID, OOP и дизайна + Лучшее понимание построения архитектур + Лучшее владение инструментами

Slide 57

Slide 57 text

2019. Монолит распилим? PHP -> Python + Go

Slide 58

Slide 58 text

No content

Slide 59

Slide 59 text

Привет, Python - Завезли типы - Завезли 3й питон - Завезли pipenv - Починили unicode и теперь нет возни с ним - Prospector (скупой аналог golangci-lint) - Black (аналог go fmt)

Slide 60

Slide 60 text

Менеджмент зависимостей

Slide 61

Slide 61 text

Python Pip Pipenv

Slide 62

Slide 62 text

Go Godep Glide Govendor … Go mod

Slide 63

Slide 63 text

Что общего у обоих языков? Менеджмент зависимостей у обоих вызывает боль Go mod и pipenv одинаково медленные и проблемные в некоторых случаях

Slide 64

Slide 64 text

Python vs Go Централизированный Пакеты вызывают доверие Подвержен Dependency confusion атаке Децентрализированный Пакеты не вызывают доверие Не подвержен Dependency confusion атаке

Slide 65

Slide 65 text

Дополнительно https://medium.com/@alex.birsan/dependency-confusion-4a5d60fec610

Slide 66

Slide 66 text

Сравнение сообществ And I love what you do Don't you know that you're toxic?

Slide 67

Slide 67 text

Плюсы Go сообщества - Поддержка - Подкасты - Много разных абмассадоров - А еще разработчикам языка интересно, что нужно сообществу.

Slide 68

Slide 68 text

Но это все есть и в питоне

Slide 69

Slide 69 text

А еще питонистов больше

Slide 70

Slide 70 text

Все одинаково хороши и плохи

Slide 71

Slide 71 text

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

Slide 72

Slide 72 text

Что в Go прям отлично + Golangci-lint + Grpc + Godoc + go mod + UNIX философия + If err != nil /trollface + Более читаемый код

Slide 73

Slide 73 text

А еще можно программировать без интернета

Slide 74

Slide 74 text

Что не так Перегрузка типов Перегрузка функций If err != nil

Slide 75

Slide 75 text

Чего не хватает в Python? - Аналога godoc - Нормального металинтера(prospector хорош, но его мало) - Более простых типов - Небольшой диктатуры - Форматера из коробки

Slide 76

Slide 76 text

Чего не хватает в Go? - Перегрузки типов и функций - Шаблонов

Slide 77

Slide 77 text

Выводы

Slide 78

Slide 78 text

Не нужна тебе REST API на Go, брат

Slide 79

Slide 79 text

Выводы В мире есть не только Go Код библиотек нужно и важно ревьюить перед использованием SOLID лучше осваивать в Go … ради $, … для души (вставьте свое) Go разработчики хотят незаслуженно больше денег :trollface: Все сообщества одинаково токсичны и нет

Slide 80

Slide 80 text

Когда Go? Нужно что-то асинхронное и многопоточное Нужно что-то для gRPC Есть понятные требования по перформансу Есть люди, которые это будут поддерживать и мы сможем найти их на рынке

Slide 81

Slide 81 text

Когда Python? REST и прочие API Где есть много бойлерплейт кода Где есть требования к минимальному time-to-market

Slide 82

Slide 82 text

Вопросы-набросы? @maddevsio @gen1us2k