Το πραγματικό σημείο καμπής του σχεδίου ήταν όταν ο Harry Hochheiser μου έστειλε το προσχέδιο του κώδικά του για προώθηση ταχυδρομείο στην θύρα SMTP του υπολογιστή που θα φιλοξενούσε τον client. Σχεδόν αμέσως κατάλαβα ότι μια σωστή υλοποίηση αυτού του χαρακτηριστικού θα καθιστούσε κάθε άλλη μέθοδο παράδοσης ταχυδρομείου απαρχαιωμένη.
Για πολλές εβδομάδες εμβάθυνα στο fetchmail όλο και πιο πολύ και, ταυτόχρονα, ένιωθα ότι το interface άντεχε στην χρήση αλλά ήταν απεριποίητο, άκομψο και με πάρα πολλά μικρά options εδώ κι εκεί. Η επιλογή διοχέτευσης του ταχυδρομείου που είχε ήδη παραληφθεί στο αρχείο mailbox ή στην στάνταρ έξοδο με ενοχλούσε, αλλά δεν καταλάβαινα γιατί.
Αυτό που είδα, όταν σκέφτηκα την προώθηση μηνυμάτων μέσω SMTP, ήταν ότι ο popclient προσπαθούσε να κάνει πάρα πολλά πράγματα. Είχε σχεδιαστεί να είναι ένα πρόγραμμα μεταφοράς ταχυδρομείου (MΤΑ) κι ένα πρόγραμμα τοπικής διανομής ταχυδρομείου (MDA). Με την προώθηση SMTP θα μπορούσε να απαλλαγεί απ' την λειτουργία MDA και να είναι ένα απλό MTA, μεταφέροντας τα μηνύματα σε άλλα προγράμματα, για τοπική παραλαβή, όπως ακριβώς το sendmail.
Γιατί να περιπλέκω τα πράγματα ρυθμίζοντας ένα πρόγραμμα διανομής ταχυδρομείου ή να εφαρμόζω την λειτουργία lock-and-append σ' ένα mailbox, τη στιγμή που η θύρα 25 εγγυημένα υπάρχει σε κάθε πλατφόρμα με υποστήριξη TCP/IP απ' την αρχή; Ιδιαίτερα όταν αυτό σημαίνει ότι, η αλληλογραφία που παραλαμβάνεται μοιάζει σίγουρα με ένα κανονικό ταχυδρομείο SMTP που ενεργοποιείται απ' τον αποστολέα, πράγμα το οποίο είναι αυτό που ζητάμε.
Τα μαθήματα εδώ είναι πολλά. Πρώτον, αυτή η ιδέα προώθησης μέσω SMTP ήταν το σημαντικότερο που κέρδισα απ' την συνειδητή προσπάθειά μου να εξομοιώσω τις μεθόδους του Linus. Ένας χρήστης μου έδωσε αυτή την πολύ καλή ιδέα-αυτό που έπρεπε να κάνω ήταν να καταλάβω τις επιπλοκές.
11. Το πιο σπουδαίο μετά από το να έχεις καλές ιδέες, είναι να αναγνωρίζεις τις καλές ιδέες των χρηστών σου. Μερικές φορές το τελευταίο είναι καλύτερο.
Σύντομα θα καταλάβεις ότι, αν είσαι εντελώς ειλικρινής για το πόσα χρωστάς στους άλλους και κάνεις αυτοκριτική, ο κόσμος θα σου συμπεριφέρεται σαν να είναι δική σου η επινόηση και θα είναι μετριόφρονες για την έμφυτη ευφυία σου. Όλοι μπορούμε να δούμε πόσο καλά αυτό λειτούργησε για τον Linus!
(Όταν έδωσα αυτό το κείμενο σε ένα συνέδριο με θέμα την Perl τον Αύγουστο του 1997, Ο Larry Wall κάθονταν στην πρώτη γραμμή. Επειδή εγώ καθόμουν στην τελευταία σειρά μου φώναξε, με στυλ θρησκευτικής αναζωπύρωσης [religious-revival style], "Πέστα, πέστα, αδερφέ!". Όλο το ακροατήριο γέλασε , επειδή ήξεραν ότι οι απόψεις μου είχαν δουλέψει και για τον δημιουργό της Perl.)
Μετά από λίγες εβδομάδες δουλεύοντας στο σχέδιο με το ίδιο πνεύμα άρχισα να παίρνω παρόμοιους επαίνους όχι μόνο από τους χρήστες μου, αλλά κι από άλλους ανθρώπους που έμαθαν όλ' αυτά. Φύλαξα σαν θησαυρό κάποια από αυτά τα Email, μερικές φορές τα ξανακοιτάω όταν αρχίζω να αναρωτιέμαι αν η ζωμού αξίζει τον κόπο :-)
Όμως, εδώ υπάρχουν άλλα δύο θεμελιώδη μη πολιτικά μαθήματα, που εφαρμόζονται σε κάθε είδος σχεδιασμού.
12. Συχνά, οι πιο φανερές και καινοτομικές λύσεις εμφανίζονται όταν βλέπεις ότι η αντίληψη που έχεις για το πρόβλημα είναι λάθος.
Προσπαθούσα να λύσω λάθος πρόβλημα με το να συνεχίζω να αναπτύσσω τον popclient σαν ένα συνδυασμό MTA/MDA, με όλα τα είδη μεθόδων τοπικής διανομής ταχυδρομείου. Έπρεπε να σκεφτώ πάλι το fetchmail απ' την αρχή, σαν ένα καθαρό MTΑ, σαν μέρος του κανονικού SMTP Internet ταχυδρομείου.
Όταν φτάνεις σε αδιέξοδο-όταν νομίζεις ότι δυσκολεύεσαι να σκεφτείς το επόμενο patch-συχνά είναι καιρός να σκεφτείς όχι αν έχεις την σωστή απάντηση, αλλά αν ρωτάς την σωστή ερώτηση. Ίσως πρέπει να το πρόβλημα να διευθετηθεί εκ νέου.
Αυτό κι έκανα. Ξεκάθαρα, αυτό που έπρεπε να κάνω ήταν (1) να εισάγω υποστήριξη προώθησης SMTP στον γενικό driver, (2) να την ρυθμίσω ως εξ ορισμού λειτουργία και, (3) να απαλλαγώ από όλες τις άλλες λειτουργίες διανομής, ιδιαίτερα την αποθήκευση των μηνυμάτων σε αρχείο και την μεταβίβαση στην στάνταρ έξοδο.
Καθυστέρησα για λίγο στο στάδιο (3), φοβούμενος να αναστατώσω τους χρήστες που χρησιμοποιούσαν για μεγάλο διάστημα popclient και ήσαν εξαρτημένοι απ' τους εναλλακτικούς μηχανισμούς παραλαβής. Θεωρητικά, θα μπορούσαν να μεταβαίνουν στα αρχεία .forward ή στα non-sendmail ισοδύναμά τους, και να έχουν το ίδιο αποτέλεσμα. Στην πράξη, η μετάβαση αυτή φαινόταν ακατάστατη.
Όταν, όμως, τα κατάφερα το κέρδος αποδείχτηκε μεγάλο. Τα δυσκολότερα μέρη του driver εξαφανίστηκαν. Η ρύθμιση έγινε ριζικά απλούστερη-τέρμα η αναζήτηση για το MDA του συστήματος και το mailbox του χρήστη, τέλος στις ανησυχίες για το εάν το λειτουργικό πρόγραμμα υποστηρίζει κλείδωμα των αρχείων [file locking].
Επίσης, ο μόνος τρόπος να χάσεις μηνύματα εξαφανίστηκε. Αν έχεις ορίσει η παραλαβή των μηνυμάτων να προσκολληθεί σ' ένα αρχείο κι ο δίσκος είναι γεμάτος, τα μηνύματά σου χάνονταν. Αυτό δεν συμβαίνει με την προώθηση μέσω SMTP, επειδή ο SMTP listener δεν θα επιστρέψει ΟΚ μέχρις ότου τα μηνύματα παραληφθούν ή, τουλάχιστον, μπουν στην σειρά για παράδοση κάποια άλλη στιγμή.
Ακόμη, βελτιώθηκε η απόδοση (αν και δεν θα το προσέξει κανείς με μια απλή χρήση του προγράμματος). Ένα άλλο όχι ασήμαντο όφελος αυτής της αλλαγής ήταν ότι το εγχειρίδιο χρήσης έγινε απλούστερο.
Αργότερα, έπρεπε να ρυθμίσω την παραλαβή των μηνυμάτων μέσω ενός τοπικού MDA καθορισμένο από τον χρήστη, ώστε να επιτρέψω τον έλεγχο κάποιων σκοτεινών καταστάσεων σχετικά με την dynamic SLIP. Βρήκα, όμως, έναν πιο απλό τρόπο για να το κάνω.
Ηθικό δίδαγμα; Μην διστάζεις να πετάξεις παρωχημένα χαρακτηριστικά όταν μπορείς να το κάνεις χωρίς απώλειες στην αποτελεσματικότητα. Ο Αντουάν Σαιντ-Εξπερύ (που ήταν πιλότος και σχεδιαστής αεροσκαφών, όταν δεν έγραφε κλασικά βιβλία για παιδιά) έχει πει:
13. Η τελειότητα (στον σχεδιασμό) είναι δυνατή όχι όταν δεν υπάρχει κάτι για να προσθέσεις, αλλά μάλλον όταν δεν υπάρχει κάτι για να αφαιρέσεις.
Όταν ο κώδικάς σου γίνεται καλύτερος και απλούστερος, τότε ξέρεις ότι είναι σωστός. Και στην πορεία το fetchmail απέκτησε δική του ταυτότητα, διαφορετική απ' τον πρόγονό του popclient.
Ήταν ώρα για την αλλαγή του ονόματος. Το νέο πρόγραμμα έμοιαζε περισσότερο μ' ένα διπλό sendmail που διέθετε ο παλιός poclient. Και τα δύο είναι MTA, αλλά εκεί που το sendmail σπρώχνει την παράδοση του ταχυδρομείου, ο νέος popclient την ελκύει. Έτσι, μετά από δύο μήνες λειτουργίας χωρίς εμπόδια, τον ονόμασα fetchmail.