Здравствуй, Xamarin.Forms, или пост, запоздавший на 4 месяца

Черновик этой заметки был написан еще в июле, но по непонятным причинам забыт/отложен/отправлен на доработку. В свете свежеприобретенного опыта, я решил таки достать его из запасников истории и представить на свет божий :)

Меньше месяца назад, в июне 2014-го (да, заметка писалась еще в июле :)) ребята из Xamarin выпустили то самое, что от них ожидалось очень давно. Это — фреймворк для построения кроссплатформенного UI — Xamarin.Forms.
Такое решение — золотая середина между html-подобным интерфейсом, который выглядит ненативно на всех платформах, зато обладает на 100% общим кодом; и изначальным подходом Xamarin — где UI на каждой платформе полностью уникальный, отлично и естественно смотрится на всех устройствах, но требует разработки «с нуля» под каждую платформу.
Идея Xamarin.Forms в том, что многие базовые контролы пользовательского интерфейса так или иначе реализованы во всех системах (поддерживаются iOS/Android/WinPhone). Действительно, кнопки, надписи, поля ввода и переключатели есть везде. Xamarin выделил этот общий набор, собрал воедино все их свойства, и назвал эту абстракцию Xamarin.Forms. Из получившихся платформо-независимых классов можно строить интерфейс, а в результате под каждую платформу будет сгенерирован вполне естественный нативный UI с использованием «родных» компонентов.
Делать обзор функционала Forms через 5 месяцев после релиза слегка глуповато, так что я просто остановлюсь на некоторых плюсах и минусах, с которыми я успел столкнуться в процессе полу-продакшеновой практической эксплуатации Xamarin.Forms.
Continue reading

NoSQL против реляционных СУБД в задаче Entity-Attribute-Value

Задача хранения в базах данных схемы типа Объект — Множество Атрибутов — Значения атрибутов давно стала «классической».
В рамках реляционных СУБД, простейшее решение выглядит как-то так (anti-pattern detected!):

    public class Product
    {
        public int Id { get; set; }
        public List<propertyvalue> PropertyValues { get; set; }
        public string ProductTitle { get; set; }
        public decimal ProductPrice { get; set; }
    }

    public class Property
    {
        public int Id { get; set; }
        public string Title { get; set; }
    }

    public class PropertyValue
    {
        public int Id { get; set; }
        public Property Property { get; set; }
        public string Value { get; set; }
    }

И это не учитывая потенциальной типизации значений свойств (некоторые могут быть числовыми, другие — датой/временем и т.п.) и полагаясь на ORM для генерации таблицы связи много-ко-многим (Product/PropertyValue).
Continue reading

Oneliner: VerificationException: TaskAwaiter<> violates the constraint of type parameter ‘TAwaiter’ при использовании async в .net 4

Если при использовании async/await в .NET 4.0 вы видите что-то невнятное вроде

System.Security.VerificationException: Method System.Runtime.CompilerServices.AsyncTaskMethodBuilder`1[Cloud.API.TreeResult].AwaitUnsafeOnCompleted: type argument ‘Microsoft.Runtime.CompilerServices.TaskAwaiter`1[Cloud.API.TreeResult]’ violates the constraint of type parameter ‘TAwaiter’.

проверьте, во всех ли проектах одинаковая версия пакета Microsoft.Bcl (обновить всё до последней версии можно командой Update-Package Microsoft.Bcl).

Видеозапись семинара по итогам конференции DevCon-2014 в Rubius

Мы в Rubius очень давно не проводили семинары (с последнего, кажется, прошло уже 5 месяцев), поэтому решили восполнить пробел и поговорить о перспективах развития технологий и разработки на платформе Майкрософт.
Я кратко презентовал наиболее запомнившиеся мне моменты с конференции DevCon-2014, а потом мы достаточно бурно обсудили, что со всем этим технологическим счастьем делать и как дальше жить :)

Мои извинения за ужасный звук :)

P.S. презентацию выложу по запросу, но особой необходимости в ней я не вижу.

Universal App — кроссплатформенное счастье с #ifdef’ами и рефакторингом

Еще на конференции Build 2014 майкрософтовцы рассказали о новом типе проектов — Universal App. Естественно, на прошедшем DevCon 2014 я постарался разузнать побольше об этом типе проектов, и как он может помочь при разработке под iOS/Android.

