Uploaded avatar of xavdid

Σκέψεις για το #12in23 από κάποιον που το ολοκλήρωσε

@xavdid
πριν από Πάνω από 2 χρόνια

Αυτή η ανάρτηση εμφανίστηκε αρχικά στον ιστότοπο του David και αναδημοσιεύεται εδώ με άδεια

Τον περασμένο Ιανουάριο, το Exercism ανακοίνωσε ένα νέο πρόγραμμα με το όνομα 12in23, με το οποίο προκαλούσε τους συμμετέχοντες να δοκιμάσουν 12 νέες γλώσσες προγραμματισμού μέσα στο 2023. Κάθε μήνας θα είχε το δικό του θέμα (όπως "Analytical April" ή "Object Oriented October") και θα αναδείκνυε συγκεκριμένες γλώσσες για δοκιμή. Λατρεύω να μαθαίνω καινούργια πράγματα και έχω γίνει λίγο σπασίκλας με τις γλώσσες (προγραμματισμού), οπότε αποφάσισα να το δοκιμάσω. 12 γλώσσες, 12 μήνες!

Τώρα που η χρονιά κοντεύει να τελειώσει, είμαι πάρα πολύ ευχαριστημένος με το πώς πήγε το εγχείρημα. Δοκίμασα με επιτυχία 12 νέες γλώσσες, γνώρισα υπέροχους ανθρώπους στην κοινότητα του Exercism και έβγαλα στην πορεία μερικές ωραίες συνεισφορές ανοιχτού κώδικα! Σε αυτή την ανάρτηση, τις περνάω όλες μία μία και μιλάω για το τι αποκόμισα από την καθεμία.

Επιλέγοντας γλώσσες

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

  1. Οι γλώσσες θα έπρεπε είτε να είναι εντελώς καινούργιες για μένα είτε τουλάχιστον αρκετά άγνωστες ώστε να νιώθω ότι μαθαίνω πολλά.
  2. Οι γλώσσες που θα διάλεγα θα έπρεπε να είναι (δυνητικά) πρακτικές, ώστε να συνεχίσω να τις μαθαίνω στο μέλλον. Αυτό το εγχείρημα ήταν απλώς για διασκέδαση, αλλά θέλω ο χρόνος μου να πηγαίνει στη μάθηση (τουλάχιστον εν μέρει) χρήσιμων πραγμάτων.
  3. Θα εγκαθιστούσα όλα τα τοπικά εργαλεία και το plugin για το VSCode για κάθε γλώσσα που χρησιμοποιούσα. Ήθελα να συγκρίνω τις γλώσσες σε περίπου ίση βάση, με όσο το δυνατόν περισσότερες υποδείξεις τύπων και intellisense. Στο πανεπιστήμιο έκανα όλες τις εργασίες προγραμματισμού μου στο Sublime Text, χωρίς κανένα linting ή αυτόματη συμπλήρωση. Ανησυχούσα ότι αν μάθαινα να προγραμματίζω χρησιμοποιώντας όλα αυτά τα εργαλεία, θα βασιζόμουν υπερβολικά σε αυτά και δεν θα γινόμουν καλός προγραμματιστής. Αντ' αυτού, συνέβη το αντίθετο. Όσο περισσότερη σκέψη μπορώ να μεταθέσω στα εργαλεία μου, τόσο περισσότερο μπορώ να σκεφτώ το πραγματικό πρόβλημα που έχω μπροστά μου. Μην θυμάσαι πράγματα, θυμήσου πώς να τα βρίσκεις.

Ας ξεκινήσουμε!

Ιανουάριος (χωρίς θέμα)

