Эта история о том, как небольшая команда молодых разработчиков в условиях высокой рабочей загрузки загорелась идеей одного праздничного сервиса и отважилась взяться за его реализацию. И, как оказалось, не смотря на многочисленные препятствия, всё же дошла до поставленной цели, не сойдя с дистанции.
За продолжением милости просим под кат:
Начнем с конца или Что у нас в итоге получилось
А получился у нас RandomGifter – простой, но, как нам кажется, приятный (тёплый ламповый) и дружелюбный сервис для людей, обеспокоенных задачей коллективного празднования и «подаркодарения». Задача эта, порой, отнюдь нелегка, особенно, если речь идет о совместном отмечании в большой компании какого-либо мероприятия, хотя бы и актуального в скором времени Нового Года. Ведь нужно определиться: кто, кому и что дарит. И чем больше людей вовлечено – тем сложнее становится процесс, и, зачастую, либо всё разгребает один инициативный человек, на плечи которого и ложится миссия «реши-ка ты за нас», либо всё пускается на самотек. А если в компании нет ярко выраженного культорга, либо он устал каждый раз отдуваться за всех, то речь с большущей долей вероятности идет именно о втором варианте. Именно эту проблему и был призван решить сервис, который мы разработали.
В данной статье нам бы хотелось немного рассказать о самом проекте, а так же о том коротком, но интересном пути, который он нам подарил. И поделиться, может быть, не слишком оригинальными и мудреными, но, всё же, выводами, основанными на теперь уже собственном, кровном опыте.
Вкратце о сути сервиса
Если вкратце, то упрощенный workflow выглядит так:
- Создаем событие;
- Приглашаем участниковдрузей;
- Каждый из участников выбирает желаемый подарокподарки, либо оставляет выбор за дарящим;
- Убедившись, что все участники определились с подарками (соответствующий статус напротив участника) запускаем розыгрыш;
- Сервис случайным образом разыгрывает пары дарящий->получатель, а так же сам подарок для получателя (в случае, если было определено несколько возможных вариантов). Таким образом, в результате розыгрыша каждый участник знает, что и кому он дарит, но, разумеется, не знает, кто станет его тайным Сантой. А в случае с несколькими вариантами подарков ещё и не знает, какой именно ему достанется;
Организуй свое событие
Как показывает практика, большие компании людей крайне неповоротливы. Перестань прокрастинировать и возьми же, наконец, инициативу в свои руки! Создай событие, пригласи друзей и тогда всё завертится!
Выбирай подарки
Как часто ты точно знаешь, что именно хочешь получить в качестве подарка, но стесняешься об этом сказать? Так вот, теперь не придется полагаться на хорошую интуицию твоих друзей! Ведь у нас каждый из участников может выбирать возможные варианты подарков для себя, как, впрочем, и предоставить полную свободу выбора дарящему. А уж если таких вариантов несколько – мы сохраним интригу и ты до последнего не узнаешь, какой же из них тебя ждет — праздничная атмосфера сюрприза спасена!
Становись тайным Сантой
Запускай розыгрыш и узнавай, для кого же ты станешь тайным Сантой и что именно принесешь ему в своем мешке. Постойте, а кто же будет моим Сантой? А вот это, дружище, мы тебе не расскажем, жди, теряйся в догадках и предвкушении! Прямо как в детстве, правда?
*Для особо любознательных: нет, разумеется, дары и волхвы разыгрываются не случайным образом, у нас для этого трудится целый отдел специально обученных эльфов.
Как всё начиналось
Был один из тех дней, когда у меня всё получалось: и на работе, и в отношениях, и в бытовых делах, настроение было великолепное. В такие редкие дни, скорее всего, от переизбытка эмоций мне очень сложно заснуть, рой мыслей приводит
*Тут следует пояснить, что мы уже достаточно давно небольшой командой (3 человека) пытаемся в свободное от работысемейного быта у меня и работыучебы у них делать один интересный проект, который на данный момент немного застопорился.
И закрутилось: в ту же ночь у нас состоялась дискуссия, в рамках которой, мы всё же решились взяться в непростых (особенно для ребят) условиях за проект, установив при этом жесткий deadline, а на следующий же день я уже представлял функциональный дизайн и базовую ORM.
Итак, имеем следующие исходные данные:
- Учитывая то, что ближайшим праздником, на котором использование сервиса является актуальным, будет НГ (до католического рождества мы явно не успевали), поставили цель запуститься 25го декабря (чтобы оставался хоть какой-то временной запас до самого праздника);
- 2 человека из команды имеют частичную занятость + очень интенсивно готовятся к сессии
- 1 человек (ваш покорный слуга) имеет более, чем полную занятость (работаю в сфере ERP, клиенты все зарубежные, стремятся уйти на рождественские каникулы с чистым сердцем, без неразрешенных проблем);
- и вызов, который ставит ребром вопрос жизнеспособности нашей команды;
Процесс
Имели ли мы шанс на провал? Конечно же, притом очень высокий! Но, то ли, острота вызова, который выступал лакмусовой бумажкой нашей состоятельности, как команды, то ли праздничный настрой, то ли, соревновательный задор в перегонках со временем, а может, и всё в совокупности подстегнуло и смотивировало нас на работу. И мы работали, пусть понемногу, когда выпадало время, зато стабильно.
Обязанности распределились следующим образом:
- Саша (tonkonozhenko) возглавил разработку;
- Лёша(abodnia) помогал Саше с разработкой, и мне с контентом;
- Я же(MSirenko), в диковинку для себя, занимался функциональным дизайном, тестированием, контентом;
- Очаровательная девушка, отличный человек и дизайнер Юлия (biarritz) помогла визуализировать и воплотить мои идеи относительно логотипа и баннера;
Не используя осознанно никакую конкретную методологию, мы подсознательно пришли к итеративному подходу, это работало для нас.
Некоторые технические детали
В этой части статьи Саша(tonkonozhenko) поделится несколькими техническими подробностями нашей реализации.
Времени было совсем в обрез и, учитывая то, что я был неплохо знаком с Ruby on Rails, проект решили делать на рельсах. Не обошлись и без использования пары полезных гемов:
- inherited_resources — упрощает создание CRUD;
- active_admin — для простейшей админки чтобы было видно какую-то статистику;
- devise — удобная авторизация
Лишь благодаря этому мы успели в сжатые сроки.
Для БД использовался Postgres, а для мониторинга того, что будет после публикации: newrelic_rpm и google analytics.
Дальнейшие планы
Дабы не переутомлять читателя деталями просто обмолвимся, что эти планы у нас есть, достаточно много новых возможностей уже запланировано. Если же лично вам не хватает какой-то конкретной интересной и удобной фишки – с радостью прочтем об этом в комментариях или у нас на почте(RandomGifter@gmail.com).
В качестве заключения (здоровая порция самокритики и выводы)
Разумеется, едва ли, хоть кто-то, открыв для себя RandomGifter, воскликнет: «И как же я раньше без этого жил!». Едва ли, в плане популярности проект постигнет участь некоторых «пузырьковых» сервисов, ведь в нём, например, нельзя выкладывать фотографии еды или чекиниться в офисе и объявлять себя его мэром. А уж о деньгах мы лучше и вовсе промолчим. Но, как бы там ни было, мы упорно считаем его реализацию – success story. И вот почему:
- Минуя фазу «раскачки» мы практически моментально перешли от обсуждения идеи к её реализации. Achievement unlocked: «Getting Things Done»;
- Наша молодая, компактная команда прошла проверку на прочность, притерлась и сработалась. Появилась уверенность в том, что мы можем довести дело до конца и уже не так страшно браться за более серьезные проекты. Achievement unlocked: «Team Spirit»;
- Мы чётко вписались в ранее оговоренный deadline. Achievements unlocked: «Estimate Masters», “Deadline slayers”;
- Основная работа + учеба (у некоторых из нас) не пострадали, нам удалось всё совместить. Achievement unlocked: «Multitasking»;
- Следуя наставлениям 37 Signals, мы делали меньше и в результате сделали не перегруженный фичами сервис, который при этом честно выполняет свою работу и, которым, лично нам, пользоваться приятно. А уж если он будет реально полезен мало-мальски значимому количеству людей — это сделает нас совершенно счастливыми! Achievement unlocked: «Build less»;
Таким образом, на данном этапе мы добились того, к чему стремились и получили хорошую порцию мотивации как для последующего развития проекта, так и для реализации новых.
Что касается выводов, то их, главным образом, два:
- Если уж загорелись идеей, постарайтесь приступить к её реализации в ближайшее время, иначе высока вероятность «потухнуть». К сожалению, это, всё же, не гарантирует победы, в случае, если вы ринетесь в бой с открытым забралом. Хорошенько всё взвесьте и продумайте;
- Даже очень занятые люди могут найти время на реализацию собственных сторонних идей и проектов. Конечно, это требует достаточно высокого уровня самодисциплины и сурового time management'a. При этом даже маленькая команда, без выделенного PMа способна внутри себя коллективно исполнять его функции: каждый член команды выступает и контролером общего прогресса и мотиватором. Эдакая круговая порука, не позволяющая расслабится и опустить руки. Разумеется, всё это относится лишь к тому случаю, когда внутри команды есть определенная «алхимия», и такие проекты, как наш, как раз позволяют проверить её наличие. Нам, как оказалось, в этом плане повезло!
P.S. Конечно же, с наступающими!
Автор: MSirenko