Turni di reperibilità rotanti per Operazioni e Supporto Un must per i team di dati.

Rotating on-call shifts for Operations and Support a must for data teams.

Un programma di turni per le chiamate di supporto operativo e tecnico libera il resto del team per sviluppare grandi progetti

Una sfida comune per ogni team di scienze dei dati o di prodotto è quella di allineare i nuovi (sviluppo di prodotto) con i vecchi (operativi, supporto) compiti. Quando l’intero team è incaricato di gestire entrambi, significa che da un lato il team deve rispettare una scadenza di prodotto e lanciare una nuova funzionalità del prodotto mentre, allo stesso tempo, ci si aspetta che il team lavori operativamente e risolva i problemi esistenti e supporti domande e chiamate commerciali. Questa situazione causa interruzioni impreviste e, alla fine, porta a una minore efficienza, scadenze mancate e stress.

Nella pratica, ciò porta spesso a una situazione in cui alcuni membri del team assumono questi compiti aggiuntivi o sono specializzati per farlo. Ma ciò è pericoloso perché non appena uno di questi membri del team specializzati va in vacanza, l’intera azienda potrebbe sentirne l’effetto e avere un problema.

Pertanto, un team di dati efficiente e scalabile deve supportare sia il lavoro operativo che quello di sviluppo nuovo e creare un sistema che includa:

  • Buona condivisione della conoscenza tra i membri del team su come svolgere il lavoro operativo e supportare prodotti / clienti
  • Lavoro di sviluppo non interrotto senza molte interruzioni di contesto
  • Lavoro di manutenzione ben definito e stimato per evitare scadenze impreviste

Il sistema di turni

Un sistema che si è rivelato molto efficace per noi in passato è un sistema di turni che gestisce più di “solo” avvisi in produzione. In parole povere, si tratta di un sistema rotativo in cui uno (o più) membri del team sono i sopravvissuti designati per un periodo specifico e sono responsabili esclusivamente del lavoro operativo.

La persona di turno non sta solo svolgendo un lavoro, sta proteggendo l’intero team da tutto il caos che accade al di fuori del lavoro di sviluppo

Per concludere questo punto, questo sistema consente che solo la persona di turno (il sopravvissuto designato) gestisca tutto il lavoro che non rientra nel “nuovo sviluppo”. Durante quel periodo, la persona di turno non sta solo svolgendo un lavoro, sta proteggendo l’intero team da tutto il caos che accade al di fuori del lavoro di sviluppo, tra cui:

  • Risolvere i problemi del flusso di produzione
  • Rispondere alle domande commerciali / dei clienti
  • Supportare le chiamate dei clienti
  • Ridurre il backlog del dipartimento tecnico
Panoramica delle attività specifiche che fanno parte della routine di turno.

Come si può vedere nella figura sopra, la gestione del sistema di turno “classico” e assicurarsi che l’ambiente di produzione funzioni è ancora la cosa più importante. Tuttavia, se non ci sono problemi in produzione, questo libera per altre attività come il supporto alle richieste commerciali, le chiamate dei clienti o la riduzione del backlog.

Quali sono i benefici?

Cambiare al sistema all’inizio potrebbe non essere facile. Non tutti i membri del team possono assumersi la responsabilità del flusso di produzione, del supporto commerciale e del dipartimento tecnico. Ma questo non dovrebbe essere un blocco. È importante comunicare correttamente che la persona di turno possiede questi elementi ed è la prima linea di difesa ma può chiedere aiuto in qualsiasi momento.

A lungo termine, questo porterà molti benefici al team e all’intera organizzazione. I benefici più ovvi sono che sarà molto più facile stimare il lavoro di sviluppo e che il team diventerà più efficiente (meno interruzioni di contesto). Questo vale anche per il lato operativo in cui il numero di persone che fanno parte del sistema di turno definisce quanto lavoro operativo è possibile. Ciò rende la comunicazione con l’azienda e gli stakeholder molto più facile perché un team di 5 persone con 1 persona in rotazione significa che 1 su 5 FTE sta mantenendo tutti i sistemi e il lavoro correlato ai prodotti esistenti (20% operativo, 80% di sviluppo). È facile tenerne conto e stimare.

Schema di distribuzione operativa-sviluppo del 20%-80% in un team che utilizza la rotazione su chiamata.

Tuttavia, ci sono altri benefici che si verificano nel tempo, quasi come effetti collaterali. Tutti i membri del team diventeranno data scientist full-stack. La ragione è che ogni membro del team deve comprendere un certo minimo di prodotti, clienti, sistemi, modelli/logica e infrastruttura del codice coinvolti. Non devono essere esperti, ma alla fine diventeranno abbastanza bravi da gestirli da soli per almeno 1 settimana. Ciò garantirà anche che non sia affatto un problema quando un membro prezioso del team va in vacanza, poiché la persona di turno avrà sempre il supporto del team.

Inoltre, anche se questo periodo di on-call potrebbe essere a volte un po’ più stressante, dà all’ data scientist l’opportunità di vedere cosa c’è fuori dal team e di collaborare con il lato commerciale e i clienti. Questa può essere un’esperienza molto preziosa e gratificante.

Come impostare un tale sistema?

Qui diventa un po’ tecnico (per le persone a cui piace il codice, basta scorrere fino alla fine). L’installazione di un tale sistema è piuttosto semplice ma potrebbe implicare un po’ di codifica. La parte più importante è la comunicazione con il team e gli stakeholder e informarli su come funzionerà.