Όταν ξεκίνησε ο Ιανουάριος, η ομάδα του Exercism ήταν ακόμα στη διαδικασία επιλογής των μηνιαίων θεμάτων, οπότε η γλώσσα εκείνου του μήνα ήταν ελεύθερη επιλογή. Χωρίς κατεύθυνση, ξεκίνησα τη χρονιά με τη Go. Είχα κάνει ένα εντατικό μάθημα στη γλώσσα στα μέσα του 2022, αλλά δεν την είχα χρησιμοποιήσει πολύ από τότε και δεν ένιωθα καθόλου σίγουρος.

Η Go είναι μια ενδιαφέρουσα γλώσσα. Ο αυστηρός μεταγλωττιστής της σημαίνει ότι το Πρόγραμμά Σου Θα Είναι Σωστό και δεν κουνιέσαι ούτε εκατοστό μέχρι να κρίνει ότι είναι ασφαλές να το κάνεις.1 Ο πολύλογος τρόπος της να χειρίζεται τα σφάλματα σημαίνει ότι δεν ξαφνιάζεσαι ποτέ (με το τίμημα να γράφεις if err != nil { return err } πάρα, πάρα πολλές φορές). Τα καταφέρνει καλά στο να κάνει τα δύσκολα εύκολα (όπως τον παραλληλισμό μέσω channels) αλλά κάνει και κάποια εύκολα δύσκολα (τον χειρισμό συμβολοσειρών). Έχει μια ισχυρή βασική βιβλιοθήκη, που σημαίνει ότι μπορείς να ολοκληρώσεις τις περισσότερες εργασίες χωρίς modules τρίτων. Μου αρέσει πόσο μεγάλο μέρος του οικοσυστήματος (μορφοποίηση, εγκατάσταση, χτίσιμο κ.λπ.) είναι πρώτου κατασκευαστή και ενσωματωμένο στην εντολή go. Η γλώσσα έχει τους επικριτές της, αλλά νομίζω ότι πετυχαίνει σε μεγάλο βαθμό τους στόχους της: ορθότητα και συντηρησιμότητα.

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

Functional February

Ο Φεβρουάριος μπήκε κατευθείαν στα βαθιά με τις συναρτησιακές γλώσσες, ένα κατά κάποιον τρόπο μαθηματικό παρακλάδι των πιο συνηθισμένων προστακτικών γλωσσών προγραμματισμού. Οι συναρτησιακές γλώσσες είναι γνωστές για τις "καθαρές" συναρτήσεις τους (χωρίς παρενέργειες). Διάλεξα την Elixir, κυρίως επειδή ο φίλος μου ο Caleb τη χρησιμοποιεί για το Advent of Code και μιλάει με τα καλύτερα λόγια γι' αυτήν.

Απόλαυσα αρκετά τον χρόνο μου με την Elixir. Είναι εμπνευσμένη από τη Ruby (που βγάζει νόημα· ο δημιουργός της, ο José Valim, ήταν βασικός συνεισφέρων στο Rails). Βρήκα απλό να εκφράζω συναρτησιακές έννοιες όπως η αλυσίδωση μεθόδων. Μου άρεσε όλη η συντακτική ζάχαρη που το έκανε εύκολο, όπως ο τελεστής pipe (|>):

foo(bar(baz(new_function(other_function()))))
# becomes
other_function() |> new_function() |> baz() |> bar() |> foo()

Ήταν επίσης η πρώτη μου φορά που δούλεψα με macros, δηλαδή κώδικα που γράφει κώδικα. Επειδή τα προγράμματα Elixir μπορούν να εκφραστούν σε ένα AST που είναι το ίδιο έγκυρος κώδικας Elixir, είναι εύκολο να γράψεις κώδικα που παράγει άλλον έγκυρο κώδικα. Είναι μια πολύ ωραία έννοια που η Elixir την έκανε εύκολη. Μου άρεσε επίσης ο τρόπος που οι συναρτήσεις μπορούσαν να ταιριάξουν μοτίβα με βάση το σχήμα των ορισμάτων τους, ώστε οι κλήσεις συναρτήσεων να δρομολογούνται στην κατάλληλη υλοποίηση:

defmodule TuplePrinter do
  def print({a}) do
	IO.puts("single")
	IO.puts(a)
  end

  def print({a, b}) do
	IO.puts("double")
	IO.puts(a)
	IO.puts(b)
  end
end

TuplePrinter.print({1})
TuplePrinter.print({2, 2})

# single
# 1
# double
# 2
# 2

Φαίνεται σαν το είδος χαρακτηριστικού που είτε είναι φοβερό είτε κάνει τον κώδικά σου ένα κουβάρι. Όπως και να 'χει, ήταν μια ωραία έννοια!

Η Elixir επωφελείται επίσης από το ότι τρέχει μέσα στην εικονική μηχανή BEAM της Erlang, που της δίνει ένα μεγάλο οικοσύστημα με το οποίο να επικοινωνεί. Τα καταφέρνει εξαιρετικά στον παραλληλισμό και αποτελεί τον πυρήνα του αγαπημένου Phoenix web framework.

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

Mechanical March

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

Από τις επιλογές, η Go ήταν η μόνη γλώσσα που με ενδιέφερε.2 Τώρα, οι παρατηρητικοί αναγνώστες θα προσέξουν ότι είχα ήδη κάνει έναν μήνα με Go, οπότε η επανάληψή της δεν θα μετρούσε στις 12. Λοιπόν, όταν τη διάλεξα για τον Ιανουάριο, δεν είχαν ανακοινώσει ακόμα ότι θα έβαζαν θέματα, οπότε δεν είχα καταλάβει ότι έβαζα τον εαυτό μου σε αδιέξοδο.

Αν ήξερα ότι ερχόταν το Bun, πιθανότατα θα είχα δοκιμάσει τη Zig, αλλά δυστυχώς δεν μπορούσα (ακόμα) να δω το μέλλον. Έτσι, ελλείψει πιο πειστικής επιλογής, πήγα με έναν επιπλέον μήνα Go, με τη λογική ότι θα έπρεπε να το αναπληρώσω κάποια στιγμή αργότερα μέσα στη χρονιά.

Analytical April

Ο Απρίλιος ήταν αφιερωμένος σε γλώσσες δημοφιλείς στην επιστήμη δεδομένων. Τη Python την ήξερα πολύ καλά και τη R την είχα κάνει σε ένα μάθημα στατιστικής στο πανεπιστήμιο (και δεν μου άρεσε), οπότε πάμε για Julia!

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

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

Σε τελική ανάλυση, η Julia ήταν συμπαθητική, αλλά δεν περιμένω να τη χρειαστώ στο μέλλον.

Mindshifting May

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

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

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

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

Summer of Sexps (June)

Ο Ιούνιος ήταν ο μήνας των S-expressions, μιας κοινής συντακτικής μορφής στις Lisp. Διάλεξα την Clojure, μια συναρτησιακή γλώσσα που τρέχει στη JVM.

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

Με χαρά αναφέρω ότι ήταν! Η συναρτησιακή εμπειρία του Φεβρουαρίου με βοήθησε να σκέφτομαι αναδρομικά και η σύνταξη δεν ήταν και τόσο κακή όταν το έπιασες. Η διαλειτουργικότητά της με τη JVM θα ήταν επίσης χρήσιμη αν τη χρησιμοποιούσα σε ένα μεγαλύτερο project.

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

Παράπλευρη αποστολή: το Universal Test Runner!

Επί χρόνια χρησιμοποιώ μια μικρή συνάρτηση bash για να τρέχω τις δοκιμές μονάδας στον τρέχοντα κατάλογό μου. Καθώς δούλευα με όλες αυτές τις νέες γλώσσες, έπιασα τον εαυτό μου να της προσθέτει γραμμές για ευκολία· το να θυμάμαι να τρέχω το t ήταν πολύ πιο εύκολο από το να ξαναμαθαίνω ξανά και ξανά την εντολή δοκιμών κάθε γλώσσας.

