суббота, 15 октября 2011 г.

Продвижение приложения для Android. Ну и как это делать?

В предыдущем посте я писал о своём первом приложении для Android. Что я хочу почерпнуть для себя из этого начинания? Во-первых, мне интересно посмотреть на новую для себя платформу, почувствовать её на реальном полезном и мне, и другим приложении. Во-вторых, разработка - это ещё только половина дела. Мало написать приложение, нужно чтобы о нём узнали потенциальные пользователи: чтобы что-то шло по рельсам, эти рельсы вначале нужно проложить. И этот аспект мне не менее интересен. О нём в этом посте и расскажу.

Итак, исходные данные: и платная, и бесплатная версии выложены в Android Market в раздел Инструменты. Как "обнадёживает" статистика Google, пользователи из России - это лишь 1.5% всех установок из этого раздела. С них и решил начать :-)

О счастье

По итогам первого дня бесплатная версия была установлена 24 счастливчиками. Тут требуется пояснение. Дело в том, что найти новое приложение через Android Market можно только по прямому названию. Поиск по казалось бы связанным с приложением ключевым словам часто приводит к сильно нерелевантным результатам поисковой выборки. Раньше только что добавленные приложения можно было увидеть в специальном разделе, но в новой версии Маркета этот раздел был резонно убран: новые приложения добавляются с быстротой, часто достойной применения в каких-нибудь других программных проектах, поэтому подкараулить в этом списке новое хорошее приложение дело большой удачи. Поздравляю, всех установивших в первый день!

О группах в соцсетях

Во второй вечер я решил проверить отклик от соцсетей. Нашёл несколько групп ВКонтакте, посвящённых операционной системе Android и программному обеспечению для неё. Причём выбирал группы с большим (несколько тысяч) числом участников и с активными обсуждениями на стене. В этих группах поместил на стене сообщение, которое на мой взгляд должно было бы заинтересовать потенциальных пользователей. Получившийся результат показал, что с соцсетями много не навзаимодействуешь, ведь результат - плюс две (!) установки.

Об обзорах на известном ресурсе

Уже к концу первого дня в Маркет стало ясно, что приложение можно донести до пользователей только напрямую рассказав о нём как можно более широкой аудитории. Поэтому сел и не торопять за день написал обзор на 4pda. После публикации день был занят обсуждением обзора в комментариях. Причём как я понял, приложения такого рода вызывают совершенно противоположные чувства у читающих. Я старался отвечать максимально нейтрально, вежливо и чётко, хотя иногда хотелось послать куда подальше комментаторов, которые минуя меня, обсуждали нечто относящееся к делу настолько удалённо, что связь была малозаметна. Часть комментирующих кажется вообще не умеет читать предыдущих комментариев. Но это уже, как говорится, их проблемы.

Через день после обзора у меня было 334 пользователя бесплатной версии и 12 человек, купивших платную.

Есть ещё один момент остающийся для меня загадкой. Странно, что люди не стремятся описать проблему, тем более, что в программе есть пункт меню "Обратная связь". Им интереснее отвести душу в отзывах, чем разрешить возникшую проблему? Но это кажется опять из области психологии.

Результаты и выводы

  • Обязательно просите своих пользователей писать отзыв и ставить рейтинг, если ваше приложение им нравится, потому что обязательно найдутся те, кто не разобрался/не настроил/с кривыми руками. А уж они-то отрицательный отзыв вам напишут обязательно. Причём никаких пояснений указано не будет. Просто будет написано "Не работает" и всё тут.

  • Добавьте в своё приложение функцию обратной связи на видное место. Потому что, повторюсь, пользователи в комментариях не описывают проблему. Обратная связь - ваш единственный шанс выспросить у них всё.

  • Первый серьёзный скачок в установках - по сути является публичным beta-тестированием. Причём условия действительно боевые. В этот момент постарайтесь максимально оперативно выпустить обновление, ведь в случае промедления, вы расплачиваетесь низкими оценками (потому что, не устаю повторять, в первую очередь будут писать отзывы те, у кого есть проблемы).

суббота, 24 сентября 2011 г.

Первый опыт программирования под Android

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

Самым сложным в разработке было придумать название, но с этим удалось справиться. ;-) Остановился на Handy Locator. Мало того, это был еще и первый опыт программирования на Java. Первое время я конечно же пытался программировать на Java как на C++,  что мне очень не нравилось. Но через пару недель втянулся, разобрался с языком, платформенным API и Eclipse. Короче говоря, понравились мне и процесс, и результат.

Продолжение обязательно последует!


Available in Android Market

среда, 17 марта 2010 г.

Задачи на собеседовании. Входной тест

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

Задание 1

// Скомпилируется ли данный код? Если да, то что будет выведено на экран?

class String
{
public:
  String(char* str)
    : data_(NULL),
      len_(strlen(str))
  {
    data_ = new char(len_ + 1);
    strcpy(data_, str)
  }

  ~String()
  {
    delete[] data_;
  }

  char* data() const
  {
    return data_;
  }

private:
  char* data_;
  int len_;
};

void print(String s)
{
  std::cout << s.data() << std::endl;
}

