Πώς να σκέφτεστε σαν προγραμματιστής - μαθήματα επίλυσης προβλημάτων

Αν ενδιαφέρεστε για προγραμματισμό, ίσως έχετε δει αυτό το απόσπασμα πριν:

«Όλοι σε αυτήν τη χώρα πρέπει να μάθουν να προγραμματίζουν έναν υπολογιστή, γιατί σας διδάσκει να σκέφτεστε». - Ο Steve Jobs

Αναρωτηθήκατε επίσης πιθανώς τι σημαίνει ακριβώς να σκέφτεστε σαν προγραμματιστής; Και πώς το κάνετε ;;

Ουσιαστικά,έχει να κάνει με έναν πιο αποτελεσματικό τρόπο επίλυσης προβλημάτων .

Σε αυτήν την ανάρτηση, στόχος μου είναι να σας διδάξω με αυτόν τον τρόπο.

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

Γιατί είναι σημαντικό?

Η επίλυση προβλημάτων είναι η μετα-ικανότητα.

Όλοι έχουμε προβλήματα. Μεγάλο και μικρό. Ο τρόπος με τον οποίο αντιμετωπίζουμε είναι μερικές φορές, καλά… αρκετά τυχαίο.

Εκτός αν έχετε ένα σύστημα, αυτό είναι πιθανώς πώς «λύνεις» προβλήματα (κάτι που έκανα όταν ξεκίνησα την κωδικοποίηση):

  1. Δοκιμάστε μια λύση.
  2. Εάν αυτό δεν λειτουργεί, δοκιμάστε ένα άλλο.
  3. Εάν αυτό δεν λειτουργήσει, επαναλάβετε το βήμα 2 μέχρι να τύχετε.

Κοίτα, μερικές φορές τυχερές. Αλλά αυτός είναι ο χειρότερος τρόπος επίλυσης προβλημάτων! Και είναι ένα τεράστιο, τεράστιο χάσιμο χρόνου.

Ο καλύτερος τρόπος περιλαμβάνει: α) το πλαίσιο και β) την άσκηση.

«Σχεδόν όλοι οι εργοδότες δίνουν προτεραιότητα στις δεξιότητες επίλυσης προβλημάτων. Οι δεξιότητες επίλυσης προβλημάτων είναι σχεδόν ομόφωνα τα πιο σημαντικά προσόντα που αναζητούν οι εργοδότες… .Περισσότερα από τον προγραμματισμό των γλωσσών, την αποσφαλμάτωση και τη σχεδίαση του συστήματος. , τα περίπλοκα προβλήματα είναι εξίσου πολύτιμα (αν όχι περισσότερο) από τις βασικές τεχνικές δεξιότητες που απαιτούνται για μια εργασία. " - Κατάταξη Hacker (Αναφορά δεξιοτήτων προγραμματιστή 2018)

Έχετε ένα πλαίσιο

Για να βρω το σωστό πλαίσιο, ακολούθησα τις συμβουλές στο βιβλίο του Tim Ferriss σχετικά με την εκμάθηση, «Ο 4ωρος Σεφ».

Με οδήγησε να συνεντεύξω δύο πραγματικά εντυπωσιακούς ανθρώπους: τον C. Jordan Ball (κατατάσσεται 1ος ή 2ος από 65.000+ χρήστες στο Coderbyte) και V. Anton Spraul (συγγραφέας του βιβλίου «Think Like a Programmer: An Introduction to Creative Problem Solving) ").

Τους έκανα τις ίδιες ερωτήσεις και μαντέψτε τι; Οι απαντήσεις τους ήταν πολύ παρόμοιες!

Σύντομα, θα τους γνωρίζετε επίσης.

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

«Το μεγαλύτερο λάθος που βλέπω να κάνουν οι νέοι προγραμματιστές είναι να εστιάσουν στη μάθηση της σύνταξης αντί να μάθουν πώς να λύσουν προβλήματα». - V. Anton Spraul

Λοιπόν, τι πρέπει να κάνετε όταν αντιμετωπίζετε ένα νέο πρόβλημα;

Εδώ είναι τα βήματα:

1. Κατανοήστε

