Goがダムプログラマにずっお悪い理由

この蚘事は、以前に公開された察抗蚘事ぞの回答ずしお曞かれおいたす。







画像







過去2幎以䞊にわたっお、Goを䜿甚しお、開発された課金システムを備えた特殊なRADIUSサヌバヌを実装しおきたした。 その過皋で、蚀語自䜓の埮劙さを孊びたす。 プログラム自䜓は非垞に単玔であり、蚘事を曞く目的ではありたせんが、Go自䜓を䜿甚した経隓は、その匁護においおいく぀かの蚀葉を蚀うに倀したす。 Goは、本栌的でスケヌラブルなコヌドでたすたす人気のある蚀語になっおいたす。 この蚀語はGoogleで䜜成され、積極的に䜿甚されおいたす。 芁玄するず、Go蚀語の蚭蚈はダムプログラマにずっお悪いこずだず心から信じおいたす。







匱いプログラマヌ向けに蚭蚈されおいたすか



問題に぀いおの匱い話。 アむデアず倢に぀いおの匷い話...

Goは習埗が非垞に簡単なので、準備がほずんどたたはたったくなくおもコヌドを読むこずができたす。 蚀語のこの機胜は、コヌドが䞭栞ではない専門家マネヌゞャヌ、顧客などず䞀緒に読たれるずきに、倚くの䞖界の䌁業で䜿甚されたす。 これは、蚭蚈駆動開発などの方法論に非垞に䟿利です。







初心者のプログラマでさえ、1、2週間埌にかなりたずもなコヌドを生成し始めたす。 私が囲studiedを研究した本は、「囲Language蚀語のプログラミング」マヌク・サマヌフィヌルド䜜ず呌ばれおいたす。 この本は非垞に優れおおり、蚀語のニュアンスの倚くに觊れおいたす。 Java、PHPなどの䞍必芁に耇雑な蚀語の埌、魔法の欠劂はさわやかです。 しかし、遅かれ早かれ、倚くの限られたプログラマヌは、新しい分野で叀い方法を䜿甚したいず望んでいたす。 これは本圓に必芁ですか







Rob Pike蚀語の䞻なむデオロギヌ孊者は、Goを理解しやすく、䜿いやすい産業甚蚀語ずしお䜜成したした。 この蚀語は、倧芏暡なチヌムで最倧限の生産性を実珟するように蚭蚈されおおり、疑いの䜙地はありたせん。 倚くの初心者プログラマヌは、欠けおいる倚くの機胜があるこずに䞍満を蚀っおいたす。 この単玔さぞの欲求は蚀語開発者の意識的な決定であり、それが䜕のためであるかを完党に理解するためには、開発者の動機ずGoで達成したこずを理解する必芁がありたす。







それで、なぜそんなに簡単になったのですか ロブパむクからの匕甚を以䞋に瀺したす。







ここで重芁なのは、プログラマヌは研究者ではないずいうこずです。 圌らは通垞非垞に若く、攟課埌に私たちのずころに来お、倚分圌らはJavaやC / C ++やPythonを勉匷したした。 圌らは優れた蚀語を理解するこずはできたせんが、同時に、優れた゜フトりェアを䜜成しおほしいです。 だからこそ、蚀語は理解しやすく、孊習しやすいものでなければなりたせん。



圌はおおたかに蚀っお、Cに䌌おいるはずです。 Googleプログラマヌはキャリアを早期に開始し、手続き型蚀語、特にCファミリヌに粟通しおいたす。 新しいプログラミング蚀語の迅速な生産性に察する芁求は、その蚀語が過激すぎるべきではないこずを意味したす。

賢い蚀葉ですね。







シンプルさのアヌティファクト



シンプルさは矎しい人にずっお必芁な条件です。 レオ・トルストむ。

シンプルであるこずは、あらゆるデザむンにおいお最も重芁な願望の1぀です。 ご存知のように、完璧なプロゞェクトは、远加するものがないプロゞェクトではなく、削陀するものがないプロゞェクトです。 倚くの人は、耇雑なタスクを解決するたたは衚珟するには、耇雑なツヌルが必芁だず考えおいたす。 しかし、これはそうではありたせん。 たずえば、PERL蚀語を取り䞊げたす。 この蚀語のむデオロギヌ孊者は、プログラマヌが1぀の問題を解決するために少なくずも3぀の異なる方法を持぀べきだず信じおいたした。 Go蚀語のむデオロギヌ家は別の道を歩み、目暙を達成するためには1぀の方法で十分ですが、本圓に良いず刀断したした。 このアプロヌチには真剣な基瀎がありたす。唯䞀の方法は孊びやすく、忘れにくいものです。







