Star_Light έγραψε:
[snip]
Παντως εγω C αν και διαβαζα και στο παρελθον και ειχα βγαλει 2 βιβλια του γκιουρδα.... δεν θα ντραπω να πω πως τωρα αρχισα να μαθαινω καλα.
[snip]
Off topic:
Δεν πιστεύω πως τίθεται καν θέμα ντροπής ρε συ. Έτσι κι αλλιώς, κανείς δεν μπορεί να πει πως ξέρει τέλεια μια γλώσσα ή ότι τα ξέρει όλα, γιατί είναι τεράστιο το εύρος των εφαρμογών της στη πληροφορική. Π.χ. μπορεί να ξέρεις να προγραμματίζεις GTK+ με C πολύ καλά, αλλά αν πας να προγραμματίσεις π.χ. σε Windows API θα χρειαστεί να ρίξεις διάβασμα μέχρι να προσαρμοστείς στις διαφορετικές προσεγγίσεις αλλά και τις συναρτήσεις του.
Προφανώς το να έχεις γερές βάσεις στα της γλώσσας (που στη C μεταφράζεται κυρίως σε pointers

Όπως επίσης, το να έχεις μάθει καλά και να έχεις εμπεδώσει το πως δουλεύουν τα πράγματα "πίσω από τις κουρτίνες" σε μια γλώσσα (κι η C είναι η ιδανική για αυτό) αποτελεί τεράστιο εφόδιο για την περαιτέρω εκμάθηση πιο high-level γλωσσών. Ενώ το αντίθετο, δεν είναι καθόλου εύκολο.
Σχετικά με τα βιβλία, ορισμένα είναι πολύτιμα ως πηγές αλλά ακόμα πιο πολύτιμο είναι να έχει διδαχτεί κανείς σε σωστό περιβάλλον την ύλη του εκάστοτε βιβλίου (ή συναφούς βιβλίου). Αυτή είναι και η μεγάλη διαφορά όσων π.χ. διδάσκονται το ίδιο πράγμα σε στοχευμένο ακαδημαϊκό περιβάλλον συγκριτικά ας πούμε με τους αυτοδίδακτους (χωρίς αυτό να αποκλείει και κάποιες εξαιρέσεις).
Προσωπικά πιστεύω πως τα 2 μεγάλα λάθη που κάνουν οι περισσότεροι όταν ξεκινάνε να μάθουν μια γλώσσα μόνοι τους, είναι:
- Η βιασύνη να πάνε απευθείας στο Ω, προσπερνώντας ή περνώντας στα "πεταχτά" άλλα... γράμματα της αλφαβήτου που προηγούνται, χωρίς να τα έχουν πραγματικά κατανοήσει, ή νομίζοντας πως τα έχουν κατανοήσει (επειδή ως αυτοδίδακτοι δεν έχουν καθοδήγηση από κάποιον που ήδη ξέρει (βλέπε καθηγητή) για το big picture).
- Η λανθασμένη εντύπωση πως αρκούν π.χ. 1-2-3 μήνες αυτοδίδακτης προσπάθειας για να "μάθουν" μια γλώσσα (όποια γλώσσα κι αν είναι αυτή). Ακόμα και να έχουν εξαντλήσει το λεξιλόγιο των keywords της γλώσσας και να το έχουν όντως κατανοήσει, πρέπει να αποκτήσουν και ευχέρεια στη σύνθεση και τις αλληλο-επιδράσεις αυτών των εννοιών που αντιπροσωπεύουν τα keywords, κι αυτό γίνεται μόνο με συγγραφή κώδικα ολοκληρωμένων προγραμμάτων. Και μάλιστα όσο μεγαλύτερο το φάσμα τομέων που καλύπτουν με συγγραφή ολοκληρωμένου κώδικα, τόσο περισσότερο εμπεδώνουν τη γλώσσα. Και όλα αυτά δεν μπορούν να γίνουν σε 1-2-3 μήνες.
Ας πάρουμε για παράδειγμα το παιχνίδι της Ξερής που έχω ποστάρει σε άλλο νήμα κι ας πούμε πως το βάζει κάποιος σαν στόχο προκειμένου να μάθει και να εξοικειωθεί με τις βασικές αρχές της C. Ακόμα και αν έχει μάθει άπταιστα τη σύνταξη της γλώσσας, αν δεν βρεθεί κάποιος να τον καθοδηγήσει για το ότι π.χ. τα μαζέματα των φύλλων του κάθε κάθε παίκτη όπως και τα φύλλα στο τραπέζι είναι ιδανικές περιπτώσεις για να υλοποιηθούν με στοίβες (stacks) το πιθανότερο είναι και πάρα πολύ περισσότερο να παιδευτεί και ο κώδικάς τους να καταλήξει όχι μόνο αχρείαστα πολύπλοκος, αλλά κυρίως "βαρύς", αργός και μνημοβόρος. Αυτό προφανώς είναι ανεξάρτητο από τη γλώσσα, εμπίπτει στην ανάλυση αλγορίθμων και δομών δεδομένων.
Επίσης, το να φτιάξει το παιχνίδι πρώτα σε κονσόλα, του εξασφαλίζει πως το μεγαλύτερο μέρος της προσπάθειάς του θα παραμένει στοχευμένο στην επίλυση του συγκεκριμένου προβλήματος, και όχι σε δευτερεύουσας σημασίας καλλωπιστικής φύσης θέματα, όπως είναι για παράδειγμα το γραφικό περιβάλλον του παιχνιδιού.
Το να "ζωγραφίσεις" για παράδειγμα το τραπέζι και τα τραπουλόχαρτα, και να τα παρουσιάζεις να μετακινούνται, όχι μόνο δεν έχει απολύτως καμία σχέση με τον πυρήνα του προβλήματος, αλλά απαιτεί να αποπροσανατολίσεις την προσπάθειά σου προς μια δευτερεύουσας σημασίας δραστηριότητα, καλλωπιστικής φύσης, η οποία όμως αποτελεί σχεδόν αυτόνομη ενότητα και πιθανότατα θα σου πάρει περισσότερο χρόνο να την υλοποιήσεις από ότι η ίδια η ουσία του παιχνιδιού.
Και κατά την προσωπική μου πάντα άποψη το χειρότερο που μπορεί να κάποιος μαθαίνοντας μια γλώσσα είναι να ξεκινάει πρώτα από τα... καλλωπιστικά. Στο τέλος καταλήγει να τα κάνει όλα έναν... αχταρμά στο κεφάλι του και είτε να τα παρατάει είτε το τελικό αποτέλεσμα να είναι ενδεχομένως όμορφο αλλά να σέρνεται, να σπαταλάει μνήμη, να είναι αχρείαστα πολύπλοκο στον κώδικά του (και άρα αχρείαστα πολύπλοκο στη συντήρηση ή στη βελτίωσή του) ή όλα μαζί

Χρειάζεται όρεξη, υπομονή, επιμονή και κυρίως προσήλωση και καλή διάθεση για να μάθει κανείς καλά μια γλώσσα, όποια κι αν είναι αυτή. Με συγγραφή απλών παραδειγμάτων σε κώδικα από τον ίδιο για οτιδήποτε δεν πολυ-καταλαβαίνει μέχρι να το καταλάβει, και σταδιακά αυξανόμενης δυσκολίας μικρο-projects στο τέλος κάθε ενότητας που μαθαίνει (τα καλά βιβλία συνήθως το περιλαμβάνουν αυτό).
In real life, η γλώσσα αυτή κάθε αυτή δεν είναι ποτέ αρκετή και πρέπει να συνοδεύεται κι από γνώσεις ανάλυσης αλγορίθμων, που προϋποθέτουν έτσι κι αλλιώς πολύ καλή γνώση στις δομές δεδομένων. Στα πολύ μεγάλα projects υπάρχουν διακριτές θέσεις για αυτές τις δουλειές, οι αναλυτές κάνουν την ανάλυση και οι προγραμματιστές την υλοποιούν (ίσως έχετε συναντήσει και τον όρο "code-monkeys" που χρησιμοποιείται υποτιμητικά για όσους οι γνώσεις τους εν πολλοίς εξαντλούνται στη σύνταξη της γλώσσας, ενδεχομένως και σε τετριμμένους αλγόριθμους που κατεβάζουν από το Internet).
Κατά κανόνα οι αναλυτές ξέρουν και να προγραμματίζουν σε τουλάχιστον μια γλώσσα, ενώ οι οι προγραμματιστές ξέρουν να προγραμματίζουν σε τουλάχιστον 2 ή 3 γλώσσες, αλλά η ικανότητα τους σε ανάλυση αλγορίθμων περιορίζεται στα απολύτως τετριμμένα.
Συνήθως οι αμιγώς προγραμματιστές είναι είτε αυτοδίδακτοι είτε απόφοιτοι μικρών σχολών, ενώ οι αναλυτές είναι απόφοιτοι πανεπιστημίων.
Προφανώς τα παραπάνω έχουν κάποιο νόημα για όσους ασχολούνται ή σκοπεύουν να ασχοληθούν σοβαρά κι επαγγελματικά με το... άθλημα, και όχι για χόμπι.
Όπως και να έχει, μου ήρθε τώρα στο μυαλό μια συζήτηση σε ένα άλλο φόρουμ, με θέμα "Προγραμματιστής & Πολυτεχνείο" όπου προς μεγάλη μου έκπληξη είδα πολλούς να υποστηρίζουν πως ούτε λίγο ούτε πολύ τα πτυχία είναι άχρηστα, αφού οτιδήποτε χρειαστεί κανείς μπορεί να το διαβάσει μόνος τους είτε σε βιβλία είτε στο Ιντερνετ !!!!!!!!!!!!!!!!!
Κι επειδή μεταξύ άλλων έχει σχέση και με τις λίστες που αναλύουμε σε αυτό το νήμα, κάνω quote την εξιστόρηση μιας (από τις πολλές) προσωπικής μου εμπειρίας με κάποιον αυτοδίδακτο...
έγραψε:
Υπήρχε λοιπόν μια απλά συνδεδεμένη λίστα η οποία έπρεπε να διατηρείται ταξινομημένη και η οποία ήταν και τεράστια και σε πλήθος κόμβων και σε όγκο του κάθε κόμβου.
Καταρχήν, ξέρεις γιατί είχε επιλεγεί αυτή η "για τα μπάζα" υλοποίηση; Γιατί ο ιδιοκτήτης είχε προσλάβει έναν αυτοδίδακτο για τη δουλειά, που του ζήτησε τα μισά χρήματα από τους πτυχιούχους.
Πάμε παρακάτω.
Ξέρεις τι έκανε ο code-monkey για κάθε νέο κόμβο που ήθελε να εισαγάγει στη λίστα; Τον έβαζε στην αρχή της λίστας και μετά έκανε.... bubble-sort !!!!!!!!!!!!!!!!!!
Με μετατροπή της λίστας από απλή σε διπλά συνδεδεμένη, με ένα δεύτερο μόνιμο δείκτη στο tail της (εκτός του head στην αρχή της δηλαδή) και με απευθείας ταξινομημένη εισαγωγή του κάθε νέου κόμβου στην σωστή θέση, ξεκινώντας είτε από το head είτε από το tail, ανάλογα με αν το key του νέου κόμβου ήταν μικρότερο ή μεγαλύτερο από το μισό του πλήθους της λίστας, ο μέσος όρος του χρόνου ταξινόμησης έπεσε στο 1/10.
Και με κώδικα που συμπεριλαμβανομένης της συνάρτησης μετατροπής από απλής σε διπλά συνδεδεμένης λίστας δεν με πήρε ούτε μισή ώρα για να τον γράψω.
Προφανώς του το έκανα τσάμπα και γιατί ήταν γνωστός και γιατί αυτά τα πράματα είναι απλή αλφάβητος για τους πτυχιούχους.
Το παράδειγμα (αν και τραβηγμένο, υπό την έννοια πως ο τύπος δεν ήταν απλώς code-monkey, μάλλον σκέτο monkey ήταν) δεν το έγραψα ούτε για να περιαυτολογήσω ούτε για να πουλήσω μούρη (άλλωστε είπαμε είναι απλά πράματα αυτά, συν ότι κι εγώ έχω κάνει άπειρες παπαριές κατά καιρούς).
Το έγραψα αφενός επειδή είναι πραγματικό και απλό στην κατανοήσή του, κι αφετέρου για να δώσω ακόμα μεγαλύτερη έμφαση στο επιχείρημα πως το συγκριτικό πλεονέκτημα ενός πτυχιούχου είναι τεράστιο. Από τα πιο απλά μέχρι τα πιο σύνθετα θέματα.
Πω, πω... πάλι ολόκληρη έκθεση έγραψα