Μάθετε ακριβώς τι σας ζητείται. Τα περισσότερα δύσκολα προβλήματα είναι δύσκολα επειδή δεν τα καταλαβαίνετε (εξ ου και γιατί αυτό είναι το πρώτο βήμα).

Πώς να ξέρετε πότε καταλαβαίνετε ένα πρόβλημα; Όταν μπορείτε να το εξηγήσετε στα απλά αγγλικά.

Θυμάστε ότι έχετε κολλήσει σε ένα πρόβλημα, αρχίζετε να το εξηγείτε και βλέπετε αμέσως τρύπες στη λογική που δεν είχατε ξαναδεί;

Οι περισσότεροι προγραμματιστές γνωρίζουν αυτό το συναίσθημα.

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

"Εάν δεν μπορείτε να εξηγήσετε κάτι με απλούς όρους, δεν το καταλαβαίνετε." - Ρίτσαρντ Φέινμαν

2. Σχέδιο

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

Τίποτα δεν μπορεί να σας βοηθήσει εάν δεν μπορείτε να γράψετε τα ακριβή βήματα.

Στον προγραμματισμό, αυτό σημαίνει να μην αρχίσετε αμέσως να κάνετε hacking. Δώστε στον εγκέφαλό σας χρόνο για να αναλύσει το πρόβλημα και να επεξεργαστεί τις πληροφορίες.

Για να πάρετε ένα καλό σχέδιο, απαντήστε σε αυτήν την ερώτηση:

"Με δεδομένη την είσοδο X, ποια είναι τα απαραίτητα βήματα για την επιστροφή της εξόδου Y;"

Sidenote: Οι προγραμματιστές έχουν ένα εξαιρετικό εργαλείο για να τους βοηθήσουν με αυτό… Σχόλια!

3. Χωρίστε

Δώσε προσοχή. Αυτό είναι το πιο σημαντικό βήμα από όλα.

Μην προσπαθήσετε να λύσετε ένα μεγάλο πρόβλημα. Θα κλαις.

Αντ 'αυτού, σπάστε το σε δευτερεύοντα προβλήματα. Αυτά τα δευτερεύοντα προβλήματα είναι πολύ πιο εύκολο να επιλυθούν.

Στη συνέχεια, λύστε κάθε υπο-πρόβλημα ένα προς ένα. Ξεκινήστε με το απλούστερο. Απλούστερο σημαίνει ότι γνωρίζετε την απάντηση (ή είστε πιο κοντά σε αυτήν την απάντηση).

Μετά από αυτό, απλούστερο σημαίνει ότι αυτό το υπο-πρόβλημα που επιλύεται δεν εξαρτάται από την επίλυση άλλων.

Μόλις επιλύσετε κάθε υπο-πρόβλημα, συνδέστε τις τελείες.

Η σύνδεση όλων των «υπο-λύσεων» θα σας δώσει τη λύση στο αρχικό πρόβλημα. Συγχαρητήρια!

Αυτή η τεχνική είναι ο ακρογωνιαίος λίθος της επίλυσης προβλημάτων. Θυμηθείτε το (διαβάστε ξανά αυτό το βήμα, εάν πρέπει).

«Αν μπορούσα να διδάξω σε κάθε αρχικό προγραμματιστή μια ικανότητα επίλυσης προβλημάτων, θα ήταν η« τεχνική μείωσης του προβλήματος ». Για παράδειγμα, ας υποθέσουμε ότι είστε νέος προγραμματιστής και σας ζητείται να γράψετε ένα πρόγραμμα που διαβάζει δέκα αριθμούς και αριθμούς ποιος αριθμός είναι ο τρίτος υψηλότερος. Για έναν ολοκαίνουργιο προγραμματιστή, αυτό μπορεί να είναι μια δύσκολη εργασία, παρόλο που απαιτεί μόνο βασική σύνταξη προγραμματισμού. Εάν έχετε κολλήσει, θα πρέπει να μειώσετε το πρόβλημα σε κάτι πιο απλό. Αντί για τον τρίτο υψηλότερο αριθμό, τι γίνεται με την εύρεση του υψηλότερου συνολικού αριθμού; Ακόμα πολύ δύσκολο; Τι γίνεται με την εύρεση του μεγαλύτερου από τρεις μόνο αριθμούς; Ή το μεγαλύτερο από δύο; Μειώστε το πρόβλημα σε σημείο που ξέρετε πώς να το λύσετε και γράψτε τη λύση. Στη συνέχεια, επεκτείνετε ελαφρώς το πρόβλημα και ξαναγράψτε τη λύση για να ταιριάξετε και συνεχίστε μέχρι να επιστρέψετε από εκεί που ξεκινήσατε. " - V. Anton Spraul

