Как мы написали фриланс-биржу для Telegram

a353bde2c9db4b959aacf8e7922fa40b.png

Добрый день, дорогие Хабравчане! Сегодня решил рассказать вам о нашем опыте создания бота для Telegram на Node.js практически без опыта серверной разработки и на добровольных началах. Сразу оговорюсь: у меня за спиной чуть больше четырех лет разработки под iOS, у остальных членов команды тоже был опыт разработки от одного до шести лет в смежных областях. Для большинства из нас это был первый случай использования Node.js в сравнительно большом проекте. Как мы это сделали, зачем мы это сделали, почему фриланс-биржа и как она отличается от классических моделей, какие у нас были проблемы и как мы с ними боролись — под катом!

С чего все началось?
Так уж получилось, что я в свободное время консультирую стартапы: как запуститься, где найти инвестиции, почему цикл разработки такой долгий, как передать код от одного подрядчика другому и тому подобное. Набрав достаточное количество опыта, стал им делиться в социальных сетях, из чего и выросла небольшая (273 человека на момент написания топика) группа в Telegram; где мы флудим, общаемся, помогаем друг другу и смотрим онлайн стримы разработки.

Где-то с полгода назад я начал изучать Node.js для саморазвития и вот, совсем недавно, написал пару игровых ботов эксклюзивно для нашего канала. Потом и ребята подтянулись — написали еще пару ботов (кстати, всех ботов мы выкладываем в открытый доступ — осторожно, за целостность ваших ок я не ручаюсь). Там и слоты, и русская рулетка, и собственная валюта «Гелиончики» есть (названная в честь одного из олдфагов нашей тусовки).

По роду своей профессии, у меня есть список контактов проверенных программистов (iOS, Android, Web), с которыми я уже работал и которых я время от времени собираю в команды для запуска или поддержки стартапов клиентов, получивших финансирование. Изначально мой контакт-лист был в Skype, но на сегодняшний день полностью перекочевал в Telegram. И вот, в очередной раз рассылая предложения о работе талантливым программистам, я поймал себя на мысли:, а почему нельзя этот процесс автоматизировать? Я ведь делаю это каждые 2–3 недели. Тут и возникла идея создать бота, который это делает за нас. Кидаешь ему описание работы, а он сразу выдает список фриласеров в нужной категории и с нужным почасовым рейтом.

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

Изначально нашей целью было сделать удобную бесплатную фриланс-биржу и после выложить код в открытый доступ. Мы приняли решение никогда не монетизировать сервис и поддерживать его на собственные деньги с завтраков. Но появилась в наших сердцах надежда на нормальные завтраки, когда Павел Дуров объявил о грантах для ботов. За неделю до официального запуска, но с уже полностью рабочей платформой, мы написали @BotSupport, тем самым оставив заявку. Если кому интересно, можно почитать текст заявки:

Жми меня!
#BotPrize

Good morning dear Telegram Bot Support team! We’ve recently heard about Telegram bot contest and started to build the freelance market within Telegram. Our bot’s handle is @*бот* — this submission may seem too preliminary but we decided to message you sooner rather than later. Let me give you some details about who we are, what is @*бот* and what are our plans!

First of all, we have built this bot together with my friends-developers from @borodutcher (we’ve built the whole chat currency platform privately for our group with multiple game bots using it — but that’s a completely different story). Right now we have 5 active members of our team and we have been building this bot for the last 4 weeks. I have live streamed development on livecoding.tv/backmeupplz — some of the saved videos just hit over 5000 views, so we try our best to make Telegram more and more popular:)

Our current situation is almost production ready: we have used web-hooks to make bot work as fast as possible and used Node.js with MongoDB to manage bot’s logic. We have a couple of tasks left like fixing minor pretty hard to catch bugs and going through bot texts with native English speaker — but that’s all minor things.

