2022年4~6月に読んだ本の振り返り

はじめに

6月までに読んだ本について軽く振り返っていきます。この3ヵ月はいつもよりも多く本を読むことができました。

達人に学ぶSQL徹底指南書

SQLの実践的な使い方を理解することができました。クエリに関する章は章末に練習問題がついており、より一層理解が深まった気がします。
普段はNoSQLを触ることが実務では多いので、そこを補うことができるよい一冊だと思いました。
SQLのパフォーマンスチューニングやコーディングスタイルについての章もあり、SQLについて幅広く学びを深めることができました。

アジャイルサムライ

アジャイルサムライはずっと読みたいと思っていた本だったので、すぐ読了することができました。ところどころにでてくる味わい深い棒人間がなかなかよかったです。
変化を受け入れ続けて、タイミングによって自らの役割を柔軟に変えて物事に対応していくことはとても大変だが、それを行うことができればプロジェクトが成功する確率が上がっていくことになることが分かりました。
プロジェクトにおいて絶対成功するということはないので、変化や不確実性を恐れずにやっていきたいと思いました。
そして、一番大事なのは「プロジェクトを自分事として捉える」ということだと感じました。
アジャイルにプロジェクトを進めていくためにはチーム全員が同じ方向を向いている必要があるということも感じました。

ソフトウェアアーキテクチャの基礎

この本は具体的にアーキテクチャについて網羅しているというよりは、アーキテクチャを決定するアーキテクトが会社の中でどのようにふるまい、どのようにアーキテクチャを制御していくかについての内容になっていると感じました。
やはり一番重要なのはソフトスキルだなと感じました。ハードスキルは比較的身に着けやすいものですが、ソフトスキルは本人が意識して変えていこうとしない限り伸びることはないし、成長を実感しにくいものだと思いました。
この本では「すべてはトレードオフ」という考えが特に押し出されており、これはソフトウェア開発のアーキテクチャだけに関するものではないなと感じました。
とはいえ、アーキテクチャスタイルの比較をしている章もあり、これまで雑な理解になっていたところを補える良い一冊でした。

LeanとDevOpsの科学 テクノロジーの戦略的活用が組織変革を加速する

この本はリーンとdevopsについてデータに基づいて説明されているので、データを基に物事を決めていくことが大事なのだなと再認識しました。
その中で特に、ほかのうまくいっている組織をただ真似をして自らのチームや会社に取り入れるのではなく、自発的に絶え間なく努力や投資をすることが必要であるということを学びました。
うまくいっている組織が行っていることをそのまま取り入れるだけではだめで自分たちにあったような形にしていくことが大切だということが分かりました。

SRE サイトリライアビリティエンジニアリング

いわゆるSRE本と呼ばれるSREのバイブル的一冊です。
SREという考え方はGoogle発祥で、Googleレベルの規模の企業だからこそ生まれたものではなく、すべてのプロダクトにおいて必要になっていることだと感じました。
ユーザーは一度でもコンテンツの表示が普段より遅いといったような不具合や嫌な経験があると離れてしまいます。しかも、その失った信頼を取り戻すのは簡単なことではないです。
そして、障害が発生したとしてもそれを学びの機会として捉えるといったような考え方はとても新鮮に感じました。
これも、LeanとDevopsの科学と同様で、ただGoogleの取組みをまねするのではなく、自分たちのプロダクトにあった形を探ることが大切だと思いました。

UNIXという考え方 その設計思想と哲学

UNIXの根底にある考え方を教えてくれる一冊でした。なので、UNIXだけに限らない話になっており学ぶことが多かったです。
その中で特にSmall is Beautifulという考え方が特に重要だと思いました。開発をしているときは、楽しくなったり、これもいるのでは?といったような衝動にかられ無駄な機能を作ってしまいがちです。
しかし、実際には10徳ツールより単体のドライバーの方が使い勝手がよかったりします。しかも、小さいプログラムは管理するのがとても簡単です。
なので、このSmall is Beautifulを肝に銘じていきます。

達人プログラマー(第2版) ー熟達に向けたあなたの旅ー

