что такое асинхронная работа
Работай асинхронно
Асинхронная работа — такой способ организации процесса, когда задачи выполняются на конвейере. Это позволяет полностью контролировать процесс и точно подстроить его под себя. При этом давление и стресс снижаются до нуля, а задачи выполняются быстро и ловко.
Ровный и быстрый конвейер выдаёт в точности нужное количество продукции, все его этапы сбалансированы с точки зрения эффективности и скорости. Он избегает пустой траты времени или ресурсов, по образцу методологии 3M от Toyota Production System.
Асинхронная работа опирается на три основных принципа: мультиплексирование, связь и действие.
Мультиплексирование
Люди живут в синхронном мире. Часы тикают ровно по секунде. Но способ организации задач оказывает безумное влияние на результат. Всё дело в планировании.
Синхронное планирование
Типичное (синхронное) планирование предполагает одновременное массовое начало задач. Само по себе это не страшно, но общая скорость ограничивается скоростью самого медленного элемента. Любая задержка распространяется по конвейеру, поскольку каждый этап полностью зависит от предшествующего.
Пример 1
Здесь мы видим поток разработки программного обеспечения с тремя терминалами и синхронным планированием. Для завершения разработки нужно выполнить задачи A, B и C. Учитывая способ планирования и очередь, для завершения работы потребуется цикл из девяти рабочих часов. Система хорошо подходит для атомарных задач, но очень медленная в других проектах, поскольку предусматривает очень редкие деплои.
Асинхронное планирование
Асинхронное планирование предполагает разбиение задач на максимальное количество более мелких задач с максимально частым выпуском «минимально жизнеспособных изменений» (MVC). Метод основан на гипотезе, что более частый выпуск минимальных изменений позволит лучше измерить успех и как можно быстрее реагировать на отрицательный фидбек. Он также позволяет лучше контролировать распределение ресурсов, поскольку за то же время мы выполняем больше задач (уменьшенного размера).
Пример 2
Разделив задачи А, B и C (А1, А2, А3, B1 и т. д.) мы в три раза увеличили частоту деплоев. Через девять часов у нас может быть столько же готовых функций, но мультиплексирование с асинхронным распределением позволяет проверить результат — и откатить или изменить следующие шаги. Мы сократили время итерации до трети от первоначального.
Эта методика позволяет нам мультиплексировать задачи, объединяя их, чтобы быстрее получать результаты.
Связь
Хорошая коммуникация — ключ к успеху любой системы (человека или машины).
Есть много видов связи: электронная почта, мгновенные сообщения, голосовой вызов, видеозвонок или даже «пойдём выпьем кофе». Каждый из них совершенно по-разному влияет на производительность, и выбор правильного варианта так же важен для конвейера, как и выбор задачи.
Синхронная связь
Мы по природе больше склонны к синхронному общению, оно проще и комфортнее.
В разговоре обычно участвует минимум двое. Он происходит в разных форматах:
Большинство совещаний можно заменить правильной документацией, хорошо написанными электронными письмами или сообщениями.
Вообще, совещания — самый дорогой инструмент в компании, используйте его правильно.
В третьем примере два разработчика работают над собственными задачами и перед деплоем должны завершить задачи A, B и C:
Пример 3
Довольно типичная ситуация. Обоих разработчиков на некоторое время отвлекает обсуждение технического задания, и вскоре собрание на тему, что им делать дальше.
Это явно не лучший вариант для использования синхронной связи. Мы видим, что прерывания задержали всю работу и деплой не состоялся.
Производительность такого конвейера явно не равномерная, и её никак не назовёшь высокой.
Асинхронная связь
Асинхронная связь даёт независимость. Она пытается обеспечить, чтобы задача и её последствия не зависели от того, кто её спланировал или выполнил.
Асинхронная связь обеспечивает некоторые общепризнанные лучшие практики, такие как:
Пример 4
В этом примере связь осуществляется посредством обмена сообщениями и хорошо написанной документации. Даже если обмен сообщениями растянут во времени, влияние на рабочий поток незначительно и часто даёт лучшую производительность.
Но почему?
Люди не очень хорошо переходят от состояния полного сосредоточения на задаче А к полному сосредоточению на задаче В (как показано на следующем рисунке). Например, когда вы глубоко погружены в книгу и вас что-то отвлекает, вам потребуется время, чтобы вернуться к тексту.
В примере 5 мы видим диаграмму, где по осям отложены время и производительность бэкенд-разработчика, которого отвлекают дважды: сначала разработчик фронтенда спрашивает о полезной нагрузке запроса API, а потом новичок в команде просит помощи с локальной настройкой БД проекта.
Пример 5
Бэкенд-разработчик потратил некоторое время, чтобы сосредоточиться на текущей задаче (1), затем перешёл в состояние концентрации (2), где его суперкреативный и мощный мозг работает наиболее эффективно. Затем его отвлекают, и он тратит некоторое время на общение с фронтенд-разработчиком (3), чтобы потом вновь вернуться к задаче (1). К сожалению, когда разработчик снова сосредоточился (2), его опять отвлекают (3).
Если вы дочитали до этого места, уверен, что всё это вам очень знакомо.
В позитивной психологии состояние потока — это психическое состояние, в котором человек, выполняющий какую-либо деятельность, полностью погружен в ощущение энергичного сосредоточения, полной вовлечённости и наслаждения процессом деятельности. В сущности, поток характеризуется полным поглощением внимания, и вытекающей из этого потерей чувства пространства и времени.
Если полностью сосредоточиться само по себе трудно, то попасть в поток ещё труднее. Чем лучше вы сосредоточены, тем выше вероятность попасть в поток, но если возникли проблемы с сохранением концентрации, забудьте о потоке.
Асинхронная связь здесь исключительно важна, поскольку защищает время и концентрацию каждого сотрудника, уменьшая бессмысленные отвлечения. Когда вы связываетесь асинхронно, такие типы прерываний происходят гораздо реже. Увеличивается время для глубокой работы и вероятность достижения потока.
Действие
Это последний фактор перехода в асинхронный режим. Дело не в процедурах, а в отношении к себе как профессионалу и своих профессиональных целях.
Часто встречается, что задача не подготовлена, процессы не планируются, ответственные лица не выходят на связь и т. д. В таких условиях успешные команды выполняют работу, даже если позже придётся её переделать и адаптировать, но не тратят время на «ожидание».
«По умолчанию всегда действуй» — мантра, которую мы в Remote продолжаем повторять. Это означает, что если нужно что-то сделать и никто не может помочь или указать, что делать дальше, то используйте здравый смысл и делайте выбор самостоятельно.
Представьте, что есть три задачи, из них хорошо описаны только две, поэтому нужно подождать, чтобы менеджер по продукту точно определил требования.
Пример 6
В этом примере первый разработчик по умолчанию выполняет действие, а второй по умолчанию ожидает. Первый взял в работу какую-то другую задачу, пусть не такую важную. Второй дожидается менеджера, чтобы тот помог описать требования для такой задачи.
Это условный пример, и я хотел бы сказать, что он преувеличен, но нет. Очень распространённая ситуация.
Если действительно нужна помощь со следующей задачей и вы никак не можете найти что-нибудь ещё, ну, лучше использовать это время для личного блага, например, сходить в спортзал, погулять с собакой или посмотреть эпизод любимого сериала (да, даже в течение рабочего дня).
Конечно, некоторые задачи очень тонкие, и если вы не уверены, можно подобрать что-то ещё. Речь не об игнорировании риска, а о том, чтобы брать на себя ответственность контролируемым образом.
Резюме
Асинхронная работа — это способ организовать работу с меньшими перерывами и более высокой эффективностью, основанный на нескольких идеях:
Как научиться работать асинхронно
Разработка программного обеспечения всегда носила асинхронный характер. Это легко заметить, если вы имели опыт работы в традиционном офисе или на удаленке. Но так как сейчас почти все работают удаленно, важно определить понятие асинхронной работы и рассмотреть конкретные советы для тех, кому оно в новинку.
Итак, что же такое асинхронная работа? При работе асинхронно ваша деятельность должна быть распределена таким образом, чтобы она не прерывалась из-за необходимости ждать от кого-то какие-то результаты или разъяснения. Для этого требуются изменения в том, как идет процесс вашей работы. Зачастую нам нравится заниматься только одной задачей за раз до тех пор пока она не будет выполнена, даже если это означает привлечение других людей для немедленного получения необходимой информации. При асинхронной работе это не вариант, поэтому нужно уметь работать над задачей, вычленять, что вам может понадобиться от других, запрашивать эту информацию у нужных людей, а в ожидании ответа переходить к другой задаче.
Но это не значит, что вам не нужно общаться синхронно с выполнением задачи.
Видеоконференции и переписка в чатах являются необходимыми инструментами, но их следует использовать с осторожностью. Джейсон Фрайд (Jason Fried) и Дэвид Хайнемайер Хенссон (DHH) лучше всего об этом выразились в своей книге «Не сходите с ума на работе». Они написали так: «Иногда нужно работать в режиме реального времени, но в большинстве случаев работа должна проходить асинхронно».
Итак, после того как мы разобрались с понятием, вот десять советов, которые помогут вам избежать некоторых распространенных ошибок и быстро запустить продуктивный асинхронный рабочий процесс.
Цели, а не сама деятельность. Многие из тех, кто только начал работать асинхронно чувствуют необходимость выглядеть занятыми. Однако, асинхронная работа заключается в постановке целей, а не в самой деятельности. Сосредоточьтесь только на тех задачах, которые были поручены именно вам, и расслабьтесь. Наслаждайтесь плюсами асинхронной работы. Это сократит количество ненужной болтовни с коллегами, поможет вам лучше работать и позволит наслаждаться новым балансом между работой и личной жизнью.
Работайте в одно и то же время. Когда только начинаете работать удаленно, составьте для себя график работы. Многие компании устанавливают основные рабочие часы для работников на удаленке. Если это ваш случай, это хорошее начало для составления графика: вы можете организовать свою работу примерно в эти основные часы. Как только вы привыкнете к графику, то поймете, что лучше всего вам подходит. Если вы рано встаете, вам может потребоваться сдвинуть расписание больше на утро, или если вы любите поспать, вы можете каждый день без спешки наслаждаться поздним завтраком и работать до заката.
Самодокументируемый код. Есть много способов, которые обеспечивают хорошую асинхронную связь на протяжении жизненного цикла программного обеспечения. Например, вы можете четко писать код или оставлять понятные комментарии к коммитам. Хорошо сделанный жизненный цикл программного обеспечения в принципе сам по себе похож на собрание инженеров. Только вместо вас позвольте «говорить» вами написанному коду и инструментам, которыми вы пользуетесь.
Знайте (и используйте) правильные инструменты. Hangouts и Zoom хороши, но иногда они являются роскошью, которую асинхронные работники должны использовать экономно. Такие инструменты как Slack или Stackoverflow for Teams (для команд разработчиков), а также инструменты управления проектами, такие как Jira или Asana, используются чаще. Эти инструменты позволяют делиться знаниями вне виртуальных встреч, в открытом пространстве, в которое могут войти все в удобное для каждого время, чтобы получить необходимую именно в тот момент информацию.
Картинка стоит тысячи слов. Изображения, ссылки и другие вспомогательные материалы могут иметь большое значение в обсуждении проблемы или вопроса. Смайлики и гифки не просто так пользуются популярностью! Они позволяют нам делиться такими нюансами, которые нельзя передать словами. Точно так же как смайлик может показать ваше настроение, так же скриншоты или даже короткие видео, показывающие техническую проблему, могут предоставить достаточно контекста для ее понимания. Словесное же ее описание той же проблемы может занять у вас вдвое больше времени.
Учитесь у других сотрудников вашей организации или разыщите, где можно связаться с теми, кто уже работает удаленно в асинхронном режиме. В вашем кругу общения, вероятно, есть кто-то, кто хотел бы, чтобы вы купили им обед, чтобы взамен поделиться с вами стратегиями асинхронного режима работы, которые работают для них.
Сократите общение до необходимого объема. Асинхронное общение требует определенное количества информации для определенных людей в определенное время. Продумывайте общение, не вываливайте слишком много информации. Ваши сообщения должны содержать достаточно информации, чтобы охватить вопросы, которые могут возникнуть у собеседника, а также дать разъяснения. Они не должны перегружать получателя ненужной информацией. Внимательно относитесь к сообщениям с пометками «here» (здесь) и «everyone» (для всех) в групповых чатах, а также к пересылке сообщений по электронной почте людям, которые могут иметь лишь косвенный интерес к разговору.
Прозрачность является целью, но разумная конфиденциальность тоже имеет значение. Вы много услышите о прозрачности, являющейся принципом асинхронной работы. Прозрачность имеет значение, но то же можно сказать про конфиденциальность. Я все еще поддерживаю золотое правило работы в виртуальным пространстве: если бы вы не стали делать что-то в реальном офисе, не делайте это и в виртуальном. Если ваш коллега отклоняет пулл реквест, вы не станете во время перерыва на всю комнату отдыха кричать ему: «Да этот пулл реквест был просто отстой!» И с таким же подходом думайте о том, что вы пишете в общие чаты и как обращаетесь там к коллегам. В приведенном выше примере было бы разумнее отправить личное сообщение этому человеку для решения проблемы. Он бы оценил то, что вы сделали все напрямую с ним и что ему не пришлось краснеть из-за критики его работы на публике.
Отключайтесь от сети на время работы. Отключитесь от Интернета, чтобы сосредоточиться и «перезарядиться». Во время асинхронной работы легко отвлечься, поэтому разумно подойдите к управлению уведомлениями. Не бойтесь приостанавливать работу приложений или закрывать их, чтобы сфокусироваться на выполнении одной задачи. Только не забывайте включать Интернет каждые несколько часов, чтобы решать проблемы или отвечать на сообщения, когда это необходимо. Чтобы «перезарядиться» психологически, физически отдалитесь от своего рабочего места, сходите прогуляйтесь. Позвоните маме или старому другу, чтобы мыслями отвлечься ненадолго от работы.
Асинхронный режим работы не значит асоциальный. Целью асинхронной работы является эффективность, но это не значит, что вы не можете повеселиться. Во многих компаниях устраиваются виртуальные вечеринки или счастливые часы, когда коллеги могут расслабиться, поиграть в онлайн игры и познакомиться со своими товарищами по работе на личном уровне. Только потому что большая часть вашей работы проводится в удаленном или асинхронном режиме, не означает, что вам не следует использовать возможности для общения и веселья с коллегами.
Я верю, что пандемия коронавируса во многом изменит мир. Одним из таких изменений будет то, как мы работаем. Многие из нас вынуждены учиться работать асинхронно, поэтому я считаю, что этот навык мы принесем с собой в офис, когда все вернется на круги своя.
Какие лайфхаки по асинхронной работе вы используете?
Узнайте подробности, как получить востребованную профессию с нуля или Level Up по навыкам и зарплате, пройдя онлайн-курсы SkillFactory:
Основные понятия асинхронного программирования
В этой статье мы бегло познакомимся с основными понятиями, связанными с асинхронным программированием и как они применяются в веб браузерах и JavaScript. Вы должны понять эти концепции, прежде чем приступать к другим статьям этого раздела.
Необходимые знания: | Базовая компьютерная грамотность, знакомство с основами JavaScript. |
---|---|
Цель: | Понять основные идеи асинхронного программирования, и как они проявляются в веб-браузерах и JavaScript. |
Что же такое Асинхронность?
Как правило, программный код выполняется последовательно, только одна конкретная операция происходит в данный момент времени. Если функция зависит от результата выполнения другой функции, то она должна дождаться пока нужная ей функция не завершит свою работу и не вернёт результат и до тех пор пока это не произойдёт, выполнение программы, по сути, будет остановлено с точки зрения пользователя.
Такое поведение удручает и говорит о неправильном использовании процессорного времени, к тому же современные компьютеры имеют процессоры с несколькими ядрами. Не нужно ничего ждать, вы можете передать следующую задачу свободному ядру процессора и когда она завершится, то сообщит вам об этом. Такой подход позволяет выполнять разные задачи одновременно, в этом и заключается задача асинхронности в программировании. Программная среда, которую вы используете (браузер в случае веб разработки), должна иметь возможность выполнять различного рода задачи асинхронно.
Блокировка кода
Асинхронные техники очень полезны, особенно при веб разработке. Когда ваше приложение запущено в браузере и выполняет свои задачи, не возвращая контроль окружению, браузер может подвисать. Это называется блокировка; браузер заблокирован и не может реагировать на действия пользователя и выполнять служебные.задачи, до тех пор пока веб приложение не освободит ресурсы процессора.
Давайте рассмотрим несколько примеров, которые покажут, что именно значит блокировка.
В нашем simple-sync.html примере (see it running live), добавим кнопке событие на клик, чтобы при нажатии на неё запускалась трудоёмкая операция (расчёт 10000000 дат, и вывод последней рассчитанной даты на консоль) после чего в DOM добавляется ещё один параграф:
Когда запустите этот пример, откройте JavaScript консоль и нажмите на кнопку — вы заметите, что параграф не появится на странице, до тех пор пока все даты не будут рассчитаны и результат последнего вычисления не будет выведен на консоль. Этот код выполняется в том порядке, в котором он написан в файле и самая последняя операция не будет запущена, пока не завершатся все операции перед ней.
Примечание: Предыдущий пример слишком не реальный. Вам никогда не понадобится считать столько дат в реальном приложении! Однако, он помогает вам понять основную идею.
В нашем следующем примере, simple-sync-ui-blocking.html (посмотреть пример), мы сделаем что-нибудь более реалистичное, с чем вы сможете столкнуться на реальной странице. Мы заблокируем действия пользователя отрисовкой страницы. В этом примере у нас две кнопки:
Если вы быстро нажмёте на первую кнопку и затем быстро кликните на вторую, вы увидите, что предупреждение не появится на странице, пока все круги не будут отрисованы. Первая операция блокирует выполнение следующей до тех пор пока не завершится сама.
Примечание: Хорошо, в приведённом некрасивом примере, мы получили эффект блокировки, который показывает общую проблему при разработке приложений, с которой все время приходится бороться разработчикам.
Почему так происходит? Потому что JavaScript, в общем случае, выполняет команды в одном потоке. Пришло время познакомиться с понятием потока.
Потоки
Под потоком, обычно, понимают одиночный процесс, который может использовать программа, для выполнения своих нужд. Каждый поток может выполнять только одну в текущий момент времени:
Каждая задача будет выполнена последовательно; только когда текущая задача завершится, следующая сможет начаться.
Как мы говорили выше, большинство компьютеров теперь имеют процессор с несколькими ядрами, т.е. могут выполнять несколько задач одновременно. Языки программирования, поддерживающие многопоточность, могут использовать несколько ядер, чтобы выполнять несколько задач одновременно:
JavaScript однопоточный
JavaScript, традиционно для скриптовых языков, однопоточный. Даже, если есть несколько ядер, вы можете использовать их только для выполнения задач в одном потоке, называемом основной поток. Наш пример выше, выполняется следующим образом:
В итоге, JavaScript получил несколько инструментов, которые могут помочь в решении подобных проблем. Web workers позволяют вам обработать некоторый JavaScript-код в отдельном потоке, который называется обработчик, таким образом вы можете запускать отдельные блоки JavaScript-кода одновременно. В основном, вы будете использовать воркеры, чтобы запустить ресурсоёмкий процесс, отдельно от основного потока, чтобы не блокировать действия пользователя.
Помня об этом, выполните наш следующий пример simple-sync-worker.html (посмотреть пример в действии), с открытой консолью. Это переписанный предыдущий пример, который теперь рассчитывает 10 миллионов дат в отдельном потоке обработчика. Теперь, когда вы нажимаете на кнопку, браузер может добавить новый элемент на страницу, до того как все даты будут посчитаны. Самая первая операция больше не блокирует выполнение следующей.
Асинхронный код
Воркеры полезный инструмент, но у них есть свои ограничения. Самое существенное, заключается в том, что они не имеют доступа к DOM — вы не можете использовать воркер для обновления UI. Мы не можем отрисовать миллион наших точек внутри воркера; он может только обработать большой объем информации.
Следующая проблема заключается в том, что даже если код запущенный в воркере ничего не блокирует, он в целом остаётся синхронным. Это проблема появляется, когда какой-то функции требуются результаты выполнения нескольких предыдущих функций. Рассмотрим следующую диаграмму потоков:
В этом примере, предположим Task A делает что-то вроде получения картинки с сервера а Task B затем делает что-нибудь с полученной картинкой, например, применяет к ней фильтр. Если запустить выполняться Task A и тут же попытаться выполнить Task B, то вы получите ошибку, поскольку картинка ещё не будет доступна.
Теперь, давайте предположим, что Task D использует результат выполнения обеих задач Task B и Task C. Если мы уверенны, что оба результата будут доступны одновременно, тогда не возникнет проблем, однако, часто это не так. Если Task D попытаться запустить, когда какого-то нужного ей результата ещё нет, выполнение закончится ошибкой.
Чтобы избежать подобных проблем, браузеры позволяют нам выполнять определённые операции асинхронно. Такие возможности, как Promises позволяют запустить некоторую операцию (например, получение картинки с сервера), и затем подождать пока операция не вернёт результат, перед тем как начать выполнение другой задачи:
Поскольку операция выполняется где-то отдельно, основной поток не блокируется, при выполнении асинхронных задач.
В следующей статье, мы покажем вам, как писать асинхронный код. Захватывает дух, неправда ли? Продолжайте читать!
Заключение
При проектировании современных программ все больше используется асинхронное программирование, чтобы программа имела возможность выполнять несколько операций в конкретный момент времени. Как только вы начнёте использовать новые, более мощные возможности API, вы обнаружите множество ситуаций, где решить нужную задачу можно только асинхронно. Раньше было сложно писать асинхронный код. До сих пор, нужно время, чтобы привыкнуть к такому подходу, но процесс стал намного легче. Далее, в этом разделе, мы будем глубже исследовать вопрос, когда же асинхронный код необходим и как спроектировать программу, чтобы избежать проблем, описанных выше.