const fs = require('fs'); const compose = (...funcs) => x => funcs.
reduce((x, fn) => fn(x), x); const DENSITY_COL = 3; const renderTab
table => { const cellWidth = [18, 10, 8, 8, 18, 6]; return table.ma
=> (row.map((cell, i) => { const width = cellWidth[i]; return i ? c
toString().padStart(width) : cell.padEnd(width); }).join(''))).join
}; const proportion = (max, val) => Math.round(val * 100 / max); co
calcProportion = table => { table.sort((row1, row2) => row2[DENSITY
row1[DENSITY_COL]); const maxDensity = table[0][DENSITY_COL]; table
forEach(row => { row.push(proportion(maxDensity, row[DENSITY_COL]))
return table; }; const getDataset = file => { const lines = fs.read
FileSync(file, 'utf8').toString().split('n'); lines.shift(); lines
return lines.map(line => line.split(',')); }; const main = compose
(getDataset, calcProportion, renderTable); const fs = require('fs'
compose = (...funcs) => x => funcs.reduce((x, fn) => fn(x), x); con
DENSITY_COL = 3; const renderTable = table => { const cellWidth = [
8, 8, 18, 6]; return table.map(row => (row.map((cell, i) => { const
= cellWidth[i]; return i ? cell.toString().padStart(width) : cell.p
(width); }).join(''))).join('n'); }; const proportion = (max, val)
Почему хорошее ИТ-образование
не востребовано рыночком
и о перспективах на 10 лет
Тимур Шемсединов
Chief Software Architect at Metarhia
Lecturer at Kiev Polytechnic Institute
github.com/tshemsedinov
const fs = require('fs'); const compose = (...funcs) => x => funcs.
reduce((x, fn) => fn(x), x); const DENSITY_COL = 3; const renderTab
table => { const cellWidth = [18, 10, 8, 8, 18, 6]; return table.ma
=> (row.map((cell, i) => { const width = cellWidth[i]; return i ? c
Кто тут?
const fs = require('fs'); const compose = (...funcs) => x => funcs.
reduce((x, fn) => fn(x), x); const DENSITY_COL = 3; const renderTab
table => { const cellWidth = [18, 10, 8, 8, 18, 6]; return table.ma
=> (row.map((cell, i) => { const width = cellWidth[i]; return i ? c
Кто тут?
Чистые функции
Каррирование
Функторы
const fs = require('fs'); const compose = (...funcs) => x => funcs.
reduce((x, fn) => fn(x), x); const DENSITY_COL = 3; const renderTab
table => { const cellWidth = [18, 10, 8, 8, 18, 6]; return table.ma
=> (row.map((cell, i) => { const width = cellWidth[i]; return i ? c
Кто тут?
Двоичное дерево
Двусвязный список
Стек, Дек, Очередь
const fs = require('fs'); const compose = (...funcs) => x => funcs.
reduce((x, fn) => fn(x), x); const DENSITY_COL = 3; const renderTab
table => { const cellWidth = [18, 10, 8, 8, 18, 6]; return table.ma
=> (row.map((cell, i) => { const width = cellWidth[i]; return i ? c
Кто тут?
Промисы, Фьючеры
Thenable
Async Iterable
const fs = require('fs'); const compose = (...funcs) => x => funcs.
reduce((x, fn) => fn(x), x); const DENSITY_COL = 3; const renderTab
table => { const cellWidth = [18, 10, 8, 8, 18, 6]; return table.ma
=> (row.map((cell, i) => { const width = cellWidth[i]; return i ? c
Кто тут?
СМО
Concurrent Queue
CQRS, Event sourcing
const fs = require('fs'); const compose = (...funcs) => x => funcs.
reduce((x, fn) => fn(x), x); const DENSITY_COL = 3; const renderTab
table => { const cellWidth = [18, 10, 8, 8, 18, 6]; return table.ma
=> (row.map((cell, i) => { const width = cellWidth[i]; return i ? c
Кто тут?
node_modules
npm
Event Loop
const fs = require('fs'); const compose = (...funcs) => x => funcs.
reduce((x, fn) => fn(x), x); const DENSITY_COL = 3; const renderTab
table => { const cellWidth = [18, 10, 8, 8, 18, 6]; return table.ma
=> (row.map((cell, i) => { const width = cellWidth[i]; return i ? c
Кто тут?
Inline Cache
Tail Call Optimization
Hidden class
const fs = require('fs'); const compose = (...funcs) => x => funcs.
reduce((x, fn) => fn(x), x); const DENSITY_COL = 3; const renderTab
table => { const cellWidth = [18, 10, 8, 8, 18, 6]; return table.ma
=> (row.map((cell, i) => { const width = cellWidth[i]; return i ? c
Кто тут?
Socket, TLS
XSS, CSP
SQL-injection
const fs = require('fs'); const compose = (...funcs) => x => funcs.
reduce((x, fn) => fn(x), x); const DENSITY_COL = 3; const renderTab
table => { const cellWidth = [18, 10, 8, 8, 18, 6]; return table.ma
=> (row.map((cell, i) => { const width = cellWidth[i]; return i ? c
Кто тут?
Семафоры
Мьютексы
Спинлоки
const fs = require('fs'); const compose = (...funcs) => x => funcs.
reduce((x, fn) => fn(x), x); const DENSITY_COL = 3; const renderTab
table => { const cellWidth = [18, 10, 8, 8, 18, 6]; return table.ma
=> (row.map((cell, i) => { const width = cellWidth[i]; return i ? c
Кто тут?
Reflection
Scaffolding
Introspection
const fs = require('fs'); const compose = (...funcs) => x => funcs.
reduce((x, fn) => fn(x), x); const DENSITY_COL = 3; const renderTab
table => { const cellWidth = [18, 10, 8, 8, 18, 6]; return table.ma
=> (row.map((cell, i) => { const width = cellWidth[i]; return i ? c
Кто тут?
Адаптер
Фабрика
Dependency Injection
const fs = require('fs'); const compose = (...funcs) => x => funcs.
reduce((x, fn) => fn(x), x); const DENSITY_COL = 3; const renderTab
table => { const cellWidth = [18, 10, 8, 8, 18, 6]; return table.ma
=> (row.map((cell, i) => { const width = cellWidth[i]; return i ? c
Какое бывает ИТ
Наука λ-исчисление; O; (Π, σ, ⋈, ⋉, ⋊...)
Парадигмы ФП, СП, ООП, МП (meta), МПП (multi)
Техники п. ПП, АП, ОП (generics), actors, CRDT
Технологии V8, JVM, Docker, TLS, LLVM, CUDA
Инструменты GCC, nodejs, RSA, SHA, K8s, git
Библиотеки libuv, React.js, Tokio.rs, llhttp, babel
Фреймворки Angular, Vue, react-native, tensorflow
Продукты Jira, SAP, PG, MS Office, Photoshop
Сервисы Github, Youtube, Grammarly, G.docs
const fs = require('fs'); const compose = (...funcs) => x => funcs.
reduce((x, fn) => fn(x), x); const DENSITY_COL = 3; const renderTab
table => { const cellWidth = [18, 10, 8, 8, 18, 6]; return table.ma
=> (row.map((cell, i) => { const width = cellWidth[i]; return i ? c
Какой бывает ИТ-бизнес
Технологические компании
Продуктовые компании
Аутсорсинговые компании
Компьютерщики
const fs = require('fs'); const compose = (...funcs) => x => funcs.
reduce((x, fn) => fn(x), x); const DENSITY_COL = 3; const renderTab
table => { const cellWidth = [18, 10, 8, 8, 18, 6]; return table.ma
=> (row.map((cell, i) => { const width = cellWidth[i]; return i ? c
Какой бывает ИТ-бизнес
Технологические компании
Продуктовые компании
Аутсорсинговые компании
Компьютерщики на еду
const fs = require('fs'); const compose = (...funcs) => x => funcs.
reduce((x, fn) => fn(x), x); const DENSITY_COL = 3; const renderTab
table => { const cellWidth = [18, 10, 8, 8, 18, 6]; return table.ma
=> (row.map((cell, i) => { const width = cellWidth[i]; return i ? c
Какой бывает ИТ-бизнес
Технологические компании
Продуктовые компании
Аутсорсинговые компании сырьевая э.
Компьютерщики на еду
const fs = require('fs'); const compose = (...funcs) => x => funcs.
reduce((x, fn) => fn(x), x); const DENSITY_COL = 3; const renderTab
table => { const cellWidth = [18, 10, 8, 8, 18, 6]; return table.ma
=> (row.map((cell, i) => { const width = cellWidth[i]; return i ? c
Какой бывает ИТ-бизнес
Технологические компании
Продуктовые компании большие прибыли
Аутсорсинговые компании сырьевая э.
Компьютерщики на еду
const fs = require('fs'); const compose = (...funcs) => x => funcs.
reduce((x, fn) => fn(x), x); const DENSITY_COL = 3; const renderTab
table => { const cellWidth = [18, 10, 8, 8, 18, 6]; return table.ma
=> (row.map((cell, i) => { const width = cellWidth[i]; return i ? c
Какой бывает ИТ-бизнес
Технологические компании контроль и власть
Продуктовые компании большие прибыли
Аутсорсинговые компании сырьевая э.
Компьютерщики на еду
const fs = require('fs'); const compose = (...funcs) => x => funcs.
reduce((x, fn) => fn(x), x); const DENSITY_COL = 3; const renderTab
table => { const cellWidth = [18, 10, 8, 8, 18, 6]; return table.ma
=> (row.map((cell, i) => { const width = cellWidth[i]; return i ? c
Какие нужны специалисты в ИТ
Технологические компании
Продуктовые компании
Аутсорсинговые компании
Компьютерщики
const fs = require('fs'); const compose = (...funcs) => x => funcs.
reduce((x, fn) => fn(x), x); const DENSITY_COL = 3; const renderTab
table => { const cellWidth = [18, 10, 8, 8, 18, 6]; return table.ma
=> (row.map((cell, i) => { const width = cellWidth[i]; return i ? c
Какие нужны специалисты в ИТ
Технологические компании инж., арх.
Продуктовые компании
Аутсорсинговые компании
Компьютерщики
const fs = require('fs'); const compose = (...funcs) => x => funcs.
reduce((x, fn) => fn(x), x); const DENSITY_COL = 3; const renderTab
table => { const cellWidth = [18, 10, 8, 8, 18, 6]; return table.ma
=> (row.map((cell, i) => { const width = cellWidth[i]; return i ? c
Какие нужны специалисты в ИТ
Технологические компании инж., арх.
Продуктовые компании программисты
Аутсорсинговые компании
Компьютерщики
const fs = require('fs'); const compose = (...funcs) => x => funcs.
reduce((x, fn) => fn(x), x); const DENSITY_COL = 3; const renderTab
table => { const cellWidth = [18, 10, 8, 8, 18, 6]; return table.ma
=> (row.map((cell, i) => { const width = cellWidth[i]; return i ? c
Какие нужны специалисты в ИТ
Технологические компании инж., арх.
Продуктовые компании программисты
Аутсорсинговые компании м-ы, кодеры
Компьютерщики
const fs = require('fs'); const compose = (...funcs) => x => funcs.
reduce((x, fn) => fn(x), x); const DENSITY_COL = 3; const renderTab
table => { const cellWidth = [18, 10, 8, 8, 18, 6]; return table.ma
=> (row.map((cell, i) => { const width = cellWidth[i]; return i ? c
Какие нужны специалисты в ИТ
Технологические компании инж., арх.
Продуктовые компании программисты
Аутсорсинговые компании м-ы, кодеры
Компьютерщики малограмотные
const fs = require('fs'); const compose = (...funcs) => x => funcs.
reduce((x, fn) => fn(x), x); const DENSITY_COL = 3; const renderTab
table => { const cellWidth = [18, 10, 8, 8, 18, 6]; return table.ma
=> (row.map((cell, i) => { const width = cellWidth[i]; return i ? c
Кто что делает в ИТ
Технологические компании
Продуктовые компании
Аутсорсинговые компании
Компьютерщики
const fs = require('fs'); const compose = (...funcs) => x => funcs.
reduce((x, fn) => fn(x), x); const DENSITY_COL = 3; const renderTab
table => { const cellWidth = [18, 10, 8, 8, 18, 6]; return table.ma
=> (row.map((cell, i) => { const width = cellWidth[i]; return i ? c
Кто что делает в ИТ
Технологические компании ОС, ЯП, платформы
Продуктовые компании
Аутсорсинговые компании
Компьютерщики
const fs = require('fs'); const compose = (...funcs) => x => funcs.
reduce((x, fn) => fn(x), x); const DENSITY_COL = 3; const renderTab
table => { const cellWidth = [18, 10, 8, 8, 18, 6]; return table.ma
=> (row.map((cell, i) => { const width = cellWidth[i]; return i ? c
Кто что делает в ИТ
Технологические компании ОС, ЯП, платформы
Продуктовые компании Коробка, сервис
Аутсорсинговые компании
Компьютерщики
const fs = require('fs'); const compose = (...funcs) => x => funcs.
reduce((x, fn) => fn(x), x); const DENSITY_COL = 3; const renderTab
table => { const cellWidth = [18, 10, 8, 8, 18, 6]; return table.ma
=> (row.map((cell, i) => { const width = cellWidth[i]; return i ? c
Кто что делает в ИТ
Технологические компании ОС, ЯП, платформы
Продуктовые компании Коробка, сервис
Аутсорсинговые компании Человекочасы
Компьютерщики
const fs = require('fs'); const compose = (...funcs) => x => funcs.
reduce((x, fn) => fn(x), x); const DENSITY_COL = 3; const renderTab
table => { const cellWidth = [18, 10, 8, 8, 18, 6]; return table.ma
=> (row.map((cell, i) => { const width = cellWidth[i]; return i ? c
Кто что делает в ИТ
Технологические компании ОС, ЯП, платформы
Продуктовые компании Коробка, сервис
Аутсорсинговые компании Человекочасы
Компьютерщики Заплатки
const fs = require('fs'); const compose = (...funcs) => x => funcs.
reduce((x, fn) => fn(x), x); const DENSITY_COL = 3; const renderTab
table => { const cellWidth = [18, 10, 8, 8, 18, 6]; return table.ma
=> (row.map((cell, i) => { const width = cellWidth[i]; return i ? c
Типы инфраструктуры
Infra Runtime Storage
● Bare metal none stateful stateful
● Shared hosting slice stateless stateful
● Virtualization slice stateful stateful
● Containerization slice stateful stateful
● Clusterization join stateful stateless
● Serverless join stateless stateless
const fs = require('fs'); const compose = (...funcs) => x => funcs.
reduce((x, fn) => fn(x), x); const DENSITY_COL = 3; const renderTab
table => { const cellWidth = [18, 10, 8, 8, 18, 6]; return table.ma
=> (row.map((cell, i) => { const width = cellWidth[i]; return i ? c
Преимущества инфраструктур
Sec Lock TTM
● Bare metal ++++ no +
● Shared hosting + tech ++
● Virtualization +++ no +++
● Containerization +++ tech +++
● Clusterization +++ tech ++++
● Serverless ++ vendor +++++
const fs = require('fs'); const compose = (...funcs) => x => funcs.
reduce((x, fn) => fn(x), x); const DENSITY_COL = 3; const renderTab
table => { const cellWidth = [18, 10, 8, 8, 18, 6]; return table.ma
=> (row.map((cell, i) => { const width = cellWidth[i]; return i ? c
Какое нужно ИТ-образование
Технологические компании
Продуктовые компании
Аутсорсинговые компании
Компьютерщики
const fs = require('fs'); const compose = (...funcs) => x => funcs.
reduce((x, fn) => fn(x), x); const DENSITY_COL = 3; const renderTab
table => { const cellWidth = [18, 10, 8, 8, 18, 6]; return table.ma
=> (row.map((cell, i) => { const width = cellWidth[i]; return i ? c
Какое нужно ИТ-образование
Технологические компании
Продуктовые компании
Аутсорсинговые компании
Компьютерщики ни какого
const fs = require('fs'); const compose = (...funcs) => x => funcs.
reduce((x, fn) => fn(x), x); const DENSITY_COL = 3; const renderTab
table => { const cellWidth = [18, 10, 8, 8, 18, 6]; return table.ma
=> (row.map((cell, i) => { const width = cellWidth[i]; return i ? c
Какое нужно ИТ-образование
Технологические компании
Продуктовые компании
Аутсорсинговые компании ПТУ, вайти курсы
Компьютерщики ни какого
const fs = require('fs'); const compose = (...funcs) => x => funcs.
reduce((x, fn) => fn(x), x); const DENSITY_COL = 3; const renderTab
table => { const cellWidth = [18, 10, 8, 8, 18, 6]; return table.ma
=> (row.map((cell, i) => { const width = cellWidth[i]; return i ? c
Какое нужно ИТ-образование
Технологические компании
Продуктовые компании Университеты, ПТУ
Аутсорсинговые компании ПТУ, вайти курсы
Компьютерщики ни какого
const fs = require('fs'); const compose = (...funcs) => x => funcs.
reduce((x, fn) => fn(x), x); const DENSITY_COL = 3; const renderTab
table => { const cellWidth = [18, 10, 8, 8, 18, 6]; return table.ma
=> (row.map((cell, i) => { const width = cellWidth[i]; return i ? c
Какое нужно ИТ-образование
Технологические компании R&D, Университеты
Продуктовые компании Университеты, ПТУ
Аутсорсинговые компании ПТУ, вайти курсы
Компьютерщики ни какого
const fs = require('fs'); const compose = (...funcs) => x => funcs.
reduce((x, fn) => fn(x), x); const DENSITY_COL = 3; const renderTab
table => { const cellWidth = [18, 10, 8, 8, 18, 6]; return table.ma
=> (row.map((cell, i) => { const width = cellWidth[i]; return i ? c
Проблемы отрасли
В современном мире делать хорошо невыгодно
- писать хорошо - сложно, долго и дорого
- все уже можно найти и склеить
- все вроде есть, пока чего не хватишься...
- программируем на мусорку
const fs = require('fs'); const compose = (...funcs) => x => funcs.
reduce((x, fn) => fn(x), x); const DENSITY_COL = 3; const renderTab
table => { const cellWidth = [18, 10, 8, 8, 18, 6]; return table.ma
=> (row.map((cell, i) => { const width = cellWidth[i]; return i ? c
Проблемы отрасли
Программная инженерия оторвалась от науки
- не отвечает на вопрос почему так, а не иначе
- программируем на фреймворках
- нет научного осмысления паттернов и приемов
- маркетологи уничтожат цивилизацию...
const fs = require('fs'); const compose = (...funcs) => x => funcs.
reduce((x, fn) => fn(x), x); const DENSITY_COL = 3; const renderTab
table => { const cellWidth = [18, 10, 8, 8, 18, 6]; return table.ma
=> (row.map((cell, i) => { const width = cellWidth[i]; return i ? c
Проблемы отрасли
Сложность интеграции
- по частям есть, но не вместе
- связать сложнее, чем разработать часть
- стыки должны совпадать
- как устроено внутри
const fs = require('fs'); const compose = (...funcs) => x => funcs.
reduce((x, fn) => fn(x), x); const DENSITY_COL = 3; const renderTab
table => { const cellWidth = [18, 10, 8, 8, 18, 6]; return table.ma
=> (row.map((cell, i) => { const width = cellWidth[i]; return i ? c
Как не деградировать?
на однотипных и неинтересных задачах
• Cookie cutter - подумал эксплуататор
• Monkey job - подумал эксплуатируемый
const fs = require('fs'); const compose = (...funcs) => x => funcs.
reduce((x, fn) => fn(x), x); const DENSITY_COL = 3; const renderTab
table => { const cellWidth = [18, 10, 8, 8, 18, 6]; return table.ma
=> (row.map((cell, i) => { const width = cellWidth[i]; return i ? c
Как не деградировать?
на однотипных и неинтересных задачах
• Эксплуататору лучше думать - SaaS
• Эксплуатируемуму лучше думать -
системное программирование
const fs = require('fs'); const compose = (...funcs) => x => funcs.
reduce((x, fn) => fn(x), x); const DENSITY_COL = 3; const renderTab
table => { const cellWidth = [18, 10, 8, 8, 18, 6]; return table.ma
=> (row.map((cell, i) => { const width = cellWidth[i]; return i ? c
Как найти общий язык?
между разными специальностями в разработке
• Банально - разговаривать
• По умному - формализация
const fs = require('fs'); const compose = (...funcs) => x => funcs.
reduce((x, fn) => fn(x), x); const DENSITY_COL = 3; const renderTab
table => { const cellWidth = [18, 10, 8, 8, 18, 6]; return table.ma
=> (row.map((cell, i) => { const width = cellWidth[i]; return i ? c
Как найти общий язык?
Виды формализации
• Шаблоны
• Стандарты: RFC, Ecma, ISO...
• Модели: UML, ERD...
• Методологии: RUP, Agile…
• Формальные языки
const fs = require('fs'); const compose = (...funcs) => x => funcs.
reduce((x, fn) => fn(x), x); const DENSITY_COL = 3; const renderTab
table => { const cellWidth = [18, 10, 8, 8, 18, 6]; return table.ma
=> (row.map((cell, i) => { const width = cellWidth[i]; return i ? c
Задачи программной инженерии
Справиться со сложностью
Управление состоянием
Структура и архитектура
const fs = require('fs'); const compose = (...funcs) => x => funcs.
reduce((x, fn) => fn(x), x); const DENSITY_COL = 3; const renderTab
table => { const cellWidth = [18, 10, 8, 8, 18, 6]; return table.ma
=> (row.map((cell, i) => { const width = cellWidth[i]; return i ? c
Справиться со сложностью
● Сложность задачи
(декомпозиция и модель)
● Спрятать сложность
(модули, слои, черный ящик)
const fs = require('fs'); const compose = (...funcs) => x => funcs.
reduce((x, fn) => fn(x), x); const DENSITY_COL = 3; const renderTab
table => { const cellWidth = [18, 10, 8, 8, 18, 6]; return table.ma
=> (row.map((cell, i) => { const width = cellWidth[i]; return i ? c
Управление состоянием
● Предотвращение скрытого состояния
● Минимизация глобального состояния
● Предотвращение комбинаторного взрыва
const fs = require('fs'); const compose = (...funcs) => x => funcs.
reduce((x, fn) => fn(x), x); const DENSITY_COL = 3; const renderTab
table => { const cellWidth = [18, 10, 8, 8, 18, 6]; return table.ma
=> (row.map((cell, i) => { const width = cellWidth[i]; return i ? c
Структура и архитектура
● Декомпозиция
● Именование
● Связывание
const fs = require('fs'); const compose = (...funcs) => x => funcs.
reduce((x, fn) => fn(x), x); const DENSITY_COL = 3; const renderTab
table => { const cellWidth = [18, 10, 8, 8, 18, 6]; return table.ma
=> (row.map((cell, i) => { const width = cellWidth[i]; return i ? c
Преодоление сложности
Компонентный подход
увеличение переиспользования кода и
надежности
Отделение прикладного кода от системного
выделение и вынесение наружу системных
библиотек, инструментов, DSL из проектов
github.com/tshemsedinov
github.com/HowProgrammingWorks/Index
видео-лекции по программной инженерии
https://youtube.com/TimurShemsedinov
meetup.com/HowProgrammingWorks
meetup.com/NodeUA
t.me/HowProgrammingWorks
t.me/NodeUA

Почему хорошее ИТ-образование невостребовано рыночком

  • 1.
    const fs =require('fs'); const compose = (...funcs) => x => funcs. reduce((x, fn) => fn(x), x); const DENSITY_COL = 3; const renderTab table => { const cellWidth = [18, 10, 8, 8, 18, 6]; return table.ma => (row.map((cell, i) => { const width = cellWidth[i]; return i ? c toString().padStart(width) : cell.padEnd(width); }).join(''))).join }; const proportion = (max, val) => Math.round(val * 100 / max); co calcProportion = table => { table.sort((row1, row2) => row2[DENSITY row1[DENSITY_COL]); const maxDensity = table[0][DENSITY_COL]; table forEach(row => { row.push(proportion(maxDensity, row[DENSITY_COL])) return table; }; const getDataset = file => { const lines = fs.read FileSync(file, 'utf8').toString().split('n'); lines.shift(); lines return lines.map(line => line.split(',')); }; const main = compose (getDataset, calcProportion, renderTable); const fs = require('fs' compose = (...funcs) => x => funcs.reduce((x, fn) => fn(x), x); con DENSITY_COL = 3; const renderTable = table => { const cellWidth = [ 8, 8, 18, 6]; return table.map(row => (row.map((cell, i) => { const = cellWidth[i]; return i ? cell.toString().padStart(width) : cell.p (width); }).join(''))).join('n'); }; const proportion = (max, val) Почему хорошее ИТ-образование не востребовано рыночком и о перспективах на 10 лет Тимур Шемсединов Chief Software Architect at Metarhia Lecturer at Kiev Polytechnic Institute github.com/tshemsedinov
  • 2.
    const fs =require('fs'); const compose = (...funcs) => x => funcs. reduce((x, fn) => fn(x), x); const DENSITY_COL = 3; const renderTab table => { const cellWidth = [18, 10, 8, 8, 18, 6]; return table.ma => (row.map((cell, i) => { const width = cellWidth[i]; return i ? c Кто тут?
  • 3.
    const fs =require('fs'); const compose = (...funcs) => x => funcs. reduce((x, fn) => fn(x), x); const DENSITY_COL = 3; const renderTab table => { const cellWidth = [18, 10, 8, 8, 18, 6]; return table.ma => (row.map((cell, i) => { const width = cellWidth[i]; return i ? c Кто тут? Чистые функции Каррирование Функторы
  • 4.
    const fs =require('fs'); const compose = (...funcs) => x => funcs. reduce((x, fn) => fn(x), x); const DENSITY_COL = 3; const renderTab table => { const cellWidth = [18, 10, 8, 8, 18, 6]; return table.ma => (row.map((cell, i) => { const width = cellWidth[i]; return i ? c Кто тут? Двоичное дерево Двусвязный список Стек, Дек, Очередь
  • 5.
    const fs =require('fs'); const compose = (...funcs) => x => funcs. reduce((x, fn) => fn(x), x); const DENSITY_COL = 3; const renderTab table => { const cellWidth = [18, 10, 8, 8, 18, 6]; return table.ma => (row.map((cell, i) => { const width = cellWidth[i]; return i ? c Кто тут? Промисы, Фьючеры Thenable Async Iterable
  • 6.
    const fs =require('fs'); const compose = (...funcs) => x => funcs. reduce((x, fn) => fn(x), x); const DENSITY_COL = 3; const renderTab table => { const cellWidth = [18, 10, 8, 8, 18, 6]; return table.ma => (row.map((cell, i) => { const width = cellWidth[i]; return i ? c Кто тут? СМО Concurrent Queue CQRS, Event sourcing
  • 7.
    const fs =require('fs'); const compose = (...funcs) => x => funcs. reduce((x, fn) => fn(x), x); const DENSITY_COL = 3; const renderTab table => { const cellWidth = [18, 10, 8, 8, 18, 6]; return table.ma => (row.map((cell, i) => { const width = cellWidth[i]; return i ? c Кто тут? node_modules npm Event Loop
  • 8.
    const fs =require('fs'); const compose = (...funcs) => x => funcs. reduce((x, fn) => fn(x), x); const DENSITY_COL = 3; const renderTab table => { const cellWidth = [18, 10, 8, 8, 18, 6]; return table.ma => (row.map((cell, i) => { const width = cellWidth[i]; return i ? c Кто тут? Inline Cache Tail Call Optimization Hidden class
  • 9.
    const fs =require('fs'); const compose = (...funcs) => x => funcs. reduce((x, fn) => fn(x), x); const DENSITY_COL = 3; const renderTab table => { const cellWidth = [18, 10, 8, 8, 18, 6]; return table.ma => (row.map((cell, i) => { const width = cellWidth[i]; return i ? c Кто тут? Socket, TLS XSS, CSP SQL-injection
  • 10.
    const fs =require('fs'); const compose = (...funcs) => x => funcs. reduce((x, fn) => fn(x), x); const DENSITY_COL = 3; const renderTab table => { const cellWidth = [18, 10, 8, 8, 18, 6]; return table.ma => (row.map((cell, i) => { const width = cellWidth[i]; return i ? c Кто тут? Семафоры Мьютексы Спинлоки
  • 11.
    const fs =require('fs'); const compose = (...funcs) => x => funcs. reduce((x, fn) => fn(x), x); const DENSITY_COL = 3; const renderTab table => { const cellWidth = [18, 10, 8, 8, 18, 6]; return table.ma => (row.map((cell, i) => { const width = cellWidth[i]; return i ? c Кто тут? Reflection Scaffolding Introspection
  • 12.
    const fs =require('fs'); const compose = (...funcs) => x => funcs. reduce((x, fn) => fn(x), x); const DENSITY_COL = 3; const renderTab table => { const cellWidth = [18, 10, 8, 8, 18, 6]; return table.ma => (row.map((cell, i) => { const width = cellWidth[i]; return i ? c Кто тут? Адаптер Фабрика Dependency Injection
  • 13.
    const fs =require('fs'); const compose = (...funcs) => x => funcs. reduce((x, fn) => fn(x), x); const DENSITY_COL = 3; const renderTab table => { const cellWidth = [18, 10, 8, 8, 18, 6]; return table.ma => (row.map((cell, i) => { const width = cellWidth[i]; return i ? c Какое бывает ИТ Наука λ-исчисление; O; (Π, σ, ⋈, ⋉, ⋊...) Парадигмы ФП, СП, ООП, МП (meta), МПП (multi) Техники п. ПП, АП, ОП (generics), actors, CRDT Технологии V8, JVM, Docker, TLS, LLVM, CUDA Инструменты GCC, nodejs, RSA, SHA, K8s, git Библиотеки libuv, React.js, Tokio.rs, llhttp, babel Фреймворки Angular, Vue, react-native, tensorflow Продукты Jira, SAP, PG, MS Office, Photoshop Сервисы Github, Youtube, Grammarly, G.docs
  • 14.
    const fs =require('fs'); const compose = (...funcs) => x => funcs. reduce((x, fn) => fn(x), x); const DENSITY_COL = 3; const renderTab table => { const cellWidth = [18, 10, 8, 8, 18, 6]; return table.ma => (row.map((cell, i) => { const width = cellWidth[i]; return i ? c Какой бывает ИТ-бизнес Технологические компании Продуктовые компании Аутсорсинговые компании Компьютерщики
  • 15.
    const fs =require('fs'); const compose = (...funcs) => x => funcs. reduce((x, fn) => fn(x), x); const DENSITY_COL = 3; const renderTab table => { const cellWidth = [18, 10, 8, 8, 18, 6]; return table.ma => (row.map((cell, i) => { const width = cellWidth[i]; return i ? c Какой бывает ИТ-бизнес Технологические компании Продуктовые компании Аутсорсинговые компании Компьютерщики на еду
  • 16.
    const fs =require('fs'); const compose = (...funcs) => x => funcs. reduce((x, fn) => fn(x), x); const DENSITY_COL = 3; const renderTab table => { const cellWidth = [18, 10, 8, 8, 18, 6]; return table.ma => (row.map((cell, i) => { const width = cellWidth[i]; return i ? c Какой бывает ИТ-бизнес Технологические компании Продуктовые компании Аутсорсинговые компании сырьевая э. Компьютерщики на еду
  • 17.
    const fs =require('fs'); const compose = (...funcs) => x => funcs. reduce((x, fn) => fn(x), x); const DENSITY_COL = 3; const renderTab table => { const cellWidth = [18, 10, 8, 8, 18, 6]; return table.ma => (row.map((cell, i) => { const width = cellWidth[i]; return i ? c Какой бывает ИТ-бизнес Технологические компании Продуктовые компании большие прибыли Аутсорсинговые компании сырьевая э. Компьютерщики на еду
  • 18.
    const fs =require('fs'); const compose = (...funcs) => x => funcs. reduce((x, fn) => fn(x), x); const DENSITY_COL = 3; const renderTab table => { const cellWidth = [18, 10, 8, 8, 18, 6]; return table.ma => (row.map((cell, i) => { const width = cellWidth[i]; return i ? c Какой бывает ИТ-бизнес Технологические компании контроль и власть Продуктовые компании большие прибыли Аутсорсинговые компании сырьевая э. Компьютерщики на еду
  • 19.
    const fs =require('fs'); const compose = (...funcs) => x => funcs. reduce((x, fn) => fn(x), x); const DENSITY_COL = 3; const renderTab table => { const cellWidth = [18, 10, 8, 8, 18, 6]; return table.ma => (row.map((cell, i) => { const width = cellWidth[i]; return i ? c Какие нужны специалисты в ИТ Технологические компании Продуктовые компании Аутсорсинговые компании Компьютерщики
  • 20.
    const fs =require('fs'); const compose = (...funcs) => x => funcs. reduce((x, fn) => fn(x), x); const DENSITY_COL = 3; const renderTab table => { const cellWidth = [18, 10, 8, 8, 18, 6]; return table.ma => (row.map((cell, i) => { const width = cellWidth[i]; return i ? c Какие нужны специалисты в ИТ Технологические компании инж., арх. Продуктовые компании Аутсорсинговые компании Компьютерщики
  • 21.
    const fs =require('fs'); const compose = (...funcs) => x => funcs. reduce((x, fn) => fn(x), x); const DENSITY_COL = 3; const renderTab table => { const cellWidth = [18, 10, 8, 8, 18, 6]; return table.ma => (row.map((cell, i) => { const width = cellWidth[i]; return i ? c Какие нужны специалисты в ИТ Технологические компании инж., арх. Продуктовые компании программисты Аутсорсинговые компании Компьютерщики
  • 22.
    const fs =require('fs'); const compose = (...funcs) => x => funcs. reduce((x, fn) => fn(x), x); const DENSITY_COL = 3; const renderTab table => { const cellWidth = [18, 10, 8, 8, 18, 6]; return table.ma => (row.map((cell, i) => { const width = cellWidth[i]; return i ? c Какие нужны специалисты в ИТ Технологические компании инж., арх. Продуктовые компании программисты Аутсорсинговые компании м-ы, кодеры Компьютерщики
  • 23.
    const fs =require('fs'); const compose = (...funcs) => x => funcs. reduce((x, fn) => fn(x), x); const DENSITY_COL = 3; const renderTab table => { const cellWidth = [18, 10, 8, 8, 18, 6]; return table.ma => (row.map((cell, i) => { const width = cellWidth[i]; return i ? c Какие нужны специалисты в ИТ Технологические компании инж., арх. Продуктовые компании программисты Аутсорсинговые компании м-ы, кодеры Компьютерщики малограмотные
  • 24.
    const fs =require('fs'); const compose = (...funcs) => x => funcs. reduce((x, fn) => fn(x), x); const DENSITY_COL = 3; const renderTab table => { const cellWidth = [18, 10, 8, 8, 18, 6]; return table.ma => (row.map((cell, i) => { const width = cellWidth[i]; return i ? c Кто что делает в ИТ Технологические компании Продуктовые компании Аутсорсинговые компании Компьютерщики
  • 25.
    const fs =require('fs'); const compose = (...funcs) => x => funcs. reduce((x, fn) => fn(x), x); const DENSITY_COL = 3; const renderTab table => { const cellWidth = [18, 10, 8, 8, 18, 6]; return table.ma => (row.map((cell, i) => { const width = cellWidth[i]; return i ? c Кто что делает в ИТ Технологические компании ОС, ЯП, платформы Продуктовые компании Аутсорсинговые компании Компьютерщики
  • 26.
    const fs =require('fs'); const compose = (...funcs) => x => funcs. reduce((x, fn) => fn(x), x); const DENSITY_COL = 3; const renderTab table => { const cellWidth = [18, 10, 8, 8, 18, 6]; return table.ma => (row.map((cell, i) => { const width = cellWidth[i]; return i ? c Кто что делает в ИТ Технологические компании ОС, ЯП, платформы Продуктовые компании Коробка, сервис Аутсорсинговые компании Компьютерщики
  • 27.
    const fs =require('fs'); const compose = (...funcs) => x => funcs. reduce((x, fn) => fn(x), x); const DENSITY_COL = 3; const renderTab table => { const cellWidth = [18, 10, 8, 8, 18, 6]; return table.ma => (row.map((cell, i) => { const width = cellWidth[i]; return i ? c Кто что делает в ИТ Технологические компании ОС, ЯП, платформы Продуктовые компании Коробка, сервис Аутсорсинговые компании Человекочасы Компьютерщики
  • 28.
    const fs =require('fs'); const compose = (...funcs) => x => funcs. reduce((x, fn) => fn(x), x); const DENSITY_COL = 3; const renderTab table => { const cellWidth = [18, 10, 8, 8, 18, 6]; return table.ma => (row.map((cell, i) => { const width = cellWidth[i]; return i ? c Кто что делает в ИТ Технологические компании ОС, ЯП, платформы Продуктовые компании Коробка, сервис Аутсорсинговые компании Человекочасы Компьютерщики Заплатки
  • 29.
    const fs =require('fs'); const compose = (...funcs) => x => funcs. reduce((x, fn) => fn(x), x); const DENSITY_COL = 3; const renderTab table => { const cellWidth = [18, 10, 8, 8, 18, 6]; return table.ma => (row.map((cell, i) => { const width = cellWidth[i]; return i ? c Типы инфраструктуры Infra Runtime Storage ● Bare metal none stateful stateful ● Shared hosting slice stateless stateful ● Virtualization slice stateful stateful ● Containerization slice stateful stateful ● Clusterization join stateful stateless ● Serverless join stateless stateless
  • 30.
    const fs =require('fs'); const compose = (...funcs) => x => funcs. reduce((x, fn) => fn(x), x); const DENSITY_COL = 3; const renderTab table => { const cellWidth = [18, 10, 8, 8, 18, 6]; return table.ma => (row.map((cell, i) => { const width = cellWidth[i]; return i ? c Преимущества инфраструктур Sec Lock TTM ● Bare metal ++++ no + ● Shared hosting + tech ++ ● Virtualization +++ no +++ ● Containerization +++ tech +++ ● Clusterization +++ tech ++++ ● Serverless ++ vendor +++++
  • 31.
    const fs =require('fs'); const compose = (...funcs) => x => funcs. reduce((x, fn) => fn(x), x); const DENSITY_COL = 3; const renderTab table => { const cellWidth = [18, 10, 8, 8, 18, 6]; return table.ma => (row.map((cell, i) => { const width = cellWidth[i]; return i ? c Какое нужно ИТ-образование Технологические компании Продуктовые компании Аутсорсинговые компании Компьютерщики
  • 32.
    const fs =require('fs'); const compose = (...funcs) => x => funcs. reduce((x, fn) => fn(x), x); const DENSITY_COL = 3; const renderTab table => { const cellWidth = [18, 10, 8, 8, 18, 6]; return table.ma => (row.map((cell, i) => { const width = cellWidth[i]; return i ? c Какое нужно ИТ-образование Технологические компании Продуктовые компании Аутсорсинговые компании Компьютерщики ни какого
  • 33.
    const fs =require('fs'); const compose = (...funcs) => x => funcs. reduce((x, fn) => fn(x), x); const DENSITY_COL = 3; const renderTab table => { const cellWidth = [18, 10, 8, 8, 18, 6]; return table.ma => (row.map((cell, i) => { const width = cellWidth[i]; return i ? c Какое нужно ИТ-образование Технологические компании Продуктовые компании Аутсорсинговые компании ПТУ, вайти курсы Компьютерщики ни какого
  • 34.
    const fs =require('fs'); const compose = (...funcs) => x => funcs. reduce((x, fn) => fn(x), x); const DENSITY_COL = 3; const renderTab table => { const cellWidth = [18, 10, 8, 8, 18, 6]; return table.ma => (row.map((cell, i) => { const width = cellWidth[i]; return i ? c Какое нужно ИТ-образование Технологические компании Продуктовые компании Университеты, ПТУ Аутсорсинговые компании ПТУ, вайти курсы Компьютерщики ни какого
  • 35.
    const fs =require('fs'); const compose = (...funcs) => x => funcs. reduce((x, fn) => fn(x), x); const DENSITY_COL = 3; const renderTab table => { const cellWidth = [18, 10, 8, 8, 18, 6]; return table.ma => (row.map((cell, i) => { const width = cellWidth[i]; return i ? c Какое нужно ИТ-образование Технологические компании R&D, Университеты Продуктовые компании Университеты, ПТУ Аутсорсинговые компании ПТУ, вайти курсы Компьютерщики ни какого
  • 36.
    const fs =require('fs'); const compose = (...funcs) => x => funcs. reduce((x, fn) => fn(x), x); const DENSITY_COL = 3; const renderTab table => { const cellWidth = [18, 10, 8, 8, 18, 6]; return table.ma => (row.map((cell, i) => { const width = cellWidth[i]; return i ? c Проблемы отрасли В современном мире делать хорошо невыгодно - писать хорошо - сложно, долго и дорого - все уже можно найти и склеить - все вроде есть, пока чего не хватишься... - программируем на мусорку
  • 37.
    const fs =require('fs'); const compose = (...funcs) => x => funcs. reduce((x, fn) => fn(x), x); const DENSITY_COL = 3; const renderTab table => { const cellWidth = [18, 10, 8, 8, 18, 6]; return table.ma => (row.map((cell, i) => { const width = cellWidth[i]; return i ? c Проблемы отрасли Программная инженерия оторвалась от науки - не отвечает на вопрос почему так, а не иначе - программируем на фреймворках - нет научного осмысления паттернов и приемов - маркетологи уничтожат цивилизацию...
  • 38.
    const fs =require('fs'); const compose = (...funcs) => x => funcs. reduce((x, fn) => fn(x), x); const DENSITY_COL = 3; const renderTab table => { const cellWidth = [18, 10, 8, 8, 18, 6]; return table.ma => (row.map((cell, i) => { const width = cellWidth[i]; return i ? c Проблемы отрасли Сложность интеграции - по частям есть, но не вместе - связать сложнее, чем разработать часть - стыки должны совпадать - как устроено внутри
  • 39.
    const fs =require('fs'); const compose = (...funcs) => x => funcs. reduce((x, fn) => fn(x), x); const DENSITY_COL = 3; const renderTab table => { const cellWidth = [18, 10, 8, 8, 18, 6]; return table.ma => (row.map((cell, i) => { const width = cellWidth[i]; return i ? c Как не деградировать? на однотипных и неинтересных задачах • Cookie cutter - подумал эксплуататор • Monkey job - подумал эксплуатируемый
  • 40.
    const fs =require('fs'); const compose = (...funcs) => x => funcs. reduce((x, fn) => fn(x), x); const DENSITY_COL = 3; const renderTab table => { const cellWidth = [18, 10, 8, 8, 18, 6]; return table.ma => (row.map((cell, i) => { const width = cellWidth[i]; return i ? c Как не деградировать? на однотипных и неинтересных задачах • Эксплуататору лучше думать - SaaS • Эксплуатируемуму лучше думать - системное программирование
  • 41.
    const fs =require('fs'); const compose = (...funcs) => x => funcs. reduce((x, fn) => fn(x), x); const DENSITY_COL = 3; const renderTab table => { const cellWidth = [18, 10, 8, 8, 18, 6]; return table.ma => (row.map((cell, i) => { const width = cellWidth[i]; return i ? c Как найти общий язык? между разными специальностями в разработке • Банально - разговаривать • По умному - формализация
  • 42.
    const fs =require('fs'); const compose = (...funcs) => x => funcs. reduce((x, fn) => fn(x), x); const DENSITY_COL = 3; const renderTab table => { const cellWidth = [18, 10, 8, 8, 18, 6]; return table.ma => (row.map((cell, i) => { const width = cellWidth[i]; return i ? c Как найти общий язык? Виды формализации • Шаблоны • Стандарты: RFC, Ecma, ISO... • Модели: UML, ERD... • Методологии: RUP, Agile… • Формальные языки
  • 43.
    const fs =require('fs'); const compose = (...funcs) => x => funcs. reduce((x, fn) => fn(x), x); const DENSITY_COL = 3; const renderTab table => { const cellWidth = [18, 10, 8, 8, 18, 6]; return table.ma => (row.map((cell, i) => { const width = cellWidth[i]; return i ? c Задачи программной инженерии Справиться со сложностью Управление состоянием Структура и архитектура
  • 44.
    const fs =require('fs'); const compose = (...funcs) => x => funcs. reduce((x, fn) => fn(x), x); const DENSITY_COL = 3; const renderTab table => { const cellWidth = [18, 10, 8, 8, 18, 6]; return table.ma => (row.map((cell, i) => { const width = cellWidth[i]; return i ? c Справиться со сложностью ● Сложность задачи (декомпозиция и модель) ● Спрятать сложность (модули, слои, черный ящик)
  • 45.
    const fs =require('fs'); const compose = (...funcs) => x => funcs. reduce((x, fn) => fn(x), x); const DENSITY_COL = 3; const renderTab table => { const cellWidth = [18, 10, 8, 8, 18, 6]; return table.ma => (row.map((cell, i) => { const width = cellWidth[i]; return i ? c Управление состоянием ● Предотвращение скрытого состояния ● Минимизация глобального состояния ● Предотвращение комбинаторного взрыва
  • 46.
    const fs =require('fs'); const compose = (...funcs) => x => funcs. reduce((x, fn) => fn(x), x); const DENSITY_COL = 3; const renderTab table => { const cellWidth = [18, 10, 8, 8, 18, 6]; return table.ma => (row.map((cell, i) => { const width = cellWidth[i]; return i ? c Структура и архитектура ● Декомпозиция ● Именование ● Связывание
  • 47.
    const fs =require('fs'); const compose = (...funcs) => x => funcs. reduce((x, fn) => fn(x), x); const DENSITY_COL = 3; const renderTab table => { const cellWidth = [18, 10, 8, 8, 18, 6]; return table.ma => (row.map((cell, i) => { const width = cellWidth[i]; return i ? c Преодоление сложности Компонентный подход увеличение переиспользования кода и надежности Отделение прикладного кода от системного выделение и вынесение наружу системных библиотек, инструментов, DSL из проектов
  • 49.
    github.com/tshemsedinov github.com/HowProgrammingWorks/Index видео-лекции по программнойинженерии https://youtube.com/TimurShemsedinov meetup.com/HowProgrammingWorks meetup.com/NodeUA t.me/HowProgrammingWorks t.me/NodeUA