int main()
{
  String s1("s1");
  String s2 = s1;
  String s3(s1);

  print(s1);
  print(s2);
  print(s3);

  return 0;
}
Кандидату плюс, если он скажет, что умолчательный копирующий конструктор в С++ выполняет memberwise копирование, в отличие от bitwise в C. Как правило все понимают, что при копировании объектов буфер окажется общим, и возникнет непредсказуемое поведение при удалении. Только не все замечают, что функция print принимает объект класса String по значению, а следовательно проблема возникнет раньше выхода из main.

Задание 2

// Что будет выведено в результате работы программы?

class A
{
public:
  virtual void print() const
  {
    std::cout << "A";
  }
};

class B : public A
{
public:
  virtual void print() const
  {
    std::cout << "B";
  }
};

void print(A a)
{
  a.print();
}

int main()
{
  A a;
  B b;

  print(a);
  print(b);

  return 0;
}

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


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


Задание 3

// Описать работу данного кода

template <int N>
class print
{
public:
  print()
  {
    std::cout << N << std::endl;
    print<N-1>();
  }
};

template <>
class print<1>
{
public:
  print()
  {
    std::cout << "1" << std::endl;
  }
};

int main()
{
  print<12> p;

  return 0;
}

Задание 4

// Описать работу данного кода

template<bool>
struct static_assert;

template<>
struct static_assert<true>
{
};

template<typename T>
void func(T)
{
  static_assert<false>();
}

template<>
void func(int)
{
  std::cout << "func(int)" << std::endl;
}

template<>
void func(double)
{
  std::cout << "func(double)" << std::endl;
}

int main()
{
  func(1.0);
  funс(500);
  func("b");

  return 0;
}

среда, 17 сентября 2008 г.

Pure virtual destructor

Как-то ускользнул от меня раньше этот момент. Оказывается, деструктор тоже может быть чисто виртуальным. В стандарте про это всего лишь строчка [12.4.7]. Похоже, сделано это, чтобы иметь возможность запретить инстанциирование в случае, когда в классе вообще отсутствуют виртуальные функции. В общем-то тоже самое, что и в случае чисто виртуальных функций, только у чисто виртуальных функций определение опционально, а у чисто виртуального деструктора оно обязательно.
Итак имеется базовый класс без виртуальных функций. Полиморфное использование отпадает. Чего тогда с этим делать? Единственное пришедшее в голову неэкзотическое применение - при создании классов, предназначенных для использования в качестве базовых при наследовании реализации (private-наследовании). Слишком накручено? Или у меня сегодня плохо с фантазией?

суббота, 28 июня 2008 г.

Метко

Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the Universe trying to produce bigger and better idiots. So far, the Universe is winning.
Rick Cook, The Wizardry Compiled

Сегодняшняя цитата с Quotations page :-))

воскресенье, 8 июня 2008 г.

Пять инструментов. Ну, или почти 5

Ну что же, начинаю разгоняться на своём этапе эстафеты, схватив палочку, переданную мне Юрием Волковым.
  1. Не то, чтобы инструмент, но запускаю каждый день точно. Уже больше года в качестве основной операционки дома использую Ubuntu. Из других дистрибутивов смотрел Fedora и OpenSUSE, но что-то не понравилось. Хотя может быть стаботал эффект первого положительного впечатления. Единственное, что не очень нравится - качество Upgrage на новую версию. После обновления на 7.10 отвалилась сеть - было не очень приятно. Обновление на 8.04 тоже прошло не слишком гладко (всё ещё есть вещи не работающие как надо). Но при всём при этом, работая в Linux, чувствую себя гораздо свободнее, чем в Windows (операционка на работе и вторая операционка дома).
  2. На втором месте ожидаемо находится Firefox. Конечно же вместе со своими расширениями: Adblock Plus, Fire Gestures, Faviconize Tab, del.icio.us Bookmarks, Foxmarks, Secure Login, Permit Cookies, Uppity и ещё десятком других. Очень жду работы del.icio.us Bookmarks с Firefox 3 - жутко удобное средство. Без него даже не знаю, как бы я управлял своими более чем 400 закладками.
  3. Теперь средства разработки. Конечно же Visual Studio. Но обязательно в связке с Visual Assist.
    Перед написанием поста прикинул, какие инструменты хочу поместить в этот список из пяти вещей и понял, что не умещаюсь. Решил схитрить и указать в этом пункте ещё и замечательнейшее средство Visual Paradigm for UML - лучшая вещь для построения UML-диаграмм. Всё делается буквально в пару кликов мыши - минимальный путь между мыслью в голове и её реализацией на экране.
  4. Слушаю музыку почти всегда. Даже не знаю, есть что-нибудь лучше чем Amarok.
  5. FreeMind - кроссплатформенный инструмент для создания mind maps. Текущая стабильная версия - 0.8.1. Но очень советую использовать бету 0.9.0, обладающую заметно большей функциональностью. Важным преимуществом для меня является то, что практически все основные действия можно выполнять без использования мыши вообще.
Кончились у меня все пункты списка, но очень хочется упомянуть Emacs, имеющий все шансы попасть через некоторое время в описываемый перечень. Всего месяц назад я попробовал первый раз в нём работать - потрясающий расширяемый инструмент. Пускай идёт вне конкурса ;-)

Если кто из нижеперечисленных тут бывает, то с радостью передам эстафету дальше:

четверг, 5 июня 2008 г.

IBM Linux: The Kid

Очень стильный ролик. Причём достаточно старый. Странно, что раньше не попался