Tareno Systems
Menu

Δρομολόγηση & προγραμματισμός

Εργολάβος υποδομών δικτύου που εκτελεί εργασίες πεδίου για πάροχο τηλεπικοινωνιών · 100+ τεχνικοί πεδίου

Πάνω από 100 τεχνικοί, προγραμματισμένοι κάθε πρωί από ένα Excel

Πάνω από χίλιες εργασίες σε αναμονή, αντιγραμμένες με το χέρι κάθε πρωί — και κανένας τρόπος να φανεί ποιες δεν μπορούσαν να ανατεθούν ποτέ.

ΠρινΚάθε πρωί, 1.100 εργασίες αντιγραμμένες με το χέρι σε ένα Excel

ΜετάΚάθε εργασία και κάθε τεχνικός σε μία οθόνη, ανά 30 λεπτά

Πριν: Κάθε πρωί, 1.100 εργασίες αντιγραμμένες με το χέρι σε ένα Excel
Μετά: Κάθε εργασία και κάθε τεχνικός σε μία οθόνη, ανά 30 λεπτά

Πριν

  1. 1Αντιγραμμένο με το χέρι από το σύστημα, κάθε πρωί
  2. 2Σε ποιες από αυτές τις εργασίες μπορεί πραγματικά να σταλεί κάποιος;
  3. 3Ημερομηνίες αποθηκευμένες ανάποδα — η 1η Σεπτεμβρίου έγινε 9 Ιανουαρίου

Μετά

  1. 1Το ένα τρίτο των εργασιών σε αναμονή δεν μπορούσε να πάει σε κανέναν τεχνικό — βρέθηκε την πρώτη εβδομάδα
  2. 2Η διόρθωση είναι ένα βήμα: η περιοχή ανατίθεται σε τεχνικό

Ενδεικτική οθόνη. Όλες οι τιμές είναι συνθετικές.

Κλάδος
Τηλεπικοινωνίες
Μέγεθος
Μεσαία αγορά
Διάρκεια
Έξι εβδομάδες
Συνεργασία
Build sprint

Με απλά λόγια

Το πρόβλημα
Μια εταιρεία στέλνει τεχνικούς σε σπίτια και καμπίνες για επισκευές. Κάθε εργασία βρίσκεται σε ένα μεγάλο σύστημα — αλλά αυτό έδειχνε μία οθόνη κάθε φορά, οπότε κάθε πρωί κάποιος αντέγραφε τις εργασίες σε ένα υπολογιστικό φύλλο στο χέρι για να βγάλει ποιος πάει πού.
Τι παραδόθηκε
Φτιάξαμε ένα πρόγραμμα που μπαίνει μόνο του σε εκείνο το σύστημα κάθε μισή ώρα, παίρνει αντίγραφο των εργασιών και κρατά τη δική του τακτοποιημένη λίστα. Μετά ελέγχει τη λίστα με τον εαυτό της, ψάχνοντας πράγματα που δεν βγάζουν νόημα.
Αποτέλεσμα
Βρήκε 392 εργασίες στις οποίες δεν θα μπορούσε ποτέ να σταλεί τεχνικός, εξαιτίας ενός λάθους ρύθμισης που δεν είχε προσέξει κανείς. Βρήκε επίσης ότι κάθε ημερομηνία ήταν αποθηκευμένη ανάποδα. Τώρα η ομάδα βλέπει την πραγματική εικόνα, και το πρόγραμμα το λέει όταν κάτι λείπει.

Η λεπτομέρεια

Το πρόβλημα

Η πλατφόρμα εργασιών πεδίου κρατούσε κάθε εντολή εργασίας, αλλά η λειτουργία δεν μπορούσε να τις προσεγγίσει. Οι υπεύθυνοι δρομολόγησης εξήγαγαν υπολογιστικά φύλλα στο χέρι και σχεδίαζαν εκτός συστήματος. Κανείς δεν είχε ελέγξει αν αυτό που εμφάνιζε η πλατφόρμα συμφωνούσε με αυτό που εξήγαγε — και δεν συμφωνούσε.

Περιορισμοί

  • Η πλατφόρμα του προμηθευτή δεν διέθετε αξιοποιήσιμο API εξαγωγής για τα δεδομένα που χρειαζόταν η λειτουργία
  • Το σύστημα αναφοράς δεν έπρεπε να τεθεί σε κίνδυνο, οπότε οι εγγραφές ήταν εκτός αντικειμένου
  • Ονόματα πελατών, διευθύνσεις, τηλέφωνα, συντεταγμένες και ελεύθερο κείμενο έπρεπε να μείνουν εκτός κάθε αντιγράφου
  • Η λειτουργία τρέχει 07:00–23:30, άρα η συλλογή δεν μπορούσε να είναι νυχτερινή παρτίδα

