Goプログラマーなら絶対ハマる100の落とし穴とその回避術、全部教えます!
引用元:https://news.ycombinator.com/item?id=43647880
レビューのやり方を説明したんだけど、PRベースでのやり方を試してくれなかったんだよねー。もっとスムーズなコラボがしたかったのにさ。Manningのコピーエディターが、Goのことも知らないのにgit使えてるのが謎すぎる。しかも、Googleドキュメント以外にAsciiDocも受け付けてるみたいだし。
>私がレビューのやり方を説明したんだけど、PRベースでのやり方を試してくれなかったんだよねー。“もっとスムーズなコラボがしたかったのにさ”
めっちゃ引き込まれる文章だね!ついついサイト見に行っちゃったよ。ところで、E-Readerでの表示は試した?サンプル見た感じ、画像とか色分けが多いからKindleだとちょっと厳しいかもねー。
ありがとー!最初はWebに特化してて、E-Readerは考えてなかったんだよね。でも、正式に本が出ることになったから、PDF版を優先して、rm2でテストするよ。
それ、マジでびっくり。オンラインレビューツールじゃなくて、直接asciidoc編集させられるとか古すぎじゃない?コードレビューみたいなソフトがもっと前からあると思ってたわ。Wordとかのコメント機能みたいなのが普通じゃない?
もし見てたらだけど、sync.Poolで固定サイズじゃないオブジェクト使うのはマジで問題の元だよ!Goのstdlibのsync.Poolの使い方見ると、固定サイズの tiered poolがいっぱいあるし、大きいサイズは捨ててるし。
>sync.Poolで固定サイズじゃないオブジェクト使うのはマジで問題の元だよ!“Goのstdlibのsync.Poolの使い方見ると、固定サイズの tiered poolがいっぱいあるし、大きいサイズは捨ててるし”
Goにメモリアリーナがあればよかったのにね。poolのユースケースはアリーナで綺麗に解決できたのに。
Goは1.22から実験的なアリーナAPIがあったよ。
でも、その実験は失敗したんだよね。もう終わった。
アリーナ、また削除されたみたい。
多分だけど、この記事ってGoのGCが generationalじゃないから、ほとんど(全部じゃないけど)存在してるんじゃないかな。
まあ、そうかもね。でも、世代別GCでも病的なくらいGCの挙動が悪くなることはよくあるよ。Poolとか手動でのメモリ管理は、常にそれなりに使い道があると思うな。
コピー編集の話だけど、2010年にManningのためにDocBookで本を書いたんだ。DocBookはXMLだから、開始/終了タグを別々の行にして、コンテンツを真ん中に書いたんだよね。HTMLドキュメントみたいにさ。コピー編集後、全部一行にされて返ってきた時はマジでブチ切れてプロジェクト放棄しかけたわ。全然変わってないみたいだね。今はセルフパブリッシングにしてる。詳しくはここ→https://ryanbigg.com/2015/08/my-self-publishing-success-stor…
もしかして勘違いしてる?XMLを手でフォーマットしたってこと?誰かがツールにロードして変更して保存しただけで、XMLなんて見てないんじゃない?XMLの見栄えなんて気にする人いる?
気にしなくていいってのが、そういう構文の大きな利点の一つだと思うけどね。もし何か理由があって気にするなら、フォーマットツールがあるじゃん。
だってこのケースでは、人間と機械の両方にとって読みやすいことが重要だったのに、レビュー担当者は前者を無視したんだもん。それならWordで書けばいいじゃん。
この本の形式は、ブッククラブにすごく向いてるね。経験者も初心者も交じってやってるけど、この本の間違いは良い議論のきっかけになるんだ。ベテランは自分が同じ間違いをした時の話とか、どうやって避けてきたかを話してくれるし、初心者は他の言語との比較をしてるよ。“fuzzingを使ってない”とか“errgroupを使ってない”とか、Goの紹介になってるミスもあるよね。
O’Reillyの著者だけど、著者は本の売り込みでつまずいたみたいだね。メールから始めるのが確実だと思うよ。私達も最初はメールだけだったし。後で詳細な提案書を提出したけど、そんなに大変じゃなかったよ。O’Reillyのツールも素晴らしいよ。git commitから本のフルバージョンを生成できるし。本の執筆は全部vimでやったよ。
良い例となるリポジトリはありますか?
彼らは自分たちのリポジトリをホストしていて、ビルドは彼らのシステムで行われるけど、レイアウトはすごくシンプルだよ。番号が振られたファイルがasciidocとかmarkdownとか、好きな形式で置かれてるだけ。
Manningの著者さん、こんにちは!この本はマジで最高だよ。数年前に読んだけど、すごく役に立ったし、良い情報を少しずつ得られるから、また読み返せるよね。今度またGoのプロジェクトを始めるから、また見直すつもりだよ。この本の良いところは、全部“実世界”の話って感じがするところ。著者がGoでたくさん開発してきて、どこに落とし穴があるか教えてくれるから、時間を節約できるんだよね!
この記事の著者はGoでたくさん開発してるんだなってわかるね! そういうプログラミング本って結構あるよね。しかも、だいたいバレる。 例のgoroutineのやつ(#63)について質問!コピペできないけど画像なんだよね。 詳細はこちら:https://100go.co/#not-being-careful-with-goroutines-and-loop…だよ。 本を書くだけじゃなくて、読者が新しい情報で混乱しないように、オンラインコンテンツも最新に保ってるの?しかも「もう当てはまらない間違いの一つ」って即答できるの?マジすごい。 もし続編を書くとしたら、単純に「間違い」を削除して「86個のGoの間違いとその回避方法」にする?それとも、もっと見つける? #633はタイプミスか説明が下手なだけだと思うよ。 問題は順番がバラバラになる“かもしれない”ことじゃなくて、共有メモリアクセスのタイミングで値が欠落したり重複したりすること。 質問の核心はそこ!リンク先(https://go.dev/blog/loopvar-preview)にも書いてあるけど。 それってJSのclosureとscopeの問題と同じじゃん。 100個のGoのミス、間違いなく1つ目だね。goroutineを使わなくても問題を示す方法はあったよ。ループ内でクロージャのリストを作って、ループが終わった後に同期的に呼び出すとかさ。そうすれば、全部同じ(この場合は最後の)iの値になるんだ。 #63は、適切な同期なしに複数のgoroutineを実行したときの実行保証の欠如についての話じゃないんだ。ループ変数とgoroutineに関するものなんだよね。 素敵な記事だね。特に付け加えることはないんだけど、ただupvoteボタンをクリックするだけじゃ足りない気がして。 自分の投稿がHNに載ってることに気づいた!どうもありがとう😊 全く同じことを書こうと思ってここに来た! ありがとうございます! >スイスで仕事をしてて、C++のレガシーコードベースをリファクタリングしてたんだ… Sensei’s Libraryに、Goで作られたミスのコレクションがあるよ:<https://senseis.xmp.net/?Mistakes> これって、言語じゃなくてボードゲームの話? 著者に言わせると、この本が「100 _ Mistakes and How to Avoid Them」シリーズの始まりなんだって。それがプログラミング言語をベースにした本の新しい道を開いたんだね。 DEからマジで色々学んだわー。ブログで10年くらい書いてたけど、ネットの記事って直接的じゃないと読んでもらえないじゃん?でも本は違う。読者はわざわざ買ってくれてるんだから、価値のある場所に連れて行くのがこっちの仕事。時間がかかってもいいわけ。 それはあなたの意見だよね、別にいいんだけどさー。ちょっと考え変わるか試させて。 >これは読者を導いて、期待値を明確にして、説明についてきてもらうため。 気にしないで。あなたの意見は理解してるよ。契約で最低ページ数があるんだよね。でも個人的には、ページ数増やせってプレッシャーは感じなかったな。 ソースコードにコメント追加するの、編集チームと仕事するなら、バージョン管理のないPDFとかWordファイルより全然マシ。 「でも、Timのレビューは他のレビュー全部合わせたのと同じくらい価値があったかも」…なのに、レビューについて何も教えてくれないのは残念。他のinputのscreenshotとか詳細さからするとね。 彼のレビューは300ページ以上の本にannotatedされたコメントなんだよ。彼のレビューをdeep divingしても、このセクションが良くなるとは思えない。 Goのミスで一番気になるのは、gc pausesとか、first-class named and default argumentsがないとか、exceptionsがないとか、subrange typesがないとか。 Genericsもうあるよ。 マジで。Go 1.0から1.18まで、10年も待ったけどね。 2年くらい前に読んだけど、マジでおすすめだよ。Josh BlochのEffective Javaみたいな雰囲気があるんだよね。 ここで挙げられてる例は間違ってるよ。Go 1.22からループ変数はイテレーションごとにスコープを持つから、この”壊れた”コードは決定的で正しいんだ。 時代遅れって言いたいんだよね。ここに書いたんだけど。 まだWindows 7をサポートしなきゃいけない業界にいるんだよね。最後にサポートされたバージョンは1.20だよ。時代遅れかどうかは相対的なんだよね。 今日コード書いたんだけど、新しい挙動に頼っちゃった。ちょっと後ろめたい気持ちになった。 それって2023年の問題なの?C#は2012年に似たようなの直した気がするけど。Goはまだ車輪の再発明を誇らしげにしてるの?しかも木製でシロアリだらけの? audibleでこの本を買ったんだけど(PDF版もあるって書いてあったから)、PDF版にはコードが少ししかなくて、本全体が入ってなかった。audibleの仕様だったらごめん。本のせいじゃないかもだし。聴くの楽しみにしてるよ。 もし本を出版することに興味があったら、連絡して何が障害になってるか教えてほしいな。メールアドレスはプロフィールにあるよ。何も売るつもりはないから、君が直面してる問題を理解したいんだ。 Goを学ぶことに興味がある身としては、これは素晴らしいね、ありがとう! 良い言語は、間違いの余地を残すべきじゃない。 でもさー、良い言語って実用的じゃなきゃダメじゃん?で、実用的なものって絶対ミスする余地があるんだよね。なんか矛盾してない? 最高のアプリケーションってバグがないことだよね。で、バグをなくすにはコードを一切書かないことしかない、マジレス。 ミスする余地がない言語なんて、人間には使えないっしょ。 それ、LLM agentに必要じゃん。 それって“良い”のほんの一面じゃん?どの言語にも落とし穴はあるし、多い少ないはあるよね。Goにも落とし穴はあるけど、元々置き換えるはずだった(C/C++)よりは少ないでしょ。ミスする余地がない言語には、読みやすさとか生産性とかの問題が出てくるし。Rustはそういう意味でより“ガチガチ”な気がする。 マジそれな。存在する言語ってクソなのばっかで悲しいわ。 >正直言うと、俺も結構インスピレーションの源だったんだよね! この場合は適切だと思うよ。だって彼はミスのインスピレーションの源だったんだから、自分を褒めてるわけじゃないじゃん。 本の中のミスのインスピレーションの源は自分だって言ったんだよ。言い換えると、俺自身がたくさんミスをして、それが本のセクションになったってこと。 ぶっちゃけ、彼が言いたいことわかってるか怪しいわ。もっとコメントを表示(1)
>著者は当時Goであんまり開発してなかったんだって。でも、それって別にその分野に詳しくなったり、本を書いたりするのに必須じゃないってことの証明だよね。
なんでよくある間違いがgoroutine限定なの?もしgoroutineを使わずにfunction closuresを作ったら、全部同じ’i’変数を参照するのかな?(たぶん、この間違いがgoroutineとセットになりやすいからだよね)。
著者が真剣に本に向き合ってるのが伝わるから、マジ尊敬する。Goを学ぶためじゃなくて、良い本を作るってどういうことかを知るために興味が出てきた。
僕の例はたぶんひどいと思う。Goの最近のアップデートのおかげで、もう当てはまらない3つの間違いのうちの1つだから。
コメントありがとう!めっちゃ嬉しい。
技術的な文章の例としてブックマークしたよ。教育とか教えるのってマジで難しいよね。何度も書き直して短くしたり、わかりやすくしたり…それって作品への愛だよね。完璧主義はほどほどにしないとね!
「このコードは順番に関係なく123を出力すると予想されるかもしれない」じゃなくて「正確に」か「順番に」と言うべき。
非同期実行でFIFOを想定するのって、初めて並行処理に出会う人が最初にやるミスだよね。
Go 1.22で挙動が変わったんだよね。
[1]: https://go.dev/blog/loopvar-preview
つまり、Goではforループの’i’変数は毎回同じ’i’を参照するってこと?closureが全部同じ’i’を参照するって気づかないミスだよね。
それとも、goroutine自体に変なルールがあるの?Goをほとんど書かないから気になったんだ。Go 1.22の変更は良いと思う。自分も同じミスをしそう。
値そのものじゃなくて、値への参照を扱ってるってこと。
すごく良い職場だよね。“Aを完全に新しいスタックで実装しよう”って決めて、しばらくしてから“あ…これは難しすぎる、まずい決断だった。別のを試そう”って言えるんだから。もっとコメントを表示(2)
でも、本って無駄なpaddingが多い気がするんだよねー。28語を120語にする例とかマジそれ。最初の段落とか意味なくね?「100 Go Mistakes」って本読んでる時点で、そのミスがよくあるってわかるじゃん。価値上がった?
コードの説明も不要だと思う。コードtrivialだし。コードの横にも説明あるし。やっと本題って感じ。
出版社はページ数稼がないと本の値段に見合わないって思ってるんだろうけど、マジ勘弁。
>最初の段落とか意味なくね?「100 Go Mistakes」って本読んでる時点で、そのミスがよくあるってわかるじゃん。価値上がった?
頻出ミスのレベルも色々あるからねー。これは多くの開発者が一度はやるミスだと思うよ。だから頻出だって強調するのはアリだと思うな。”
>コードの説明も不要だと思う。コードtrivialだし。
コードの意図は常に説明するって決めてるんだよね。5行でも、何を伝えたいか理解しやすくなるじゃん?”
>コードの横にも説明あるし。
横の説明は本のサイズに関係ないから、そのargumentは成り立たないね。読者がどこに注目すべきかhighlightするためにやってるんだ。”
本の値段を正当化するためじゃないよー。読者を導いて、期待値を明確にして、説明についてきてもらうため。そう捉えるのは自由だけど、それが理由じゃないよ。少なくとも俺の本はね。
それってブログでも同じじゃない?
誤解しないでね、The Little Schemerみたいなのが良いって言ってるわけじゃないし、ブログ版が最高だとも思ってないよ。でも、本のpaddingって存在するよね?
ちなみに、O’Reilly Learningであなたの本読んだけど、良い本だと思うよ。だからdisってるわけじゃないんだ。出版社disだよ。
むしろDEに、「just-in-case teachingよりjust-in-time teachingを優先しろ」って何度も言われたよ。章に役立たないセクションは削られた。「役立つかもしれない」程度じゃダメなんだって。
誰と仕事するか、どの出版社かってのもあると思う。Manningはフェアだったよ。
あと、copyeditorの件はマジで共感。
だからGo使わないようにしてる。もしくは、missing features(generics)が追加されるまで待つ。
>https://go.dev/blog/loopvar-preview
>https://100go.co/#not-being-careful-with-goroutines-and-loop…
でも、君の言う通り修正されたんだよね(100個の間違いのうち2つと一緒に)。もっとコメントを表示(3)
自分で自分を褒めるのは正直じゃないよね。誰か他の人に「彼はインスピレーションの源だ」って言うのが正直ってもんでしょ。