読者です 読者をやめる 読者になる 読者になる

テストステ論

高テス協会会長が, テストステロンに関する情報をお届けします.

(go report) tsortを実装してみて気づいた/嵌ったことの共有

私はGoからしばらく離れられそうもない. 仕事におけるツール作りでも, 得意のRubyPythonよりGoを積極的に使っていけると良いと思う. やはり, 完全な自信のない言語を仕事に使うのはためらわれる. どんな問題が起こってもたぶん対処出来るというレベルの習熟度でないと, 場合によっては一週間単位で発狂することもある. 例えば私は, Rustを仕事で使おうとは思えない.

今日やったこと:

今後やること:

  • まず平安京ビューの実装をする. 土日を全部使えばたぶん届く. Goraphは整理を目的として現在rewrite中ということなので古いバージョンのものの上にまずは実装してみることとした. https://github.com/akiradeveloper/HeiankyoView-Go にプロジェクトを作ったので, 追ってみたい人は追うといい.

tsortは, もともとRustでやってたこともあって, 3Hくらいでざっくり全部書きましたレベルまでは行った. Rustのように, コンパイルを通すことが無理ゲーというものではなく, 分からないことはぐぐったら5分で分かる. Rustでは調べても分からないのでIRCで聞くことになるのとは大違いだ. 日本語のブログも山ほど見つかるし, 良質なものもあるので助かる. Golangはシンプルな言語なだけあり, 仕様の収束も早かったということもこのありがたさに貢献しているのだろう. 言語をシンプルにするという作戦がここでも活きている. GolangOSS戦略大勝利の典型例だ.


さて本題. tsortを実装してからデバグとなったが, これが苦労した. ググると原因はすぐ分かる. mapからvalueを取り出した場合, それはコピーなので, 再代入は無意味であり, コンパイラに弾かれるという意味だ.

https://groups.google.com/forum/#!topic/golang-nuts/6IaQ1H8ewMk

問題は分かったが, この仕様は設計に悩みを生んだ. これでは, 値として持つかポインタとして持つか設計が一意に決まらないではないか. これならばJavaPythonの方がマシだ. この問題は, mapのvalue型だけでなく, 関数の引数など, 広範に広まってしまっている. http://golang.jp/go_faq

混乱を生んでいる. 失敗だ. 実際私も, どう設計するのが最善か分からず, 試行錯誤するハメになった.

値かポインタかという話は, Rustでも共通しているので, たぶんどうしようもないことなのだと思うが, Rustではtsortの実装においてこの問題に嵌ることはなかったので, Goでは言語仕様がシンプルなだけであって, より敏感ということなのだろうと思う. http://doc.rust-lang.org/guide-pointers.html たぶんRustではこの類のバグはコンパイラが弾いてしまっている.


他には, OCamlと同じく, 言語が提供するライブラリはしょぼいなという印象を持った. flagというコマンド引数パーサもはっきり言ってしょぼい. 調べると, 他にも色々なものがしょぼいようであり, おれおれ実装がたくさん出来ている(loggerとか). 本丸が正式なライブラリをちゃんと提供しないから実装が乱立する問題は, OCamlで問題となり, その結果がCoreなのだが, これは必ずしも悪いこととは言えない. 色々なライブラリが作られて淘汰されて, 良いものが最後にwinnerとなるのはOSSとしては良い現象だ. もしかしたらこれも, GolangOSS戦略の一つであり, 我々はグーグルに踊らされてるだけなのかも知れない. もしかしたら, Pythonの反省であるのかも知れない.


ちゃんと動くプログラムを一つ作ってみると, 色々なことが分かる. go-coreutilsはまだ空きがたくさんある. みなさんもGoに興味があれば, 手を挙げて, 挑戦してみてはどうだろうか?私はTour of Goを昨日ちょろっとやって今日いきなり書けたのだから, みなさんもたぶんすぐに出来るはずだ.