Алгоритм. С алгоритмами мы имеем дело с самого раннего детства. В какой-то момент мама или старший брат посылают вас в магазин, например, за кефиром или хлебом.
Как выглядит алгоритм? — Выйти из дома, дойти до магазина, найти в магазине кефир/хлеб, пройти на кассу, отдать нужную сумму, дождаться сдачи (если сумма больше требуемой), дойти до дома, поставить кефир в холодильник, положить хлеб в хлебницу.
Что мы видим в этом алгоритме? — набор инструкций, условие (если сумма больше требуемой, то дождаться сдачи), признак успешности.
Программа действий может завершиться неуспешно:
-
можно застрять в лифте;
-
можно потерять по пути деньги;
-
магазин может быть закрыт по техническим причинам;
-
кефира/хлеба может уже не быть в магазине: раскупили, еще не привезли, истек срок годности
Что еще можно отметить? — алгоритм содержит высокоуровневые инструкции.
Выйти из дома — это не тривиальное (не простое) действие. Чтобы выйти из дома, нужно выполнить другой алгоритм:
-
найти ключи от квартиры;
-
открыть дверь;
-
выйти за порог;
-
закрыть за собой дверь;
-
нажать кнопку вызова лифта;
-
если лифт не едет, то пойти пешком вниз;
-
если лифт приехал, то нажать кнопку первого этажа;
-
дождаться пока лифт приедет на первый этаж и откроются двери;
-
выйти из лифта;
-
выйти из дома.
Какие могут быть крайние случаи (corner/edge cases)?
Например, исполнитель алгоритма может жить на первом этаже, тогда всё, что связано с лифтом, нужно пропустить.
Или исполнитель может жить в пятиэтажном здании без лифта, тогда тоже всё, что связано с лифтом, нужно пропустить.
Квартира может быть с тамбуром, у которого может быть своя дверь, тогда в алгоритме будет 2 инструкции про «открыть дверь» и «закрыть дверь».
Кефир может быть разной жирности, хлеб может быть разного производителя, а еще может быть кирпич, батон, итд.
Какие ключевые единицы смысла можно извлечь из сказанного:
-
программирование — это проектирование алгоритма действий;
-
сложный алгоритм опирается на сложные действия, каждое из которых может представлять из себя другой алгоритм;
-
алгоритм может прерваться из-за того, что какое-либо действие завершилось неудачно, значит надо понимать что именно может нарушить успешный ход какого-либо действия;
-
алгоритм выполняется в определенном контексте (в нашем примере, это наличие лифта, этаж, на котором проживает исполнитель итп), и от этого контекста зависит какие действия надо выполнять, а какие нет; всё, что выбивается из некоторого типового контекста называется краевыми случаями (corner/edge cases); умение программировать подразумевает в том числе умение видеть такие краевые случаи и предусматривать поведение алгоритма для них;
-
штатное выполнение алгоритма, когда все складывается удачно: лифт работает, магазин открыт, кефир/хлеб есть, — называется happy path (счастливый путь).
На подумать
Подумайте, что ещё не учтено в исходном алгоритме?
Ответ
Вопрос про сдачу может быть неактуальным, если оплата производится через карту, но может оказаться так, что на карте недостаточно средств, или не работает интернет и нет связи с банком.
Словарь
-
алгоритм
-
инструкция / высокоуровневая инструкция / низкоуровневая инструкция
-
условие
-
программирование
-
штатное выполнение (happy path)