davidedisommaprima
    • Create new note
    • Create a note from template
      • Sharing URL Link copied
      • /edit
      • View mode
        • Edit mode
        • View mode
        • Book mode
        • Slide mode
        Edit mode View mode Book mode Slide mode
      • Customize slides
      • Note Permission
      • Read
        • Only me
        • Signed-in users
        • Everyone
        Only me Signed-in users Everyone
      • Write
        • Only me
        • Signed-in users
        • Everyone
        Only me Signed-in users Everyone
      • Engagement control Commenting, Suggest edit, Emoji Reply
    • Invite by email
      Invitee

      This note has no invitees

    • Publish Note

      Share your work with the world Congratulations! 🎉 Your note is out in the world Publish Note

      Your note will be visible on your profile and discoverable by anyone.
      Your note is now live.
      This note is visible on your profile and discoverable online.
      Everyone on the web can find and read all notes of this public team.
      See published notes
      Unpublish note
      Please check the box to agree to the Community Guidelines.
      View profile
    • Commenting
      Permission
      Disabled Forbidden Owners Signed-in users Everyone
    • Enable
    • Permission
      • Forbidden
      • Owners
      • Signed-in users
      • Everyone
    • Suggest edit
      Permission
      Disabled Forbidden Owners Signed-in users Everyone
    • Enable
    • Permission
      • Forbidden
      • Owners
      • Signed-in users
    • Emoji Reply
    • Enable
    • Versions and GitHub Sync
    • Note settings
    • Note Insights New
    • Engagement control
    • Make a copy
    • Transfer ownership
    • Delete this note
    • Save as template
    • Insert from template
    • Import from
      • Dropbox
      • Google Drive
      • Gist
      • Clipboard
    • Export to
      • Dropbox
      • Google Drive
      • Gist
    • Download
      • Markdown
      • HTML
      • Raw HTML
Menu Note settings Note Insights Versions and GitHub Sync Sharing URL Create Help
Create Create new note Create a note from template
Menu
Options
Engagement control Make a copy Transfer ownership Delete this note
Import from
Dropbox Google Drive Gist Clipboard
Export to
Dropbox Google Drive Gist
Download
Markdown HTML Raw HTML
Back
Sharing URL Link copied
/edit
View mode
  • Edit mode
  • View mode
  • Book mode
  • Slide mode
Edit mode View mode Book mode Slide mode
Customize slides
Note Permission
Read
Only me
  • Only me
  • Signed-in users
  • Everyone
Only me Signed-in users Everyone
Write
Only me
  • Only me
  • Signed-in users
  • Everyone
