Ngano nga ang Go Design Dili Maayo alang sa mga Smart Programmer

Sa miaging mga bulan gigamit nako ang Go para sa mga pagpatuman. Pamatuod sa Konsepto (gibanabana.: code aron sulayan ang pagpaandar sa usa ka ideya) sa iyang libre nga oras, bahin sa pagtuon sa programming language mismo. Ang mga programa mismo yano ra kaayo ug dili ang katuyoan sa kini nga artikulo, apan ang kasinatian sa paggamit sa Go mismo angayan sa pipila ka mga pulong bahin niini. Go nagsaad nga mahimong (gibanabana.: artikulo nga gisulat sa 2015) usa ka popular nga pinulongan alang sa seryoso nga scalable code. Ang pinulongan gimugna sa Google, diin kini aktibo nga gigamit. Ubos nga linya, matinud-anon ko nga naghunahuna nga ang disenyo sa Go nga pinulongan dili maayo alang sa mga smart programmer.

Gidisenyo alang sa huyang nga mga programmer?

Ang Go sayon ​​kaayo nga makat-on, sayon ​​​​kaayo nga ang pagpaila gikuha kanako usa ka gabii, pagkahuman mahimo na akong ma-code nga produktibo. Ang libro nga akong nakat-onan kaniadto gitawag og Go Usa ka Pasiuna sa Programming sa Go (hubad), kini anaa sa internet. Ang libro, sama sa Go source code mismo, dali basahon, adunay maayong mga pananglitan sa code, ug adunay mga 150 ka panid nga mabasa sa usa ka paglingkod. Kini nga kayano makaparepresko sa sinugdanan, ilabina sa kalibutan sa programming nga puno sa sobra ka komplikado nga teknolohiya. Apan sa kataposan, sa madugay o sa madali motungha ang hunahuna: “Mao ba gayod kini?”

Giangkon sa Google nga ang kayano ni Go mao ang punto sa pagbaligya niini ug ang pinulongan gidisenyo alang sa labing taas nga produktibo sa dagkong mga team, apan nagduhaduha ko niini. Adunay mga bahin nga nawala o sobra ka detalyado. Ug ang tanan tungod sa kakulang sa pagsalig sa mga developers, uban sa pangagpas nga sila dili makahimo sa bisan unsa nga matarung. Kini nga tinguha alang sa kayano usa ka mahunahunaon nga desisyon sa mga tigdesinyo sa pinulongan, ug aron hingpit nga masabtan kung nganong gikinahanglan kini, kinahanglan natong masabtan ang kadasig sa mga developers ug unsa ang ilang gipaningkamutan nga makab-ot sa Go.

Busa nganong kini gihimo nga yano kaayo? Ania ang pipila ka mga kinutlo Rob Pike (gibanabana.: usa sa mga co-creator sa Go language):

Ang yawe nga punto dinhi mao nga ang among mga programmer (gibanabana.: Mga Googler) dili mga tigdukiduki. Sila, ingon nga usa ka lagda, medyo bata pa, mianhi kanamo pagkahuman sa pagtuon, tingali nagtuon sila sa Java, o C/C++, o Python. Dili sila makasabut sa usa ka maayo nga pinulongan, apan sa samang higayon gusto namo nga sila makahimo og maayo nga software. Mao nga ang ilang pinulongan kinahanglan nga sayon ​​​​alang kanila nga masabtan ug makat-on.
 
Kinahanglan nga pamilyar siya, halos parehas sa pagsulti sa C. Ang mga programmer nga nagtrabaho sa Google sayo nga nagsugod sa ilang mga karera ug kasagaran pamilyar sa mga procedural nga mga pinulongan, ilabi na sa pamilyang C. Ang kinahanglanon alang sa dali nga pagka-produktibo sa usa ka bag-ong programming language nagpasabut nga ang pinulongan kinahanglan dili kaayo radikal.

Unsa? Mao nga giingon ni Rob Pike nga ang mga developer sa Google dili kaayo maayo, mao nga naghimo sila usa ka sinultian alang sa mga idiot (gibanabana.: nabungol) para may mahimo sila. Unsa nga matang sa arogante nga pagtan-aw sa imong kaugalingon nga mga kauban? Kanunay kong nagtuo nga ang mga developer sa Google gipili gikan sa labing hayag ug labing maayo sa Yuta. Sigurado nga mahimo nila ang usa ka butang nga mas lisud?

Mga artifact sa sobra nga kayano

Ang pagkayano usa ka takus nga katuyoan sa bisan unsang disenyo, ug ang pagsulay sa paghimo sa usa ka butang nga yano lisud. Bisan pa, kung pagsulay sa pagsulbad (o bisan pagpahayag) sa mga komplikado nga mga problema, usahay gikinahanglan ang usa ka komplikado nga himan. Ang pagkakomplikado ug pagkakomplikado dili ang labing kaayo nga bahin sa usa ka programming language, apan adunay tunga nga yuta diin ang lengguwahe makahimo og matahum nga abstraction nga dali masabtan ug magamit.

