Steven
Steven7 λεπτά ανάγνωσης

Η ανατομία της τέλειας κυκλοφορίας λογισμικού: Πώς ο έλεγχος κώδικα έπιασε αυτό που τα τεστ δεν μπορούσαν

Σε όλη τη σειρά του GeekBye v2, το ίδιο πράγμα συμβαίνει ξανά και ξανά: μια διόρθωση περνάει κάθε τεστ στο μηχάνημα του προγραμματιστή, και μετά ο έλεγχος κώδικα αποδεικνύει ότι θα είχε αποτύχει για σχεδόν όλους. Αυτή είναι η ροή εργασίας πίσω από εννέα κυκλοφορίες — η πύλη ελέγχου, οι διορθώσεις που πιάστηκαν από νωρίς και η πειθαρχία του «τεστ πριν την αποστολή» που μετατρέπει το «δουλεύει σ' εμένα» σε «δουλεύει».

Μηχανική
Διαδικασία
Έλεγχος Κώδικα
Κυκλοφορίες GeekBye
Η ανατομία της τέλειας κυκλοφορίας λογισμικού: Πώς ο έλεγχος κώδικα έπιασε αυτό που τα τεστ δεν μπορούσαν

Μέσα σε μερικές εβδομάδες, το GeekBye κυκλοφόρησε εννέα εκδόσεις — από την v2.0.0 έως την v2.0.11 — και αυτή η σειρά αφηγήθηκε την ιστορία της καθεμιάς. Διαβάστε τες μαζί και ξεπηδάει ένα μοτίβο πιο ενδιαφέρον από οποιοδήποτε μεμονωμένο σφάλμα: ξανά και ξανά, μια διόρθωση περνούσε κάθε τεστ στο μηχάνημα του προγραμματιστή, και ο έλεγχος κώδικα αποδείκνυε ότι θα είχε αποτύχει για σχεδόν όλους τους υπόλοιπους.

Αυτό το χάσμα — ανάμεσα στο «δουλεύει σ' εμένα» και στο «δουλεύει» — είναι εκεί που πραγματικά κατοικεί η αξιοπιστία. Αυτή είναι η ροή εργασίας που το κλείνει, και το ευρετήριο κάθε κυκλοφορίας που παρήγαγε.

Το μοτίβο: πράσινα τεστ, λάθος απάντηση

Ορίστε τρεις από τις πιο ξεκάθαρες περιπτώσεις της σειράς, γιατί κάνουν το αφηρημένο συγκεκριμένο.

  • Στη διόρθωση της καταγραφής σε πολλαπλές οθόνες (v2.0.10), η πρώτη υλοποίηση αγκύρωσε την καταγραφή οθόνης στο παράθυρο επικάλυψης της εφαρμογής. Πέρασε τον έλεγχο — σε ένα μηχάνημα ανάπτυξης με μία οθόνη. Ο έλεγχος σκέφτηκε πού βρίσκεται πραγματικά αυτή η επικάλυψη (στην κύρια οθόνη, πάντα, εκτός αν τη σύρεις φυσικά) και απέδειξε ότι η «διόρθωση» θα κατέληγε ξανά ακριβώς στη λάθος οθόνη για σχεδόν κάθε πραγματικό χρήστη. Η σωστή αγκύρωση — ο δρομέας — προέκυψε από αυτό το επιχείρημα, όχι από κάποιο τρέξιμο τεστ.
  • Στην κυκλοφορία με το εναλλακτικό WebSocket (v2.0.8), ο έλεγχος βρήκε ότι ο ακριβής 403 που επιστρέφει ένας proxy που μπλοκάρει είχε ταξινομηθεί ως θανάσιμο σφάλμα ταυτοποίησης — οπότε το εναλλακτικό μονοπάτι που η λειτουργία υπήρχε για να το ενεργοποιήσει δεν μπορούσε ποτέ να πυροδοτηθεί. Η λειτουργία θα είχε κυκλοφορήσει, θα είχε περάσει τα τεστ της αίσιας πορείας, και δεν θα έκανε τίποτα για το πραγματικό της κοινό.
  • Στη διόρθωση του χρονικού ορίου αδράνειας (v2.0.9), η πρώτη έκδοση σφράγιζε το ρολόι «είμαι ακόμα ζωντανός» μέσα σε ένα μονοπάτι κώδικα που ένα υποσύνολο μεταγραφών νόμιμα παρακάμπτει — αυτό του άλλου ομιλητή. Ο έλεγχος έπιασε ότι μια μελλοντική αλλαγή θα μπορούσε να επανεισαγάγει σιωπηλά ακριβώς το σφάλμα που διορθωνόταν, και η σφραγίδα μετακινήθηκε κάπου χωρίς προϋποθέσεις, με ένα τεστ που την κρατάει εκεί.