Only me Signed-in users Everyone
Engagement control Commenting, Suggest edit, Emoji Reply
  • Invite by email
    Invitee

    This note has no invitees

  • Publish Note

    Share your work with the world Congratulations! 🎉 Your note is out in the world Publish Note

    Your note will be visible on your profile and discoverable by anyone.
    Your note is now live.
    This note is visible on your profile and discoverable online.
    Everyone on the web can find and read all notes of this public team.
    See published notes
    Unpublish note
    Please check the box to agree to the Community Guidelines.
    View profile
    Engagement control
    Commenting
    Permission
    Disabled Forbidden Owners Signed-in users Everyone
    Enable
    Permission
    • Forbidden
    • Owners
    • Signed-in users
    • Everyone
    Suggest edit
    Permission
    Disabled Forbidden Owners Signed-in users Everyone
    Enable
    Permission
    • Forbidden
    • Owners
    • Signed-in users
    Emoji Reply
    Enable
    Import from Dropbox Google Drive Gist Clipboard
       Owned this note    Owned this note      
    Published Linked with GitHub
    • Any changes
      Be notified of any changes
    • Mention me
      Be notified of mention me
    • Unsubscribe
    # IVR ### Lato tecnico 3 October - 1195 BUG 691 15 September - 1120 Cambio messaggi 688 1 September - 1155 BUG 11 August - 1074 Flusso purchase info 701 5 July - 1014 - Flusso documenti 411 13 June - 973 - Flusso documenti 453 2 May - 917 - Flusso documenti 409 Cosa non riuscivamo a fare? - Partire dal caso dell'ultima modifica su Information che è stato modifica - Spiegare perchè è stato un problema - Spiegare come il refactoring abbia migliorato - Raccogliere metriche a supporto - Mettere esempi a supporto delle proprie affermazioni, magari mostrando meno argomenti #### prima - L'implementazione era un albero di moduli. - ogni volta che ci si ferma in un punto del albero per richiedere un input all'utente, - si riparte dalla radice una volta che questi ha fornito l'input e non a partire dall'ultimo punto visitato riapplicando tutti gli input già ricevuti e non solo l'ultimo. - Il codice era diventato estremamente **convoluto** - perchè deve tener conto che per ciascun punto si può passare più volte - ma solo al primo passaggio si devono fare azioni (e.g. richiamare servizi esterni, modificare stato interno call) - nelle altre situazioni deve fare da semplice pass-through - La complicazione del codice aveva negativi effetti collaterali - ad avere **moduli grossi** perchè c'era molto accoppiamento nel codice (e bassa coesione). Di fatto spesso ogni flusso era implementato in un singolo modulo (e.g. Information 700+). - i **test unitari** erano di conseguenza complicati e ognuno testava più comportamenti: - la fase di setup di ciascuno di essi era enorme, molti mock da programmare => non svolgevano appieno alla loro funzione di documentazione - alcuni scenari non avevano una copertura ideale: o per il costo di ogni test o per svista dovuta alla troppa complessità - **Problemi di design**: il costo di una modifica cresceva esponenzialmente alla complessità del codice dove si inseriva. - *Fragility*: Il codice era fragile, una modifica da una parte poteva creare un bug dall'altra - *Rigidity*: una modifica in un punto del sistema forza modifiche anche in altre parti del sistema - *Opacity*: il codice era poco leggibile: flussi complessi (e.g. Information) ci voleva grande attenzione, energia e tempo per comprenderli - *Immobility*: era difficile disaccoppiare parte di codice utili da altre parti - Potenziali regressioni quando si doveva lavorare su moduli già esistenti - **Dopo** - Con l'introduzione della **FSM** adesso viene salvato l'ultimo modulo visitato prima di chiedere qualche input al customer e quando questi dà un nuovo input si riparte dall'ultimo modulo visitato - Le responsabilità sono distribuite su più moduli e ognuno è molto più granulare (non ancora single responsability ma si può migliorare) - codice più leggibile, meno fragile, meno rigido, meno immobile - i test unitari sono molto più semplici e comprensibili (uso libreria Mock) => svolgono appieno il loro compito di documentazione - i test unitari hanno una copertura maggiore perchè il codice da testare è più semplice - Permette i cicli (e.g. vedi ultimo sviluppo sul queue loop CMOEX-35) - **Mettere qualche nota su possibili potenzialità future della FSM?** ### Lato processo di sviluppo - test di accettazione - **Prima** - Non erano specificati in fase di creazione della card - per ogni card al momento della fase di testing veniva specificato tra tester e developer cosa doveva essere testato e cosa no. - di solito era ampio il set di scenari di test a causa della fragilità del codice (**NO**) - più tempo dedicato al testing manuale (**NO**) - **Dopo** - **Gherkhin tests**: i test sono specificati prima che la card vada in progress - E' più facile valutare la profondità dell'impatto di una card perchè il numero di test è una misura della complessità del lavoro - Con la FSM siamo molto più confidenti che una modifica impatti solo nel punto del grafo dove è applicata. Vengono fatti meno test di non-regressione (**NO**) - Diagrammi IVR - **Prima** - scritti prima dell'implementazione da parte di persone del business - => non sempre chiari per uno sviluppatore - non rispecchiavano come venivano poi implementati su codice - a posteriori integrate da post-it che peggioravano la leggibilità - tendevano a non essere aggiornati in modo adeguato - **Dopo** - scritti a 4 mani tra una persona del business e una di sviluppo - sono più descrittivi che in precedenza - rispecchiano il workflow implementato sul codice - sono il punto di contatto tra business e development - (per il momento) sono continuamente aggiornati e in sync col codice ### IVR implementato come un albero di moduli. Funzionamento: Si parte dal nodo radice Quando c'è bisogno di un input ci si ferma Non viene salvato lo stato Quando viene fornito l'input si riparte comunque dalla radice riapplicando tutti gli input ricevuti durante la chiamata. Bisognava garantire che ripartendo dalla radice dopo ogni nuovo input si ripercorresse lo stesso percorso precedente si evitassero di rifare chiamate esterne l'aggregato della Call era diventato uno stato mutabile per evitare side-effects ### Breakthrough Consapevolezza che a lungo andare non saremmo riusciti a soddisfare i desideri del business e i requisiti di qualità Certezza che nel 2023 ci sarebbero stati rami nuovi. Lato tecnico siamo stati proattivi proponendo una pura riscrittura dell'esistente nessun cambiamento di comportamento Il business ha acconsentito di fermare le evoluzioni IVR in Q1 ### Solution implemented IVR è implementato come un grafo di moduli. Si parte dal nodo radice Quando c'è bisogno di un input ci si ferma e viene salvato lo stato nella tabella DB della Call Quando viene fornito l'input si riparte dall stato salvato in precedenza (as videogame) ### Presentazione Benvenuti a questa presentazione dove racconteremo le evoluzioni tecniche che ci sono state sull'IVR di Squillo. Premessa: - I'll try to do my best shot but if something is not clear enough, please stop me. For any other curiosity or further details please wait the end of the presentation to ask them ### 1 A bit of history - Squillo è andato online la prima volta Nov. 2020 - Inizialmente era un router dove a secondo dei digit premuti finivi in un flusso e poi inevitabilmente ad un operatore. - Col tempo una serie di automazioni via via più complesse sono state introdotte per dare informazioni ai clienti senza coinvolgere l'operatore e senza far aspettare il customer ### 2 what was going on at that time? **But when we start implementing features that were not foreseen when the design was conceived the problems started to arrive.** Nei metodi agili non si fa design “up front” ma si fa “design continuo”, ovvero “design evolutivo” (evolutionary design): il design del sistema cresce man mano che il sistema stesso viene realizzato. Questo ci consente di mantenere il sw in uno stato tale da essere sempre modificabile a basso costo. (**Evolutionary design allows us to keep the sw in a state where it can always be modified at low cost.**) Il design è parte del processo di sviluppo, e man mano che il programma evolve, il design cambia ed evolve di pari passo. ### 3 Consequences for the business - I primi due punti erano a seguito del debito tecnico accumulato - **Before that moment we had realised the limitations of the system** - Il terzo era già noto che troppo complessità era ingestibile - In ogni caso aveva dei limiti - to keep riding the same route meant that development times would have become longer and less predictable ### 4 How did it work? Perchè Il design dll'IVR era diventato un problema? Perchè prima andava bene e poi non più fino al punto di non essere in grado di fare più nulla? Come funzionava? Premessa: - Prendiamo il caso di un utente che chiama per avere informazioni sul rimborso di una policy interruption? Il caso è semplificato rispetto alla realtà - Per far vedere come funzionava vi mostrerò - una astrazione del nostro flusso IVR come era implementato e come veniva percorso - i dati collezionati nel frattempo #### 4.4 Notate che dove c'è automazione c'è complessità e i dati servono per dare informazioni Ma cosa succede se il customer non è soddisfatto e vuole parlare con un operatore? #### 4.5 Voglio fare lo stesso percorso precedente ma evitando di fare dispendiose chiamate esterne già fatte. Per far questo introduco molta logica condizionale e mi serve conservare dati. Tutto questo perchè parto dall'inizio a ripercorrere il flusso IVR: ma mi serve? Non è che questa è solo needless complexity. ### 5 Implementation issues ### 6 the breakthrough - Consapevolezza che a lungo andare non saremmo riusciti a soddisfare i desideri del business e i requisiti di qualità - Certezza che nel 2023 ci sarebbero stati rami nuovi. - Lato tecnico siamo stati proattivi proponendo una pura riscrittura dell'esistente nessun cambiamento di comportamento - Il business ha acconsentito di fermare le evoluzioni IVR in Q1 ### 7 Solution proposed: FSM - In questa nuova soluzione si è cercato di rimuovere quella che era una needless complexity: partire sempre dalla radice nel percorrere il flusso IVR - Ogni volta che ci ferma si salva il modulo dove ci si ferma nella call ### How we improved are way of warking Previously, diagrams were written by a person from the business. - They were high level, - there were not so many details - During implementation to know details developers kept asking to business - After implementation they were no good as documentation. It was so easy to misunderstand Now IVR diagrams are written by a person from the business and one from development. - take into account the views of both parties in all details. - they are much more precise

    Import from clipboard

    Paste your markdown or webpage here...

    Advanced permission required

    Your current role can only read. Ask the system administrator to acquire write and comment permission.

    This team is disabled

    Sorry, this team is disabled. You can't edit this note.

    This note is locked

    Sorry, only owner can edit this note.

    Reach the limit

    Sorry, you've reached the max length this note can be.
    Please reduce the content or divide it to more notes, thank you!

    Import from Gist

    Import from Snippet

    or

    Export to Snippet

    Are you sure?

    Do you really want to delete this note?
    All users will lose their connection.

    Create a note from template

    Create a note from template

    Oops...
    This template has been removed or transferred.
    Upgrade
    All
    • All
    • Team
    No template.

    Create a template

    Upgrade

    Delete template

    Do you really want to delete this template?
    Turn this template into a regular note and keep its content, versions, and comments.

    This page need refresh

    You have an incompatible client version.
    Refresh to update.
    New version available!
    See releases notes here
    Refresh to enjoy new features.
    Your user state has changed.
    Refresh to load new user state.

    Sign in

    Forgot password

    or

    By clicking below, you agree to our terms of service.

    Sign in via Facebook Sign in via Twitter Sign in via GitHub Sign in via Dropbox Sign in with Wallet
    Wallet ( )
    Connect another wallet

    New to HackMD? Sign up

    Help

    • English
    • 中文
    • Français
    • Deutsch
    • 日本語
    • Español
    • Català
    • Ελληνικά
    • Português
    • italiano
    • Türkçe
    • Русский
    • Nederlands
    • hrvatski jezik
    • język polski
    • Українська
    • हिन्दी
    • svenska
    • Esperanto
    • dansk

    Documents

    Help & Tutorial

    How to use Book mode

    Slide Example

    API Docs

    Edit in VSCode

    Install browser extension

    Contacts

    Feedback

    Discord

    Send us email

    Resources

    Releases

    Pricing

    Blog

    Policy

    Terms

    Privacy

    Cheatsheet

    Syntax Example Reference
    # Header Header 基本排版
    - Unordered List
    • Unordered List
    1. Ordered List
    1. Ordered List
    - [ ] Todo List
    • Todo List
    > Blockquote
    Blockquote
    **Bold font** Bold font
    *Italics font* Italics font
    ~~Strikethrough~~ Strikethrough
    19^th^ 19th
    H~2~O H2O
    ++Inserted text++ Inserted text
    ==Marked text== Marked text
    [link text](https:// "title") Link
    ![image alt](https:// "title") Image
    `Code` Code 在筆記中貼入程式碼
    ```javascript
    var i = 0;
    ```
    var i = 0;
    :smile: :smile: Emoji list
    {%youtube youtube_id %} Externals
    $L^aT_eX$ LaTeX
    :::info
    This is a alert area.
    :::

    This is a alert area.

    Versions and GitHub Sync
    Get Full History Access

    • Edit version name
    • Delete

    revision author avatar     named on  

    More Less

    Note content is identical to the latest version.
    Compare
      Choose a version
      No search result
      Version not found
    Sign in to link this note to GitHub
    Learn more
    This note is not linked with GitHub
     

    Feedback

    Submission failed, please try again

    Thanks for your support.

    On a scale of 0-10, how likely is it that you would recommend HackMD to your friends, family or business associates?

    Please give us some advice and help us improve HackMD.

     

    Thanks for your feedback

    Remove version name

    Do you want to remove this version name and description?

    Transfer ownership

    Transfer to
      Warning: is a public team. If you transfer note to this team, everyone on the web can find and read this note.

        Link with GitHub

        Please authorize HackMD on GitHub
        • Please sign in to GitHub and install the HackMD app on your GitHub repo.
        • HackMD links with GitHub through a GitHub App. You can choose which repo to install our App.
        Learn more  Sign in to GitHub

        Push the note to GitHub Push to GitHub Pull a file from GitHub

          Authorize again
         

        Choose which file to push to

        Select repo
        Refresh Authorize more repos
        Select branch
        Select file
        Select branch
        Choose version(s) to push
        • Save a new version and push
        • Choose from existing versions
        Include title and tags
        Available push count

        Pull from GitHub

         
        File from GitHub
        File from HackMD

        GitHub Link Settings

        File linked

        Linked by
        File path
        Last synced branch
        Available push count

        Danger Zone

        Unlink
        You will no longer receive notification when GitHub file changes after unlink.

        Syncing

        Push failed

        Push successfully