¿Por qué se necesita “𝚞𝚜𝚎 𝚜𝚝𝚎𝚙”? Alguien señaló que los pasos en un flujo de trabajo son como “puntos de control” en un videojuego. Buena analogía. Una consecuencia interesante de marcar una función como “𝚞𝚜𝚎 𝚠𝚘𝚛𝚔𝚏𝚕𝚘𝚠” es que no se permite hacer I/O aparte de los pasos. Los flujos de trabajo deben ser libres de efectos secundarios y deterministas. Cada vez que 𝚊𝚠𝚊𝚒𝚝 esa función debe ser un paso. Estas llamadas a funciones pueden considerarse como continuaciones serializables. Las entradas y salidas de estas funciones se registran en un log. Piensa en JSON. Si tienes un flujo de trabajo con 3 pasos y el último falla, debemos ser capaces de “volver a ejecutar” toda la función y tener un control perfecto sobre el estado del mundo. De esta manera, “𝚞𝚜𝚎 𝚜𝚝𝚎𝚙” es en realidad muy similar a “𝚞𝚜𝚎 𝚌𝚊𝚌𝚑𝚎” o “𝚐𝚎𝚝𝚂𝚝𝚊𝚝𝚒𝚌𝙿𝚛𝚘𝚙𝚜” — funciones que pueden ser externalizadas e isoladas en el espacio y el tiempo, ejecutándose en diferentes “computadoras”.