4. Κολλημένος;

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

Πρώτα απ 'όλα, πάρτε μια βαθιά ανάσα. Δεύτερον, αυτό είναι δίκαιο.

Μην ανησυχείτε, φίλε. Αυτό συμβαίνει σε όλους!

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

Στην πραγματικότητα, εδώ είναι τρία πράγματα που πρέπει να δοκιμάσετε όταν αντιμετωπίζετε ένα whammy:

  • Εντοπισμός σφαλμάτων: Πηγαίνετε βήμα προς βήμα στη λύση σας προσπαθώντας να βρείτε πού πήγε στραβά. Οι προγραμματιστές αποκαλούν αυτό το σφάλμα εντοπισμού σφαλμάτων (στην πραγματικότητα, αυτό είναι όλο το πρόγραμμα εντοπισμού σφαλμάτων).
«Η τέχνη του εντοπισμού σφαλμάτων είναι να καταλάβεις τι πραγματικά είπες στο πρόγραμμά σου να κάνει παρά αυτό που νομίζεις ότι το είπες να κάνει». »- Andrew Singer
  • Εκτιμώ εκ νέου:Κάντε ένα βήμα πίσω. Κοιτάξτε το πρόβλημα από άλλη οπτική γωνία. Υπάρχει κάτι που μπορεί να αφαιρεθεί σε μια πιο γενική προσέγγιση;
«Μερικές φορές χάνουμε τόσο πολύ τις λεπτομέρειες ενός προβλήματος που παραβλέπουμε τις γενικές αρχές που θα λύσουν το πρόβλημα σε ένα γενικότερο επίπεδο. […] Το κλασικό παράδειγμα αυτού, φυσικά, είναι το άθροισμα μιας μακράς λίστας διαδοχικών ακέραιων αριθμών, 1 + 2 + 3 +… + n, την οποία ένας πολύ νέος Gauss γρήγορα αναγνώρισε ήταν απλά n (n + 1) / 2 , αποφεύγοντας έτσι την προσπάθεια να κάνουμε την προσθήκη. " - Γ. Jordan Ball

Sidenote: Ένας άλλος τρόπος επανεκτίμησης είναι να ξεκινήσει εκ νέου. Διαγράψτε τα πάντα και ξεκινήστε ξανά με φρέσκα μάτια. Σοβαρολογώ. Θα εκπλαγείτε από το πόσο αποτελεσματικό είναι αυτό.

  • Ερευνα:Αχ, καλό Google. Διαβάζεις σωστά. Ανεξάρτητα από το πρόβλημα που έχετε, κάποιος μάλλον το έχει λύσει. Βρείτε αυτό το άτομο / λύση. Στην πραγματικότητα, κάντε το ακόμα κι αν λύσατε το πρόβλημα! (Μπορείτε να μάθετε πολλά από τις λύσεις άλλων ανθρώπων).

Caveat: Μην ψάχνετε για λύση στο μεγάλο πρόβλημα. Αναζητήστε μόνο λύσεις σε υπο-προβλήματα. Γιατί; Διότι αν δεν παλέψετε (ακόμα και λίγο), δεν θα μάθετε τίποτα. Εάν δεν μάθετε τίποτα, σπαταλάτε το χρόνο σας.

Πρακτική

Μην περιμένετε να είναι υπέροχοι μετά από μία μόνο εβδομάδα. Εάν θέλετε να είστε καλός επιλυτής προβλημάτων, λύστε πολλά προβλήματα!

