Мои контакты


воскресенье, 10 августа 2014 г.

Кейс успешно спасенного проекта

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

Начну с проекта под названием ...

... не могу сказать название :). Расскажу о процессе разработки, внутренних деталях, но все подробности не могу раскрыть по условиям NDA. Это достаточно популярный бесплатный торрент-клиент для просмотра фильмов, сериалов и мультфильмов, не дожидаясь полной закачки.

Начало

Над этим проектом работала команда, состоящая из четырех человек. Работа над ним началась в 2012 году и продолжалась почти полтора года. Нам передали код тогдашней версии, от которого бросало в дрожь. Разрабатывали его какие-то русские ребята из Австралии. Это было .NET WPF приложение. Работа с торрентами была реализована через библиотеку libtorrent, над которой было 2 обертки: первая - из C++ в C++/cli, вторая - из C++/cli в C#.

Тогда программа могла запросто падать в BSOD, постоянно зависать, всячески тормозить и т.д. Какое-то время мы пробовали "тюнинговать" это приложение: пытались оптимизировать работу с libtorrent, переводили некоторые части проекта на MVVM (некоторые, потому что все перевести с той архитектурой было невозможно), покрывали модульными тестами, т.к. вносить изменения и рефакторить код было крайне сложно, и т.д.

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

Наши действия

Было принято решение проектировать архитектуру по шаблону MVVM с использованием фреймворка Prism. Так мы и поступили, разработали простую и эффективную архитектуру, в которую легко вносить изменения и добавлять новый функционал. Плюс ко всему, сверстали  новый дизайн. Позднее, я поделился своим опытом о работе с WPF и MVVM via Prism на конференции dotnetconf.

Результат

Работа с торрентами была реализована через библиотеку MonoTorrent, которая является нативной для .NET с открытым исходным кодом. Большим плюсом для нас было то, что она поддерживает C# events. Однако без изменений в исходном коде не обошлось: мы исправили несколько багов и немного подправили ее под свои нужды. В частности, мы написать модуль, который позволяет нам скачивать файл с любого места. Это позволило реализовать возможность просмотра фильма с произвольного места.

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

Мы избавились от СУБД sqlite, а сохранение данных приложения реализовали в xml, это увеличило скорость загрузки и завершения приложения.

Нами была реализована функция подписки на сериалы, которая изначально планировалась, но не могла быть реализована в старой версии. Она позволяет автоматически скачивать новые серии у сериалов.

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

В итоге это получилась приятная и удобная программа, которой сейчас пользуется очень много людей.