Строгое соблюдение критериев завершения контрольных точек в той части, которая касается поддержания высокой производительности приложения, играет чрезвычайно важную роль по той простой причине, что добиться существенного улучшения производительности впоследствии без кардинального пересмотра проекта обычно оказывается невозможным. Типичные оправдания, подобные такому: "Главное сейчас — это завершить разработку готового варианта работоспособного кода к намеченному сроку, а проблемами производительности можно будет заняться и позже, при прохождении последующих контрольных точек", не выдерживают никакой критики. Справляться с проблемами производительности на более поздних стадиях производственного цикла всегда сложнее, поскольку с увеличением объема написанного кода зависимости между его отдельными частями только усиливаются, и это делает внесение необходимых изменений в проект все более затруднительным. Если кто-то говорит: "Проблемами производительности и их устранением мы займемся позже", то истинный смысл этого таков: "Мы не понимаем сути проблем производительности, с которыми столкнулись, и пока не можем сказать, каким образом собираемся устранять их в будущем. To, что мы создаем сейчас, — это прототип, который, как бы то ни было, может быть подготовлен к поставке; чтобы создать действительно завершенную версию приложения, нам, вероятно, придется переписать значительную часть кода".
Устанавливайте для контрольных точек конкретные и реалистические критерии их завершения, включающие в себя аспекты производительности. Гораздо лучше отсрочить завершение контрольной точки, чем перетянуть через финишную линию "хромающее" приложение. Устранение проблем производительности уже в той контрольной точке, при достижении которой был написан недостаточно производительный код, позволит вам использовать для их устранения всю вашу изобретательность и в то же время оставит открытыми просторы для будущего творчества. В части, касающейся аспектов производительности, критериями завершения контрольных точек должны охватываться две области: возможности интерактивного взаимодействия конечных пользователей с приложением и абсолютная производительность критических алгоритмов.
Пользовательский интерфейс мобильного приложения должен в любой момент сохранять способность к интерактивному взаимодействию с ним владельца устройства. Если в процессе работы приложения случаются периоды задержки, на протяжении которых пользователи вынуждены дожидаться результата, не имея никакой обратной связи с приложением, вы должны принять решение относительно того, каким образом следует обрабатывать подобные ситуации.
■ Можно ли исключить или сократить периоды задержек путем технической доработки проекта?
■ Можно ли обрабатывать задержки, вызывая заставки или отображая курсоры ожидания, уведомляющие пользователя о том, что выполнение приложения продолжается?
■ Можно ли передать выполнение задачи фоновому потоку, чтобы обеспечить сохранение пользовательским интерфейсом постоянной способности к отклику?
Среди алгоритмов, используемых в вашем приложении, всегда можно выделить ключевые алгоритмы, влияние которых на восприятие пользователем условий работы с приложением является определяющим. Таковыми являются алгоритмы, ответственные за выполнение наиболее важных функций приложения. К числу подобных алгоритмов относятся загрузка данных из баз данных, синтаксический анализ содержимого файлов, расчеты графиков для отображения их на устройстве или генерация отчетов для представления данных пользователю. Так, если для рисования графика на основании собранных пользователем данных требуется три минуты, то этот промежуток времени является слишком большим даже при условии сохранения интерактивной связи пользователем с пользовательским интерфейсом на протяжении всего периода ожидания. О том, чтобы в процессе выполнения таких ключевых алгоритмов пользователь не испытывал никакого дискомфорта, вы должны позаботиться отдельно, призвав на помощь всю свою творческую смекалку.
К числу вопросов, на которые необходимо дать ответ, пересматривая критические алгоритмы, относятся следующие:
■ Можно ли ускорить выполнение этих алгоритмов путем их настройки или изменения?
■ Можно ли прогнозировать потребность алгоритмов в тех или данных и заблаговременно загружать нужные данные, прежде чем в них возникнет необходимость, чтобы пользователь мог быстрее получить результат?
■ Можно ли выполнять наиболее трудоемкую часть вычислений вне устройства, на сервере?
■ Можно ли произвести некоторые вычисления или подготовить некоторые изображения еще на стадии проектирования, чтобы исключить или уменьшить потребность в проведении соответствующих вычислений на стадии выполнения?