From Novosibirsk, Russia? Our tiny company is looking for current or future rock-star developers.

March 26, 2009

Софтовый шоппинг

Есть на свете серьёзные покупки. Например, автомобиль люди (чаще всего) покупают вдумчиво: изучают характеристики, ходят по салонам, сравнивают, изучают результаты тестов. Прямая противоположность им — рутинные покупки вроде молока и хлеба.

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

Эти три рынка совершенно различны. Важно понимать, на какой из них вы хотите попасть с вашим товаром (или мазагином).

Посмотрим на софт. Большинство разработчиков считает, что они продают автомобили: пользователь сначала обнаружит потребность, потом пойдет выбирать, проанализирует варианты и что-то одно купит.

Разумеется, часто так и бывает. Но не нужно забывать и про другие варианты. Например, возьмём MacUpdate Promo: большие (вроде 50%) скидки на программы, которые длятся один день (каждый день продают новую программу). Я подписан на их рассылку, и там регулярно пробегает софт, который очень хочется купить.

Или, например, по статистике подавляющее большинство купленных в App Store iPhone-приложений никогда не запускают второй раз. Когда Apple рекомендовали цены вроде $0,99 или $3,99, думаю, они прекрасно понимали, что делают: магазин, в котором люди будут наслаждаться покупкой, а не удовлетворять возникшие потребности.

Кто-то из блоггеров недавно сравнивал iPhone-приложения с шоколадными батончиками: люди считают нормальным потратить бакс на Snickers и съесть его за две минуты, точно так же нормально потратить бакс на игрушку и поиграться в неё пять минут.

Для шоппинга очень важен user experience, поскольку на самом-то деле у пользователя нет большой потребности. Он сбежит, если вы не будете его развлекать и удерживать. «Самое популярное», «еще часто покупают вот это», отзывы, заказ в один щелчок — всё это вводит пользователя в flow state, при котором он получает удовольствие, а вы — деньги.

В этом часть гениальности iTunes: он делает шоппинг до безобразия простым и неотделимым от прослушивания музыки. Apple успешно развивает рынок в направлении «шоппинг — часть нормального использования софта». В iPhone OS 3.0 можно покупать дополнения из самих приложений; на сцене мы видели демку Sims 3, где в процессе игры можно докупать коллекции вещей, и демку многопользовательской стрелялки, где перед боем можно купить rocket launcher и другой полезный арсенал (за реальные деньги! вы только подумайте!)

Не знаю, как вы, а я считаю это гениальным. Не пропустите возможность встроить шоппинг и в ваши программы. Может, маленькие милые плагинчики? Мелодии или темки? Что-то, что нафиг не нужно пользователю, но зацепит его с первого взгляда. И не забудьте делать некоторые товары более удачными покупками с помощью скидок, featured items, editor’s choice, рейтингов.

(Разумеется, товары не обязаны быть платными. Вы можете зарабатывать деньги за счет популярности или рекламы, или же предлагать смесь платного и бесплатного. Поэтому вас, разработчики open-source, данный метод тоже касается: ничего так не увеличивает популярность, как каталог почти никому не нужных фенечек, которые можно поставить одним кликом.)

March 09, 2009

Sneak Peak: YourSway Builder

Наша компания отличается еще и тем, что пользуется самописной системой сборки. Когда-нибудь мы доведем её до продукта и будем предлагать другим, как CrashKit, но пока что YourSway Builder — это приватное удовольствие.

Зачем писать своё, когда в мире есть BuildBot’ы и CruiseControl’ы? Чтобы не париться с их поддержкой. Каждая существующая система предполагает, что вы держите настроенный клиент и сервер, и готовы с ними возиться каждый раз, когда вам нужно изменить способ сборки или начать собирать новый проект.

Мы, напротив, хотим, чтобы для поднятия билдов нового проекта было достаточно браузера.

На любом компьютере можно запустить клиентское приложение, которое сможет собирать любые проекты, скачивая все нужные пререквизиты. У нас каждый член команды может запросто запустить сборку любых проектов на своем компьютере из своих репозиториев (ибо при использовании DVCS у каждого может быть свой репозиторий).

На страничке в Backpack есть несколько скриншотов, а также описание нашего vision’а. Повторюсь, что в YourSway Builder’е пока есть только то, что было нам совершенно необходимо. Мы им пользуемся во всех проектах, но для публики он еще не готов.

А что вы думаете по поводу билд-систем? Чего вам в них не хватает? В каком виде YourSway Builder был бы вам интересен?

