僕は note で写真素材を販売していて、写真ファイルをサーバーに公開するときの一連作業を自動化するべく Python スクリプトを書きました。

長いこと使ってきて機能は満足していますが、新しい風を起こしたいな〜ということで、学習も兼ねて Go 言語(Golang)で書きなおすことにしました。

機能的には満たせているものの、Testing package によるテストや CLI としてビルドするのはこれからです

いったん作りきれましたので、開発を通して 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 を使わせていただきました。

2022 年 6 月現在、FTPS を実現しようとするとエラーとなるため、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 で撮影

CLI 開発中に参考にしたものリスト

この記事を書いた人

花村貴史|Takashi Hanamura

◆Photographer|木漏れ日や水、空が魅せるきらきらが好き|写真を通じて「やさしい世界」を伝えてゆく ◆Software Engineer|Private: Go/C++/WebGL|Work: SAP/SAC

写真素材note発売中

継続課金マガジンで販売しています。ブログに載せるもOK、壁紙に設定するもOK、使い方は自由です。フリー素材も良いけれど、人と被りたくないという方に人気です。

人物写真|Photo Session

お話しながらのポートレイト撮影です。「今」そして「これから」のあなたにフォーカスして撮影します。SNSやサイト用のプロフィール写真に。

イベント写真|Photo Shooting

「友達と楽しんでいる」「セミナーで講演している」「パーティーを主催している」など、皆さんが大切な時間を過ごしている瞬間をスナップします。