So what is @*бот*? It’s a completely Telegram-native freelance market with revolutionary system, here are some things by which it is different from classic freelance market system:

  1. With classic freelance system, after a client publishes a job, it is visible to everybody and everybody can respond to it — that leads to a lot of unnecessary spam-like freelancer’s offers. In our case, client chooses who should receive job offer by looking at freelancers' bios.
  2. With classic freelance system, after a client posts his job, he needs to wait for some time before getting first responses. In our case, straight after client has published his job, we send him a list of 10 freelancers with the best rating and the ones who are best suitable for this job. After that, client is free to choose freelancers who should receive job offer. No need to wait!
  3. With classic freelance system, it is pretty hard for first time clients to pick the right price for the job — it’s almost like a block box for them. In our case, our statistics is opened and after client has selected category he sees how many freelancers are available in each price category — this gives clients insight about how much should the job cost.
  4. With classic freelance system, markets tend to either prohibit client-freelancer communication till the point when deal is sealed. In our case, because of awesome Telegram abilities, clients may message freelancers as soon as they appear on the list and freelancers can message clients as soon as clients decide to send them job offer.
  5. With classic freelance system, freelancers have to be hyper-proactive monitoring markets and answering every single suitable job posting. In our case, as soon as freelancer fills in his profile (bi, categories, hourly rate), the only thing he needs to do is to lay back and keep up good job (to gain rating) — he will receive job offers if any clients would like to work with him.
  6. And, the most important thing. Most of the classic freelance services are commercial-oriented: they have membership fees, transaction fees, connection fees, feature fees, etc. In our case, we decided to keep bot completely non-profit. Which means that we claim to drive this system only on matters of providing users with stable and friendly service.
  7. The last but not the least, most of classic freelance market never open source their code — because of very high risk to become vulnerable to hacker and competitor attacks. In our case, we decided to make this freelance market completely open-sourced so that everybody could fork it, fix a bug or add a feature and make pull request. This will be a completely open and community-oriented system. We plan to open source full codebase as soon as we reach the threshold of 1000 registered users. To better support our claims, we open-source our bots on almost monthly basis: github.com/borodutch.

And did I mention that this freelance marked is 100% based on Telegram? We have no other places to publish or respond to a job but Telegram. No need to login anywhere — just start the bot and you are all set!

What are our plans for future?

  1. First, we will fix some minor bugs and work on more user-friendly texts.
  2. We will launch a website with user number statistics and all differences from classic freelance market system. We plan to host on github pages this time and make website code to be fully open source as well.
  3. We plan on writing about our bot on habrahabr.ru (by the way, I still hold badges of the best author in Obejctive C and iOS Development hubs — habrahabr.ru/users/backmeupplz/) producthunt (I recently got an invite there as well — producthunt.com/@nikitakolmogorov), reddit, pikabu and vc.ru with details about development process, difficulties we faced, etc. We hope this will bring attention to our bot and we will get 1000 users in relatively short period in time.
  4. After we gain critical user-base we plan on implementing new features requested by users and improve existing ones.

This is it — our freelance chat bot market in the nutshell. We have used inline keyboards as well as usual keyboards to enhance UX; we even have pagination in one of the inline keyboards;)

Why would we like to join the Bot contest? Well, this bot was created as a side project and we kind of didn’t spend nothing but our time on it — which means that there were almost no development costs. If we would be considered as suitable contestants and (luckily) get grant, it would definitely help us to start working full time on this bot platform and put all our efforts towards gaining more and more users while satisfying majority of them with service (ideally, all of them). It would also be a great help for us to keep this bot open-source and completely free for users — but that kind of our philosophy, we really want this to happen. In a sense, grant would help us grow our user-base and support further development.

On the last note I would like to thank you for building such a great chat bot platform! Again, we don’t have many users right now but we still decided to message you sooner than later:) In case you like it;)

Thank you a lot for reading such a huge intro to our bot. Please have a wonderful day!


Так зачем, говорите, еще-одна-фриланс-биржа?
Казалось бы: есть Upwork, FL, пара-тройка хороших фриланс-ботов в Telegram — так зачем же нам еще одна биржа? Где-то два года назад я бы задал тот же самый вопрос, но недавно я перешел на другую сторону фриланс-бирж: от фрилансера к клиентам. И если вам не нравилось то, как работают биржи со стороны фрилансера, поверьте, со стороны клиента картина выглядит еще хуже.

