Κέρδη:
- Δυνατότητα δημιουργίας ενός διχτυού ασφαλείας δοκιμής που καταγράφει την τρέχουσα συμπεριφορά πριν από την ανακατασκευή
- Δυνατότητα να ζητάτε από την τεχνητή νοημοσύνη μικρούς, ενός βήματος, μετασχηματισμούς διατήρησης της συμπεριφοράς και να επικυρώνετε κάθε βήμα
- Ικανότητα εντοπισμού και ιεράρχησης τεχνικού χρέους εντός του επιχειρηματικού πλαισίου
Η αναδιαμόρφωση είναι η βελτίωση της εσωτερικής δομής ενός κώδικα χωρίς αλλαγή της εξωτερικής του συμπεριφοράς: καθιστώντας τον πιο ευανάγνωστο, απλούστερο, πιο διατηρήσιμο. Το τεχνικό χρέος, από την άλλη πλευρά, είναι ένας συμβιβασμός σχεδιασμού που έγινε για χάρη μιας γρήγορης λύσης και αποπληρώθηκε "με τόκο" με την πάροδο του χρόνου — κάθε γωνία που κόβετε σήμερα θα επιστρέψει ως επιβράδυνση ή σφάλμα αύριο. Η τεχνητή νοημοσύνη είναι ένας ισχυρός βοηθός που επιταχύνει επαναλαμβανόμενες και μηχανικές εργασίες ανακατασκευής. Υπάρχει όμως ένας χρυσός κανόνας ανακατασκευής και η τεχνητή νοημοσύνη από μόνη της δεν μπορεί να το εγγυηθεί: η συμπεριφορά δεν πρέπει να αλλάξει.
Σε αυτή την ενότητα, μαθαίνουμε πώς να κάνουμε ασφαλή ανακατασκευή με τεχνητή νοημοσύνη: μικρά και αναστρέψιμα βήματα, προστασία με δοκιμές, ανίχνευση μυρωδιών κωδικών και ιεράρχηση τεχνικού χρέους. Το κρίσιμο σημείο είναι το εξής: είναι οι επιτυχείς δοκιμές, όχι η λέξη του AI, που αποδεικνύει ότι η συμπεριφορά διατηρείται.
Ο χρυσός κανόνας της αναμόρφωσης: Η συμπεριφορά παραμένει σταθερή
Αυτό που κάνει την αναπαράσταση επικίνδυνη είναι η εν αγνοία αλλαγή συμπεριφοράς λέγοντας «βελτιώνομαι». Η απόρριψη μιας ακμής κατά την απλοποίηση μιας συνθήκης, η παραβίαση της σειράς κατά τον μετασχηματισμό ενός βρόχου, η απώλεια μιας παρενέργειας κατά τον διαχωρισμό μιας συνάρτησης—όλα αυτά παράγουν "καθαρό" αλλά σπασμένο κώδικα.
Αυτός είναι ο λόγος για τον οποίο η δοκιμή είναι απαραίτητη προϋπόθεση για την ανακατασκευή: πριν αλλάξετε, πρέπει να έχετε δοκιμές που καταγράφουν την υπάρχουσα συμπεριφορά. Αυτές οι δοκιμές είναι ένα «δίχτυ ασφαλείας». Εάν κατά λάθος σπάσετε κάτι κατά την ανακατασκευή, θα σπάσουν και θα σας προειδοποιήσουν. Εάν δεν έχετε δοκιμές, γράψτε πρώτα δοκιμές που διορθώνουν την υπάρχουσα συμπεριφορά (όπως μάθαμε στην ενότητα 5) — εδώ ξεκινάει η τεχνητή νοημοσύνη.
Προσοχή: Η ανακατασκευή με τη βοήθεια AI χωρίς δοκιμαστικό δίκτυο είναι μια από τις πιο ύπουλες πηγές σφαλμάτων. Είναι εύκολο να πεις "διατήρησα τη συμπεριφορά"? Η απόδειξη είναι ότι τα ίδια τεστ περνούν πριν και μετά την αλλαγή.
Βήμα προς βήμα: Ασφαλής ροή αναδιαμόρφωσης
- Τοποθετήστε το δίχτυ ασφαλείας. Αφήστε να υπάρχουν δοκιμές που θα καταγράφουν την τρέχουσα συμπεριφορά του κώδικα που θα αναπαράγετε. Αν όχι, γράψτε τα πρώτα (και δείτε τα να περάσουν).
- Ονομάστε τη μυρωδιά. Τι βελτιώνετε και γιατί; «Αυτή η συνάρτηση κάνει 3 πράγματα», «η ίδια λογική επαναλαμβάνεται σε 4 σημεία», «τα ονόματα είναι παραπλανητικά».
- Ζητήστε μικρά βήματα ενός βήματος. Ζητήστε από το AI έναν μεμονωμένο μετασχηματισμό (π.χ. απλώς «διαχωρίστε αυτή τη συνάρτηση στη μέση»), όχι για να ξαναγράψετε ολόκληρο το αρχείο.
- Εκτελέστε τις δοκιμές. Μετά από κάθε βήμα. Αν είναι πράσινο συνεχίστε, αν είναι κόκκινο πάρε το πίσω.
- Διαβάστε Διαφ. Επιβεβαιώστε γραμμή προς γραμμή ότι η αλλαγή είναι πράγματι διατήρηση της συμπεριφοράς. Μπορεί να υπάρχει μια λογική ολίσθηση όταν λέμε ότι το AI είναι "απλώς δομή".
- Συνδυάστε σε μικρά κομμάτια. Οι μεγάλες εφάπαξ αναδιαμόρφωση PR είναι επικίνδυνες και μη αναθεωρήσιμες.
Τρεις Μίνι Θήκες
Περίπτωση 1 — Λειτουργία 220 γραμμών με ασφαλή διαχωρισμό. Μία ομάδα είχε λειτουργία επεξεργασίας παραγγελιών 220 γραμμών. Τα πρώτα 14 τεστ γράφτηκαν (με τη βοήθεια AI) που κατέγραψαν την τρέχουσα συμπεριφορά, όλα πέρασαν. Στη συνέχεια, η συνάρτηση χωρίστηκε σε 5 μικρότερες συναρτήσεις βήμα προς βήμα με AI. Οι δοκιμές πραγματοποιήθηκαν μετά από κάθε βήμα. Δύο δοκιμές έσπασαν σε ένα βήμα - το AI είχε χάσει την επιστροφή σε μια θήκη. Οι δοκιμές το έπιασαν αμέσως και το διόρθωσαν. Χωρίς το δίκτυο, το σφάλμα θα μπορούσε να είχε φτάσει μέχρι την παραγωγή.
Περίπτωση 2 — Καταστροφή χωρίς δοκιμαστικό δίκτυο. Ένας άλλος προγραμματιστής "καθάρισε" μια ενότητα υπολογισμού ημερομηνίας που δεν είχε δοκιμές με AI. Ο κωδικός φαινόταν καλύτερος, αλλά υπολόγιζε το δίσεκτο έτος εσφαλμένα. Το σφάλμα εμφανίστηκε δύο εβδομάδες αργότερα με ένα παράπονο πελάτη. Η απώλεια υπερέβη κατά πολύ τον χρόνο που εξοικονομήθηκε από την ανακατασκευή. Μάθημα: η ανακατασκευή χωρίς δοκιμή είναι ένα στοίχημα.
Περίπτωση 3 — Τεχνική ιεράρχηση χρέους. Μια ομάδα έδωσε στο AI ένα ανεκτέλεστο 30 περίπου «βελτιώσιμους» πόντους και έβαλε ο καθένας να σκοράρει στον άξονα «συχνότητα αλλαγής × κίνδυνος × προσπάθεια». Στον πίνακα που προέκυψε, μια άσχημη μονάδα που αγγίχθηκε σπάνια ήταν στην πραγματικότητα χαμηλής προτεραιότητας, ενώ μια μονάδα μέσης πολυπλοκότητας που άλλαζε συχνά είχε υψηλή προτεραιότητα. Η ομάδα κατεύθυνε την ενέργειά της στο σωστό μέρος.
Τέσσερα αντιγράψιμα πρότυπα
Ανίχνευση και ιεράρχηση οσμής κωδικού:
Υποψήφιος ανασχηματισμός λίστας "μυρίζει" σε αυτόν τον κωδικό: μακρά λειτουργία, επανάληψη (DRYViolation), παραπλανητικό όνομα, κατάσταση βαθιάς ένθεσης, κρυφή παρενέργεια, μαγικός αριθμός. Για καθένα: τοποθεσία, γιατί το πρόβλημα, προτεινόμενο μικρό βήμα, εκτιμώμενος κίνδυνος (χαμηλός/μέσος/υψηλός). ΜΗΝ ΑΛΛΑΞΕΤΕ ακόμα τον κωδικό, απλώς προγραμματίστε.{{code}}
Μετασχηματισμός σε ένα βήμα, διατήρησης της συμπεριφοράς:
Απλά κάντε αυτό: {{μοναδική μετατροπή, π.χ. Διαιρέστε αυτή τη συνάρτηση σε 3 μικρότερες συναρτήσεις με όνομα}}. ΑΛΛΑΞΤΕ την ορατή συμπεριφορά, την υπογραφή και τις τιμές επιστροφής. Γράψτε σε 1 πρόταση γιατί όλα όσα αλλάξατε διατηρούν τη συμπεριφορά.{{κωδικός}}
Δίχτυ ασφαλείας πριν από τον ανασχηματιστή (δοκιμή χαρακτηρισμού):
Γράψτε δοκιμές που καταγράφουν την ΤΡΕΧΟΥΣΑ συμπεριφορά αυτής της συνάρτησης (σωστή ή όχι). ο στόχος είναι να καταλάβουμε εάν η συμπεριφορά αλλάζει κατά την ανακατασκευή. Συμπεριλάβετε τυπικές καταχωρήσεις + άκρων. Γράψτε τις προσδοκίες με βάση την τρέχουσα έξοδο της συνάρτησης.{{function}}
Δημιουργία αρχείου τεχνικού χρέους (εκκρεμότητα):
Ρίξτε την ακόλουθη λίστα μυρωδιών σε έναν πίνακα προτεραιοτήτων: ουσία, επηρεαζόμενη περιοχή, συχνότητα αλλαγής (η γνώση μου: {{...}}), κίνδυνος, εκτιμώμενη προσπάθεια, προτεινόμενη προτεραιότητα. Βάλτε τις υψηλές επιπτώσεις + χαμηλή προσπάθεια στην κορυφή. {{smell_list}}
Αδύναμη προτροπή / Ισχυρή προτροπή
Αδύναμο: "Καθαρίστε αυτόν τον κωδικό και βελτιώστε τον."
Ισχυρή: "Διαχωρίστε αυτήν τη συνάρτηση 90 γραμμών σε 3 μικρότερες συναρτήσεις με μία μόνο ευθύνη, χωρίς να αλλάξετε την εξωτερική της συμπεριφορά και την υπογραφή της. Διατηρήστε τις παρενέργειες (γράφει το DB) με την τρέχουσα σειρά. Έχω δοκιμές, η συμπεριφορά πρέπει να παραμείνει ίδια. Δώστε τη διαφορά και εξηγήστε με μία πρόταση γιατί κάθε διαχωρισμός διατηρεί τη συμπεριφορά. [κωδικός]"
Ισχυρή έκδοση. Απαιτεί έναν ενιαίο συγκεκριμένο μετασχηματισμό, επιβάλλει ρητά έναν περιορισμό συμπεριφοράς και υπογραφής και απαιτεί αιτιολόγηση. Αόριστες αιτήσεις όπως «κάντε καλύτερα» οδηγούν σε ανεξέλεγκτες και επικίνδυνες αλλαγές.
Τύπος ανακατασκευής
Αξιοπιστία AI
Προαπαιτούμενο
μετονομασία
ψηλά
Είναι σωστό το πεδίο εφαρμογής;
Διαίρεση συναρτήσεων
μέτρια-υψηλή
Το Testnet είναι απαραίτητο
Κοινή χρήση επανάληψης
μεσαίο
Η διαφορά συμπεριφοράς μπορεί να είναι κρυφή
Αλλαγή αλγόριθμου/δομής
χαμηλά
Εκτεταμένες δοκιμές + επικύρωση από τον άνθρωπο
Αρχιτεκτονική αναδιάταξη
χαμηλά
Ανθρωποκεντρικά, με υποστήριξη AI
Διαχείριση τεχνικού χρέους, όχι επαναφορά του
Το τεχνικό χρέος δεν είναι όλο κακό. Μερικές φορές ο συνειδητός δανεισμός (για την κάλυψη μιας παράδοσης) είναι η σωστή απόφαση. Στόχος δεν είναι να εξαλειφθεί το χρέος, αλλά να γίνει ορατό και διαχειρίσιμο. Η τεχνητή νοημοσύνη είναι γρήγορη στον εντοπισμό και την ιεράρχηση του χρέους, αλλά η απόφαση «ποιο χρέος πρέπει να πληρωθεί και ποιο να εγκαταλειφθεί» απαιτεί επιχειρηματικό πλαίσιο: πόσο συχνά αλλάζει αυτή η ενότητα, πόσους ανθρώπους επηρεάζει, ποιος είναι ο κίνδυνος; Αυτή η απόφαση λαμβάνεται από την ομάδα που γνωρίζει τη βάση κώδικα και το προϊόν. Το AI απλώς διευκρινίζει τις επιλογές.
Συμβουλή: Κρατήστε το ανασχηματιστικό PR σας ξεχωριστό από τα PR που περιλαμβάνουν αλλαγή συμπεριφοράς. Το να μπορείτε να πείτε "αυτό το PR είναι απλώς μια αναμόρφωση, η συμπεριφορά είναι η ίδια" διευκολύνει τη διερεύνηση και σας επιτρέπει να περιορίσετε γρήγορα την αιτία εάν προκύψει πρόβλημα.
Συνήθη λάθη
- Ανακατασκευή χωρίς δοκιμαστικό δίκτυο. Δεν μένεις με τίποτα να αποδείξεις ότι η συμπεριφορά διατηρείται.
- Σημαίνει "εκκαθάριση ολόκληρου του αρχείου". Μεγάλες, ανεξέλεγκτες αλλαγές κρύβουν το σφάλμα και δεν μπορούν να εξεταστούν.
- Αποδοχή του Diff χωρίς να το διαβάσετε. Η τεχνητή νοημοσύνη μπορεί να έχει γλίστρησε σε κάποια λογική όταν είπε "απλά δομή".
- Συγχέοντας την αναμόρφωση με την αλλαγή συμπεριφοράς. Το να κάνετε και τα δύο στο ίδιο PR καθιστά αδύνατη την παρακολούθηση της βασικής αιτίας.
- Προσπαθώντας να διορθώσετε κάθε μυρωδιά. Ο άσχημος κώδικας που αλλάζει σπάνια είναι συχνά χαμηλής προτεραιότητας. Κατανείμετε ενέργεια στο μέρος που αλλάζει συχνά.
Συνοπτικά
Ο μόνος κανόνας της ανακατασκευής είναι ότι η συμπεριφορά παραμένει σταθερή και η απόδειξη αυτού είναι τα τεστ. Η τεχνητή νοημοσύνη είναι ισχυρή στην ανίχνευση μυρωδιών κώδικα, μετασχηματισμών ενός βήματος και ιεράρχησης του τεχνικού χρέους. αλλά πρέπει να ρυθμίσετε το δίχτυ ασφαλείας, να εκτελέσετε τις δοκιμές και να διαβάσετε τη διαφορά μετά από κάθε βήμα. Κάντε μικρά, αναστρέψιμα βήματα. διάκριση της αναμόρφωσης από την αλλαγή συμπεριφοράς. και αφήστε την ομάδα που γνωρίζει το επιχειρηματικό πλαίσιο να αποφασίσει ποιο χρέος θα πληρώσει.
Εργασία εφαρμογής
Επιλέξτε μια συνάρτηση από τη βάση του κώδικά σας που σας φαίνεται μεγάλη ή πολύπλοκη. Πρώτα εκτυπώστε δοκιμές που αποτυπώνουν την τρέχουσα συμπεριφορά του με το πρότυπο "δίχτυ ασφαλείας" και δείτε αν όλα περνούν. Στη συνέχεια, αναπαράγετε τη συνάρτηση με έναν μόνο τρόπο (π.χ. διαχωρισμό στη μέση) με το μοτίβο "ένα βήμα, μετασχηματισμός διατήρησης της συμπεριφοράς" και εκτελέστε ξανά τις δοκιμές. Εάν ένα τεστ χαλάσει, μάθετε γιατί. Εάν δεν σπάσει καθόλου, διαβάστε τη διαφορά γραμμή προς γραμμή για να επιβεβαιώσετε ότι η συμπεριφορά όντως διατηρείται.
λίστα ελέγχου
- [ ] Γνωρίζω ότι η ανακατασκευή δεν πρέπει να αλλάξει τη συμπεριφορά και υπάρχουν δοκιμές για να το αποδείξουν.
- [ ] Εγκαθιστώ ένα δίχτυ ασφαλείας που εντοπίζει την τρέχουσα συμπεριφορά πριν από το refactor.
- [ ] Θέλω μικρούς μετασχηματισμούς ενός βήματος από την τεχνητή νοημοσύνη, όχι μεγάλες εφάπαξ.
- [ ] Μετά από κάθε βήμα εκτελώ τις δοκιμές και διαβάζω τη διαφορά.
- [ ] Συνεχίζω να ανακατασκευάζω το PR ξεχωριστά από το PR αλλαγής συμπεριφοράς.
- [ ] Δίνω προτεραιότητα στο τεχνικό χρέος με το επιχειρηματικό πλαίσιο, όχι τυφλά προσπαθώντας να μηδενίσω.