倚くの移民は、この蚀語にぱレガントな抜象化が含たれおいないこずを蚎えおいたす。 はい、しかし、これはこの蚀語の䞻な利点の1぀です。 蚀語の構成には最小限の魔法が含たれおいるため、プログラムを読むために深い知識は必芁ありたせん。 コヌドの冗長性に関しおは、これはたったく問題ではありたせん。 よく曞かれたGolangプログラムは、ほずんどたたはたったく構造化せずに垂盎に読み取られたす。 さらに、プログラムの読み取り速床は、曞き蟌みより少なくずも1桁高速です。 すべおのコヌドが均䞀なフォヌマット組み蟌みの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コマンドを実行するず、混乱したむンタヌフェむスが䜿甚される頻床がわかりたす。 気の狭い仲間は、これはすべおゞェネリック薬の䞍足によるものであるずすぐに蚀うでしょう。 ただし、これは垞にそうではありたせん。 DELPHI蚀語を䟋にずっおみたしょう。 これらのゞェネリックが同じであるにもかかわらず、任意のデヌタ型を䜿甚した操䜜のための特別な型VARIANTが含たれおいたす。 Goも同じこずを行いたす。







スズメの銃から



そしお、拘束衣は狂気の倧きさに適合しなければなりたせん。 スタニスラフ・レッツ。

゚クストリヌムスポヌツのファンの倚くは、Goにはゞェネリックを䜜成する別のメカニズム、リフレクションがあるず蚀うこずができたす。 そしお、圌らは正しいでしょう...しかし、たれなケヌスでのみ。







ロブ・パむクは私たちに譊告したす







これは、泚意しお䜿甚する必芁がある匷力なツヌルです。 厳密に必芁になるたでは避けおください。

りィキペディアは次のこずを教えおくれたす。







リフレクションずは、プログラムが実行時に独自の構造ず動䜜を远跡および倉曎できるプロセスを意味したす。 リフレクションの基瀎ずなるプログラミングパラダむムは、再垰プログラミングず呌ばれたす。 これはメタプログラミングの䞀皮です。

ただし、ご存じのずおり、すべおの料金を支払う必芁がありたす。 この堎合、次のずおりです。









したがっお、反射は倧口埄の歊噚ずしお泚意しお䜿甚する必芁がありたす。 リフレクションを軜率に䜿甚するず、プログラムが読めなくなり、゚ラヌが絶えず、䜎速になりたす。 たさにそのこずは、スノッブプログラマヌが他の、より実甚的で控えめな同僚の前で自分のコヌドを誇瀺できるずいうこずです。







Cからの文化的な荷物 いいえ、倚くの蚀語から



囜家ずずもに、盞続人には借金が残っおいたす。

蚀語は完党にCの遺産に基づいおいるず倚くの人が信じおいるずいう事実にもかかわらず、これはそうではありたせん。 この蚀語には、最高のプログラミング蚀語の倚くの偎面が組み蟌たれおいたす。







構文



たず、文法構造の構文はC蚀語の構文に基づいおいたす。 ただし、DELPHI蚀語も倧きな圱響を及がしたした。 したがっお、䜙分な角かっこが完党に削陀され、プログラムの可読性が倧幅に䜎䞋するこずがわかりたす。 たた、蚀語にはoperator :: =が含たれおいたすが、これはDELPHI蚀語に固有です。 パッケヌゞの抂念は、ADAなどの蚀語から借甚されおいたす。 未䜿甚の゚ンティティの宣蚀は、PROLOG蚀語から借甚されたす。







意味論



DELPHI蚀語のセマンティクスは、パッケヌゞの基瀎ずしお採甚されたした。 各パッケヌゞはデヌタずコヌドをカプセル化し、プラむベヌトおよびパブリック゚ンティティを含みたす。 これにより、パッケヌゞむンタヌフェむスを最小限に抑えるこずができたす。







デリゲヌト実装操䜜はDELPHIから借甚されたした。







線集



ゞョヌクがあるのも䞍思議ではありたせん。Cプログラムのコンパむル䞭にGoが開発されたした。 この蚀語の長所の1぀は、超高速コンパむルです。 このアむデアはデルフィから借りたものです。 さらに、各GoパッケヌゞはDELPHIモゞュヌルに察応しおいたす。 これらのパッケヌゞは、本圓に必芁な堎合にのみ再コンパむルされたす。 したがっお、次の線集埌、プログラム党䜓をコンパむルする必芁はありたせんが、倉曎されたパッケヌゞおよびこれらの倉曎されたパッケヌゞに䟝存するパッケヌゞのみを再コンパむルするだけで十分ですパッケヌゞむンタヌフェむスが倉曎された堎合のみ。







高レベルの蚭蚈



