Γιατί το Go είναι κακό για μη έξυπνους προγραμματιστές

Το άρθρο γράφτηκε ως απάντηση σε ένα προηγουμένως δημοσιευμένο αντιπόδιο άρθρο.

Γιατί το Go είναι κακό για μη έξυπνους προγραμματιστές

Τα τελευταία δύο και πλέον χρόνια χρησιμοποιώ το Go για να υλοποιήσω έναν εξειδικευμένο διακομιστή RADIUS με ανεπτυγμένο σύστημα χρέωσης. Στην πορεία, μαθαίνω τις περιπλοκές της ίδιας της γλώσσας. Τα ίδια τα προγράμματα είναι πολύ απλά και δεν είναι ο σκοπός αυτού του άρθρου, αλλά η ίδια η εμπειρία χρήσης του Go αξίζει λίγα λόγια για την υπεράσπισή του. Η Go γίνεται μια ολοένα και πιο mainstream γλώσσα για σοβαρό, επεκτάσιμο κώδικα. Η γλώσσα δημιουργήθηκε από την Google, όπου χρησιμοποιείται ενεργά. Συμπέρασμα, ειλικρινά πιστεύω ότι ο σχεδιασμός της γλώσσας Go είναι κακός για μη ευφυείς προγραμματιστές.

Σχεδιασμένο για αδύναμους προγραμματιστές;

Οι αδύναμοι μιλούν για προβλήματα. Οι δυνατοί μιλούν για ιδέες και όνειρα...

Το Go είναι πολύ εύκολο στην εκμάθηση, τόσο εύκολο που μπορείτε να διαβάσετε τον κώδικα χωρίς σχεδόν καθόλου εκπαίδευση. Αυτό το χαρακτηριστικό της γλώσσας χρησιμοποιείται σε πολλές παγκόσμιες εταιρείες όταν ο κώδικας διαβάζεται μαζί με μη βασικούς ειδικούς (διευθυντές, πελάτες κ.λπ.). Αυτό είναι πολύ βολικό για μεθοδολογίες όπως το Design Driven Development.
Ακόμη και οι αρχάριοι προγραμματιστές αρχίζουν να παράγουν αρκετά αξιοπρεπή κώδικα μετά από μια ή δύο εβδομάδες. Το βιβλίο από το οποίο μελέτησα είναι το «Go Programming» (του Mark Summerfield). Το βιβλίο είναι πολύ καλό, αγγίζει πολλές αποχρώσεις της γλώσσας. Μετά από αδικαιολόγητα περίπλοκες γλώσσες όπως Java, PHP, η έλλειψη μαγείας είναι αναζωογονητική. Αλλά αργά ή γρήγορα, πολλοί περιορισμένοι προγραμματιστές έχουν την ιδέα να χρησιμοποιήσουν παλιές μεθόδους σε ένα νέο πεδίο. Είναι πραγματικά απαραίτητο αυτό;

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

Γιατί λοιπόν έγινε τόσο απλό; Ακολουθούν μερικά αποσπάσματα από τον Rob Pike:

Το βασικό σημείο εδώ είναι ότι οι προγραμματιστές μας δεν είναι ερευνητές. Είναι, κατά κανόνα, αρκετά νέοι, έρχονται σε εμάς μετά τη μελέτη, ίσως σπούδασαν Java, ή C/C++, ή Python. Δεν μπορούν να καταλάβουν μια εξαιρετική γλώσσα, αλλά ταυτόχρονα θέλουμε να δημιουργήσουν καλό λογισμικό. Αυτός είναι ο λόγος για τον οποίο η γλώσσα πρέπει να είναι εύκολη στην κατανόηση και την εκμάθηση.

Θα πρέπει να είναι εξοικειωμένος, χοντρικά παρόμοιος με τον C. Οι προγραμματιστές που εργάζονται στην Google ξεκινούν τη σταδιοδρομία τους νωρίς και είναι κυρίως εξοικειωμένοι με τις διαδικαστικές γλώσσες, ιδιαίτερα την οικογένεια C. Η απαίτηση για γρήγορη παραγωγικότητα σε μια νέα γλώσσα προγραμματισμού σημαίνει ότι η γλώσσα δεν πρέπει να είναι πολύ ριζοσπαστική.

Σοφά λόγια, έτσι δεν είναι;

Τεχνουργήματα της Απλότητας

Η απλότητα είναι απαραίτητη προϋπόθεση για την ομορφιά. Λεβ Τολστόι.

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