Προσέγγιση

  1. Αυτοματοποίηση της ίδιας της διαδρομής εξαγωγής της πλατφόρμας μέσω συνεδρίας headless browser — μόνο για ανάγνωση εξ ορισμού, χωρίς μεταβολή εγγραφών
  2. Αποκλεισμός κάθε πεδίου που ταυτοποιεί πελάτη στο επίπεδο του σχήματος, αντί για φιλτράρισμα εκ των υστέρων
  3. Συμφωνία 3.131 εξαγόμενων γραμμών σε 3.059 διακριτές εργασίες σε 2.951 εντολές εργασίας, για να οριστεί τι αντιπροσωπεύει πραγματικά μία γραμμή
  4. Διασταύρωση κάθε ζώνης εργασίας τεχνικού απευθείας από την πλατφόρμα έναντι της ουράς εκκρεμοτήτων
  5. Χειροκίνητη επαλήθευση των ευρημάτων — 39 αναζητήσεις εργασιών σε 33 εντολές — πριν εμπιστευτούμε οτιδήποτε

Τι παραδόθηκε

  • Εφαρμογή back office με πάγκο εργασίας, δρομολόγηση, σχεδιασμό, SLA και επικοινωνία πελάτη
  • Προγραμματισμένη συλλογή κάθε 30 λεπτά σε ημερήσιο παράθυρο 35 θέσεων, καλύπτοντας τη λειτουργική ημέρα έως +3 και κυλιόμενη αναπλήρωση έως −14
  • Αναφορά κάλυψης ζωνών εργασίας που η ομάδα δρομολόγησης μπορούσε να αξιοποιήσει άμεσα
  • Ανθεκτική ουρά συναλλαγών με επαλήθευση ανάγνωσης για τη μοναδική διαδρομή εγγραφής που ενεργοποιήθηκε
  • Μοντέλο κατάστασης όπου η ακατέργαστη κατάσταση της πλατφόρμας παραμένει πάντα ορατή και μόνο τέσσερις ρητές περιγραφές μπορούν να την υπερισχύσουν

Αποτέλεσμα

Εκκρεμείς εργασίες που κανείς δεν μπορούσε να αναθέσει

Μη ανιχνευμένες

392 από 1.100 36%

Πριν: Μη ανιχνευμένες. Μετά: 392 από 1.100.

Σε 102 ζώνες εργασίας που απουσίαζαν από κάθε λίστα ζωνών τεχνικού — η δρομολόγηση έβλεπε «καμία επιβεβαιωμένη επιλογή» χωρίς να ξέρει γιατί

Υπόλοιπο που εμφάνιζε η πλατφόρμα έναντι εξαγωγής

383 αναφερόμενες

339 εξαγόμενες −11,5%

Πριν: 383 αναφερόμενες. Μετά: 339 εξαγόμενες.

Διαφορά 44 εργασιών μέσα στο ίδιο το περιβάλλον του προμηθευτή, εντοπισμένη στην πρώτη εξαγωγή

Πεδία ημερομηνίας σιωπηλά αλλοιωμένα

Απαρατήρητα

100% των γραμμών με ημερομηνία

Πριν: Απαρατήρητα. Μετά: 100% των γραμμών με ημερομηνία.

Ημέρα και μήνας αντεστραμμένα σε κάθε εγγραφή — η 1η Σεπτεμβρίου αποθηκευόταν ως 9 Ιανουαρίου

Ορατότητα εντολών εργασίας

Χειροκίνητη εξαγωγή

Κάθε 30 λεπτά

Πριν: Χειροκίνητη εξαγωγή. Μετά: Κάθε 30 λεπτά.

Τεχνολογίες

Next.jsTypeScriptPostgreSQLDrizzle ORMPlaywrightVercel

Πού βοήθησε η AI, και πού όχι

Η ανάπτυξη με υποβοήθηση AI κατασκεύασε τον συλλέκτη, τα 78 endpoints και τη μηχανή ταξινόμησης. Δεν παρατήρησε ότι το 36% της ουράς εκκρεμοτήτων ήταν αδύνατο να ανατεθεί, ούτε ότι κάθε ημερομηνία ήταν αντεστραμμένη, ούτε ότι το «ολοκληρωμένο» σε μια εξαγωγή δεν σήμαινε ότι η εντολή είχε κλείσει. Αυτά προέκυψαν από το να ξέρεις πώς υποτίθεται ότι μοιάζουν οι αριθμοί.

Η κατάσταση