Πρακτική. Πρακτική. Πρακτική. Θα είναι μόνο θέμα χρόνου προτού αναγνωρίσετε ότι «αυτό το πρόβλημα θα μπορούσε εύκολα να επιλυθεί».

Πώς να εξασκηθείτε; Υπάρχουν επιλογές από το wazoo!

Παζλ σκακιού, μαθηματικά προβλήματα, Sudoku, Go, Monopoly, video-games, cryptokitties, bla… bla… bla….

Στην πραγματικότητα, ένα κοινό πρότυπο μεταξύ των επιτυχημένων ανθρώπων είναι η συνήθεια τους να ασκούν «μικρο-επίλυση προβλημάτων» Για παράδειγμα, ο Peter Thiel παίζει σκάκι και ο Elon Musk παίζει βιντεοπαιχνίδια.

«Ο Μπάιρον Ριβς είπε« Αν θέλετε να δείτε ποια είναι η επιχειρηματική ηγεσία σε τρία έως πέντε χρόνια, δείτε τι συμβαίνει στα διαδικτυακά παιχνίδια ». Ο Έλωνας [Μόσκ], ο Ριντ [Χόφμαν], ο Μαρκ Ζούκερμπεργκ και πολλοί άλλοι λένε ότι τα παιχνίδια ήταν θεμελιώδη για την επιτυχία τους στην οικοδόμηση των εταιρειών τους. " - Mary Meeker (αναφορά τάσεων στο Διαδίκτυο 2017)

Αυτό σημαίνει ότι πρέπει απλά να παίξετε βιντεοπαιχνίδια; Καθόλου.

Αλλά τι είναι τα βιντεοπαιχνίδια; Αυτό είναι σωστό, επίλυση προβλημάτων!

Έτσι, αυτό που πρέπει να κάνετε είναι να βρείτε μια διέξοδο για εξάσκηση. Κάτι που σας επιτρέπει να επιλύσετε πολλά μικρο-προβλήματα (ιδανικά, κάτι που σας αρέσει).

Για παράδειγμα, μου αρέσουν οι προκλήσεις κωδικοποίησης. Κάθε μέρα, προσπαθώ να λύσω τουλάχιστον μία πρόκληση (συνήθως στο Coderbyte).

Όπως είπα, όλα τα προβλήματα έχουν παρόμοια μοτίβα.

συμπέρασμα

Αυτό ήταν παιδιά!

Τώρα, γνωρίζετε καλύτερα τι σημαίνει να «σκέφτεστε σαν προγραμματιστής».

Γνωρίζετε επίσης ότι η επίλυση προβλημάτων είναι μια απίστευτη ικανότητα να καλλιεργηθείτε (η μετα-δεξιότητα).

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

Phew ... Πολύ ωραίο, σωστά;

Τέλος, σας εύχομαι να αντιμετωπίσετε πολλά προβλήματα.

Διαβάζεις σωστά. Τουλάχιστον τώρα ξέρετε πώς να τα λύσετε! (επίσης, θα μάθετε ότι με κάθε λύση, βελτιώνεστε).

«Ακριβώς όταν νομίζετε ότι έχετε πλοηγηθεί επιτυχώς σε ένα εμπόδιο, εμφανίζεται ένα άλλο. Αλλά αυτό είναι που κρατά τη ζωή ενδιαφέρουσα. […] Η ζωή είναι μια διαδικασία διάρρηξης αυτών των εμποδίων - μια σειρά οχυρωμένων γραμμών που πρέπει να διαπεράσουμε. Κάθε φορά, θα μάθετε κάτι. Κάθε φορά, θα αναπτύξετε δύναμη, σοφία και προοπτική. Κάθε φορά, λίγο περισσότερο από τον ανταγωνισμό πέφτει. Μέχρι να μείνει μόνο εσείς: η καλύτερη εκδοχή σας. " - Ryan Holiday (Το εμπόδιο είναι ο δρόμος)

Τώρα, λύστε μερικά προβλήματα!

Και καλή τύχη;

Ιδιαίτερες ευχαριστίες στους C. Jordan Ball και V. Anton Spraul. Όλες οι καλές συμβουλές προήλθαν από αυτούς.

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