Πολλοί μετανάστες παραπονιούνται ότι η γλώσσα δεν περιέχει κομψές αφαιρέσεις. Ναι, αυτό είναι αλήθεια, αλλά αυτό είναι ένα από τα κύρια πλεονεκτήματα της γλώσσας. Η γλώσσα περιέχει ελάχιστη μαγεία - επομένως δεν απαιτείται βαθιά γνώση για την ανάγνωση του προγράμματος. Όσο για την πολυγλωσσία του κώδικα, αυτό δεν είναι καθόλου πρόβλημα. Ένα καλογραμμένο πρόγραμμα Golang διαβάζει κάθετα, με μικρή ή καθόλου δομή. Επιπλέον, η ταχύτητα ανάγνωσης ενός προγράμματος είναι τουλάχιστον μια τάξη μεγέθους μεγαλύτερη από την ταχύτητα εγγραφής του. Εάν θεωρείτε ότι όλος ο κώδικας έχει ομοιόμορφη μορφοποίηση (που γίνεται με την ενσωματωμένη εντολή gofmt), τότε η ανάγνωση μερικών επιπλέον γραμμών δεν είναι καθόλου πρόβλημα.

Όχι πολύ εκφραστικό

Η τέχνη δεν ανέχεται όταν η ελευθερία της περιορίζεται. Η ακρίβεια δεν είναι δική του ευθύνη.

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

Για παράδειγμα, ένα βοηθητικό πρόγραμμα κονσόλας που διαβάζει το stdin ή ένα αρχείο από ορίσματα γραμμής εντολών θα μοιάζει με αυτό:

package main

import (
    "bufio"
    "flag"
    "fmt"
    "log"
    "os"
)

func main() {

    flag.Parse()

    scanner := newScanner(flag.Args())

    var text string
    for scanner.Scan() {
        text += scanner.Text()
    }

    if err := scanner.Err(); err != nil {
        log.Fatal(err)
    }

    fmt.Println(text)
}

func newScanner(flags []string) *bufio.Scanner {
    if len(flags) == 0 {
        return bufio.NewScanner(os.Stdin)
    }

    file, err := os.Open(flags[0])

    if err != nil {
        log.Fatal(err)
    }

    return bufio.NewScanner(file)
}

Η λύση στο ίδιο πρόβλημα στο D, αν και φαίνεται κάπως πιο σύντομη, δεν είναι ευκολότερη στην ανάγνωση

import std.stdio, std.array, std.conv;

void main(string[] args)
{
    try
    {
        auto source = args.length > 1 ? File(args[1], "r") : stdin;
        auto text   = source.byLine.join.to!(string);

        writeln(text);
    }
    catch (Exception ex)
    {
        writeln(ex.msg);
    }
}

Κόλαση της αντιγραφής

Ο άνθρωπος κουβαλά μέσα του την κόλαση. Μάρτιν Λούθερ.

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

package main

import "fmt"

func int64Sum(list []int64) (uint64) {
    var result int64 = 0
    for x := 0; x < len(list); x++ {
        result += list[x]
    }
    return uint64(result)
}

func int32Sum(list []int32) (uint64) {
    var result int32 = 0
    for x := 0; x < len(list); x++ {
        result += list[x]
    }
    return uint64(result)
}

func main() {

    list32 := []int32{1, 2, 3, 4, 5}
    list64 := []int64{1, 2, 3, 4, 5}

    fmt.Println(int32Sum(list32))
    fmt.Println(int64Sum(list64))
}

Η γλώσσα έχει επαρκή μέσα για να υλοποιήσει τέτοιες κατασκευές. Για παράδειγμα, ο γενικός προγραμματισμός θα ήταν καλός.

package main

import "fmt"

func Eval32(list []int32, fn func(a, b int32)int32) int32 {
    var res int32
    for _, val := range list {
        res = fn(res, val)
    }
    return res
}

func int32Add(a, b int32) int32 {
    return a + b
}

func int32Sub(a, b int32) int32 {
    return a + b
}

func Eval64(list []int64, fn func(a, b int64)int64) int64 {
    var res int64
    for _, val := range list {
        res = fn(res, val)
    }
    return res
}

func int64Add(a, b int64) int64 {
    return a + b
}

func int64Sub(a, b int64) int64 {
    return a - b
}

func main() {

    list32 := []int32{1, 2, 3, 4, 5}
    list64 := []int64{1, 2, 3, 4, 5}

    fmt.Println(Eval32(list32, int32Add))
    fmt.Println(Eval64(list64, int64Add))
    fmt.Println(Eval64(list64, int64Sub))
}

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