この蚀語には、Cなどの䜎レベル蚀語ずはたったく関係のない、さたざたな高レベルコンストラクトが含たれおいたす。









メモリ管理



通垞、メモリ管理には別の蚘事が必芁です。 C ++のような蚀語では、制埡は開発者に完党に委ねられ、DELPHIのような埌の蚀語では、参照カりントモデルが䜿甚されたした。 このアプロヌチでは、倱われたクラスタヌが圢成されたため、埪環リンクは蚱可されず、そのようなクラスタヌの怜出CのようにはGoに組み蟌たれおいたす。 さらに、ガベヌゞコレクタヌは、珟圚知られおいるほずんどの実装よりも効果的であり、倚くのリアルタむムタスクで既に䜿甚できたす。 蚀語自䜓は、倉数を栌玍するための倀をスタックに割り圓おるこずができる状況を認識したす。 これにより、メモリマネヌゞャの負荷が軜枛され、プログラムの速床が向䞊したす。







䞊行性ず競争



蚀語の䞊列性ず競争力は賞賛を超えおいたす。 䜎レベル蚀語は、Go蚀語ずリモヌトで競合するこずさえできたせん。 公平には、このモデルは蚀語の䜜者によっお発明されたのではなく、叀き良きADA蚀語から単に借甚されたものであるこずに泚意する䟡倀がありたす。 この蚀語は、すべおのCPUを䜿甚しお数癟䞇の䞊列接続を凊理できたすが、デッドロックや競合状態を䌎うマルチスレッドコヌドの耇雑な問題ではあたり䞀般的ではありたせん。







远加の利点



これが有益であれば、誰もが無私になりたす。

この蚀語は、間違いなく倚くの利点も提䟛したす。









コミュニティのメリットを簡単に



耇雑にするこずは簡単ですが、単玔化するこずは困難です。

Goはシンプルで成功するように蚭蚈されたした。 チヌムワヌクのすべおの長所を理解し、゚ンタヌプラむズレベルの蚀語の無限の倉動にうんざりしおいる賢いプログラマヌのために曞かれたした。 歊噚庫に比范的小さな構文構造のセットがあるため、実際には時間の経過に䌎う倉化の圱響を受けないため、開発者は蚀語革新の無限の研究のためではなく、開発のために倚くの時間を解攟したした。







䌁業には倚くの利点もありたす。゚ントリのしきい倀が䜎いず専門家をすばやく芋぀けるこずができ、蚀語の䞍倉性により10幎埌に同じコヌドを䜿甚できたす。







おわりに



脳のサむズが倧きいため、1頭のゟりはただノヌベル賞を受賞しおいたせん。

個人的な゚ゎがチヌムの粟神よりも勝っおいるプログラマヌや、孊問的な仕事ず無限の「自己改善」を愛する理論家にずっお、蚀語は本圓に悪いのです。同僚の前にいる専門家IQ係数ではなく、これらの基準で心を正確に枬定するこずを条件ずする。 人生のすべおず同様に、それは個人的な優先事項の問題です。 すべおの䟡倀ある革新ず同様に、蚀語はすでに普遍的な吊定から倧量の認識ぞず長い道のりを歩んできたした。 蚀語はシンプルで独創的ですが、ご存知のように、独創的なものはすべおシンプルです







たずめ



Goに向けられたすべおの厳しい批刀の䞭で、次の声明が際立っおいたす。









実際、この蚘事はGo蚀語の構文䞊の利点に぀いおではなく、チヌムワヌクの利点ず開発䞭のプロゞェクトの効果的な進化に぀いおの簡朔な抂芁ずしお考えたした。 より具䜓的な問題に関連しお、この蚘事は続けられるず理解されたした。 ただし、トピックぞの関心がないため、おそらく継続はありたせん。







実隓



あなたも芋知らぬ人も、蚀葉を信じないでください。しかし、あなたず芋知らぬ人の䞡方の行為を信じおください。

最埌の郚分は、建蚭的志向の楜芳䞻矩者であるず自分自身を考え、自分の事柄でこれを確認できる人々のカテゎリヌ専甚です。 残りの聎衆は、この郚分をスキップしおください。







この実隓は、すべおの建蚭的志向の楜芳䞻矩者が長い間少なくずも事実䞊わが囜の広がりを残し、たずえばStack Overflowに萜ち着いたず䞻匵した友人に觊発されたした。 長い間信じおいなかったので、この実隓を行うこずにしたした。

いく぀かの蚘事がハブに投皿されたした。これは、私が匕甚したコメントの分析の結果です。









すべおの建蚭的志向の楜芳䞻矩者に深い敬意ず同情を持っおいたす。







アドベラックス








All Articles