March 03, 2009

Меньше ветвлений!

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

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

Тут есть две альтернативы. Вариант А: попытаться отправить исключение, если не удалось, записать его в файл, минут через десять считать и попробовать заново. Вариант Б: записать исключение в файл, попробовать его отправить через пару секунд; если не удалось, повторить снова еще позже.

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

1. Увеличиваются затраты на автоматизированные тесты и на QA.

2. Рано или поздно вкрадется бага, не отловленная тестами и не пойманная вашим QA-процессом. (Например, всё рушится только под Windows Vista x64, установленной на FAT32-раздел.)

3. Продукт с этой багой вы можете поставить заказчикам и не узнаете о ней, пока заказчик с ноутбуком под Windows Vista x64 на FAT32 не запустит ваш продукт вдали от Интернета.

Сравним с вариантом Б. Исключение всегда сначала записывается, потом устанавливается таймер, он срабатывает, исключение считывается и отправляется. Нормальную (частую) и ненормальную (редкую) ситуации обрабатывает один и тот же код; если он не работает, пользователи закричат об этом сразу же.

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

Из нашего правила следуют два важных практических соображения.

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

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

CrashKit

Мы начинаем ограниченное бета-тестирование CrashKit — веб-приложения, собирающего и показывающего необработанные исключения в ваших продуктах.

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

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

В ближайшее время мы введем в строй поддержку целой кучи языков, так что на чем бы вы ни писали, смело шагайте на crashkitapp.appspot.com, оставляйте свой e-mail, и мы в течение месяца пригласим вас участвовать в бета-тестировании.

(Если вам интересно, CrashKit написан на Google App Engine. Он уже некоторое время используется в приложениях, которые мы поставляем клиентам. Хорошо работает поддержка Java/OSGi, в разработке поддержка Java/Servlets и Python/Django, после них будет Ruby on Rails и что-нибудь еще, чего захотят пользователи.)

February 15, 2009

ProjectSync 1.2