Καθώς η λογική που απαιτούνταν ξεπερνούσε το επίπεδο άνεσής μου με τη bash, αφιέρωσα λίγο χρόνο τον Ιούνιο και αποσπάσα το project σε κάτι αυτόνομο: το Universal Test Runner.

Το μοιράστηκα στο φόρουμ του Exercism και είχε ωραία υποδοχή. Τους άρεσε τόσο πολύ που αποφασίσαμε να ενσωματώσουμε παρόμοια λειτουργικότητα στο ίδιο το CLI του Exercism (που είναι γραμμένο σε Go, ένα θέμα που είχα προλάβει τυχερός να φρεσκάρω). Έτσι, για το δεύτερο μισό της χρονιάς, μπορούσα να τρέξω το exercism test για να τρέξω τη σουίτα δοκιμών της γλώσσας εκείνου του μήνα (μια εντολή που υποστηρίζεται εγγενώς στο Universal Test Runner).

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

Τέλος πάντων, προχωράμε!

Jurassic July

Ο Ιούλιος ανέδειξε παλιές γλώσσες. Οι επιλογές αυτόν τον μήνα ήταν αρκετά φτωχές από άποψη πρακτικότητας. Ξεκίνησα με την αξιοσέβαστη COBOL, καθώς άκουσα ότι ακόμα τρέχει πολλές κρίσιμες υποδομές. Αλλά, με έναν γάμο στις αρχές Αυγούστου να πλησιάζει, δεν είχα το περιθώριο να κάτσω να μάθω μια τόσο διαφορετική για μένα γλώσσα. Έτσι, αντ' αυτού, άλλαξα σε Visual Basic ως τη λιγότερο κακή επιλογή.

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

Appy August

Ο Αύγουστος ήταν γεμάτος γλώσσες για την κατασκευή εφαρμογών. Όπως ήταν αναμενόμενο, οι επιλογές αυτόν τον μήνα ήταν πολλές. Πήγα με τη Swift. Ως άνθρωπος που χρησιμοποιεί πολλά προϊόντα Apple, η δική τους γλώσσα, φτιαγμένη ειδικά γι' αυτά, μου είναι αρκετά σχετική. Δεν ήμουν εντελώς άσχετος, είχα δημοσιεύσει μία εφαρμογή για iOS το 2016, γραμμένη αποκλειστικά σε Swift. Αλλά δεν είχα αγγίξει τη γλώσσα από τότε και έχει εξελιχθεί πολύ, οπότε σκέφτηκα ότι μετρούσε ακόμα.

Ευχάριστα εξεπλάγην με το πόσο εύκολη ήταν στη δουλειά. Σε αντίθεση με πολλές από τις άλλες γλώσσες εδώ, η Swift είναι αρκετά νέα. Κυκλοφόρησε για πρώτη φορά το 2014 και έχει σαφώς ωφεληθεί από τα μαθήματα του σύγχρονου σχεδιασμού γλωσσών. Έχει διαχειριστή πακέτων πρώτου κατασκευαστή, optional chaining, first-class functions και λογική παρεμβολή συμβολοσειρών. Ήταν εργονομική στην ανάγνωση και τη γραφή, ακόμα και χωρίς το Xcode.

Παρ' όλα αυτά, η Swift είναι κυρίως χρήσιμη στο πλαίσιο εφαρμογών για πλατφόρμες Apple, τις οποίες δεν γράφω αυτή τη στιγμή. Αν και λειτούργησε καλά για τις ασκήσεις, δεν περιμένω να επιστρέψω σύντομα σε αυτήν. Μου αρέσει πάντως που μπορώ να τη γράφω στο iPad μου!

Slimline September

Ο Σεπτέμβριος εξερεύνησε πολύ συνοπτικές ή μικρές γλώσσες. Πήγα με το jq, ένα εργαλείο που χρησιμοποιώ και αγαπώ εδώ και χρόνια.

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