プログラマーやエンジニアとしてどのようにふるまっていくべきかを教えてくれる本でした。
とくによいと思ったのが「すべての問題をベンダー、プログラム言語、管理、同僚のせいにしてはいけません。(一部略)言い訳するのではなく、ソリューションを提供するのは他ならぬ「あなた」の役割なのです。」という部分です。
進撃の巨人みたいだなと思いました。

エンジニアのためのマネジメントキャリアパス テックリードからCTOまでのマネジメントスキル向上ガイド

この本を読むことで、技術職の管理者の役割をかなり詳しく知ることができました。
管理者ではなくても、どのような思考を持っていれば管理者に近づけるのかということを知ることができたのでとてもよかったです。
管理者に求められるのは人と向き合っていく姿勢だということも分かりました。 そして、何よりよかったのは、まず第一に「仕事の仕方」を覚えることと極力優秀な上司や指導者を見つけてそのもとで働き、仕事ぶりを観察して見習うことがエンジニアなりたての時は重要であることを知れてよかったです。
自分はこれまで焦りすぎて、すぐに結果を求めていたような気がします。「遠回りこそが俺の最短の道だった」ということですね。

おわりに

この3ヵ月は普段よりも多く本を読めてとてもよかったです。
本を読むスピードが上がったことに加えて、これまで以上に本を楽しんで読むことができているからだと思います。
まだまだ読みたい本は数えきれないほどあるので、読み続けていきます。
本を1冊読むと、そこから読みたい本が4,5冊増えていくので終わりはこなそうです。
次の3ヵ月では、主に経営やマネジメントに関わる本や、アーキテクチャ・設計に関する本を交互に読んでいきたいです。

2022年1~3月に読んだ本の振り返り

はじめに

2022年の1月から3月にかけて読んだ本についてまとめていきます。
この3ヵ月で合計5冊の本を読み切ることができました。
ペースとしてはいい感じだと思うので、続けていきたいです。
読んだ本のアマゾンのリンクも貼っておきますので、興味がありましたら読んでみてください。

Clean Arcitecture 達人に学ぶソフトウェアの構造と設計

設計のことを学びたいと思い、この本を購入しました。
これはボブおじさんとよばれているRobert Martineさんが書いており、有名なクリーンアーキテクチャについての本になっています。
表紙に「アーキテクチャのルールはどれも同じである!」と強めな言葉で書かれており、本当なのかと思いながら読み始めました。

読んでみたところ、アーキテクチャのルールがすべて同じというのは、最終的な技術決定を先送りにし、使っている技術に依存しきらないようにするということでした。
この考え方にはとても感銘を受けました。
他にも、今までなんとなくしか理解していなかった依存性の話もあり、すごい学びたかったものが詰まっておりよかったです。

今のインターン先ではクリーンアーキテクチャのような構成になっているので、実務を通して今後より理解を深めていきたいです。

プログラミングコンテストチャレンジブック

通称「蟻本」と呼ばれる言わずとしれた競技プログラミングに関する本です。
これは実は去年の夏ごろに買っていましたが、長らく積読の状態になっていました。
というのも、買った当時は内容が難しく感じ、途中で挫折してしまいました。
今回は意を決してすべて手を動かしながら学んでいきました。

競技プログラミングでバリバリ使いたいというよりは、アルゴリズムとデータ構造について詳しくなりたいという気持ちに切り替えたところ、うまく読み切ることができました。
これをきちんと読み切っていたので、先日のmercariの短期インターンシップで、Goで深さ優先探索をする機会があったときにパッと実装することはできませんでしたが、なんとか考えながら実装することができました。
今回も何度か挫折しそうになりましたが、読み切ることができてよかったです。完全には理解できていないので、もう1度読みたい本です。

エキスパートたちのGo言語

