Каталог решений - Как мы интегрировали свою систему управления разработкой со Slack. Инструменты, возможности, процесс разработки

Как мы интегрировали свою систему управления разработкой со Slack. Инструменты, возможности, процесс разработки

Как мы интегрировали свою систему управления разработкой со Slack. Инструменты, возможности, процесс разработки

В наличии

Slack – это не только корпоративный мессенджер. Он предоставляет гибкие настройки уведомлений и реализует несколько вариантов интеграции, с помощью которых можно наладить взаимодействие с собственным приложением. Об интеграции Slack с системой управления разработкой, написанной на 1С, рассказал руководитель компании «ПрогТехБизнес» Александр Анисков.

Категория:

Описание

 

 

Я представляю небольшую компанию ПрогТехБизнес.

  • Нам уже больше 10 лет, но я до сих пор считаю, что мы – стартап. Ничего не меняется. Как 10 лет назад мы были стартапом, так и остаемся.

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

  • И да, мы отвратительно представлены в интернете. Если вы найдете наш сайт, вам будет за него так же стыдно, как мне (есть такое понятие – испанский стыд).

Но что можно сказать о нас, как о разработчиках?

  • Мы глубоко интегрируемся в бизнес нашего клиента – это наше кредо, мы не делаем маленьких решений, не пишем маленькие разработки, мы всегда говорим о том, что если мы с вами работаем, то это надолго и всерьез. И дело не в деньгах, которые мы заработаем, а дело в понимании того, что мы для вас делаем и как мы ваш бизнес будем понимать.

  • Мы начали автоматизировать себя еще до того, как это стало мейнстримом. Когда компания ПрогТехБизнес только появилась, нас было всего двое, и никакой автоматизации двум человекам не нужно, потому что мы легко могли обо всем договориться. Но у нас уже тогда появилась система управления задачами, где мы начали что-то делать.

  • Но время шло, прошло 13 лет, и мы застряли. Объективно оценивая путь, который мы прошли – мы немного застряли в прошлом веке, мы не можем похвастаться тем, что у нас самые лучшие методики разработки. Но мы работаем в этом направлении, и я постараюсь про это тоже рассказать.

Кто я? В ИТ-мире меня знают как vandalsvq.

  • Я – Тони Старк без костюма, инженер, программист, руководитель.

  • На Инфостарте я представлен собственными разработками, которые, как правило, делались для нашей компании, а потом немного ушли в мир.

  • Некогда активно участвовал в сообществе 1С++ (если кто-то вообще помнит, что для 7.7 такое было).

  • И у меня тяжелая участь – я основной разработчик внутреннего инструментария в нашей компании. Как правило, я поднимаю руку и говорю: «Ребята, завтра у нас будет все по-новому».

Я открыт для обратной связи, ищите меня везде по нику vandalsvq. Люблю общаться с разносторонними людьми – это очень интересно.

 

5 минут про Slack

 

 

У всех вас наверняка есть Telegram, WhatsApp, Viber, Skype и т.д. Когда вы пользовались этими мессенджерами, у вас точно возникала ситуация – сначала в группе конструктивно общается 10 человек, а потом кто-то начинает разводить флейм, и в какой-то момент группа превращается в дикий треш и угар. Когда в этом большом полотне обсуждений начинают теряться важные вещи, ты уже перестаешь понимать, что вообще происходит.