Microsoft традиционно акцентирует внимание на том, что UniversalApp поможет повторно использовать кода между WinPhone и WinRT приложениями, не слишком афишируя то, что начиная с Xamarin 3.0 этот подход сработает и для iOS и Android приложений.
Давайте попробуем и посмотрим, что же у нас получится :)
Continue reading

Дружим Android и Windows 8.1 по ADB (особенно с китайскими устройствами)

Сегодня столкнулся с проблемами, которые отняли больше часа активного гугления, поэтому результат решил задокументировать.

Проблема была в банальной невозможности подключиться по adb к стародавнему Android-планшету — CUBE U9GT2 :) Не нужно искать в этом приступы геронтофилии — как оказалось OpenGL на процессорах MTK работает слегка странно, и доставляет проблемы нашему приложению, поэтому дебаг был жизненно необходим :)

После подключения к компьютеру на Win 8.1 этот старичок категорически не находился в выводе adb devices, а значит и отладка на нём была невозможна.
Проблема разделилась на 2 части:
Continue reading

Доклад на DevPro-2014

Сегодня прошла вторая конференция DevPro, организованная компанией Rubius.

На ней я выступил с докладом «Кроссплатформенное приложение за 15 минут или Беды и победы мобильной разработки».
Посмотреть презентацию можно на СлайдШаре:

Исходные коды демо-приложения (вместе с iOS версией).

Лучи благодарности организаторам и всем слушателям — очень приятно было находиться в атмосфере мотивированных и заинтересованных профессиональных коллег :)

Жутко обрезаная видео-версия доступна на youtube:

P.S. Желающим посмотреть мой доклад 2013 года — добро пожаловать по ссылке.

Ревью на книгу «Идеальная IT-компания. Как из гиков собрать команду»

Как и многие «управленческие» книги, «Идеальная IT-компания» почти не затрагивает тему технологий, а акцентирует внимание на важности soft-skills и командной работе. Но если большинство «управленческих» книг считают своим читателем прежде всего менеджеров, то авторы «Team Geek» ориентируются на участников команд — программистов — и формирование командной культуры и атмосферы изнутри (впрочем, не исключая и роста карьеры потенциального читателя :))

Несмотря на то, что книга очень молодая — оригинал вышел в 2012 году — в ней практически нет отсылок к Agile. Тем не менее, очень многое в книге перекликается с манифестами гибких методологий: это и принцип доверия команде, и важность технически сильной и мотивированной команды, и роль руководителя как «слуги команды» (скрам-мастер?), и многое другое.

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

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

Критика направлена не на человека (а на код), да и проблема вовсе не в «плохом коде» как таковом (код работает!), а в понимании этого кода в будущем.

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

Также любопытным мне показалась тема технического долга.

Команда никогда не должна тратить больше трети (максимум — половины) своего времени и энергии на «оборонительную» работу независимо от размера технического долга. Вложение большего количества времени в «оборонительную» работу — путь к политическому самоубийству.

Это, безусловно, связано с важностью создания правильного «visibility» — если команда перестает стабильно выдавать заказчику business-value (а исправление технического долга, в большинстве случаев, заказчиком не воспринимается, каким бы технически-продвинутым он ни был), то доверие команде будет резко падать.

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

P.S. Купить книгу можно в издательстве «Питер».

Инъекция зависимостей и меняющиеся параметры в конструкторе

При использовании инъекции зависимостей у меня частенько возникают проблемы с конструкторами.
Посмотрим на простой пример класса — сервиса почтовой рассылки:

public class EmailSender
{
	public EmailSender(ISmtpClient smtpClient, string serverAddress)
	{
	}

	public void Send(string from, string to, string text)
	{
		
	}
}

Какие у класса есть зависимости? Ему нужен SMTP-клиент, чтобы осуществлять отправку писем, а также необходим адрес смтп-сервера, который будет отправлять корреспонденцию.

Допустим, что у меня в проекте полная Инверсия Зависимостей и активно используются IoC-контейнеры. Какая возникает проблема?
ISmtpClient зарегистрирован в моем контейнере с ним проблем нет, но как сконфигурировать EmailSender адресом сервера? Непонятно.
Continue reading