Предположим, вам нужно создать сайт и вы ищете хорошего подрядчика — выкладываете объявление на тот же Upwork, что дальше? Начинается ад, на который вы тратите львиную часть вашего времени: приходит тонна ужасных спам-рассылок от непонятных студий из Индии. Ладно, отсеиваем их. Что делать со второй тонной заявок? Ох, их слишком много — отсеиваем всех с рейтингом ниже 4.8 звезд. Ох, все еще осталось 130 заявок. Ладно, отсеиваем по портфолио — что нравится или не нравится. Ох, опять осталось в районе 40 заявок. Ну, ничего страшного, напишу всем под копирку ответы и запрошу контактные данные для связи. Эх, как же это все долго. А потом еще и общаться со всеми — еще и не понятно, сколько это все стоит, надо бы у всех поспрашивать.

Можно ли автоматизировать этот процесс? Посовещавшись, мы продумали альтернативную систему фриланс-биржи с несколькими отличиями от классической модели:

  1. Клиент получает список из топ-10 фрилансеров, как только создает новую работу. Из этого списка клиент сам выбирает, кому отправить предложение о работе.
  2. Фрилансеру нужно только заполнить свой профиль и следить за рейтингом — предложения будут сами приходить к фрилансеру, если профиль понравится клиентам.
  3. Биржа абсолютно бесплатна и навсегда такой останется. Мы не блокируем коммуникации между клиентом и фрилансером и не используем хитрые приемы съема денег.
  4. Как только у нас появится 1000 активных пользователей, мы выложим код бота в открытый доступ, чтобы каждый мог поправить баг или добавить функцию, если захочет.

Введя этот ряд изменений и дав контроль над биржей сообществу, мы надеемся улучшить качество коммуникации между заказчиками и клиентами, ускорить процесс поиска подрядчика и заключения сделки. Сказано — сделано: бот прекрасно работает со 176 пользователями на момент написания статьи.Как мы организовывали работу?
В итоге у нас было пять программистов без очевидного менеджмента — сами знаете, к чему это все приводит. По привычке, мы начали использовать Trello — он бесплатный и достаточно простой — для слежения за багами и задачами. Накидали простую структуру со столбцами типа «To do», «Working», «Testing», «Done», «Future» и перекидывали карточки между ними. Вот так это безобразие выглядело:

b66dcbe8a3094d198b9f66636e5b2703.png

Мы могли бы использовать и JIRA, и баг-трекер на BitBucket, но все это нам показалось слишком большим и громоздким для нашего сравнительно небольшого проекта. Тем более, на BitBucket мы не особо хотим задерживаться. Как только ударим по отметке в 1000 пользователей, перенесем код в открытый доступ на GitHub. В нашей команде любой мог создать новую карточку с багом или фичей, а после, посовещавшись, мы либо прикрепляли карточку кому-нибудь из нас, либо переносили карточку в колонку «Future» — идеи, оставленные на будущее. Уж очень мы хотели запустить MVP — пришлось обрезать наши хотелки по максимуму.

Совещались мы чаще всего именно в Telegram. Учитывая, что опыт разработки на JavaScript и Node.js у нас был разный, мы учились на ошибках и советах друг друга. Если кто-нибудь закидывал плохой коммит в свою ветку, то мы быстренько его поправляли. К слову, в начале мы использовали никнеймы на BitBucket в качестве названия веток, но потом перешли на православные названия фич — так нам стало гораздо удобнее коммитить в ветки друг друга.

Какие трудности мы встретили на пути?
Все подводные камни, конечно же, покрыть не получится, но я постараюсь рассказать о нескольких особо выдающихся проблемах, которые довольно сильно стопорили развитие бота.

1. Создание веб-сайта


