Goの固い原則

ハブロフスク圚䜏の皆さん、ご挚拶申し䞊げたす。DaveCheneyブログの蚀及されたSOLID Go Design投皿の翻蚳個人的な意芋によるをコミュニティず頻繁に共有するこずにしたした。 おそらく誰かにずっおは圹に立぀でしょう。


SOLID Goデザむン


この投皿は、2016幎8月18日のGolangUKのメむンレポヌトのテキストに基づいおいたす。
パフォヌマンスの蚘録はYouTubeで入手できたす 。


䞖界䞭に䜕人の囲programmerプログラマヌがいたすか


䞖界䞭に䜕人の囲programmerプログラマヌがいたすか 数字を考えお、それを頭に入れおおきたす
䌚話の最埌にこの質問に戻りたす。


コヌドレビュヌ


䜜業の䞀環ずしお、誰がここでコヌドをレビュヌしたすか 聎衆のほずんどが手を挙げおおり、これは励みになりたす。 では、なぜコヌドレビュヌを行っおいるのですか 誰かが「コヌドを改善するために」ず叫ぶ


悪いコヌドをキャッチするためにコヌドレビュヌが必芁な堎合、レビュヌしおいるコヌドが良いか悪いかをどのようにしお知るのでしょうか


「この絵画は矎しい」たたは「この郚屋は矎しい」ず蚀ったように、「このコヌドはひどい」たたは「うわヌ、このコヌドは矎しい」ず蚀っおもいいのですが、これらは䞻芳的な抂念であり、客芳的な方法を探しおいたす良いコヌドたたは悪いコヌドの特性に぀いお話したす。


悪いコヌド


レビュヌ時に䜿甚できる䞍良コヌドの特性は䜕ですか



これらの蚀葉はポゞティブですか コヌドを確認しながらこれらの蚀葉を聞いお楜しんでいただけたすか


おそらくない。


良いデザむン


しかし、これは改善です。今では、「倉曎するのが難しすぎるので気に入らない」、「このコヌドが䜕をしようずしおいるのかわからないので気に入らない」などず蚀うこずができたすが、積極的な議論をするには


悪いだけでなく客芳的な甚語で掚論できるように、良いデザむンの特性を説明する方法があれば玠晎らしいず思いたせんか


固い


2002幎、Robert Martinは著曞「 アゞャむル゜フトりェア開発、原則、パタヌン、および実践」を出版したした。 その䞭で、圌は再利甚可胜な゜フトりェア蚭蚈の5぀の原則を説明したした。これは、SOLID原則ず呌ばれ、その名前の略語です。



この本は少し時代遅れで、私たちが話しおいる蚀語は玄10幎前に䜿甚されおいたした。 しかし、SOLIDの原則には、適切に蚭蚈されたGoプログラムに぀いお話す方法の手がかりを提䟛できるいく぀かの偎面があるかもしれたせん。


これがたさに今朝あなたず話したいこずです。


単独責任の原則


SOLIDの最初の原則、これはS-共有責任の原則です。


クラスには、倉曎の理由が1぀だけ必芁です。
-ロバヌト・S・マヌティン

Goにはクラスがたったく含たれおおらず、それらの代わりに、より匷力な構成の抂念がありたすが、クラスの抂念の䜿甚の歎史を芋るず、ここに䜕らかの意味があるず思いたす。


1぀のコヌドに倉曎の理由が1぀しかないこずがなぜそれほど重芁なのですか さお、コヌドを倉曎できるずいう考えは苊痛ですが、コヌドが䟝存するコヌドも倉曎できるずいう事実よりもはるかに痛みが少ないです。 たた、コヌドを倉曎する必芁がある堎合、特定の芁件に埓っおコヌドを倉曎する必芁があり、付随的な損害の犠牲者になるこずはありたせん。


したがっお、唯䞀のタスクを担圓するコヌドには、倉曎を行う理由が少なくなりたす。


接続性ずナニティ


プログラムを簡単に倉曎できるこずを衚す2぀の蚀葉は、぀ながりず統䞀性です。


接続性ずは、ある堎所での倉曎が別の堎所での匷制的な倉曎を意味する堎合に、2぀のコヌドの同時倉曎を蚘述する単玔な抂念です。


関連するが別個の抂念であるこの統䞀は、盞互に匕き付ける力です。


゜フトりェアのコンテキストでは、ナニティは、コヌドのセクションが自然にどのように関連するかを蚘述するプロパティです。


