Για όσους δεν τον γνωρίζουν, αναπτύσσω μόνος μου το Billit.io και για να μπορώ να ξέρω τι εκκρεμεί από Bugs, που σταμάτησα κάθε φορά και τι θα πρέπει να φτιάξω στο μέλλον χρησιμοποιώ το εξαιρετικό Trello.

Αυτή την περίοδο αποφάσισα να δημιουργήσω μια νέα δυνατότητα που θέλω καιρό στην πλατφόρμα και αφορά την μαζική εισαγωγή δεδομένων μέσω Excel ή CSV αρχικά σε δύο κατηγορίες ( Πελάτες και Προϊόντα ) και αργότερα και στις υπόλοιπες ( έσοδα, έξοδα, προμηθευτές κλπ. )

H μέθοδος που ακολουθώ κάθε φορά που είναι να προστεθεί κάτι νέο είναι πάνω κάτω η ίδια. Αρχικά το φτιάχνω στο κεφάλι μου, μετά το φτιάχνω στο χαρτί, μετά ανοίγω μια κάρτα στο Trello και βάζω σε λίστα τα επιμέρους βήματα που θεωρώ ότι πρέπει να γίνουν. Τα βήματα που σχεδόν πάντα υπάρχουν στο τέλος είναι “Test Feature” και «Multilanguage support”.

Μετά ή και πριν ανάλογα, κάνω και μια έρευνα για το αυτό που θέλω να κάνω καλύπτεται εξ’ ολοκλήρου ή εν μέρη από κάτι έτοιμο ( πακέτο ) ή θα το φτιάξω μόνος μου. Η λίστα με τα subtasks και η έρευνα που αναφέρω  δίνουν μια πρώτη χρονική εκτίμηση.

Αυτή την φορά έπεσα τελείως έξω και θα εξηγήσω πως έγινε αυτό.

To Task

Σε μια γραμμή, θέλουμε να υποστηρίξουμε την μαζική εισαγωγή πελατών και προϊόντων ανεβάζοντας ένα αρχείο Excel. Με περισσότερες γραμμές το πράγμα είναι λιγουλάκι πιο σύνθετο.

Σύμφωνα με την αρχική σκέψη ήθελα ένα wizard με βήματα όπου ο χρήστης θα ανεβάζει το αρχείο του και η εφαρμογή θα κάνει μια σειρά από εξυπνάδες ( πριν τα εισάγει τελικά ) σε πραγματικό χρόνο.

Αν το αρχείο που χρησιμοποιήθηκε βασίστηκε στο πρότυπο που προτείνει η εφαρμογή κάθε φορά, τότε προχωράει απευθείας στο βήμα ελέγχου των δεδομένων ( γραμμή προς γραμμή ) αλλιώς ανακατευθύνεται σε ένα βήμα που κάνει αντιστοίχιση ( Mapping ) των δεδομένων του. Αφού κάνει το validation, εκείνη τη στιγμή του δίνει ένα report τι λάθη βρήκε και σε ποιες γραμμές. Επιπλέον τον προειδοποιεί αν βρει «περίεργα πράγματα» όπως π.χ. διπλό-εγγραφές που ο χρήστης στην συνέχεια θα αποφασίσει αν σκόπιμα τα θέλει έτσι ή όχι. Μετά θα επιλέξει αν θέλει να εισάγει μόνο τα σωστά ή και τις προειδοποιήσεις και βέβαια η εφαρμογή θα πρέπει σε δεύτερο χρόνο πλέον (background job) να κάνει την τελική εισαγωγή και να ενημερώσει τον χρήστη με ένα Email τι ακριβώς έκανε.

Αυτά σε γενικές γραμμές, αν και στην πορεία προέκυψαν και μερικά ακόμα γιατί το User experience τα επέβαλε. Π.χ. τι θα γίνει αν το μετανιώσει ο χρήστης; Γίνεται να αφαιρεθούν αυτά που μόλις έβαλε; Πως θα είναι στημένο το report ώστε να καταλάβει ο χρήστης πόσο πρόβλημα έχει το αρχείο του ώστε να αποφασίσει πως/αν θα προχωρήσει;

Και βέβαια υπάρχουν τέλος και τα πιο τεχνικά. Πως θα πρέπει να γραφτεί αυτό το πράγμα για να είναι πολύ εύκολα επεκτάσιμο ( θυμίζω ότι θα γίνει σε διάφορα σημεία το ίδιο ακριβώς πράγμα) , όσο πιο DRY ( don’t repeat yourself) και με Test που θα καλύπτουν την βασική λειτουργία αυτού του component; Πόσο Javascript θα είναι και πόσο Laravel; πως θα υποστηρίζει πολλές γλώσσες; Πως μπορώ εύκολα να το χρησιμοποιώ όπου χρειάζεται χρησιμοποιώντας ένα αρχείο config που θα ορίζει πράγματα όπως validation rules, πιο είναι το πρότυπο αρχείο, πιο είναι το μοντέλο για να κάνει Import και κ.λ.π.;

Ξαφνικά δεν μοιάζει και τόσο εύκολο.

Τι πήγε λάθος;

Καταρχήν η αρχική εκτίμηση ήταν λάθος γιατί το user Experience «απαιτούσε» μια σειρά από «οθόνες» που δεν είχαν αρχικά προβλεφθεί. Επιπλέον σε μερικά σημεία ( όπως αυτό που ανέφερα παραπάνω για την πιθανή διαγραφή/ Undo της εισαγωγής ) δημιουργεί μια σειρά από αλλαγές, σε νέες οθόνες και νέα πεδία στην βάση. Τέτοια «τσουναμάκια» βέβαια θέλουν πολύ προσοχή ειδικότερα αν δεν υπάρχουν Test για να μην διαλύσεις κάτι άλλο που λειτουργεί. Που σημαίνει ότι πρέπει επιπλέον να σκεφτείς πιθανές γκάφες και να προστατευτείς.

Στη συνέχεια είχα μια καθυστέρηση στα καινούργια Test γιατί είχα να αντιμετωπίσω μερικά πράγματα που δεν μου είχαν ξανά τύχει. Όπως ας πούμε να κάνω πραγματικό ανέβασμα συγκεκριμένου αρχείου που κάλυπτε με ta data του συγκεκριμένα σενάρια ώστε να ελέγξω την απάντηση του Controller κάθε φορά.

Και βέβαια το μεγαλύτερο λάθος όλων; Αποφάσισα να χρησιμοποιήσω ένα πακέτο που τελικά με δυσκόλεψε πολύ, δεν κάλυπτε μια σειρά από ανάγκες μου και τελικά έχασα πάρα πολύ χρόνο να το φέρω στα μέτρα μου.

Ετσι κάπως οι αρχική πρόβλεψη τρεις/τέσσερις ημέρες έγινε δέκα-δεκαπέντε και βλέπουμε.

It comes with the Job?

Είχα χρόνια να κουραστώ τόσο πολύ από κάτι τέτοιο και διερωτώμαι. Αρκεί να κάνεις καλή ανάλυση στην αρχή για να μην βγαίνεις τόσο εκτός σε χρονοδιαγράμματα; Η απλά το παίρνεις απόφαση ότι θα συμβαίνει και εύχεσαι αν είναι χρόνος που έχεις υπολογίσει για πελάτη να μην σε βάλει τελείως μέσα;