У меня была такая история с моим предыдущим телефоном – ему было 10 лет, и он улетел об стену, потому что меня просто это все достало. Эти бесконечные уведомления, люди, пишущие ни о чем, в группах, на которые ты подписан из-за того, что там на 100 тысяч сообщений одно важное. В общем, телефон улетел в стену. Его просто нужно было поменять. Нашел хороший способ.

  • Slack – это отличная замена WhatsApp, Telegram и другим мессенджерам, потому что у него есть множество вариантов организации способов взаимодействия – публичные каналы, приватные каналы, личные сообщения. Вы скажете – а что тут нового? В Slack есть треды – ветки внутри сообщений. Когда вы создаете сообщение, и оно становится темой для последующего обсуждения – человек проваливается внутрь и начинает общаться в отдельной ветке. Тогда это полотно уже превращается в полотно важных сообщений, внутри которых идет общение. Правда, у вас будет сначала одна большая проблема – должен быть человек, который будет писать: «Идите в тред», потом удалять сообщения, переносить их в тред. Но со временем все привыкнут, поверьте.

  • Вторая вещь, которая мне очень понравилась, и я ее просто полюбил – это гибкая настройка уведомлений. Я ненавижу телефоны, ненавижу уведомления – я вообще ненавижу, когда меня трогают, и отключаю все, что только можно. Но Slack мне позволил подписаться на важные слова в уведомлениях, на пару важных каналов, замьютив их на определенных платформах – в телефон мне нужно присылать уведомления тогда-то, на десктоп – тогда-то и т.д. И мне это все помогло избавиться от множества фонового шума при том, что у нас в Slack общается множество людей – даже заказчики подключены, причем, они там такую вакханалию устраивают, что просто тихий ужас. Поэтому мне особенно нравится механизм «Не беспокоить».

  • Встроенные напоминания – тоже ничего нового, вы можете создавать напоминания в телефоне себе, в ToDo, где угодно. Когда я нахожу очень важное сообщение и хочу почитать этот тред, я его либо добавляю в избранное, либо в напоминания. И тихо вечером, когда все уснули, сижу и перечитываю то, что написали.

  • И мое любимое – открытые механизмы интеграции. Можно пользоваться интеграцией с G Suite. А мы написали свое приложение, где автоматизировали очень многие вопросы, связанные с управлением разработкой. Возможность построить собственную интеграцию – это та киллер-фича, которая отличает Slack от множества других мессенджеров. И, конечно, очень приятный момент, что те ограничения, которые есть в бесплатной версии, позволяют ей спокойно пользоваться в не очень крупных командах. Если, конечно, у вас команда на 100 человек, возможно, вам и не хватит 10 000 сообщений, которые хранятся в памяти и поиске, но нам пока хватает. Тем более что многие вещи потом переходят в задачи.

Slack – это не система учета задач. Это просто система общения. Мы поговорили, обсудили, приняли решение – на основе этого формируется задача, предпринимаются какие-то действия и т.д.

Тем не менее, давайте с вами поговорим о том, как построить собственную интеграцию. Или вообще, что такое приложение в Slack – что оно умеет.

 

Приложение в Slack

 

 

Slack дает нам множество возможностей:

  • Мы можем отправлять любые сообщения в разрешенные каналы, просто давая право боту писать в этот канал. Какие это могут быть сообщения – мы с вами поговорим чуть позже. В любом случае, это отличная система для построения каких-то важных оповещений.

  • Вторая, моя любимая тема – это slash-команды для директивного общения. Slash-команды – это отличный способ научить 30 человек говорить одинаково, потому что научить бота понимать 30 человек, если честно, намного сложнее. А 30 человек научить общаться похожим образом, запомнить какие-то команды, дать им подсказки – это очень легко.

  • Система подписок на события – отличная тема, позволяет вам в вашем приложении отслеживать, что вообще происходит в Slack – какие изменения происходят в каналах, какие пользователи в них вступают или, наоборот, покидают. Можно отслеживать, как меняются статусы – там есть игра «HeyTaco!», где в качестве благодарности можно выставлять друг другу такосы, и по общему количеству такосов у пользователя определяется, кто молодец. Конечно, это все баловство, тем не менее, там можно сделать приложение, которое подписывается на событие и ведет счетчик, когда кто-то поставил эмоджи к вашему сообщению.

  • Любое приложение для Slack – это, в первую очередь, еще и бот, который может писать и получать сообщения, и может немного притворяться человеком.

  • И интерактивные элементы сообщений – это то, чего нет в других мессенджерах. Это – возможность добавить в сообщение элементы взаимодействия, аналогичные полям ввода данных в 1С. Вы все их знаете – это поля выбора, выпадающие списки, флажки и т.д. Но об этом чуть позже. Так вот эти элементы сообщений – это то, чего нет в других мессенджерах. Они нам позволяют построить сообщения не только от пользователя к нашему приложению и от приложения к пользователю, но и еще вдобавок получить обратную связь.

Но давайте обо всем по порядку.

 

Механизмы интеграции

 

 