こちらは、中級以上のGoプログラマー(gopher)に向けた、ツール開発やプロダクト開発で必要とされるテクニックや周辺知識を学べる本になっています。 名前を知っている方が結構含まれていて、親近感を持ってよむことができました。
内容は中級以上を対象にしているだけあり、Goをどのように使うかというよりも、あるサービスやAPIをGoを使って便利 or 痒い所に手が届くようにすることを目的にした内容が多かったです。
とはいえ、序章としてGoの基本文法についての内容もあり、完全にGoの初心者を受け付けないものではなかったです。

なんだかんだまだ「みんなのGo言語」を読んでいないので、そちらをも読んでいきたいです。

応用情報技術者試験合格教本

応用情報技術者試験を受けようと思って購入しました。
内容は応用情報の出題範囲を細かいところまで網羅的に触れられるものとなっています。
図も結構入っていたので理解しやすかったと思います。
まだまだ知らないことはたくさんあるなと呼んでいて感じました。

この本を読み切るぐらいまではすごいモチベーションが高かったのですが、そこからどんどん下がっていきました...
この記事を書いている日に受験票が届き、さすがにあせりを感じてきたので過去問をきちんと勉強して、試験に臨みたいと思います...

理論から学ぶデータベース実践入門 - リレーショナルモデルによる効率的なSQL -

こちらは、本の題名の通り、リレーショナルモデルの話からはじまるRDBについての本です。
これを買ったきっかけは、普段の業務ではmongoDB, dynamoDB, redis, firestoreといったようなNoSQLに触れる機会がとても多く、RDBについての知識が薄いなと感じたからです。

前半はリレーションの話から、述語論理や正規化論理といった理論的な内容からはじまり、後半に進むにつれて実務で役立つ内容になっていきました。
自分にとって知識が薄い部分を学ぶことができたのでかなり良かったです。
まだ読み終わっていないので、ここには書いていないですがSQL関連の勉強のために、「達人に学ぶSQL徹底指南書」も現在読んでいます。

おわりに

この3ヵ月では幅広いジャンルの本をよみました。
次の3ヵ月では、アジャイルサムライやエンジニア組織論への招待といったような、マネジメントやスクラムに関する本を読んでいきたいと思っています。
近々、Oreilly社からGoに関する本がでるみたいなので、それもとても気になっています。
まだまだ読みたい本は山ほどあるので、当分は読む本に困ることはなさそうです。

mercariさんの「Online Spring Internship for Gophers2022」に参加しました

はじめに

3/14(月)から3/18(金)までの5日間、mercariさんの「Online Spring Internship for Gophers2022」に参加したので、それについて書いていきます。
インターンの中で学んだ技術的なことについてはすでにZennの方で「Go1.18からのWorkspace modeをさっそく使ってみた」というWorkspace modeについてまとめた記事を書いているのでそちらもぜひご覧ください。

1日目(集団講義)

まず1日目はtenntennさんによるGo1.18の新機能についての講義を1日かけて行いました。
資料がすでに挙げられているので興味があるかたは是非見てみてください。 内容としては大きく分けて

  • Generics(型パラメータ、型セット)
  • Fuzzing
  • Workspace mode

の3つについてになっていました。
この中ではGenericsがGoに与える影響が大きかったので、内容としてもGenericsが多めになっていました。
講義はまずGoがどのようなサイクルで開発とリリースを繰り返しているのかといったことや、どのようにしてコンパイラに手をいれずに新機能を試しているんかというところから始まりました。

そこからGenericsの話がはじまり、型パラメータと型セットについてときおりTRYという形式で理解できているのか実際にコードを書いて確認することができるようになっていました。
これがあることで、より自分のなかで理解を深めることができたと思います。

TRYの中では、木構造というところが自分は一番苦戦しました。
というのも、普段からガンガン深さ優先探索を書くということはしていなかったので、どの順で関数を実行して表示させるのかといったところに悩みました。
その辺のデータ構造やアルゴリズムといったところは自分の中で課題になっているので、これを機に普段慣れ親しんでいるGoを通して学んでいくのもおもしろそうだと感じました。

講義はremo上で行われ、チャットが常にオープンになっていました。それによって、参加者がコメントをしたりわからないことや気になることがあれば質問するといったことが可能になっていました。
自分はふだんからGoに関するいろいろな勉強会に参加していますが、今回のインターンの講義はその中でもかなりコメントが盛り上がっていた印象でした。

