Por que é que “𝚞𝚜𝚎 𝚜𝚝𝚎𝚙” é necessário? Alguém apontou que os passos em um fluxo de trabalho são como “pontos de verificação” em um videojogo. Boa analogia. Uma consequência interessante de marcar uma função como “𝚞𝚜𝚎 𝚠𝚘𝚛𝚔𝚏𝚕𝚘𝚠” é que não é permitido fazer I/O além dos passos. Os fluxos de trabalho precisam ser livres de efeitos colaterais e determinísticos. Cada vez que você 𝚊𝚠𝚊𝚒𝚝, essa função deve ser um passo. Essas chamadas de função podem ser pensadas como continuações serializáveis. As entradas e saídas dessas funções são comprometidas em um log. Pense em JSON. Se você tem um fluxo de trabalho com 3 passos e o último falha, temos que ser capazes de “re-executar” toda a função e ter um controle perfeito sobre o estado do mundo. Dessa forma, “𝚞𝚜𝚎 𝚜𝚝𝚎𝚙” é na verdade muito semelhante a “𝚞𝚜𝚎 𝚌𝚊𝚌𝚑𝚎” ou “𝚐𝚎𝚝𝚂𝚝𝚊𝚝𝚒𝚌𝙿𝚛𝚘𝚙𝚜” — funções que podem ser externalizadas e isoladas no espaço e no tempo, executando em diferentes “computadores”.