Чтобы все это получить, Slack нам дает 6 вариантов интеграции (7 вариант – это классическое API).

  • Первый вариант – это Incoming webhooks. Собственно, это и есть отправка произвольных сообщений в любые каналы.

  • Interactive messages – это возможность вставлять элементы, создавать интерактивные сообщения. Чуть позже я покажу скриншоты приложения, вы поймете, о чем я говорю.

  • Slash Commands – это те команды, которые начинаются с косой черты. Информация, переданная с помощью slash-команды, приходит к вам в приложение.

  • Bot users – он здесь помечен синим цветом, и почему это так, я расскажу позднее. Про боты у меня есть отдельное особое мнение, и, честно признаться, сначала я думал попытаться сделать что-то типа интересного «умного бота», но тут меня ждал определенный фейл.

  • Event Subscriptions – это возможность подписаться на любые изменения, которые происходят в Slack, про это я уже говорил раньше.

  • И последнее, красное, Real-time messaging. К сожалению, этот механизм взаимодействия со Slack для 1С недоступен без использования внешних компонент, потому что используются веб-сокеты, а с ними 1С работает только через ВК.

Но, опять-таки, как выбрать, чем пользоваться?

 

Выбор механизма интеграции

 

Есть схема по выбору механизма интеграции. Она когда-то была написана самим Slack для японцев на японском языке, и было весело пытаться ее перевести с японского. Слава Богу, я нашел вариант на английском и немного ее доработал для понимания, что происходит в 1С.

Схема остается классической, вы можете ее прочитать. Но, когда будете читать, обратите внимание на желтые квадратики. Это то, что 1С либо не умеет, либо есть альтернатива.

Для Real-time messaging есть альтернатива в виде веб API и подписки на события, но, к сожалению, если вы хотите знать все, что происходит к Slack по каждому чиху, вас тут ждет небольшое разочарование. Наверное, ничего не получится без ВК.

 

Легкий старт. Incoming Webhooks

 

Давайте теперь поговорим, насколько легко в этом во всем стартануть.

Допустим, вы хотите построить систему интерактивных уведомлений. С чего начать в этом случае:

  • Ставите Slack.

  • Переходите по адресу https://api.slack.com/.

  • Создаете свое собственное приложение, называете его, как вам нравится.

  • В настройках Slack включаете функциональность Incoming Webhooks.

  • И указываете, к какому каналу нужно привязать это приложение.

В результате получаете ссылку, по которой вы можете отправлять из вашей системы POST-запрос, чтобы что-то постить в Slack.

Что именно вы собираетесь сообщать из своей системы в Slack – это уже вопрос к вам. Лично мое мнение – устраивать из Slack систему уведомления о том, что изменился статус задач – это то еще удовольствие. Не потому, что это плохо, а потому, что, если вы безальтернативно не даете человеку отключиться от вашей нотификации – это, реально, достает. Поэтому дайте возможность отключить эту функциональность тем людям, которым эти уведомления получать не обязательно.

В любом случае, уведомления – это очень важно. Например, у вас работает сервер, у него прекрасные показатели работоспособности – он 99,9% времени работает, но в какой-то момент все падает. И этот 0,01% приходится на то время, когда вы отдыхаете с друзьями. Как об этом узнать? Кому-то такое сообщение удобно получать с помощью SMS, а кому-то в Slack. Это позволяет быстро среагировать и, возможно, что-то сделать.

Но когда мы дальше рассмотрим интерактивные сообщения, вы увидите, что можно не просто отреагировать, но и отдавать назад определенные команды, которые будут выполнены. В этом нам помогут slash-команды.

 

Slash-команды

 

 

Slash-команда – это кодовое слово, написанное через косую черту.

Свою автоматизацию в Slack мы начали с того, что у нас начали отмечать планируемые отсутствия сотрудника на рабочем месте.

У нас не регламентируется время, сколько ты находишься в офисе. Каждый человек волен самостоятельно принимать решение, где он работает. Задача должна быть выполнена, все остальное меня лично, как руководителя, не волнует. Главное – команда должна знать:

  • где ты находишься в данный момент – работаешь на удаленке или в офисе;

  • и как с тобой взаимодействовать – может быть, тебя вообще лучше не беспокоить.

