/
index.html
304 lines (280 loc) · 15 KB
/
index.html
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
<html>
<head>
<meta charset="UTF-8"/>
<link rel="stylesheet" href="node_modules/reveal.js/css/reveal.css">
<link rel="stylesheet" href="node_modules/reveal.js/css/theme/white.css">
</head>
<body>
<div class="reveal">
<div class="slides">
<section data-markdown>
<script type="text/template">
## Современное программирование
---
<footer style="text-align: right;">
by: <img src="images/avatar.png"
style="width: 1em; height: 1em; margin: 0; border: 0; box-shadow: none;" /><br/>
https://github.com/ForNeVeR<br/>
https://fornever.me/
</footer>
</script>
</section>
<section data-markdown>
<script type="text/template">
## Современное программирование
---
<footer style="text-align: right;">
by: <img src="images/avatar.png"
style="width: 1em; height: 1em; margin: 0; border: 0; box-shadow: none;" /><br/>
https://github.com/ForNeVeR<br/>
https://fornever.me/
</footer>
</script>
</section>
<section data-markdown>
<script type="text/template">
## Про докладчика
- Self-Employed (2010—present): Lead Java Programmer
- <img src="images/enterra.png" style="width: 1em; height: 1em; margin: 0; border: 0; box-shadow: none;" /> Enterra Inc
(2011—present): Lead .NET Programmer<br>
http://www.enterra.ru/
</script>
</section>
<section data-markdown>
<script type="text/template">
## Направления программирования
- встраиваемые устройства (embedded)
- настольные приложения (desktop)
- приложения для мобильных устройств (телефоны, часы, планшеты и пр.)
- веб-сайты
- графика, игры
- обработка данных (big data)
- системное программирование
- инфраструктура (средства разработки, компиляторы)
</script>
</section>
<section data-markdown>
<script type="text/template">
## Embedded
- микроконтроллеры
- ПЛИС
- разработка железа
- softcore (Arduino, Raspberry PI)
- нужно знать:
- электронику
- низкоуровневые языки (asm, C)
</script>
</section>
<section data-markdown>
<script type="text/template">
## Desktop
- Windows, macOS, Linux, BSD
- GUI
- нужно знать:
- GUI-фреймворки (WPF, GTK, Qt, Cocoa etc.)
- асинхронность, многопоточность
- целевую платформу
</script>
</section>
<section>
<img src="images/intapplications.jpg" style="height: 100%"/>
</section>
<section data-markdown>
<script type="text/template">
## Разработка для мобильных устройств
- Android, iOS, Windows Phone (?)
- Нативная разработка (Objective C / Swift, Java, C#)
- Кроссплатформенные инструменты (Cordova etc., Xamarin, React Native)
- нужно знать:
- особенности конкретных устройств
</script>
</section>
<section data-markdown>
<script type="text/template">
## Веб-сайты
- Backend (серверная часть)
- Frontend (клиентская часть)
- вёрстка (HTML, CSS и препроцессоры)
- программирование (JavaScript и трансляторы)
- нужно знать:
- HTTP (HTTPS)
- модель безопасности веба
</script>
</section>
<section data-markdown>
<script type="text/template">
## Графика, игры
- конвеер обработки изображения
- языки описания шейдеров
- OpenGL, DirectX, Vulkan
- игровые движки (или возможность работать без них)
</script>
</section>
<section data-markdown>
<script type="text/template">
## Обработка данных
- распределённые вычисления (e.g. map/reduce)
- вычисления на GPU
- микрооптимизации
</script>
</section>
<section data-markdown>
<script type="text/template">
## "Системное" программирование
- вызовы ядра
- WinAPI / COM (Windows)
- отладка ядра
</script>
</section>
<section data-markdown>
<script type="text/template">
## Что полезно знать всем
- английский язык
- архитектура компьютера и операционной системы
- алгоритмы и структуры данных
- (машинная) арифметика
- методы управления памятью (GC, ручное управление)
- объектно-ориентированное программирование
- функциональное программирование
- принципы проектирования: DRY, KISS, SOLID
- SQL, JavaScript ☹
</script>
</section>
<section data-markdown>
<script type="text/template">
## Системы контроля версий
- централизованные
- SVN
- TFS
- Perforce
- децентрализованные
- Git
- Hg
</script>
</section>
<section data-markdown>
<script type="text/template">
## Операционные системы
- BSD
- Linux + Android
- macOS + iOS
- Windows + Windows Phone
</script>
</section>
<section data-markdown>
<script type="text/template">
## Языки программирования
- статическая или динамическая типизация
- функциональные и (или) императивные
- мощность системы типов
</script>
</section>
<section data-markdown>
<script type="text/template">
## Статическая или динамическая типизация
```javascript
// JavaScript / ES2015, динамическая типизация
let a = 6; // число
a = 'aaa'; // строка
```
```fsharp
// F#, статическая типизация
let mutable a = 6 // число
a = "aaa" // не скомпилируется
```
</script>
</section>
<section data-markdown>
<script type="text/template">
## Функциональные / императивные языки
- функциональный описывает, _что_ должно быть результатом
- императивный описывает шаги по достижению результата
</script>
</section>
<section data-markdown>
<script type="text/template">
## Сумма массива чисел по-императивному
```cpp
// C++
int array[] = { 1, 2, 3 }; // берём массив
int sum = 0; // начиная с нуля
for (int i = 0; i < 3; ++i)
sum += array[i]; // прибавим i-й элемент к накопленной сумме
printf("%d", sum); // ⇒ 6
```
</script>
</section>
<section data-markdown>
<script type="text/template">
## Сумма массива чисел по-функциональному
```fsharp
// F#
let array = [| 1; 2; 3 |] // берём массив
let sum = Seq.reduce (+) // сумма — результат свёртки массива оператором +
printfn "%d" (sum array) // ⇒ 6
```
</script>
</section>
<section data-markdown>
<script type="text/template">
## Мощность системы типов
- слабая типизация (PHP, JavaScript, Clojure)
- сильная типизация (C, C#, C++, Java)
- чрезвычайно сильная типизация (Haskell, Scala, F#)
- слишком сильная типизация (Agda, Idris, Coq)
</script>
</section>
<section data-markdown>
<script type="text/template">
## Куда пойти контрибьютить
- GitHub
</script>
</section>
<section data-markdown>
<script type="text/template">
## Куда пойти контрибьютить
https://codingteam.org.ru/
<img src="images/codingteam.png" style="width: 100%;"/>
</script>
</section>
<section data-markdown>
<script type="text/template">
## Что почитать
- Кормен — Алгоритмы: построение и анализ
- Окасаки — Чисто функциональные структуры данных
- Design Patterns: Elements of Reusable Object-Oriented Software
- Jeffrey Richter — CLR via C#
- Bruce Eckel — Thinking in Java
- Learn You a Haskell for Great Good (http://learnyouahaskell.com/)
</script>
</section>
<section data-markdown>
<script type="text/template">
## Это конец
<br/><br/><br/>
<small>Слайды доступны в репозитории https://github.com/ForNeVeR/modern-programming</small>
</script>
</section>
</div>
</div>
<script src="node_modules/reveal.js/lib/js/head.min.js"></script>
<script src="node_modules/reveal.js/js/reveal.js"></script>
<script>
var link = document.createElement('link');
link.rel = 'stylesheet';
link.type = 'text/css';
link.href = window.location.search.match(/print-pdf/gi)
? 'node_modules/reveal.js/css/print/pdf.css'
: 'node_modules/reveal.js/css/print/paper.css';
document.getElementsByTagName('head')[0].appendChild(link);
</script>
<script>
Reveal.initialize({
dependencies: [
{ src: 'node_modules/reveal.js/plugin/markdown/marked.js', condition: function() { return !!document.querySelector( '[data-markdown]' ); } },
{ src: 'node_modules/reveal.js/plugin/markdown/markdown.js', condition: function() { return !!document.querySelector( '[data-markdown]' ); } }
]
});
</script>
</body>
</html>