2日目(モブプログラミング)

2日目は4人1組のチームでのモブプログラミングを行いました。

モブプログラミングの課題は2種類ありました。1つ目はsync.Mapgenerics対応というものでした。
これはsync.Mapgenerics対応させてwrapperで包むというような実装で各グループ進めていました。チーム間のアイスブレイクを兼ねたものになっていたので1時間弱で全チーム実装できていたと思います。

2つ目のお題は

という2つから各チーム選ぶようになっていましたが、すべてのチームが競技プログラミングの方を選んでいました。

今回のモブプログラミングではドライバーに書いてほしいコードの指示をだして、ドライバーには特になにも考えずに言われたことだけをかいてもらうことができました。
というのも、前回モブプログラミングをした際はドライバーにエスパーして書いてもらったことが多く、あまりモブプログラミングらしいことができなくて、あまり得るものがなかったという経験がありました。
これのおかげで今回はチームでわいわいしながら開発をすすめていくことができました。わいわいやっていけたことで、詰まったときの議論もスムーズにできたと思います。
今回はドライバーの方に対して絶えず話しかけるというようにしたら、うまく書いてもらうことができたので、今後モブプログラミングをする機会があったらこれを継続していきたいです。

余談にはなりますが、モブプログラミングを通して、あらためてVS codeのLive Shareの便利さを感じました。
拡張機能をインストールとGithubMicrosoftのアカウントさえあれば使用できるため、使うハードルが低いです。
前回モブプログラミングを行った際は、役割を交換する際に毎度その時のドライバーがGithubにpushして、次のドライバーがそれをpullしてから自分の画面を共有するということをやっていたため、役割交換に時間がかかってしまっていました。
しかし、今回はLive Shareのおかげで役割交換は「次○○さんドライバーよろしくお願いします」と声をかけるだけでよくなったのでとてもよい開発体験ができました。

3日目,4日目(個人開発)

3日目と4日目は参加者がそれぞれGo1.18にまつわるOSSを開発しました。
自分はその中で、Go1.18の段階でFuzzingできる関数の一覧を表示するshowfuzzとFuzzingのひな形部分を生成するgofuzzgenという2つのツールを開発しました。 2つに分けてツールを作成した理由は、Go1.18からのWorkspace modeを使ってみたかったというところが大きいです。

個人開発の途中で詰まったり、OSSのアイデアが浮かばないといったときにメンターさんたちがお力を貸してくれるというようになっていたので、参加者全員が順調に開発できていたと思います。

また、3日目も4日目も基本的に参加者はremoの会場にいるようになっていました。
なので、すこし疲れた時や、ちょっと雑談したいときなどはチームのメンバーと話すことができたのでとても楽しく開発ができました。

この2日間で完成させることが目的ではなく、OSSを自ら開発してそれを管理していくきっかけを与えることが目的と言う話だったので今後も開発を続けていきたいです。

5日目(成果発表会&懇親会)

5日目には、3日目と4日目で開発したOSSについてそれぞれ発表会で発表しました。
ほかの参加者の多種多様なアイデアに触れることができたので、勉強になりとても面白かったです。
1日目の講義と同様にチャット欄が盛り上がっており、オンラインでの開催ではありながらも孤独感を感じずに発表することができました。

すべてが終わった後に、懇親会がありました。
懇親会ではチームを越えてほかの参加者とお話することができたので、とても有意義でした。
ちなみに懇親会もremo上で行われました。remoの強制席替え機能には驚かされました。

全体を通しての感想

一番は楽しかったということです。
というのも、インターンシップの5日間を通して自分と同年代のエンジニアとともに自分が今一番気に入っているGoについて学べたからです。
普段のインターンではフルリモートということもあり、同年代と関わる機会があまりないのでとても新鮮でした。
そして、Go1.18の新機能を本リリース前から手を動かして学ぶことができたのもとてもよかったです。
今回のインターンで学んだことを、これからの開発に生かしていきたいです。