Registro di sviluppo: cosa rompe realmente un foglio di calcolo da 120.000 righe
Una sessione di lavoro su un foglio di calcolo di 121.254 righe e 1,8 milioni di celle e le cinque cose separate che dovevano cambiare prima che un'ampia analisi tra tabelle potesse terminare, verificarne l'output e restituire un report formattato utilizzabile.
La maggior parte delle funzionalità dei fogli di calcolo vengono testate su dati che possono essere visualizzati su uno schermo. Questo registro copre una sessione di lavoro su una cartella di lavoro di vendita con 121.254 righe su 15 colonne: circa 1,8 milioni di celle e una richiesta che sembra ordinaria: combinare le tabelle del prodotto, del cliente, dell'ordine e delle vendite, quindi contrassegnare i prodotti in calo, i rischi di rifornimento e i clienti di basso valore.
Niente di quella richiesta è esotico. Fallì comunque, più volte, per ragioni che non avevano quasi nulla a che fare con l'analisi stessa. Quello che segue è ciò che effettivamente si è rotto e ciò che è cambiato.
Un limite della piattaforma, non una query lenta
Il primo fallimento sembrava un bug nel sistema del lavoro durevole. La vera causa era una regola in Google Apps Script: un componente aggiuntivo dell'editor non può creare un trigger basato sul tempo che si attiva più spesso di una volta all'ora.
La progettazione del lavoro in background presupponeva un trigger di un minuto. Tale presupposto è rimasto valido durante lo sviluppo, in cui uno script legato al contenitore poteva essere pianificato liberamente, e ha smesso di essere valido nel momento in cui lo stesso codice veniva eseguito come componente aggiuntivo installato. La richiesta di installazione del trigger non si è deteriorata: ha lanciato un errore e ha lanciato prima il lavoro è stato creato, quindi il lavoro non è mai iniziato.
Seguirono due cambiamenti. Installare un trigger ora è la soluzione migliore: prova una cadenza di un minuto, torna a ogni ora e infine a nessun trigger e non lancia mai. E la prima fase di elaborazione ora viene eseguita all'interno della stessa esecuzione che ha creato l'attività, anziché in una seconda chiamata che deve cercare nuovamente l'attività.
Quel secondo dettaglio contava più di quanto sembri. Le proprietà di Apps Script non sono leggibili in modo affidabile durante le esecuzioni, quindi un'attività scritta pochi istanti prima potrebbe tornare come "attività non trovata" alla chiamata successiva.
Segnalare lo stato di avanzamento non è la stessa cosa che terminare
Anche se il lavoro è finalmente iniziato, non è ancora finito. Lo strumento ha eseguito un passaggio, quindi ha restituito uno stato che dice che il lavoro "continua in background".
Quella frase era falsa. Senza trigger sub-orario disponibile, nulla continua in background. L'assistente ha letto lo stato, ha trasmesso una percentuale all'utente e si è fermato, lasciando un lavoro parcheggiato a 34.000 righe su 121.253 a tempo indeterminato.
Il runtime ora guida il lavoro fino al completamento stesso, entro un budget limitato, e ogni successiva chiamata di stato fa avanzare il lavoro anziché limitarsi a leggerlo. Se il budget è esaurito, il testo di stato dice chiaramente che il compito è incompiuto e che nient’altro potrà portarlo avanti.
Il principio vale la pena dirlo direttamente: una relazione sullo stato di avanzamento non è un risultato finale. Un utente ha chiesto una tabella, non una percentuale.
Una richiesta può essere soddisfatta solo da strumenti che il modello può vedere
Per mantenere accurata la selezione degli strumenti, GetSheetAI rivela un sottoinsieme dei suoi strumenti per turno in base alla richiesta. Questo meccanismo è stato costruito attorno al set di strumenti Excel e il componente aggiuntivo Google Sheets registra 22 strumenti che esistono solo lì. Tali strumenti venivano filtrati da ogni richiesta.
L'effetto era specifico ed era facile non notarlo. Richiedendo un grafico a barre vengono visualizzati 6 dei 44 strumenti, con lo strumento grafico tra quelli nascosti. Richiesta di ordinare un intervallo divulgato 5 su 44, senza lo strumento di ordinamento. L'assistente non si rifiutava: sinceramente non riusciva a vedere lo strumento che svolge il lavoro.
Sheets ora dispone di una propria mappatura strumento-bundle, che rispecchia ciascuna controparte Excel, e il filtro passa attraverso qualsiasi strumento su cui non ha alcuna opinione anziché rilasciarlo. Un test ora legge i nomi degli strumenti registrati direttamente dall'origine, quindi l'aggiunta di uno strumento senza classificarlo fallisce la compilazione invece di renderlo silenziosamente irraggiungibile.
La stessa classe di gap è apparsa nel fraseggio. Una richiesta cinese che significa "crea un nuovo foglio" non corrispondeva a nessuna regola, perché il modello riconosceva solo una delle due parole comuni per un foglio. Lo strumento di creazione del foglio è rimasto nascosto e l'assistente ha segnalato che la creazione di un foglio di lavoro era impossibile. Non lo era.
I messaggi di errore fanno parte del prodotto
Diversi fallimenti si riducevano a un messaggio che indicava un problema senza indicare la via d'uscita.
Scrivendo su un foglio che non esiste viene restituito "La risorsa richiesta non esiste." Sembra un componente aggiuntivo rotto. Ora dice che il foglio non esiste, che lo strumento di scrittura non crea fogli e quali due chiamate lo fanno.
Il rifiuto della classificazione a livello di riga su un intervallo molto ampio ha restituito un semplice rifiuto. L'etichettatura di un risultato aggregato funziona a qualsiasi dimensione, quindi il messaggio ora nomina il percorso: prima raggruppa, quindi applica le regole di classificazione al risultato raggruppato.
Una protezione da sovrascrittura non ha restituito altro che blocked: true, che viene interpretato come un errore. Ora spiega che il target contiene già dati e come procedere.
Nessuno di questi è cosmetico. In ogni caso il messaggio precedente terminava un'attività che era ancora completabile.
Le espressioni deterministiche necessitavano di più aritmetica
Per ricavare un anno-mese come 201707 da una chiave di data intera come 20170702 è necessario floor(x / 100) o un modulo. Nessuno dei due esisteva. Due tentativi fallirono e la colonna derivata fu abbandonata.
Il livello dell'espressione ora include floor, round, abs e mod e l'errore di funzione non supportata elenca il set completo e fornisce quell'espressione esatta, invece di nominare solo ciò che è stato rifiutato.
Dove si trova
Nella stessa cartella di lavoro, il percorso durevole ora viene completato: tutte le 121.253 righe elaborate, raggruppate, scritte e formattate, con ogni blocco di risultati verificato. Su Excel, la stessa richiesta ha prodotto una classificazione per tutti i 397 prodotti (132 senza vendite recenti, 101 contrassegnati per rischio di riassortimento, 99 in calo, 65 normali) calcolata con SUMIFS nativo rispetto alla tabella di origine anziché spostare i dati ovunque.
I valori di funzionamento che vale la pena conoscere:
- soglia di routing durevole: più di 100.000 celle;
- suddivisione in blocchi dell'origine: letture limitate, verificate per blocco durante il writeback;
- copertura della regressione: 826 test nel runtime condiviso;
- esecuzione in background sui componenti aggiuntivi di Fogli Google: al massimo ogni ora, quindi la barra laterale gestisce lavori lunghi mentre è aperta.
Quest'ultimo punto è un limite reale e non temporaneo. Un componente aggiuntivo installato non può pianificare il lavoro con maggiore frequenza, quindi un lavoro di grandi dimensioni procede mentre la barra laterale è aperta. Il checkpoint duraturo significa che chiudendolo non si perde il lavoro completato, ma la descrizione onesta è che il lavoro è guidato, non pianificato.
La lezione più ampia emersa da questa sessione non riguardava la scala. Ognuno di questi errori era dovuto al fatto che il sistema sapeva qualcosa che l'utente non poteva vedere: una regola della piattaforma, uno strumento nascosto, un percorso supportato non menzionato da nessuna parte nell'errore. La dimensione era ciò che li rendeva tutti visibili contemporaneamente.