Переводим студентов на удаленку за 1 день +2


image

Еще 16 марта мы сидели в уютном оупенспейсе, а уже на следующий день весь офис переехал на удаленку, домой. На хабре достаточно подобных историй. Но специфика нашей ситуации заключается не в переводе сотрудников, а переводе клиентов. Это более трех тысяч студентов, которые пришли учиться на дневном, но в одначасье оказались на заочном.

Что было сделано


Учебным отделом для преподавателей были разработаны методические рекомендации по ведению лекций online. Например, такие как:

Длительность занятий
Если у вас в расписании запланировано было офлайн-занятие длительностью 4 ак.часа, то вы можете сохранить эту длительность для онлайн, однако ввести более длинный перерыв (30-40 минут), чтобы студенты успели отдохнуть.

Если у вас в расписании запланировано было офлайн-занятие длительностью 8 ак.часов (полный день в выходные), то мы рекомендуем разделить занятие на две части (и вести занятия не три, например, раза в неделю, а четыре).

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

Фокусировка внимания
Теоретические занятия в онлайне максимально похожи на офлайн, но– однако стоит учесть, что фокус внимания в онлайне еще короче, чем в офлайне. Поэтому мы рекомендуем проводить лекции с интерактивным форматом: например, 15-20 минут теоретического материала, после которого следует дискуссия, вовлекающая в обсуждение всех студентов.

Интерактивные занятия лучше всего проводить в малых группах (10-12 человек). Если у вас большая группа (30+ человек), то лучше «разбить» группу на две части и провести, например, первые 2 ак.часа с первой половиной и вторые 2 ак.часа – с другой.

Огромная работа легла на сотрудников первой и второй линии поддержки. В одночасье на поддержке оказались тысячи личных устройств пользователей, на которых надо помочь установить необходимый софт, выдать лицензии на специфическое ПО и еще, внезапно, Zoom не работает в Крыму (кто успел туда уехать), Опера c встроенным VPN`ом помогают.

В качестве основной платформы был выбран Zoom.

Изначально остро встал вопрос с планированием занятий, созданием конференций и информированием всех студентов и проеподавателей.

image

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

image

А так, когда оно снова стало вестись в 1с

Спасибо моему коллеге, что он оперативно раскурил API Zoom`а и прикрутил автоматическое создание конференции в соответствии с расписанием. А так же автоинформирование об этом.

А тут ссылка на труды Сергея, как с помощью Zoom API можно создавать конференции.

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

image

Интерфейс расписания интегрированного с 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);
}


image

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

Выводы


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




К сожалению, не доступен сервер mySQL