天の月

ソフトウェア開発をしていく上での悩み, 考えたこと, 学びを書いてきます(たまに関係ない雑記も)

実践ソフトウェアエンジニアリングが自分にとって良著だった

実践ソフトウェアエンジニアリングを読んだのですが、これが個人的にはかなりヒット作だったので、魅力的に感じたポイントと自分がどのような読み方をしたか、書いていきます。

www.ohmsha.co.jp

2021/12/12現在、Amazonからだと3,000円近く高い価格で、ご注意です。

本を読んだきっかけ

明確な記憶ではないのですが、たしかアジャイル札幌のdiscordサーバで本書が紹介されているのを見て、興味が湧いたので購入しました。(「ソフトウェア技術者なら、この財産を活用しない手はない」という、榊原さんの力強い帯の言葉に惹かれたのと、ソフトウェアに関する体系的な知識不足を解消したいという想いがあり、購入しました。)

自分が本書をどう読んだか

まず、目次を一通り確認してどのような内容が書かれているかの見当をつけました。
目次を見たところ、各章にまとめとspecial trainingがついているのが分かったので、全章のまとめをまずは読み返しました。

その後、各章のspecial trainingの問題に一通り目を通して、自身がその章についてどれ位理解できているか?を確認していきました。ここまでを休日1日(と言っても実質半日くらいの時間)かけて実施しました。

special trainingである程度各章ごとの理解度を把握できた後は、各章を冒頭から読んでいきました。ある程度理解ができていそうな章については、頭がある程度疲れていても読めそうな気がしたので、平日の夜に、1日あたり2~4章くらいのペースで読んでいきました。
理解が浅そうな章については、朝仕事を始める前の時間で、1日あたり1~3章くらいのペースで読んでいきました。
また、丁度仕事で悩んでいた問題とリンクしていた部分もあったので、このような章は仕事中も読んでいました。

こうして、大体1週間くらいで全章を読み終えました。その後は、理解が浅かった部分や仕事で使えそうな部分について、現在進行形で精読をし直しています。

本書の何がよかったか

(分量のわりに)読みやすかった

1ページあたり小さい字+図でびっしり詰まっていて、これが500ページ以上あるため、なかなか読むのが大変そうだと思っていましたが、想像をはるかに超える読みやすさでした。
豪華な訳者陣の方々が読みやすいように翻訳してくださったのが一番大きかったと思うますが、章ごとに用意されていたまとめやspecial trainingだったり、章が細かく区切られていたので、1章だけを読むのはそこまで大変でなかったことが理由としてあったのかな、と思います。

ソフトウェアの基礎が学べる

この一年間は、ソフトウェア開発を少しでも上手にできるようになりたいという想いから、色々な学問に手を出し、色々な人の話を聴いて、どうしたらソフトウェア開発が上手くできるようになるか?どうしたら現場が少しでも良くなるのか?をがむしゃらに考え続けてきました。

そんな中で本書を読んだこともあり、自分の知識の混乱具合や基礎知識の抜け漏れに気が付くことができました。
例えば、LCOM(Lack of Cohesion in Methods)やSMI(Software Maturity Index)などはソフトウェアの品質を測るメトリクスの一つとして概念的には知っていたものの、これらがテストにおけるメトリクスとして有用なのか?メンテナンスにおけるメトリクスとして有用なのか?などは本書を読むまで全然意識できていなかったですし、かなりの頻度で顧客から要求を受けて要求分析をしていたのに要求エンジニアリングに書かれている自由質問や、標準的に効果的とされている要求収集の方法をぜんぜんしらなかったり、といったのが実例です。

また、殆どなにも勉強していなかった部分(例えばUX設計やソフトウェアセキュリティエンジニアリングなど)については、エントリーポイントとして基礎概念を整理できて、これも有意義でした。

現場で必要なことをがむしゃらに学ぶというのも大事だとは思いますが、定期的に本書のような知識を体系的にまとめたものにアクセスして学んだことを整理する、というのも今後一定間隔で入れていきたいです。

一般的な知識⇔現場で使える実践知識の紐づけがしやすい

Special Trainingや注釈・豊富な参考文献のお陰で、実践的な知識への昇華や現場で実践していることが一般的にはどのような知識として整理されているのか、というのが理解しやすかったです。

Special Trainingでは、

コンポーネントは定義の難しい言葉である。まず一般的な定義を述べよ。次に、オブジェクト指向ソフトウェアや伝統的なソフトウェアそれぞれについて、より具体的な定義を述べよ。最後に、読者の慣れ親しんだ3種類のプログラミング言語について、どのようにコンポーネントを定義するのか説明せよ。

のような具合で、原理原則→読者それぞれのコンテキストに合わせた知識への昇華が求められますし、注釈や参考文献では、一般論について書かれる→注釈や参考文献でより具体的な実践例や詳細な概念説明へと案内され、これが一般的な知識⇔現場で使える実践知識の紐づけに効果的に作用したのかな、と個人的には感じました。

本書を読む時何に注意しないといけないか

全体を通して本当に良い本だったのですが、現場での実践的な知識がある程度ないと酔うのはきつそうな気がしました。(=教科書といいつつ、ソフトウェア開発はじめたてで読むような本ではない気がします)
海外では、学生が読んでいる本ということですが、自分が本書を研修終了後や1~2年目くらいの時に読んでも間違いなく挫折or頭でっかちな実践をしていたような気がしました。

おわりに

年末に差し掛かったタイミングで思わぬ良著に出会えて本当に良かったです。値段は高めですが、値段以上の価値が自分にとっては間違いなくありました。

今後数年間は、定期的に読み返すような本になりそうです。