Προγραμματισμός

Τα 7 πιο ενοχλητικά προβλήματα στον προγραμματισμό

Λέγεται ότι τα μη διαγραμμένα εδάφη των παλιών χαρτών σημειώνονταν συχνά με τη δυσοίωνη προειδοποίηση: «Εδώ είναι δράκοι». Ίσως αποκρυφικό, η ιδέα ήταν ότι κανείς που δεν θα περιπλανηθεί σε αυτές τις άγνωστες γωνιές του κόσμου θα πρέπει να το κάνει χωρίς να είναι έτοιμος να πολεμήσει έναν τρομακτικό εχθρό. Τίποτα θα μπορούσε να συμβεί σε αυτές τις μυστηριώδεις περιοχές και συχνά ότι κάτι δεν ήταν καλό.

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

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

Εδώ είναι επτά από τις πιο όμορφες γωνίες του κόσμου προγραμματισμού όπου θα βάζαμε μεγάλους δείκτες να διαβάζουν, "Εδώ είναι δράκοι".

Πολλαπλών νημάτων

Ακούστηκε σαν καλή ιδέα: Σπάστε το πρόγραμμά σας σε ανεξάρτητα τμήματα και αφήστε το λειτουργικό σύστημα να τα εκτελέσει σαν ξεχωριστά μικρά προγράμματα. Εάν οι επεξεργαστές έχουν τέσσερις, έξι, οκτώ ή ακόμα περισσότερους πυρήνες, γιατί να μην γράψετε τον κωδικό σας έτσι ώστε να μπορεί να έχει τέσσερα, έξι, οκτώ ή περισσότερα νήματα χρησιμοποιώντας όλους τους πυρήνες ανεξάρτητα;

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

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

Όταν δεν λειτουργούν, είναι καθαρό χάος. Τα δεδομένα δεν έχουν νόημα. Οι στήλες δεν προστίθενται. Τα χρήματα εξαφανίζονται από λογαριασμούς με poof. Είναι όλα κομμάτια στη μνήμη. Και καλή τύχη προσπαθώντας να καταγράψω οποιοδήποτε από αυτά. Τις περισσότερες φορές οι προγραμματιστές καταλήγουν να κλειδώνουν μεγάλα κομμάτια της δομής δεδομένων, έτσι ώστε μόνο ένα νήμα να μπορεί να το αγγίξει. Αυτό μπορεί να σταματήσει το χάος, αλλά μόνο σκοτώνοντας το μεγαλύτερο μέρος της ύπαρξης πολλαπλών νημάτων που εργάζονται στα ίδια δεδομένα. Ίσως να το ξαναγράψατε ως "μονόστροφο" πρόγραμμα.

Κλείσιμο

Κάπου κατά μήκος της γραμμής, κάποιος αποφάσισε ότι θα ήταν χρήσιμο να μεταβιβάζουμε συναρτήσεις σαν να ήταν δεδομένα. Αυτό λειτούργησε καλά σε απλές περιπτώσεις, αλλά οι προγραμματιστές άρχισαν να συνειδητοποιούν ότι τα προβλήματα προέκυψαν όταν οι λειτουργίες έφτασαν έξω από τον εαυτό τους και είχαν πρόσβαση σε άλλα δεδομένα, συχνά αποκαλούμενα «ελεύθερες μεταβλητές». Ποια έκδοση ήταν η σωστή; Ήταν τα δεδομένα όταν ξεκίνησε η κλήση συνάρτησης; Ή ήταν όταν εκτελείται η λειτουργία; Αυτό είναι ιδιαίτερα σημαντικό για JavaScript όπου μπορεί να υπάρχουν μεγάλα κενά στο μεταξύ.

Η λύση, το «κλείσιμο», είναι μια από τις μεγαλύτερες πηγές πονοκεφάλων για προγραμματιστές JavaScript (και τώρα Java και Swift). Οι αρχάριοι και ακόμη και πολλοί βετεράνοι δεν μπορούν να καταλάβουν τι είναι κλειστό και πού είναι τα όρια του λεγόμενου κλεισίματος.

