Рынок айтишников описывается так:
- много слабых специалистов, они дешевы и взаимозаменяемы.
- катастрофически не хватает специалистов для решения сложных задач, они дорогие и их сложно найти.
Чтобы стать первым не нужен университет. Мы хотим помочь выпускникам стать вторыми.
<a id="org2cac0e3"></a>
# Сложные задачи
Сложные задачи обычно попадают в одну из категорий:
- Надо придумать решение задачи, которую раньше никто не решал.
- Нужно выстроить огромную функционирующую систему и не дать ей развалиться под её собственной сложностью.
<a id="org3f7a41a"></a>
## Пример сложной системы:
- В саду разбросаны сенсоры температуры и влажности
- Показания передаются без проводов на ресивер в частном доме
- Ресивер отправляет через сотовую сеть показания на сервер
- На сервере с помощью машинного обучения на огромных даннных и предсказаний погоды вырабатывается стратегия оптимального полива растений
- В соответствии со стратегией управляются лейки в саду
- У пользователя есть приложения для отслеживания режима полива и общения с другими садоводами-энтузиастами
- Пользователи объединены в социальную сеть для общения и обмена опытом
- Социальная сеть интегрирована с магазинами удобрений и садового инвентаря
Ошибка в одном компоненте может привести к ошибкам в других; если не
продумать систему и связи между компонентами, то нельзя будет командно
работать над компонентами изолированно друг от друга – изменение одного
повлечёт необходимость изменения в других.
Фокус СППО/ИВТ на сложных системах, а не на сложных алгоритмах.
Это более широкая задача, чем "программирование" – нужно понимать, например:
- Как работают программы на железе?
Железо бывает очень разное: одно/многопроцессорные системы, вычисления в облаках и на видеокартах и специализированных процессорах, ПЛИС…
Это не про проектирование процессоров.
- Как происходит взаимодействие частей по разным каналам? Шины внутри компьютера, сети
- Как данные хранятся в памяти, в кэшах, на дисках, в базах данных различных типов, облачных хранилищах?
- Как вообще можно организовать процесс вычислений – машинное обучение, множество разных стилей программирования: функциональное, объектно-ориентированное и т.д.
- Системная инженерия: как происходит процесс проектирования больших систем, какие в нём роли, как правильно ставить задачи и выбирать инструменты для решения т.д.
Если вы не хотите решать сложные задачи, вам не нужен университет. Поэтому мы исходим из того, что вам интересно научиться делать сложные вычислительные системы.
<a id="org5f13603"></a>
# Кто мы
В одном предложении нашу деятельность можно описать так:
> Мы – инженеры, мы создаём, поддерживаем и модифицируем сложные вычислительные системы.
Разберём это предложение на части и раскроем его смысл.
<a id="org1f01f35"></a>
## Инженеры
- **Учёный**
- описывает реальный мир
- рассуждает о нём
- ищет в нём новые закономерности и способы их описания.
- **Инженер**
- описывает реальный мир
- рассуждает о нём
- использует знания для его изменения вместе с другими инженерами.
Про нас, инженеров вычислений, и что нам нужно:
<a id="org06472d7"></a>
### Описание реального мира
1. Математика
Реальный мир сложен и многогранен; у любого объекта множество свойств.
Математика забывает про неважные для решения задачи свойства и
концентрируется на описании важных.
В зависимости от того, про какие свойства забываем, разные ветки математики.
- Алгебра – как можно комбинировать объекты друг с другом по правилам (например, кусочки программ объединять в большие программы)
- Геометрия – формы объектов, но не вес/цвет/размеры и т.д.
2. Философия (онтология)
- связывает математику и реальный мир;
- связывает бизнес-процессы/реальность с её моделью для программирования (например, реальный процесс vs классы, интерфейсы и т.д.)
<a id="orge7a243e"></a>
### Рассуждения о реальном мире
Когда вы программируете, вы делаете ошибки потому что не полностью и не точно представляете, что программа должна делать.
Логика учит нас рассуждать корректно, лучше понимать, что системы делают на самом деле и предсказывать их поведение.
Формальная логика используется в математике для корректных рассуждений и доказательств, мы можем её использовать для изучения свойств программ/железа.
С её помощью можно однозначно описывать языки программирования и смысл конкретных программ.
Это нужно, например, для доказательств корректности алгоритмов. Некоторые алгоритмы выглядят так сложно, что без этого их даже не придумать (например, операционные преобразования в google docs).
А иногда любая ошибка может стоить миллионы долларов (ошибка в прошивке марсохода) или множество жизней (самолёт).
Компьютер может проверить наши формальные рассуждения, сделав их надёжными.
<a id="org1decae5"></a>
### Изменения реального мира
Создание систем и их изменение.
Нужны инструменты, умение работать в команде и понимание того, какие системы
вообще можно построить, какие системы лучше решают ту или иную задачу в
разных ситуациях…
1. Инструменты для создания систем
- компьютеры
- сети
- внешние устройства
- базы данных
- инструменты для моделирования систем
- языки программирования.
- компиляторы
- виртуальные машины
- браузеры
- операционные системы
2. Один в поле не воин
Чтобы написать свой линукс вам нужно больше сотни человеколет (обоснование).
Софт скиллы – про работу в команде, управление командой и проектами.
Еще про системную инженерию.
<a id="org91a6034"></a>
# Сложность систем
Добавить примеры для иллюстрации идей:
- Эмерджентность.
- Сложно предсказать поведение: небольшое изменение в программе может направить исполнение по совершенно другой траектории.
- Ошибки в одной части системы распространяются в другие части.
- Чтобы оптимизировать использование ресурсов нужно усложнять систему, добавляя планировщики.
Пример: управление частотой экрана для энергосбережения
- Масштабирование
<a id="orge867169"></a>
# Какие они, вычислительные системы?
Большое разнообразие, но как правило можно разделить на условные части,
которые или что-то активно делают (исполнитель), или хранит данные (память),
или связывает компоненты друг с другом (транспорт)
Эти части могут быть внутри очень сложно устроены (например, транспорт – связать компьютер в Австралии и в России?)
У каждой части есть два аспекта: как она устроена структурно (статика) и как она функционирует (динамика).
Дисциплины могут изучать преимущественно статику или динамику, но нам надо знать про оба аспекта.
*Далее можно вписать часть тем для изучения (предметов) или все предметы в эту систему.*
1. Исполнители
1. Программы на языках программирования
1. Статика
- Модели вычислений
- Высшая алгебра
- Виртуальные машины (языковые, гипервизоры, прослойки типа Docker/WSL)
- Компиляторы (теория графов, логика, вычислимость, формальные языки, формальная семантика, модели вычислений и многое другое)
- Верификация
2. Динамика
- Операционные системы
- Архитектура компьютера
- Алгоритмы (теория вероятностей, комбинаторика, асимптотический анализ)
- Теория вероятностей и статистика
- Логика (семантика программ)
- Машинное обучение и ИИ
2. Процессоры
1. Статика
- Схемотехника
- Архитектура компьютера
2. Динамика
- Схемотехника
- Архитектура компьютера
- Вычислительная математика
- Распределённые вычисления
3. Браузеры
1. Статика
- Виртуальные машины
- Web-программирование
2. Динамика
- Web-программирование
- Сети
4. Виртуальные машины
1. Динамика
- Архитектура компьютера
- Виртуальная машина для Java
- Модели вычислений
2. Память
1. Типы структурирования данных
- Архитектура вычислительных систем
- Стили программирования
- Высшая алгебра
- Теория графов
- Теория информации и кодирования
2. Структуры данных в компьютере
- Базы данных, в т.ч. распределённые
- Алгоритмы и структуры данных
- Модели памяти (слабая, сильная и т.д.)
3. Транспорт
1. Сети
…