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

Мне становится все более ясно, что церемониться с такими вещами контрпродуктивно. Выполнение асинхронных голосований, безусловно, является накладными расходами, которые я хотел бы автоматизировать, но давайте посмотрим, не хотим ли мы вернуться к стартовой/ретро-встрече. Я заметил, что студенты Армандо Фокса проголосовали за возврат к лекционному формату, но это уводит меня от главного: если у вашего партнера по паре или коллеги что-то заработало, не время говорить вы должны были дождаться голосования, чтобы завершить или сделать любые подобные возражения. Есть много замечательных эвристик вроде не работать над вопросами, по которым не было проведено голосование, но это предложение, а не закон, который нужно соблюдать. Эффективная работа заключается не в том, чтобы заставить всех принять ваши последние взгляды на то, как все должно быть сделано, а в том, чтобы принять то, как они работают, и найти совместный путь.

Я думаю, что некоторым людям сойдет с рук фраза «Это мой путь или шоссе», но это не очень весело, и чего я действительно не хочу, так это случайно пойти по этому пути. Так или иначе, у меня в голове накопилось большое количество тикетов, которые я также поместил в список задач:

Итак, Майкл удалил cubeportfolio.js/confy.js до того, как осела пыль. Мы могли бы заняться другими вопросами, связанными с обновлением поставщика JavaScript, такими как удаление зависимости от Bower или попытка модульности других библиотек, но мне не терпелось внести некоторые другие изменения. Я закрыл наш существующий билет на исследование памяти и заменил его двумя новыми — один для общего исследования, а другой — для удаления тяжеловесного драгоценного камня. Также возникла проблема с документацией по установке.

Две другие вещи, о которых я думал, — это улучшение нашей телеметрии видеовстречи и профиль нашего премиум-плана. Первое может помочь нам лучше понять, как будут проходить парные сеансы при следующем запуске МООК, а второе может улучшить наш баланс. Когда мы провели расследование, оказалось, что у нас не было билетов на некоторые из вещей, которые мы с Майклом регулярно обсуждали, в частности, на то, чтобы дать членам Karma кредит за участие в тусовках, а не только их начало. Я думал, что это потребует рефакторинга способа представления данных о видеовстречах, что также будет частью улучшения нашей телеметрии (для которой у нас также не было явного тикета). На самом деле тикет, который у нас был, был направлен на улучшение отслеживания личности участника видеовстречи.

Чтобы объяснить, из нашего плагина видеовстречи мы получаем идентификатор G+ участников видеовстречи. Те участники AgileVenture, которые прошли аутентификацию с помощью G+ на нашем сайте, имеют идентификатор G+, связанный с их учетной записью. Для этих участников мы можем связать их присутствие в видеовстрече с их учетной записью AV. Это позволяет отображать больше информации о том, кто был в видеовстрече, в просмотре прошлых событий. Чтобы побудить людей связываться со своими учетными записями G+, мы уже увеличили количество Кармы, которое вы получаете за это соединение. Быстрая проверка производственной базы данных показала, что треть наших членов была подключена. Мы должны были проверить это число несколько месяцев назад, когда вносили изменение, чтобы дать нам подсказку, повлияло ли изменение. Дох!

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

  • [ ] Связь с G+ может улучшиться, если мы оценим участие в видеовстречах. #1290 может помочь здесь.
  • [ ] возможно, что более важно, нам нужно, чтобы больше людей знали о карме
  • [ ] привязка номера кармы к поломке на странице пользователя #1245
  • [ ] разбивка на странице пользователя скрыта в подвкладке
  • [ ] разбивка выглядит не очень красиво
  • [ ] нужно отправить участникам сообщение об их оценках кармы? слабый пинг их?
  • [ ] всплывающие подсказки для объяснения вещей

И я обнаружил, что делаю билеты, которые, как я думал, уже должны были существовать (я искал) по тем вещам, которые мы с Майклом много обсуждали.

А ещё Майкл начал рассуждать о дальнейшей геймификации Кармы, в которую я бы с удовольствием вник. Во всяком случае, небольшая игра с производственной БД показала, что на самом деле мы можем получить индикатор участия в тусовке без необходимости большого рефакторинга (хотя это может дать Avdi коронарную ошибку за его робость):

EventInstance.all.select {|i| !i.participants.nil? && i.participants.values.count > 1 && i.participants.values.any?{|p| p['person']['id'] == "103524399391704001670"}}.count

Класс EventInstance (или Hangout) в настоящее время хранит текстовую строку представления JSON, которая возвращается из HangoutPlugin, которая выглядит следующим образом:

{"0"=>
  {"id"=>"hangoutA749C12C_ephemeral.id.google.com^6285825550",
   "hasMicrophone"=>"false",
   "hasCamera"=>"false",
   "hasAppEnabled"=>"false",
   "isBroadcaster"=>"false",
   "isInBroadcast"=>"true",
   "displayIndex"=>"0",
   "person"=>
    {"id"=>"108104108523167071445",
     "displayName"=>"Michael C",
     "image"=>{"url"=>"https://lh5.googleusercontent.com/-AtamIgns520/AAAAAAAAAAI/AAAAAAAAAAA/4TTnoJlntEM/s96-c/photo.jpg"},
     "qa"=>"false"},
   "locale"=>"en",
   "qa"=>"false"},
 "1"=>
  {"id"=>"hangoutEDC38696_ephemeral.id.google.com^4f0e2ab2d8",
   "hasMicrophone"=>"true",
   "hasCamera"=>"true",
   "hasAppEnabled"=>"true",
   "isBroadcaster"=>"true",
   "isInBroadcast"=>"true",
   "displayIndex"=>"1",
   "person"=>
    {"id"=>"103524399391704001670",
     "displayName"=>"Sam Joseph",
     "image"=>{"url"=>"https://lh3.googleusercontent.com/-Kt12k8aqqTs/AAAAAAAAAAI/AAAAAAAAAAA/TL0ZFPtM2Tc/s96-c/photo.jpg"},
     "qa"=>"false"},
   "locale"=>"en",
   "qa"=>"false"}}

Он сохраняется с использованием метода сериализации, поэтому мы возвращаем объект Ruby, который позволяет приведенному выше коду работать, не требуя шага синтаксического анализа. По сути, у нас есть база данных micro noSQL внутри нашей большей реляционной базы данных SQL. Вычисление по всему набору данных для отдельного человека не особенно быстрое, но оно не занимает больше секунды, и, поскольку мы в основном вычисляем карму в автономном режиме, кажется, что мы могли бы запустить это в производство относительно быстро.

Логика здесь заключается в том, что мы хотим поощрять участие в видеовстречах, отдавая за это Кармический кредит, и, в частности, вам нужно будет получить G+ на нашем сайте, чтобы получить выгоду, поэтому потенциально счастливым побочным эффектом является увеличение в точности нашего отслеживания и улучшении результатов нашего интеллектуального анализа данных. Будем надеяться, что весь этот благотворный круг просто поможет нам помочь всем, помочь благотворительным организациям и, конечно же, в конечном итоге спасти мир, ха-ха. В любом случае, до тех пор, пока мы будем играть с крутыми технологиями по пути, а? :-)

Так что я все еще был в раздумьях, что делать, когда Майкл указал, что наш обзор Кармы рассчитывает все это прямо в реальном времени и может замедлить загрузку страницы профиля пользователя. Мы говорили о кэшировании этого в таблице User. Я чувствовал себя плохо из-за того, насколько раздута эта таблица, и из-за технической задолженности, которую мы накапливали, что подтолкнуло меня к желанию работать над Premium и вытащить компоненты Stripe из пользовательской таблицы; но потом у меня был прорыв. Мы могли бы вынести компоненты кармы в отдельную таблицу, кэшировать их все, сократить время загрузки страницы профиля, а также быстро доставить желаемые поощрения. Я мог бы сказать, что Майкл хотел бы, чтобы я смог прийти к такому выводу без предыдущих 45 минут обсуждения, но я все еще был доволен созданными нами билетами и идеями, которые у нас были.

За оставшиеся 45 минут или около того нам удалось провести быстрое приемочное тестирование и создать отдельную таблицу Karma. Это также включало использование необычного шаблона делегирования:

class User < ActiveRecord::Base
  extend Forwardable
  def_delegator :karma, :hangouts_attended_with_more_than_one_participant=
  def_delegator :karma, :hangouts_attended_with_more_than_one_participant
  has_one :karma
  ...
end

Я уверен, что есть более жесткий способ сделать это, но он разбивает нашу гигантскую таблицу пользователей, и теперь мы можем написать отдельный тест для быстрого расчета участия в видеовстречах в автономном режиме, а затем перейти к более крупному рефакторингу, чтобы увидеть подробности о том, когда люди присоединиться к видеовстречам, еще больше разбить таблицу пользователей с улучшенной поддержкой Premium и улучшить документацию по установке. Это ключевые вещи для меня в ближайшие несколько недель, хотя они, безусловно, могут быть сорваны, если проблемы с памятью окажутся более серьезными, чем мы думали. Остается вопрос, нельзя ли двигаться быстрее? Одна проблема — я провожу все это время со своими детьми. Может быть, я смогу заставить их кодировать и для AV? :-)

ПОХОЖИЕ ВИДЕО:

Первоначально опубликовано по адресу: http://nonprofits.agileventures.org/2016/09/22/cant-we-go-any-faster/