Το σύστημα αναφοράς έκανε τη δουλειά του. Η λειτουργία γύρω του όχι.

Κάθε εντολή εργασίας βρισκόταν στο σύστημα εργασιών πεδίου, αλλά μια αξιοποιήσιμη εικόνα απαιτούσε έναν υπεύθυνο δρομολόγησης να συνδεθεί, να εφαρμόσει φίλτρα στο χέρι, να εξαγάγει υπολογιστικό φύλλο, και να ξαναχτίσει την εικόνα της ημέρας στο Excel. Ο σχεδιασμός γινόταν εξ ολοκλήρου εκτός συστήματος.

Η προφανής λύση — μια διασύνδεση — είχε τιμολογηθεί και μπει στο συρτάρι. Το API εξαγωγής του προμηθευτή δεν κάλυπτε ό,τι χρειαζόταν, και μια ειδική διασύνδεση κόστιζε εξαψήφιο ποσό και έξι μήνες.

Οπότε το απορρόφησε το πίσω γραφείο. Κάποιος έμπαινε και εξήγαγε. Κάποιος άλλος ξαναέφτιαχνε την ημέρα σε υπολογιστικό φύλλο. Ένας τρίτος κυνηγούσε τις υποθέσεις που έδειχναν λάθος, τηλεφωνικά, και έγραφε το αποτέλεσμα σε μια στήλη που συντηρούσε μόνο αυτός. Τίποτα από αυτά δεν ήταν η πραγματική δουλειά κανενός, και όλα έπρεπε να έχουν γίνει πριν τις 07:00.

Το κόστος δεν ήταν οι ώρες. Ήταν ότι κάθε νούμερο περνούσε από άνθρωπο, άρα κάθε νούμερο ήταν λίγο διαφορετικό ανάλογα με το ποιος το έβγαλε και πότε — και μια εικόνα που δεν αναπαράγεται από κανέναν είναι εικόνα πάνω στην οποία δεν ενεργεί κανείς.

Η κατασκευή ήταν το εύκολο μισό

Μια προγραμματισμένη συνεδρία headless browser συνδέεται, εφαρμόζει την ίδια όψη που θα εφάρμοζε ένας υπεύθυνος δρομολόγησης, εξάγει την ημέρα, και αποθηκεύει το αποτέλεσμα. Μόνο για ανάγνωση εξ ορισμού: πλοηγείται, διαβάζει και κατεβάζει, τίποτε άλλο. Ονόματα πελατών, διευθύνσεις, τηλέφωνα, συντεταγμένες και ελεύθερο κείμενο αποκλείστηκαν στο επίπεδο του σχήματος, ώστε το αντίγραφο να μην μπορεί ποτέ να τα περιέχει.

Αυτό παρακάμπτει εντελώς το έργο διασύνδεσης και κρατά το σύστημα αναφοράς εκτός κινδύνου.

Μετά έφτασαν τα δεδομένα, και ξεκίνησε το ενδιαφέρον μέρος.

dispatch harness · pending / all zones

activity type work zone coverage raw status classified
A-4051182 Horizontal Construction ΚΕΝΤΡΟ — ΒΟΡΕΙΟΥ no verified tech 02.00.00-2 Pending
A-4051204 FTTH Support ΠΑΡΑΛΙΑ — ΑΝΑΤΟΛΙΚΟΥ covered 01.01.00 Scheduled
A-4051233 Horizontal Construction ΚΕΝΤΡΟ — ΒΟΡΕΙΟΥ no verified tech 02.00.00-2 Pending
A-4051260 CPE Return ΛΟΦΟΣ — ΔΥΤΙΚΟΥ covered 03.00.00 Completed override
A-4051291 Onsite Visit ΠΕΔΙΑΔΑ — ΝΟΤΙΟΥ no verified tech 01.00.00 Pending
A-4051315 LLU Patching ΠΑΡΑΛΙΑ — ΑΝΑΤΟΛΙΚΟΥ covered 02.03.00 Started
1,100 pending 392 without verified coverage 102 zones affected refreshed 4 min ago
Unassignable activities are flagged at the row, not buried in a report — Illustrative interface. All values shown are synthetic.

Τέσσερα πράγματα που έκρυβαν τα δεδομένα

Η πρώτη εξαγωγή δεν συμφωνούσε με την οθόνη. Η πλατφόρμα ανέφερε μη προγραμματισμένο απόθεμα 383. Η εξαγωγή που παρήγαγε περιείχε 339. Κανείς δεν είχε συγκρίνει τα δύο, επειδή κανείς δεν είχε ποτέ και τους δύο αριθμούς ταυτόχρονα.

