Разработка приложения «Шереметьево» для Windows Phone глазами разработчика

    Недавно, (хотя уже в прошлом году) было опубликовано приложение Шереметьево, которое было продемонстрировано на выставке «Транспорт России». Так как я был конструктором этого приложения, и Шереметьево попросило выделить разработчика для присутствия на выставке и для консультации в трудных вопросах, я согласился с большим удовольствием – не каждый день удается побывать на таких выставках (а тут еще и за счет рабочих дней.


    На самой выставке был проявлен живой интерес к приложению и пришлось очень много общаться и рассказывать. Спрашивали по теме и не по теме. Неожиданно много пришлось рассказывать про сам Windows Phone, который некоторым был в новинку. Меня довольно часто принимали за сотрудника Шереметьево, а те, кто узнавали, что я один из разработчиков этого приложения интересовались и самой разработкой. Также я получал от друзей и коллег просьбы рассказать о разработке приложения Шереметьево и теперь, когда Аплана разрешила рассказать о разработке этого приложения, решил опубликовать статью с ответами на самые часто задаваемые вопросы.

    Проектирование приложения


    Конечно же проектирование приложения является важным моментом для дальнейшего планирования архитектуры и объема работы приложения. Прототип позволяет выделить необходимую функциональность и требования к приложению и позволяет избежать многих будущих ошибок. В первую очередь мы проработали навигацию и дизайн приложения. Например, один из первоначальных вариантов карты приложения выглядел следующим образом


    рис. Design Map (картинка кликабельная (pdf))


    Первоначальный дизайн впоследствии тоже подвергся незначительным изменениям.


    рис. Visual Design (картинка кликабельная (pdf))


    Конечно при этом у всех есть понимания, что это не строгая документация со всеми нюансами, а всего лишь примерная версия. Такие прототипы существенно упрощают понимание объема работ, который предстоит и позволяет заказчику примерно увидеть, что будет в конечном итоге. После согласования с заказчиком окончательного проекта мы приступили к написанию непосредственно самого приложения и бекенда.

    Разработка клиентского приложения.


    Ключевой функциональностью приложения является табло рейсов. Этой функции была отведена первая вкладка элемента Panorama на первой странице.

    По умолчанию на главной странице в первой вкладке отображаются всего два тайла с переходом на страницу с табло, где было осуществлено разделение рейсов по прилетам и вылетам в элементе Pivot.
    Соответственно на этой странице с табло предусмотрен поиск по номеру рейса или названию города. При выборе определенного рейса добавлена возможность «закрепления» этого рейса на главной странице приложения и на рабочем столе с возможностью закрепления вторичного тайла и возможностью подписаться на оповещения об изменениях статуса. При этом на вторичных тайлах можно отслеживать изменения статуса рейса:



    Также при реализации функциональности отписки от изменения статуса рейса мы столкнулись с проблемой. Хотели реализовать изначально простую функциональность: закрепил тайл – подписался на уведомления изменения статуса рейса с получением Toast нотификаций, открепил тайл – отписался от получения уведомлений статуса рейса. Решение было вполне логичным, с учетом того что Toast нотификация зачастую почти бесполезна, так как высока вероятность, что пользователь просто пропустит ее, тем более в шумной обстановке.

    Реализовать такое поведение в чистом виде помешало несколько обстоятельств:

    1. Обязательное требование гайдлайна – Нельзя спамить пользователя Toast нотификацией если он на это не подписался явно.

    2. После удаления вторичного тайла с рабочего стола, без запуска приложения нет возможности узнать, был ли удален тайл, соответственно отписать пользователя.

    В конечном итоге мы остановились на чуть более сложном варианте:

    При закреплении рейса предлагается выбор — подписаться на изменения рейса или нет. В случае подтверждения закрепляется вторичный тайл на рабочем столе и на главном экране и приложение подписывается на получение Tile и Toast уведомлений. В случае отказа только закрепляется вторичный тайл на рабочем столе без возможности обновления.

    Пожалуй, одним из самых сложных компонентов приложения оказалась карта аэропорта с картами по терминалам на каждом этаже с картой объектов POI (Point Of Interest, далее в статье я буду использовать термин POI, ставший у нас рабочим термином для обозначения объектов на карте). Идея заключалась в том, что на карте отображаются POI и по клику на них мы можем переходить на страницу деталей этого POI и наоборот из страницы деталей POI можно переходить на карту где расположено это POI. При этом на самой карте должна быть возможность фильтрации отображаемых POI по категориям.

    В приложении также требовалaсь возможность фильтрации POI на карте по категориям, в связи с чем возникло несколько проблем. В частности, оптимизация используемой памяти.

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

    Позже, когда мы все-таки получили информацию по POI с координатами, я переписал работу со слоями таким образом, что иконки POI с выбранными категориями рисуются на основной подложке в момент отображения карты.

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

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

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

    Разработка серверной части приложения


    К моменту когда мы приступили к разработке приложения у нас не было точной информации об инфраструктуре серверной части. Поэтому я принял решение разработать обычное серверное приложение на ASP.NET. Предполагалось, что это будет обычное поставляемое решение которое будет развернуто специалистами Шереметьево на отдельно выделенных серверах.
    Но в ходе разработки появились новые требования от заказчика: должна быть возможность отдать поддержку системы на аутсорс.

    Однако внутренние стандарты аэропортов содержат особые требования по безопасности и любые изменения в инфраструктуре должны пройти множество согласований. Именно ‘благодаря’ этим требованиям нельзя предоставить доступ напрямую к внутренней инфраструктуре аэропорта. API для подключения мобильных устройств к серверу не было предусмотрено изначально (по сути мы и разрабатывали это API).

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

    Текущая архитектура серверной части в упрощенном виде выглядит следующим образом.


    В новой версии отличие только в том, что сервер работает не с конкретным WNS для WP, а сразу с для несколько платформ и к REST API подключаются Android, IPhone приложения.

    Еще одним преимуществом использования Azure стало автоматическое управление количеством экземпляров сервиса в зависимости от нагрузки. Т.е. при повышении нагрузки на сервер запускаются дополнительные экземпляры, при этом было введено ограничение на максимальное количество экземпляров для избежания незапланированных расходов. Серверная часть самостоятельно обеспечивает свою работу таким образом, чтобы максимально сэкономить на своем содержании и при этом обеспечить бесперебойную работу без необходимости мониторить работу сервера 24 часа в сутки.

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

    Почему Windows Phone?


    Пожалуй этот вопрос был одним из самых популярных вопросов на выставке. Особенно на фоне того что мало у кого из посетителей был WP. Присутствие на подобных выставках позволяет видеть насколько сильно может отличается предпочтения моего круга общения с предпочтением других «кругов». Если не большинство, то точно половина моих знакомых и друзей которые пользуются смартфонами, пользуются Windows Phone (и признаться, для некоторых я сыграл определенную роль в выборе). На выставке же, несмотря на то что в России по разным статистикам лидирует Android, мне показалось что, IPhone-девайсов было подавляющее большинство, а те кто пользовались Android в основном пользовались Samsung Galaxy что в итоге делало этот вопрос особенно актуальным.

    Небольшое отступление немного не в тему: Для моих друзей не секрет что я хоть и занимаюсь разработкой под все платформы, мое предпочтение отдано Windows Phone. Часть людей подходили просто пощупать WP8 девайсы, любезно предоставленные компанией Nokia, куда мы установили приложения, и соответственно я с удовольствием отвечал не только на вопросы о приложении но и на вопросы о самой платформе WP. На удивление многие из текущих владельцев Apple техники, которые вживую щупали Windows Phone на нашем стенде отозвались крайне положительно. Больше всего, как мне показалось, людей подкупали живые тайлы с актуальной информацией и сама возможность закрепления вторичного тайла (в нашем случае возможность закрепления живых тайлов отдельно для рейсов). Был лишь один человек который достаточно жестко протроллил меня на тему отстойности Windows Phone и железа, и что круче железа и ОС чем у IPhone быть не может (его не убедил даже мой личный Lumia 920, который я с удовольствием демонстрировал). Я не стал вступать в полемику с этим человеком и убеждать что WP тоже не плох – на выставке я показывал возможности нашего приложения и платформы Windows Phone, а выводы каждый делал сам.


    Перед началом разработки мы должны были выбрать одну платформу и окончательный вариант приложения портировать на другие платформы. Конечно, выбор платформы Windows Phone был сделан не из наших личных пристрастий (к слову сказать наш директор тоже пользуется WP как и я), и не столько из-за того что сейчас эта платформа быстро набирает популярность, сколько из-за того, что это самая простая и быстрая платформа для разработки. Как и предполагали, в конечном итоге это оказалось наиболее удачным решением, так как в процессе разработки мы вносили множество кардинальных изменений в проект. Приходилось менять практически все – как UI приложения, так и логику во всех трех приложениях (клиентская, серверная часть и утилиты).

    Использование одной платформы (.NET) для серверной, клиентской частей и специально разработанных утилит для работы с контентом позволило относительно дешево вносить изменения. Зачастую приходилось вносить изменения всего в одну сборку с моделями для всех трех типов проектов (Отдельное спасибо за Portable Library, который теперь стал частью VS2012 и предоставлялся в виде расширения для VS2010). Любые изменения в модели данных сразу же оказывались во всех проектах.

    Трудности встретившиеся в работе.



    На этапе разработки

    Как я уже писал выше, больше всего провозился с картами. Это было одной из самых тяжелых компонент для разработки, к которому требования менялись несколько раз.
    LongListSelector уже не раз подводил и даже в последнем обновлении не исправили багу отрисовки картинок, который можно наблюдать, если вместо привычных букв в заголовках использовать тайлы. В конечном итоге после некоторых попыток исправить эту багу своими силами, решили заменить на более качественный Telerik-овский аналог, который был избавлен от этого бага.

    Контролы Telerik просто шикарны, но я стараюсь максимально избегать платных продуктов из-за особенностей сопровождения.

    Так же в этом проекте я использовал свой проект с открытым кодом WPExtensions, в частности, AdvancedApplicationBar, который значительно упростил работу с ApplicationBar. Например, в деталях POI необходимо было скрывать те кнопки в AppBar, для которых не было информации (например, позвонить или открыть веб-сайт и т.п.), а в стандартном AppBar свойство Visibility отсутствует. Соответственно с помощью этой библиотеки так же удобно было использовать MVVM с ApplicationBar. К сожалению в версии, которая лежит в nuget есть несколько багов с некрасивым передергиванием AppBar. В проекте использовал более свежую версию, исправленную от этих недостатков, но не достаточно хорошо проработанную с точки зрения качества кода для выкладки в nuget.

    Организационные проблемы

    Как и любая другая крупная компания, Шереметьево обладает определенным бюрократическим механизмом. Конечно же, в данном случае это более чем оправдано – ведь на кону безопасность пассажиров и вся деятельность компании строго регламентируется. Шереметьево – это не страртап, который может очень быстро менять структуру, ответственности людей и самих людей в зависимости от меняющихся внешних требований. С другой стороны это вылилось в то что порой приходилось ожидать недели для получения даже простейших данных или согласования незначительных изменений. Надо отдать должное коллегам из Шереметьево, которые прилагали немало усилий, добывая необходимые для приложения данные и проводя согласования изменений через разные отделы внутри компании, без чьих усилий мы бы не выпустили приложение в прошлом году.

    От некоторых функций все-таки пришлось отказаться в пользу следующих обновлений. К примеру, на первом этапе нам не удалось раздобыть GPS привязки к картам и мы так и не успели сделать позиционирование внутри помещений. Сейчас это одно из приоритетных обновлений.

    Проблемы сертификации

    Сертификация тоже прошла не без неожиданностей.

    В нашем случае приложение не прошло сертификацию из-за того, что в приложении «задеваются религиозные чувства в Китае». Чем же именно китайцем не угодил контент, выяснить так и не удалось Таким образом, мы потеряли еще 5 дней на перепубликацию приложения, на всякий случай исключив все страны с ужесточенными требованиями к контенту.

    В будущих версиях надеемся пройти сертификацию и в Китае, а разработчикам могу только посоветовать, что если приложение необходимо выпустить пораньше, то при первой публикации не надо указывать страны с повышенными требованиями к контенту, даже если на 100% уверены, что никаких нарушений нет.
    Поделиться публикацией

    Комментарии 45

      –36
      Вот почему программисты не должны писать тексты.
        +8
        не могли бы Вы как-то пояснить столь категоричное высказывание?
          0
          Минусов нахапал заслуженно, но история хорошая и пост то мне понравился.
          Я на самом деле имел ввиду структуру текста похожую на код.
          При начале описания про POI, автор увлекается повествованием и совсем забывает о читателе. Очень сложно читать тест, где через слово повторяется POI, POI, POI. Но это ведь не переменная, её можно и опустить.
          Нужно вычитывать текст перед публикацией.
          Или к примеру «Также я получал от друзей и коллег просьбы рассказать о разработке приложения Шереметьево и теперь, когда Аплана разрешила рассказать о разработке этого приложения...»

          Прмичем с середины текста всё становится нормально.

          Вот и всё — ненужно злится, всем хардкод!
          +6
          Вы про свой комментарий?
            +8
            Открою страшную тайну: тексты для программерских книг пишут программисты, а не Донцова.
              +1
              Вот я бы поспорил. Все книги проходят через копирайторов и редакторов. Не все же умеют писать грамотный текст.
                +1
                они еще иногда через переводчиков проходят :(
            0
            Насчёт «религиозных чувств Китая»
            Если мне не изменяет память, то есть группа стран, в которых в приложениях запрещено упоминать алкоголь. Совсем. У вас во Fridays упомянут Jack Daniels.

            А в Китае под таким же запретом фейсбук. Причём если даже в приложений его не будет, а на скриншотах останется, то приложение развернут.
              0
              Мы тоже (хотя и не сразу) подумали об упоминании алкоголя в POI, но формулировка «религиозные чувства» смутило. Я сам подумал что возможно кого то смутило иконка POI использованная для категории «Верующим». Возможно смутило что для этой категории использована христианская символика для обозначения этой категории. С другой стороны, какую еще можно иконку использовать для этой категории? Тем более там только POI с христианской атрибутикой.
              +7
              Не нравятся мне интернет сервисы аэропортов в России. Вообще не нравятся.
              В прошлом году купил билеты в Канаду на сайте аэропорта Внуково. Специально искал билеты, не требующие никакой визы, кроме канадской. В итоге $1700 просто выкинул в корзину, когда меня сняли с рейса из-за отсутствия шенгена. Никто не посчитал нужным уведомить клиента о необходимости транзитной визы на этом маршруте (хотя на всех других четко прописано «Необходима транзитная виза»).
              Деньги так и не вышло вернуть.
                +9
                А мне сами аэропорты не нравятся.
                  +1
                  а в каком транзитном аэропорту требовался шенген?
                    0
                    летел через цюрих и женеву в ванкувер. Вроде как и там, и там нужен был. А может только в цюрихе.
                      0
                      А чего гадать то? В аэропортах по всему миру есть разделение на внутренние и международные терминалы. Так что для перелета из Цюриха в Женеву нужно выйти из международного терминала и зайти во внутренний. Для выхода из международного терминала, собственно, и нужно пройти таможню — никаких сюрпризов здесь нет. Сюрпризы бывают в некоторых странах (в частности, насколько я помню, США), в которых даже для чисто транзитного международного рейса (влетел из одной страны, вылетел в третью) нужно проходить таможенный контроль и иметь визу.
                        0
                        Проблема в том, что на сайте для этого маршрута нет пометки «Требуется транзитная виза».
                        Попробуйте сами проложить маршрут Москва-Цюрих-Женева-Ванкувер на сайте аэропорта Внуково.
                        А теперь попробуйте любые другие дальние иностранные маршруты. Где нужна виза — там везде стоят пометки.
                          0
                          Нет, я согласен с Вами, что раз есть подобное поле, оно должно быть правильно заполнено. Я к тому, что не только Внуково должно проверять данные о рейсах (никто не спорит, что они должны), но и Вы сами — деньги то немалые. И вот как раз в данном случае можно даже не копать Орбитсы, Каяки и Тревелосити: для того, чтобы совершить внутренний рейс 100% нужно выйти из транзитной зоны.

                          А вообще, конечно, больше всего виновата авиакомпания, которая зарегистрировала Вас на рейс из Москвы не удостоверившись в наличии визы — странно, что они не пересадили Вас на какой-нибудь более приемлемый для Вас маршрут.
                            0
                            Именно так, виноваты продавцы билетов. Только доказать это никак не получится, а сколько я им в техподдержку об этой проблеме не писал, так ничего и не исправили.
                            В России великолепно перекладывают обязанности продавцов на покупателей.
                    0
                    Странно. Аэропорт же вроде нейтральная зона, а самолет это вообще территория той страны, которой принадлежит самолет? Это обыгрывалось в фильме «Терминал».
                      0
                      Нейтральная зона начинается только после прохождения таможенного и паспортного контроля при вылете, и соответственно, до их прохождения по прилету.
                      0
                      Открою секрет: аэропорты не продают билеты. Билеты продают авиакомпании — напрямую или через GDS (global dustribution system)
                        0
                        в данном случае (сайт аэропорта Внуково) — это компания «VIP сервис». Но Аэропорт Внуково-то должен был как то удостовериться в правильной работе сервиса, который вставляют на главную страницу?
                          0
                          Вряд ли: во-первых все возможные комбинации маршрутов не проверишь, во-вторых условия перелета пишут авиакомпании. В данном случае сложный стыковочный рейс надо было покупать в агентстве, где живой человек нашел бы всю информацию и разъяснил. Онлайн-билеты — для простых или проверенных маршрутов :)
                        0
                        Печальная история, сам боялся однажды так попасть.
                        Но в данном случае это ответственность авиакомпании, а не аэропорта, если вы покупаете билет из точки А в точку Б, а не два отдельных билета разных компаний из А в Т и из Т в Б.
                        В общем, лучше всего мучать представителей авиакомпаний по таким вопросам.
                        +1
                        Легко читается, мгновенно откладывается. Спасибо.
                          +4
                          Красивая design map. В какой софтинке такое можно нарисовать?
                          +1
                          Пользовался несколько раз этим приложением. С точки зрения пользователя всё просто отлично и очень удобно сделано. Спасибо!
                            +1
                            … После удаления вторичного тайла с рабочего стола, без запуска приложения нет возможности узнать, был ли удален тайл, соответственно отписать пользователя…

                            А вот возможно так, чтобы при прикреплении тайла, занести информацию (uri) о нем в Isolated Storage. Потом перед показом Toast-а или сообщения на тайле, проверить (обязательно через мютекс) по тому самому uri прикреплен ли тайл все еще или нет?
                              0
                              Проблема в том что в WP7 в свернутом приложении нет возможности перехватить и обработать любой тип нотификации, ни Tile ни Toast. А Raw нотификация так и вовсе не приходит в свернутое приложение. Соответственно если пользователь открепляет вторичный тайл узнать об этом событии можно только после того как пользователь запустит приложение. К примеру, если все таки придет Toast нотификация после удаления тайла и пользователь заметит и тапнет по нему, приложение запустится и отпишет его от дальнейших оповещений. Вот такой вот компромисс.
                                0
                                Понятно.
                                Кстати большое спасибо за WPExtensions. Использую для моего приложения Bitshark. Только при использовании в паре с PhoneThemeManager, возникла проблема и пришлось немного изменить код AdvancedApplicationBar.
                                  0
                                  Вам спасибо! У меня никак не получается найти красивое API для решения одной серьезной баги с производительностью. Получается кривое решение что в начала на каждой странице необходимо отключить обработку AppBar в NavigateTo а после завершения в Load включать обратно что бы все работало корректно. Если обойду эту проблему выложу новую версию в публичный доступ :).
                              0
                              > Почему Windows Phone?

                              Прочитал несколько абзацев но так и не увидел причин, кроме того, что «легко разрабатывать» и «у меня и директора WP», то есть в общем сильно субъективные причины по выбору платформы. Да, еще заметил вскользь упоминание, что не от вас зависел выбор. Это было требование заказчика или как? Мое мнение, что этим приложением вы потенциально охватываете уж очень не большую аудиторию для первой версии приложения. Процент владельцев WP мал по сравнению с iOS и Android. Не логичней было начать разработку приложения под одну из этих платформ, тем самым позволить большему проценту пассажиров использовать приложение?
                                0
                                Конечно же Вы правы. Но проблема в том что мы заранее знали что у нас неизбежно будут изменения. И мы изначально знали что будем писать серверную часть и утилиты конвертирования данных на .NET. В конечном итоге именно так все и получилось. Мы вносили очень много изменений и эти изменения не давались бы так дешево на других платформах, хотя бы потому, что у нас в прямом смысле этого слова, для моделей у нас использовалась единственная сборка для всех проектов.

                                По сути мы бы до сих пор разрабатывали если бы взяли за основу другую платформу. Здесь мы изначально рассчитывали на единственное разрешение экрана в 800x480 и фрагментация андроида не позволило бы быстро прорабатывать и менять UI. И боюсь разжечь холивар, но XCode и язык Object-c не так удобны как VS + Resharper c C#.

                                Теперь когда функционал стабилизировался и заказчик доволен получившимся результатам мы можем с гораздо меньшими затратами по ресурсам и времени портировать приложение на другие платформы.

                                  0
                                  А если ещё воспользоваться возможностями xamarin…
                                    0
                                    На самом деле я один из самых больших поклонников mono и активно использую в «домашней» разработке http://habrahabr.ru/post/158481/ даже из своего кормана потратился по 400$ на monodroid и monotouch и регулярно обновляю лицензию.
                                    Но все же при всей «крутости» платформы надо признать что у него есть ряд недостатков.

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

                                    Во вторых нужна команда таких же фанатиков как и ты сам. А в жизни получается так что те кто хорошо знакомы с object-c и java не хотят связываться с C# и .NET. А те кто хорошо знают C# и XAML не хотят связываться с особенностями разработки UI Android и IPhone, даже если перешли с этих платформ на .NET

                                    Ну и в третьих в моно продуктах периодически бывают досадные баги и приходится просто сидеть и ждать пока их исправят в следующей версии. Хотя этот пункт и не особо актуален но все же бывает.
                                      0
                                      > А те кто хорошо знают C# и XAML не хотят связываться с особенностями разработки UI Android и IPhone, даже если перешли с этих платформ на .NET

                                      Золотые слова. Но ничего, были же ASP.net, winforms. Ощущения примерно те же.

                                      >Ну и в третьих в моно продуктах периодически бывают досадные баги и приходится просто сидеть и ждать пока их исправят в следующей версии. Хотя этот пункт и не особо актуален но все же бывает.
                                      Согласен, бывают. Но в основном в тех местах, где они имитируют дот нетные классы. Я им постил баг с DataTime, когда он по-русски выдавал «15 сентябрь» а в приложений использовал уже платформенный класс и все работало отлично. Так что не всегда надо ждать
                                0
                                Это первое приложение на WP, которое у меня вылетело :) После перезагрузки проблема исчезла. Такое было впервые и фиг знает, что это было.
                                  0
                                  Мы используем BugSense для баг-репортов и уже поймали несколько очень редко возникающих и трудновоспроизводимых крешей которые уже исправили и после тестов выложим исправленную версию. Надеюсь этим апдейтом покроем этот баг тоже :)
                                    0
                                    Вот бы поподробнее о багах :)
                                      0
                                      Без проблем. Возможно мне они приелись, но если есть вопросы, буду рад ответить. :)
                                        0
                                        Вопрос собственно один: что это за трудноуловимые баги такие?
                                          +1
                                          В принципе ошибки достаточно типовые и местами глупые и связаны были в основном с качеством кода. К примеру один раз была ошибка из за предположения что один метод всегда выполнится раньше другого метода в асинхронном коде. (По сути они так и выполнялись ранее, но для повышения производительности были распараллеленны). Несмотря на то что ошибку можно было быстро исправить, например, добавив мьютекс, обычно я не исправлял эту ошибку добавлением такого хака, а рефакторил таким образом что бы убрать такую зависимость.

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

                                          Конечно были и совсем детские и простые баги. Например из за некорректного формата Url в POI, попытка открытия сайта во внешнем браузере для этого POI приводило к исключению в Launcher-е.
                                  0
                                    0
                                    А на чем вы рисовали отношения между скринами?
                                      0
                                      Их рисовал наш проектировщик. Он рисует такие карты в Photoshop, Corel или Illustrator по ситуации.

                                    Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

                                    Самое читаемое