Фичи за деньги и плохие фиксы

Как я две недели назад починил одну проблему и создал другую гораздо хуже, и за какие новые фичи мне предложили 500 долларов.

Фичи за деньги и плохие фиксы

(про коктейль Jack Rose с кальвадосом писал еще в начале пандемии в Инстаграме)

Закрой баг, получи два в подарок

В прошлом посте я писал, что починил старый баг с сохранением данных в "облако" и что фикс уже доступен на Бета канале. Однако сегодня мне пришло развернутое письмо от пользователя Lewis, в котором он сразу сознается, что использует Бету, но новые коктейли не сохраняются:

Each time I would write it up and save it and it would show in the list, but when I close the app, or move away from the app and then come back to it, the new cocktail has disappeared and I have to remake it again (which also fails).
Interestingly, any of my own cocktails that I have added in the past still remain but if I edit those, the changes aren't saved either.

Любопытно, подумал я. Такого еще не было. Коктейли как бы видно после сохранения, но они исчезают после перезагрузки приложения. И похоже, автор сам разработчик, и далее в письме рискнул предположить, что я чего-то там не вызвал в onStop() или onDestroy(), что сохраняет данные в базу. Хехе, ну почти. Не вызвал, да. Только не в Activity методах, а в методе изменения коктейля своего класса CookBook, ответственного за хранение всей модели рецептов и ингредиентов. Вот, собственно, метод, который я неудачно зарефакторил две недели назад:

  public Recipe addOrEditRecipe(Recipe.Builder recipeBuilder) {
    Recipe recipe;
    Change change;
    synchronized (this) {
      if (recipeBuilder.id == null) {
        recipeBuilder.setId(
            IdUtils.newUniqueIdFromLabel(recipeBuilder.label, recipesById::containsKey));
      }
      recipe = recipeBuilder.build();
      change = recipesById.containsKey(recipe.getId()) ? Change.EDIT : Change.ADD;
      recipesById.put(recipe.getId(), recipe);
      rebuildAllRecipesWith();
    }
    // Call external methods outside of synchronized block to avoid deadlocks.
    Logging.v(TAG, "Recipe " + change.name() + ": " + recipe);
    // notifyAllRecipeChange(recipe, change);
    return recipe;
  }

Последний закомментированный вызов как раз оповещает всех, кому интересно (например, контроллер, который все сохраняет в БД) об изменениях в "книге рецептов". Естественно, в интерфейсе все работало, но при перезагрузке исчезало. Поэтому мои Андроид тесты ничего не поймали, все работало как надо. А юнит-тесты CookBook этот функционал удачно упустили.

Зачем нужна Бета

Вот именно за этим! В Бете у меня примерно 1000 человек, и если что-то идет не так, то может быть, повезет и мне напишут письмо. Так и случилось. Кстати, несколько дней назад мне уже писали о той же проблеме, но я не воспринял письмо всерьез, хотя симптом "сохраненный коктейль удаляется после перезахода" там был описан, просто очень коротко. Я попросил более детальное описание и забыл, а стоило просто попробовать сохранить любой новый рецепт и перезагрузить приложение, чтобы увидеть баг.

500 долларов за фичу

Неделю назад мне написал пользователь и спросил две вещи: можно ли как-то импортировать большую коллекцию коктейлей? И можно ли добавить новую категорию "Tiki"? У него уже был собственный список рецептов Тики, и хотелось избежать ручного ввода. Я ответил, что да, хочу добавить импорт из какого-нибудь "человекочитаемого формата", описать этот формат (задокументировать!) и выложить в свободный доступ. Вообще это хорошая идея, вдруг кому-то действительно будет полезно, может, люди начнут выкладывать свои "паки" коктейлей. Может, можно будет сконвертировать thecocktaildb.com (если они будут не против) или другие крупные сайты. Может, сделать страницу с пользовательскими "паками", с добавлением к себе в приложение по одному клику. Добавить возможность создания коктейль-паков, рейтинги, описания. Может даже, продавать тематические паки - рождественские, зимние, летние, пляжные (как это делает Cocktail Flow). Ох, Остапа несло!

А про новые категории - я давно думаю сделать фичу добавлять свои "теги" и тегировать ингредиенты/рецепты, с фильтром по тегам, если нужно. Теги можно красиво показывать как лейблы писем в GMail, например.

Ответил я в итоге, что все хочу сделать, только не могу сказать, когда реально дойдут руки. И сегодня он написал, что готов заплатить мне за эти две фичи 500 долларов! Уже бывало, что люди абстрактно писали, что готовы приплатить за фичи, но чтобы так конкретно - никогда. Чаще всего пишут в отзывах на Google Play Store что-то в духе "Вот добавьте такую-то супер сложную и никому не нужную штуку, тогда поставлю 5 звезд, а пока на держи три!" От таких отзывов у меня начинает нервно дергаться щека...

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

Cheers!

Loading comments...