Οι εναλλαγές διεργασιών θεωρούνται επιβλαβείς για τους ανθρώπους
From The Joel on Software Translation Project
από τον Ιωήλ Σπόλσκι
Μεταφραστής ο Δημήτρης Στάικος
Δευτέρα, 12 Φεβρουαρίου 2001
Όταν διευθύνεις μια ομάδα προγραμματιστών, ένα από τα πρώτα πράγματα που πρέπει να μάθεις να πετυχαίνεις σωστά είναι η ανάθεση εργασιών. Αυτός είναι απλά ένας ευφυής όρος για το να δίνεις στους ανθρώπους πράγματα να κάνουν. Στα Εβραϊκά είναι γνωστό και σαν "πέταγμα αρχείων" (γιατί πετάς αρχεία στα πόδια των ανθρώπων). Και ο τρόπος που αποφασίζεις ποια αρχεία θα πετάξεις σε ποια πόδια είναι μια από τις περιοχές στις οποίες μπορείς να έχεις απίστευτα κέρδη παραγωγικότητας αν το κάνεις σωστά. Κάν'το λανθασμένα, και μπορείς να δημιουργήσεις μια από αυτές τις υπέροχες καταστάσεις που κανείς δεν επιτυγχάνει τίποτα και όλοι παραπονιούνται ότι "τίποτα δεν ολοκληρώνεται εδώ πέρα".
Καθώς αυτός ο δικτυακός τόπος είναι για προγραμματιστές, θα προθερμάνω λίγο το μυαλό σας με ένα προγραμματιστικό πρόβλημα.
Υποθέστε ότι έχετε δύο ξεχωριστούς υπολογισμούς να εκτελέσετε, τον Α και τον Β. Κάθε υπολογισμός απαιτεί 10 δευτερόλεπτα υπολογιστικού χρόνου. Έχετε έναν επεξεργαστή, που χάριν απλότητος, δεν έχει τίποτα άλλο να εκτελέσει.
Στον επεξεργαστή μας, η πολυεπεξεργασία είναι προαιρετική. Έτσι μπορείς να κάνεις τους δύο υπολογισμούς τον έναν μετά τον άλλον...
Σειριακή Επεξεργασία
| Υπολογισμός A | Υπολογισμός B | ||||||||||||||||||
| 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 |
... ή μπορείς να πολυεπεξεργαστείς. Αν πολυεπεξεργαστείς σε αυτόν τον επεξεργαστή, οι διεργασίες τρέχουν για 1 δευτερόλεπτο, και μια εναλλαγή εργασιών δεν παίρνει καθόλου χρόνο.
Πολυεπεξεργασία
| 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 |
Τι από τα δύο είναι καλύτερο να κάνεις; Η ενστικτώδης αντίδραση των περισσοτέρων είναι ότι η πολυεπεξεργασία είναι καλύτερη. Και στις δύο περιπτώσεις πρέπει να περιμένεις 20 δευτερόλεπτα για να πάρεις και τις δύο απαντήσεις. Αλλά σκεφτείτε πόση ώρα παίρνει να πάρεις την απάντηση για κάθε υπολογισμό.
Και στις δύο περιπτώσεις, τα αποτελέσματα του υπολογισμού Β (φαίνεται με μαύρο) χρειάζονται 20 δευτερόλεπτα για να αφιχθούν. Αλλά κοιτάξτε τον υπολογισμό Α. Με την πολυεπεξεργασία, τα αποτελέσματά του βγαίνουν σε 19 δευτερόλεπτα... αλλά με σειριακή επεξεργασία είναι έτοιμα σε μόνο 10 δευτερόλεπτα.
Με άλλα λόγια, σε αυτό το όμορφα φτιαγμένο παράδειγμα, ο μέσος χρόνος ανά υπολογισμό είναι χαμηλότερος (15 δευτερόλεπτα αντί για 19.5) όταν χρησιμοποιείς σειριακή επεξεργασία αντί για πολυεπεξεργασία. (Στην πραγματικότητα δεν είναι και τόσο κατασκευασμένο παράδειγμα - βασίζεται σε ένα πραγματικό πρόβλημα που είχε να λύσει στη δουλειά του ο Jared).
| Μέθοδος | Υπολογισμός Α | Υπολογισμός Β |
Μέσος |
| Σειριακή | 10 δευτερόλεπτα | 20 δευτερόλεπτα | 15 |
| Πολυεπεξεργασία | 19 δευτερόλεπτα | 20 δευτερόλεπτα | 19.5 |
Νωρίτερα είπα ότι "μία εναλλαγή διεργασιών δεν παίρνει καθόλου χρόνο". Στην πράξη, σε πραγματικούς επεξεργαστές, μια εναλλαγή διεργασιών παίρνει λίγο χρόνο - βασικά όσο χρόνο χρειάζεται για να σωθεί η κατάσταση του επεξεργαστή και να φορτωθεί η κατάσταση της επόμενη διεργασίας. Ρεαλιστικά, αυτό είναι κοντά στο αμελητέο. Αλλά για να κάνουμε τη ζωή ενδιαφέρουσα ας υποθέσουμε ότι οι εναλλαγές διεργασιών παίρνουν μισό δευτερόλεπτο. Τώρα τα πράγματα γίνονται ακόμα χειρότερα:
| Μέθοδος | Υπολογισμός A | Υπολογισμός Β |
Μέσος |
| Σειριακή | 10 δευτερόλεπτα | 20 + 1 εναλ.
διεργασιών =
|
15.25 |
| Πολυεπεξεργασία | 19 + 18 εναλ.
διεργασιών = |
20 + 19 εναλ. διεργασιών = 29.5 δευτερόλεπτα | 28.75 |
Τώρα - για να κάνουμε πλάκα, ξέρω ότι αυτό είναι χαζό - τι θα γινόταν αν οι εναλλαγές διεργασιών έπαιρναν ένα ολόκληρο λεπτό;
| Μέθοδος | Υπολογισμός A | Υπολογισμός Β |
Μέσος |
| Σειριακή | 10 δευτερόλεπτα | 20 + 1 εναλ. διεργασιών =
|
45 δευτ. |
| Πολυεπεξεργασία | 19 + 18 εναλ.
διεργασιών = 1099 δευτερόλεπτα |
20 + 19 εναλ. διεργασιών = 1160 δευτερόλεπτα | σχεδόν 19 λεπτά! |
Όσο πιο μεγάλο χρόνο απαιτεί η εναλλαγή διεργασιών, τόσο πιο μεγάλη είναι η ποινή για τη χρήση πολυεπεξεργασίας.
Αυτό από μόνο του δεν είναι και τόσο συγκλονιστικό, είναι; Σύντομα θα λαμβάνω εκνευρισμένα email από ανόητους που θα με κατηγορούν ότι είμαι "κατά" της πολυεπεξεργασίας. "Θέλεις να επιστρέψεις στις ημέρες του DOS όταν έπρεπε να βγεις από το WordPerfect για να τρέξεις το 1-2-3;" θα με ρωτάνε.
Αλλά δεν είναι αυτό που προσπαθώ να πετύχω. Θέλω απλά να συμφωνήσετε μαζί μου ότι σε αυτό το είδος παραδείγματος:
α) Η σειριακή επεξεργασία δίνει αποτελέσματα πιο γρήγορα κατά μέσο όρο, και
β) Όσο περισσότερο παίρνει η εναλλαγή διεργασιών, τόσο μεγαλύτερο είναι το κόστος που πληρώνεις για την πολυεπεξεργασία.
Εντάξει λοιπόν, ας επιστρέψουμε στο πιο ενδιαφέρον πρόβλημα της διαχείρισης ανθρώπων και όχι επεξεργαστών. Το κόλπο εδώ είναι ότι όταν διαχειρίζεσαι προγραμματιστές ειδικά, οι εναλλαγές διεργασιών παίρνουν πολύ πολύ πολύ μεγάλο χρόνο. Αυτό συμβαίνει γιατί ο προγραμματισμός είναι το είδος της εργασίας που απαιτεί να κρατάς ταυτόχρονα πολλά πράγματα στο μυαλό σου. Όσο πιο πολλά πράγματα μπορείς να θυμάσαι ταυτόχρονα, τόσο πιο παραγωγικός είσαι στον προγραμματισμό. Οι προγραμματιστές που προγραμματίζουν τέρμα τα γκάζια διατηρούν εκατομμύρια πράγματα ταυτόχρονα μέσα στα κεφάλια τους: τα πάντα, συμπεριλαμβανομένων των ονομάτων μεταβλητών, δομών δεδομένων, σημαντικών API, τα ονόματα βοηθητικών ρουτινών που έγραψαν οι ίδιοι και καλούν συχνά, ακόμα και το όνομα του υποκαταλόγου που έχουν τον πηγαίο τους κώδικα. Αν στείλεις τον προγραμματιστή για τρεις εβδομάδες διακοπές στην Κρήτη, θα τα ξεχάσει όλα. Απ'ό,τι φαίνεται το ανθρώπινο μυαλό τα μετακινεί από την βραχείας χρήσης RAM στην εφεδρική ταινία, απ'όπου παίρνει μια ζωή να τα ανακτήσεις.
Πόσο πολύ; Κοίτα, πρόσφατα στην εταιρεία μου σταματήσαμε αυτό που κάναμε (ανάπτυξη για το CityDesk) για τρεις εβδομάδες για να βοηθήσουμε έναν πελάτη με μια επείγουσα κατάσταση. Όταν επιστρέψαμε στο γραφείο μάς φάνηκε ότι χρειάστηκαν άλλες τρεις εβδομάδες για να πιάσουμε πάλι τον πλήρη ρυθμό μας με το CityDesk.
Στο ατομικό επίπεδο, έχετε ποτέ παρατηρήσει ότι μπορείς να αναθέσεις μια εργασία σε έναν άνθρωπο και θα κάνει σπουδαία δουλειά, αλλά αν του αναθέσεις δύο εργασίες, δε θα καταφέρει να κάνει τίποτα; Ή θα κάνει τη μια δουλειά καλά και θα παραμελήσει την άλλη, ή θα κάνει και τις δύο δουλειές τόσο αργά που θα νομίζεις ότι τα σαλιγκάρια έχουν περισσότερη σπιρτάδα. Αυτό γίνεται γιατί οι προγραμματιστικές εργασίες παίρνουν τόσο πολύ χρόνο για να εναλλαχθούν. Όταν έχω δύο προγραμματιστικές εργασίες στο πιάτο μου ταυτόχρονα, νιώθω ότι ο χρόνος εναλλαγής μεταξύ τους είναι περίπου έξι ώρες. Σε μια ημέρα οκτώ ωρών, αυτό σημαίνει ότι η πολυεπεξεργασία μειώνει την παραγωγικότητά μου στις δύο ώρες την ημέρα. Πολύ απογοητευτικό.
Όπως αποδεικνύεται, αν δώσεις σε κάποιον δύο εργασίες να κάνει, θα πρέπει να είσαι ευγνώμων αν παραμελήσει τη μία εργασία και εργαστεί μόνο στην άλλη, γιατί θα κάνει περισσότερη δουλειά και θα τελειώσει κατά μέσο όρο νωρίτερα. Πράγματι, το αληθινό μάθημα από όλα αυτά είναι ότι ποτέ δεν πρέπει να αφήνετε τους ανθρώπους σας να δουλεύουν σε παραπάνω από ένα πράγματα ταυτόχρονα. Φροντίστε να ξέρουν ποιο είναι αυτό. Οι καλοί διευθυντές θεωρούν ευθύνη τους να αφαιρούν τα εμπόδια ώστε οι άνθρωποι να μπορούν να συγκεντρώνονται σε ένα πράγμα και πραγματικά να το ολοκληρώνουν. Όταν προκύπτει κάτι επείγον, σκεφτείτε μήπως μπορείτε να το χειριστείτε μόνοι σας πριν το πασάρετε σε κάποιον προγραμματιστή που είναι βυθισμένος σε κάποιο έργο.
Το άρθρο αυτό πρώτο-εμφανίστηκε στα Αγγλικά με το όνομα Human Task Switches Considered Harmful
