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

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

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

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

どう勉強したらいいか?

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

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

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

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

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

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

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

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

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

既存の汚いコードと戦う

コードは書いたら書きっぱなしじゃない、常に改善を繰り返していくものだ。設計についてもそうだ。複雑で手を出しにくい設計に修正を加えないといけない時、どう立ち向かうか?

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

関数型プログラミング

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

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

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

最後に

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

新元号「令和」

こんにちは。福岡です。

さきほど、新元号が発表されました。「令和(れいわ)」だそうです。エイプリルフールネタじゃなくて、本物ですよ。日本経済新聞社の記事のURLを張っておきます。

https://www.nikkei.com/article/DGXLASFL29HLH_Z20C19A3000000/

このブログ記事を書き始めたのが11時50分頃でしたが、「令和」でググると早速発表のWeb記事が上がってきたり、wikipedia.jp にもページが追加されたりと、皆さんとても素早いんですね。

さて、WebClass での新元号の対応・影響について念のため説明いたします。WebClass ではシステムとして和暦は使用していないので、元号の変更に伴う改修等は一切ありません。3月29日に v11.6.1 をリリースしましたが、その修正内容も再提出機能に関する不具合の修正など早めに適用いただきたい修正はありますが、和暦に関するものはありません。

ただし、コンテンツ等で先生や管理者の方が和暦を使用していた場合は、先生や管理者の方が用意した部分でもしかしたら調整したほうがいい点があるかもしれません。アンケートで和暦回答をさせるとか、でしょうか。

JaSakai/AXIES/IMS 合同カンファレンス 2019

こんにちは。福岡です。

しばらく間が空いてしまいました。年度末のこの時期は、あちこちでメンテナンス作業などがあって忙しい時期になります。

さて、今日は法政大で開催された「JaSakai/AXIES/IMS 合同カンファレンス 2019 (http://www.media.hosei.ac.jp/jasakai2019/)」にお邪魔してきました。オープンソースの Sakai、大学ICT推進協議会 (Axies) および標準規格のIMSの方々が集まってのカンファレンスで、ノートルダム大学の Learning Analytics についても紹介いただきました。私は聞いていただけですが、WebClass も学習の記録を分析活用するのには興味があり、規格実装や分析の実例について勉強させていただきました。

分析のソフトや動作速度の話など具体的なところも話に上がって面白かったのですが、やっぱりこういうのは、やってみないことにはわからないですね。行けるところから手を動かして試行錯誤してみたいと思います。

またオープンソースシステムの良し悪しについても議論がありました。

  • 実装が公開されていて自分たちで直せることは強みではありますが、あまり触ってしまうとアップデート等での保守が難しくなってしまう。
  • オープンソースといえども、影響力の強いコミュニティの方向性が機能に反映されやすい面はある
  • 研究室で開発したツールは、学生が卒業するとノウハウの多くが失われやすい

ということでした。大学である程度の規模で運用しているところは、やはり外部の運用会社とタッグを組んでいるケースは多そうです。Moodleもそんな話をよく聞きます。

WebClassはオープンソースではありませんが、運用するサーバのミドルウェアにはLinux, PostgresやApacheといったオープンソースツールを利用しています。また、連携では標準規格もいくつか対応しています。オープンコミュニティのいい面と、企業の製品・サービスの形でサポートした方がいい面とは、うまく組み合わせたり、刺激しあったりして共存していけたらいいなと思います。

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

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

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

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

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

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

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

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

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

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

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

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

今後

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

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

植物

こんにちは。福岡です。

開発チームの事務所では、3つの植物を育てています。1つは種類の名前がわからなくなってしまいました。

ペペロミア
種類がわからない
アイビー

ツルのアイビーが強いかと思いきや、去年にいちど枯らしてしまいました。土にカビがつく「うどんこ病」というのにかかったみたいで、水の管理が悪かったと思っています。お世話をしてくれているスタッフの希望で、再チャレンジのため鉢を買いなおしました。

緑があるのは気持ちがいいです。また、様子を見ながらお世話をして育てるのは開発やサーバの保守とある意味似ているところもあり、難しくも楽しくもあります。