
Ποιες έννοιες στην Επιστήμη των Υπολογιστών νομίζετε ότι έχετε μια καλύτερη προγραμματιστή γίνει;


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


**Γλώσσα Λειτουργίες**


* Δείκτες & Αναδρομή (Χάρη Joel!)


**ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ**


* Συνδεδεμένες Λίστες
* hashtables


**αλγόριθμοι**


* Ταξινομεί φούσκα


Προφανώς, η λίστα είναι λίγο μικρό αυτή τη στιγμή και έτσι ήλπιζα για τις προτάσεις σχετικά με:


1. Τι έννοιες που πρέπει να καταλάβουν,
2. Κάθε καλό πόρων για την ορθή κατανόηση τους (όπως η Wikipedia μπορεί να είναι λίγο πυκνή και ακαδημαϊκά μερικές φορές).

 
Τι εννοιών της Πληροφορικής πρέπει να γνωρίζω;
==============================================



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

 

Ρίξτε μια ματιά σε αυτό το blog από τον Steve Yegge (πρώην της Amazon, τώρα στο Google):


* [Οι Πέντε βασικές ερωτήσεις οθόνης τηλεφώνου](http://steve.yegge.googlepages.com/five-essential-phone-screen-questions)


Δεν πηγαίνει σε κάποιες λεπτομέρειες σχετικά με τις πέντε πιο σημαντικές έννοιες που οι προγραμματιστές θα πρέπει να υποχρεούνται να γνωρίζουμε:


1. Ο βασικός προγραμματισμός (συμπεριλαμβανομένης της αναδρομής, το αρχείο I / O, μορφοποιημένη έξοδο, loops κλπ)
2. προσανατολισμό το σχεδιασμό αντικειμένων (συμπεριλαμβανομένων των προτύπων σχεδιασμού κ.λπ.). Θα πρέπει να είναι σε θέση να παράγει λογική σχέδια OO, καθώς και την κατανόηση των εννοιών.
3. Scripting και regexes.
4. Δομές δεδομένων - λίστες, σύνολα, hashtables, τα δέντρα, τα γραφήματα, και ούτω καθεξής - καθώς και Big O συμβολισμός και η αλγοριθμική πολυπλοκότητα.
5. Bits, bytes και δυαδικούς αριθμούς - πώς οι αριθμοί αντιπροσωπεύονται στο εσωτερικό του υπολογιστή, και πώς να τα χειριστούν.

 

Σίγουρα θα πρέπει να κατανοήσουν τις [Big-O](http://en.wikipedia.org/wiki/Big-O_notation) συμβολισμός και Big-O εκτιμήσεις των αλγορίθμων - τι είναι, πώς χρησιμοποιείται, γιατί είναι σημαντικό, πώς θα συγκρίνουμε δύο αλγορίθμων δίνεται Big-O εκτιμήσεις τους, πώς θα οικοδομήσουμε εκτιμήσεις Big-O για τους απλούς αλγορίθμους.

 

Θα έλεγα ότι σήμερα η κατανόηση του αντικειμένου με γνώμονα τα προγραμματισμός είναι απαραίτητη, ακόμα και αν δεν χρειαστεί να το χρησιμοποιήσετε μέρα σε μέρα.


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

 

Μερικές από τις έννοιες OS



```
 ( memory, IO, Scheduling, process\Threads, multithreading )

```

[ένα καλό βιβλίο " [Λειτουργικά Συστήματα Modern](http://www.pearsonhighered.com/educator/academic/product/0,,0130313580,00%2Ben-USS_01DBC.html) , 2η Έκδοση, Andrew S. Tanenbaum"]


Βασικές γνώσεις δικτύων υπολογιστών


[ένα καλό βιβλίο από [Tanenbaum](http://rads.stackoverflow.com/amzn/click/0133499456)


OOPS έννοιες


πεπερασμένων autometa


Μια γλώσσα προγραμματισμού (έμαθα C πρώτα, στη συνέχεια, C ++)


Αλγόριθμοι (Ώρα \ χώρο πολυπλοκότητα, το είδος, αναζήτηση, δέντρα, συνδεδεμένη λίστα, στοίβα, ουρά)


[ένα καλό βιβλίο [Εισαγωγή στην Αλγόριθμοι](http://mitpress.mit.edu/algorithms/) ]

 

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


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

 

Για μένα Πήρα πολλά από τα παρακάτω μαθημάτων στο πανεπιστήμιο


* Διαχείριση έργου
* Αλληλεπίδραση Ανθρώπου Υπολογιστή (βοηθά μας σπασίκλες κάνουμε πιο φιλική προς το χρήστη οθόνη)
* Σχεδίαση Βάσεων Δεδομένων (Συμπεριλαμβανομένων πώς λειτουργούν οι βάσεις δεδομένων, αρχεία καταγραφής συναλλαγών, κλείδωμα κλπ)
* αποθήκευση δεδομένων
* Graphics (OpenGL)
* Σύνθετη Αλγόριθμοι
* ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ


Τα πράγματα Μακάρι να είχα γίνει στο πανεπιστήμιο


* compiler Κατασκευή
* Σχεδιαστικά πρότυπα
* θεωρία αυτομάτων

 

Είναι σαφώς μια καλή κατανόηση του αντικειμένου προγραμματισμό, καλό κατευθυντήριες αρχές, όπως [σταθερές αρχές](http://www.codetoglory.com/?p=40) και σύμφωνα με καθιερωμένα πρότυπα και πρακτικές.


Αν κοιτάξετε SOA, ή DDD, όλοι τελικά να πέσει πίσω σε κάποια μορφή των εννοιών OOP.


Θα ήθελα να σας συστήσει να πάρετε κάποια καλά βιβλία OOP και αλός πάρει μια πλούσια γλώσσα όπως η C # ή Java για να αρχίσει με 


[OOP από Grady Booch](http://rads.stackoverflow.com/amzn/click/020189551X)


(PHP, Ruby παιδιά σας παρακαλούμε να δεν κάτω ψηφίζουν μου, είμαι απλά δίνοντας μερικά παραδείγματα γι 'αυτόν για να αρχίσει με, μπορείτε να παρέχουν τις δικές σας απαντήσεις και προτάσεις εδώ) 

 

Θεωρώ ότι είναι λίγο αστείο που ψάχνετε *επιστήμης των υπολογιστών* θέματα, αλλά βρείτε wikipedia υπερβολικά ακαδημαϊκή: D


Τέλος πάντων, εδώ πηγαίνει, χωρίς συγκεκριμένη σειρά:


* Το σχεσιακό μοντέλο: [Εισαγωγή στα συστήματα βάσεων δεδομένων](http://rads.stackoverflow.com/amzn/click/0321197844)
* Προσανατολισμό Αντικείμενο: [Σκέψη Αντικείμενο](http://rads.stackoverflow.com/amzn/click/0735619654)
* Η πολυπλοκότητα και η θεωρία υπολογισμού (σκεφτείτε μηχανές Turing και αυτόματα): [Εισαγωγή στη θεωρία υπολογισμού](http://rads.stackoverflow.com/amzn/click/0534950973)
* Ένα μικρό σχεδιασμό compiler: [Το Δράκος βιβλίο](http://rads.stackoverflow.com/amzn/click/0321486811) , αν και αυτό θα μπορούσε να είναι λίγο πάνω από πάρα πολύ σε βάθος για τις ανάγκες σας.
* Λειτουργικό σύστημα εννοιών: [Σύγχρονα λειτουργικά συστήματα](http://rads.stackoverflow.com/amzn/click/0136006639)
* Οι άνθρωποι δεξιότητες: [Πώς να κερδίσετε φίλους και να επηρεάσει τους ανθρώπους](http://rads.stackoverflow.com/amzn/click/0671027034)
* Ομαδική εργασία: [Peopleware](http://rads.stackoverflow.com/amzn/click/0932633439)
* Σχεδιασμό διεπαφής χρήστη: [Οι τρόφιμοι τη λειτουργία του ασύλου](http://rads.stackoverflow.com/amzn/click/0672326140)

 

Κανόνας 1: **Λογισμικό Capture Γνώσης** . Λογισμικό σημαίνει κάτι. Αν δεν είστε σίγουροι για το νόημα, περνούν περισσότερο χρόνο μιλώντας για τους χρήστες να κατανοήσουν τι κάνουν.


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


Ξεμάθουμε φούσκα είδος όσο το δυνατόν γρηγορότερα. Σοβαρά. Όλες οι σύγχρονες γλώσσες (Java, Python, κλπ) έχουν τάξεις συλλογή που εφαρμόζουν ένα καλύτερο είδος από το είδος φούσκα. Δεν υπάρχει απολύτως καμία περίπτωση κάτω από τις οποίες θα πρέπει να χρησιμοποιείτε ποτέ το είδος φούσκα για τίποτα. Θα πρέπει να ψάχνει για μια κατηγορία συλλογή που περιλαμβάνει μια μέθοδο ταξινόμησης. Καλύτερα, θα πρέπει να ψάχνει για έναν αλγόριθμο που αποφεύγει τη διαλογή εξ ολοκλήρου.


Θα πρέπει να μάθουν πολλές γλώσσες.


* γλώσσα προγραμματισμού (Java, Python, κλπ)
* Shell γλώσσα.
* γλώσσα βάσεων δεδομένων (SQL)
* γλώσσες Παρουσίαση (HTML και CSS)
* Άλλες γλώσσες αναπαράστασης δεδομένων (XML, JSON)


Θα πρέπει να μάθουν διάφορες δομές δεδομένων.


* Ακολουθίες (λίστες, πλειάδες, αρχεία)
* Ιεραρχική (όπως XML και HTML έγγραφα, καθώς και το βασικό σύστημα αρχείων)
* Σχεσιακές (όπως βάσεις δεδομένων, και το σύστημα αρχείων με σκληρό και μαλακό συνδέσεις που ρίχνονται μέσα)
* Χάρτες (ή δείκτες ή πίνακας συσχέτισης), συμπεριλαμβανομένων Hash Χάρτες και Δέντρο Χάρτες
* Σκηνικά


Συν κάποια αλγοριθμική ανάλυση πολυπλοκότητας. Μερικές φορές ονομάζεται "Big O". Γιατί μια ταξινόμηση φυσαλίδας είναι κακό είναι ότι είναι **O** ( *n* ^ 2), όπου quicksort είναι **O** ( *n* log *n* ). 

 

Αλγόριθμοι.


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


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


Για να συνοψίσω - ρίξτε μια ματιά στο [Εισαγωγή στους Αλγόριθμους](http://en.wikipedia.org/wiki/Introduction_to_Algorithms)


Δεν χρειάζεται να έχει τον έλεγχο, απλά ξέρω τι συμβαίνει ...

 

Ως μια πρόσφατη απόφοιτος από έναν βαθμό επιστήμης των υπολογιστών θα ήθελα να συστήσει τα εξής:


* Όπως αναφέρεται σε διάφορες θέσεις Big O συμβολισμός 


OO Σχεδιασμός 


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


Λειτουργικά Συστήματα
 [http://www.amazon.com/Modern-Operating-Systems-2nd-GOAL/dp/0130313580](http://rads.stackoverflow.com/amzn/click/0130313580)


NP προβλήματα

 

Νομίζω ότι είναι σημαντικό να κατανοήσουμε τη βασική θεωρία πίσω από multi-threading, χωρίς αυτό μπορεί να είναι δύσκολο ακόμη και να δούμε ότι μπορεί να υπάρχει κάποιο πρόβλημα, μέχρι να είστε εντοπισμό σφαλμάτων σε ένα ζωντανό διακομιστή στις 4 η ώρα το πρωί της Κυριακής.


Σηματοφορείς, κρίσιμα τμήματα και εκδηλώσεις.

 

**ενθυλάκωση**


[Στην επιστήμη των υπολογιστών, ενθυλάκωση είναι η απόκρυψη των εσωτερικών μηχανισμών και δομών δεδομένων ενός συστατικού λογισμικού πίσω από ένα καθορισμένο περιβάλλον, με τέτοιο τρόπο ώστε οι χρήστες του συστατικού (άλλα κομμάτια του λογισμικού) πρέπει μόνο να γνωρίζουμε τι κάνει το στοιχείο, και δεν μπορεί να κάνουν οι ίδιοι εξαρτώνται από τις λεπτομέρειες για το πώς το κάνει](http://en.wikipedia.org/wiki/Encapsulation_(computer_science))

 

Όχι, δεν είναι φούσκα του είδους, quicksort. Είναι το μεγάλο-O πράγμα, φούσκα μέσους όρους ταξινόμησης O (n ^ 2), quicksort είναι O (n * log (n)).

 

[Δομή και ερμηνεία των προγραμμάτων ηλεκτρονικών υπολογιστών](http://mitpress.mit.edu/sicp/full-text/book/book.html) . Εάν έχετε κατανοήσει αυτό το βιβλίο, ό, τι άλλο μπορεί να κατασκευαστεί εύκολα σε αυτά τα θεμέλια. Αν έχετε πρόβλημα με τις έννοιες στο βιβλίο, που μπορεί να είναι ένας προγραμματιστής λογισμικού, αλλά όχι ένας επιστήμονας υπολογιστών.

 

Θα ήθελα να πω παρακάτω είναι τα πιο σημαντικά πράγματα


* Αντικειμενοστραφής προγραμματισμός
* έννοιες Λειτουργικό Σύστημα
	+ Διαδικασία και Νήμα
	+ Προγραμματισμός Αλγόριθμοι
* Δομή δεδομένων
	+ Τύπος της αποθήκευσης δεδομένων και συλλογής, τύπους (LinkedList, hash, συστοιχία κλπ)
	+ Ταξινόμηση Αλγορίθμων
	+ Η πολυπλοκότητα των αλγορίθμων


Στη συνέχεια Πηγαίνετε σε συγκεκριμένα πράγματα που σχετίζονται με τη γλώσσα. Ελπίζω ότι αυτό είναι χρήσιμο!!

 

Θα ήθελα να ξεκινήσω με το απόσπασμα:



> 
> «Αν το μόνο εργαλείο που έχεις είναι ένα σφυρί, που αντιμετωπίζουν πάντα σαν ένα καρφί». (Abraham Maslow)
> 
> 
> 


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


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


Αυτή η συμβουλή πηγαίνει μαζί με την σημερινή τάση για πολλές γλώσσες έργων (πάρτε web εφαρμογές, για παράδειγμα, η οποία μπορεί να περιλαμβάνει πολλές γλώσσες στην ενιαία αίτηση, όπως η C #, JS, CSS, XPath, SQL, XML, HMTL, RegExp .... και ακόμη διαφορετικά παραδείγματα προγραμματισμού (για παράδειγμα, C # εισήγαγε πρόσφατα μερικές έννοιες από το λειτουργικό πρότυπα προγραμματισμού, λάμδα).


Έτσι, το βασικό πράγμα είναι **συνεχής μάθηση, για πάντα** :)

 

Νομίζω **3D-γραφικά** είναι κάτι που όλοι πρέπει να μάθουν. Ή τουλάχιστον πώς να χρησιμοποιούν σωστά ομοιογενή φορείς και μήτρα-μετασχηματισμών.


Μπορεί να είναι χρήσιμο όχι μόνο για τη δημιουργία 3D-εφαρμογές, αλλά **και σε μηχανικό τομείς** όπως η αντίστροφη κινηματική σε ρομπότ, τον υπολογισμό στιγμές και πολλά άλλα πράγματα.


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

 

Από μηχανές με πολλαπλούς πυρήνες (και τα δύο CPU και GPU) γίνονται το πρότυπο, θα έλεγα να περιλαμβάνουν [Κατανεμημένα Αλγόριθμοι](http://en.wikipedia.org/wiki/Distributed_algorithms) (από πολλαπλά νήματα σε πολλαπλές μηχανές). Είναι κρίσιμο να κατανοήσουμε multi-threading και κατανεμημένη επεξεργασία. Δυστυχώς η σχέση αυτή δεν παρέχει πραγματικά πολλή βοήθεια.

 

Βλέπω πολλές καλές ιδέες CS εντοπιστεί, αλλά λίγο μιλάμε για Μαθηματικά.


Προτείνω να εξετάσουμε **[διακριτά μαθηματικά](http://en.wikipedia.org/wiki/Discrete_mathematics)** . Διαθέτει ένα ευρύ φάσμα χρήσιμων προβλήματα ξεκινώντας με λογικές αποδείξεις που θα σας βοηθήσουν να γράψετε συνθήκες στον κώδικα. Θεωρία γραφημάτων και Συνδυαστική επίσης να βοηθήσει με πολύπλοκες επίλυση προβλημάτων και τη βελτιστοποίηση αλγορίθμου.


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

 

Μερικές ιδέες που βοήθησαν την ανάπτυξή μου (διάνοια και κωδικό):


* Lexing, Parsing, String ταιριάζουν, Regex
* [Memoization](http://perl.plover.com/MiniMemoize/memoize.html)
	+ ενθυλάκωση / οριοθέτησης / κλεισίματα
	+ caching
* Αναδρομή
* Iterators / Γεννήτριες
* Λειτουργική προγραμματισμού - John Hughes' καταπληκτικό [άρθρο](http://www.cs.chalmers.se/~rjmh/Papers/whyfp.html) μου είχε στο “γιατί”


Αυτά είναι ολόκληρη τομείς των διακριτών μαθηματικών, αλλά μια σοβαρή εισαγωγή απαιτείται για CS:


* Matrix / Γραμμική Άλγεβρα
* Θεωρία γράφημα


Αν [διαλέξεις και άρθρα του Mark Jason-Dominus](http://perl.plover.com/) συχνά απευθύνονται σε Perl χάκερ, νομίζω ότι οποιοσδήποτε προγραμματιστής θα ωφεληθούν από σαφή παρουσίασή του και σε πραγματικό κώδικα, ειδικά σε [Ανώτερης Τάξης Perl](http://hop.perl.plover.com/book/) .

 

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


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


* Γενικές έννοιες OO, και σύγχρονα χαρακτηριστικά γλώσσα προγραμματισμού (κλάσεις, απόκρυψη δεδομένων, κλπ).
* μετρήσεις απόδοσης Αλγόριθμος (Big O συμβολισμός). Κατά το σχεδιασμό ενός αλγορίθμου, που εκτελεί μια μεγάλη ανάλυση O για τον προσδιορισμό του κόστους του αλγόριθμος, και κοιτάζοντας πιο αποτελεσματικές εναλλακτικές λύσεις σε περιοχές συμφόρησης.
* Συνδεδεμένες λίστες και άλλες σύνθετες δομές δεδομένων.
* Γρήγορη ταξινόμηση και διαφορετικές έννοιες ταξινόμησης.
* Δέντρα και γρήγορη χειραγώγηση δέντρο.


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

 

[Ανάπτυξη Λογισμικού Κύκλου Ζωής](http://en.wikipedia.org/wiki/Systems_Development_Life_Cycle) - Οι απαιτήσεις συλλογής, το σχεδιασμό και την ανάλυση, την υλοποίηση, τον έλεγχο και την υποστήριξη και την ακολουθία συντήρησης. Αυτό μαζί με μεθοδολογίες, όπως καταρράκτη και ευκίνητη, όπου αυτά τα βήματα εφαρμοστούν στην πράξη είναι επίσης ένα σημαντικό πράγμα που πρέπει να μάθουν.

 

Οτιδήποτε όμως φούσκα ταξινόμησης:


* heap είδος
* Γρήγορη ταξινόμηση


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

 

Δεν πρόκειται να σας πω συγκεκριμένες έννοιες για τη μελέτη, αλλά θα πρότεινα, αντί να το κάνετε πολύ φως ανάγνωσης σε ένα ευρύ φάσμα θεμάτων. Μην ανησυχείτε για να πάρει μια σε βάθος κατανόηση του κάθε θέματος μπορείτε να διαβάσετε σχετικά με - σε αυτό το σημείο, είναι πιο σημαντικό να είστε σε θέση να αναγνωρίσει τι *είδους* πρόβλημα που ψάχνετε σε, έτσι ώστε να μπορείτε να κάνετε κάποια just- σε χρόνο μελετώντας όταν είστε πραγματικά αντιμέτωποι με αυτό. Με άλλα λόγια, είναι εντάξει, αν δεν ξέρετε πώς να λύσει ένα πρόβλημα Συνδυαστική, εφ 'όσον ξέρετε αρκετά για να αναζητήσετε «Συνδυαστική», όταν θα πρέπει να δούμε πόσους τρόπους μπορείτε να κανονίσετε ένα σύνολο αντικειμένων ή να επιλέξετε ένα υποσύνολο .


Η Wikipedia είναι μια πολύ καλή πηγή για αυτό το είδος της ευρείας περιήγηση, ειδικά αν είστε ακριβώς αποκορύφωση για να αρχίσει με. Μια ακόμα καλύτερη, ειδικά αν βρείτε τη Βικιπαίδεια πολύ ακαδημαϊκή ή απρόσιτες, είναι το [wiki C2](http://c2.com/cgi/wiki) . (Αυτό είναι, περιέργως, *το* αρχικό wiki που εφευρέθηκε από τον Ward Cunningham).

 

[Προγραμματιστής Competency Matrix](http://www.indiangeek.net/programmer-competency-matrix/) καλύπτεται αυτό με λεπτομέρειες, αλλά θα επισημάνω μερικά:


* ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ
	+ Σύνθετη δομές δεδομένων, όπως Β-δέντρα, διωνυμική και Fibonacci σωρούς, AVL / Κόκκινο Μαύρο δέντρα, Splay Δέντρα, Μεταφορά λίστες, προσπαθεί κ.λπ.
* αλγόριθμοι
	+ Δέντρο, γράφημα, απλά άπληστοι και διαίρει και βασίλευε, είναι σε θέση να κατανοήσουν τη σημασία των επιπέδων της μήτρας.
* προγραμματισμού συστημάτων
	+ Κατανοεί ολόκληρη τη στοίβα προγραμματισμό, hardware (CPU + Memory + Cache + Διακοπές + μικροκώδικα), δυαδικό κώδικα, συναρμολόγηση, στατική και δυναμική σύνδεση, συλλογή, ερμηνεία, συλλογή ΚΟΕ, συλλογή των απορριμμάτων, σωρού, η καπνοδόχος, μνήμη αντιμετώπιση ...
* Έλεγχος πηγαίου κώδικα Έκδοση
	+ Η γνώση των κατανεμημένων συστημάτων VCS. Έχει δοκιμάσει bzr / Mercurial / darcs / Git
* Κατασκευάστηκε αυτοματισμού
	+ Μπορεί να στήσετε ένα σενάριο για την κατασκευή του συστήματος, αλλά και την τεκμηρίωση, εγκαταστάτες, δημιουργούν σημειώσεις έκδοσης και επισημάνετε τον κώδικα ελέγχου προέλευσης
* αυτοματοποιημένη δοκιμή
	+ Κατανοεί και είναι σε θέση να στήσετε αυτοματοποιημένο λειτουργικό, το φορτίο / επιδόσεων και τη δοκιμή UI
* πρόβλημα αποσύνθεσης
	+ Η χρήση των κατάλληλων δομών δεδομένων και αλγορίθμων και έρχεται με γενικό / κωδικό object-oriented που συμπυκνώνουν τις πτυχές του προβλήματος που υπόκεινται σε αλλαγές.
* συστήματα αποσύνθεσης
	+ Ικανός να απεικονίσει και να σχεδιάσουν σύνθετα συστήματα με πολλαπλές σειρές προϊόντων και ολοκληρώσεις με εξωτερικά συστήματα. Επίσης, θα πρέπει να είναι σε θέση να σχεδιάσει συστήματα υποστήριξης λειτουργιών, όπως η παρακολούθηση, την υποβολή εκθέσεων, δεν εξαγορές κ.λπ.

 

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


Ήθελα επίσης να προσθέσω σε αυτά που είπε S.Lott για τις γλώσσες. Μαθαίνοντας ένα σωρό είδη των γλωσσών είναι πάρα πολύ σημαντικό. Όχι μόνο καταρτίζονται vs scripting. Αλλά λειτουργική (ML, Lisp, Haskell) λογική (Prolog) αντικειμενοστρεφούς (C ++, Java, Smalltalk) επιτακτική (C, Pascal, FORTRAN ακόμη).


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

 

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


[Προτασιακή λογική](http://en.wikipedia.org/wiki/Propositional_logic) , [First-Order Logic](http://en.wikipedia.org/wiki/First-order_logic) , [δεύτερης τάξης Logic](http://en.wikipedia.org/wiki/Second-order_logic) : αυτά είναι πολύ ισχυρά εργαλεία. Πιθανώς οι περισσότεροι (και μόνο) σημαντικά πράγματα που έχω μάθει στο πανεπιστήμιο. Η λογική είναι σαν το βαρύ πυροβολικό του προγραμματιστή - πολλά πολύ πολύπλοκα προβλήματα (καθώς και οι λιγότερο σύνθετες) γίνει πολύ πιο απλή, αφού έχετε τα βάλει σε μια οργανωμένη, λογική μορφή. Είναι σαν αυτό που Γραμμική Άλγεβρα είναι Μηχανολόγοι Μηχανικοί.

 

Νομίζω ότι μια καλή κατανόηση του πώς λειτουργεί ένα compiler είναι καλό να γνωρίζουμε. Aho έχει το κλασικό βιβλίο για έννοιες που χρησιμοποιούνται για τη δημιουργία ενός compiler. Ο τίτλος είναι Μεταγλωττιστές: Αρχές, Τεχνικές και Εργαλεία. ψευδώνυμο του είναι ο Δράκος βιβλίο. Για να κατανοήσουμε πραγματικά αυτό το βιβλίο, θα πρέπει να έχετε μια κατανόηση των τυπικών γλωσσών. Hopcroft έχει ένα καλό βιβλίο για αυτό - Εισαγωγή στη Θεωρία Αυτομάτων, Γλώσσες, και Υπολογισμού.

 

Καλά το κουτί της Πανδώρας είναι ανοικτό τώρα! :)   

Ξεκίνησα Ηλεκτρολόγου Μηχανικού.


**Σχεδιασμός Σχεσιακών Βάσεων Δεδομένων:** Η παρακολούθηση των δεδομένων είναι σαν τον Arnold σε «Νηπιαγωγείο Cop».   
Μπορεί να είναι απόλυτο χάος. Πρέπει να ελεγχθεί.   
Πώς να διατηρήσετε τα δεδομένα σας, με τις λιγότερες θέσεις, με τις λιγότερες επαναλήψεις των πληροφοριών. Πώς να διατηρήσετε το φως των δεδομένων σας, και εύκολα προσβάσιμο. Πώς να ελέγξει την ανάπτυξη και την ακεραιότητά τους.


**User Interface (UI) Σχεδιασμός:** Αυτό είναι το πώς ο χρήστης **πρέπει να** έχει πρόσβαση στα δεδομένα είμαστε παρακολούθηση της.   
Οι περισσότεροι περιβάλλον εργασίας χρήστη που σχεδιάστηκε από τους προγραμματιστές. Έτσι, οι περισσότεροι περιβάλλον εργασίας χρήστη, δυστυχώς, παράλληλα το σχεδιασμό της βάσης δεδομένων. Οι χρήστες δεν ενδιαφέρονται για το σχεδιασμό των δεδομένων σε όλα. Θέλουν απλά, αυτό που θέλουν. Θέλουν να το πάρει εύκολα. Συνήθως αυτό απαιτεί μεγάλη διαχωρισμό από το σχεδιασμό των δεδομένων και της διεπαφής χρήστη. Μάθετε για το διαχωρισμό του «μηχανικού» που από το «νότιο-φιλοξενία» σας.


**Αντικειμενοστρεφής Προγραμματισμός:** Πολλές γλώσσες βράζει κάτω σε αυτή τη μορφή.


**Παράλληλη Επεξεργασία - Multi-Threading:** Πολλοί επεξεργαστές κάνουν τη δουλειά γρήγορα!   
Οι παράλληλοι υπολογιστές έχουν εδώ και δεκαετίες. Θα έχουμε την οθόνη του υπολογιστή μας, εδώ και αρκετό καιρό. Με την εκδήλωση του «υπολογιστικού νέφους», μαζική παράλληλη επεξεργασία δεν είναι μόνο manditory αλλά και προτιμότερη. Είναι απίστευτα ισχυρό! Υπάρχουν πολλές δυνατότητες απασχόλησης για παράλληλη προγραμματιστές.


**Κατανόηση Επιχειρήσεις Κανόνες:** Αυτό σας βοηθά να κάνετε πολύ λογική σας, επιτραπέζια βάση.   
 Πολλές συνθήκες IFblock να καθίσετε στους πίνακες των επιχειρησιακών κανόνων. Για να αλλάξετε τη λογική, να αλλάξει μόνο τις πληροφορίες σε έναν πίνακα. Μικρή / Όχι εκ νέου κωδικοποίηση. Μικρή / Δεν επανασύνθεσή.


**Εκδηλώσεις Επιβλέπει ... Μέθοδοι κάνει τη δουλειά:**  
 Κρατήστε τα πράγματα διαχωρίζουν τον κωδικό σας. Θα είναι πιο εύκολο για τους άλλους να κάνουν ενημερώσεις στο μέλλον. Είναι επίσης παραλληλίζεται κάπως το πλαίσιο Model / View / Controller (MVC).


PJ

 

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

Ως παράδειγμα, κτίριο πυραμίδες είναι O (n), ενώ διαλογή φωτογραφίες από αυτούς είναι O (n ln n) στην καλύτερη περίπτωση. Έτσι είναι πιο γρήγορο να χτίσει ένα άλλο πυραμίδα από τακτοποιήσετε ασφαλίσει τις διακοπές σας.


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


(Αυτό ήταν ένα σχόλιο που κάποιος ήθελε να συζητήσει)

 

Προσπάθεια για **[χαμηλή σύζευξη, υψηλή συνοχή](http://www.codeodor.com/index.cfm/2009/6/17/Strive-for-low-coupling-and-high-cohesion-What-does-that-even-mean/2902)** .


[χαμηλή σύζευξη, υψηλή συνοχή http://www.codeodor.com/images/from\_spaghetti\_code\_to\_better\_code.jpg](http://www.codeodor.com/images/from_spaghetti_code_to_better_code.jpg)


(Έκλεψα αυτή την εικόνα από την ιστοσελίδα συνδέονται παραπάνω)

 