Dili kaayo expressive

Tungod sa iyang pasalig sa kayano, ang Go kulang sa mga konstruksyon nga giisip nga natural sa ubang mga pinulongan. Kini daw usa ka maayo nga ideya sa sinugdan, apan sa praktis moresulta kini sa verbose code. Ang rason alang niini kinahanglan nga dayag - kini kinahanglan nga sayon ​​alang sa mga developers sa pagbasa sa code sa ubang mga tawo, apan sa pagkatinuod kini nga mga pagpayano makadaot lamang sa pagbasa. Walay mga pinamubo sa Go: bisan daghan o wala.

Pananglitan, ang usa ka console utility nga nagbasa sa stdin o usa ka file gikan sa mga argumento sa command line mahimong ingon niini:

package main

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

func main() {

    flag.Parse()
    flags := flag.Args()

    var text string
    var scanner *bufio.Scanner
    var err error

    if len(flags) > 0 {

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

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

        scanner = bufio.NewScanner(file)

    } else {
        scanner = bufio.NewScanner(os.Stdin)
    }

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

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

    fmt.Println(text)
}

Bisan kung kini nga code naningkamot usab nga mahimong kinatibuk-an kutob sa mahimo, ang pinugos nga pagkasulti ni Go nakababag, ug ingon usa ka sangputanan, ang pagsulbad sa usa ka yano nga problema moresulta sa daghang kantidad sa code.

Dinhi, pananglitan, usa ka solusyon sa parehas nga problema sa 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);
    }
}

Ug kinsa ang mas mabasa karon? Ihatag nako ang akong boto kang D. Ang iyang code mas daling mabasa tungod kay mas klaro niyang gihulagway ang mga aksyon. D naggamit ug mas komplikado nga mga konsepto (gibanabana.: alternatibo nga function nga tawag и mga template) kaysa sa pananglitan sa Go, apan wala’y komplikado bahin sa pagsabut niini.

Impyerno sa pagkopya

Usa ka popular nga sugyot alang sa pagpalambo sa Go mao ang kinatibuk-an. Kini labing menos makatabang sa paglikay sa wala kinahanglana nga pagkopya sa code aron suportahan ang tanan nga mga tipo sa datos. Pananglitan, ang usa ka function alang sa pagsumada sa usa ka lista sa mga integer mahimong ipatuman sa walay lain nga paagi gawas sa pagkopya-paste sa iyang sukaranang gimbuhaton alang sa matag tipo sa integer; walay laing paagi:

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 int16Sum(list []int16) (uint64) {
    var result int16 = 0
    for x := 0; x < len(list); x++ {
        result += list[x]
    }
    return uint64(result)
}

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

func main() {

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

    fmt.Println(int8Sum(list8))
    fmt.Println(int16Sum(list16))
    fmt.Println(int32Sum(list32))
    fmt.Println(int64Sum(list64))
}

Ug kini nga panig-ingnan dili bisan sa pagtrabaho alang sa gipirmahan nga mga tipo. Kini nga pamaagi hingpit nga naglapas sa prinsipyo sa dili pag-usab sa imong kaugalingon (uga nga), usa sa labing inila ug klaro nga mga prinsipyo, nga wala magtagad kung diin ang gigikanan sa daghang mga sayup. Nganong gibuhat ni ni Go? Kini usa ka makalilisang nga aspeto sa pinulongan.

Parehas nga pananglitan sa D:

import std.stdio;
import std.algorithm;

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

Simple, elegante ug diretso sa punto. Ang function nga gigamit dinhi mao ang reduce para sa template type ug predicate. Oo, kini pag-usab mas komplikado kaysa sa Go nga bersyon, apan dili lisud nga masabtan sa mga smart programmer. Hain nga pananglitan ang mas sayon ​​nga ipadayon ug mas sayon ​​basahon?

Yano nga matang sa sistema sa bypass

Naghunahuna ko nga ang mga programmer sa Go nga nagbasa niini magbula ang baba ug mosinggit, "Sayop ang imong gibuhat!" Aw, adunay lain nga paagi sa paghimo sa usa ka generic nga function ug mga tipo, apan kini hingpit nga nagguba sa tipo nga sistema!

Tan-awa kini nga pananglitan sa usa ka hungog nga pag-ayo sa pinulongan aron masulbad ang problema:

package main

import "fmt"
import "reflect"

func Reduce(in interface{}, memo interface{}, fn func(interface{}, interface{}) interface{}) interface{} {
    val := reflect.ValueOf(in)

    for i := 0; i < val.Len(); i++ {
        memo = fn(val.Index(i).Interface(), memo)
    }

    return memo
}