Эта проблема, скорее, появилась из-за того, что все мы работали бесплатно и никакой мотивации, кроме запуска продукта, ни у кого из нас не было. Так, первый разработчик, занявшийся лендингом для бота, оказался сильно занят основным проектом, который оплачивал его счета. Ничего страшного не произошло, мы передали разработку другому человеку. Второй, так получилось — не знаем, из-за недостаточного опыта фронтенд разработки это случилось или из-за чего-то другого, но тоже не справился с задачей, не устроил нас результат. Но вот из ниоткуда появляется наш герой и верстает-таки страничку, которую задизайнил один из великолепной пятерки программистов из лампового чата! И, все великолепно: хостимся на Github Pages, баги правятся по мере поступления, ей-Богу, счастье! И наш сайт заработал. Прикрутив небольшой сервер статистики, мы получили интересные цифры в реальном времени.

1747c104248245e4abb8c6c175885714.png

А после, коллективными усилиями сообщества, мы добавили параллакс и поправили пару багов. Вы тоже можете немного помочь, сделав fork → fix → pull request, если найдете баг и поправите его. Кстати, вспомнились мне слова создателя Retro City Rampage на Vancouver Global Game Jam 2013 года о правильном члене команды, цитата не точная: «Хороший тиммейт — это когда говоришь ему нарисовать машину со спойлером, и он рисует идеальную машину со спойлером, безо всяких ненужных вопросов о цвете, размере и толщине молдингов».

2. Полировка текстов


Почему-то я до недавнего времени думал, что английский — это обязательное требование в конкурсе Telegram для ботов. Однако зайдя на сайт контеста сейчас, ничего подобного найти не смог. В любом случае, это повлияло на нашу внутреннюю структуру бота — сначала мы хотели сделать его на двух языках: английский и русский, но потом решили оставить только английский. Большинство клиентов, которые приносят хорошие деньги разработчикам, говорят на английском — поэтому мы и остановили свой выбор на этом языке.

Так вот, к сожалению, у нас в команде не было носителя языка. Но, благо, живу я в англоязычной стране и найти человека для проверки текстов было не сложно. Однако у этого человека же тоже были свои дела! Поэтому нам и пришлось ждать в районе 3 недель полировки текстов. Вот так и получается: хочешь сделать что-то бесплатно, нужно подождать. К слову, я всегда довольно много времени трачу на то, чтобы подготовить все для людей, которые бесплатно мне помогают. Если человек придет чинить вам мотоцикл, так уж подготовьте ему рабочее место, инструменты и почистите ваш байк! Тексты, кстати, так и не смогли достаточно все отполировать — только поверхностно пока что.

3. Трудности новичков в JavaScript


Ох, тут мы, кажется, ударились обо все подводные камни в JavaScript, которые были! Большинство проблем всплыло где-то в середине цикла разработки с переводом проекта на стандарт ES6. Тут появились и Arrow Functions, и модули, и все-все-все новое. Но, ничего страшного! Прочитали Airbnb Style Guide и дело пошло. Пришлось, конечно, перелопатить половину кода, но оно того стоило. Если вы работаете в команде — обязательно договоритесь об используемом стиле написания кода до начала проекта. А то потом замучаетесь пробелы менять на табы и наоборот.

Дальше начались амбициозные ошибки новичков в попытках собрать сложную архитектуру, а в частности, callback hell. Решили мы это не особо сложным способом — начали везде использовать Promises, это сделало наш код чище и читабельнее. Дальше мы полностью избавились от Express — ибо он нам тут больше был не нужен.

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

4. Трудности с Telegram


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

Первый — когда шлешь inline-клавиатуру в одном месте, а обрабатываешь нажатие совершенно в другом — удалось побороть при помощи глобального event emitter’a — знаю, плохой паттерн, но работает. Второй — я просто понятия не имел, как работает https до момента интеграции в Telegram –, но теперь разобрался. Все эти ключи и сертификаты — брр, сложно.

5. Какой стек технологий выбрать и где хоститься?


Собственно говоря, со стеком мы определились сразу же: просто было достаточное количество споров о правильности выбора. Кто-то говорил, что на Python было бы проще, кто-то говорил за Ruby. Но, запаслись мы терпением, как обычно, взяли открытый фреймворк для общения с Telegram API и написали-таки. Для базы данных взяли обычный MongoDB. Express мы не использовали за ненадобностью, как я уже отметил выше.

