Perché è necessario “𝚞𝚜𝚎 𝚜𝚝𝚎𝚙”? Qualcuno ha fatto notare che i passaggi in un flusso di lavoro sono come “checkpoint di spawn” in un videogioco. Buona analogia. Una conseguenza interessante del contrassegnare una funzione come “𝚞𝚜𝚎 𝚠𝚘𝚛𝚔𝚏𝚕𝚘𝚠” è che non ti è permesso fare I/O al di fuori dei passaggi. I flussi di lavoro devono essere privi di effetti collaterali e deterministici. Ogni volta che 𝚊𝚠𝚊𝚒𝚝, quella funzione deve essere un passaggio. Queste chiamate di funzione possono essere considerate come continuazioni serializzabili. Gli input e gli output di queste funzioni sono registrati in un log. Pensa a JSON. Se hai un flusso di lavoro con 3 passaggi e l'ultimo fallisce, dobbiamo essere in grado di “ri-eseguire” l'intera funzione e avere un perfetto controllo sullo stato del mondo. In questo modo, “𝚞𝚜𝚎 𝚜𝚝𝚎𝚙” è in realtà molto simile a “𝚞𝚜𝚎 𝚌𝚊𝚌𝚑𝚎” o “𝚐𝚎𝚝𝚂𝚝𝚊𝚝𝚒𝚌𝙿𝚛𝚘𝚙𝚜” — funzioni che possono essere esternalizzate e isolate nello spazio e nel tempo, eseguendosi in diversi “computer”.