Ανάπτυξη δικτύου & εντολές εργασίας
Εργολάβος ανάπτυξης οπτικών ινών που εκτελεί αποτύπωση και κατασκευή FTTH
Χιλιάδες εργασίες οπτικών ινών, σε Excel και σε μηνύματα
Συνεργεία χωρίς καταγραφή, φωτογραφίες δουλειάς χαμένες σε συνομιλίες, και μέρες κάθε μήνα για να βρεθεί τι είχε πράγματι παραδοθεί.
ΠρινΧιλιάδες εργασίες μοιρασμένες σε ένα Excel και μια ομαδική συνομιλία
ΜετάΚάθε εργασία, συνεργείο και φωτογραφία σε ένα σημείο — τιμολόγηση μόνο όταν περάσουν οι φωτογραφίες


Πριν
- 1Η απόδειξη της δουλειάς, χαμένη στην ομαδική συνομιλία
- 2Ποιο συνεργείο πήγε πού; Κανείς δεν το κατέγραψε
- 3Μέρες κάθε μήνα για να βρεθεί τι παραδόθηκε
Μετά
- 1Οι δύο καθυστερημένες εργασίες επισημαίνονται πριν από την προθεσμία, όχι μετά
- 2Τίποτα δεν τιμολογείται πριν περάσουν οι φωτογραφίες του τον έλεγχο
Ενδεικτική οθόνη. Όλες οι τιμές είναι συνθετικές.
- Κλάδος
- Υποδομές δικτύων
- Μέγεθος
- Μεσαία αγορά
- Διάρκεια
- 43 ημέρες
- Συνεργασία
- Build sprint
Με απλά λόγια
- Το πρόβλημα
- Μια εταιρεία που περνά οπτικές ίνες παρακολουθούσε χιλιάδες εργασίες σε υπολογιστικά φύλλα και μηνύματα. Κανείς δεν μπορούσε να πει με σιγουριά ποιο συνεργείο ήταν πού, ούτε αν είχαν ελεγχθεί οι φωτογραφίες που αποδεικνύουν ότι μια δουλειά τελείωσε.
- Τι παραδόθηκε
- Φτιάξαμε το σύστημα με το οποίο παίρνουν τις εργασίες, στέλνουν τα συνεργεία και ελέγχουν τις φωτογραφίες πριν πληρωθεί οποιαδήποτε δουλειά.
- Αποτέλεσμα
- Λειτουργούσε κανονικά σε 43 ημέρες. Μετά το δοκιμάσαμε με μισό εκατομμύριο εντολές για να σιγουρευτούμε ότι δεν θα αργήσει όταν φορτώσει — και βρήκαμε ένα σφάλμα που το έκανε περίπου επτά φορές πιο αργό. Το διορθώσαμε πριν το νιώσει κανείς.
Η λεπτομέρεια
Το πρόβλημα
Οι εντολές εργασίας αποτύπωσης και κατασκευής οπτικών ινών παρακολουθούνταν μέσα από υπολογιστικά φύλλα και εφαρμογές ανταλλαγής μηνυμάτων. Τα συνεργεία δρομολογούνταν χωρίς καταγραφή, τα τεκμήρια επέστρεφαν ως φωτογραφίες σε συνομιλίες, και η συμφωνία όσων παραδόθηκαν με όσα αναφέρθηκαν απαιτούσε ημέρες κάθε μήνα.
Περιορισμοί
- Τα συνεργεία πεδίου δουλεύουν σε κινητά, συχνά με κακή σύνδεση, και εγκαταλείπουν ό,τι είναι αργό
- Δύο διακριτές ροές — αποτύπωση και κατασκευή — με διαφορετικές απαιτήσεις τεκμηρίωσης
- Τα τεκμήρια ποιότητας έπρεπε να είναι ελέγξιμα και ιχνηλάσιμα, όχι απλώς συλλεγμένα
- Ένα πρόγραμμα ανάπτυξης συσσωρεύει ιστορικό επ' αόριστον, άρα έπρεπε να παραμείνει γρήγορο καθώς ο πίνακας μεγαλώνει
Προσέγγιση
- Μοντελοποίηση αποτύπωσης και κατασκευής ως διακριτών ροών πάνω σε έναν κοινό κορμό εντολής εργασίας, με τους κανόνες στο σχήμα και όχι διάσπαρτους στον κώδικα
- Κατασκευή με προτεραιότητα στο κινητό, με πρόχειρα εκτός σύνδεσης που ανήκουν σε λογαριασμό και συγχρονίζονται με ασφάλεια
- Δοκιμή φόρτου έναντι συνθετικού ιστορικού μισού εκατομμυρίου εντολών, αντί για την υπόθεση ότι θα άντεχε
- Εντοπισμός της καθυστέρησης σε ταυτόχρονες εγγραφές που ακύρωναν συγκεντρωτικούς υπολογισμούς εν εξελίξει, προκαλώντας διπλή ακριβή εργασία
- Συγγραφή πλήρους φακέλου παράδοσης παράλληλα με την κατασκευή, όχι μετά από αυτήν
Τι παραδόθηκε
- Παραλαβή, σχεδιασμός και δρομολόγηση συνεργείων για εντολές αποτύπωσης και κατασκευής
- Παρακολούθηση εκτέλεσης με έλεγχο ποιότητας και τεκμηρίων, όπου η αντικατάσταση δεν διαγράφει ποτέ προηγούμενα τεκμήρια
- Εξαγωγή και συμφωνία κατάστασης προς τον πελάτη
- Πρόσβαση βάσει ρόλων, έλεγχος ιδιοκτησίας συνεργείου, ανάθεση ομάδων και προγραμματισμένες ειδοποιήσεις
- Εγχειρίδιο συστημάτων πεδίου και φάκελος συνέχειας ώστε η δουλειά να μπορεί να συνεχιστεί από οποιονδήποτε
Αποτέλεσμα
p95 με 300 ταυτόχρονους χρήστες
6,7 δλ
κάτω από 1 δλ −89%
Πριν: 6,7 δλ. Μετά: κάτω από 1 δλ.
Έναντι συνθετικού ιστορικού μισού εκατομμυρίου εντολών, με μηδέν σφάλματα αιτημάτων, εντός στόχου δύο δευτερολέπτων
p95 με 200 ταυτόχρονους χρήστες
5,1 δλ
περίπου 0,5 δλ −90%
Πριν: 5,1 δλ. Μετά: περίπου 0,5 δλ.
Ίδιο συνθετικό ιστορικό, ίδια μεικτή δοκιμή φόρτου
Από το μηδέν στην παραγωγή
—
43 ημέρες
Πριν: —. Μετά: 43 ημέρες.
330 commits, 60 πίνακες, 53 endpoints, 43 migrations
Ρυθμός προγραμματισμένων ειδοποιήσεων
—
15.000 σε κάτω από 16 δλ
Πριν: —. Μετά: 15.000 σε κάτω από 16 δλ.
Παράχθηκαν παράλληλα με ζωντανή δραστηριότητα 200 χρηστών
Τεχνολογίες
Next.jsTypeScriptPostgreSQLNeonDrizzle ORMClerkVercel
Πού βοήθησε η AI, και πού όχι
Τριάντα τρεις χιλιάδες γραμμές σε έξι εβδομάδες είναι αυτό που καθιστά δυνατό η ανάπτυξη με υποβοήθηση AI. Η απόφαση να γίνει δοκιμή φόρτου σε μισό εκατομμύριο εντολές πριν φτάσει ποτέ εκεί ο πελάτης — και η αναγνώριση ότι ένα p95 σχεδόν επτά δευτερολέπτων ήταν σφάλμα ακύρωσης cache και όχι πρόβλημα βάσης — δεν είναι κάτι που προτείνει ένα μοντέλο. Πρέπει να το έχεις πάθει.
Η κατάσταση
Η ανάπτυξη οπτικών ινών είναι δουλειά όγκου με πρόβλημα γραφειοκρατίας. Κάθε σημείο χρειάζεται αποτύπωση, μετά κατασκευή, το καθένα με τις δικές του απαιτήσεις τεκμηρίωσης, το καθένα από διαφορετικό συνεργείο, και όλα πρέπει να συμφωνούν με αυτό που ο πελάτης πιστεύει ότι παραδόθηκε.
Αυτή η λειτουργία το έτρεχε σε υπολογιστικά φύλλα και εφαρμογές μηνυμάτων. Οι εντολές ανατίθεντο προφορικά ή σε συνομιλία, τα τεκμήρια επέστρεφαν ως φωτογραφίες σε ένα νήμα, και η συμφωνία στο τέλος του μήνα σήμαινε χειροκίνητη διασταύρωση δύο συστημάτων. Οι διαφωνίες με τον πελάτη λύνονταν από όποιον κρατούσε καλύτερες σημειώσεις.
Γιατί δεν το είχε λύσει ήδη κανείς
Όχι επειδή το πρόβλημα ήταν δύσκολο να περιγραφεί. Κάθε άνθρωπος σε εκείνη τη λειτουργία μπορούσε να το περιγράψει.
Τα εργαλεία εντολών εργασίας που υπάρχουν φτιάχνονται είτε για το δικό του συνεργείο ενός παρόχου είτε για ένα γενικό service desk — και ένας εργολάβος ανάπτυξης δεν είναι ούτε το ένα ούτε το άλλο: οι απαιτήσεις τεκμηρίωσης προκύπτουν από τη σύμβαση με τον πελάτη, όχι από την εικόνα που έχει ο προμηθευτής λογισμικού για μια δουλειά. Η παραμετροποίηση θέλει σύμβουλο που καταλαβαίνει και τα δύο, και το κόστος άδειας έρχεται πριν αποδειχθεί ότι ταιριάζει. Οι προσφορές που γύριζαν ήταν για πρόγραμμα, όχι για εργαλείο.
Έτσι έμεινε το υπολογιστικό φύλλο, γιατί ήταν το μόνο που έκανε κοιλιά.
Γιατί προηγήθηκε το σχήμα
Εξήντα πίνακες και 43 migrations πριν υπάρξει σοβαρή διεπαφή. Σκόπιμα.
Η αποτύπωση και η κατασκευή μοιάζουν αρκετά ώστε ο πειρασμός να είναι μία γενική «εντολή εργασίας» με μια σημαία τύπου και υπό συνθήκη λογική σκορπισμένη στον κώδικα. Αυτό κρατά μέχρι να αποκλίνουν οι απαιτήσεις τεκμηρίωσης — που αποκλίνουν αμέσως — και τότε οι κανόνες ζουν σε δεκαπέντε σημεία και κανείς δεν μπορεί να πει με βεβαιότητα τι θα δεχτεί το σύστημα.
Αντ’ αυτού: δύο διακριτές ροές πάνω σε κοινό κορμό, με τους κανόνες εκφρασμένους στο μοντέλο δεδομένων. Κοστίζει περισσότερο στην αρχή, και είναι ο λόγος που μια κατασκευή έξι εβδομάδων δεν χρειάστηκε ξαναγράψιμο την έβδομη.
work order board · phase B + C / this week
| order | phase | task | crew | evidence | sla |
|---|---|---|---|---|---|
| WO-24-0881 | B | Survey — riser access | Crew 04 | passed | on time |
| WO-24-0884 | C | Construction — duct | Crew 11 | review | on time |
| WO-24-0887 | C | Construction — splice | Crew 04 | rejected photo unreadable | at risk |
| WO-24-0890 | B | Survey — façade route | unassigned | none | at risk |
| WO-24-0893 | C | Construction — drop cable | Crew 07 | passed | on time |
Το πιο σημαντικό μέρος έγινε αφού δούλευε
Το σύστημα δούλευε. Αυτό δεν είναι το ίδιο με το να ξέρεις ότι θα συνεχίσει να δουλεύει.
Ένα πρόγραμμα ανάπτυξης συσσωρεύει ιστορικό επ’ αόριστον, οπότε δημιουργήσαμε συνθετικό ιστορικό περίπου μισού εκατομμυρίου εντολών και 1,6 εκατομμυρίου εργασιών, και τρέξαμε ταυτόχρονο μεικτό φόρτο πάνω του.
Απέτυχε. p95 γύρω στα πέντε δευτερόλεπτα με 200 ταυτόχρονους χρήστες και σχεδόν επτά με 300, έναντι στόχου δύο δευτερολέπτων.
Η αιτία δεν ήταν η βάση δεδομένων. Ταυτόχρονες εγγραφές ακύρωναν συγκεντρωτικούς υπολογισμούς εν εξελίξει, οπότε πολλά αιτήματα ξεκινούσαν το καθένα την ίδια ακριβή συνάθροιση αντί να μοιράζονται ένα αποτέλεσμα. Κλασικό φαινόμενο συνωστισμού — αόρατο σε έναν χρήστη, προφανές στους 300.
Η διόρθωση κρατά την εργασία εν εξελίξει κοινή και σημειώνει το αποτέλεσμά της ως ληγμένο αν μια εγγραφή φτάσει στη μέση του υπολογισμού, ώστε το επόμενο αίτημα να ξαναχτίσει αντί να σερβίρει κάτι παλιό. Τα ιστορικά συγκεντρωτικά επιβιώνουν άσχετων εγγραφών, οι εγγραφές εντολών τα ακυρώνουν, και η εξωτερική σύνοψη δεν μπορεί ποτέ να ζήσει περισσότερο από το στιγμιότυπο μέσα της.
Μετά από αυτό: περίπου μισό δευτερόλεπτο στους 200 χρήστες και κάτω από ένα στους 300, με μηδέν σφάλματα αιτημάτων και άνετο περιθώριο έναντι του στόχου.
Σε τι τρέχει
Postgres μέσω Drizzle, με τα migrations στο repository — 43 από αυτά, που είναι η εικόνα ενός μοντέλου δεδομένων στο οποίο επιτράπηκε να αλλάξει τίμια. Clerk για ταυτότητα. Οι φωτογραφίες τεκμηρίωσης μένουν σε Vercel Blob. Το Leaflet με ομαδοποίηση σχεδιάζει αρκετές χιλιάδες σημεία χωρίς να καταρρέει. Τα email φεύγουν μέσω Resend και οι ειδοποιήσεις browser μέσω web-push — μαζί παρήγαγαν 15.000 προγραμματισμένες ειδοποιήσεις σε λιγότερο από δεκαέξι δευτερόλεπτα, με 200 χρήστες ζωντανούς στο σύστημα.
Τα tests τρέχουν σε πραγματικό ενσωματωμένο Postgres, όχι σε mocks. Τα mocked tests περνούν ενώ ο περιορισμός στον οποίο βασίζεσαι στην πραγματικότητα δεν υπάρχει.
Λέει πότε δεν είναι καλά
Ένα σύστημα ανάπτυξης που σταματά σιωπηλά να συμφωνεί εγγραφές είναι επικίνδυνο, όχι απλώς χαλασμένο: τα νούμερα συνεχίζουν να φαίνονται λογικά και η διαφωνία με τον πελάτη έρχεται έναν μήνα μετά.
Γι’ αυτό το σύστημα αναφέρει για τον εαυτό του — ρυθμό, βάθος ουράς και υγεία των προγραμματισμένων εργασιών — σε έναν πίνακα που ο υπεύθυνος λειτουργίας διαβάζει χωρίς να ρωτήσει κανέναν. Η τεκμηρίωση που κόβεται στον έλεγχο είναι ορατός αριθμός, όχι σιωπηλή απόρριψη, και το συνεργείο που την υπέβαλε ενημερώνεται αντί να το ανακαλύψει στο τέλος του μήνα.
Αναφορά και της αποτυχημένης εκτέλεσης, όχι μόνο της επιτυχημένης
Οι εσωτερικές σημειώσεις δοκιμών καταγράφουν την αποτυχημένη εκτέλεση πλήρως, με τη ρητή παρατήρηση ότι μια αποτυχία καθυστέρησης παραμένει αποτυχία ακόμη κι όταν η διαδικασία δοκιμής τερματίζει ομαλά — και ότι μια ευνοϊκή σύγκριση ανάμεσα σε δύο διαφορετικά παραμετροποιημένες εκτελέσεις είναι ενθαρρυντική ένδειξη και όχι ελεγχόμενη μέτρηση.
Αυτό είναι το πρότυπο με το οποίο γράφεται η τεκμηρίωση. Μια αναφορά επιδόσεων που καταγράφει μόνο την καλή εκτέλεση δεν αξίζει τίποτα σε όποιον κληρονομήσει το σύστημα.
Η παράδοση είναι μέρος της δουλειάς
Τρέχουσα κατάσταση, αποφάσεις και επιχειρησιακοί κανόνες, ροή και μοντέλο καταστάσεων, αρχιτεκτονική, λειτουργία και εγκατάσταση, δοκιμές, ιεραρχημένη λίστα εκκρεμοτήτων, και σημείωμα συνέχειας.
Κάθε εξωτερική κατασκευή γεννά το ίδιο ερώτημα — τι γίνεται όταν πάψουμε να είμαστε πάνω της. Η απάντηση πρέπει να είναι πραγματική, γραμμένη, πριν σκεφτεί ο πελάτης να τη ζητήσει.
Τι άλλαξε στην πράξη
Πριν, η απάντηση στο «τελείωσε αυτή η δουλειά και μπορούμε να τη χρεώσουμε;» ζούσε σε ένα νήμα φωτογραφιών και στη μνήμη κάποιου — και η απάντηση του πελάτη ήταν συχνά διαφορετική.
Τώρα είναι εγγραφή με τεκμηρίωση συνημμένη και κατάσταση ελέγχου, και οι δύο πλευρές κοιτούν το ίδιο πράγμα. Το τέλος του μήνα έπαψε να είναι διαπραγμάτευση για το ποιος κράτησε καλύτερες σημειώσεις.
Ο πελάτης δεν κατονομάζεται. Τα περισσότερα έργα αφορούν εσωτερικά εμπορικά ή λειτουργικά δεδομένα· συστάσεις διαθέσιμες κατόπιν συνεννόησης.