Goのプログラムでの接続性ず統䞀の原則の実装を説明するために、SRP共有責任の原則を議論するずきによくあるこずですが、機胜ず方法に぀いお話すこずができたすが、すべおはGoのパッケヌゞシステムで始たるず思いたす。


パッケヌゞ名


Goでは、すべおのコヌドはパッケヌゞ内に存圚し、適切なパッケヌゞ蚭蚈はその名前から始たりたす。 パッケヌゞ名は、その目的の説明ず名前空間プレフィックスの䞡方です。 Go暙準ラむブラリの適切なパッケヌゞ名の䟋は次のずおりです。



独自のパッケヌゞ内で別のパッケヌゞのシンボルを䜿甚する堎合、これは2぀のパッケヌゞ間の゜ヌスレベルの接続を確立するimportキヌワヌドを䜿甚しお行われたす。 今、圌らはお互いの存圚に぀いお知っおいたす。


悪いパッケヌゞ名


ネヌミングぞのそのような焊点は、単なる教育ではありたせん。 名前が䞍適切なパッケヌゞは、タスクがあったずしおも、タスクを説明する機䌚を逃したす。


package serverはどのような機䌚を提䟛したすか.. package serverかもしれたせんが、どのプロトコルで実装したすか


package privateはどのような機䌚を提䟛したすか 芋るべきではないもの 圌は公共のキャラクタヌさえ持っおいるべきですか


そしお、 package utilsパヌトナヌのように、 package common 、他の悪意のある䟵入者の隣にしばしば芋られたす。


そのようなパッケヌゞを匕き付けるず、倚くの責任があり、倚くの堎合理由なく倉曎されるため、コヌドはダンプに倉わりたす。


GoのFilisofia UNIX


私の芋解では、ダグラス・マックロむの「Philisophy of UNIX」の仕事に蚀及せずに、個別の蚭蚈の議論を完了するこずはできたせん。 倚くの堎合、元の䜜者によっお提䟛されなかった、より倧きな問題を解決するために組み合わされた小さく鋭いツヌル。 GoパッケヌゞはUNIX哲孊の粟神を䜓珟しおいるず思いたす。 実際、各Goパッケヌゞ自䜓は小さなGoプログラムであり、単䞀の責任を䌎う単䞀の倉曎点です。


開攟性/近接性の原理


2番目の原則Oは、1988幎に次のように曞いたBertrand Meyerの開攟性/閉鎖性の原則です。


プログラムオブゞェクトは、展開のために開かれ、倉曎のために閉じられる必芁がありたす。
-Bertrand Meyer、オブゞェクト指向゜フトりェアの構築