Dal momento che l’intero punto del sistema è supportare il team, e non creare ulteriori sovraccarichi, consiglio vivamente di automatizzarlo completamente. Per farlo, avresti bisogno di avere almeno 3 sistemi in funzione:

  • Un sistema di allarme collegato alla produzione che avvisa quando la produzione fallisce (ad esempio, Opsgenie o Pagerduty )
  • Un sistema di pianificazione che rileva chi è di turno e può comunicarlo ad un altro sistema (ad esempio, Apache Airflow o Keboola )
  • Una piattaforma di comunicazione che viene utilizzata per raggiungere il tuo team e per creare ticket (ad esempio, Slack o Teams )

Se hai questi sistemi in funzione e hai l’accesso API al sistema di allarme e alla piattaforma di comunicazione, allora sei quasi a posto. L’unica cosa rimasta da fare è impostare un lavoro nel sistema di pianificazione che esegue una chiamata API prima per ottenere chi è di turno dal sistema di allarme e un API push successivamente per comunicare o sovrascrivere canali/gruppi/tag nella piattaforma di comunicazione.

Di seguito è riportato un esempio di come può apparire una semplice chiamata API che ti fornirà la persona di turno da Opsgenie:

curl -X GET \'https://api.opsgenie.com/v2/schedules/{schedule_name}/on-calls?scheduleIdentifierType=name&flat=true' \--header 'Authorization: GenieKey {token}'

Dopo di che, vuoi eseguire un comando che faccia qualcosa nel tuo sistema di comunicazione. Ad esempio, in Slack, sovrascrivi un gruppo utenti in modo che contenga solo l’utente di turno:

curl -X POST \-F usergroup={usergroup} \-F users={user} \'https://slack.com/api/usergroups.users.update' \-H 'Authorization: Bearer {token}'

Alla fine di questa storia, troverai una versione completa del codice su come questo codice può essere pianificato automaticamente. Ciò garantirà che ogni volta che qualcuno tagga il tuo gruppo su Slack (come @ team ), solo la persona di turno verrà taggata e potrà decidere se è necessario notificare altri membri del team. Consente anche di aggiungere rapidamente nuovi compiti al dag. Ad esempio, quando vuoi notificare l’azienda o il team chi è di turno ora o se vuoi adattare il tuo sistema di ticketing di conseguenza.

Sommario

Avere un programma di rotazione per il lavoro operativo, commerciale e tecnico del team sta rendendo il tuo team dati più efficiente. Ridurrà lo switch di contesto e consentirà stime di tempo migliori. Inoltre, educerà i data scientist full-stack che sono sicuri di gestire una vasta gamma di problemi per proteggere il resto del team.

Tutte le immagini, salvo diversa indicazione, sono dell’autore.

Appendice del codice:

Esempio di un dag Airflow che recupera la persona di turno da Opsgenie e sovrascrive un gruppo utenti in Slack per contenere solo quella persona. La codifica non è certamente perfetta (Data Scientist al lavoro) ma sono sicuro che lo capirete:

# Importfrom airflow import DAG, XComArgfrom typing import Dict, Listfrom airflow.operators.bash import BashOperatorfrom airflow.operators.python import PythonOperatorfrom airflow.models import Variableimport json# Fetch secret tokensslack_token = Variable.get("slack_token")opsgenie_token = Variable.get("opsgenie_token")# Setup DAGdag = DAG(    dag_id,    schedule_interval=schedule_interval,    default_args=default_args,    catchup=catchup,    max_active_runs=max_active_runs,)with dag:        # Run BashOperator fetching from Opsgenie who is on call    def fetch_who_is_on_call(**kwargs):        fetch_who_is_on_call_bash = BashOperator(            task_id="fetch_who_is_on_call_bash",            bash_command="""            curl -X GET \            'https://api.opsgenie.com/v2/schedules/{schedule_name}/on-calls?scheduleIdentifierType=name&flat=true' \             --header 'Authorization: GenieKey {token}'            """.format(                schedule_name="schedule_name",                 token=opsgenie_token             ),            dag=dag,        )        return_value = fetch_who_is_on_call_bash.execute(context=kwargs)        fetch_who_is_on_call_bash        return return_value    # run BashOperator in PythonOperator and provide context    opsgenie_pull = PythonOperator(        task_id="opsgenie_pull",        python_callable=fetch_who_is_on_call,        provide_context=True,        dag=dag,    )        # Overwrite slack group with the person on call    def overwrite_slack_group(**kwargs):                # First: get who is on call from PythonOperator        ti = kwargs.get("ti")        xcom_return = json.loads(ti.xcom_pull(task_ids="opsgenie_pull"))        user_email = xcom_return["data"]["onCallRecipients"][0]        user_dict = {            "data_scientist_a": "A03BU00KGK4",            "data_scientist_b": "B03BU00KGK4",        }        user_id = [            user_dict[k] for k in user_dict.keys() if k == user_email.split(".")[0]        ]                # Second: Run BashOperator to overwrite slack group        overwrite_slack_group_bash = BashOperator(            task_id="overwrite_slack_group_bash",            bash_command="""            curl -X POST \            -F usergroup={usergroup} \            -F users={user} \            https://slack.com/api/usergroups.users.update \            -H 'Authorization: Bearer {token}'            """.format(                usergroup="usergroup_id",                user=user_id,                token=slack_token,            ),            dag=dag,        )        overwrite_slack_group_bash.execute(context=kwargs)        overwrite_slack_group_bash    # Run BashOperator for slack overwrite in PythonOperator    overwrite_slack = PythonOperator(        task_id="overwrite_slack",        python_callable=overwrite_slack_group,        provide_context=True,        dag=dag,    )    opsgenie_pull >> overwrite_slack    return dag