Γλώσσες προγραμματισμού
Περιεχόμενα:
Περίληψη
Ζήτημα
Πρέπει να επιλέξουμε γλώσσες προγραμματισμού για το λογισμικό μας. Έχουμε δύο βασικές ανάγκες: μια γλώσσα προγραμματισμού front-end κατάλληλη για εφαρμογές ιστού και μια γλώσσα προγραμματισμού back-end κατάλληλη για εφαρμογές διακομιστή.
Απόφαση
Επιλέγουμε TypeScript για το front-end.
Επιλέγουμε Rust για το back-end.
Κατάσταση
Αποφασίστηκε. Είμαστε ανοικτοί σε νέες εναλλακτικές όταν προκύπτουν.
Λεπτομέρειες
Παραδοχές
Οι εφαρμογές front-end είναι τυπικές:
Τυπικοί χρήστες και αλληλεπιδράσεις
Τυπικά προγράμματα περιήγησης και συστήματα
Τυπικές αναπτύξεις και διανομές
Οι εφαρμογές front-end είναι πιθανό να εξελίσσονται γρήγορα:
Θέλουμε να διασφαλίσουμε γρήγορες εύκολες αναπτύξεις, διανομές, επαναλήψεις κ.λπ.
Εκτιμούμε την αποδεικτικότητα, όπως η ασφάλεια τύπων, και δεχόμαστε να κάνουμε λίγη περισσότερη δουλειά για να την πετύχουμε.
Δεν χρειαζόμαστε συμβατότητα με παλαιότερα συστήματα.
Οι εφαρμογές back-end έχουν υψηλότερες από τις τυπικές απαιτήσεις:
Υψηλότεροι από τους τυπικούς στόχοι ποιότητας, ειδικά αποδεικτικότητα, αξιοπιστία, ασφάλεια κ.λπ.
Υψηλότεροι από τους τυπικούς στόχοι για σχεδόν πραγματικό χρόνο, δηλαδή δεν θέλουμε παύσεις λόγω συλλογής απορριμμάτων της εικονικής μηχανής.
Υψηλότεροι από τους τυπικούς στόχοι για συναρτησιακό προγραμματισμό, ειδικά για παραλληλοποίηση, επεξεργασία πολλαπλών πυρήνων και ασφάλεια μνήμης.
Δεχόμαστε χαμηλότερες ταχύτητες μεταγλώττισης υπέρ της ασφάλειας κατά τη μεταγλώττιση και των ταχυτήτων εκτέλεσης.
Περιορισμοί
Έχουμε ισχυρό περιορισμό στις γλώσσες που μπορούν να χρησιμοποιηθούν με τις υπηρεσίες συναρτήσεων των μεγάλων παρόχων cloud, όπως το Amazon Lambda.
Θέσεις
Εξετάσαμε αυτές τις γλώσσες:
C
C++
Clojure
Elixir
Erlang
Elm
Flow
Go
Haskell
Java
JavaScript
Kotlin
Python
Ruby
Rust
TypeScript
Επιχείρημα
Περίληψη ανά γλώσσα:
C: απορρίφθηκε λόγω χαμηλής ασφάλειας· η Rust μπορεί να κάνει σχεδόν τα πάντα καλύτερα.
C++: απορρίφθηκε επειδή είναι χάος· η Rust μπορεί να κάνει σχεδόν τα πάντα καλύτερα.
Clojure: εξαιρετική μοντελοποίηση· η καλύτερη προσέγγιση Lisp· εξαιρετικό περιβάλλον εκτέλεσης στη JVM.
Elixir: εξαιρετικό περιβάλλον εκτέλεσης συμπεριλαμβανομένης της διανεμησιμότητας και του ταυτοχρονισμού· εξαιρετική εμπειρία προγραμματιστή· σχετικά μικρό οικοσύστημα.
Erlang: εξαιρετικό περιβάλλον εκτέλεσης συμπεριλαμβανομένης της διανεμησιμότητας και του ταυτοχρονισμού· απαιτητική εμπειρία προγραμματιστή· σχετικά μικρό οικοσύστημα.
Elm: φαίνεται πολλά υποσχόμενη· η IBM δημοσιεύει σημαντικές μελέτες περίπτωσης με καλά αποτελέσματα· μικρότερο οικοσύστημα.
Flow: ενδιαφέρουσα βελτίωση σε σχέση με τη JavaScript· ωστόσο, οι προγραμματιστές απομακρύνονται από αυτήν.
Go: εξαιρετική εμπειρία προγραμματιστή· εξαιρετικός ταυτοχρονισμός· αλλά ιστορικό κακών αποφάσεων που αχρηστεύουν τη γλώσσα.
Haskell: η καλύτερη συναρτησιακή γλώσσα· μικρότερη κοινότητα προγραμματιστών· δεν έχει πετύχει αρκετές δημοσιευμένες επιτυχίες σε παραγωγή.
Java: εξαιρετικό περιβάλλον εκτέλεσης· εξαιρετικό οικοσύστημα· μέτρια εμπειρία προγραμματιστή.
JavaScript: η δημοφιλέστερη γλώσσα όλων των εποχών· το πιο διαδεδομένο οικοσύστημα.
Kotlin: διορθώνει τόσα πολλά της Java· εξαιρετική υποστήριξη από την JetBrains· καλές δημοσιευμένες περιπτώσεις μεταφοράς από Java σε Kotlin.
Python: η δημοφιλέστερη γλώσσα για διαχείριση συστημάτων· εξαιρετικά εργαλεία ανάλυσης· καλά πλαίσια ιστού· αλλά εγκαταλείφθηκε από την Google υπέρ της Go.
Ruby: η καλύτερη εμπειρία προγραμματιστή όλων των εποχών· τα καλύτερα πλαίσια ιστού· η πιο ευχάριστη κοινότητα· αλλά πολύ αργή· κάπως δύσκολη στην πακετοποίηση.
Rust: η καλύτερη νέα γλώσσα· έμφαση στη μηδενική αφαίρεση· έμφαση στον ταυτοχρονισμό· ωστόσο σχετικά μικρό οικοσύστημα· και έχει σκόπιμους περιορισμούς σε ορισμένα είδη επιταχύνσεων μεταγλωττιστή, π.χ. η άμεση πρόσβαση στη μνήμη πρέπει να είναι ρητά μη ασφαλής (unsafe).
TypeScript: προσθέτει τύπους στη JavaScript· εξαιρετικός μεταγλωττιστής-μεταφραστής (transpiler)· αυξανόμενη έμφαση των προγραμματιστών στη μεταφορά από JavaScript σε TypeScript· ισχυρή υποστήριξη από τη Microsoft.
Αποφασίσαμε ότι οι εικονικές μηχανές (VM) έχουν ένα σύνολο συμβιβασμών που δεν χρειαζόμαστε αυτή τη στιγμή, όπως επιπλέον πολυπλοκότητα που παρέχει δυνατότητες χρόνου εκτέλεσης.
Πιστεύουμε ότι η βασική μας απόφαση καθοδηγείται από δύο διαπλέκοντα ζητήματα:
Για την ταχύτερη ταχύτητα εκτέλεσης και την πιο στενή πρόσβαση στο σύστημα, θα επιλέγαμε JavaScript και C.
Για σχεδόν την ταχύτερη ταχύτητα εκτέλεσης και σχεδόν την πιο στενή πρόσβαση στο σύστημα, επιλέγουμε TypeScript και Rust.
Τιμητικές αναφορές πηγαίνουν στις γλώσσες VM και τα πλαίσια ιστού που θα επιλέγαμε αν θέλαμε γλώσσα VM:
Clojure και Luminus
Java και Spring
Elixir και Phoenix
Επιπτώσεις
Οι προγραμματιστές front-end θα χρειαστεί να μάθουν TypeScript. Αυτή είναι πιθανώς εύκολη καμπύλη εκμάθησης αν η κύρια εμπειρία του προγραμματιστή είναι η JavaScript.
Οι προγραμματιστές back-end θα χρειαστεί να μάθουν Rust. Αυτή είναι πιθανώς μέτρια καμπύλη εκμάθησης αν η κύρια εμπειρία του προγραμματιστή είναι η C/C++, και δύσκολη καμπύλη εκμάθησης αν η κύρια εμπειρία του προγραμματιστή είναι η Java, η Python, η Ruby ή παρόμοιες γλώσσες με διαχειριζόμενη μνήμη.
Η TypeScript και η Rust είναι και οι δύο σχετικά νέες. Αυτό σημαίνει ότι πολλά εργαλεία δεν έχουν ακόμη τεκμηρίωση για αυτές τις γλώσσες. Για παράδειγμα, η ροή devops θα πρέπει να στηθεί για αυτές τις γλώσσες και μέχρι στιγμής κανένα από τα εργαλεία devops που αξιολογούμε δεν έχει προεπιλεγμένα παραδείγματα για αυτές τις γλώσσες.
Οι χρόνοι μεταγλώττισης για TypeScript και Rust είναι αρκετά αργοί. Μέρος αυτού μπορεί να οφείλεται στη νεότητα των γλωσσών. Ίσως θέλουμε να δούμε πώς θα μετριάσουμε τους αργούς χρόνους μεταγλώττισης, π.χ. με μεταγλώττιση κατά απαίτηση, ταυτοχρονισμό μεταγλώττισης κ.λπ.
Η υποστήριξη IDE για αυτές τις γλώσσες δεν είναι ακόμη πανταχού παρούσα και δεν είναι ακόμη πρώτης κατηγορίας. Για παράδειγμα, η JetBrains πουλά το IDE PyCharm για πρώτης κατηγορίας υποστήριξη της Python, αλλά δεν πουλά IDE με πρώτης κατηγορίας υποστήριξη για Rust· αντ' αυτού, η JetBrains μπορεί να χρησιμοποιήσει ένα πρόσθετο Rust που παρέχει ίσως 80% της υποστήριξης της γλώσσας Rust σε σχέση με την υποστήριξη της γλώσσας Python.
Σχετικά
Σχετικές αποφάσεις
Θα στοχεύσουμε σε επιλογές οικοσυστήματος που ευθυγραμμίζονται με αυτές τις γλώσσες.
Για παράδειγμα, θέλουμε να επιλέξουμε ένα IDE που έχει καλές δυνατότητες για αυτές τις γλώσσες.
Για παράδειγμα, για το πλαίσιο ιστού front-end, είναι πιο πιθανό να αποφασίσουμε για ένα πλαίσιο που τείνει προς την TypeScript (π.χ. Vue) παρά για ένα πλαίσιο που τείνει προς καθαρή JavaScript (π.χ. React).
Σχετικές απαιτήσεις
Ολόκληρη η αλυσίδα εργαλείων μας πρέπει να υποστηρίζει αυτές τις γλώσσες.
Σχετικά τεχνουργήματα
Αναμένουμε ότι ενδέχεται να εξάγουμε ορισμένα μυστικά σε μεταβλητές περιβάλλοντος.
Σχετικές αρχές
Μέτρα δύο φορές, χτίσε μία. Δίνουμε προτεραιότητα σε κάποια ασφάλεια έναντι κάποιας ταχύτητας.
Ο χρόνος εκτέλεσης είναι πιο πολύτιμος από τον χρόνο μεταγλώττισης. Δίνουμε προτεραιότητα στη χρήση από τους πελάτες έναντι της χρήσης από τους προγραμματιστές.
Σημειώσεις
Οποιεσδήποτε σημειώσεις εδώ.