Το όνομα δεν βοηθάει - δεν είναι σαν να κλείνει μόνιμα η πρόσβαση σαν μια γραμμή που ανακοινώνει την τελευταία κλήση. Αν μη τι άλλο, η πρόσβαση είναι ανοιχτή, αλλά μόνο μέσω ενός σκουληκιού στο συνεχές χρονικό διάστημα δεδομένων, ένας παράξενος μηχανισμός αλλαγής χρόνου που αναμένεται να δημιουργήσει τελικά μια τηλεοπτική εκπομπή sci-fi. Όμως, το να ονομάζουμε "Complex Stack Access Mechanism" ή "Data Control Juggling System" φαίνεται πολύ μεγάλο, οπότε έχουμε κολλήσει με το "κλείσιμο". Μην με ξεκινήσετε για το αν κάποιος πρέπει να πληρώσει για τις μη δωρεάν μεταβλητές.

Πολύ μεγάλα δεδομένα

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

Το πρόβλημα είναι ότι οι σκληροί δίσκοι είναι τουλάχιστον 20 ή 30 φορές πιο αργοί από τη μνήμη RAM και οι δίσκοι μαζικής αγοράς είναι συχνά πιο αργοί. Εάν κάποια άλλη διαδικασία προσπαθεί επίσης να γράψει ή να διαβάσει από το δίσκο, όλα γίνονται δραματικά χειρότερα, επειδή οι μονάδες μπορούν να κάνουν μόνο ένα πράγμα τη φορά.

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

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

NP-πλήρης

Όποιος έχει πανεπιστημιακή εκπαίδευση στην επιστήμη των υπολογιστών γνωρίζει τα μυστηριώδη προβλήματα που είναι τυλιγμένα σε ένα ακρωνύμιο που σπάνια διατυπώνονται: μη διακριτικοποιημένα πολυώνυμα, γνωστά και ως NP-complete. Οι λεπτομέρειες χρειάζονται συχνά ένα ολόκληρο εξάμηνο για να μάθουν, και ακόμη και τότε, πολλοί μαθητές CS βγαίνουν με μια ομιχλώδη ιδέα ότι κανείς δεν μπορεί να λύσει αυτά τα προβλήματα επειδή είναι πολύ σκληρά.

Τα προβλήματα πλήρους NP συχνά είναι αρκετά δύσκολα - αν τα επιτεθείτε απλά με ωμή βία. Το "πρόβλημα πωλητή ταξιδιού", για παράδειγμα, μπορεί να διαρκέσει εκθετικά, καθώς η διαδρομή πωλήσεων περιλαμβάνει όλο και περισσότερες πόλεις. Η επίλυση ενός «προβλήματος σακιδίου» βρίσκοντας ένα υποσύνολο αριθμών που πλησιάζουν την τιμή N, επιλύεται δοκιμάζοντας όλα τα πιθανά υποσύνολα, που είναι ένας πολύ μεγάλος αριθμός. Ο καθένας τρέχει με φόβο από αυτά τα προβλήματα, επειδή είναι το τέλειο παράδειγμα ενός από τους μεγαλύτερους bogeymen στη Silicon Valley: αλγόριθμοι που δεν θα κλιμακωθούν.

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

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

Ασφάλεια

«Υπάρχουν γνωστά γνωστά. υπάρχουν πράγματα που ξέρουμε ότι ξέρουμε », είπε κάποτε σε συνέντευξη Τύπου ο Ντόναλντ Ράμσφελντ, Υπουργός Άμυνας κατά τη δεύτερη κυβέρνηση Μπους. «Γνωρίζουμε επίσης ότι υπάρχουν γνωστά άγνωστα. δηλαδή ότι γνωρίζουμε ότι υπάρχουν κάποια πράγματα που δεν γνωρίζουμε. Υπάρχουν όμως και άγνωστα άγνωστα - αυτά που δεν γνωρίζουμε δεν γνωρίζουμε. "

