Результат: ученик превращает словесное требование в проверяемую спецификацию, выбирает представление и архитектуру, реализует систему по этапам и защищает корректность, стоимость и границы своих решений.

Содержание:

  1. Сформулировать назначение и внешнее поведение

    • задача пользователя;
    • входные и выходные данные;
    • наблюдаемый успешный результат;
    • ожидаемый неуспех;
    • ограничения размера и времени;
    • критерий завершения.
  2. Построить точную спецификацию

    • допустимые, граничные и недопустимые значения;
    • предусловия;
    • постусловия;
    • инварианты;
    • терминология предметной области;
    • контрольные примеры с заранее известным результатом.
  3. Смоделировать состояние

    • перечень всех необходимых величин;
    • связи между ними;
    • допустимые и недопустимые сочетания;
    • логическая и физическая длина;
    • подтверждённое и временное состояние;
    • изменение состояния отдельной операцией.
  4. Выбрать представление данных

    • отдельные переменные;
    • enum;
    • кортеж;
    • одномерный массив;
    • прямоугольный и зубчатый массив;
    • строка и машинный формат;
    • struct;
    • плотная и разреженная форма.
  5. Сравнить допустимые представления

    • число недопустимых состояний;
    • удобство проверки инварианта;
    • время основных операций;
    • дополнительная память;
    • стоимость копирования;
    • число объектов и ссылок;
    • простота последующего изменения требований.
  6. Разделить систему на этапы

    • получение внешних данных;
    • проверка формата;
    • нормализация;
    • построение канонического состояния;
    • вычислительное ядро;
    • форматирование;
    • публикация;
    • диагностика отказа.
  7. Спроектировать систему методов

    • одна ответственность;
    • явные параметры и результаты;
    • отсутствие скрытого доступа к консоли, файлам, времени и случайности;
    • предусловия и постусловия;
    • побочные эффекты;
    • глубина копирования;
    • контракт Try... или исключения.
  8. Построить схему зависимостей

    • направление потока данных;
    • методы, не зависящие от внешней среды;
    • создание Random, Stopwatch, путей и настроек на внешней границе;
    • отсутствие циклических зависимостей между этапами;
    • возможность независимо проверить вычислительное ядро.
  9. Спроектировать проверку до реализации

    • обычные случаи;
    • минимальные и пустые входы;
    • границы диапазонов;
    • недопустимые данные;
    • ручная трассировка;
    • инварианты;
    • ошибки внешних ресурсов;
    • регрессионный набор.
  10. Оценить алгоритм и ресурсы

    • основной размер входа;
    • точное число операций на малом примере;
    • асимптотическое время;
    • дополнительная память;
    • число копирований;
    • предварительная обработка против повторных запросов;
    • измерительный протокол при необходимости.
  11. Реализовать минимальный работающий путь

    • самый простой успешный сценарий;
    • независимая проверка первого ядра;
    • подключение следующих этапов по одному;
    • отсутствие преждевременной универсальности;
    • фиксация подтверждённого поведения.
  12. Расширять без разрушения

    • полный регрессионный прогон после каждого этапа;
    • рефакторинг без изменения внешнего контракта;
    • явное изменение спецификации при несовместимом требовании;
    • версионирование машинного формата;
    • обратная совместимость;
    • миграция к новой внутренней модели.
  13. Проектировать отказоустойчивую публикацию

    • подготовка всех кандидатов;
    • единое решение о начале фиксации;
    • состояния после отказов;
    • временные файлы;
    • резервные копии;
    • ограниченность пользовательского отката;
    • разделение доказанной гарантии и ожидания платформы.
  14. Защищать архитектурное решение

    • минимум две допустимые альтернативы;
    • прогноз преимуществ и недостатков;
    • трассировки и измерения;
    • подтверждённые свойства;
    • обнаруженные расхождения с прогнозом;
    • известные ограничения;
    • условия, при которых архитектуру придётся пересмотреть.