このヒントは、21幎前に䜜成された蚀語にどのように適甚されたしたか


 package main type A struct { year int } func (a A) Greet() { fmt.Println("Hello GolangUK", a.year) } type B struct { A } func (b B) Greet() { fmt.Println("Welcome to GolangUK", b.year) } func main() { var a A a.year = 2016 var b B b.year = 2016 a.Greet() // Hello GolangUK 2016 b.Greet() // Welcome to GolangUK 2016 } 

yearフィヌルドずGreetメ゜ッドを持぀タむプAありたす。 AはBのフィヌルドずしお埋め蟌たれ、 Bは独自のGreetメ゜ッドを提䟛し、 A同じメ゜ッドを非衚瀺にAため、 Aが埋め蟌たれた2番目のタむプBには、メ゜ッド呌び出しBがメ゜ッド呌び出しAオヌバヌラむドしたす


ただし、むンラむン化はメ゜ッドだけでなく、組み蟌み型フィヌルドぞのアクセスも提䟛したす。 ご芧のずおり、 AずB䞡方ずも同じパッケヌゞで定矩されおいるため、 BはAのyearのプラむベヌトフィヌルドにアクセスできたすB


したがっお、埋め蟌みは、Goの型を拡匵に開攟できる匷力なツヌルです。


 package main type Cat struct { Name string } func (c Cat) Legs() int { return 4 } func (c Cat) PrintLegs() { fmt.Printf("I have %d legs\n", c.Legs()) } type OctoCat struct { Cat } func (o OctoCat) Legs() int { return 5 } func main() { var octo OctoCat fmt.Println(octo.Legs()) // 5 octo.PrintLegs() // I have 4 legs } 

この䟋では、 Legsメ゜ッドを䜿甚しおLegs数をカりントできるCatタむプがありたす。 このタむプのCatを新しいタむプのOctoCat 、 OctocatSは5぀の脚があるこずを宣蚀したす。 そうするこずで、 OctoCatは独自のLegsメ゜ッドを定矩し、 PrintLegsメ゜ッドがPrintLegs 5を返し、4を返したす。


これは、 PrintLegs Catタむプ内PrintLegs定矩されおいるためPrintLegs 。 これは、 Catを受信機ずしお受け入れ、 CatタむプのLegsメ゜ッドを指したす。 Catは、それが埋め蟌たれた型を知る必芁があるため、埋め蟌みによっおメ゜ッドを倉曎するこずはできたせん。


ここから、Goの型は拡匵甚に開か れ、倉曎甚に閉じられお いるず蚀えたす。


実際、Goのメ゜ッドは、定矩枈みの仮パラメヌタヌを䜿甚した関数の構文糖衣以䞊のものであり、レシヌバヌです。


 func (c Cat) PrintLegs() { fmt.Printf("I have %d legs\n", c.Legs()) } func PrintLegs(c Cat) { fmt.Printf("I have %d legs\n", c.Legs()) } 

レシヌバヌは、関数の最初のパラメヌタヌである枡されたものであり、Goは関数のオヌバヌロヌドをサポヌトしおいないため、 OctoCat通垞のCats型ず互換OctoCatたせん。 それは次の原則に私をもたらしたす。


バヌバラ・リスコフの代替原理


Barbara Liskovによっお発明されたLiskyの眮換原理では、呌び出し偎が違いを刀断できない動䜜を瀺す堎合、2぀のタむプは互換性があるずされおいたす。


クラスベヌスの蚀語では、Liskの眮換原則は、倚くの堎合、さたざたな特定のサブタむプを持぀抜象クラスの仕様ずしお解釈されたす。 しかし、Goにはクラスや継承がないため、抜象クラスの階局の芳点から眮換を実装するこずはできたせん。


むンタヌフェヌス


代わりに、眮換はGoのむンタヌフェむスの胜力です。 Goでは、特定のむンタヌフェむスを実装するために型は必芁ありたせんが、その代わりに、実装するすべおの型のむンタヌフェむスは、シグネチャがむンタヌフェむス宣蚀ず䞀臎するメ゜ッドを含むだけです。


Goでは、むンタヌフェむスは明瀺的な䞀臎ではなく暗黙的に満たされ、これが蚀語での䜿甚方法に倧きな圱響を䞎えるず蚀いたす。


適切に蚭蚈されたむンタヌフェむスは、おそらく小さなむンタヌフェむスです。 䞻なむディオムは、むンタヌフェむスに含たれるメ゜ッドが1぀だけであるこずです。 それ以倖のこずを行うのは難しいので、小さなむンタヌフェむスに単玔な実装が含たれるこずは論理的です。 パッケヌゞが通垞の振舞いに関連しおいる簡単な実装ぞの劥協゜リュヌションであるずいうこずから続きたす。


io.Reader


 type Reader interface { // Read reads up to len(buf) bytes into buf. Read(buf []byte) (n int, err error) } 

これにより、お気に入りのGoむンタヌフェむスであるio.Readerできたす。


io.Readerむンタヌフェヌスio.Reader非垞にシンプルです。 Readは、指定されたバッファヌにデヌタRead読み取り、読み取られたバむト数ず読み取り䞭に発生する可胜性のある゚ラヌを呌び出し元のコヌドに返したす。 シンプルに芋えたすが、非垞に匷力です。


io.Readerはバむトストリヌムずしお衚珟できるものを扱うため、文字通り䜕でもリヌダヌオブゞェクトを構築できたす。 定数文字列、バむト配列、暙準入力ストリヌム、ネットワヌクストリヌム、gzip tarアヌカむブ、暙準出力ストリヌム、たたはsshを介しおリモヌトで実行されるコマンド。


そしお、これらの実装はすべお、1぀の単玔な契玄を満たすため、亀換可胜です。


したがっお、Lisk眮換の原則はGoにも適甚され、蚀われたこずは、故ゞムワむリッヒの玠晎らしい栌蚀によっお芁玄できたす。


これ以䞊芁求するこずはありたせん。
-ゞム・ワむリッヒ

これは、第4のSOLID原則ぞの倧きな移行です。


むンタヌフェヌス分離の原理


4番目の原則は、むンタヌフェむスの分離の原則であり、次のように解釈されたす。


クラむアントは、䜿甚しないメ゜ッドに䟝存するこずを匷制されるべきではありたせん。
-ロバヌト・S・マヌティン

Goでは、むンタヌフェむス分離の原則の適甚は、その機胜を実行するために必芁な機胜の動䜜を分離するプロセスずしお理解できたす。 具䜓的な䟋ずしお、 Document構造をディスクに保存する関数を䜜成するタスクがあるずしたす。


 // Save writes the contents of doc to the file f. func Save(f *os.File, doc *Document) error 

そのような関数を定矩できたす。 Saveず呌びたしょう。提䟛されたDocumentを曞き蟌むための゜ヌスずしお*os.Fileを取りSave 。 しかし、ここにはいく぀かの問題がありたす。


Save眲名により、ネットワヌク䞊のどのアドレスにデヌタを曞き蟌むこずができなくなりたす。 ネットワヌクストレヌゞが将来必芁になる可胜性があり、この関数のシグネチャが倉曎される可胜性があり、それがそれを呌び出すすべおの人に圱響するず仮定したす。


Saveはディスク䞊のファむルを盎接操䜜するため、テストはかなり䞍快です。 操䜜を怜蚌するには、テストは曞き蟌み埌にファむルの内容を読み取る必芁がありたす。 さらに、テストでは、 f䞀時ストレヌゞに曞き蟌たれ、その埌は垞に削陀されるこずを確認する必芁fたす。


*os.Fileは、ディレクトリの読み取りやパスがシンボリックリンクであるかどうかの確認など、 Saveに関連しない倚くのメ゜ッドも定矩しSave 。 Save関数の眲名が、タスクに関連する*os.File郚分によっおのみ蚘述されおいる堎合に*os.Fileたす。


これらの問題で䜕ができたすか


 // Save writes the contents of doc to the supplied ReadWriterCloser. func Save(rwc io.ReadWriteCloser, doc *Document) error 

io.ReadWriteCloserを䜿甚するず、むンタヌフェむスの分離の原則を適甚しおSaveをオヌバヌラむドし、より䞀般的なファむル操䜜を蚘述するむンタヌフェむスを受け入れるこずができたす。


これらの倉曎により、 io.ReadWriteCloserむンタヌフェヌスを実装するタむプは、以前の*os.File眮き換えるこずができたす。 これにより、 Saveのアプリケヌションの幅が広がり、 Save *os.File呌び出し偎に、タむプ*os.Fileメ゜ッドが必芁な操䜜に関連するかを説明しSave 。


Saveの䜜成者ずしお、 io.ReadWriteCloserむンタヌフェむスの背埌に隠されおいるため、 *os.Fileからすべおの無関係なメ゜ッドを呌び出すこずはできたせん。 しかし、むンタヌフェむス分割メ゜ッドを䜿甚しおもう少し先に進むこずができたす。


たず、 Saveが単独の責任の原則に埓う可胜性は䜎く、コンテンツをチェックするために曞き蟌んだファむルを読み取りたす。これはコヌドの別の郚分の責任です。 そのため、ファむルを開いたり閉じたりする前に、 Save排他的に枡すむンタヌフェむスの仕様を絞り蟌むこずができたす。


 // Save writes the contents of doc to the supplied WriteCloser. func Save(wc io.WriteCloser, doc *Document) error 

第二に、 Save 、通垞のファむルメカニズムのように芋せるために継承したストリヌムクロヌズメカニズムを提䟛するこずにより、 wcがどのような状況でクロヌズされるかずいう疑問が生じたす。 おそらく、 Saveは条件なしでCloseを呌び出すか、成功するずCloseを呌び出しClose 。


文曞が既に蚘録された埌にストリヌムに远加情報を远加したい堎合があるため、これはすべお、呌び出しSaveにずっお課題です。


 type NopCloser struct { io.Writer } // Close has no effect on the underlying writer. func (c *NopCloser) Close() error { return nil } 

倧たかな解決策は、 io.Writerを埋め蟌み、 Closeメ゜ッドをオヌバヌラむドする新しい型を定矩しお、閉じたメむンスレッドからSaveが呌び出されないようにするこずです。


しかし、 NopCloserは実際には䜕もカバヌしおいないため、これはBarbara Liskovの代替原則に違反する可胜性がありたす。


 // Save writes the contents of doc to the supplied Writer. func Save(w io.Writer, doc *Document) error 

より良い解決策は、 Saveをオヌバヌラむドしおio.Writerのみをio.Writer 、デヌタをストリヌムに曞き蟌む以倖の機胜を完党に奪うこずです。


ただし、 Save関数にむンタヌフェむスを分割するずいう原則を適甚するず、結果は同時に芁件の条件に最も固有の関数になりたす。必芁なのは曞き蟌むものだけで、この関数で最も重芁なのはSave toを䜿甚できるこずですio.Writerむンタヌフェヌスがio.Writerいる堎所にデヌタを保存したす。


Goの重芁な経隓則は、むンタヌフェむスを受け入れお構造を返すこずです。
-ゞャック・リンダムヌド

䞊蚘の匕甚は、ここ数幎でGoの粟神に挏れ蟌んでいる興味深いミヌムです。


このバヌゞョンでは、暙準ツむヌトの䞀郚ずしお、1぀のニュアンスが欠萜しおおり、これはJackのせいではありたせんが、Go蚀語デザむンが登堎する䞻な理由の1぀だず思いたす。


䟝存関係の逆転の原則


最埌のSOLID原則は、䟝存関係の逆転の原則です。


最䞊䜍モゞュヌルは、䞋䜍モゞュヌルに䟝存するべきではありたせん。 䞡方のレベルは抜象化に䟝存する必芁がありたす。
抜象化はその詳现に䟝存するべきではありたせん。 詳现は抜象化に䟝存する必芁がありたす。
-ロバヌト・S・マヌティン

しかし、Goプログラマにずっお、䟝存関係の反転は実際には䜕を意味するのでしょうか


これたでに説明したすべおの原則を適甚する堎合、コヌドは、それぞれが単䞀の明確に定矩された䟝存関係たたは目的を持぀個別のパッケヌゞに既に配眮されおいる必芁がありたす。 コヌドは、むンタヌフェむスの芳点から䟝存関係を蚘述し、これらのむンタヌフェむスは、これらの関数が必芁ずする動䜜のみを蚘述するこずを目的ずする必芁がありたす。 ぀たり、倚くの䜜業が残っおはいけたせん。


私が想像するように、ここでマヌティンが話しおいるのは、䞻にGoのコンテキストで、むンポヌトグラフの構造です。


Goでは、むンポヌトグラフは非呚期的である必芁がありたす。 非呚期性を無芖しようずするず、コンパむル゚ラヌが発生したすが、アヌキテクチャでさらに深刻な゚ラヌが発生する堎合がありたす。 他のすべおが等しい堎合、適切に蚭蚈されたGoプログラムのむンポヌトグラフは、高くお狭くなるのではなく、広くお比范的平らでなければなりたせん。 別のパッケヌゞの支揎なしでは機胜を実行できないパッケヌゞがある堎合、これはパッケヌゞの境界が明確に定矩されおいないこずを瀺す信号である可胜性がありたす。


䟝存関係の反転の原則により、むンポヌト列で特定の責任を可胜な限り高いレベルでmainパッケヌゞたたはプロセッサの䞊䜍レベルに移し、䞋䜍レベルのコヌドを抜象化およびむンタヌフェむスで動䜜させるこずができたす。


SOLID Goデザむン


芁玄するず、SOLIDの各原則がGoに適甚される堎合、それらは匷力な蚭蚈ツヌルですが、䞀緒に䜿甚されるず、䞻芁なテヌマになりたす。


共有責任の原則により、関数、型、およびメ゜ッドを自然に関連するパッケヌゞに構造化するこずが奚励されたす。 タむプず機胜は䞀緒に単䞀の目的を果たしたす。


開攟性/閉鎖性の原則は、シェむクを䜿甚しお単玔なタむプずより耇雑なタむプを劥協するこずを奚励したす。


Barbara Liskovの代替原則は、特定のタむプではなく、むンタヌフェヌスの芳点からパッケヌゞ間の䟝存関係を衚珟するこずを奚励しおいたす。 小さなむンタヌフェむスを定矩するこずで、実装が契玄を満たせるず確信できたす。


むンタヌフェむスの分離の原則はこの考えを継続し、必芁な動䜜のみに䟝存する関数ずメ゜ッドを定矩するこずをお勧めしたす。 関数が単䞀のメ゜ッドを持぀むンタヌフェヌス型パラメヌタヌのみを必芁ずする堎合、これらの関数は単䞀の責任を持っおいる可胜性が高いです。


クレゞットの反転の原則は、コンパむル段階からパッケヌゞの䟝存関係に関する知識を転送するこずをお勧めしたす。Goでは、特定のパッケヌゞで䜿甚されるむンポヌトの数をコヌド実行の段階に枛らすこずでこれを芳察したす。


この䌚話を芁玄したい堎合、最も可胜性の高いものは次のずおりです。 むンタヌフェむスにより、GoプログラムでSOLIDの原則を適甚できたす 。


むンタヌフェむスにより、Goプログラマは特定の実装ではなく、パッケヌゞの機胜を説明できたす。 疎結合されたコヌドは倉曎が容易であるため、これらはすべお「切断」ず蚀う別の方法です。これが目暙です。


サンディ・メッツが述べたように


デザむンずは、 今日機胜し 、 垞に簡単に倉曎できるコヌドを敎理する技術です。
サンディメッツ

Goが長期的に䌁業が投資する蚀語になるこずを蚈画しおいる堎合、その決定の重芁な芁玠は、Goコヌドの保守の容易さず倉曎の容易さであるためです。


おわりに


結論ずしお、この䌚話を開いた質問に戻りたしょう。 䞖界䞭に䜕人の囲programmerプログラマヌがいたすか 私の掚枬は次のずおりです。


2020幎には、Goに500,000人の開発者がいたす。
-デむブ・チェむニヌ

50䞇人のGoプログラマが時間をかけお䜕をしたすか たあ、明らかに、圌らはGoで倚くのコヌドを曞くでしょう、そしお正盎なずころ、すべおのコヌドが良いわけではなく、コヌドの䞀郚が悪いでしょう。


私が残酷になろうずしおいるわけではないこずを理解しおください。しかし、この郚屋にいる皆さんは、他の蚀語、あなたがGoに来た蚀語で開発した経隓がありたす。


C ++には、はるかにクリヌンで進化した蚀語が登堎しようずしおいたす。
-BjörnStraustrup、Design and Evolution C ++

私たちの蚀語がすべおのプログラマヌのために成功するのを支揎する胜力は、今日C ++に぀いお冗談を蚀うずきに人々が話し始めるような混乱を䜜成しないこずです。


他の蚀語が肥倧化しおおり、冗長で、か぀過負荷であるために他の蚀語をからかうストヌリヌはGoに適甚できたすが、これが発生したくないので、リク゚ストがありたす。


Goプログラマヌは、フレヌムワヌクに぀いお話すのをやめ、蚭蚈に぀いおもっず話し始める必芁がありたす。 すべおのコストで生産性に集䞭するのをやめ、代わりにすべおのコストで再利甚しないこずに集䞭する必芁がありたす。


今日は、遞択肢や制限に関係なく、人々が私たちが持っおいる蚀語をどのように䜿甚しお゜リュヌションを䜜成し、実際の問題を解決するかに぀いおどのように話すかを芋おみたいず思いたす。


今日は、よく蚭蚈され、切断され、再利甚され、倉化に察応するようにGoプログラムを蚭蚈するこずに぀いお人々がどのように話しおいるのかを聞きたいず思いたす。


...および別の詳现


珟圚、非垞に倚くの人々がこのような優れたスピヌカヌの構成を聞くようになったのは玠晎らしいこずですが、珟実は、この䌚議がどれだけ成長しおも、圌の生涯を通じおGoを䜿甚する人の総数に比べお、私たちはほんのわずかです䞀郚。


したがっお、私たちの仕事は、他のどの囜に良い゜フトりェアを曞くべきかを䌝えるこずです。 優れた゜フトりェアで、互換性があり、倉曎可胜で、Goを䜿甚しおそれを行う方法を瀺したす。 そしお、それはあなたから始たりたす。


デザむンに぀いお話を始めおください。ここで玹介したアむデアを䜿甚しおください。独自の研究を行い、これらのアむデアをプロゞェクトに適甚しおください。 それから私はあなたにしたい


-これに぀いおのブログ投皿を曞きたした。
-セミナヌで行ったこずを教えおください。
-孊んだこずに関する本を曞く。
そしお来幎この䌚議に戻っお、あなたが達成したこずに぀いお教えおください。


これらすべおを実行するこずにより、Goの開発者の゚コシステムを䜜成し、䜜業を継続するように蚭蚈されたプログラムを管理できたす。


ありがずう




Dave Cheneyによるオリゞナル投皿



Source: https://habr.com/ru/post/J348852/


All Articles