プログラム設計は何のためにするの?
良い設計はどうしたらできる?
こんな疑問にお答えします。
ネイチャーエンジニアの亀田です。
僕は10年ほど会社員エンジニアを経験したのち、フリーランスとして独立して2年ほど経験しました。
僕も多くのプログラム設計を経験してきましたが、設計は何のためにするかというと、ズバリ、
開発・運用コストを下げるため
に尽きます。
今回の記事では、
・プログラム設計をする理由
・役立つ設計手法・パターン
・設計手法・パターンを使う上での落とし穴
・設計スキルを高めるには
をお伝えします。
プログラム設計をする理由
設計をする理由は、冒頭で伝えた通り、「開発・運用コストを下げるため」です。
システムの開発・運用にかかるコスト=人件費=開発に掛かる時間
つまり良い設計ができると、その分「開発に掛かる時間」が削減できるのです。
具体的に削減できる時間は、以下の3点。
・新しいメンバーが入って来た時の学習コストが下がる
・バグが混入しにくくなる
そもそも、プログラム設計とは、
・入力と出力のフォーマットを決める
・システム内容の構成要素(登場人物)を決める
・システム内の構成要素のインターフェースを定義する
といった作業。
よく見てみると、「決める」「定義する」といった作業ばかりです。
つまり、設計で行なっていることは、開発に関する定義やルールを決める作業なのです。
これを実装前に行うことで、実装中に考える作業を減らすことができます。
もしこの設計を軽んじた場合、どんなことが発生するか?
例を2つ挙げます。
■ 実装者の作業効率が下がる例
設計を省いてコーディング作業を進めていると、あることに気が付きます。
「あれ?ここの出力結果どういう形がいいのかな?」
これを決めないと作業が進められないので、作業を中断しなくてはなりません。
これはコーディングとは違う頭を使うことになります。
また、場合によっては他の関係者と一緒に検討しなくてはなりません。
こういうのが頻発すると、作業効率は非常に悪くなります。
■ 新規メンバーの作業効率が下がる例
設計されていなければ、当然ドキュメントはないし、実装ルールやインターフェースも実装者ごとにバラバラになります。
そうなると、新規メンバーは各クラスやメソッドの実際の実装を追っていかなくてはなりません。
その時点で、学習コストが高いです。
また、そういうシステムは例外や依存が多くなり、複雑化して影響範囲の把握がしにくくなります。
「並列なクラスなのに、クラスごとにインターフェースが全然違う」などです。
つまり、バグを発生させやすくなり、その対応などにもコストが掛かります。
このような問題が発生しないように、適切な設計をすることが重要になります。
例えば、特定の階層のクラスのインターフェースを共通化する設計にすれば、そのインターフェースを覚えればその「クラス群」の挙動の大枠が理解できます。
新規メンバーも覚えることが減り、システムの理解がされやすい&途中参加しやすい、となります。
役立つ設計手法・パターン
システム設計の考え方には、すでにある優秀な手法を使うのが有効です。
以下で紹介する考え方は、色々なサービスに組み込まれて幅広く認知されています。
改めてその考え方を知っておくことで、システム設計の役立てましょう。
オブジェクト指向
システム構成を人間がイメージしやすい「モノ(=オブジェクト)」に例える考え方です。
多くのプログラミング言語自体に取り込まれている考え方です。
合わせて読みたい
オブジェクト指向のメリットとは?【プログラミング設計に役立つ】
MVCモデル
システムを「Model」「View」「Controller」の3つのパートに役割分担して考える手法です。
システムの役割をシンプル化することによって、人による理解を促進します。
合わせて読みたい
MVCモデルとは?プログラム設計におけるメリットやMVVMも解説
設計手法・パターンを使う上での落とし穴
先述した考え方は、大変優秀で便利な考え方ですが、形式的なことに捉われてしまうことがあります。
例えば、「最新の手法はこうだから、システムをその形に変更しよう」など。
そんな時は、「開発・運用コストを下げる」という目的を達成できるのか問いかけましょう。
・その手法を取り入れることで、本当にコストは下がるのか?
・変更するコストと、将来軽減されるコストを比較して、それは有効な手段なのか?
・そもそも、現状の設計ではどんな課題があるのか?
手法や技術を使うこと自体が目的にならないように注意です。
Webやニュースでもてはやされている手法があったとしても、それはその事例の環境にマッチしただけかもしれないからです。
また、どんなシステムを、誰が開発・運用するのかによっても、有効な手法は変わります。
・システム運用におけるオペレーションには、どの程度の負担があるのか?
・システムの更新頻度はどれくらいあるのか?
・チーム開発?個人開発?
自分たちの状況において開発スピードを上げるには、どんなアプローチをすべきなのかを考えましょう。
設計スキルを高めるには
設計力を上げるには、知識だけでなく、システム運用経験を積むことが重要です。
設計当初は良いと思っても、実際に運用してみると使いづらかったり、想定していなかった修正が入ることは良くあります。
結局、成功・失敗の経験を多く積まないと良いか悪いかの判断はできないのです。
また、フリーランスの方で自サービスメインで生活している場合、自分以外の設計を運用する機会が少なくなりがち。
スキルアップを考えている場合は、良さげな開発案件に携わって、他のシステムの設計を見るのも勉強になると思います。
スキルの高い人ほど、1つの手法ややり方にはこだわらず、色々と試行錯誤をしている印象を受けます。
ちなみに、僕も個人アプリを9本ほどリリースしていますが、アプリを出して運用する度に改善点に気が付き、次のアプリでは結構手を入れています。
設計力を上げたいのなら、設計しただけで満足するのではなく、設計したものを自分で運用して改善をする経験をたくさんしましょう!
おわりに
・すでにある優秀な設計手法を有効に使おう
・設計手法をコピーすることにとらわれないように注意
・設計力を上げるには、システム運用して、改善する経験を積もう
一朝一夕では良い設計はできませんが、経験を積むことで開発コストが大幅に減る嬉しさが味わえます。
積極的に設計経験を積んでいきましょう!
この記事があなたのお役に立てば嬉しいです。
では、また。