Κανένα από αυτά δεν πιάστηκε τρέχοντας τον κώδικα. Όλα πιάστηκαν από έναν ελεγκτή που σκεφτόταν γιατί ο κώδικας δουλεύει — και έβρισκε μια περίπτωση όπου δεν δουλεύει.

Τα τρία μέρη της πύλης

Η ροή εργασίας πίσω από τη σειρά δεν είναι περίπλοκη. Είναι τρεις συνήθειες που εφαρμόζονται χωρίς εξαίρεση.

1. Ο έλεγχος σκέφτεται για την ορθότητα, δεν τρέχει απλώς τον κώδικα. Ένα τεστ που περνάει αποδεικνύει ότι ο κώδικας δουλεύει για την περίπτωση που σκέφτηκες. Ο έλεγχος είναι ένα δεύτερο, ανταγωνιστικό μοντέλο του συστήματος που ρωτάει ποια περίπτωση δεν σκέφτηκες; — τη δεύτερη οθόνη, τον εταιρικό proxy, τη μεταγραφή που παρακάμπτει το κλαδί, τον πελάτη που είναι μία έκδοση πίσω. Το βήμα ελέγχου σε αυτή τη σειρά ήταν συχνά ένας ανεξάρτητος ελεγκτής-πράκτορας, που είχε προτραπεί να αναιρέσει τη διόρθωση, όχι να την ευλογήσει. Αυτή η προσέγγιση είναι όλο το νόημα: ένας ελεγκτής που προσπαθεί να σπάσει τη λογική σου βρίσκει την τρύπα που ένας ελεγκτής που προσπαθεί να την εγκρίνει προσπερνάει επιφανειακά.

2. Κάθε διόρθωση συμπεριφοράς στέλνεται με ένα τεστ που καρφώνει την ακριβή αποτυχία. Όχι ένα τεστ ότι η λειτουργία δουλεύει — ένα τεστ ότι αυτό το συγκεκριμένο σφάλμα είναι νεκρό. Ο 403 του μπλοκαρισμένου proxy πρέπει να περνάει στο εναλλακτικό μονοπάτι· ένας πραγματικός 403 ταυτοποίησης δεν πρέπει. Το ρολόι δραστηριότητας πρέπει να σφραγίζει σε μια μεταγραφή που παρακάμπτει την απόδοση. Αυτά τα τεστ υπάρχουν ώστε το σφάλμα να μην μπορεί να επιστρέψει αθόρυβα σε έξι μήνες όταν κάποιος κάνει αναδιάρθρωση κοντά — η αποτυχία είναι καρφωμένη στο πάτωμα.

3. Το build είναι notarized και επαληθευμένο πριν κυκλοφορήσει. Αρκετές από αυτές τις διορθώσεις πήγαν από τη διάγνωση σε μια υπογεγραμμένη, notarized, αυτο-ενημερούμενη κυκλοφορία μέσα σε μία ημέρα. Αυτή η ταχύτητα είναι ασφαλής μόνο επειδή η πύλη είναι πειθαρχημένη: η διάγνωση αποδεικνύει τη ρίζα του προβλήματος (η κυκλοφορία για την άδεια μικροφώνου έστειλε τη διαγνωστική της πρώτα), το τεστ καρφώνει τη διόρθωση, ο έλεγχος αναιρεί τη λογική, και μόνο τότε βγαίνει ένα πραγματικό notarized build. Η αυστηρότητα είναι αυτό που κάνει την ταχύτητα ασφαλή, όχι αυτό που ανταλλάσσεται με αυτήν.

Γιατί αυτό έχει μεγαλύτερη σημασία για μια εφαρμογή AI