Πολλοί θα πουν ότι ένα πρόγραμμα στο D φαίνεται πολύ πιο σύντομο και θα έχουν δίκιο.

import std.stdio;
import std.algorithm;

void main(string[] args)
{
    [1, 2, 3, 4, 5].reduce!((a, b) => a + b).writeln;
}

Ωστόσο, είναι μόνο πιο σύντομο, αλλά όχι πιο σωστό, αφού η υλοποίηση D αγνοεί εντελώς το πρόβλημα του χειρισμού σφαλμάτων.

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

Όσον αφορά τη συντηρησιμότητα, την επεκτασιμότητα και την αναγνωσιμότητα, κατά τη γνώμη μου, η γλώσσα Go κερδίζει, αν και χάνει σε βερμπαλισμό.

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

import "sort"

type Names []string

func (ns Names) Len() int {
    return len(ns)
}

func (ns Names) Less(i, j int) bool {
    return ns[i] < ns[j]
}

func (ns Names) Swap(i, j int) {
    ns[i], ns[j] = ns[j], ns[i]
}

func main() {
    names := Names{"London", "Berlin", "Rim"}
    sort.Sort(names)
}

Εάν χρησιμοποιήσετε οποιοδήποτε έργο ανοιχτού κώδικα και εκτελέσετε την εντολή grep "interface{}" -R, θα δείτε πόσο συχνά χρησιμοποιούνται διεπαφές που προκαλούν σύγχυση. Οι κολλητοί σύντροφοι θα πουν αμέσως ότι όλα αυτά οφείλονται στην έλλειψη γενοσήμων. Ωστόσο, αυτό δεν συμβαίνει πάντα. Ας πάρουμε τους ΔΕΛΦΟΙ ως παράδειγμα. Παρά την παρουσία αυτών των ίδιων γενικών, περιέχει έναν ειδικό τύπο VARIANT για λειτουργίες με αυθαίρετους τύπους δεδομένων. Η γλώσσα Go κάνει το ίδιο.

Από κανόνι μέχρι σπουργίτια

Και το ζουρλομανδύα πρέπει να ταιριάζει στο μέγεθος της τρέλας. Stanislav Lec.

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

Ο Rob Pike μας προειδοποιεί:

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

Η Wikipedia μας λέει τα εξής:

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

Ωστόσο, όπως γνωρίζετε, πρέπει να πληρώσετε για τα πάντα. Σε αυτή την περίπτωση είναι:

  • δυσκολία στη σύνταξη προγραμμάτων
  • ταχύτητα εκτέλεσης προγράμματος

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

Πολιτιστικές αποσκευές από τον Xi; Όχι, από πολλές γλώσσες!

Μαζί με την περιουσία μένουν και χρέη στους κληρονόμους.

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

σύνταξη

Πρώτα απ 'όλα, η σύνταξη των γραμματικών δομών βασίζεται στη σύνταξη της γλώσσας C. Ωστόσο, σημαντική επιρροή είχε και η γλώσσα των ΔΕΛΦΟΙ. Έτσι, βλέπουμε ότι οι περιττές παρενθέσεις, που μειώνουν κατά πολύ την αναγνωσιμότητα του προγράμματος, έχουν αφαιρεθεί εντελώς. Η γλώσσα περιέχει επίσης τον τελεστή “:=” που είναι εγγενής στη γλώσσα DELPHI. Η έννοια των πακέτων είναι δανεισμένη από γλώσσες όπως η ADA. Η δήλωση των αχρησιμοποίητων οντοτήτων είναι δανεισμένη από τη γλώσσα PROLOG.

Σημασιολογία

Τα πακέτα βασίστηκαν στη σημασιολογία της γλώσσας ΔΕΛΦΟΙ. Κάθε πακέτο ενσωματώνει δεδομένα και κώδικα και περιέχει ιδιωτικούς και δημόσιους φορείς. Αυτό σας επιτρέπει να μειώσετε τη διεπαφή πακέτου στο ελάχιστο.

Η λειτουργία υλοποίησης με μέθοδο αντιπροσώπευσης δανείστηκε από τη γλώσσα DELPHI.

Σύνταξη

