Study

SoftwareDesign-2021.01

特集1 Goプログラミングスキルレベルアップ

Go言語を使いこなすための、基本事項をまとめた特集です。

私は自分で言語選択できるときは、ちょっとしたスクリプトはもちろんバックエンドも Python でやってしまいます。そのため、これだけ市民権を得て今後もずっと残りそうなGo言語を、いまだにちゃんと使ってみたことがありません。

とはいえ、Go言語はいずれちゃんとできるようにしておかないとと思っています。Pythonは少人数、もしくは一人で何かを作るぶんにはシンプルで使いやすい言語ですが、大規模システムの一部を担当するみたいなときは、やはりつらいです。誰かが書いたブラックボックス気味のモジュールやクラスを使うと、動的型付けでは予期せぬ動作が増え、デバッグが大変になります。Pythonにもタイプヒントが導入されましたが、コンパイルはないので根本的な解決になっていません。

というわけで、Go言語は未経験で直近では使う予定もありませんが、頑張って読んでみました。

  • 1章 型とインターフェース
    言語共通の一般的な内容、アクセス修飾子の仕様がすこし特徴的だが、考え方はPythonと一緒。_がCaseに変わっただけ
  • 2章 入出力
    標準パッケージのioパッケージについて。Read,Write,Closeなど一般的な内容
    Copy関数、一時ファイルやディレクトリ用の関数があり、この辺は馴染みないかもしれない。とりあえず存在だけ知っていれば良さそう。使うときになったら読み返せばOK。
    ファイルシステム抽象化を扱うfsパッケージがある。Ver1.16から導入される。どういうときに必要になるのか、よくわからない。
  • 3章 ゴルーチンとチャンネル
    ゴルーチン: Goのウリのひとつ、並行処理を簡単にかける考え方
    チャンネル: 複数のゴルーチンからのデータ競合回避の機能
    読む前は、並行処理が簡単に書けるからGoを採用する、これを使わないならGoを選択する意味はないぐらいに思っていたが、ゴルーチンは多用すると意図が伝わらないコードになりやすいので、使うのは必要最低限に抑えるべきとのこと
    この章はコードを見る限りシンプルなものばかりだったが、読むだけじゃピンとこなかった。実際に使うときに、改めて読み直す必要あり。
  • 4章 コンテキスト
    コンテキストパッケージ: 複数のゴルーチンからなる処理の一貫性(途中でキャンセル処理され場合など)を担保するためのパッケージ
    deadline,done,err,valueからなり、考え方はシンプルそうだが、ここも完全に理解するには手を動かしながら。
  • 5章 ポインタ
    Goでは実体とポインタを使い分けることができる
    メモリ確保時のスタック/ヒープは意識しなくて良い? 最適化してくれる?
    参照渡しがあるので、コピーコストを抑えることができる
    使い分け
    複数の変数から値を共有したい -> ポインタ
    複数の変数から参照を共有されたくない -> 実体
    nullの概念がある -> ポインタ
    unsafe.Pointer
    ポインタ型にキャストできる
    使用シーンの一例: string -> []byte の変換でコピーによるパフォーマンス低下を抑えたいとき
  • 6章 エラーハンドリング
    他の言語と違い、例外がない
    関数の戻り値に、ビルトインのerror型を定義する
    → 特殊な考え方だけど、使いやすそうに見える。ハンドリングの例がいくつかあったので、Goでがっつり何を作る必要が生じたら見直す必要がる。

特集2 良いレビューを行う技術

おそらく多くの技術者がそうであるように、私もレビュー文化は嫌いです。特にレビューする側には、できるだけなりたくありません。

レビューはとにかく工数がかかります。そしてこの工数が、レビューが目的である品質の担保に結びついているかと言われると、はっきり言ってNoです。なのでレビューは避けるにこしたことはないと思っています。

そのレビューについて、問題点を提起し、改善策をだしたのが本特集になります。

内容的には、まあわりとよく聞く話で、問題点として上がっているのは、

  • レビューの工数がかかりすぎる
  • レビュアーが少ない

などで、これに対して、レビュー文化は組織の問題なので全体でレビューの目的やルールを共有するといった内容が説かれ、その後に効率的なレビューの仕方やレビュー依頼のしかたなどが書かれています。ただ、プルリクの粒度やコミットのコメントのルールなどには言及されていません。

全体を読んだ感想ですが、よくまとまってはいますが、結局は理想論かなというところが正直なところです。本特集にも明記されていますが、レビューは組織全体で取り組むべき課題なので、個人で改善できることはたかが知れています。プロジェクト参加者全員に、この特集を読んでおけと言って、その上でルールや方針を策定できればいいんですけどね。

レビューを自発的に取り入れている自社開発はともかく、受託開発などは納品条件だから仕方が無くレビューを取り入れているということがほとんどです。そんなモチベーション下で、上記のようなことできるはずないですしね。。。

その他の記事

  • VSCodeチートシート
    切り取り式のVSCodeチートシートが付いていた。
    とりあえず切り取った。暇な時に目を通してみるかなー?

  • MDS(MySQL Database Service)
    MySQL公式のクラウドのDBサービスであるMDSについて。
    流し読み。RDSでなくMDSを採用するケースが思い浮かばない。必要になるか余裕があるときに読む。
    Auroraより高速で安いらしいので、プロジェクトによっては使うときがくるかもしれない。

  • AIチャットボット
    今月号からAIチャットボットの開発チュートリアルが始まった。今月はチャットボットの簡単な紹介といった感じ。
    チャットボットは個人的に興味がある分野なので、そのうち、実際に手を動かしたいと思っている。
    今月は忙しくてできそうにないが、来月以降で時間を見つけて、本書を読み返しながらハンズオンしようと思う。

  • ディープラーニングの連載
    今月はCNNの基本理論。今は機械学習に携わっていないので、読んでいない。

  • DevOpsの連載
    今月はSSHポートフォワーディングについて。
    図を見ただけ。基本すぎて今更読みたい内容ではなさそう。

  • アルゴの連載
    まだ読んでない。来月号までには読む。

  • Ansibleの連載
    読んでいない。Ansibleは前職で使っていたが、あまり好きじゃない。必要になったら読み返す。

  • Vimの連載
    読んでいない。Vimは、メインエディタとしては使っていない。

  • Rustのネットワークプログラミングの連載
    今月から始まった連載。
    とりあえず流し読みしたが、Rustのハンズオンを通して、OSレイヤを理解しようという趣旨の連載っぽい。
    Rustはこの先残る気がしないし、ネットワークプログラミングもあまり興味のない分野なので、正直微妙な企画。

  • ルータの連載
    読んでない。今はルータはほとんど触る機会ないし、ネットワークエンジニアの基本事項過ぎて読む気が起きない。結構忘れている内容も多いが・・・