
Еще 16 марта мы сидели в уютном оупенспейсе, а уже на следующий день весь офис переехал на удаленку, домой. На хабре достаточно подобных историй. Но специфика нашей ситуации заключается не в переводе сотрудников, а переводе клиентов. Это более трех тысяч студентов, которые пришли учиться на дневном, но в одначасье оказались на заочном.
Что было сделано
Учебным отделом для преподавателей были разработаны методические рекомендации по ведению лекций online. Например, такие как:
Длительность занятий
Если у вас в расписании запланировано было офлайн-занятие длительностью 4 ак.часа, то вы можете сохранить эту длительность для онлайн, однако ввести более длинный перерыв (30-40 минут), чтобы студенты успели отдохнуть.
Если у вас в расписании запланировано было офлайн-занятие длительностью 8 ак.часов (полный день в выходные), то мы рекомендуем разделить занятие на две части (и вести занятия не три, например, раза в неделю, а четыре).
Если у вас большая группа, то мы рекомендуем ее разделить и провести более короткие занятия, но с большой интенсивностью и плотностью взаимодействия внутри группы.
Если у вас в расписании запланировано было офлайн-занятие длительностью 8 ак.часов (полный день в выходные), то мы рекомендуем разделить занятие на две части (и вести занятия не три, например, раза в неделю, а четыре).
Если у вас большая группа, то мы рекомендуем ее разделить и провести более короткие занятия, но с большой интенсивностью и плотностью взаимодействия внутри группы.
Фокусировка внимания
Теоретические занятия в онлайне максимально похожи на офлайн, но– однако стоит учесть, что фокус внимания в онлайне еще короче, чем в офлайне. Поэтому мы рекомендуем проводить лекции с интерактивным форматом: например, 15-20 минут теоретического материала, после которого следует дискуссия, вовлекающая в обсуждение всех студентов.
Интерактивные занятия лучше всего проводить в малых группах (10-12 человек). Если у вас большая группа (30+ человек), то лучше «разбить» группу на две части и провести, например, первые 2 ак.часа с первой половиной и вторые 2 ак.часа – с другой.
Интерактивные занятия лучше всего проводить в малых группах (10-12 человек). Если у вас большая группа (30+ человек), то лучше «разбить» группу на две части и провести, например, первые 2 ак.часа с первой половиной и вторые 2 ак.часа – с другой.
Огромная работа легла на сотрудников первой и второй линии поддержки. В одночасье на поддержке оказались тысячи личных устройств пользователей, на которых надо помочь установить необходимый софт, выдать лицензии на специфическое ПО и еще, внезапно, Zoom не работает в Крыму (кто успел туда уехать), Опера c встроенным VPN`ом помогают.
В качестве основной платформы был выбран Zoom.
Изначально остро встал вопрос с планированием занятий, созданием конференций и информированием всех студентов и проеподавателей.

Вот так выглядело расписание Zoom лекций первые несколько дней. В котором все конференции создавались вручную

А так, когда оно снова стало вестись в 1с
Спасибо моему коллеге, что он оперативно раскурил API Zoom`а и прикрутил автоматическое создание конференции в соответствии с расписанием. А так же автоинформирование об этом.
А тут ссылка на труды Сергея, как с помощью Zoom API можно создавать конференции.
Я в свою очередь хочу поделиться опытом по интергации платформы в Android приложение.
В нашем юзер-кейсе это оказалось очень удобно, т.к. конференции создаются на сервере и их идентификаторы передаются в расписание на телефоне.

Интерфейс расписания интегрированного с Zoom
Теперь посмотрим как это работает.
Исходный код
1. Импортируем две библиотеки из SDK: commonlib и mobilertc. Это, наверно, самый печальный этап, т.к. ваше приложение становится тяжелее на 80 мегабайт.
2. Имплементируем InitAuthSDKCallback, MeetingServiceListener в нашу активити или фрагмент. Для работы зума нужен минимальный API 21 (В документации на сайте указан minSdkVersion 16, но ее не очень оперативно обновляют, лучше ориентироваться на примеры в семплах идущих с SDK).
При создании фрагмента инициализируем SDK
Инициализация Zoom SDK
private View view; private ZoomSDK mZoomSDK; @Override public View onCreateView( LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { view = inflater.inflate(R.layout.fragment_first, container, false); mZoomSDK = ZoomSDK.getInstance(); if (mZoomSDK.isLoggedIn()) { getActivity().onBackPressed(); return null; } InitAuthSDKHelper.getInstance().initSDK(getContext(), this); if (mZoomSDK.isInitialized()) { ZoomSDK.getInstance().getMeetingService().addListener(this); ZoomSDK.getInstance().getMeetingSettingsHelper().enable720p(true); } return view; }
Для этого созаем класс InitAuthSDKHelper и вызываем функцию:
initSDK
public void initSDK(Context context, InitAuthSDKCallback callback) { if (!mZoomSDK.isInitialized()) { mInitAuthSDKCallback = callback; ZoomSDKInitParams initParams = new ZoomSDKInitParams(); // initParams.jwtToken = SDK_JWTTOKEN; initParams.appKey = SDK_KEY; initParams.appSecret = SDK_SECRET; initParams.enableLog = true; initParams.logSize = 50; initParams.domain = WEB_DOMAIN; initParams.videoRawDataMemoryMode = ZoomSDKRawDataMemoryMode.ZoomSDKRawDataMemoryModeStack; mZoomSDK.initialize(context, this, initParams); } }
Тут обратим внимание на следующие параметры:
appKey и appSecret — это идентификатор и секретный ключ вашего приложения, которое вы создаете на сайте зума (занимает примерно 1 минуту), зарегитрировавшись как разработчик.
На практике настоятельно не рекомендуется использовать их для идентификации.
Вместо них следует использовать параметр jwtToken, как это сделать написано тут.
Подключение к конференции
private AutoCompleteTextView idMeeting; private AutoCompleteTextView idDisplayName; private void onClickJoin() { if(!mZoomSDK.isInitialized()) { Toast.makeText(getContext(),"ZoomSDK has not been initialized successfully",Toast.LENGTH_SHORT).show(); InitAuthSDKHelper.getInstance().initSDK(getContext(), this); return; } if (ZoomSDK.getInstance().getMeetingSettingsHelper().isCustomizedMeetingUIEnabled()) { ZoomSDK.getInstance().getSmsService().enableZoomAuthRealNameMeetingUIShown(false); } else { ZoomSDK.getInstance().getSmsService().enableZoomAuthRealNameMeetingUIShown(true); } String number = idMeeting.getText().toString(); String name = idDisplayName.getText().toString(); JoinMeetingParams params = new JoinMeetingParams(); params.meetingNo = number; params.displayName = name; ZoomSDK.getInstance().getMeetingService().joinMeetingWithParams(getContext(), params); }

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