Δεν είναι χωρίς λόγο ότι υπάρχει ένα αστείο: Το Go αναπτύχθηκε ενώ καταρτιζόταν ένα πρόγραμμα C. Ένα από τα δυνατά σημεία της γλώσσας είναι η εξαιρετικά γρήγορη σύνταξη της. Η ιδέα δανείστηκε από τη γλώσσα ΔΕΛΦΟΙ. Κάθε πακέτο Go αντιστοιχεί σε μια ενότητα DELPHI. Αυτά τα πακέτα μεταγλωττίζονται εκ νέου μόνο όταν είναι πραγματικά απαραίτητο. Επομένως, μετά την επόμενη επεξεργασία, δεν χρειάζεται να μεταγλωττίσετε ολόκληρο το πρόγραμμα, αλλά να μεταγλωττίσετε ξανά μόνο τα αλλαγμένα πακέτα και τα πακέτα που εξαρτώνται από αυτά τα αλλαγμένα πακέτα (και ακόμη και τότε, μόνο εάν έχουν αλλάξει οι διεπαφές των πακέτων).

Κατασκευές υψηλού επιπέδου

Η γλώσσα περιέχει πολλές διαφορετικές κατασκευές υψηλού επιπέδου που σε καμία περίπτωση δεν σχετίζονται με γλώσσες χαμηλού επιπέδου όπως η C.

  • Γραμμές
  • Πίνακες κατακερματισμού
  • Φέτες
  • Η πληκτρολόγηση πάπιας είναι δανεισμένη από γλώσσες όπως το RUBY (το οποίο, δυστυχώς, πολλοί δεν καταλαβαίνουν ή δεν χρησιμοποιούν στο μέγιστο των δυνατοτήτων τους).

Διαχείριση μνήμης

