設計力のお話 応用編2「ソフトウェア品質の塩梅」
設計力を身につけるナレッジ:応用
本ナレッジはプロを目指す方向けにしっかりと理解して頂きたい内容をまとめたナレッジです。
現役で活躍しているプログラマーであって設計力の不足が問題になることがあります。
しっかりとした設計力とプログラミング力を持ち合わせていればとても強力な武器・アピールポイントとなります。
応用編では実務業務に対して臨機応変に動けるようになれる情報を記載していきます。
ソフトウェア品質とは・・・
ISO/IEC 25010の規格に基づいて私見を踏まえてマップ化してみました。
大項目が8つ、中項目が31つで定められた要素があります。
ソフトウェア品質の全項目を完璧にこなす必要があるか?
私は開発を行うシステム・ソフトウェア・アプリにおいて全項目を完璧にこなす必要はないと考えます。
逆に開発人数や予算に余裕がありプロジェクトやあらゆる面において堅牢なシステムを求められいる場合ほどじっくり話し合う必要が出てきます。
開発開始時点で大まかな期限が設けられているプロジェクトであれば要件定義に応じてどの部分を重要視するかを決めておくことで後々のトラブルが抑えられます。
BtoB、BtoC、CtoCなどの要件も考慮
ウェブアプリ・ウェブサイトのシステムの場合は特に重要視する部分が偏ってくると考えます。
ビジネスであれば少数カスタマー向けに信頼性やセキュリティー性を重視されるかと思います。
コンシューマー向けであれば見た目の魅力や利用しやすさやメリットを重視といった具合にユーザー数確保を狙った開発をすることが多くなるかと思います。
対応しない、おろそかになっても良い部分はあるか?
要件次第ですが、私的利用目的で開発者自身が利用するものであればほとんどのソフトウェア品質を満たす必要はないでしょう。
ただ、自身でも管理できないようなソフトウェアを作ってしまえば開発効率・デバッグ効率・処理時間などのロスが重なって時間浪費につながることもあります。
それではどうするか
ソフトウェア品質の概要は理解しましょう。
どのような部分に気を付けてプログラミングや設計を行うのが良いのかを考えることが出来るようになりましょう。
プログラミングし始めの時はどのようなソースコードの内容によってメリット・デメリットがどのような形で表に出てくるのかの判断・理解が難しいです。
- プログラミング言語
- フレームワーク
- サーバーOS
- サーバーソフトウェア
- ソースコードのバージョン管理方法
- CI/CDの運用方法
開発を行う上での主要な要件は色々ありますが、何となくで選択しても良い場合もあれば問題になる場合もあり得ます。
例えば・・・
プログラミング言語をプロジェクトに合わせて選ぶ
- 同時接続数重視でリアルタイム性を求めるようなチャットシステムであればJavascript (node.js)を選ぶことが多くなる
- 速度が重視される高画質なグラフィックで表現される3Dオンラインゲームにおいて開発言語にPHPやJavascriptはまず選ばない
- ウェブページの開発効率を優先して実装したい場合においてフレームワークの少ないC++を選ぶことは少ない
プログラミング言語の特性で選ぶ
- 速度重視のC++はプログラミング・設計次第で不正メモリアクセスでクラッシュ(ハングアップ)が起きやすい
- C#はC++よりも不正メモリアクセスが起きにくくフレームワークがしっかりしているがコード解析しやすい
- コンパイラ言語はビルド時間が必要になるがインタプリタ言語は即座に実行できる
サーバー・インフラストラクチャーの考案
- 単一のLinuxシステム上にウェブ・DB・キャッシュサーバーを同時運用すると負荷分散がしにくい冗長化も手間になる
Dockerを使用してコンテナ化しても単一Linux上で実行するのであれば同じ - 複数サーバー構成の場合の冗長化・トラブル復旧時の事前対策プランがないと復旧に時間が掛かる
- Windowsサーバーの場合、Windows OSがメモリ消費量が多くてリソースに無駄が出るがWindowsに慣れている人からしたら使いやすい
フレームワーク採用開発のメリット・デメリット
- 開発効率がとても早く、有識者であればなおさら即戦力となり素早い製品リリースにつなげられる
- 学習コストがかかる、学習能力次第ではプロジェクトの負担にもなりえる
- 不要な機能が多くてリソースの無駄が増える場合がある(CPU/メモリ/ディスクすべてにおいて)
- バージョンアップ時にメンテナンスが必要、テスト範囲次第では負担にもなりえる
- システムの根幹を知らないまま実装できてしまう、意図しない不具合やセキュリティー欠陥につながることもある
ソフトウェア品質? 専門用語に専門知識と多すぎて困ったら・・・
経験豊富なメンターさんに聴いてみましょう
- プロジェクト経験が豊富な方
- 扱えるプログラミング言語が多い方
- 複数のフレームワークやミドルウェアを扱える方
- 自身でインフラ構築が出来る方(複数のOSに強い方)
- クラウド環境を利用している方
可能な限り経験豊富な様々なメンターさんに相談・意見をうかがうのが良いでしょう。
メンターさんも多種多様でそれぞれの経験・ノウハウが異なります。
同じソースコードでも"要件定義"の受け取り方次第で答えが変わることもあり得ます。
どういった経緯(過去のトラブルの経験)でその答えにたどり着いたかは経験豊富な方なら説明もできます。
経験が少なかったとしても知識が増やせることで、”~に気を付けてプログラミングを行う”のスキルにもつながります。