Κάθε ημερομηνία ήταν αντεστραμμένη. Όλες οι γραμμές με ημερομηνία είχαν ημέρα και μήνα εναλλαγμένα — η 1η Σεπτεμβρίου αποθηκευόταν ως 9 Ιανουαρίου. Οι ακατέργαστες τιμές της πηγής, όπως 01/09/26, επιβεβαίωσαν ότι επρόκειτο για σφάλμα ανάγνωσης και όχι για κακά δεδομένα. Κάθε αναφορά απόδοσης ή παλαιότητας χτισμένη πάνω σε αυτό θα ήταν με αυτοπεποίθηση λάθος — και θα φαινόταν απολύτως εύλογη.

Το 36% της ουράς εκκρεμοτήτων ήταν αδύνατο να ανατεθεί. Διαβάζοντας τις ζώνες εργασίας κάθε τεχνικού απευθείας από την πλατφόρμα και συγκρίνοντάς τες με τις εκκρεμείς εργασίες: 102 ζώνες κρατούσαν 392 από 1.100 εκκρεμείς εργασίες και δεν εμφανίζονταν στη λίστα ζωνών κανενός ενεργού τεχνικού. Η δρομολόγηση έβλεπε «καμία επιβεβαιωμένη επιλογή» και δεν είχε τρόπο να μάθει γιατί. Η σύγκριση και των δύο πλευρών αγνοώντας πεζά-κεφαλαία, τόνους, τελείες και κενά έδωσε μηδέν οριακές αντιστοιχίες — άρα ήταν πραγματικό κενό παραμετροποίησης, όχι τεχνούργημα ταιριάσματος ονομάτων. Η αναφορά πήγε στην ομάδα δρομολόγησης ζώνη προς ζώνη, με μια παράκαμψη ζώνης εργασίας που καταγράφει ποιος την ενέκρινε ως προσωρινή διαδρομή.

Το «ολοκληρωμένο» δεν σήμαινε ολοκληρωμένο. Η χειροκίνητη επαλήθευση εκπρόθεσμων περιπτώσεων βρήκε 12 από 14 ακόμη σε κατάσταση started στην πλατφόρμα, παρά τις περιγραφές που υπονοούσαν ολοκλήρωση. Και 169 αναγνωριστικά Order/TT αντιστοιχούσαν σε πολλαπλές εντολές εργασίας — οπότε η σύγχυση των δύο, που το προφανές μοντέλο δεδομένων κάνει, συγχωνεύει σιωπηλά άσχετες εργασίες.

Τι κάνει το σύστημα με αυτά

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

Ο συλλέκτης τρέχει προγραμματισμένα και κρατά δικό του ιστορικό, οπότε μια εγγραφή δεν είναι στιγμιότυπο αλλά ακολουθία — και αυτό επιτρέπει να πει κανείς ότι κάτι άλλαξε, και πότε. Οι δραστηριότητες, οι εντολές εργασίας και οι αναφορές παραγγελίας συσχετίζονται αντί να θεωρούνται ίδιες, γιατί τα δεδομένα απέδειξαν ότι δεν είναι: 169 αναφορές παραγγελίας αντιστοιχούσαν σε περισσότερες από μία εντολές, και ένα μοντέλο που τις θεωρεί ίδιες ενώνει σιωπηλά άσχετες δουλειές.

Οι απόπειρες επικοινωνίας είναι μέρος της ίδιας εγγραφής. Μια κλήση από την οθόνη δρομολόγησης γράφει το αποτέλεσμά της πίσω στην υπόθεση, οπότε το «δεύτερη κλήση αναπάντητη» είναι γεγονός στο σύστημα και όχι σημείωση στο μυαλό κάποιου.

workbench · σύνοψη ημέρας

1 τελευταία συλλογή πριν 12 λεπτά · 2 47 χωρίς σύνδεση εντολής

3 1,395 με ανοιχτή εργασία 488 επισκέψεις σήμερα 2,774 σε 7 ημέρες 6,947 εντολές ολοκληρωμένες

Σήμερα

24

4 Προς επεξεργασία

438

Έλεγχος τιμολόγησης

—

Όλες οι υποθέσεις

9,500

  1. 1 Η συλλογή τρέχει μόνη της και λέει πότε έτρεξε τελευταία φορά. Αν σταματήσει, φαίνεται εδώ — δεν το ανακαλύπτει κανείς δύο μέρες μετά.
  2. 2 Τα δεδομένα που δεν συνδέθηκαν δεν κρύβονται. 47 δραστηριότητες χωρίς εντολή εργασίας είναι εύρημα, όχι σφάλμα προς απόκρυψη.
  3. 3 Οι μετρήσεις προκύπτουν από τη συμφωνία των εγγραφών, όχι από χειροκίνητη καταμέτρηση σε υπολογιστικό φύλλο.
  4. 4 Η ουρά «προς επεξεργασία» είναι το μόνο νούμερο που καθορίζει τι κάνει η ομάδα σήμερα.
