Почему падал Зерулс?

Версия 2.0.2 Зерулса, как можно понять из номера — версия с исправлениями ошибок (как и предыдущая). Самая большая неприятность случилась с одной из предыдущих версий. В ней, если запустить приложение в iOS 6, все падало. 

Источник ошибки оказался в коде, который отвечал за то, чтобы старая версия выглядела как раньше. В новой (для iOS 7+) при этом же, полностью обновлен дизайн, переделан вывод текста на TextKit и добавлены новые анимации.

Почему вообще возникают ошибки в приложениях? Их создает программист. Он пишет код, который ломается. Хочется, конечно, чтобы программист был хороший и писал код без ошибок. Сложно ли этого добиться? Очень.

Чтобы примерно представить себе сложность кода, попробуем её сравнить со стройкой (чуть серьезнее, чем в истории про программистов и дома). Пускай программа содержит несколько тысяч методов, кирпичиков, из которых она состоит. Пусть также квадратный метр стены толщиной «в один кирпич» — это 100 кирпичей. Получается, что из нескольких тысяч кирпичиков-методов можно выстроить, к примеру, четыре стены для одной комнаты. Хороший каменщик справится достаточно быстро. А программист?

Сложность заключается в том, что каждый метод-кирпич — разный. Разный размер, разная форма, разные выступы, разный материал. Нет двух одинаковых кирпичей (один из принципов программирования так и говорит: Don't Repeat Yourself, или DRY). Кирпичеукладка сразу же получается совсем не простая, ведь нужно аккуратно подбирать их друг к другу. При этом, укладывая нижний ряд, следует подумать, что сверху может быть что-то тяжелое.

В середине процесса (или даже в самом конце) укладки-разработки вдруг выясняется, что вот этот кирпичик, поставленный в самом начале строительства, стоит некрасиво. Он должен переливаться разными цветами, а не просто светиться одним. И нужно его аккуратно вынуть и заменить, не сломав соседние и не взорвать всю конструкцию целиком.

Внезапно задача из понятной становится неимоверно, безумно сложной. Нужно держать в голове связи между всеми кирпичами, понимать возможности каждого и способы их замены. Зерулс, конечно, маленький, как одна комната. Но есть и особняки (ядро Линукса), или небольшие города (дистрибутив iOS со всеми приложениями и сервисами). В них количество взаимодействий между отдельными элементами (и даже внутри каждого элемента-подпрограммы) безумное, непредставимо большое.

В этих условиях приходится придумывать, как построить дом, чтобы ничего не развалилось. После этого научиться вынуть половину кирпичей, предусмотрев возможность вставить любые новые (неизвестные пока). Сделать это быстро. И, хотелось бы, без ошибок.

На самом деле, есть способы математически доказать, что программа будет работать корректно. Объем работы, которую нужно для этого проделать, показывает проект ядра операционной системы. Самая интересная там статистика проекта. 8700 строк кода на С + 600 строк на Ассемблере. Проверено из этого 7500 строк. Скрипт проверки — 200 000 строк. Если напечатать его на бумаге формата А4, получится стопка высотой полметра. Потрачено примерно 30 человеко-лет работы.

В ЗеРулсе примерно 17 000 строк кода. В Ангстреме — больше 30 000.