The worst bugs return 200

Γράφει ο Panagiotis Athanasakopoulos · Παναγιώτης Αθανασακόπουλος

Engineering14 Σεπτεμβρίου 20263 min

Ένα crash είναι η αποτυχία που δεν χρειάζεται να την ψάξετε. Η σελίδα αδειάζει, ένας συναγερμός χτυπά, κάποιος το προσέχει μέσα σε λίγα λεπτά και η διόρθωση έχει μπει ως το μεσημέρι. Οι αποτυχίες που κοστίζουν πραγματικά χρήματα είναι το άλλο είδος: αυτές που αναφέρουν επιτυχία. Τίποτα δεν είναι κόκκινο, τίποτα δεν καταγράφεται ως σφάλμα, και το σύστημα συνεχίζει να κάνει το λάθος πράγμα για όσο καιρό κανείς δεν κοιτάζει τι βγήκε στην πράξη, αλλά μόνο αν η ένδειξη λέει «επιτυχία».

Έχουν μερικές μορφές που αναγνωρίζονται εύκολα. Μια σελίδα αποτελεσμάτων που επιστρέφει 200, με απολύτως έγκυρο HTML και τίποτα μέσα. Μια νυχτερινή διεργασία που κάθε πρωί γράφει «ολοκληρώθηκε επιτυχώς», ενώ παραλείπει κάθε εγγραφή που απέτυχε στον έλεγχο. Ένα κλειδί API που σταμάτησε σιωπηλά να δουλεύει, ενώ κάθε συνάρτηση που το καλούσε διαβάζει την απάντηση που λείπει ως «δεν βρέθηκε τίποτα». Ένα chatbot που ζητά συγγνώμη ότι δεν μπορεί να βοηθήσει μοιάζει, απ' έξω, ακριβώς ίδιο με ένα chatbot που σωστά δεν μπορεί να βοηθήσει.

Σχεδόν όλες τις δημιουργεί κώδικας που προσπαθούσε να είναι προσεκτικός. Πιάσε την εξαίρεση, κατέγραψέ τη, επίστρεψε μια άδεια λίστα και προχώρα, ώστε μια κακή εγγραφή να μη ρίξει όλη τη σελίδα. Καθεμία από αυτές τις αποφάσεις στέκει μόνη της. Μαζί χτίζουν ένα σύστημα που μετατρέπει κάθε αποτυχία σε μια άδεια απάντηση που μοιάζει λογική. Και μια άδεια απάντηση είναι το μόνο πράγμα που δεν ψάχνει ποτέ κανείς.

Ο κανόνας που διορθώνει τα περισσότερα είναι να κρατάτε το «τίποτα» χωριστά από το «δεν μπόρεσα να μάθω», σε όλη τη διαδρομή. Μια αναζήτηση που έτρεξε και δεν βρήκε αποτελέσματα είναι μια άδεια λίστα. Μια αναζήτηση που δεν μπόρεσε να τρέξει είναι σφάλμα, και πρέπει να ανεβαίνει ως σφάλμα μέχρι να τη λάβει κάτι που μπορεί να αποφασίσει τι θα κάνει. Στο τέλος μπορεί και οι δύο να δείξουν στον χρήστη παρόμοιο μήνυμα. Μέσα στο σύστημα δεν πρέπει ποτέ να είναι η ίδια τιμή.

Ο δεύτερος κανόνας είναι να μετράτε την απουσία δουλειάς. Την επιτυχία είναι εύκολο να την καταγράψετε. Αυτό που χρειάζεται μέτρημα είναι η επιτυχία που λείπει. Πόσες εγγραφές άγγιξε η διεργασία, σε σχέση με πόσες έπρεπε; Πότε πήρε αυτός ο πίνακας την τελευταία του γραμμή; Ποια ενεργά στοιχεία δεν ενημερώθηκαν καθόλου στο τελευταίο τρέξιμο; Μια διεργασία που δεν ενημερώνει τίποτα για μια εβδομάδα πρέπει να σας ανησυχεί όσο μια διεργασία που κρασάρει. Και θα σας ανησυχήσει μόνο αν κάποιος έχει καταγράψει πώς μοιάζει το φυσιολογικό.

