Результат: ученик превращает словесное требование в проверяемую спецификацию, выбирает представление и архитектуру, реализует систему по этапам и защищает корректность, стоимость и границы своих решений.
Содержание:
-
Сформулировать назначение и внешнее поведение
- задача пользователя;
- входные и выходные данные;
- наблюдаемый успешный результат;
- ожидаемый неуспех;
- ограничения размера и времени;
- критерий завершения.
-
Построить точную спецификацию
- допустимые, граничные и недопустимые значения;
- предусловия;
- постусловия;
- инварианты;
- терминология предметной области;
- контрольные примеры с заранее известным результатом.
-
Смоделировать состояние
- перечень всех необходимых величин;
- связи между ними;
- допустимые и недопустимые сочетания;
- логическая и физическая длина;
- подтверждённое и временное состояние;
- изменение состояния отдельной операцией.
-
Выбрать представление данных
- отдельные переменные;
enum;- кортеж;
- одномерный массив;
- прямоугольный и зубчатый массив;
- строка и машинный формат;
struct;- плотная и разреженная форма.
-
Сравнить допустимые представления
- число недопустимых состояний;
- удобство проверки инварианта;
- время основных операций;
- дополнительная память;
- стоимость копирования;
- число объектов и ссылок;
- простота последующего изменения требований.
-
Разделить систему на этапы
- получение внешних данных;
- проверка формата;
- нормализация;
- построение канонического состояния;
- вычислительное ядро;
- форматирование;
- публикация;
- диагностика отказа.
-
Спроектировать систему методов
- одна ответственность;
- явные параметры и результаты;
- отсутствие скрытого доступа к консоли, файлам, времени и случайности;
- предусловия и постусловия;
- побочные эффекты;
- глубина копирования;
- контракт
Try...или исключения.
-
Построить схему зависимостей
- направление потока данных;
- методы, не зависящие от внешней среды;
- создание
Random,Stopwatch, путей и настроек на внешней границе; - отсутствие циклических зависимостей между этапами;
- возможность независимо проверить вычислительное ядро.
-
Спроектировать проверку до реализации
- обычные случаи;
- минимальные и пустые входы;
- границы диапазонов;
- недопустимые данные;
- ручная трассировка;
- инварианты;
- ошибки внешних ресурсов;
- регрессионный набор.
-
Оценить алгоритм и ресурсы
- основной размер входа;
- точное число операций на малом примере;
- асимптотическое время;
- дополнительная память;
- число копирований;
- предварительная обработка против повторных запросов;
- измерительный протокол при необходимости.
-
Реализовать минимальный работающий путь
- самый простой успешный сценарий;
- независимая проверка первого ядра;
- подключение следующих этапов по одному;
- отсутствие преждевременной универсальности;
- фиксация подтверждённого поведения.
-
Расширять без разрушения
- полный регрессионный прогон после каждого этапа;
- рефакторинг без изменения внешнего контракта;
- явное изменение спецификации при несовместимом требовании;
- версионирование машинного формата;
- обратная совместимость;
- миграция к новой внутренней модели.
-
Проектировать отказоустойчивую публикацию
- подготовка всех кандидатов;
- единое решение о начале фиксации;
- состояния после отказов;
- временные файлы;
- резервные копии;
- ограниченность пользовательского отката;
- разделение доказанной гарантии и ожидания платформы.
-
Защищать архитектурное решение
- минимум две допустимые альтернативы;
- прогноз преимуществ и недостатков;
- трассировки и измерения;
- подтверждённые свойства;
- обнаруженные расхождения с прогнозом;
- известные ограничения;
- условия, при которых архитектуру придётся пересмотреть.

