Pintask — программируемый таск-трекер

в 8:20, , рубрики: я пиарюсь

Салют!

По статистике, новый таск-трекер появляется раз в 2 недели. «Но мой умеет варить капучино!» — скажет вам разработчик. — «А другие трекеры делают чай такого же качества, как у проводницы поезда „Москва-Геленджик“, либо заваривают только Копи Лювак». Значит, если бы можно было перепилить краник, чтобы из него лилось капучино, вы бы не стали писать новый таск-трекер? «Ну конечно! Просто капучино — мой любимый напиток»…

О том, что общего между кофеварками и Оптимусом Праймом, зачем нам программируемый таск-трекер и как перепиливать краник — читайте под катом.

image В далеком 1969-м ситуация с микросхемами выглядела примерно так же, как текущая ситуация с трекерами. Хочешь выпустить калькулятор? Напечатай свою микросхему. Хочешь выпустить калькулятор с функцией умножения на 1000 (для бразильских бухгалтеров)? Напечатай еще одну микросхему. Именно этой логикой руководствовались японцы, заказавшие Intel аж 12 микросхем для своих калькуляторов. Штатная рок-звезда компании, Тед Хофф, окинул опытным взглядом чертежи и предложил рефакторинг. Затем, как и полагается рок-звезде, он скипнул сам процесс, поручив реализацию идеи Федерико Фаггину. Менеджмент благополучно забил на проект, так как в тот момент люто-бешено развивалось совсем другое направление, и заработать на Бентли можно было именно там. Это сильно ускорило разработку, и уже в 1971-м программеры электротехники закончили тесты и выкатили на продакшн запустили в серию. Intel с фанфарами выполнила заказ японцев и под шумок открыла новое направление бизнеса. Через несколько лет рынок микропроцессоров внезапно стал настолько прибыльным, что на Бентли зарабатывали уже там.

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

Немного сантехники

ЕСЛИ ЧЕСТНО, появление микропроцессора было теоретически возможным уже в начале 1960-х, когда стали массово производиться интегральные микросхемы. Однако, любого юного электротехника на этом пути подстерегали технологические препятствия 80-го уровня. Федерико Фаггин знал о них не понаслышке. Но и докторская степень по физике досталась ему не в переходе московского метрополитена, а в Падуанском университете. Поэтому в 1968-м году Федерико создал первый полевой транзистор на кремниевой основе, который работал быстрее других, биполярных, да еще и занимал меньше места, стоил дешевле, экономил электроэнергию. Теперь можно было не выключать свет в туалете не беспокоиться об оптимальности микросхем: калькуляторы на микропроцессорах складывали и умножали быстрее своих предшественников просто потому, что работали на полевых транзисторах. Ну и ценник на них был ниже, что при закупке устройств на всю бразильскую бухгалтерию весьма и весьма ощутимо.

За оценкой ситуации обратимся к мировому эксперту по инновациям:
— Господин Форд, как вы считаете, будет ли микропроцессорная технология развиваться дальше, или производители биполярных транзисторов найдут способ повернуть время вспять?
— Я убежден, что инновации на более низком уровне способны изменить существующую отрасль. На мой взгляд, речь идет именно об этом.
— Большое спасибо за комментарий. А теперь к новостям из мира науки. Астрономы сообщают о необычном космическом фоне…

Pintask написан на Meteor. Этот фреймворк уже входит в число самых популярных репозиториев на Github в весовой категории JavaScript — и это еще до официального релиза (текущая версия: 0.8). Один только анонс на Hacker News собрал 1362 голоса. Выдержки из комментариев: «It's like the industrial revolution», «I can't upvote this enough» — ну, вы поняли. Даже скушав полпачки скептицина, можно смело утверждать, что Meteor открывает новую страницу в веб-разработке. Причем HTML-код на этой странице «живой»: получение новых данных от сервера приводит к автоматическому обновлению шаблона, вам не нужно следить за этим. Ах да, и забудьте про Ajax-запросы: изменение данных выполняется через полноценное MongoDB API на JavaScript, доступное прямо в браузере. В результате 90% вычислений выполняются на клиенте. Код на Meteor занимает меньше места имеет меньший объем, стоит дешевле пишется быстрее, экономит электроэнергию уменьшает объем передаваемых данных. Марти, ты опять играл с плутонием?

Давайте разберемся, что получается. Доступ к базе данных есть прямо в браузере, это раз. Шаблоны тоже в браузере, это два. Все работает на JS+HTML, это три. А что если дать пользователю возможность подключить свои скрипты? Ведь с их помощью можно и слушатели навесить, и шаблоны переопределить, и данные записать… и перепилить краник. И гайки закрутить. И термостат поставить.