Для этой цели мы ввели маленькую команду: /отсутствие и научили ее понимать такие аргументы: «сегодня» («завтра»), «с 10 до 17», «указание причины», «не беспокоить», «согласовать» (в этом случае отсутствие уйдет на согласование к руководителю проекта, менеджеру – к тому, кому это надо).

Конечно, даже такая маленькая команда у нас долго приживалась, но потом она так многими полюбилась, что внедрение других slash-команд дальше проходило намного проще. Люди привыкли, они поняли удобство, что не так сложно запомнить команду «/отсутствие сегодня». Это человекопонятный язык.

Что мы дальше стали делать? Мы написали ряд команд для нашей системы управления АСУП:

  • /asup connect – соединяет пользователя с программой;

  • /asup manage – позволяет управлять вашими настройками;

  • /asup create – позволяет создавать задачи;

  • /asup [номер задачи] [вид работ] [затраченное время] [описание] – либо посмотреть статусы, либо установить затраты, которые вы понесли.

  • /asup help (или /asup ?) – справка по возможностям бота

  • /asup list – увидеть все задачи

  • /asup commands – посмотреть, какие команды еще доступны.

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

  • мы включаем механизм slash-команд;

  • создаем slash-команды, придумываем им короткое лаконичное простое очень понятное всем название;

  • и после этого нам нужно дать ссылку, куда Slack будет отправлять POST-запрос каждый раз, когда человек вводит эту команду;

  • для этого мы создаем в 1С HTTP-сервис;

  • создаем для него URL-шаблон;

  • задаем обработчик POST-события, и все – ничего сложного.

Маленький нюанс – конечно, при разработке вы, скорее всего, будете использовать localhost, потому что мало кто имеет дома белый IP, и выставлять наружу какие-то сервисы, которые могут заддосить ваш комп, подвесить его на время – сомнительное удовольствие.

Поэтому просто запомните – ngrok. Маленькая утилита, которая прокидывает туннель между псевдо-адресом в интернете и вашим localhost. Прекрасная утилита, решает проблему.

На слайде видно, что у команды Request URL ссылается на домен https://934e2eb6.ngrok.io. Это возможность прокинуть туннель между интернетом и вашим локалхостом.

После этого пишете обработчик события для POST-команды и решаете, что делать.

 

 

А по поводу «что делать и как правильно отвечать» – тут маленький нюанс.

Отвечать нужно быстро. В отличие от 1С мы не имеем права очень долго думать, у нас на то, чтобы ответить, установлен лимит три секунды. Что вы можете сделать за три секунды? Проверить авторизацию, узнать, что человек отправил правильную команду, и сказать: «Я вас понял, все будет сделано, шеф!».

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

Мои рекомендации:

  • вместо пустого ответа с кодом 200 лучше напишите любое слово, хотя бы просто: «Понял»;

  • если вы не хотите, чтобы все видели ответ, добавьте в него реквизит («response_type»: «in_channel»), тогда это будет личное сообщение – это очень хорошая возможность Slack, когда у вас в общем канале человеку приходит сугубо личное сообщение, которое видит только он;

  • добавьте команду help и в любой непонятной ситуации возвращайте предложение о помощи – это мастхев;

  • включите экранирование имен пользователей и каналов – не нужно вам в программе знать ничего кроме кода вашего пользователя;

  • и придумайте лаконичные и понятные имена всем вашим командам. При этом учитывайте, что это имя должно быть уникальным. Например, если вы придумаете команду todo, то вы совершенно случайно обнаружите, что Slack предлагает в своем магазине очень много приложений, которые реализуют эту команду. Нужно избегать дублирования, чтобы разграничивать наши и чужие приложения.

Кстати, все эти скриншоты взяты из нашей системы – это то, что наша система отвечает пользователям в случае, когда они к ней обращаются по определенным командам.

 

Интерактивные элементы

 

 

Интерактивные элементы – это самая главная фича. Пожалуйста, поля выбора из списка, поля ввода многострочного текста, флажки, переключатели, какие-то кнопки меню, поля для выбора даты и т.д.

