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