[{"data":1,"prerenderedAt":1030},["ShallowReactive",2],{"post-woocommerce-agos-payment-gateway-integra-pagamenti-rateali-nel-tuo-e-commerce":3,"related-woocommerce-agos-payment-gateway-integra-pagamenti-rateali-nel-tuo-e-commerce":211},{"id":4,"title":5,"body":6,"categories":192,"coverImage":195,"date":196,"description":197,"extension":198,"meta":199,"navigation":200,"path":201,"seo":202,"stem":203,"sticky":200,"tags":204,"__hash__":210},"articles/woocommerce-agos-payment-gateway-integra-pagamenti-rateali-nel-tuo-e-commerce.md","WooCommerce Agos Payment Gateway: Integra pagamenti rateali nel tuo e-commerce",{"type":7,"value":8,"toc":176},"minimark",[9,18,23,26,54,58,61,66,92,96,116,120,123,127,131,134,145,149,152,160,164,167],[10,11,12,13,17],"p",{},"Nel panorama dell'e-commerce italiano, offrire opzioni di pagamento flessibili è diventato un fattore critico per il successo. I clienti cercano sempre più spesso la possibilità di dilazionare i pagamenti, specialmente per acquisti di importo significativo. È con questa consapevolezza che ho sviluppato il ",[14,15,16],"strong",{},"WooCommerce Agos Payment Gateway",", un plugin che integra perfettamente i finanziamenti Agos nel tuo store WooCommerce.",[19,20,22],"h2",{"id":21},"perché-integrare-pagamenti-rateali-nel-tuo-e-commerce","Perché integrare pagamenti rateali nel tuo e-commerce?",[10,24,25],{},"L'implementazione di pagamenti rateali può avere un impatto significativo sul tuo business:",[27,28,29,36,42,48],"ul",{},[30,31,32,35],"li",{},[14,33,34],{},"Aumento del valore medio ordine",": I clienti sono più propensi ad effettuare acquisti di importo maggiore quando possono dilazionare il pagamento",[30,37,38,41],{},[14,39,40],{},"Riduzione dell'abbandono del carrello",": Offrire opzioni di pagamento flessibili può essere decisivo per completare l'acquisto",[30,43,44,47],{},[14,45,46],{},"Competitività",": Allinearsi alle aspettative dei clienti che cercano sempre più spesso opzioni di finanziamento",[30,49,50,53],{},[14,51,52],{},"Professionalità",": Integrazione con un partner affidabile come Agos aumenta la credibilità del tuo store",[19,55,57],{"id":56},"caratteristiche-chiave-del-plugin","Caratteristiche chiave del plugin",[10,59,60],{},"Il WooCommerce Agos Payment Gateway è stato progettato pensando sia agli sviluppatori che ai merchant, offrendo:",[62,63,65],"h3",{"id":64},"per-i-merchant","Per i Merchant",[27,67,68,74,80,86],{},[30,69,70,73],{},[14,71,72],{},"Configurazione intuitiva",": Setup rapido con codici utente e convenzione forniti da Agos",[30,75,76,79],{},[14,77,78],{},"Tabelle finanziarie personalizzabili",": Definisci tassi di interesse e importi min/max per diverse opzioni di finanziamento",[30,81,82,85],{},[14,83,84],{},"Targeting preciso",": Applica le opzioni di finanziamento a specifici prodotti, categorie o brand",[30,87,88,91],{},[14,89,90],{},"Testing sicuro",": Modalità test per verificare l'integrazione prima del go-live",[62,93,95],{"id":94},"per-gli-sviluppatori","Per gli Sviluppatori",[27,97,98,104,110],{},[30,99,100,103],{},[14,101,102],{},"API robuste",": Integrazione completa con le API Agos",[30,105,106,109],{},[14,107,108],{},"Debug avanzato",": Sistema di logging dettagliato per troubleshooting efficace",[30,111,112,115],{},[14,113,114],{},"Codice pulito",": Sviluppato seguendo le best practice WordPress",[19,117,119],{"id":118},"configurazione-e-personalizzazione","Configurazione e personalizzazione",[10,121,122],{},"L'implementazione del gateway Agos è stata progettata per essere il più flessibile possibile. Ad esempio, permette di definire condizioni precise per l'applicabilità dei finanziamenti definendo tabelle finanziarie e loro applicazione per prodotto, categoria, brand. Questo garantisce che le opzioni di pagamento rateale siano disponibili solo quando appropriato.",[19,124,126],{"id":125},"casi-duso-reali","Casi d'uso reali",[62,128,130],{"id":129},"e-commerce-di-elettronica","E-commerce di Elettronica",[10,132,133],{},"Un negozio di elettronica ha implementato il plugin offrendo:",[27,135,136,139,142],{},[30,137,138],{},"Finanziamenti a tasso zero per acquisti sopra i 1000€",[30,140,141],{},"Tabelle finanziarie specifiche per brand premium",[30,143,144],{},"Risultato: +25% di conversione su ordini di alto valore",[19,146,148],{"id":147},"prezzi-e-supporto","Prezzi e supporto",[10,150,151],{},"Il plugin è disponibile con diversi piani di sottoscrizione per adattarsi alle tue esigenze e include sempre:",[27,153,154,157],{},[30,155,156],{},"Supporto tecnico dedicato",[30,158,159],{},"Aggiornamenti continui",[19,161,163],{"id":162},"conclusioni","Conclusioni",[10,165,166],{},"In un mercato e-commerce sempre più competitivo, offrire opzioni di pagamento flessibili non è più un optional. Il WooCommerce Agos Payment Gateway ti permette di implementare questa funzionalità in modo professionale e personalizzato, aiutandoti a convertire più visitatori in clienti.",[10,168,169,170,175],{},"Se vuoi saperne di più o sei interessato ad implementare il gateway Agos nel tuo store, ",[171,172,174],"a",{"href":173},"mailto:hello@enricodeleo.com","contattami"," per una consulenza personalizzata.",{"title":177,"searchDepth":178,"depth":178,"links":179},"",2,[180,181,186,187,190,191],{"id":21,"depth":178,"text":22},{"id":56,"depth":178,"text":57,"children":182},[183,185],{"id":64,"depth":184,"text":65},3,{"id":94,"depth":184,"text":95},{"id":118,"depth":178,"text":119},{"id":125,"depth":178,"text":126,"children":188},[189],{"id":129,"depth":184,"text":130},{"id":147,"depth":178,"text":148},{"id":162,"depth":178,"text":163},[193,194],"dev","ecommerce","https://i2.wp.com/enricodeleo.s3.eu-south-1.amazonaws.com/images/agos-woocommerce.jpg","2024-12-01T09:00:00.000Z","Come integrare pagamenti rateali Agos nel tuo store WooCommerce: una soluzione completa per aumentare le conversioni offrendo finanziamenti flessibili ai tuoi clienti","md",{},true,"/woocommerce-agos-payment-gateway-integra-pagamenti-rateali-nel-tuo-e-commerce",{"title":5,"description":197},"woocommerce-agos-payment-gateway-integra-pagamenti-rateali-nel-tuo-e-commerce",[205,206,207,194,208,209],"wordpress","woocommerce","payments","agos","fintech","nfmyWGhltsf306fn6a-cjemJrlLsUU1yNTsLTtu_GOU",[212,679],{"id":213,"title":214,"body":215,"categories":662,"coverImage":665,"date":666,"description":222,"extension":198,"meta":667,"navigation":200,"path":668,"seo":669,"stem":670,"sticky":671,"tags":672,"__hash__":678},"articles/bullmq-rs-porting.md","L'interfaccia che non si vede",{"type":7,"value":216,"toc":651},[217,223,231,238,241,245,248,253,260,263,266,270,273,276,283,286,289,300,303,307,310,318,325,332,335,338,353,360,364,367,428,443,457,460,463,467,470,513,516,519,523,526,532,539,545,548,559,564,568,575,578,593,596,599,602,605,608,611,617,620,623,627,646],[10,218,219],{},[220,221,222],"em",{},"Un porting non è una traduzione. È un esercizio di scoperta su cosa, in un sistema, è davvero il contratto. Quasi sempre non è quello che pensi.",[10,224,225,226,230],{},"Qualche giorno fa è stato mergiato in upstream un PR che ho aperto su ",[227,228,229],"code",{},"bullmq-rs",", il porting Rust di BullMQ. Il diff è grosso — circa undicimila righe in più, duemila in meno — ed esce come release v2.0.0 breaking.",[10,232,233,234,237],{},"Quando ho riletto la description del PR a cose fatte, mi sono accorto che la sezione più informativa non era quella di cosa il PR includeva. Era quella di ",[14,235,236],{},"cosa avevo deliberatamente lasciato fuori",".",[10,239,240],{},"È l'unica cosa per cui valga la pena scriverci sopra.",[19,242,244],{"id":243},"cosè-successo","Cos'è successo",[10,246,247],{},"BullMQ è una libreria Node per code distribuite sopra Redis. È diffusa, ha un ecosistema consolidato attorno — Bull Board, dashboard, monitoring — e ha una specifica di fatto su come i dati sono strutturati dentro Redis. Non c'è uno standard formale: c'è il codice della libreria, e c'è il comportamento che il tooling esterno si aspetta di osservare.",[10,249,250,252],{},[227,251,229],{}," è il porting Rust. L'idea è semplice: chi vuole worker in Rust dovrebbe poter scrivere worker in Rust senza dover rifare l'infrastruttura attorno. La dashboard resta quella. I job creati da Node sono leggibili da Rust, e viceversa. Le metriche continuano a funzionare. Si può migrare un servizio per volta senza spegnere il resto.",[10,254,255,256,259],{},"Quando il porting esisteva nella versione precedente, l'API Rust si era avvicinata a quella di BullMQ ma il ",[14,257,258],{},"wire format"," — la struttura esatta dei dati che finiscono su Redis — era divergente in modi sottili. Liste dove dovevano esserci sorted set. Campi degli hash con nomi diversi. Eventi sullo stream con payload diverso da quello che il tooling Node si aspetta di leggere.",[10,261,262],{},"Risultato concreto: il tooling esterno non funzionava. Bull Board non vedeva le code create da Rust. Un worker Node sulla stessa coda di un worker Rust non vedeva i job dell'altro.",[10,264,265],{},"L'API Rust era pulita. Quello che usciva da Redis era un'altra cosa.",[19,267,269],{"id":268},"lo-scenario-per-cui-serve","Lo scenario per cui serve",[10,271,272],{},"Per essere concreti, lo scenario tipico è questo.",[10,274,275],{},"Hai un sistema Node con BullMQ in produzione. Funziona. Bull Board ti mostra le code, gli alert sono cablati, l'SRE sa dove guardare quando qualcosa fuma di notte.",[10,277,278,279,282],{},"A un certo punto un tipo di job smette di reggere. Encoding di video. Image processing. Una pipeline CPU-bound. Il worker Node fa quello che può, ma il throughput non basta più. Vorresti riscrivere ",[220,280,281],{},"solo quel worker"," in Rust, lasciando il resto dell'infrastruttura dov'è.",[10,284,285],{},"Senza wire compatibility, le opzioni sono due. Riscrivere tutto in Rust e perdere il tooling Node. Oppure tenere un layer di traduzione tra i due e portarsi dietro la complessità di mantenerlo allineato a ogni release di BullMQ.",[10,287,288],{},"Con wire compatibility, c'è una terza opzione. Lo stesso job prodotto da un producer Node viene processato da un worker Rust. La dashboard non sa che la stanno chiamando da due runtime diversi. Le metriche non cambiano forma. L'SRE che riceve la pagine alle tre vede le stesse cose che vedeva prima.",[10,290,291,292,295,296,299],{},"C'è anche una proprietà che in Rust emerge naturalmente e in Node non esiste: il payload del job è tipizzato. Scrivi ",[227,293,294],{},"Job\u003CEncodingTask>"," e il worker riceve la ",[227,297,298],{},"EncodingTask"," già deserializzata, controllata a compile time. Se cambi lo schema, il compilatore ti ferma prima del deploy. Per i job dove la correttezza del payload conta davvero — pagamenti, side effect costosi, transizioni di stato critiche — è una garanzia concreta, non un dettaglio estetico.",[10,301,302],{},"Non è un caso d'uso da keynote. È uno di quelli che fa la differenza dopo il deploy.",[19,304,306],{"id":305},"hyrums-law-applicata-al-porting","Hyrum's Law applicata al porting",[10,308,309],{},"C'è una formulazione attribuita a Hyrum Wright, che ha lavorato a lungo in Google sul tooling di refactor su larga scala:",[311,312,313],"blockquote",{},[10,314,315],{},[220,316,317],{},"With a sufficient number of users of an API, it does not matter what you promise in the contract: all observable behaviors of your system will be depended on by somebody.",[10,319,320,321,324],{},"In italiano stretto: con abbastanza utenti, ",[14,322,323],{},"non conta cosa dici di promettere",". Conta tutto quello che il sistema fa, comprese le parti che non avresti scelto di promettere. Qualcuno, da qualche parte, si è appoggiato a ognuna di quelle.",[10,326,327,328,331],{},"In un porting, questa frase ha un corollario molto preciso: l'interfaccia vera del sistema che stai portando ",[14,329,330],{},"non è la sua API",". È l'insieme dei comportamenti osservabili dall'esterno — strutture dati, formati di serializzazione, side effect, ordine degli eventi — su cui qualcun altro, fuori dal sistema, si è appoggiato per far funzionare le sue cose.",[10,333,334],{},"Per BullMQ quell'interfaccia è il layout su Redis. Non la signature di una funzione. La forma esatta di un hash, di una sorted set, di una entry su uno stream.",[10,336,337],{},"Quando porti un sistema così, le scelte si dividono in due categorie:",[339,340,341,347],"ol",{},[30,342,343,346],{},[14,344,345],{},"Quello che non puoi cambiare"," — il wire format. Cambiarlo significa rompere ogni cosa che ci sta sopra senza che il chiamante se ne accorga, fino al prossimo deploy in cui scopre che la dashboard è vuota o che mancano metà dei job.",[30,348,349,352],{},[14,350,351],{},"Quello che puoi cambiare"," — l'API del linguaggio di destinazione. È libera. Nessuno la sta osservando dall'esterno.",[10,354,355,356,359],{},"Confondere le due categorie è il modo più sicuro di fare un porting che ",[220,357,358],{},"sembra finito"," e non lo è.",[19,361,363],{"id":362},"cosa-il-pr-ha-messo-dentro","Cosa il PR ha messo dentro",[10,365,366],{},"La prima parte del lavoro è stata appiattire il wire format sotto quello di BullMQ v5:",[27,368,369,382,403,406,409],{},[30,370,371,372,375,376,375,379],{},"liste per ",[227,373,374],{},"wait",", ",[227,377,378],{},"active",[227,380,381],{},"paused",[30,383,384,385,375,388,375,391,375,394,375,397,375,400],{},"sorted set per ",[227,386,387],{},"prioritized",[227,389,390],{},"delayed",[227,392,393],{},"completed",[227,395,396],{},"failed",[227,398,399],{},"waiting-children",[227,401,402],{},"marker",[30,404,405],{},"hash per i metadati",[30,407,408],{},"stream per gli eventi",[30,410,411,412,375,415,375,418,375,421,375,424,427],{},"campi degli hash dei job con gli stessi nomi e gli stessi formati di Node (",[227,413,414],{},"atm",[227,416,417],{},"ats",[227,419,420],{},"processedOn",[227,422,423],{},"pb",[227,425,426],{},"opts"," JSON-encoded)",[10,429,430,431,433,434,436,437,439,440,442],{},"Sopra, il porting degli script Lua atomici che BullMQ usa per le transizioni di stato. Una transizione di un job — da ",[227,432,374],{}," ad ",[227,435,378],{},", da ",[227,438,378],{}," a ",[227,441,393],{},", dal recovery di un job stallato — non si può implementare come sequenza di comandi Redis. Deve essere atomica, e BullMQ ottiene l'atomicità delegando a Lua. Riscriverle a mano in Rust significherebbe inventare race condition che il codice originale non ha. Quindi si portano, riga per riga, e si verifica che il comportamento osservato sia identico.",[10,444,445,446,449,450,453,454,456],{},"Sopra ancora c'è il runtime: marker-based loop con ",[227,447,448],{},"BZPOPMIN",", lock con token e TTL, recovery dei job stallati, fast-path per il ",[227,451,452],{},"moveToFinished",", fix del prefetch perché i job non rimangano orfani in ",[227,455,378],{}," quando un worker si chiude in modo non pulito.",[10,458,459],{},"Sopra ancora le API Rust: Queue, Job, QueueEvents, FlowProducer con parent/child cross-queue.",[10,461,462],{},"Tutto questo è abbastanza per usarlo in produzione, e abbastanza perché parli con un cluster Node esistente senza traduzioni intermedie.",[19,464,466],{"id":465},"cosa-il-pr-ha-deliberatamente-lasciato-fuori","Cosa il PR ha deliberatamente lasciato fuori",[10,468,469],{},"Una lista, nel corpo del PR:",[27,471,472,479,498,501,504,507,510],{},[30,473,474,475,478],{},"niente ",[227,476,477],{},"JobScheduler"," (i job ripetibili tipo cron)",[30,480,481,482,375,485,375,488,375,491,375,494,497],{},"niente bulk sulle Queue (",[227,483,484],{},"addBulk",[227,486,487],{},"clean",[227,489,490],{},"obliterate",[227,492,493],{},"retryJobs",[227,495,496],{},"promoteJobs",")",[30,499,500],{},"niente pause/resume lato Worker (sulla Queue sì)",[30,502,503],{},"niente rate limiting",[30,505,506],{},"niente deduplica",[30,508,509],{},"niente debounce",[30,511,512],{},"niente metriche",[10,514,515],{},"Sono tutte cose che BullMQ ha. Sono tutte cose che andranno aggiunte.",[10,517,518],{},"Ma non in questo PR.",[19,520,522],{"id":521},"perché","Perché",[10,524,525],{},"Perché un porting che prova a fare tutto in un colpo solo finisce in due modi: o non viene mai mergiato, o viene mergiato con compromessi nascosti.",[10,527,528,529,237],{},"I compromessi nascosti sono quelli che non vedi nella description ma sono nel codice. Convenzioni inventate dove la spec non era chiara. Edge case lasciati indietro perché stancavano. Comportamenti che divergono in silenzio da quelli del sistema originale e che si scoprono mesi dopo, quando un utente segnala che ",[220,530,531],{},"\"con Node funziona, con Rust no\"",[10,533,534,535,538],{},"È il debito ",[220,536,537],{},"accidentale"," di Cunningham — quello che accumuli senza saperlo, perché non hai capito abbastanza bene il problema. Non puoi quantificarlo. Non puoi ripagarlo. Non sai nemmeno dove sia.",[10,540,541,542,237],{},"Il modo per evitarlo, in un porting, è invertire l'istinto: ",[14,543,544],{},"dichiarare per primo quello che non stai facendo",[10,546,547],{},"Non in fondo al PR, in piccolo. Nella description, in una sezione dedicata, con i nomi precisi delle API e dei comportamenti che mancano. Pubblicamente, prima ancora che qualcuno chieda.",[10,549,550,551,554,555,558],{},"Questo trasforma la stessa identica situazione — ",[220,552,553],{},"\"una libreria con feature mancanti\""," — da debito accidentale in ",[14,556,557],{},"debito deliberato",": lo strumento legittimo di cui Cunningham parlava davvero. So cosa manca. È scritto. È tracciato. Il prossimo PR sa dove deve atterrare. Chi usa la libreria sa cosa può aspettarsi e cosa no.",[311,560,561],{},[10,562,563],{},"Il debito deliberato è uno strumento di scope. Il debito accidentale è scope che ti gestisce.",[19,565,567],{"id":566},"la-tentazione-di-portare-tutto","La tentazione di portare tutto",[10,569,570,571,574],{},"C'è una tentazione precisa, in qualunque porting o reimplementazione, ed è la stessa che la velocità di produzione dell'AI rende più facile da assecondare: provare a fare ",[220,572,573],{},"tutto"," in un colpo solo, perché tecnicamente si potrebbe.",[10,576,577],{},"Il sistema originale ha cento feature. Il porting può imitarle tutte. Le LOC scalano. Il PR si gonfia. La review diventa impossibile. Le scelte sulle parti che non hai capito davvero finiscono per essere prese per default — dal codice generato, da analogie con altri sistemi, da quello che sembrava ragionevole alle tre di notte.",[10,579,580,581,584,585,588,589,592],{},"E quando quel PR viene mergiato, il sistema risultante ha un'estensione paragonabile all'originale ma una superficie di bug che nessuno ha mappato. ",[220,582,583],{},"Sembra"," completo. E come ho scritto altrove, ",[220,586,587],{},"sembra completo"," ed ",[220,590,591],{},"è corretto"," non sono mai stati la stessa cosa.",[10,594,595],{},"L'alternativa è meno glamour. Portare prima ciò che è strutturale — il wire format, il runtime, gli atomi — e poi aggiungere superficie un pezzo alla volta, additivamente, scrivendo nero su bianco cosa manca ancora e perché.",[10,597,598],{},"Niente dimostra qualcosa nel portare di più. Qualcosa si perde quasi sempre nel portare senza dichiarare cosa è dentro e cosa è fuori.",[19,600,214],{"id":601},"linterfaccia-che-non-si-vede",[10,603,604],{},"Vale anche fuori dai porting.",[10,606,607],{},"In quasi tutti i sistemi che condividono stato con qualcosa di esterno — un'altra applicazione, un altro team, un altro runtime, un altro linguaggio — l'interfaccia che conta davvero non è quella che vedi nella signature di una funzione. È quella che attraversa il confine. Un payload JSON. Una riga di una tabella. Un evento su una stream.",[10,609,610],{},"È quella che il chiamante osserva. È quella che, se cambia in silenzio, rompe le cose lontano da dove l'hai cambiata, in un orario in cui non sei davanti allo schermo.",[10,612,613,614],{},"Quando lavori dentro un sistema chiuso, hai il lusso di poter rinominare, ristrutturare, refattorizzare a piacere. Quando il sistema ha un confine osservato da qualcun altro, quel lusso scompare. ",[14,615,616],{},"L'API del linguaggio è effimera. Il contratto reale è quello che passa attraverso il confine.",[10,618,619],{},"Per il porting di BullMQ quel confine era Redis. Una volta che il confine è giusto, tutto il resto è additivo. Se il confine è sbagliato, ogni feature aggiunta sopra è una bugia in più da mantenere.",[10,621,622],{},"E le bugie nei sistemi non scadono. Aspettano.",[19,624,626],{"id":625},"riferimenti","Riferimenti",[27,628,629,638],{},[30,630,631,632],{},"PR mergiato: ",[171,633,637],{"href":634,"rel":635},"https://github.com/bogardt/bullmq-rs/pull/3",[636],"nofollow","bogardt/bullmq-rs#3",[30,639,640,641],{},"Issue di partenza: ",[171,642,645],{"href":643,"rel":644},"https://github.com/bogardt/bullmq-rs/issues/2",[636],"bogardt/bullmq-rs#2",[10,647,648],{},[220,649,650],{},"Il porting più onesto è quello che dichiara per primo cosa non sta portando.",{"title":177,"searchDepth":178,"depth":178,"links":652},[653,654,655,656,657,658,659,660,661],{"id":243,"depth":178,"text":244},{"id":268,"depth":178,"text":269},{"id":305,"depth":178,"text":306},{"id":362,"depth":178,"text":363},{"id":465,"depth":178,"text":466},{"id":521,"depth":178,"text":522},{"id":566,"depth":178,"text":567},{"id":601,"depth":178,"text":214},{"id":625,"depth":178,"text":626},[663,664],"Dev","Open Source","https://i2.wp.com/enricodeleo.s3.eu-south-1.amazonaws.com/images/linterfaccia-che-non-si-vede.png","2026-06-07T10:00:00.000Z",{},"/bullmq-rs-porting",{"title":214,"description":222},"bullmq-rs-porting",false,[673,674,675,676,677],"rust","bullmq","open-source","porting","engineering","UuZirdWSmow4buT9WfQq0g6y2oE8l0x6cPdqDavWfHg",{"id":680,"title":681,"body":682,"categories":1016,"coverImage":1018,"date":1019,"description":1020,"extension":198,"meta":1021,"navigation":200,"path":1022,"seo":1023,"stem":1024,"sticky":671,"tags":1025,"__hash__":1029},"articles/velocita-senza-giudizio.md","Velocità senza giudizio",{"type":7,"value":683,"toc":1007},[684,689,692,699,702,705,710,717,721,724,731,744,751,757,760,764,770,777,780,791,794,801,809,812,816,819,826,837,840,847,852,855,858,865,869,872,875,878,881,887,890,895,898,902,908,911,918,921,932,936,942,945,955,960,963,966,971,975,978,985,988,999,1002],[10,685,686],{},[220,687,688],{},"Il vibe coding non ha inventato il codice scritto male. Ha solo tolto l'attrito.",[10,690,691],{},"Ho visto un backend con l'autenticazione hardcodata nel frontend. Password admin in chiaro, visibile a chiunque aprisse DevTools. Non era vibe coding — era 2018, dev umani, trovati su Upwork.",[10,693,694,695,698],{},"Ve lo dico perché quello che sta succedendo adesso ",[14,696,697],{},"non è una novità",". È la stessa roba, più veloce.",[10,700,701],{},"Ho visto Google Sheets usato come database. Collassava a quattro utenti. I fondatori si sono sorpresi.",[10,703,704],{},"Ho visto funzionalità dichiarate implementate che erano solo API vuote senza niente dietro. L'ho visto fare a dev umani. L'ho visto fare a Claude Opus 4.6, che in questo momento è il modello più capace di Anthropic. Ho visto test scritti per passare, non per verificare.",[311,706,707],{},[10,708,709],{},"Un sistema che si auto-certifica è più pericoloso di uno che fallisce apertamente.",[10,711,712,713,716],{},"Il problema non è l'AI. È che la velocità che offre può farti dimenticare che costruire software è ",[14,714,715],{},"fondamentalmente un atto cognitivo"," — non di scrittura.",[19,718,720],{"id":719},"il-software-non-è-testo","Il software non è testo",[10,722,723],{},"Questa è la cosa che l'entusiasmo attorno al vibe coding dimentica sistematicamente.",[10,725,726,727,730],{},"Il software non è testo. È un ",[14,728,729],{},"modello formale della realtà"," — un sistema di regole che descrive come un dominio si comporta, come gli stati cambiano, come le eccezioni vengono gestite, come il tempo e la concorrenza e il fallimento vengono trattati.",[10,732,733,734,737,738,740,741,237],{},"Scrivere codice non è mai stato il problema difficile. Il problema difficile è capire ",[220,735,736],{},"cosa"," scrivere — e ",[220,739,521],{},". È identificare i confini del dominio, le invarianti che devono reggere, i casi limite che il business non ti ha detto perché non sapeva di doverlo fare, le implicazioni che una scelta architetturale avrà tra sei mesi quando i requisiti cambieranno — ",[14,742,743],{},"perché cambiano sempre",[10,745,746,747,750],{},"Questa comprensione non si ottiene velocemente. Si ottiene attraverso iterazioni, conversazioni, errori, correzioni, notti a chiedersi perché quella cosa non funziona come dovrebbe. È quella che Michael Polanyi chiamava ",[220,748,749],{},"conoscenza tacita"," — sapere che non si riesce a trasferire completamente in parole, che risiede nell'esperienza accumulata, nei pattern riconosciuti, nelle intuizioni costruite su decine di progetti.",[10,752,753,756],{},[14,754,755],{},"L'AI non ha questa conoscenza."," Ha la media statistica di quello che è stato scritto su internet riguardo a problemi simili al tuo.",[10,758,759],{},"Che non è la stessa cosa.",[19,761,763],{"id":762},"la-trappola-della-perfezione-apparente","La trappola della perfezione apparente",[10,765,766,767,237],{},"C'è qualcosa di specifico nell'AI che aggrava tutto questo: ",[14,768,769],{},"il codice che produce sembra sempre scritto bene",[10,771,772,773,776],{},"È ben nominato, ha i commenti nei posti giusti, segue le convenzioni, usa i pattern corretti. Non sembra il codice di qualcuno che non sa quello che fa — sembra il codice di qualcuno che sa ",[220,774,775],{},"esattamente"," quello che fa.",[10,778,779],{},"Questo è il problema.",[10,781,782,783,786,787,790],{},"Il codice sbagliato scritto male ti ferma. Lo vedi, lo senti, ti insospettisce. Attiva il tuo senso critico prima ancora che tu abbia capito cosa fa. Il ",[14,784,785],{},"codice sbagliato scritto bene"," attraversa la code review senza attivare nessun campanello d'allarme, supera i test, va in produzione. E quando si rompe — ",[220,788,789],{},"perché si rompe"," — la forma corretta del codice rende ancora più difficile localizzare il problema concettuale che ci sta sotto.",[10,792,793],{},"Stai cercando un bug in codice che non sembra buggy. Stai cercando un'assunzione sbagliata in codice che sembra ragionevole.",[10,795,796,797,800],{},"Nel 1986 Fred Brooks scriveva che la difficoltà essenziale del software non è accidentale — non riguarda la sintassi, i compilatori, la velocità di scrittura. Riguarda la ",[14,798,799],{},"complessità concettuale intrinseca"," dei sistemi che costruiamo. Quarant'anni dopo, l'AI ha eliminato quasi completamente la difficoltà accidentale. Quella essenziale è rimasta intatta.",[311,802,803],{},[10,804,805,808],{},[220,806,807],{},"\"No silver bullet.\"","\n— Fred Brooks, 1986",[10,810,811],{},"E ora che la difficoltà accidentale è sparita, la difficoltà essenziale è più esposta che mai. Ma è anche più facile da non vedere, perché l'output che la nasconde sembra così convincente.",[19,813,815],{"id":814},"il-modello-della-realtà","Il modello della realtà",[10,817,818],{},"Quando chiedi all'AI di costruire qualcosa, quello che ricevi non è una soluzione.",[10,820,821,822,825],{},"È una ",[14,823,824],{},"interpretazione"," del problema che hai descritto.",[10,827,828,829,832,833,836],{},"L'AI costruisce un modello della realtà basato su quello che gli hai detto — e quello che gli hai detto è inevitabilmente incompleto, perché la conoscenza del dominio che hai in testa non si trasferisce per intero in un prompt. Il gap tra il problema che hai ",[220,830,831],{},"in testa"," e il problema che l'AI ha ",[220,834,835],{},"capito"," è sempre presente. A volte è trascurabile. A volte è la differenza tra un sistema che regge e uno che collassa al primo caso limite reale.",[10,838,839],{},"La velocità non ti dà il tempo di misurare quel gap. Peggio: la velocità e la perfezione apparente dell'output creano attivamente l'illusione che il gap non esista.",[10,841,842,843,846],{},"Questo è il motivo per cui ",[14,844,845],{},"\"funziona\" non è mai abbastanza"," come criterio di accettazione.",[10,848,849],{},[220,850,851],{},"Funziona rispetto a cosa?",[10,853,854],{},"Rispetto ai test che l'AI ha scritto per passare — costruiti attorno agli stessi casi che aveva in testa quando ha scritto il codice, in un loop chiuso che non include nessuna realtà esterna? Rispetto alla demo con dati puliti e percorsi felici? O rispetto alla logica reale del dominio, con tutti i casi limite che solo tu conosci perché ci hai lavorato dentro?",[10,856,857],{},"Salvatore Sanfilippo ha sollevato un problema analogo sulla code review: lo stato mentale di chi scrive non è trasferibile al reviewer. Il reviewer vede il testo, non il ragionamento che ha prodotto quel testo. O puntualizza cose superficiali, oppure non comprende abbastanza da vedere il problema vero.",[10,859,860,861,864],{},"Con l'AI il problema si radicalizza: ",[14,862,863],{},"l'AI non ha stato mentale da trasferire",". Ha prodotto output ottimizzando per la coerenza interna del testo, non per la corrispondenza con la tua realtà. Il reviewer — che sei tu — deve colmare quel gap da solo. Se non ti fermi a farlo, nessuno lo farà.",[19,866,868],{"id":867},"let-it-sink","Let it sink",[10,870,871],{},"C'è una pratica che ogni ingegnere con abbastanza cicatrici ha interiorizzato: dormirci sopra.",[10,873,874],{},"Non per pigrizia. Per necessità cognitiva.",[10,876,877],{},"Il cervello umano non elabora i problemi complessi in modo lineare e sequenziale. Elabora in parallelo, spesso al di sotto della soglia della coscienza. È per questo che le soluzioni migliori arrivano sotto la doccia, in macchina, la mattina appena svegli — non davanti allo schermo quando stai cercando attivamente la risposta. I problemi che non vedi nel momento emergono dopo, quando torni con occhi freschi e il cervello ha avuto il tempo di connettere pattern che la concentrazione attiva non riesce a vedere.",[10,879,880],{},"Non è misticismo. È neuroscienze. La modalità diffusa del cervello è essenziale per l'insight, per la comprensione profonda, per accorgersi delle incongruenze che la modalità focalizzata salta perché è troppo dentro il problema.",[10,882,883,884],{},"Con l'AI quella pratica diventa ancora più importante, e ancora più facile da saltare. Perché in pochi minuti hai davanti qualcosa che sembra completo. L'effort che hai speso è minimo, quindi la sensazione di investimento è bassa, quindi la soglia per dichiararlo fatto si abbassa. ",[14,885,886],{},"Non hai faticato per arrivare lì, quindi non senti il bisogno di proteggerti dall'errore di aver faticato invano.",[10,888,889],{},"Ma \"sembra completo\" e \"è corretto\" sono due cose diverse — e la velocità di produzione dell'AI ha reso quella distinzione più sottile che mai.",[311,891,892],{},[10,893,894],{},"Fermarsi non è perdere il vantaggio della velocità. È il momento in cui verifichi che quella velocità ti abbia portato nella direzione giusta.",[10,896,897],{},"Senza quel momento, stai solo andando veloce verso il posto sbagliato — e ci arrivi prima.",[19,899,901],{"id":900},"la-code-review-non-basta","La code review non basta",[10,903,904,905,237],{},"La risposta istintiva a tutto questo è: ",[220,906,907],{},"\"per questo c'è la code review\"",[10,909,910],{},"Ma la code review, così come è praticata nella maggior parte dei team, non risolve il problema che stiamo descrivendo.",[10,912,913,914,917],{},"La code review tradizionale è ottima per trovare bug sintattici, violazioni di convenzioni, problemi di sicurezza ovvi. È molto meno efficace per valutare se le ",[14,915,916],{},"decisioni architetturali sono corrette",", se il modello del dominio rispecchia la realtà, se le assunzioni implicite nel codice sono valide.",[10,919,920],{},"Con l'AI il problema si amplifica: il codice generato è sintatticamente inattaccabile. Il reviewer scorre, non trova niente che attivi i campanelli d'allarme standard, approva. Il problema concettuale che stava sotto passa indisturbato.",[10,922,923,924,927,928,931],{},"La code review utile in questo contesto non è ",[220,925,926],{},"\"questo codice è scritto bene?\""," — quella risposta è quasi sempre sì. È ",[220,929,930],{},"\"questo codice fa quello che dovrebbe fare nel contesto del dominio reale?\""," — e per rispondere devi avere la conoscenza del dominio che l'AI non ha, devi aver capito i requisiti abbastanza da sapere cosa verificare, devi aver lasciato che la soluzione sedimentasse abbastanza da poterla vedere con distacco critico.",[19,933,935],{"id":934},"il-debito-che-non-vedi","Il debito che non vedi",[10,937,938,939,237],{},"Il debito tecnico generato senza giudizio ha una caratteristica precisa: ",[14,940,941],{},"è silenzioso",[10,943,944],{},"Non si manifesta subito. Si accumula in decisioni prese per default dall'AI che non erano le tue decisioni — ma ora sono nel codice, e il codice è in produzione. In architetture che reggono il caso d'uso che hai descritto ma non quello successivo. In assunzioni implicite che l'AI ha fatto riempiendo i gap del tuo prompt con la media di quello che ha visto in training.",[10,946,947,948,951,952,954],{},"Ward Cunningham, che il termine \"debito tecnico\" lo ha inventato, intendeva qualcosa di specifico: il debito ",[220,949,950],{},"deliberato",", contratto consapevolmente per andare più veloci ora con l'intenzione di ripagarlo dopo. Non il debito ",[220,953,537],{},", quello che accumuli senza saperlo perché non hai capito abbastanza bene il problema.",[10,956,957],{},[14,958,959],{},"Il debito deliberato è uno strumento legittimo. Il debito accidentale è ignoranza capitalizzata.",[10,961,962],{},"Il vibe coding senza giudizio produce quasi esclusivamente debito accidentale. Perché la velocità impedisce la comprensione, e senza comprensione non puoi nemmeno scegliere consapevolmente di indebitarti — ti indebiti e basta, senza saperlo, senza poterlo quantificare, senza un piano per ripagarlo.",[10,964,965],{},"E quando emerge, emerge nel momento peggiore. Quando c'è trazione. Quando ci sono utenti reali. Quando il costo di sistemare è un ordine di grandezza superiore a quello che sarebbe stato all'inizio.",[311,967,968],{},[10,969,970],{},"Il conto arriva sempre. La velocità determina solo quanto in fretta lo accumuli.",[19,972,974],{"id":973},"la-velocità-è-un-mezzo","La velocità è un mezzo",[10,976,977],{},"L'AI nello sviluppo è straordinaria. La uso ogni giorno.",[10,979,980,981,984],{},"Ma la velocità non è il fine — è un mezzo. Il fine è costruire qualcosa che ",[14,982,983],{},"rispecchi la logica che avevi in testa",", che regga i casi limite del dominio reale, che qualcuno possa capire e modificare tra un anno senza maledire chi lo ha scritto.",[10,986,987],{},"Se la velocità ti impedisce di verificare che questo sia vero, non stai andando più veloce. Stai solo sbagliando più in fretta. Con più righe di codice. Con più fiducia. Con meno possibilità di accorgertene prima che diventi costoso.",[10,989,990,991,994,995,998],{},"La differenza tra un ingegnere che usa l'AI bene e uno che la usa male non è tecnica. ",[14,992,993],{},"È cognitiva."," È la capacità di fermarsi, lasciare che le cose sedimentino, tornare con distacco critico e chiedersi: questo rispecchia davvero quello che volevo? O sto guardando qualcosa che ",[220,996,997],{},"sembra"," quello che volevo?",[10,1000,1001],{},"Sono domande scomode da fare quando hai appena passato un pomeriggio produttivo e lo schermo è pieno di codice nuovo e i test passano.",[10,1003,1004],{},[220,1005,1006],{},"Falle lo stesso.",{"title":177,"searchDepth":178,"depth":178,"links":1008},[1009,1010,1011,1012,1013,1014,1015],{"id":719,"depth":178,"text":720},{"id":762,"depth":178,"text":763},{"id":814,"depth":178,"text":815},{"id":867,"depth":178,"text":868},{"id":900,"depth":178,"text":901},{"id":934,"depth":178,"text":935},{"id":973,"depth":178,"text":974},[663,1017],"AI","https://i2.wp.com/enricodeleo.s3.eu-south-1.amazonaws.com/images/velocita-senza-giudizio.png","2026-04-03T10:00:00.000Z","Il vibe coding non ha inventato il codice scritto male. Ha solo tolto l'attrito. E la velocità, senza il tempo di valutare, produce solo errori più rapidi.",{},"/velocita-senza-giudizio",{"title":681,"description":1020},"velocita-senza-giudizio",[1026,1027,677,1028],"ai","vibe-coding","build-in-public","U75B5WaPnYhOsgue02Cp92PwZioiIXFh6SRZMrizYok",1780867863235]