Элементов достаточно, чтобы эмулировать практически любую форму ввода. Вы, наверное, можете даже попробовать себе бухучет построить в Slack. Будет забавно. Только зачем?

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

  • Чтобы сделать полноценную форму, есть возможность создавать модальные формы – такие же, как мы привыкли видеть в 1С (выскакивает окошко, человек что-то вводит и т.д.).

  • Есть маленький нюанс – обработка событий по изменению этих реквизитов. Это отдельная история. О ней чуть позже.

  • Чтобы вам было удобно, Slack предусмотрел Block Builder Kit – заходите, играйтесь.

  • А мы, кроме этого, написали ряд библиотек, которые позволяют вам не задумываться о том, как эти элементы упаковываются в JSON-пакеты и создаются. Поэтому, когда все это будет выложено на Инфостарт, находите, берите, пользуйтесь – я буду только рад.

 

 

Чтобы мы смогли обработать ответ пользователя:

  • Должна быть включена функциональность Interactive Components (обработка событий интерактивных компонент). Мы ее включаем и указываем в качестве Request URL адрес POST-обработчика, который на стороне нашей системы получает изменение поля и как-то на это реагирует

  • Есть также очень полезная вещь – динамическое поле выбора. Если у вас справочник «Контрагенты» на 1000 полей, а вы хотите человеку дать выбор контрагента в сообщении, то, наверное, не стоит передавать JSON-пакет на все 1000 наименований. Это глупо. Достаточно реализовать простейший сценарий – человек вводит ИНН, наименование контрагента, и из справочника подбираются какие-то подходящие позиции. Для этого вы постите обработчик Select Menus и после этого можете совершенно спокойно получить этот запрос. Это как процедура ОбработкаВыбора() в менеджере справочника. Если проводить аналогии – ничего сверхъестественного в этом нет. Поэтому подписываемся на изменение элементов, подписываемся на выбор из меню.

  • И мы с вами можем привязывать к сообщению отдельные пункты меню – Actions. Например, вы хотите, чтобы из сообщения можно было сразу же создавать задачу – вы создаете пункт меню «Создать задачу в АСУП», и привязываете к нему обработчик. Вам придет текст сообщения, и вы сможете его обработать. Это точно так же обрабатывается в POST-запросе – точно так же делается HTTP-сервис, URL-шаблон и POST-обработчик к нему, в котором прописывается, куда Slack будет обращаться.

 

 

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

В случае с 1С это у нас определяется контекстом – мы все знаем про элементы на форме. А когда пользователь что-то меняет в Slack, то Slack нам сообщает только про то, что поменялось это поле, при этом вы не узнаете, что есть другие поля, другие кнопки и т.д. Когда другое поле поменяется – вы узнаете, что оно поменялось. А когда пользователь нажмет кнопку ОК, вы узнаете, что кнопка ОК нажата, а что на этой форме еще находилось – вы понятия не имеете.

Но это легко решается. Когда вы отправляете подобные формы, создайте простой регистр сведений с измерениями «Ключ блока» и «Ключ элемента». И каждый раз, когда вам приходит такое уведомление с ключом блока и ключом элемента, вы будете туда по ключам элементов дописывать значение, которое человек ввел. А при нажатии на кнопку «Записать» вы сможете, обратившись к этому регистру сведений, эти данные получить. Ничего сложного.

Единственное, что я бы порекомендовал ввести в этом регистре сведений очистку по таймингу, чтобы данные по блоку через какое-то время автоматически удалялись. Иначе регистр просто переполнится – он вообще должен быть минимальным при условии, что у вас не так много таких сообщений.

 

Подписка на события

 

 

Следующий элемент, который позволяет вам взаимодействовать со Slack – это подписка на события. У подписки есть определенная особенность. Дело в том, что, когда вы включаете любой другой режим интеграции Slack и создаете для него ссылку, Slack эту ссылку не проверяет, верит вам на слово, что она где-то в интернете доступна, в нее можно отправить POST-запрос, и все будет хорошо.

Но при включении подписок на события Slack сначала просит вас подтвердить, что существует определенный обработчик, который будет готов принять подписку на событие.