Υπάρχει ένας λόγος που αυτή η πειθαρχία είναι αδιαπραγμάτευτη για ένα εργαλείο σαν το GeekBye ειδικά. Αρκετά από τα πιο άσχημα σφάλματα της σειράς ήταν σιωπηλά-λανθασμένα, όχι θορυβώδη σε κατάρρευση: ένα στιγμιότυπο που τροφοδοτούσε τη λάθος οθόνη στο AI (v2.0.10), μια μεταγραφή προκατειλημμένη προς άχρηστους όρους ώστε το «speak» έβγαινε ως όνομα (v2.0.11), ένας βοηθός που απαντούσε σε λάθος λειτουργία χωρίς κανένα τρόπο να το δεις (v2.0.3 + v2.0.5). Όταν η εφαρμογή σου τροφοδοτεί περιεχόμενο σε ένα μοντέλο, μια λάθος είσοδος παράγει μια με αυτοπεποίθηση λανθασμένη έξοδο και κανένα σφάλμα πουθενά. Δεν μπορείς να βγεις με τεστ από αποτυχίες που δεν πετάνε εξαίρεση. Πρέπει να βγεις με τη σκέψη — που είναι ακριβώς αυτό για το οποίο υπάρχει η πύλη ελέγχου.

Η σειρά, με τη σειρά

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

  1. Τι χρειάζεται πραγματικά μια έκδοση 2: 206 commits από ειλικρινείς καταστάσεις — v2.0.0. Το θεμέλιο: μην δείχνεις ποτέ μια κατάσταση που δεν είναι αληθινή.
  2. Η μέρα που η εφαρμογή μας έκανε DDoS στον εαυτό της — v2.0.1 + v2.0.4. Ένα συσσωρευμένο φορτίο ανεβασμάτων κατά την εκκίνηση που ποδοπατούσε το ίδιο μας το backend, και η κλίμακα ζωτικότητας που επέβαλε.
  3. Ήρεμο λογισμικό: η διόρθωση του τρεμοπαίγματος και το τσιπ λειτουργίας απάντησης — v2.0.3 + v2.0.5. Κυκλοφορίες χωρίς νέες λειτουργίες που κέρδισαν εμπιστοσύνη μία λεπτομέρεια τη φορά.
  4. Η εφαρμογή σου στο Mac ξεχνάει την πρόσβαση στο μικρόφωνο σε κάθε εκκίνηση — v2.0.6. Το App Translocation του macOS, και η αποστολή της διαγνωστικής πριν τη διόρθωση.
  5. Μία μεταβλητή CSS, πέντε γύροι ελέγχου, και μια αλυσίδα εργαλείων Swift που έλεγε ψέματα — v2.0.7. Ομοιόμορφη διαφάνεια, και ένα δυαδικό αρχείο που άλλαξε μέγεθος επειδή η τεκμηρίωση διαφωνούσε με το σενάριο επιβολής.
  6. Ζωντανή μεταγραφή όταν το τείχος προστασίας μπλοκάρει τα WebSockets — v2.0.8. Ένα εναλλακτικό μονοπάτι καθαρού HTTPS, και ο 403 που θα το είχε κρύψει από τον ίδιο του τον εαυτό.
  7. Γιατί ο AI notetaker σου σταματά την εγγραφή στη μέση της σύσκεψης — v2.0.9. Ένα χρονόμετρο αδράνειας που μπορούσε να ακούει μόνο εσένα, και μια κατάρρευση που μπορούσε να κλειδώσει την επιφάνεια εργασίας σου.
  8. Γιατί η εγγραφή οθόνης καταγράφει τη λάθος οθόνη — v2.0.10. Το σφάλμα λάθος οθόνης, και η διόρθωση που περνούσε σε μία οθόνη και θα είχε αποτύχει σε δύο.
  9. Γιατί η μεταγραφή AI παρακούει τεχνικούς όρους — v2.0.11. Μεροληψία της ομιλίας προς το λεξιλόγιό σου — και η παλινδρόμηση που το χειροτέρεψε πριν το βελτιώσει.

Το συμπέρασμα

