182 letture

Code Smell 298 - Come risolvere la perdita di tempo di Microsoft Windows

di Maximiliano Contieri5m2025/05/04
Read on Terminal Reader

Troppo lungo; Leggere

Saltare i rapporti di stato nei rami condizionati provoca ritardi silenziosi e condizioni di gara.
featured image - Code Smell 298 - Come risolvere la perdita di tempo di Microsoft Windows
Maximiliano Contieri HackerNoon profile picture

Quando la logica condizionale silenzia i segnali critici


TL;DR: saltare i rapporti di stato nei rami condizionati provoca ritardi silenziosi e condizioni di gara.

TL;DR: saltare i rapporti di stato nei rami condizionati provoca ritardi silenziosi e condizioni di gara.

Problemi

  • Utente in ritardo
  • Poca esperienza
  • Tempi imprevedibili
  • Inizializzazione incompleta
  • Dipendenze nascoste
  • La cattiva gestione della politica
  • fallimenti silenziosi
  • Compatibilità retroattiva

Soluzioni

  1. Validare tutti i percorsi di codice
  2. Utilizzare i meccanismi di segnalazione predefiniti
  3. Test edge casi rigorosamente
  4. La politica dei rifactori controlla presto
  5. Fare test di prestazioni
  6. Spostare i rapporti al di fuori dei condizionali

Il contesto

Quando si aggiunge la logica condizionale (ad esempio, le politiche di gruppo) al codice di inizializzazione, saltare i passaggi critici come i rapporti di disponibilità provoca ritardi in tutto il sistema.


I casi di margine sono condizioni eccezionali che si verificano al di fuori dei normali parametri operativi.


Quando non si gestiscono correttamente questi casi di margine, il codice può comportarsi in modo imprevedibile.


QuestoIl blog di Microsoftevidenzia un esempio classico in cui manca la gestione del caso di margineWindows 7 ha causato tempi di accesso più lenti quando gli utenti hanno scelto uno sfondo a colori solidi invece di un'immagine di sfondo.


Il codice responsabile del caricamento di carta da parati desktop è quasi "pronto" solo quando ha caricato con successo un'immagine di carta da parati.


Ma quando gli utenti hanno selezionato uno sfondo a colori solidi (un caso di bordo), questo percorso di codice non ha mai attivato la notifica "pronta".


Di conseguenza, il sistema ha aspettato il tempo pieno di 30 secondi prima di procedere con la sequenza di accesso.


Questo problema mostra come la mancanza di un caso di margine apparentemente piccolo può avere un impatto significativo sull'esperienza utente.


Ciò che avrebbe dovuto essere un processo di accesso di 5 secondi è diventato un ritardo frustrante di 30 secondi per gli utenti che hanno scelto un'opzione di configurazione semplice.

Moltiplicate questo innocente ritardo di 30 secondi per ogni utente che aveva la versione.


Un buon design del software richiede di considerare tutti i possibili percorsi attraverso il codice, non solo quelli comuni.


Quando si salta la gestione dei casi di margine, si crea un debito tecnico che si manifesta come misteriosi problemi di prestazioni, tempi e esperienze utente scadenti.

Modulo di codice

sbagliato 🙂

public static class WallpaperInitializer
{
    private static bool wallpaperWasDefined = false;

    public static void InitializeWallpaper()
    {
        if (wallpaperWasDefined)
        // Assume this was defined previously
        // and PLEASE DON'T use NULLs in case you hadn't    
        {
            LoadWallpaperBitmap();
            Report(WallpaperReady); // Missed if wallpaper is undefined
        }
       // No default report, causing delays
    }

    private static void LoadWallpaperBitmap()
    {
        
    }

    private static void Report(string status)
    {
        // The Asynchronous loading keeps on
    }
}

giusta 🙂

public static class WallpaperInitializer
{
    private static bool wallpaperWasDefined = false;

    public static void InitializeWallpaper()
    {
        if (wallpaperWasDefined)
        {
            LoadWallpaperBitmap();
        }
        Report(WallpaperReady); 
        // Always report, regardless of condition
    }