Это все опять решается просто: вы точно так же делаете HTTP-сервис, точно так же создаете URL-шаблон и реализуете для него POST-обработчик. Но только сначала вам в POST-обработчике нужно сделать обработку первого запроса от Slack, чтобы подтвердить, что у вас все хорошо, и ваш URL работает. То есть если обычно вы заходите в Slack, что-то настраиваете, а потом возвращаетесь в 1С и допрограммируете, то здесь вы сначала программируете в 1С, потом настраиваете Slack, а потом опять продолжаете программировать в 1С.

Чем вам поможет подписка на событие?

  • Во-первых, вы можете узнать об упоминаниях вашего приложения. Это очень неплохой кейс.

  • Или вы можете реагировать на добавление в Slack нового пользователя. Когда в коллектив приходит новый человек, ему, как правило, тяжело сразу понять, что вообще происходит. Добавьте человека в Slack, и, если у вас настроена подписка на событие добавления нового пользователя, отправьте сообщение: «Добро пожаловать в нашу систему! Здесь у нас находится база знаний, а здесь еще что-то. Здесь у нас бухгалтер, а здесь программист. А этого человека лучше вообще никогда не трогай».

  • Или, например, можно парсить сообщения на присутствие в них знака «#», который означает номер задачи, над которой ведется работа. И в ответ выдавать информацию о том, в каком статусе эта задача сейчас находится, и что вообще с ней происходит. Например, вы пишете человеку: «Что с задачей #номер?». И Slack вам сам отвечает – задача находится у того-то в таком-то статусе.

 

Боты

 

 

А теперь про боты. Боты бывают либо тупые, либо умные.

Тупые боты пишутся очень легко, и они крайне просто заменяются slash-командами.

Например, тупые боты могут выдавать отчеты по выбору: «Я могу тебе дать: 1. Отчет А; 2. Отчет Б; 3. Отчет В». Вы выбираете. Потом он у вас спрашивает, какие вам нужны настройки и выдает список вариантов отчета. Вы опять выбираете, и после этого вам бот присылает отчет.

Но вы же могли сразу написать slash-команду «/отчет», чтобы Slack выдал список вариантов предопределенных настроек. Это намного проще, намного понятнее, намного эффективнее.

А умные боты – это уже другая история. Вы можете интегрироваться с Яндекс.Диалог, с TensorFlow – отдать туда текст и получить в ответ структуру, где данные разделены по городам, датам, каким-то другим признакам. А дальше у вас с этой нейросетью начинается новая веселая жизнь, где важен контекст, в рамках которого вы общаетесь, и вам нужно попытаться понять, что в этой структуре относится к вам, и что с этим делать. Это очень прекрасная тема, которая вас погрузит в то, что к 1С имеет очень мало отношения.

Поэтому боты умные – это дорого и долго. А тупые боты никому не нужны, потому что все предыдущие механизмы нам их спокойно заменяют.

 

Немного о разном

 

 

У Slack недавно появилась прекрасная вещь – это рабочие области вашего приложения. Это как главное окно в 1С, где выводится количество задач, запланированные на день события и т.д. Вы можете то же самое сделать в Slack. Здесь приведен пример, как Outlook ведет свое главное окно.

Кроме того, есть возможность обратиться к Slack через запрос к веб-API и сделать множество других полезных вещей.

Важно, что приложение для Slack можно сделать за пять минут. В ближайшее время (плановый срок – июнь 2021 года) мы планируем опубликовать на Инфостарте нашу конфигурацию с примерами взаимодействия. Если вы встроите ее общие модули к себе или построите на их основе расширение, вы сделаете приложение за пять минут. Чтобы его оформить красиво, вам понадобится полчаса. А после того, как вы попадете в этот мир, вас вряд ли отпустит, и вы всю жизнь будете это развивать. Это надолго и всерьез.

Ищите цикл статей «Полезный код для программистов 1С». Там есть еще и другие полезные лайфхаки.

Желающие могут присоединиться к разработке, рассматриваю любой способ взаимодействия, потому что одному в жизни немного тяжело.

 

*************

Данная статья написана по итогам доклада (видео), прочитанного на INFOSTART MEETUP Kazan. Больше статей можно прочитать здесь.

Приглашаем всех принять участие в тематических митапах Инфостарта и INFOSTART EVENT 2021 (6-8 мая, СПб).

has been added to your cart:
Оформление заказа