Lo scenario è il seguente. C'è un PC che esegue un complesso software AI che controlla in modalità wireless un certo numero di robot da calcio. Questo software è scritto e gestito da un team di studenti che cambia ogni anno.
Ciò significa che ogni anno un nuovo team di una dozzina di sviluppatori relativamente inesperti deve imparare a lavorare con questo sistema, mantenerlo e migliorarlo. Ciò significa che deve essere facile da imparare, ma anche difficile da sbagliare. Ad esempio, C ++ è facile da imparare, ma facile da sbagliare, mentre Haskell sarebbe difficile da imparare, ma difficile da sbagliare.
Nella mia mente, i contendenti per le lingue adatte sarebbero cose come Java, Python e Go. Dove Java e Python sono difficili da fotografare nel piede, ma forniscono una guida minima in termini di design. Anche se non ho mai usato Go me stesso, sembra che sia progettato con grandi team di programmatori inesperti, incoraggiando strongmente un particolare modello di astrazione e concorrenza.
Per il software stesso è importante che i sottogruppi possano lavorare sulle parti in modo relativamente indipendente, che sia abbastanza veloce da controllare una dozzina di robot in tempo reale in un gioco frenetico e che il sistema sia facile da debugare e mantenere.
Esiste una gerarchia di strategia di alto livello, azioni per robot e controllo di basso livello. Sembra naturale disaccoppiare questi in thread separati, ma questo offre delle sfide nell'avere un sistema riproducibile, osservabile, debuggibile.
Idealmente, vorrai essere in grado di creare un'istanza del sistema in un dato punto della storia e riprodurlo da lì, passando da una sola all'altra attraverso tutte le decisioni prese dall'IA. Non è del tutto chiaro per me come farlo.
Se tutti i nodi fossero completamente privi di stato e deterministici, potrebbe essere sufficiente riprodurre i dati del sensore. CSP può essere un modo ragionevole per avere processi deterministici. In caso di nodi con stato, sembra essere necessario un modello di stato transazionale. Penso che Datomic sia davvero interessante in quest'area, ma alla fine non sono sicuro di come affrontarlo.
Quindi forse la domanda più difficile e più obiettiva è: come architettare un'IA gerarchica e un sistema di controllo in un modo deterministico, riproducibile e debuggabile che è difficile sbagliare?