func main() {

    list := []int{1, 2, 3, 4, 5}

    result := Reduce(list, 0, func(val interface{}, memo interface{}) interface{} {
        return memo.(int) + val.(int)
    })

    fmt.Println(result)
}

Kini nga pagpatuman Reduce gihulam gikan sa artikulo Idiomatic generics sa Go (gibanabana.: Dili nako makit-an ang paghubad, malipay ko kung motabang ka niini). Aw, kung kini idiomatic, dili ko gusto nga makakita og dili idiomatic nga pananglitan. Paggamit interface{} - usa ka komedya, ug sa pinulongan gikinahanglan lamang sa paglaktaw sa pag-type. Kini usa ka walay sulod nga interface ug ang tanan nga mga tipo nagpatuman niini, nga nagtugot sa hingpit nga kagawasan alang sa tanan. Kini nga estilo sa pagprograma hilabihan ka ngil-ad, ug dili kana ang tanan. Acrobatic feats sama niini nagkinahanglan sa paggamit sa runtime pagpamalandong. Bisan si Rob Pike dili ganahan sa mga indibidwal nga nag-abuso niini, sama sa iyang gihisgutan sa usa sa iyang mga taho.

Kini usa ka gamhanan nga himan nga kinahanglan gamiton uban ang pag-amping. Kinahanglang likayan kini gawas kon gikinahanglan gayod.

Gikuha nako ang mga template sa D imbis nga kini nga binuang. Unsaon ni bisan kinsa nga makaingon niana interface{} mas mabasa o bisan ang pag-type nga luwas?

Ang mga Alaot sa Pagdumala sa Dependency

Ang Go adunay usa ka built-in nga dependency system nga gitukod sa ibabaw sa mga sikat nga hosting providers VCS. Ang mga himan nga kauban sa Go nahibal-an bahin sa kini nga mga serbisyo ug mahimo’g mag-download, magtukod, ug mag-install sa code gikan kanila sa usa ka pagdagan. Samtang kini maayo, adunay usa ka dako nga sayup sa pag-bersyon! Oo, tinuod nga makuha nimo ang source code gikan sa mga serbisyo sama sa github o bitbucket gamit ang Go tools, pero dili nimo matino ang bersyon. Ug pag-usab kayano sa gasto sa pagkamapuslanon. Dili nako masabtan ang lohika sa ingon nga desisyon.

Pagkahuman sa pagpangutana bahin sa usa ka solusyon sa kini nga problema, ang Go development team naghimo forum nga thread, nga naglatid kon unsaon nila pag-atubang niini nga isyu. Ang ilang rekomendasyon mao ang pagkopya lang sa tibuok repository sa imong proyekto sa usa ka adlaw ug ibilin kini nga "as is." Unsa man ang ilang gihunahuna? Kami adunay talagsaon nga mga sistema sa pagkontrol sa bersyon nga adunay maayo nga pag-tag ug suporta sa bersyon nga gibalewala sa mga tiglalang sa Go ug gikopya lang ang gigikanan nga code.

Kultura nga bagahe gikan sa Xi

Sa akong opinyon, ang Go naugmad sa mga tawo nga migamit sa C sa tibuok nilang kinabuhi ug niadtong dili gustong mosulay og bag-o. Ang pinulongan mahimong gihulagway nga C nga adunay dugang nga mga ligid (orig.: mga ligid sa pagbansay). Wala'y bag-ong mga ideya niini, gawas sa suporta alang sa paralelismo (nga, sa laing bahin, talagsaon) ug kini usa ka kaulaw. Ikaw adunay maayo kaayo nga paralelismo sa usa ka halos dili magamit, bakol nga pinulongan.

Laing nag-uwang nga problema mao nga ang Go usa ka procedural nga lengguwahe (sama sa hilom nga kalisang sa C). Natapos nimo ang pagsulat sa code sa usa ka istilo sa pamaagi nga gibati karaan ug karaan na. Nahibal-an ko nga ang object oriented nga programming dili usa ka pilak nga bala, apan kini maayo nga makahimo sa pag-abstract sa mga detalye sa mga tipo ug paghatag og encapsulation.

Ang kayano para sa imong kaugalingong kaayohan

Ang Go gidisenyo nga yano ug kini nagmalampuson sa kana nga katuyoan. Gisulat kini alang sa huyang nga mga programmer, gamit ang usa ka karaan nga pinulongan isip template. Kini moabut nga kompleto sa yano nga mga himan sa pagbuhat sa yano nga mga butang. Sayon kini basahon ug dali gamiton.

Kini hilabihan ka verbose, dili makapadani, ug dili maayo alang sa mga maalamon nga programmer.

Спасибо mersinvald alang sa mga pag-edit

Source: www.habr.com

Idugang sa usa ka comment