forked from RedHatOfficial/GoCourse
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathgo_worth_learning_ru.slide
More file actions
350 lines (225 loc) · 12.6 KB
/
go_worth_learning_ru.slide
File metadata and controls
350 lines (225 loc) · 12.6 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
Стоит ли изучать язык Go?
Red Hat
19 Sep 2023
Tags: golang, go
Pavel Tišnovský <ptisnovs@redhat.com>
Red Hat, Inc.
* Введение
Существует множество интересных языков программирования, которые можно изучить.
Вопрос в том, стоит ли совершенствовать их все? Ответ - нет, конечно.
Так что насчет языка Go - стоит ли попробовать?
В этой презентации мы поговорим о плюсах Go (горутины,
каналы, GC, системы типов) и минусах (язык с атрибутами, взятыми из
прошлого века :)
* Gophers
#The Go gopher was designed by Renee French. (http://reneefrench.blogspot.com/)
#Source https://golang.org/doc/gopher/fiveyears.jpg
#The design and this image is licensed under the Creative Commons 3.0 Attributions license.
.image ./common/fiveyears.jpg _ 900
* Введение
- Запущен в ноябре 2009 года Google
- Rob Pike, Ken Thompson, Robert Griesemer
- Более читаемая замена для C/C++/Java/...
- Лучше подходит потребностям корпораций
- „Меньше значит больше"
* Введение
- (статически) компилируемый
- статически типизированный
- позволяет кросс-компиляцию
- с автоматическим управлением памяти
- встроенная конкурентность
- строгие правила форматирования
- вывод типов
* Использование
- серверный веб (PHP, Node.js, Python, Ruby, Java)
- клиентский веб (компиляция в WebAssembly)
- облачные технологии (Docker, Podman, Kubernetes, Kubernetes Operators, MinIO, ...)
- доступен для всех интересных систем
- и большинства архитектур (x86-64, ARMv6, ARMv8, даже s390x и PowerPC64 LE)
- пользовательский бэкенд + cgo
* Более читаемый по сравнению с C/C++
- Эволюционировал от C
- Объявления в постфиксе
- Гораздо быстрее для парсера разбирать исходники
- Экспортируемые символы начинаются с заглавной буквы
- [[https://blog.golang.org/gos-declaration-syntax]]
.code src/syntax_c.go
.code src/syntax_go.go
* Более читаемый по сравнению с C++
- В C++ мы не говорим "Пропущена звездочка"
- мы говорим:
"error C2664:
'void std::vector<block,std::alocator<_Ty> >::push_back(const block &)':
cannot convert argument 1 from
'std::_Vector_iterator<std::_Vector_val<std::_Simple_types<block> > >'
to 'block &&'"
- и я думаю, это прекрасно
- не мое, источник:
.link https://goo.gl/Akxjih
* Более читаемый по сравнению с C++
#include <vector>
#include <algorithm>
int main()
{
int a;
std::vector< std::vector <int> > v;
std::vector< std::vector <int> >::const_iterator it = std::find( v.begin(), v.end(), a );
}
- gcc -c error.cpp выдаст 15786 байт вывода с самой длинной строкой в 330 символов
* Облачные технологии
.link https://www.docker.com/ Docker
.link https://podman.io/ Podman
.link https://kubernetes.io/ Kubernetes
.link https://coreos.com/operators/ Kubernetes Operators
.link https://min.io/ MinIO
.link https://nsq.io/ NSQ
.link https://nats.io/ NATS
.link https://www.redhat.com/en/technologies/cloud-computing/openshift OpenShift
.link https://geth.ethereum.org/ Go Ethereum
* Цели
- простота
- однозначность
- производительность
- прагматичность
- более безопасные приложения (по сравнению с C/C++)
- микросервисы
- простота установки ("DLL hell" не может случиться)
- для DevOps от DevOps
- быстрые (фактически супербыстрые) сборки (CI инструменты это любят ;-)
* Внимание
- Go - это смесь современных подходов в сочетании с довольно старыми идеями
- явная обработка ошибок
- нет дженериков до версии 1.18
- нет ООП на основе классов
- нет `try`/`catch`/`finally`
- нет тернарного оператора
- ключевое слово `goto`
- идентификатор `nil`
* Интерфейсы реализуются автоматически
- "удовлетворяются" в терминологии Go
.image ./images/interface.svg _ 500
* Go против C(++)
- более сильная система типов
- нет макросов текстовой подстановки
- нет заголовочных файлов
- система пакетов + проверки
- более безопасные операции с памятью + GC
- стандартизированный фреймворк для тестов
- более строгие правила (`++`/`--`, указатели, ...)
- нет структур управления обработкой исключений (пока?)
- нет универсальных типов данных до Go 1.18
* Но... мы живем в 21 веке!
.image ./images/ural.jpg _ 700
* Но... мы живем в 21 веке!
- Многоядерные процессоры
- Распределенные системы
- Локальность памяти
- Читаемость
* Многоядерные процессоры
.image ./images/perf.jpg _ 700
* Многоядерные процессоры
.image ./images/Amdahl.png
* Немного истории
- 60-е: недостаточное управление потоком программы
- "GOTO считается вредным"
- решено введением структурного программирования
- -> новый синтаксис
* Немного истории
- 70-е: недостаточное управление состоянием
- решено введением ООП
- -> новый синтаксис
* Немного истории
- 2000: недостаточное управление конкурентностью
- не решено долгое время
- Горутины + каналы Go
- async в Python и JavaScript
- -> новый синтаксис
* Поддержка конкурентности
- Взаимодействующие последовательные процессы (формальный язык и т.д.)
- "Не общайтесь через разделение памяти; разделяйте память через общение"
- Так называемые _горутины_
- Каналы
* Конкурентность и/или параллелизм
- Последовательное: выполняет задачи по порядку с одним ядром процессора
- Конкурентное: выполняет множество задач одновременно с меньшим количеством ядер процессора (или даже 1)
- Параллельное: выполняет n задач одновременно с n ядрами процессора
* Конкурентность
- когда множественные задачи могут выполняться в перекрывающиеся периоды
- нужно только одно ядро процессора
- основная проблема: прерывания
* Параллелизм
- нужно более одного ядра процессора
- основная проблема: изоляция
- вторая проблема: координация
* Решения для конкурентности и параллелизма
- процессы
- потоки
- корутины
* Решения для конкурентности и параллелизма
- процессы
- потоки
- **горутины**
- корутины
* Горутины + каналы - это способ ... Go
- Дедлоки тогда не такая большая проблема
.image ./images/deadlock.gif _ 700
* Локальность памяти
- Настоящие структуры
- Настоящие типы значений
- Нет заголовков объектов
- Java: нет типов значений, нет структур, заголовки объектов
* Локальность памяти
- RAM больше не "Память с произвольным доступом"
* Локальность памяти
.image ./images/computer_latency_1.jpg _ 300
* Локальность памяти и время доступа
- Мы, люди, плохо сравниваем очень малые периоды времени
- То же для других единиц (длина, деньги и т.д.)
* Локальность памяти и время доступа
.image ./images/computer_latency_2.png _ 500
* Go и принцип KISS
* Динамичные команды разработчиков
.image ./images/teams.png _ 500
* Динамичные команды разработчиков
- стабильность
- на уровне исходного кода: если компилируется в версии X, будет компилироваться в версии X+1 тоже
- С другой стороны: https://pythonclock.org/
- читаемость
* go-fmt
- Стиль Gofmt никому не нравится, но gofmt нравится всем. — Rob Pike
- стандартный инструмент
* Хотите быть мейнстримом?
- [[http://pypl.github.io/PYPL.html]]
- [[https://hackernoon.com/10-best-programming-languages-to-learn-in-2019-e5b05af4a972]]
- [[https://insights.dice.com/2018/12/17/5-programming-languages-consider-learning-2019/]]
- [[https://www.rankred.com/new-programming-languages-to-learn/]]
* Популярность
- [[https://insights.stackoverflow.com/survey/2020#technology-most-loved-dreaded-and-wanted-languages-loved]]
- [[https://insights.stackoverflow.com/survey/2020#technology-most-loved-dreaded-and-wanted-languages-dreaded]]
- [[https://insights.stackoverflow.com/survey/2020#technology-most-loved-dreaded-and-wanted-languages-wanted]]
* График популярности
.image ./images/popularity.png _ 600
* Итак...стоит ли тратить время на изучение Go?
- сети - ДА
- (микро)сервисы - ДА
- масштабируемые системы - ДА
- вам нравятся строгие правила форматирования - ДА
- вам нравятся сильные системы типов - ДА
- вам нравится минимализм - ДА
- довольно быстрая компиляция - ДА
- простейшее развертывание - ДА
- гарантированная совместимость исходного кода - ДА
* Итак...стоит ли тратить время на изучение Go?
- вам нравится классическое (сломанное) ООП на основе классов - НЕТ
- вам нравятся барочные языки - НЕТ, наслаждайтесь C++
- вам нравятся непоследовательные языки - НЕТ, наслаждайтесь Perl
- вам нравятся гомоиконические языки - НЕТ, LISP/Scheme/Clojure лучше тогда
- вы хотите управлять памятью самостоятельно - НЕТ
- вам нравятся переполнения буфера - НЕТ, есть "лучшие" варианты
- вам нравится действительно очень сильная система типов и быстрый язык - Rust
#last slide
* Больше Gophers
#The Go gopher was designed by Renee French. (http://reneefrench.blogspot.com/)
#Source https://golang.org/doc/gopher/bumper.png
#The design and this image is licensed under the Creative Commons 3.0 Attributions license.
.image ./images/bumper.png _ 900