---
# System prepended metadata

title: Сложные задачи

---


Рынок айтишников описывается так:

-   много слабых специалистов, они дешевы и взаимозаменяемы.
-   катастрофически не хватает специалистов для решения сложных задач, они дорогие и их сложно найти.

Чтобы стать первым не нужен университет. Мы хотим помочь выпускникам стать вторыми.


<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;