Всем по капучино

Pintask — первый таск-трекер, написанный на Meteor. И первый таск-трекер, способный загружать ваши расширения прямо в браузере, предоставляя им полный доступ к API базы данных и шаблонам.

Вот пример одного такого расширения:

if !Cards
  throw "Hey, where are my Cards?"
if !Comments
  throw "Look, I need those Comments, too!"

Comments.after.insert (userId, comment) ->
  cardId = comment.cardId
  card = Cards.findOne(cardId)
  if userId not in card.memberIds
    Cards.update(cardId, {$addToSet: {memberIds: userId}})

За последнее время я пристрастился к CoffeeScript… не мейнстрим, конечно, но разработку ускоряет.

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

Хотите посмотреть на работу с шаблонами? Их есть у меня. Тут замешан jQuery, на первый взгляд код напоминает итальянское блюдо. Но если приступить к его поглощению с нижнего края, то вкус раскроется более гармонично, и тогда… «Официант, повторите!»

Отдельно стоит упомянуть о подключении внешних источников данных. Белая магия позволяет создавать задачи из строк Google Spreadsheet. А черная магия с привлечением потустороннего API дает возможность призывать Github Issues прямо в Pintask и устраивать сеанс двунаправленной связи между комментариями внутреннего и внешнего трекера. Все это происходит через коллекции MongoDB. По сути, такое расширение является отдельным приложением, загружающим данные в Pintask при помощи специального скрипта.

За барной стойкой

Кстати, подключить собственное расширение можно через тот же Github. В простейшем случае достаточно опубликовать репозиторий на Github Pages, взять прямую ссылку на js-файл и вставить в Pintask. Получается сухо и комфортно (и обновляется при поступлении коммита).
А если нужно подключить целое приложение со своим блэкджеком, то можно выложить на бесплатный хостинг от того же Meteor, и вставить ссылку на него.

Для пользователя все выглядит еще проще. Достаточно зайти в Магазин расширений, выбрать желаемое, нажать волшебную кнопку — и легким движением руки кофеварка превращается в Оптимуса Прайма.

Так как программисты — люди щедрые, то можно с уверенностью сказать: большинство приложений будут бесплатными. Но если жаба-таки задушит, или понадобится больше древесины (объемное файлохранилище, СМС-шлюз), то можно сделать пользователю приложение, от которого он не сможет отказаться. Мы сами так и зарабатываем.

Сверим часы

О! Вот и оно, платное приложение: Учет времени на автопилоте. Всем известно, как сложно программистам дается тайм-трекинг. Побродив по извилинам нашего разума, можно встретить подобный внутренний диалог:

— Эй, сознание! Давай-ка подумаем над интеграцией с Яндекс.Маркетом.
— Погоди-погоди… А кнопочку «старт» нажать не забыл?
— Ах, точно. Вот, нажал.
— Молодец. Так что ты там говорил о Bitcoin?
— Какой Bitcoin? Я говорил о Яндекс.Маркете.
— Ах, да… постой, а ты нажимал кнопочку «старт» у предыдущей задачи?
— Кажется, да. Или нет. Сейчас проверю.
— Давай проверяй. А я тут пасьянс разложу.

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

Техническая реализация использует стандартные механизмы Meteor и пакет user-status для мониторинга активности. Уже знакомые слушатели на коллекциях MongoDB позволяют определить отслеживаемую задачу. В коде не используются setTimeout (свят, свят), только события. В результате даже рестарт сервера не способен нарушить ход истории.

Хотите получать аккуратные отчеты? Заходите, не стесняйтесь.

На десерт

Сколько же стоит базовая платформа? Pintask полностью бесплатен. У нас нет ограничений функционала, нет рекламы, нет абонентской платы. Зато есть открытая вики, добросовестная поддержка и овечки на фоне.

Ну и последнее: Pintask стремится к тому, чтобы стать полной заменой Trello (англ. «drop-in replacement»). Все базовые функции заморского сервиса уже реализованы. Есть моментальный импорт из Trello. Мы также собираемся сделать двунаправленную синхронизацию, чтобы обеспечить доступ к Pintask через мобильные приложения Trello (до того, как сделаем собственные).

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

Финальная ссылка: Pintask, программируемый таск-трекер.

Статья опубликована мною по просьбе Дениса Горбачева (starfall), весь текст — полностью авторский.

Автор: shurup

Источник

Поделиться

* - обязательные к заполнению поля