Μία οθόνη: τι μπήκε, τι δεν συμφώνησε, τι πρέπει να γίνει — Illustrative interface. All values shown are synthetic.

Σε τι τρέχει

Τίποτα εξωτικό, και σκόπιμα. Ένας προγραμματιστής εργασιών (Trigger.dev) οδηγεί τον κύκλο συλλογής. Ένας φιλοξενούμενος browser (Browserbase, πάνω σε Playwright) εκτελεί την εξαγωγή που δεν προσφέρει το API του προμηθευτή. Η Postgres κρατά το συμφωνημένο ιστορικό, με migrations αριθμημένα στο χέρι αντί για τα παραγόμενα ενός ORM, γιατί η λογική της συσχέτισης είναι το προϊόν και τη θέλαμε σε απλή SQL όπου διαβάζεται. Το Twilio Voice κάνει τις κλήσεις. Το Leaflet σχεδιάζει τον χάρτη. Αναπτύσσεται σε Vercel.

Ο ένας κανόνας που ισχύει παντού: στο σύστημα αναφοράς δεν γράφει τίποτα παρά μόνο μέσα από μία επαληθευμένη διαδρομή, και όλα τα υπόλοιπα είναι μόνο για ανάγνωση.

Σου λέει πότε χάλασε

Ένα σύστημα που σταματά σιωπηλά να συλλέγει είναι χειρότερο από κανένα σύστημα, γιατί τα νούμερα συνεχίζουν να φαίνονται λογικά ενώ παλιώνουν.

Γι’ αυτό ο πάγκος εργασίας δηλώνει πότε έτρεξε τελευταία φορά η συλλογή, και εμφανίζει ό,τι δεν συσχετίστηκε αντί να το πετά — οι δραστηριότητες χωρίς σύνδεση εντολής φαίνονται ως αριθμός στην κύρια οθόνη, όχι σε ένα αρχείο καταγραφής. Οι διορθώσεις της ομάδας δρομολόγησης καταγράφονται πάνω στην εγγραφή που τις προκάλεσε, ώστε οι κανόνες που κρίνουν την κάλυψη να βελτιώνονται με τη χρήση και όχι με επαναρύθμιση.

Γιατί το επίπεδο ταξινόμησης είναι σκόπιμα διστακτικό

Δεδομένων όλων αυτών, ο πειρασμός είναι να κατασκευάσεις κάτι έξυπνο που κανονικοποιεί τα πάντα σε μια καθαρή κατάσταση.

Κάναμε το αντίθετο. Η ακατέργαστη κατάσταση της πλατφόρμας παραμένει πάντα ορατή. Μόνο τέσσερις ρητές περιγραφές ολοκλήρωσης μπορούν να την υπερισχύσουν, και κάθε διαφορά φέρει ετικέτα που την εξηγεί. Τα κενά πεδία δεν διαβάζονται ποτέ ως μεταβολές κατάστασης, και μια εργασία που εξαφανίζεται από μια ουρά δεν θεωρείται ποτέ απόδειξη ότι έκλεισε.

Ένα επίπεδο που ξαναγράφει σιωπηλά το σύστημα αναφοράς είναι χειρότερο από κανένα επίπεδο, επειδή οι άνθρωποι παύουν να το εμπιστεύονται την πρώτη φορά που κάνει λάθος — και αρκεί να το πιάσουν μία φορά.

Τι άλλαξε στην πράξη

Πριν, η εικόνα που είχε η λειτουργία για τον εαυτό της συναρμολογούνταν στο χέρι κάθε πρωί και ήταν κάθε φορά λίγο διαφορετική. Τώρα προκύπτει, αναπαράγεται, και δηλώνει τα ίδια της τα κενά.

Αυτή είναι όλη η διαφορά. Όχι ότι η δουλειά έγινε πιο γρήγορη — ότι η λειτουργία βλέπει τον εαυτό της, και μπορεί να σου πει πότε αυτό που βλέπει είναι ελλιπές.

Ο πελάτης δεν κατονομάζεται. Τα περισσότερα έργα αφορούν εσωτερικά εμπορικά ή λειτουργικά δεδομένα· συστάσεις διαθέσιμες κατόπιν συνεννόησης.

Σχετικά έργα

Όλες οι περιπτώσεις