Ο Ράμσφελντ μιλούσε για τον πόλεμο στο Ιράκ, αλλά το ίδιο ισχύει και για την ασφάλεια των υπολογιστών. Τα μεγαλύτερα προβλήματα είναι τρύπες που δεν γνωρίζουμε καν ότι είναι πιθανά. Όλοι καταλαβαίνουν ότι πρέπει να κάνετε τον κωδικό πρόσβασής σας δύσκολο να το μαντέψετε - αυτό είναι γνωστό. Αλλά ποιος έχει πει ποτέ ότι το υλικό του δικτύου σας έχει το δικό του στρώμα λογισμικού που θαμμένο μέσα; Η πιθανότητα κάποιος να παραλείψει την παραβίαση του λειτουργικού σας συστήματος και αντίθετα να στοχεύσει αυτό το μυστικό επίπεδο είναι άγνωστο άγνωστο.

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

Κρυπτογράφηση

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

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

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

Διαχείριση ταυτότητας

Όλοι αγαπούν αυτό το καρτούν της Νέας Υόρκης με τη διάτρηση, "Στο Διαδίκτυο, κανείς δεν ξέρει ότι είστε σκύλος." Έχει ακόμη και τη δική του σελίδα Wikipedia με τέσσερις περίτεχνες ενότητες. (Στο Διαδίκτυο, κανείς δεν ξέρει το παλιό πριόνι για την ανάλυση του χιούμορ και την ανατομή των βατράχων.)

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

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

Όχι πολύ από αυτά έχει σημασία για τον κόσμο της αδράνειας συνομιλίας στο Snapchat ή στο Reddit, αλλά η ροή των παραβιασμένων σελίδων Facebook είναι λίγο ανησυχητική. Δεν υπάρχει εύκολος τρόπος για να χειριστείτε σοβαρά ζητήματα, όπως περιουσία, χρήματα, υγειονομική περίθαλψη ή σχεδόν οτιδήποτε άλλο στη ζωή, εκτός από την άσκοπη μικρή συζήτηση. Το bitcoin fanbois λατρεύει να ασχολείται με το πόσο σταθερά μπορεί να είναι το blockchain, αλλά με κάποιο τρόπο τα νομίσματα συνεχίζουν να σκίζονται (δείτε εδώ και εδώ). Δεν έχουμε πραγματική μέθοδο χειρισμού της ταυτότητας.

Μέτρηση σκληρότητας

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

Σχετικά Άρθρα

  • Κατεβάστε: Οδηγός ανάπτυξης σταδιοδρομίας προγραμματιστή
  • Η δύναμη του τεμπέλης προγραμματισμού
  • 7 κακές ιδέες προγραμματισμού που λειτουργούν
  • 9 κακές συνήθειες προγραμματισμού που λατρεύουμε κρυφά
  • 21 καυτές τάσεις προγραμματισμού - και 21 κρύες
  • Κατεβάστε: Ο επαγγελματικός οδηγός επιβίωσης του επαγγελματία προγραμματιστή
  • Κατεβάστε: 29 συμβουλές για επιτυχία ως ανεξάρτητος προγραμματιστής
  • 7 γλώσσες προγραμματισμού που μας αρέσει να μισούμε
  • 5 ακόμη διαχρονικά μαθήματα προγραμματισμού «γκρίζα γενιά»
  • 22 προσβολές που κανένας προγραμματιστής δεν θέλει να ακούσει
  • 9 προβλέψεις για το μέλλον του προγραμματισμού
  • Οι 13 δεξιότητες προγραμματιστή που πρέπει να μάθετε τώρα
  • Προγραμματίστε τον κόσμο: 12 τεχνολογίες που πρέπει να γνωρίζετε τώρα
  • Επίθεση των γλωσσών προγραμματισμού ενός γράμματος