Pull to refresh
0
Evernote
Evernote

Слоны любят манго, часть 1/2: закулисный взгляд на Evernote для Windows Phone 7

Reading time6 min
Views7.6K
Автор: Дамиан Мэйерс, создатель клиента Evernote для WP7

image

Введение


Год назад я работал в ИТ-отделе большой розничной компании, управляя командой из 11 человек. Вообще с подросткового возраста я занимался разработкой ПО, но всегда хотел попробовать себя в управленческой должности. Я продал два моих первых стартапа прежде, чем они превратились в растущие компании, так что отсутствие опыта в менеджменте оставалось моим слабым местом, над которым следовало поработать.
Затем возникла противоположная ситуация. Мне понравилась руководящая работа, она оказалась вполне мне по силам, но я также чувствовал потребность в программировании, чтобы не терять навыки.

В результате в свое свободное время я написал клиент Evernote для Windows Mobile 6.5. В нем был реализован ряд возможностей, отсутствовавших в официальном приложении, таких как офлайн-заметки. И едва я закончил работу над ним, как Microsoft объявила о перезагрузке своей стратегии на мобильном рынке и выпуске Windows Phone 7 (WP7).

На тот момент я уже начинал понимать, что менеджмент не для меня и стал подумывать о новом стартапе, когда мне позвонил Фил Либин, генеральный директор Evernote, и спросил, не хотел бы я присоединиться к Evernote и создать клиент сервиса для WP7. Это было очень вовремя — конечно, я согласился. И вот недавно мы представили первую версию клиента для этой платформы.

Это рассказ о том, что было реализовано, а что нет, что делает WP7 отличной платформой для разработки, и какие сложности там встречаются. Я также попробую рассмотреть возможности, которые откроются с выходом следующей версии WP7 под кодовым именем Mango.


Достойная платформа для разработки



Старые корни

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

Несмотря на то, что у меня был небольшой опыт работы с Silverlight, я много лет занимался разработкой на C#, и теперь появилась возможность применить заново полученные тогда навыки. Если у вас уже был опыт разработки с использованием таких технологий, как Language Integrated Query (LINQ), lambdas и garbage collection, вам будет сложно отказаться от них впоследствии.

Silverlight существует уже несколько лет, и хотя технология не стала популярной в Интернете, она достаточно востребована в интранет-разработках для корпоративных сред.
Silverlight и шаблон разработки Model View ViewModel (MVVM) используются вместе. Вы декларируете, что ваш пользовательский интерфейс будет обрабатываться как XML-язык под названием XAML, который декларативно привязан к вашему коду ViewModel. Это значит, что вы можете протестировать ваш код ViewModel отдельно, без необходимости задействовать пользовательский интерфейс. Silverlight также получил фантастически удобную систему управления анимацией и визуальным представлением.

Превосходный инструментарий


Разработчиков WP7 балуют. Не только тем, что мы имеем мощный зрелый и функциональный IDE в Visual Studio с такими отличными плагинами, как Resharper, но и потому что у нас есть быстрый эмулятор, а также полноценная отдельная дизайнерская утилита в Expression Blend.

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

Blend позволяет вам спроектировать, разработать анимацию и настроить пользовательский интерфейс приложения. Хотя изначально его разработали как платный hi-end-инструмент для дизайнеров, это вызвало бурю эмоций со стороны разработчиков, так что Microsoft сделала его бесплатным для разработчиков WP7. С ним легко и удобно работать, поскольку Blend позволяет сосредоточиться на внешнем виде и взаимодействиях вашего интерфейса и заниматься раскадровкой и анимацией, не заботясь о коде.

Сообщество


Коммьюнити
Наличие сильного сообщества вокруг разработки под WP7 нельзя назвать чем-то уникальным, однако, возможно, из-за молодости платформы, в сообществе чувствуется высокая активность.

Помимо обычных мест, таких как Stack Overflow и собственный форум Microsoft, есть такие сайты, как Windows Phone Geek, которые обеспечивают постоянный приток качественных советов и подсказок, а также статей по данной тематике.

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

В клиенте Evernote для WP7 я использовал:
  1. Microsoft WP7 Toolkit
  2. MVVM Light Toolkit от Лорана Бюньона
  3. Компонент FadingMessage из PhoneyTools Шона Вайлдермута
  4. Fluid List Animation от Колина Эберхардта с небольшими изменениями.


Некоторые сложности


Отсутствие базы данных

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

Добро пожаловать в мир, где эти знания могут пригодиться. В первом релизе WP7 нет доступной разработчикам технологии баз данных. Все, что есть — это изолированное хранилище и возможность поиска по файлам.

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

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

Ошибки платформы

Обычно довольно самонадеянно считать, что вы нашли ошибку в платформе — гораздо более вероятно, что проблема в вашем собственном коде. Однако в первом релизе новой платформы, такой как Windows Phone 7, иногда вина лежит действительно на ее стороне.

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

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

И наконец, сама платформа требует запуск различных функций в UI-потоке в неожиданных ситуациях, таких как доступ к IsolatedStorage или сетевое соединение (даже если оно инициировано без участия UI-потока и, разумеется, не использует класс WebClient), что может сказаться на производительности.

Плавная прокрутка

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

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

Несмотря на эти преимущества, я привлек к работе еще LongListSelector из WP7 Toolkit. У него есть некоторые интересные возможности, такие как группировка и якоря, которые сообщают вам, когда список данных используется, а когда уже нет. Он обеспечивает виртуализацию пользовательского интерфейса, но ему не хватает виртуализации данных – первое, что он делает, это проходит каждый элемент в списке, к которому привязан…

Есть много статей и методик по созданию плавной прокрутки. Это и загрузка данных из фоновых тредов, и приостановка загрузки во время прокрутки. Но все равно достаточно сложно все сделать правильно, когда у вас много элементов, и не все из них находятся в памяти.

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

Продолжение
Tags:
Hubs:
+19
Comments7

Articles

Change theme settings

Information

Website
evernote.com
Registered
Founded
2008
Employees
201–500 employees
Location
США