ソフトウェア設計 勉強の手引き

この記事は弊社の後輩プログラマーを読者と想定して書いています。しかし一般的な内容でもあると思いますのでここに公開します。

なぜソフトウェア設計の勉強をしなければならないのか?

プロのプログラマーは、堅牢で、なおかつ要望を即座に実現するソフトウェアを構築するために、「プログラムの変更が容易である」状態を維持しなければならない。もう何十年も先達プログラマー達はそのためのノウハウを蓄積し、原理原則レベルまで抽象化して落とし込んでいる。これを学び体得することが、プロのプログラマーには必要である。

どう勉強したらいいか?

まず、設計スキルを完璧に身につけた!と言い切れる人は多分いない。プログラマーは皆、常に勉強し続けるのみである。設計スキルを向上させるための基本的な方法は、他人のコードや本で良い設計のエッセンスをインプットし、自分の書くコードにアウトプットする、これを繰り返すことである。
インプットの方法だが、まずは他人のコードを読む習慣があると良い。会社やサークルで、メンバーの書いたコードを読み、その設計の良し悪しについて話しあってみる。公開されているOSSはネット上に無数にあるので、興味があるプロジェクトを見つけてコードを読んでみる。できればOSSにコミットするコントリビュータを目指すといい。
設計に関する原理原則、体系だった情報を得るには、本を読むことになる。以下はどの資料をどういう順番で読むといいかを例示する。この通りに読まなくても、自分に合う本をピックアップして良いし、興味のあるところから取り組んでも良い。

レベル1. 何はともあれ読むべし

レベル2. 設計の原理原則を知る

設計の原理原則はプログラマーの教養であり、共通言語である。知らないと他の本が読みづらい。

レベル3. コードのテスト手法について知る

コードが正しく動いているかチェックするには?プログラマーは皆テストを「書いている」。それに伴い、テストをしやすいコードが良いコード、という指標が存在する。テストを書くとはどういうことか知らないといけない。

  • テスト駆動開発
    • テストファースト(コードより先にテストを書く)の手法をテスト駆動開発(TDD)と呼ぶ。テストしやすいコードを書きたいなら、最初にテストを書いてその通りに動作するコードを書けばいいじゃん、という考え方。(本当はもっと奥深い
    • テストを書くメリットを知るには、何より体感したほうが手っ取り早いと思うので、ステップバイステップで実際にテストを書くこの本を勧める。なによりテスト駆動開発の原典だし。
  • 自分の得意な言語、Webフレームワークで、テストを書く方法を調べてみる。
    • 例えばPHPなら、PHPの初心者向けの本で、テストについて記述のある本を探す。PHPUnitというライブラリを使うのが定番。
    • 例えばLaravel(PHPのWebフレームワーク)を使ったことがあるなら、Laravelのマニュアルや本にはLaravelでのテストの書き方を説明した章が必ずある。
  • 日本におけるテスト駆動開発の第一人者、@t_wada さんによる解説資料を読み漁る。

レベル4. オブジェクト指向をさらに深く知る

これ以降は、目的に応じて細分化していく。

既存の汚いコードと戦う

オブジェクトを改めて捉え直す:ドメイン駆動設計

関数型プログラミング

普段使っている言語とは異なる言語思想と文法を持つプログラミング言語を学ぶことで、その考え方の良い点を設計手法に反映できる。特に関数型プログラミングと呼ばれる思想は、最近勃興してきたプログラミング言語の基礎(の一部)として採用されている。既存のPHPのようなプログラミング言語でも、関数型プログラミングのエッセンスを活かした設計手法が存在する。

  • Elmで関数型プログラミングを学ぶ
    • ElmはWebアプリケーションを作るための関数型プログラミング可能な言語。
    • 関数型プログラミングに必要な厳選された文法・機能を備えているので、関数型プログラミングの学習のとっかかりとして使える。
  • Haskellで関数型プログラミングを学ぶ

とりあえずこんなところ。

最後に

この記事を書いている人ももちろん勉強の道半ばです。自分が書くコードの設計についてレビューでガンガン指摘してもらったり、話し合ったりしたいです。オススメの資料があれば教えてください。宜しくお願いします。

マニュアルサイトを作ります。

WebClassの マニュアルサイト を作ることにしました。WebClassの中でも新機能開発が盛んな学習記録ビューアの解説を中心に、内容を充実させている真っ最中です。
作成の目的は以下のようなものです。

  • Google検索から使い方を調べられるようにしたい
  • Webの特性をフルに活かした効果的なマニュアルにしたい
  • ユーザだけでなく社内でも活用できる
  • アクセス履歴から製品の改善に役立つ情報を見つける

それぞれ説明していきます。

Google検索から使い方を調べられるようにしたい

これまでWebClassのマニュアルは主にPDFで用意し、WebClassにログインしてダウンロードしていただく形で提供してきました。現代において、アプリやサービスについて何か情報を得たい時は、とりあえずGoogle等の検索サイトで検索する事が多いのではないでしょうか。WebClassのユーザーも例外ではなかったかと思います。実際にWebClassの情報を検索すると、ヘビーユーザーのかたが使い方を分かりやくすまとめたサイトが見つかったりします(ありがとうございます!😊 )。私たちもマニュアルサイトを通して、必要な情報を必要な時に見つけることができるような状況を作ります。

Webの特性をフルに活かした効果的なマニュアルにしたい

前述したように、これまではマニュアルをPDFで配布してきました。これをWebサイト化することで、段違いの表現力を期待できます。分かりやすいように情報をページに分割したり、リンクで関連する情報を相互に結びつけることができます。動画やアニメーションGIFも強力な武器になるでしょう。

ユーザーだけでなく社内でも活用できる

社内で情報共有するための資料はありますが、マニュアルサイトのようにユーザーも含めた多数の人が参照する状況にすることで、より情報の鮮度を保つ原動力になります。ユーザがマニュアルサイトを見ることで必要な情報をが得られる状況になれば、サポートコスト低減にも繋がります。

アクセス履歴から製品の改善に役立つ情報を見つける

マニュアルサイトにアクセスしてきたユーザーは、WebClassの画面だけでは分からなかった情報を探しにやってきています。アクセスが多いページや検索ワードから、WebClsasで迷いがちなポイントを知り、WebClassの改善に繋げていきます。

今後

マニュアルサイトを構築したばかりで、目的の達成にはまだ時間がかかりそうです。徐々にではありますが、内容を充実させていき、即時性の高いサポートを目指していきます。

余談ですが、マニュアルサイトを公開したのと同じ頃、ヘルプサイトの作り方 なんて本が出版されていました!今読んでいますが、すぐに活かせそうです。