Η διαχείριση μνήμης γενικά αξίζει ένα ξεχωριστό άρθρο. Εάν σε γλώσσες όπως η C++, ο έλεγχος επαφίεται πλήρως στον προγραμματιστή, τότε σε μεταγενέστερες γλώσσες όπως η DELPHI, χρησιμοποιήθηκε ένα μοντέλο μέτρησης αναφοράς. Με αυτήν την προσέγγιση, οι κυκλικές αναφορές δεν επιτρέπονταν, αφού σχηματίστηκαν ορφανά συμπλέγματα, τότε το Go έχει ενσωματωμένη ανίχνευση τέτοιων συστάδων (όπως το C#). Επιπλέον, ο συλλέκτης απορριμμάτων είναι πιο αποτελεσματικός από τις περισσότερες γνωστές επί του παρόντος υλοποιήσεις και μπορεί ήδη να χρησιμοποιηθεί για πολλές εργασίες σε πραγματικό χρόνο. Η ίδια η γλώσσα αναγνωρίζει καταστάσεις κατά τις οποίες μπορεί να εκχωρηθεί μια τιμή για την αποθήκευση μιας μεταβλητής στη στοίβα. Αυτό μειώνει το φορτίο στη διαχείριση μνήμης και αυξάνει την ταχύτητα του προγράμματος.

Συγχρονισμός και Συγχρονισμός

Ο παραλληλισμός και η ανταγωνιστικότητα της γλώσσας είναι πέρα ​​από επαίνους. Καμία γλώσσα χαμηλού επιπέδου δεν μπορεί να ανταγωνιστεί το Go. Για να είμαστε δίκαιοι, αξίζει να σημειωθεί ότι το μοντέλο δεν επινοήθηκε από τους συγγραφείς της γλώσσας, αλλά απλώς δανείστηκε από την παλιά καλή γλώσσα ADA. Η γλώσσα είναι ικανή να επεξεργάζεται εκατομμύρια παράλληλες συνδέσεις χρησιμοποιώντας όλες τις CPU, ενώ έχει λιγότερο σύνθετα προβλήματα τάξης μεγέθους με αδιέξοδα και συνθήκες αγώνα που είναι τυπικές για κώδικα πολλαπλών νημάτων.

Πρόσθετα οφέλη

Αν είναι κερδοφόρο, όλοι θα γίνουν ανιδιοτελείς.

Η γλώσσα μας παρέχει επίσης μια σειρά από αναμφισβήτητα οφέλη:

  • Ένα μόνο εκτελέσιμο αρχείο μετά την κατασκευή του έργου απλοποιεί σημαντικά την ανάπτυξη των εφαρμογών.
  • Η στατική πληκτρολόγηση και το συμπέρασμα τύπου μπορούν να μειώσουν σημαντικά τον αριθμό των σφαλμάτων στον κώδικά σας, ακόμη και χωρίς δοκιμές εγγραφής. Ξέρω κάποιους προγραμματιστές που κάνουν χωρίς να γράφουν καθόλου τεστ και η ποιότητα του κώδικα τους δεν υποφέρει σημαντικά.
  • Πολύ απλή πολλαπλή μεταγλώττιση και εξαιρετική φορητότητα της τυπικής βιβλιοθήκης, η οποία απλοποιεί σημαντικά την ανάπτυξη εφαρμογών πολλαπλών πλατφορμών.
  • Οι τυπικές εκφράσεις RE2 είναι ασφαλείς για νήμα και έχουν προβλέψιμους χρόνους εκτέλεσης.
  • Μια ισχυρή τυπική βιβλιοθήκη που επιτρέπει στα περισσότερα έργα να λειτουργούν χωρίς πλαίσια τρίτων.
  • Η γλώσσα είναι αρκετά ισχυρή ώστε να εστιάζει στο πρόβλημα και όχι στο πώς να το λύσει, αλλά αρκετά χαμηλό επίπεδο ώστε το πρόβλημα να μπορεί να λυθεί αποτελεσματικά.
  • Το σύστημα Go eco περιέχει ήδη ανεπτυγμένα εργαλεία για όλες τις περιπτώσεις: δοκιμές, τεκμηρίωση, διαχείριση πακέτων, πανίσχυρα σεντόνια, δημιουργία κώδικα, ανιχνευτή συνθηκών αγώνα κ.λπ.
  • Η έκδοση 1.11 Go εισήγαγε την ενσωματωμένη διαχείριση σημασιολογικής εξάρτησης, βασισμένη στη δημοφιλή φιλοξενία VCS. Όλα τα εργαλεία που συνθέτουν το οικοσύστημα Go χρησιμοποιούν αυτές τις υπηρεσίες για λήψη, δημιουργία και εγκατάσταση κώδικα από αυτές με μια πτώση. Και αυτό είναι υπέροχο. Με την άφιξη της έκδοσης 1.11, επιλύθηκε πλήρως και το πρόβλημα με την έκδοση πακέτων.
  • Επειδή η βασική ιδέα της γλώσσας είναι να μειώσει τη μαγεία, η γλώσσα ενθαρρύνει τους προγραμματιστές να χειρίζονται ρητά τα σφάλματα. Και αυτό είναι σωστό, γιατί διαφορετικά, απλά θα ξεχάσει εντελώς τον χειρισμό σφαλμάτων. Ένα άλλο πράγμα είναι ότι οι περισσότεροι προγραμματιστές αγνοούν εσκεμμένα τον χειρισμό σφαλμάτων, προτιμώντας αντί να τους επεξεργαστούν να προωθήσουν απλώς το σφάλμα προς τα πάνω.
  • Η γλώσσα δεν εφαρμόζει την κλασική μεθοδολογία OOP, αφού στην καθαρή της μορφή δεν υπάρχει εικονικότητα στο Go. Ωστόσο, αυτό δεν αποτελεί πρόβλημα κατά τη χρήση διεπαφών. Η απουσία OOP μειώνει σημαντικά το εμπόδιο εισόδου για αρχάριους.

Απλότητα προς όφελος της κοινότητας

Είναι εύκολο να περιπλέκεται, δύσκολο να απλοποιηθεί.

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

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

Συμπέρασμα

Το μεγάλο μέγεθος του εγκεφάλου δεν έκανε ποτέ κανέναν ελέφαντα νικήτρια του βραβείου Νόμπελ.

Για εκείνους τους προγραμματιστές των οποίων το προσωπικό εγώ υπερισχύει του ομαδικού πνεύματος, καθώς και για τους θεωρητικούς που αγαπούν τις ακαδημαϊκές προκλήσεις και την ατελείωτη «αυτοβελτίωση», η γλώσσα είναι πολύ κακή, καθώς είναι μια γενικής χρήσης χειροτεχνική γλώσσα που δεν σας επιτρέπει να αποκτήσετε αισθητική απόλαυση από το αποτέλεσμα της δουλειάς σας και δείξτε τον εαυτό σας επαγγελματία μπροστά σε συναδέλφους (υπό την προϋπόθεση ότι μετράμε την ευφυΐα με αυτά τα κριτήρια και όχι με το IQ). Όπως όλα στη ζωή, είναι θέμα προσωπικών προτεραιοτήτων. Όπως όλες οι αξιόλογες καινοτομίες, η γλώσσα έχει ήδη διανύσει πολύ δρόμο από την καθολική άρνηση στη μαζική αποδοχή. Η γλώσσα είναι ευρηματική στην απλότητά της και, όπως ξέρετε, κάθε έξυπνο είναι απλό!

Πηγή: www.habr.com

Προσθέστε ένα σχόλιο