Αλλάξτε με ασφάλεια ένα υπάρχον σύστημα
ΟλοκληρώθηκεΔιατηρήστε τις τρέχουσες τεχνικές συμβάσεις όσο εισάγετε μια αλλαγή. Λάβετε υπόψη παλιούς clients, δεδομένα και τη σειρά των deployments.
Εκδότης TaigaΠώς γράφουμε
Ελέγξτε τι κατανοήσατεΜετονομάζετε μια στήλη βάσης δεδομένων και ενημερώνετε την εφαρμογή στην ίδια έκδοση. Τι μπορεί ακόμη να αποτύχει;Κάντε την άσκηση
Τι θα μάθετε
- Εντοπίστε τις τεχνικές συμβάσεις που μπορεί να επηρεάσει μια τοπική αλλαγή κώδικα.
- Εξηγήστε μια σταδιακή αλλαγή expand-and-contract.
- Διακρίνετε το rollback κώδικα από την ανάκτηση δεδομένων.
Εντοπίστε τις τεχνικές συμβάσεις γύρω από την αλλαγή
Το υπάρχον λογισμικό έχει κώδικα που το καλεί, αποθηκευμένα δεδομένα, προγραμματισμένες εργασίες και λειτουργικές διαδικασίες. Ορισμένες εξαρτήσεις δεν είναι ορατές στο αρχείο που θέλετε να επεξεργαστείτε. Ένας agent μπορεί να παράγει μια τοπικά σωστή αλλαγή που παραβιάζει μία από αυτές τις τεχνικές συμβάσεις.
Πριν από την υλοποίηση, εντοπίστε τα συστατικά που διαβάζουν και γράφουν τα επηρεαζόμενα δεδομένα. Εξετάστε routes, εργασίες παρασκηνίου, αναφορές και εξωτερικές ενσωματώσεις. Ελέγξτε αν άλλες ομάδες ή παλαιότερες εκδόσεις clients εξαρτώνται από την τρέχουσα συμπεριφορά.
Ζητήστε από τον agent να δείξει τα αποδεικτικά στοιχεία για αυτή τη χαρτογράφηση. Ένα αποτέλεσμα αναζήτησης είναι χρήσιμο σημείο εκκίνησης. Οι δυναμικές κλήσεις και τα εξωτερικά συστήματα που χρησιμοποιούν την υπηρεσία μπορεί όμως να απαιτούν επιβεβαίωση της εξάρτησης από υπεύθυνο.
Κάντε την τρέχουσα συμπεριφορά παρατηρήσιμη
Για ένα ανεπαρκώς τεκμηριωμένο module, προσθέστε εστιασμένους ελέγχους γύρω από τη συμπεριφορά που πρέπει να παραμείνει σταθερή. Αυτοί οι έλεγχοι περιγράφουν την τρέχουσα τεχνική σύμβαση. Δεν αποδεικνύουν ότι κάθε υπάρχουσα συμπεριφορά είναι επιθυμητή.
Αν η τρέχουσα συμπεριφορά συγκρούεται με μια απαίτηση, καταγράψτε τη σύγκρουση. Μη διατηρείτε ένα ελάττωμα ασφάλειας μόνο επειδή το κατέγραψε ένα test. Ζητήστε την απόφαση που χρειάζεται για να διακριθεί η επιδιωκόμενη συμπεριφορά από το ελάττωμα.
Χρησιμοποιήστε ρεαλιστικά fixtures χωρίς ευαίσθητα δεδομένα. Συμπεριλάβετε παλιές δομές δεδομένων και ελλιπείς εγγραφές όπου μπορεί να εμφανίζονται. Ένα νέο schema που δοκιμάζεται μόνο με νέα δεδομένα μπορεί να κρύβει προβλήματα migration.
Εξετάστε τη μετάβαση μεταξύ εκδόσεων
Εξετάστε μια πλασματική μετονομασία από customer_name σε display_name. Η άμεση μετονομασία μπορεί να προκαλέσει αστοχία σε παλιό instance της εφαρμογής κατά το deployment. Η ενημέρωση και των δύο αρχείων σε ένα pull request δεν κάνει το deployment ατομικό.
Μια σταδιακή προσέγγιση μπορεί να διατηρήσει τη συμβατότητα:
- Προσθέστε το νέο πεδίο χωρίς να αφαιρέσετε το παλιό.
- Ορίστε πώς οι νέες ενέργειες εγγραφής διατηρούν συνεπείς τις απαιτούμενες τιμές.
- Συμπληρώστε τις υπάρχουσες εγγραφές με διαδικασία backfill που μπορεί να επανεκκινηθεί.
- Επαληθεύστε την πληρότητα και τη συμπεριφορά των συστατικών που διαβάζουν τα δεδομένα.
- Μεταφέρετε τα συστατικά ανάγνωσης στο νέο πεδίο.
- Αφαιρέστε το παλιό πεδίο μόνο όταν δεν το χρησιμοποιεί πλέον κανένα συστατικό.
Η ακριβής μέθοδος εξαρτάται από τη βάση δεδομένων και τα μοτίβα εγγραφής. Η εγγραφή και στα δύο πεδία μπορεί να προκαλέσει ασυνέπεια αν αποτύχει μία από τις δύο ενέργειες. Μπορεί να χρειάζεται συναλλαγή βάσης δεδομένων ή άλλη ρητή μέθοδος συγχρονισμού. Μην εφαρμόζετε αυτό το παράδειγμα χωρίς να ελέγξετε τις εγγυήσεις του συστήματος.
Ο Martin Fowler περιγράφει αυτή τη γενική μετάβαση ως parallel change, που ονομάζεται επίσης expand-and-contract. Η βασική ιδέα είναι μια συμβατή μετάβαση πριν από την αφαίρεση.
Σχεδιάστε την ανάκτηση χωριστά από το rollback
Το rollback κώδικα επαναφέρει μια προηγούμενη έκδοση της εφαρμογής. Δεν αναιρεί αυτόματα ένα migration δεδομένων. Η παλιά έκδοση μπορεί να μην κατανοεί τα νέα δεδομένα. Ένα καταστροφικό migration μπορεί να αφαιρέσει πληροφορίες που το rollback κώδικα δεν μπορεί να ανακτήσει.
Προσδιορίστε την ενέργεια ανάκτησης για κάθε βήμα. Ένα επανεκκινήσιμο backfill μπορεί να είναι ασφαλές να συνεχιστεί. Ένας λανθασμένος μετασχηματισμός μπορεί να απαιτεί διόρθωση από διατηρημένα αρχικά δεδομένα. Μια καταστροφική ενέργεια μπορεί να απαιτεί επαληθευμένη διαδικασία επαναφοράς.
Ρωτήστε ποιος είναι υπεύθυνος για την απόφαση ανάκτησης και πόσο μπορεί να διαρκέσει. Μην αντιμετωπίζετε το «έχουμε αντίγραφα ασφαλείας» ως απόδειξη ότι η ανάκτηση καλύπτει την απαίτηση της υπηρεσίας.
Κρατήστε την αλλαγή κατάλληλη για ανασκόπηση
Διαχωρίστε άσχετες βελτιώσεις κώδικα από τη λειτουργική αλλαγή. Παρέχετε στο pull request το σχέδιο συμβατότητας, τα αποτελέσματα επαλήθευσης και τις συνθήκες αφαίρεσης. Σημειώστε το σημείο μετά το οποίο το rollback χρειάζεται πρόσθετη εργασία.
Ένας agent μπορεί να βοηθήσει στην εξέταση των συστημάτων που χρησιμοποιούν τα δεδομένα και στην προετοιμασία κώδικα migration. Ο αρμόδιος υπεύθυνος πρέπει και πάλι να αποδεχτεί το σχέδιο μετάβασης και ανάκτησης. Το τελικό σχέδιο είναι μόνο ένα μέρος μιας ασφαλούς αλλαγής.
Κάντε την άσκηση
Επιλέξτε μια μικρή αλλαγή πεδίου ή API. Καταγράψτε κάθε συστατικό που διαβάζει ή γράφει δεδομένα, μαζί με τις εργασίες παρασκηνίου. Περιγράψτε ένα πρώτο βήμα προσθήκης, έναν έλεγχο μετάβασης και μια συνθήκη αφαίρεσης. Εντοπίστε ποιο βήμα θα μπορούσε να εμποδίσει το rollback.
Λήψη φύλλου εργασίας (Markdown)Η κατάργηση αυτής της επιλογής διαγράφει όλη την πρόοδο που έχει αποθηκευτεί σε αυτόν τον browser.
Η πρόοδος παραμένει σε αυτό το πρόγραμμα περιήγησης. Χωρίς λογαριασμό ή παρακολούθηση.