Мы опубликовали ProjectSync — Eclipse-плагин, который синхронизирует папки на диске с Working Set'ами в Eclipse'е. Он автоматически импортирует недостающие проекты, а также автоматически перемещает вновь созданные проекты в нужную директорию (согласно их Working Set'у).

Особенно это удобно, когда ваши проекты лежат в нескольких репозиториях: без ProjectSync при создании нового проекта приходится руками указывать, куда его положить, а при появлении нового проекта в репозитории — руками его импортировать. (Не говоря о том, что новый пустой workspace теперь заполнять в разы быстрее.)

ProjectSync ничего не делает за вашей спиной и не тормозит Eclipse; синхронизация активируется пунктом в меню Project.

Последнюю версию 1.2.1 можно взять со странички www.yoursway.com/free/ProjectSync/. Проверен на Eclipse 3.4 и Eclipse 3.5 M5. На Eclipse 3.3, скорее всего, тоже работает.

Там же есть ссылки на сорцы, баг-трекер, лицензию (EPL) и способы получения техподдержки.

February 04, 2009

Совместимость

Название этой операционной системы, созданной маленькой компанией в конце 80-х и установленной сегодня на 8% компьютеров мира, программисты под Mac и iPhone регулярно вспоминают, набирая префикс NS у названий системных классов.

Nextstep 1.0 появилась в 1989 году после трех лет разработки, имела полностью объектно-ориентированное API с архитектурой model-view-controller, имела ядро Mach и была Unix’ом. Теперь она называется Mac OS X. За прошедшие 20 лет дизайн её API, теперь именующимся Cocoa, мало изменился: всё те же NSApplication, NSView, NSDocument успешно лежат в основе сегодняшних красивых анимированных Mac-приложений. Исходники GNUstep, реализующего Nextstep API 1993 года, можно в наши дни читать вместо (недоступных) исходников Cocoa.

Пользовательский интерфейс Nextstep включал богатый drag’n’drop между приложениями, Dock, инспекторы, общесистемные сервисы, позволяющие приложениям пользоваться услугами друг друга, и «бандлы» — директории, выглядящие как файлы для пользователя и содержащие приложение со всеми зависимостями, которое достаточно просто скопировать на жесткий диск для установки. Всё это знают и любят сегодняшие пользователи маков.

Как относятся в Apple к совместимости? Плохо. Первую революцию они сделали в 2001 году с выходом Mac OS X: старые приложения теперь могли запускаться только в приложенной виртуальной машине, эмулирующей Mac OS 9 (при этом, естественно, выглядели неприглядно и медленно работали). В 2005 году эмулятор почил с выходом OS X 10.4 (итого: 4 года на портирование старых приложений).

Для портирования людям был дан Carbon — C API, почти повторяющее API старой Mac OS 9. Carbon-приложения всегда оставались нежеланными гостями на компьютере: look’n’feel интерфейса OS X, как истинно объектно-ориентированной ОС, реализован в коде Cocoa (да, там можно изменить поведение стандартных элементов управления, просто унаследовавшись от них). Carbon представлял собой еще одну реализацию примерно того же самого интерфейса.

Вторую революцию Apple сделала в 2007 году: Carbon объявлен устаревшим и не будет поддерживать 64-битные приложения. Кадр года: Adobe переписывает Photoshop на Objective C. Называется, а вам слабо такое устроить?

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

Вернемся к Nextstep и заметим, что Cocoa является примером архитектуры, которая работает настолько хорошо, что её не нужно менять. Совместимость — не препятствие, так что эксперимент довольно чистый.

Зато NeXT/Apple серьезно относятся к преемственности навыков пользователя. Метафора пользовательского интерфейса Nextstep/OS X не меняется уже 20 лет. Внешний вид окон OS X не меняется 8 лет. Интерфейс приложений развивается эволюционно; Photoshop переписали, но выглядит и работает он так же; вышла новая версия iWork, но она только местами отличается от старой.

Что происходило всё это время в параллельном мире? 1989 год — релиз Nextstep 1.0 — вышла Windows 2.0 без перекрывающихся окон. 1995 год — вышла Windows 95, прощай, все старые навыки. 2001 год — вышла Window XP, теперь вы не узнаете свою панель управления. 2002 год — Microsoft выпускает .NET Framework 1.0, Desktop-приложения на котором до сих пор никто не пишет. Кстати, писать Desktop-приложения вообще не на чем: MFC — поганое уродство, всё остальное до жути низкоуровневое (Win32 API отличается от Cocoa как ассемблер от Питона).

2007 год — вышла Windows Vista, прощайте, привычки, теперь всё в новом месте. Зато спиздили еще чуть-чуть гуйни мака, сделали мигающий экраном костыль для безопасности приложений (на маке privilege elevation в приложениях к этому моменту уже много лет как нормально ненавязчиво работало). Вышел Office 2007, его нужно изучать заново. 2009 год — Microsoft в Windows 7 меняет Taskbar на Dock и хвалится этим достижением в блоге. Кстати, Office 2007 Ribbon Bar будет доступна всем приложениям, теперь вам придется заново изучать не только офис.

Зато вы всё еще можете запускать DOS-приложения на Windows Vista. Реймонд Чен в своём блоге высоко воспевает культуру совместимости в Microsoft. Но стоит ли она выпуска инвалидских продуктов? Всё дело в крупно-корпоративном рынке, которому его старые приложения ценнее качества ОС. Возможно, во времена Windows 95 совместимость была необходима и для пользователей: графические интерфейсы стали массовыми именно после Windows 95, и имей она проблемы, этого могло просто не произойти.

Мораль раз: знайте, когда устранять совместимость, иначе она помешает конечному пользователю.

Мораль два: нет так быстро всё меняется в ай-ти; команды под руководством великих людей создают технологии, живущие десятилетиями.

Мораль три: культура качества — ценнейшая штука для любой платформы; без неё корпорации не способны выпускать хорошие продукты, даже если на рынке есть образцы для подражания.

February 03, 2009

NSCoderNight(Nsk)

Если вы живете в Академгородке Новосибирска и интересуетесь программированием под мак (или вы интересуетесь теми, кто интересуется программированием под мак), присоединяйтесь к хакатону NSCoder Night по вторникам в 19:00 в кофейне на ВЦ.

Требуется: прийти и кодить под мак или iPhone. Кодить что-то своё, или найти на месте близких по духу товарищей и кодить с ними. Если нет мака, но есть желание научиться, предложите кому-нибудь парное программирование. И, разумеется, рядом будут люди, у которых всегда можно спросить совета.

Зачинщик события в Новосибирске — сооснователь нашей компании Михаил Калугин. Я буду тоже. О других местах, где проводится NSCoder Night, читайте на nscodernight.com.

Наконец, посты про NSCoder Night(Nsk) просьба помечать тегом nscodernsk, чтобы их можно было найти в блогосфере.