KÄpÄc Go dizains ir kaitÄ«gs viedajiem programmÄtÄjiem?
PÄdÄjo mÄneÅ”u laikÄ es izmantoju Go ievieÅ”anai. Koncepta pierÄdÄ«jums (apm.: kods idejas funkcionalitÄtes pÄrbaudei) brÄ«vajÄ laikÄ, daļÄji paÅ”as programmÄÅ”anas valodas pÄtÄ«Å”anai. PaÅ”as programmas ir ļoti vienkÄrÅ”as un nav Ŕī raksta mÄrÄ·is, taÄu pati Go lietoÅ”anas pieredze ir pelnÄ«jusi dažus vÄrdus par to. Go solÄs bÅ«t (apm.: 2015. gadÄ rakstÄ«ts raksts) populÄra valoda nopietnam mÄrogojamam kodam. Valodu izveidoja Google, kur tÄ tiek aktÄ«vi izmantota. SecinÄjums, es godÄ«gi domÄju, ka Go valodas dizains ir slikts viedajiem programmÄtÄjiem.
ParedzÄts vÄjiem programmÄtÄjiem?
Go ir ļoti viegli iemÄcÄ«ties, tik viegli, ka ievads aizÅÄma vienu vakaru, pÄc kura jau varÄju produktÄ«vi kodÄt. GrÄmatu, kuru es mÄdzu iemÄcÄ«ties Go, sauc Ievads programmÄ Go (tulkojums), tas ir pieejams tieÅ”saistÄ. GrÄmata, tÄpat kÄ pats Go pirmkods, ir viegli lasÄma, tajÄ ir labi kodu piemÄri, un tajÄ ir aptuveni 150 lappuses, kuras var izlasÄ«t vienÄ piegÄjienÄ. Å Ä« vienkÄrŔība sÄkotnÄji ir atsvaidzinoÅ”a, it Ä«paÅ”i programmÄÅ”anas pasaulÄ, kas ir piepildÄ«ta ar pÄrÄk sarežģītu tehnoloÄ£iju. Bet galu galÄ agrÄk vai vÄlÄk rodas doma: "Vai tas tieÅ”Äm tÄ ir?"
Google apgalvo, ka Go vienkÄrŔība ir tÄ pÄrdoÅ”anas punkts, un valoda ir paredzÄta maksimÄlai produktivitÄtei lielÄs komandÄs, taÄu es par to Å”aubos. Ir funkcijas, kuru trÅ«kst, vai tÄs ir pÄrÄk detalizÄtas. Un tas viss tÄpÄc, ka trÅ«kst uzticÄ«bas izstrÄdÄtÄjiem, pieÅemot, ka viÅi neko nespÄj izdarÄ«t pareizi. Å Ä« vÄlme pÄc vienkÄrŔības bija apzinÄts valodas dizaineru lÄmums, un, lai pilnÄ«bÄ saprastu, kÄpÄc tas bija vajadzÄ«gs, mums ir jÄsaprot izstrÄdÄtÄju motivÄcija un tas, ko viÅi mÄÄ£inÄja sasniegt Go.
TÄtad, kÄpÄc tas tika izveidots tik vienkÄrÅ”i? Å eit ir pÄris citÄti Robs Paiks (apm.: viens no Go valodas lÄ«dzveidotÄjiem):
Galvenais Å”eit ir tas, ka mÅ«su programmÄtÄji (apm.: Google darbinieki) nav pÄtnieki. ViÅi, kÄ likums, ir diezgan jauni, nÄk pie mums pÄc studijÄm, iespÄjams, viÅi ir apguvuÅ”i Java, C/C++ vai Python. ViÅi nevar saprast lielisku valodu, bet tajÄ paÅ”Ä laikÄ mÄs vÄlamies, lai viÅi izveidotu labu programmatÅ«ru. TÄpÄc viÅu valodai jÄbÅ«t viegli saprotamai un apgÅ«stamai.
ViÅam vajadzÄtu bÅ«t pazÄ«stamam, rupji runÄjot, lÄ«dzÄ«gi kÄ C. ProgrammÄtÄji, kas strÄdÄ Google, sÄk savu karjeru agri un pÄrsvarÄ pÄrzina procesuÄlÄs valodas, jo Ä«paÅ”i C saimi. PrasÄ«ba pÄc Ätras produktivitÄtes jaunÄ programmÄÅ”anas valodÄ nozÄ«mÄ, ka valodai nevajadzÄtu bÅ«t pÄrÄk radikÄlai.
Kas? TÄtad Robs Paiks bÅ«tÄ«bÄ saka, ka Google izstrÄdÄtÄji nav tik labi, tÄpÄc viÅi radÄ«ja valodu idiotiem (apm.: nomÄkts), lai viÅi varÄtu kaut ko darÄ«t. KÄds augstprÄtÄ«gs skatiens uz paÅ”a kolÄÄ£iem? Es vienmÄr esmu uzskatÄ«jis, ka Google izstrÄdÄtÄji ir atlasÄ«ti no spilgtÄkajiem un labÄkajiem pasaulÄ. Vai viÅi var tikt galÄ ar kaut ko grÅ«tÄku?
PÄrmÄrÄ«gas vienkÄrŔības artefakti
BÅ«t vienkÄrÅ”am ir cienÄ«gs mÄrÄ·is jebkurÄ dizainÄ, un mÄÄ£inÄt izveidot kaut ko vienkÄrÅ”u ir grÅ«ti. TomÄr, mÄÄ£inot atrisinÄt (vai pat izteikt) sarežģītas problÄmas, dažreiz ir nepiecieÅ”ams sarežģīts instruments. SarežģītÄ«ba un sarežģītÄ«ba nav labÄkÄs programmÄÅ”anas valodas Ä«paŔības, taÄu pastÄv vidusceļŔ, kurÄ valoda var radÄ«t elegantas abstrakcijas, kuras ir viegli saprast un lietot.
Ne pÄrÄk izteiksmÄ«gs
VienkÄrŔības dÄļ Go trÅ«kst konstrukciju, kas citÄs valodÄs tiek uztvertas kÄ dabiskas. SÄkumÄ tÄ var Ŕķist laba ideja, taÄu praksÄ tas rada daudznozÄ«mÄ«gu kodu. Iemeslam tam vajadzÄtu bÅ«t acÄ«mredzamam ā izstrÄdÄtÄjiem ir jÄbÅ«t viegli lasÄmam citu cilvÄku kodam, taÄu patiesÄ«bÄ Å”ie vienkÄrÅ”ojumi tikai kaitÄ lasÄmÄ«bai. VÄrdÄ Go nav saÄ«sinÄjumu: vai nu daudz, vai neko.
PiemÄram, konsoles utilÄ«ta, kas nolasa stdin vai failu no komandrindas argumentiem, izskatÄ«tos Å”Ädi:
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)
}
Lai gan arÄ« Å”is kods cenÅ”as bÅ«t pÄc iespÄjas vispÄrÄ«gÄks, Go piespiedu daudzvÄrdÄ«ba traucÄ, un rezultÄtÄ vienkÄrÅ”as problÄmas risinÄÅ”anas rezultÄtÄ tiek iegÅ«ts liels koda daudzums.
Å eit, piemÄram, ir vienas un tÄs paÅ”as problÄmas risinÄjums D:
Un kurÅ” tagad ir lasÄmÄks? Es atdoÅ”u savu balsi D. ViÅa kods ir daudz lasÄmÄks, jo viÅÅ” skaidrÄk apraksta darbÄ«bas. D izmanto daudz sarežģītÄkus jÄdzienus (apm.: alternatÄ«vÄs funkcijas izsaukums Šø veidnes) nekÄ Go piemÄrÄ, taÄu patiesÄ«bÄ nav nekÄ sarežģīta to izpratnÄ.
KopÄÅ”anas elle
PopulÄrs ieteikums Go uzlaboÅ”anai ir vispÄrÄ«gums. Tas vismaz palÄ«dzÄs izvairÄ«ties no nevajadzÄ«gas koda kopÄÅ”anas, lai atbalstÄ«tu visus datu tipus. PiemÄram, veselu skaitļu saraksta summÄÅ”anas funkciju var Ä«stenot tikai kopÄjot un ielÄ«mÄjot tÄs pamatfunkciju katram vesela skaitļa veidam; cita veida nav:
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))
}
Un Å”is piemÄrs pat neder parakstÄ«tajiem tipiem. Å Ä« pieeja pilnÄ«bÄ pÄrkÄpj principu neatkÄrtoties (DRY), viens no slavenÄkajiem un acÄ«mredzamÄkajiem principiem, kura ignorÄÅ”ana ir daudzu kļūdu avots. KÄpÄc Go to dara? Tas ir briesmÄ«gs valodas aspekts.
Tas pats piemÄrs uz D:
import std.stdio;
import std.algorithm;
void main(string[] args)
{
[1, 2, 3, 4, 5].reduce!((a, b) => a + b).writeln;
}
VienkÄrÅ”i, eleganti un tieÅ”i uz lietu. Å eit izmantotÄ funkcija ir reduce veidnes tipam un predikÄtam. JÄ, tas atkal ir sarežģītÄks par Go versiju, taÄu tas nav tik grÅ«ti saprotams viedajiem programmÄtÄjiem. Kuru piemÄru ir vieglÄk uzturÄt un vieglÄk lasÄ«t?
VienkÄrÅ”a tipa sistÄmas apvedceļŔ
Es domÄju, ka Go programmÄtÄji, lasot Å”o, putos no mutes un kliedz: "JÅ«s darÄt to nepareizi!" Nu, ir vÄl viens veids, kÄ izveidot vispÄrÄ«gu funkciju un tipus, bet tas pilnÄ«bÄ izjauc tipu sistÄmu!
Apskatiet Å”o muļķīga valodas labojuma piemÄru, lai novÄrstu problÄmu:
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)
}
Å Ä« Ä«stenoÅ”ana Reduce tika aizgÅ«ts no raksta IdiomÄtiski vispÄrÄ«gie medikamenti pakalpojumÄ Go (apm.: Es nevarÄju atrast tulkojumu, priecÄÅ”os, ja jÅ«s palÄ«dzÄsiet. Nu, ja tas ir idiotisks, es negribÄtu redzÄt ne-idiomÄtisku piemÄru. LietoÅ”ana interface{} - farss, un valodÄ tas ir nepiecieÅ”ams tikai, lai apietu rakstÄ«Å”anu. Å Ä« ir tukÅ”a saskarne, un visi veidi to ievieÅ”, nodroÅ”inot pilnÄ«gu brÄ«vÄ«bu ikvienam. Å is programmÄÅ”anas stils ir Å”ausmÄ«gi neglÄ«ts, un tas vÄl nav viss. Å Ädiem akrobÄtiskajiem varoÅdarbiem ir jÄizmanto izpildlaika atspoguļojums. Pat Robam Paikam nepatÄ«k personas, kas to ļaunprÄtÄ«gi izmanto, kÄ viÅÅ” minÄja vienÄ no saviem ziÅojumiem.
Å is ir spÄcÄ«gs rÄ«ks, kas jÄizmanto piesardzÄ«gi. No tÄ jÄizvairÄs, ja vien tas nav absolÅ«ti nepiecieÅ”ams.
Es Å”o muļķību vietÄ Åemtu D veidnes. KÄ kÄds var tÄ teikt interface{} lasÄmÄks vai pat droÅ”s rakstÄ«Å”anai?
AtkarÄ«bas pÄrvaldÄ«bas bÄdas
Go ir iebÅ«vÄta atkarÄ«bas sistÄma, kas balstÄ«ta uz populÄriem mitinÄÅ”anas pakalpojumu sniedzÄjiem VCS. RÄ«ki, kas tiek piegÄdÄti kopÄ ar Go, zina par Å”iem pakalpojumiem un var vienÄ rÄvienÄ lejupielÄdÄt, izveidot un instalÄt kodu no tiem. Lai gan tas ir lieliski, versiju veidoÅ”anÄ ir liels trÅ«kums! JÄ, tÄ ir taisnÄ«ba, ka avota kodu var iegÅ«t no tÄdiem pakalpojumiem kÄ github vai bitbucket, izmantojot Go rÄ«kus, taÄu jÅ«s nevarat norÄdÄ«t versiju. Un atkal vienkÄrŔība uz lietderÄ«bas rÄÄ·ina. Es nespÄju saprast Å”Äda lÄmuma loÄ£iku.
PÄc jautÄjumu uzdoÅ”anas par Ŕīs problÄmas risinÄjumu Go izstrÄdes komanda izveidoja foruma pavediens, kurÄ bija izklÄstÄ«ts, kÄ viÅi gatavojas apiet Å”o problÄmu. ViÅu ieteikums bija kÄdu dienu vienkÄrÅ”i kopÄt visu repozitoriju savÄ projektÄ un atstÄt to ākÄ irā. Ko pie velna viÅi domÄ? Mums ir pÄrsteidzoÅ”as versiju kontroles sistÄmas ar lielisku marÄ·ÄÅ”anu un versiju atbalstu, ko Go veidotÄji ignorÄ un vienkÄrÅ”i kopÄ pirmkodu.
Kultūras bagĞa no Xi
ManuprÄt, Go izstrÄdÄja cilvÄki, kuri visu mūžu bija lietojuÅ”i C, un tie, kuri nevÄlÄjÄs izmÄÄ£inÄt kaut ko jaunu. Valodu var raksturot kÄ C ar papildu riteÅiem (orig.: apmÄcÄ«bas riteÅi). TajÄ nav jaunu ideju, izÅemot atbalstu paralÄlismam (kas, starp citu, ir brÄ«niŔķīgi), un tas ir kauns. Jums ir izcils paralÄlisms tikko lietojamÄ, klibÄ valodÄ.
VÄl viena ÄÄ«kstoÅ”a problÄma ir tÄ, ka Go ir procesuÄla valoda (tÄpat kÄ C klusÄs Å”ausmas). JÅ«s galu galÄ rakstÄt kodu procesuÄlÄ stilÄ, kas Ŕķiet arhaisks un novecojis. Es zinu, ka objektorientÄtÄ programmÄÅ”ana nav sudraba lode, taÄu bÅ«tu lieliski, ja spÄtu abstrahÄt detaļas tipos un nodroÅ”inÄt iekapsulÄÅ”anu.
VienkÄrŔība jÅ«su paÅ”u labÄ
Go tika izstrÄdÄts tÄ, lai tas bÅ«tu vienkÄrÅ”s, un tas izdodas sasniegt Å”o mÄrÄ·i. Tas tika rakstÄ«ts vÄjiem programmÄtÄjiem, kÄ veidni izmantojot vecu valodu. Tas ir komplektÄ ar vienkÄrÅ”iem rÄ«kiem vienkÄrÅ”u lietu veikÅ”anai. Tas ir viegli lasÄms un Ärti lietojams.
Tas ir ÄrkÄrtÄ«gi runÄ«gs, neizteiksmÄ«gs un slikti gudriem programmÄtÄjiem.