Η τελειότητα δεν είναι μια κατάσταση που φτάνεις· είναι μια πύλη που κρατάς. Εννέα κυκλοφορίες, και οι ίδιες τρεις ερωτήσεις σε καθεμία: ποια περίπτωση δεν σκέφτηκες, είναι η ακριβής αποτυχία καρφωμένη από ένα τεστ, και βγήκε πραγματικά ένα αληθινό υπογεγραμμένο build; Τίποτα από αυτά δεν είναι εντυπωσιακό. Όλα αυτά είναι ο λόγος που το GeekBye v2 νιώθεις ήρεμο. Αν φτιάχνεις λογισμικό — AI ή οτιδήποτε άλλο — το μεταφέρσιμο κομμάτι δεν είναι καμία μεμονωμένη διόρθωση. Είναι η συνήθεια να αντιμετωπίζεις μια πράσινη σουίτα τεστ ως την αρχή του επιχειρήματος, όχι το τέλος του.

Κάθε κυκλοφορία παραπάνω είναι ενεργή μέσω αυτόματης ενημέρωσης. Για το προϊόν στο οποίο αθροίζονται αυτές οι διορθώσεις, δες τι νέο υπάρχει στο GeekBye v2.

Σχετικά Άρθρα

Μία μεταβλητή CSS, πέντε γύροι ελέγχου κι ένα Swift toolchain που είπε ψέματα
Steven
Steven7 λεπτά ανάγνωσης

Μία μεταβλητή CSS, πέντε γύροι ελέγχου κι ένα Swift toolchain που είπε ψέματα

Το GeekBye v2.0.7 έκανε ολόκληρο το overlay ρυθμιζόμενα ημιδιαφανές — που ακούγεται σαν μια αλλαγή CSS μιας γραμμής και σε καμία περίπτωση δεν ήταν. Η πραγματική ιστορία είναι τι έπιασε ο έλεγχος κώδικα: δύο επιφάνειες που αρνούνταν να ξεθωριάσουν, μια μπάρα εγγραφής που φαινόταν λάθος στην ίδια αδιαφάνεια, κι ένα μεταγλωττισμένο εκτελέσιμο που ταλαντεύτηκε κατά 672 bytes επειδή η δική μας τεκμηρίωση είπε σε έναν ελεγκτή τη λάθος έκδοση Swift.

Μηχανική
Σχεδιασμός
Build
Ήρεμο Λογισμικό: Σκοτώνοντας έναν Διακόπτη που Τρεμόπαιζε και Μαθαίνοντας το Chat να Λέει σε Ποια Λειτουργία Βρίσκεται
Steven
Steven6 λεπτά ανάγνωσης

Ήρεμο Λογισμικό: Σκοτώνοντας έναν Διακόπτη που Τρεμόπαιζε και Μαθαίνοντας το Chat να Λέει σε Ποια Λειτουργία Βρίσκεται

Δύο μικρές κυκλοφορίες του GeekBye, χωρίς εντυπωσιακές λειτουργίες — απλώς ένας διακόπτης ρυθμίσεων που σταμάτησε να τρεμοπαίζει και ένας βοηθός chat που επιτέλους σου λέει αν απάντησε σε λειτουργία σύσκεψης ή σε λειτουργία προγραμματισμού. Να τι πραγματικά κοστίζει το «ήρεμο λογισμικό», μια λεπτομέρεια τη φορά.

Προϊόν
Σχεδιασμός
Μηχανική
Τι Πραγματικά Χρειάζεται μια Έκδοση 2: 206 Commits από Ειλικρινείς Καταστάσεις
Steven
Steven7 λεπτά ανάγνωσης

Τι Πραγματικά Χρειάζεται μια Έκδοση 2: 206 Commits από Ειλικρινείς Καταστάσεις

Το GeekBye v2 δεν ήταν μια κυκλοφορία με νέες λειτουργίες. Ήταν 206 commits στραμμένα σε μία ιδέα: η εφαρμογή δεν πρέπει ποτέ να λέει ψέματα για την ίδια της την κατάσταση. Να τι κοστίζει αυτό — μαζί με το λάθος μιας γραμμής στο lockfile που παραλίγο να μας εμποδίσει να κυκλοφορήσουμε οτιδήποτε από όλα αυτά.

Αξιοπιστία
Μηχανική
Κυκλοφορία