Ο τρίτος είναι να δοκιμάζετε με τον τρόπο που ένας άνθρωπος χρησιμοποιεί κάτι, όχι με τον τρόπο που το αναφέρει ένας server. Ένας κωδικός κατάστασης 200 σημαίνει ότι ο server έστειλε κάτι. Δεν σημαίνει ότι η σελίδα έχει προϊόντα, ότι το κουμπί στο email οδηγεί κάπου χρήσιμο ή ότι η φόρμα όντως αποθήκευσε. Οι έλεγχοι που αξίζει να αυτοματοποιήσετε είναι αυτοί που ακολουθούν τον σύνδεσμο, φορτώνουν τη σελίδα και μετρούν τι υπάρχει. Αυτό ακριβώς θα κάνει ο πρώτος πελάτης που θα βρει το πρόβλημα.

Και προσέξτε την cache. Μια ασταθής εξωτερική υπηρεσία που πού και πού δεν επιστρέφει τίποτα, μαζί με μια cache που αποθηκεύει ό,τι της δώσουν, μετατρέπει ένα κακό δευτερόλεπτο σε ώρες με άδειες σελίδες που σερβίρονται σαν να ήταν κανονικές. Μην αποθηκεύετε ποτέ στην cache ένα κενό αποτέλεσμα από κάτι που ξέρετε ότι δεν είναι αξιόπιστο. Αφήστε το επόμενο αίτημα να ξαναδοκιμάσει.

Οι αποτυχίες που κάνουν θόρυβο είναι δώρο. Η τεχνική δουλειά είναι να φροντίσετε ώστε κάθε αποτυχία να κάνει θόρυβο, και τίποτα στο σύστημα να μη μπορεί να αποτύχει δείχνοντας ότι όλα είναι εντάξει.

Common questions

Τι είναι μια σιωπηλή αποτυχία στο λογισμικό;
Μια αποτυχία που δεν εμφανίζεται ως αποτυχία. Η ενέργεια αναφέρει επιτυχία ή επιστρέφει μια κενή αλλά έγκυρη απάντηση, οπότε δεν προκύπτει σφάλμα και δεν χτυπά συναγερμός, ενώ το σύστημα δεν κάνει αυτό που πρέπει. Οι σιωπηλές αποτυχίες συνήθως κρατούν πολύ περισσότερο από τα crash, γιατί τίποτα δεν τραβά την προσοχή πάνω τους.
Γιατί μια απάντηση HTTP 200 δεν αποδεικνύει ότι μια σελίδα δουλεύει;
Ο κωδικός 200 σημαίνει μόνο ότι ο server επέστρεψε μια απάντηση. Η σελίδα μπορεί να είναι άδεια, να δείχνει λάθος δεδομένα ή να έχει χαλασμένους συνδέσμους. Οι ουσιαστικοί έλεγχοι φορτώνουν τη σελίδα ή ακολουθούν τον σύνδεσμο και επαληθεύουν το περιεχόμενο που θα έβλεπε πραγματικά ένας χρήστης.
Πώς παρακολουθείτε μια background διεργασία που μπορεί να μην κάνει τίποτα;
Καταγράφετε τι άλλαξε πραγματικά κάθε τρέξιμο και το συγκρίνετε με αυτό που έπρεπε να αλλάξει. Βάζετε ειδοποίηση όταν οι εγγραφές που επηρεάστηκαν είναι απρόσμενα λίγες ή μηδέν, όταν τα δεδομένα δεν ενημερώθηκαν μέσα στο κανονικό τους διάστημα ή όταν παραλείφθηκαν ενεργά στοιχεία. Όχι μόνο όταν η διεργασία πετάξει σφάλμα.

More from Panagiotis Athanasakopoulos

Initiate the blueprint

Talk to him directly.

Στην TWENTYONE δεν υπάρχει account manager. Πείτε μας τι ετοιμάζετε. Την πρώτη κουβέντα θα την κάνετε με τον άνθρωπο που θα αποφασίσει πώς θα φτιαχτεί.

Honestly? You’re going to regret switching tabs.

Δύσκολα θα βρείτε κορυφαίους custom developers που να νοιάζονται πραγματικά για το πώς θα μεγαλώσει η επιχείρησή σας.

Είμαστε οι καλύτεροι σε αυτό που κάνουμε, και το δείχνει η δουλειά μας. Μη χάσετε χρόνο και χρήματα με κάτι λιγότερο.

Με πείσατε.
Ας μιλήσουμε.