僕は note で写真素材を販売していて、写真ファイルをサーバーに公開するときの一連作業を自動化するべく Python スクリプトを書きました。
長いこと使ってきて機能は満足していますが、新しい風を起こしたいな〜ということで、学習も兼ねて Go 言語(Golang)で書きなおすことにしました。
いったん作りきれましたので、開発を通して Golang に感じたことをお伝えします。
Golang は懐かしくて馴染む
「非常に懐かしい感じがあり、非常に馴染める言語」ってことです。僕、かなり好きかもしれません。 作り方や考え方が懐かしいんですよ。
・・・のお話をするために過去を振り返ります。
8 年間のアセンブリ言語経験
僕は 2000 年から 8 年間、JAL 国際線のシステム開発を担当していました。
開発環境は TPF という IBM のメインフレーム用の OS で、OS 上の z/TPF だったか z/VM だったかの中でアセンブリ言語を使っていました。デバッグするときはもちろん 16 進数の世界です。
アセンブリは人にはやさしくない言語ですが、IF 文や WHILE 文なんかも書けたので、ちょっとは人にやさしいものでした(笑)覚える命令は 30 個くらいしかなく(Golang も同じですよね)シンプルではあります。扱いは難しかったですが。
その甲斐あって、レジスタ、メモリとその管理、ポインタという概念なんかが自然と身につきましたね。
反面、オブジェクト指向な高級言語に最初は馴染めませんでした。お作法を知らなかったこともありますが、中でどんな処理が行われているか分からず、イメージできなかったからです。
というバックボーンが僕にはあります。
すると、Golang で書いているとなんだか懐かしい感覚になるんです。
Golang の懐かしいところ
1. ありそうなことでも実現するには組みあげる
現代の言語なら「〜〜な処理がしたい」と考えたとき、大抵はライブラリが整っていたりすることが多いでしょう。また、 print("hogehoge")
とすれば標準出力に hogehoge
と表示されますよね。
でも、TPF では表示するだけでひと手間かかりました。旅客データを取得するにも手続きが多く、めんどくさかったです。(のちに TPFDF という CRUD の操作が楽にできるものを使いまくってました。)
こういう点が Golang と似ているなと感じます。
Golang は「言語のコアをシンプルに、何かを実現するときはそのシンプルな機能を組み合わせて実現しよう」というのがコンセプトです。
たとえば FTP。
Python なら標準の ftplib がありますが Golang にはありません。「FTP したけりゃ、RFC を読んで自ら仕組みを構築するよろし」の世界です(笑)
「マジか」とびっくりしたものの、おかげで RFC というもので規定されていることや、接続を確立するまでに色々やっていること(handshake がどーたらこーたら)なんかを知るきっかけになりましたね。
世の FTP アプリのありがさが身に沁みます。
とはいえ、FTP を自作していたらいつまでもゴールには到達できないので、今回は jlaffaye/ftp を使わせていただきました。
2. エラーハンドリング
Golang はあらゆるところで err != nil
を書きます。めっちゃ書きます。
// os.Crateのエラーハンドリング f, err := os.Create("foo.txt") if err != nil { log.Fatalln(err) } // 遅延実行によるClose()のエラーハンドリング defer func(f *os.File) { err = f.Close() if err != nil { log.Fatalln(err) } }(f)
Python では try〜catch
と書くところでしょう。人によっては「めんどくさっ」と感じる方もいらっしゃるかもしれませんね。
ところが、これまた懐かしいんですよ。
前述の TPFDF を使っていたときなんかまさに ↑ こんなふうでしたもの。データ的・システム的なエラーが発生することを考慮し、エラーハンドリングしていました。単体テストめんどくさかったです。
Golang も同様にしつこいくらいやる文化ですね。いや〜懐かしい!
3. オブジェクト指向ではないけど「風」に書ける
Golang はオブジェクト指向プログラミング(OOP)ではありません。構造体やインターフェースを使えばそれっぽく書けますので、データとメソッドの結びつきがわかるっちゃわかります。
前述のスクリプトは Python を使ってきましたが、僕が OOP 的に組めているかというとまだ練習は必要でしょう(そこまで意識することはないでょうけどね)。
そんな自己評価のところ「Golang で書くと思考が楽だなぁ」と感じてしまうあたり、8 年間で培ったアセンブリ=手続き型は、良くも悪くも僕の基礎を形作っていると感じます。
Golang を使いこなすのはこれから
懐かしいけれど使いこなせるようになるにはまだまだこれからです。
でも何だか楽しいです。
JAL 時代にそれとなく入ってきた知識が、現代の CPU や OS、メモリ管理などの仕組みと(厳密には違うかもしれませんが)「同じように考えられるじゃん=イメージできるなら作れるじゃん」と腑に落ちましたし、そういう細かい内部的なことへの知識欲が膨れ上がりましたね。
おわりに
Golang は「構造体やインターフェースを使いこなしてなんぼ」という印象です。正直、2 週間程度ではここらへんの理解は浅いですね。Golang らしい書き方も知らないことが多いです。とても重要そうな io.Reader/io.Writer の仕組みも知っておきたい。
それらは Web や書籍などから他者のコードを読んで慣らしていければいいでしょう。
一気にすべてを知ることはできません。
ひとつひとつ知りながら経験していけばいいのです。
そのためにはまず何でもいいから作りきることが大切ですね。続けた結果、積み上がったものが経験になりますから。
※掲載した写真は東福寺周辺を SIGMA fp + NOKTON 40mm F1.2 Aspherical で撮影