Μια πύλη αυτονομίας είναι ο κανόνας που αποφασίζει πότε ένα σύστημα που ήδη μπορεί να δράσει επιτρέπεται τελικά να δράσει. Ο Helios, ένα προσωπικό trading σύστημα που έφτιαξα για τον εαυτό μου, τρέχει εδώ και μήνες και ακόμα δεν έχει περάσει τη δική μου. Παρατηρεί, αποφασίζει, καταγράφει τι θα είχε κάνει και μου στέλνει μήνυμα κάθε πρωί. Αυτό που δεν του επιτρέπεται είναι να αγγίξει οτιδήποτε στ' αλήθεια.
Όχι επειδή δεν είναι έτοιμο. Επειδή δεν το έχει κερδίσει ακόμα.
Με δυο λόγια: φτιάξε ολόκληρη τη δυνατότητα, αλλά κράτα την άδεια σε δικό της διακόπτη. Γράψε τις προϋποθέσεις για να ανοίξει όσο ακόμα δεν έχεις τίποτα να κερδίσεις, βάλε μία που μόνο ο χρόνος μπορεί να ικανοποιήσει, και μηδένισε τον μετρητή αυτόματα μόλις κάτι σπάσει.
Αυτός ο περιορισμός αποδείχθηκε το πιο χρήσιμο κομμάτι του project. Άλλαξε επίσης τον τρόπο που παραδίδω λογισμικό σε πελάτες, γι' αυτό και το γράφω εδώ αντί σε ένα προσωπικό σημειωματάριο.
Ποια είναι η διαφορά ανάμεσα σε δυνατότητα και άδεια;
Η δυνατότητα είναι τι μπορεί να κάνει ο κώδικας. Η άδεια είναι αν επιτρέπεται να το κάνει τώρα. Ο περισσότερος αυτοματισμός φεύγει με τα δύο κολλημένα μεταξύ τους. Στήνεις τη διαδρομή από άκρη σε άκρη και μετά προσέχεις. Το σύστημα μπορεί να κάνει το πράγμα, κι εσύ απλώς προσπαθείς να μην το αφήσεις να κάνει το λάθος πράγμα.
Έτσι όμως ο μηχανισμός ασφαλείας σου είναι η επαγρύπνηση. Η επαγρύπνηση τελειώνει. Τελειώνει ακριβώς τη στιγμή που τη χρειάζεσαι: αργά το βράδυ, όταν είσαι κουρασμένος και το σύστημα δουλεύει άψογα έξι βδομάδες.
Ο χωρισμός των διακοπτών διορθώνει τη σειρά. Το σύστημα είναι ικανό για όλη τη διαδρομή από την πρώτη μέρα. Ξεχωριστά, του επιτρέπεται να εκτελεί μόνο τα κομμάτια που έχει ήδη αποδείξει ότι χειρίζεται σωστά. Η δυνατότητα είναι κώδικας. Η άδεια είναι ένα gate. Όταν γυρίζει ο ένας διακόπτης, ο άλλος μένει εκεί που ήταν.
Το πρακτικό αποτέλεσμα είναι ότι το «άσ' το να τρέξει κανονικά» παύει να είναι διάθεση. Δεν είναι πια απόφαση που παίρνω μια Παρασκευή που νιώθω αισιόδοξος. Είναι ένα σύνολο προϋποθέσεων που έγραψα από πριν, ήρεμος, χωρίς συμφέρον στην απάντηση.
Γιατί να γράψεις τα κριτήρια πριν θελήσεις να τα περάσεις;
Γιατί η εκδοχή σου που θέλει να τα περάσει θα διαπραγματευτεί, και μάλιστα καλά. Ξέρει κάθε δικαιολογία που σε πείθει.
Τα δικά μου κριτήρια ζουν μέσα στο spec του project: συγκεκριμένες προϋποθέσεις, σε απλές προτάσεις, με νούμερα όπου χρειάζονται νούμερα. Το αν είναι τα τέλεια κριτήρια μετράει λιγότερο από το ότι υπάρχουν και προηγούνται της επιθυμίας μου να τα περάσω. Ένας κανόνας που έγραψα πριν έναν μήνα διαπραγματεύεται από θέση που δεν μπορώ εύκολα να διαφθείρω. Ο παλιός μου εαυτός δεν είχε τίποτα να κερδίσει.
Δύο πράγματα που τα έκανα λάθος στην αρχή, και τα δύο αξίζει να τα κλέψεις.
Βάλε ένα κριτήριο που εξαρτάται από τον χρόνο, όχι από την προσπάθεια. Κάτι σαν «τρέχει χωρίς ανεξήγητες αστοχίες για N συνεχόμενες ημέρες». Αυτό δεν το βγάζεις με ένα ξενύχτι του Σαββατοκύριακου. Αναγκάζει το σύστημα να καθίσει και να αποδείξει τον εαυτό του σε συνθήκες που δεν έστησες εσύ. Για μένα είναι το μόνο κριτήριο που πιάνει σταθερά τις αστοχίες που εμφανίζονται όταν δεν κοιτάει κανείς.
Ο μηδενισμός του μετρητή πρέπει να είναι αυτόματος. Όταν κάτι σπάσει, ο μετρητής γυρίζει στο μηδέν και δεν ανοίγει καμία συζήτηση. Έτσι κόβεται η συζήτηση που θα έκανα με τον εαυτό μου, αυτή που ξεκινάει με «ε, αυτό δεν μετράει και πολύ». Το ρολόι μου έχει μηδενίσει πάνω από μία φορά για λόγους που δεν είχαν καμία σχέση με τον κώδικα. Κυρίως hardware. Δεν είναι άδικο. Αν το μηχάνημα πάνω στο οποίο ζει δεν είναι σταθερό, το σύστημα δεν είναι έτοιμο, όσο καλός κι αν είναι ο κώδικας.
Τι σου δίνει στην πράξη μια μεγάλη περίοδος μόνο παρατήρησης;
Σου δίνει το test suite που δεν μπορείς να γράψεις.
Μήνες καταγραφής κάθε απόφασης χωρίς καμία εκτέλεση δεν είναι καθυστέρηση. Φέρνει στην επιφάνεια τις αστοχίες που δεν θα μπορούσες να φανταστείς στο σχεδιασμό: την ακραία περίπτωση που εμφανίζεται μόνο την τρίτη Κυριακή, την παραδοχή για τις ζώνες ώρας που είναι λάθος δύο φορές τον χρόνο, το dependency που συμπεριφέρεται αλλιώς μετά από ένα update. Καθένα από αυτά θα ήταν ζωντανό περιστατικό. Αντί γι' αυτό, ήταν μια γραμμή στο πρωινό μήνυμα και μια ήσυχη διόρθωση το απόγευμα.
Σου δίνει επίσης ένα τίμιο αρχείο. Όταν τελικά ανοίξει η πύλη, δεν θα αποφασίζω με βάση το πόσο σίγουρος νιώθω εκείνη τη βδομάδα. Θα αποφασίζω με βάση μήνες καταγεγραμμένης συμπεριφοράς, μαζί με όλες τις μέρες που έκανε λάθος, που είναι και το μόνο δείγμα με αξία.
Πώς παραδίδεις με ασφάλεια ένα αυτοματοποιημένο feature σε πελάτη;
Πίσω από ένα flag, στη λειτουργία όπου παράγει πραγματικό αποτέλεσμα και δεν στέλνει τίποτα.
Δεν φτιάχνω trading συστήματα για πελάτες και δεν το προσφέρω. Το μοτίβο όμως πέρασε αυτούσιο στη δουλειά του web. Ό,τι δρα μόνο του παίρνει την ίδια μεταχείριση: μια αποστολή newsletter, μια διαδρομή πληρωμής, μια αυτόματη απάντηση, μια μαζική ενημέρωση.
Τρέχει σε λειτουργία όπου παράγει ακριβώς το αποτέλεσμα που θα έστελνε και το δείχνει σε άνθρωπο. Μένει εκεί μέχρι το αποτέλεσμα να γίνει βαρετό, ασήμαντο και ελεγμένο αρκετές φορές ώστε το άναμμα να μην έχει καμία ένταση. Μετά αλλάζει ένα flag και τίποτα άλλο. Τίποτα εξωτικό εδώ: είναι η κλασική πρακτική των feature toggles, και οι μηχανισμοί περιγράφονται καθαρά στο άρθρο του Pete Hodgson για τα feature toggles στο martinfowler.com.
Οι πελάτες το διαβάζουν συνήθως ως προσοχή, και εν μέρει είναι. Ο μεγαλύτερος λόγος όμως είναι η ταχύτητα. Μια εκδοχή που ανάβει με ένα flag είναι εκδοχή που μπορώ να χτίσω επιθετικά, γιατί το λάθος παραμένει φθηνό μέχρι τη στιγμή που κάποιος αποφασίσει ότι δεν είναι. Τα αναστρέψιμα βήματα σε πάνε πιο γρήγορα από τα προσεκτικά.
Η πύλη είναι ακόμα κλειστή
Έτσι ο Helios συνεχίζει να τρέχει, να αποφασίζει και να μην του επιτρέπεται. Η πύλη είναι γραμμένη. Δεν έχει περάσει ακόμα. Και το ότι θέλω να περάσει είναι ακριβώς ο λόγος που δεν έχω δικαίωμα ψήφου.
Αν θες να δεις πώς φαίνεται αυτή η λογική σε πραγματική δουλειά, το υπόλοιπο blog και τα πρόσφατα projects μου είναι η μεγάλη εκδοχή.
Ετοιμάζεις κάτι που δρα μόνο του, που στέλνει, χρεώνει, δημοσιεύει ή απαντά; Το φτιάχνω με τον διακόπτη ασφαλείας μέσα.