Второй вопрос:, а где размещать сервер бота? Выбрали вариант Digital Ocean (Heroku оказался шибко дорогим при масштабировании нагрузки). Но, вот проблема: выбрали сервер в San Francisco и скорость отклика бота, мягко говоря, нас не устраивала. Жмешь на кнопку, через полсекунды бот получал запрос и еще полсекунды закидывал запрос назад на сервера Telegram. Что делать? Перевели бота с постоянного поллинга данных с сервера каждые полсекунды на вебхуки — когда сервера Telegram сами сообщают нашему боту о новых данных. Помогло очень незначительно. Стали думать: почему же у других ботоделов все работает почти мгновенно? Спросили в разных чатах разработчиков игр для Telegram и узнали, что если разместиться на серверах Digital Ocean в Амстердаме, то будет ощущение, что сервер Telegram стоит в той же стойке. Проверили — оказалось правдой. Теперь и наш бот стал гипер-быстрым.

6. Как выдавать рейтинг пользователю?


Мы сортируем фрилансеров по рейтингу в выдаче после создания работы клиентом. Но как сделать так, чтобы фрилансер с одним отзывом в 5 звезд не был выше фрилансера с сотней отзывов со средним рейтингом 4.95? Ответ оказался довольно прост, про это даже есть довольно хорошая статья. Перевели скриптик небольшой на Node.js и больше мы не используем обычное среднее число для расстановки рейтингов фрилансеров.Как можно помочь развитию бота?
Абсолютно весь код был написан волонтерами, и никто не собирается как-либо монетизировать сервис. Чтобы у нас была возможность и дальше поддерживать открытую фриланс-биржу бесплатной, нам нужна ваша помощь. Помочь можно несколькими способами:
  1. Зарегистрироваться на бирже и заполнить свой профиль фрилансера
  2. Написать о нас в своем блоге или на своем ресурсе
  3. Поделиться с друзьями в социальных сетях
  4. Ну и, конечно же, помочь с кодом — совсем скоро мы перепрыгнем порог в 1000 пользователей и выложим код в открытый доступ.

Мы все будем очень благодарны любой оказанной помощи проекту!

От себя скажу отдельное спасибо всем, кто как-либо уже помог написанию биржи — ребята, вы — огонь! Без вашей поддержки этот проект никогда бы не смог увидеть свет.

Заключение
Спасибо, что дочитали до конца!

Так мы и написали своего первого большого бота для Telegram. Я постарался слегка урезать статью, чтобы оставить самое полезное и самое главное для рядового читателя. Так же вырезал все ссылки на бота, чтобы модераторы Хабрахабра ненароком не отправили в ссылку за статью (даже из картинки-шапки).

С удовольствием отвечу на любые вопросы в комментариях!

Комментарии (7)

  • 22 сентября 2016 в 09:48

    +1

    Зарегистрироваться на бирже и заполнить свой профиль фрилансера

    Может ссылкой нужно сделать?
    • 22 сентября 2016 в 09:49

      0

      Сильно боюсь, что забанят модераторы за пиар ни к месту :(
      • 22 сентября 2016 в 09:51

        +1

        Значок «Freelancers waiting» — рукопожатие левой рукой?
        • 22 сентября 2016 в 09:59

          0

          Интересное замечание, поправим в будущем, уже создал issue на гитхабе:)
      • 22 сентября 2016 в 09:52

        +1

        Поверите, я не могу из статьи понять как «Зарегистрироваться на бирже» :)
        • 22 сентября 2016 в 09:53 (комментарий был изменён)

          +1

          это делается в самом боте @arbeit_bot, на сайте регистрации нет, как я понял
          • 22 сентября 2016 в 10:00 (комментарий был изменён)

            0

            Да, на сайте регистрации нет :) Одно из главных отличий — мы не интегрируемся во внешние сайты или сервисы, биржа от и до построена в Telegram. Спасибо за то, что поделились ссылкой!

© Habrahabr.ru