# input: { "series": "1", "sliceLength": 1 }
. as {series: $series, sliceLength: $sliceLength} |
if
  $series == "" then
	"series cannot be empty" | halt_error
  elif $sliceLength > ($series | length) then
	"slice length cannot be greater than series length" | halt_error
  elif $sliceLength == 0 then
	"slice length cannot be zero" | halt_error
  elif $sliceLength < 0 then
	"slice length cannot be negative" | halt_error
  else
	.
end
| [range(0; $series | length)]
| map($series[. : . + $sliceLength])
| map(select(. | length == $sliceLength))

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

edit: Ο DJ Adams στο Mastodon μου επισήμανε το project jq-lsp και το αντίστοιχο plugin του για το VSCode. Το έχασα αυτή τη φορά, αλλά θα το τσεκάρω στο μέλλον.

Object Oriented October

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

Δουλεύω στη Stripe, όπου βρίσκεται η μεγαλύτερη βάση κώδικα Ruby στον κόσμο. Σίγουρα δεν θα μετρούσε ως "άγνωστη" γλώσσα; Αν και όλα αυτά είναι αλήθεια, ο μονόλιθός μας σε Ruby μοιάζει πολύ απομακρυσμένος από τη "στάνταρ" Ruby. Όλα ελέγχονται ως προς τους τύπους με το Sorbet, γίνεται πάρα πολλή παραγωγή κώδικα και κάνουμε πολλά μαγικά για να δουλεύουν όλα μαζί και να κλιμακώνονται. Αν και η Ruby μέσα και έξω από τη Stripe είναι τελικά η ίδια γλώσσα, η δουλειά σε τόσο διαφορετικές κλίμακες δίνει εντελώς διαφορετικές εμπειρίες· ήθελα να μάθω πώς ήταν η ζωή έξω (στα χρόνια από τότε που χρησιμοποιούσα εντατικά τη Ruby).

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

Παρ' όλα αυτά, εξεπλάγην με το πόσο πίσω από την Python ήταν τα εργαλεία προγραμματισμού. Ίσως έχω κακομάθει, αλλά το να έχω υποδείξεις τύπων μέσα στον editor και εξαιρετικά γρήγορο linting και μορφοποίηση είναι πιο σημαντικό για μένα απ' όσο νόμιζα. Για μια γλώσσα τόσο δημοφιλή όσο ήταν η Ruby στην ακμή της, εξεπλάγην με το πόσο πίσω ένιωθε σε αυτόν τον τομέα.3 Επίσης, δεν συνήθισα ποτέ απόλυτα τις προαιρετικές παρενθέσεις στις κλήσεις συναρτήσεων, που έκαναν το πέρασμα συναρτήσεων ως ορίσματα λιγότερο απλό.

Η Ruby παραμένει εξαιρετική γλώσσα και θα συνεχίσω να τη χρησιμοποιώ στη δουλειά, αλλά δεν κάνει τίποτα για μένα που δεν κάνει η Python, τουλάχιστον αυτή τη στιγμή.

Nibbly November

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

Ένιωσα απροσδόκητα καλά προετοιμασμένος για αυτόν τον μήνα. Η σύνταξη έμοιαζε με της Clojure και η δομή της γλώσσας με το TIS-100 της Zachtronics. Παραδόξως απόλαυσα το ότι έπρεπε να ξεκινάω από το μηδέν για κάθε πράξη· μου φάνηκε γραφικό. Θα το μισούσα αν έπρεπε να βγάλω πραγματικά δουλειά με αυτόν τον τρόπο, αλλά στο μεταξύ ήταν μια διασκεδαστική ιδιορρυθμία. Με γενναιόδωρα σχόλια, κατάφερα να γράψω κάτι σχεδόν ευανάγνωστο:

(module
  (func (export "eggCount") (param $number i32) (result i32)
	(local $res i32) ;; result
	(local $remainder i32) ;; loop counter

	(loop $loop

  	;; $res =
  	(local.set $res
    	;; $res +
    	(i32.add
      	(local.get $res)
      	;; $number % 2
      	(i32.rem_u
        	(local.get $number)
        	(i32.const 2)
      	)
    	)
  	)

  	;; $number //= 2
  	;; (keep on stack)
  	(local.tee $number
    	(i32.div_u
      	(local.get $number)
      	(i32.const 2)
    	)
  	)

  	;; this will keep looping until remainder is 0
  	br_if $loop
	)

	local.get $res
  )
)

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

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

Ξεκίνησα με τη Wren. Δημιουργήθηκε από τον Bob Nystrom, γνωστό, μεταξύ άλλων, για το Crafting Interpreters. Με γοήτευσε η προσοχή στη λεπτομέρεια, το μικρό της αποτύπωμα και ο σχεδιασμός από πάνω προς τα κάτω· όλα φαίνονται πολύ καλά μελετημένα. Αυτό το επίπεδο φροντίδας φαίνεται στις λεπτομέρειες της εμβέλειας των μεταβλητών και των κανόνων ιδιωτικότητας. Ο μεταγλωττιστής της είναι μικρός και με πλούσια σχόλια, οπότε είναι εξαιρετικός πόρος μάθησης αν σου αρέσουν οι υλοποιήσεις γλωσσών.

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

Επίσης: Lua

Η δεύτερη επιλογή μου αυτόν τον μήνα ήταν η Lua. Σε αντίθεση με τη Wren, είναι απίστευτα πρακτική. Η εύκολη ενσωμάτωσή της σημαίνει ότι εμφανίζεται σε πολλά μέρη, όπως το scripting στο Redis και τα mods του Factorio. Το μοντέλο αντικειμένων χρειάστηκε λίγο χρόνο για να το συνηθίσω, αλλά βλέπω ότι θα ήμουν γρήγορα παραγωγικός. Ζεστάθηκα γρήγορα με τους πίνακες ως δομή για τα πάντα. Τα εργαλεία ήταν καλά: ο διαχειριστής πακέτων δούλευε από την αρχή και η επέκταση για το VSCode υποστήριζε σχολιασμούς τύπων χωρίς φασαρία.

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

Συνοψίζοντας

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

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

Δεν έχω κάποιο συγκεκριμένο παραδοτέο στο μυαλό μου, αλλά έχω όλο το βιβλίο της Rust να διαβάσω, ένα μάθημα Rust για προγραμματιστές JavaScript που είχα περάσει στα έξοδα μια χρονιά και μια ολόκληρη διαδρομή στο Exercism να ολοκληρώσω. Θα ήθελα να συνεισφέρω σε τουλάχιστον ένα project ανοιχτού κώδικα (μάλλον στο Just, ένα νέο αγαπημένο μου πρόγραμμα), αλλά θα δούμε πού θα με πάει η χρονιά.

Μέχρι τότε, καλές γιορτές και να έχεις ένα καλό υπόλοιπο του 2023!

  1. Οι αχρησιμοποίητες μεταβλητές είναι σφάλμα μεταγλωττιστή;; Έλα τώρα ↩

  2. Στην πραγματικότητα δοκίμασα πρώτα τη C++ (που δεν την είχα γράψει από το πανεπιστήμιο). Απλώς δεν ήταν διασκεδαστική, οπότε την παράτησα ↩

  3. Αυτός είναι ένας ακόμα τρόπος που η "πραγματική" Ruby διαφέρει από την εμπειρία μου στη Stripe, οπότε χαίρομαι που κατάφερα να τη δοκιμάσω και με τους δύο τρόπους ↩

Translation missing: el.number.nth.ordinalized Jan 2024 · Σου φάνηκε χρήσιμο;