    private static void LoadWallpaperBitmap()
    {
    
    }
}

Riconoscimento

  • [x] Semiautomatico

Utilizzare strumenti di analisi statica per segnalare i condizionali che salvaguardano le chiamate critiche di segnalazione.


Le revisioni del codice dovrebbero verificare che tutti i percorsi di inizializzazione segnalino il completamento.

Giorno ️

  • prestazioni

Livello

  • [x] Intermediario

Perché la bijection è importante ️

Il comportamento del sistema nel mondo reale (ad esempio, velocità di accesso) dipende dalla modellazione accurata degli stati di prontezza.


Il software dovrebbe mantenere una corrispondenza uno-a-uno tra gli stati del mondo reale e gli stati del programma.


Quando gli utenti selezionano uno sfondo a colori solidi in Windows, questa scelta rappresenta uno stato reale valido.


(La mia scelta personale anche allora)


Il programma deve modellare correttamente questa scelta con uno stato del programma corrispondente che si comporta correttamente.


Quando si rompe questa bijection per non gestire i casi di margine, si introducono disconnessioni tra le aspettative degli utenti e il comportamento del sistema. In questo esempio, gli utenti si aspettavano che la loro scelta di uno sfondo a colori solidi funzionasse normalmente, ma invece hanno sperimentato ritardi misteriosi.


La bijection mancante crea dissonanza cognitiva: "Ho fatto una scelta semplice, perché il mio computer si comporta stranamente?" Questa disconnessione danneggia la fiducia e la soddisfazione degli utenti.


Ogni bijection rotto introduce una crepa nel modello di affidabilità del sistema, rendendolo sempre più imprevedibile nel tempo.


La rottura di questo collegamento provoca discrepanze tra le aspettative dell'utente e l'esecuzione del software, portando a ritardi imprevedibili eMappaviolazioni del mondo reale.

La generazione

I generatori AI possono creare questo odore avvolgendo ingenuamente il codice legato in condizionali senza convalidare tutti i percorsi.

La rilevazione

Chiedi all'IA di "assicurare che i rapporti di stato siano eseguiti in tutti i rami", e segnerà o risolverà questo odore spostando Report() al di fuori dei condizionali.

Prova a farlo!

Ricordate: gli assistenti AI commettono molti errori

Prompt suggerito: trovare altre segnalazioni mancanti

Prompt suggerito: trovare altre segnalazioni mancanti

Without Proper Instructions

With Specific Instructions

ChatGPT

ChatGPT

Claude

Claude

Perplexity

Perplexity

Copilot

Copilot

Gemini

Gemini

DeepSeek

DeepSeek

Meta AI

Meta AI

Grok

Grok

Qwen

Qwen

ChatGPT

ChatGPT

di Claude

di Claude

Perplessità

Perplessità

Copilotto

Copilotto

Gemelli

Gemelli

profondità

profondità

Obiettivo AI

Obiettivo AI

Grillo

Grillo

di Qwen

di Qwen

Conclusione

Segnala sempre il completamento incondizionato nel codice di inizializzazione.


La logica condizionale dovrebbe modificare il comportamento, non tacere i passaggi critici di segnalazione.

Relazioni

https://hackernoon.com/how-to-find-the-stinky-parts-of-your-code-part-xxxii

https://hackernoon.com/how-to-find-the-stinky-parts-of-your-code-part-xxxx

https://hackernoon.com/how-to-find-the-stinky-parts-of-your-code-part-xviii

Maggiori informazioni

Disclaimer

L’odore è mioopinione.


La sperimentazione porta al fallimento e il fallimento porta alla comprensione.

La sperimentazione porta al fallimento e il fallimento porta alla comprensione.

di Burt Rutan


Questo articolo fa parte della serie CodeSmell.


Trending Topics

blockchaincryptocurrencyhackernoon-top-storyprogrammingsoftware-developmenttechnologystartuphackernoon-booksBitcoinbooks