アプリケーション開発やシステム開発において、頻繁に出てくる手順はありますよね。これをショートカットし、掛ける時間と工数を減らす役に立つのがソフトウェアフレームワークです。開発現場でソフトウェアフレームワークを適切に使い分ければ、開発効率をアップできます。
今回の記事ではこのソフトウェアフレームを理解する上での基礎知識や、実際に開発に使う際の注意点を紹介していきます。
目次
ソフトウェアフレームワークとは?
まずはそもそもソフトウェアフレームワークとは何かについて、詳しく触れておきましょう。
特定の機能やプロセスを枠組み化したもの
フレームワークには「枠組み」や「構造」、「骨組み」などの意味があります。ソフトウェアを開発する際に、頻繁に使われる機能を数学の公式のように、それぞれパッケージ化してすぐに使えるよう用意したものがソフトウェアフレームワークです。
ソフトウェアフレームワークには機能が豊富にある充実したものから、機能が絞り込まれた軽量のものまで、多種多彩なタイプが存在します。例えば、Webアプリケーションを作成するための「ウェブアプリケーションフレームワーク」やウェブページを構築するための「CSSフレームワーク」、ソフトウェアの機能性や操作性を向上させるための「ユーティリティ系フレームワーク」などがあります。
ソフトウェアフレームワークを活用すればコードをゼロから書く必要がないので手間が省け、経験が浅いエンジニアでも作成できます。同時に大幅な開発期間の短縮が可能で、開発コストを押させるだけでなく生産性の向上にもつながるでしょう。大幅に開発期間の短縮が可能で、それだけ開発コストを抑えることができます。
また、エンジニアが各人のやり方でプログラミングを行うとコードの統一性が欠けてしまいバグが発生しやすくなります。ソフトウェアフレームワークを活用すればコードの記述方式やルールが統一され、バグの発生を抑えられます。
ソフトウェアフレームワークとソフトウェアとの違い
ソフトウェアフレームワークとソフトウェアの関係性は混同しやすいものですが、そもそもはソフトウェアフレームワークも広義ではソフトウェアです。頻繁に使う機能をパッケージ化したソフトウェアであると考えればよいでしょう。
少し専門的にいえば、ソフトウェアフレームワークとは再利用可能な「クラス」と表現できます。クラスとはある機能が、どのような属性(プロパティ)と操作(メソッド)から作られるのかを定義した雛形、もしくは設計図です。そのクラスを使用してできたプログラムが、インスタンスと呼ばれます。クラスは概念で、インスタンスはその概念を実体化したものというイメージで良いでしょう。これらクラスとインスタンスを総称してオブジェクト(モノ)と表現します。
そして「ある役割を持つモノ」ごとにクラスを分割し、モノ同士の関係性を定義していくことでシステムを作り上げるシステム構成の考え方がプログラミングに欠かせないオブジェクト指向です。つまりフレームワークは、オブジェクト指向を具現化したツールともいえるでしょう。
ソフトウェアフレームワークとライブラリとの違い
ソフトウェアフレームワークとライブラリもよく混同されます。ライブラリとは、ある機能を持つプログラムを、ほかのプログラムから引用できる形にして複数集め、ひとつのファイルにまとめたものです。
ライブラリ単体では実行はできず、あくまでプログラムのパーツとしてのみ動作します。ライブラリもソフトウェアフレームワークと同じく、再利用可能なクラスの集まりです。では一体どこが違うのでしょうか。ライブラリは単にコードの再利用を意図するツールであるのに対し、フレームワークはソフトウェアの設計レベルの再利用を狙っているツールという違いです。
フレームワークにはソフトウェアの骨格となる部分が、すでに内包されています。骨格となる部分とは、どのような役割のクラスを組み合わせてソフトウェアを構成するかという設計作業のことです。つまりソフトウェアフレームワークはソフトウェアの半製品でありテンプレートと言い換えてもよいでしょう。難易度が高い設計上の決断がソフトウェアフレームワークの開発者によってすでに下されており、それを使用するエンジニアはその雛形をベースに、少し手を加えるだけになります。
一方ライブラリは、汎用的な機能を提供する再利用可能なクラスの集まりです。プログラムの動作ログを記録するためのライブラリや関数を集めたライブラリなど、多くの開発作業で使われる機能が中心です。どんな順番でライブラリを組み合わせ、どのようなソフトウェアを構築するかという設計上の判断を下すのはエンジニアです。
ソフトウェアフレームワークの目的と課題
ソフトウェアフレームワークを開発作業において活用する目的と、抱えている課題について見ていきましょう。
ソフトウェアフレームワークを活用する目的
開発作業でソフトウェアフレームワークを活用する主な目的は、以下の4つに集約されます。
- ソフトウェアの開発効率の向上
- ソフトウェアの保守性の向上
- ソフトウェアの品質と機能性の向上
- 可読性の向上によるバグの低減
個別に詳しく見ていきましょう。
ソフトウェアの開発効率の向上
ソフトウェアフレームワークを活用する目的の1つめは、開発効率の向上のためです。フレームワークは開発において必要な機能がパッケージされているため、一から開発する必要もなくコーディングする手間も少なくなり、まず単純に開発期間を短縮できます。
また、一般的にソフトウェアの開発を行う際は、機能の開発だけでなくファイルの置き場所やコードの書き方のルールなどを含めて、プログラムをどのような構築にするのかということに頭を使わなければなりません。つまり開発作業は、手を動かす以外にも考えなければならないことや、作業に着手する前の下準備がいろいろと必要になります。
しかしフレームワークには、そういう設計や下準備があらかじめ組み込まれているのですぐに着手でき、そういう面からも時間の削減ができます。
ソフトウェアの保守性の向上
ソフトウェアフレームワークを活用する目的の2つめは、ソフトウェアの保守性の向上を確保するためです。ソフトウェアフレームワークでは、何をどこに記述するのかがあらかじめ決まっているため、結果としてソフトウェアの保守性を高めます。
もう少しわかりやすく説明しましょう。例えばあなたが、フレームワークをまったく使っていない複数のソフトウェアの管理を任されたとします。それらの管理を行うためには、ソフトウェアごとに設計書やコード記述のルール、場所などを確認しながら、どのような構造になっているのかを一から確認しなければなりません。
しかし、ソフトウェアフレームワークを活用している場合は、どのように記述すればどの機能が使えて、どの設定を行うファイルはどこにあるということが決まっています。機能に変更があっても、ソフトウェアフレームワークを使っていればどのファイルをどう修正すればよいのか、見当がつけやすくなるでしょう。その結果、ソフトウェアの保守性は高まり、管理がしやすくなります。
ソフトウェアの品質と機能性の向上
ソフトウェアフレームワークを活用する目的の3つめは、ソフトウェアの品質と機能性の向上を確保するためです。
システム開発を一から行う場合は、求められている機能に応えるのももちろん大仕事ですが、エラーの処理やセキュリティなどの、非機能要件に対応するのも非常に手こずります。Webサイトの問い合わせフォームひとつ例に挙げても、質の高い問い合わせフォームを作るためには「脆弱性を攻撃されたら?」「間違った情報をユーザーが入力したら?」「情報を安全に送信するには?」などの詳細な設定がたくさん必要です。
ソフトウェアフレームワークには多くの場合、そのような非機能要件で求められがちな内容に対応する設定があらかじめ施されていることが多いです。そのため、ソフトウェアフレームワークを開発に上手に活用できれば、セキュリティ対策まで考慮した質の高い成果物の開発ができます。
可読性の向上によるバグの低減
ソフトウェアフレームワークを活用する目的の4つめは、可読性の向上によるバグの低減を実現するためです。システムの開発現場では規模によっては複数のチームでコーディングを行いますが、一般的にコードの記述方法はエンジニアごとに異なります。しかしフレームワークを活用すればコードの記述方法を統一でき、その結果可読性が上がってバグの発生を抑えられます。
ソフトウェアフレームワークが抱えている課題
ソフトウェアフレームワークにはここまで述べたような多くの利点がある一方で、抱えている課題もあります。主に以下の2つです。
- プログラミングの自由度の制限
- 脆弱性の問題
それぞれを見ていきましょう。
プログラミングの自由度の制限
ソフトウェアフレームワークが抱えている課題の1つめは、ソフトウェアにカスタマイズを施したい場合に、規約に従って部分的な変更はできても、その範囲に限界があることです。
ゼロからコードを書くほうが、プログラミングの自由度が得られるのは確かです。また、フレームワーク特有のソースコードを覚えなければならず、活用する場合はそれに合わせた研修の実施も検討する必要があります。
脆弱性の問題
ソフトウェアフレームワークが抱えている課題の2つめは、脆弱性の問題です。フレームワークは便利な反面、便利さゆえに抱えがちな脆弱性を狙って、サイバー攻撃の的となるリスクがあります。
例を挙げると、apache struts2という2007年にリリースされ、非常に高い人気を得たフレームワークがあります。開発作業が非常に効率的になるため、日本を含め世界中で採用されているフレームワークです。しかし2017年に、apache struts2を使用したソフトウェアが一斉に不正アクセスを受け、内閣官房の情報や企業の顧客情報が大量に流出しました。このサイバー攻撃をきっかけにして、脆弱性のリスクを問題視するようになります。
対処法としてのアップデートなどの対策が行われていますが、追いついていない面もあります。ソフトウェアフレームワークにとって、セキュリティにおける大きな課題となっているのです。
ソフトウェアフレームワークの種類
ソフトウェアフレームワークには大まかな種類があります。さまざまな分け方がありますが、ここでは「Webアプリケーションフレームワーク」「CSSフレームワーク」「ユーティリティ系フレームワーク」の3種類に分ける考え方を使います。さらに、近年はデータサイエンス・機械学習に用いられるソフトウェアフレームワークも注目されているため、4つ目として付け加えておきましょう。
Webアプリケーション作成に使用される「Webアプリケーションフレームワーク」とWebサイト構築のための「CSSフレームワーク」、操作性向上のための「ユーティリティ系フレームワーク」、データサイエンス・機械学習用フレームワークの4種類の概要とそれぞれの代表的なフレームワークを紹介します。
Webアプリケーションフレームワーク
Webアプリケーションフレームワークとは、Webアプリケーションを開発するためのフレームワークです。開発に多用される共通の機能を提供する事で開発作業の効率や品質、メンテナンス性能を向上させることができます。
多くのWebアプリケーションフレームワークがデーターベース管理機能(データーベースのコネクション管理などを行う機能)やセッション管理機能(クライアントの識別や管理をする機能)、Webテンプレートなどを備えています。また、簡単に機能の追加ができるようになりました。
代表的なWebアプリケーションフレームワーク
代表的なWebアプリケーションフレームワークを、プログラミング言語別に紹介します。
【Java用Webアプリケーションフレームワーク】
世界中で多くの利用者がいる人気プログラミング言語であるJava用のWebアプリケーションフレームワークです。サーバーで管理されるサーバーサイドプログラムなので、さまざまなOSで動作が可能という汎用性の高さが特徴です。大規模開発においてもオブジェクト指向という概念によって利用されており、集団作業にも向いています。そのため、多くの企業で開発に使用されています。Java用の代表的なWebアプリケーションフレームワークは以下の3種類です。
- JavaServer Faces(JSF)
- 標準コンポーネント指向UI(ユーザーインターフェイス)のフレームワーク。名称のFaces=顔という単語が、UIの構築しやすさを表現。
- Play Framework
- メモリの使用量が少なく軽量、ソースコードコンパイル後にサーバー再起動は不要で、作業スピードの向上に役立つ
- JavaだけでなくScaleでも使える大規模・アジャイル開発に適している
- Spring Framework
- 特徴の1つがDI(Dependency Injection/依存性の注入)。オブジェクト間の依存関係を疎結合にすることで個々のコンポーネントの独立性が確保され、保守性が向上する。
Googleの検索数で最新のトレンドを確認してみるとSpring Frameworkが人気のようです。
【JavaScript用Webアプリケーションフレームワーク】
JavaScriptは、Webページのビジュアルを洗練させるプログラミング言語です(※実際はサーバー側/バックエンドのアプリケーション開発の実行環境に用いられる場合もあります)。ブラウザで表示するクライアントサイドスクリプト上でWeb制作をスピーディに行えます。JavaScript用の代表的なWebアプリケーションフレームワークは以下の4種類です。
- React
- Facebook(現Meta)によって開発。一般的に、UIを構築するためのWebフレームワークとして認識されているが、厳密にはライブラリ。
- シンプルな設計で、データが更新されると適切なコンポーネントを更新してくれるという優れた予測性を持つのが特徴。
- HTMLタグをJavaScript内に格納するような応用もしやすく、コードのデバッグも容易。
- Express.js
- サーバーサイドのJavaScript実行環境であるNode.jsと組み合わせて利用
- フロントエンドとバックエンドがひとつの言語で実行可能であり、さまざまなWebサービスやIoTの活用も可能
- Vue.js
- 仮想DOMを採用し、レンダリングの無駄をなくしてパフォーマンスの向上に役立つ
- 描画とデータを同期できる双方向データバインディングが特徴。ソースコードの記述を大幅に減らせるなどの利点がある。
- AngularJS
- ディレクティブよるHTML拡張や双方向データバインディングなど、使える機能が幅広い。
- フレームワーク内で実装工程からテスト工程まで実施でき効率開発効率向上に役立つ。
ReactとAngularはフルスタックフレームワークと言われており、より多くの機能が備わっています。一方でVue.js、Express.jsはマイクロフレーム(軽量フレームワーク)とされており、小規模でシンプルな開発に向いています。
また、AnglarJSは厳密に言えばサポートが終了しているバージョンの名称であり、今でも開発が続けられているのは「Angular」と呼ばれています。
参考までにトレンドを確認すると、ReactとVue.jsが注目されているようです。検索ワードによって結果が変わりやすいため、できるだけ実情が反映するよう調整しましたが、参考に留めるようにしてください。
【Ruby用Webアプリケーションフレームワーク】
Rubyはわかりやすいシンプルな言語として知られています。使いやすい言語としてユーザー層が今後も増えるでしょう。Ruby用の代表的なWebアプリケーションフレームワークは以下の3種類です。
- Ruby on Rails
- Sinatra
- Padrino
Ruby on RailsはWEB開発フレームワーク全体で見てもメジャーな、Rubyを代表するアプリケーションフレームワークです。Sinatra、Prdrinoは、Ruby on Railsよりもシンプル・軽量を目指したフレームワークです。
【PHP用Webアプリケーションフレームワーク】
PHPはWebページを動的に生成できる、サーバーサイドのプログラミング言語です。比較的文法が簡単なため、簡単に習得できる言語として知られています。PHP用の代表的なWebアプリケーションフレームワークは以下の4種類です。
- Laravel
- パッケージやライブラリの管理が可能なComposerに対応。
- 多機能で、大規模開発にもスピーディーに対応可能。
- 一部のプログラムを自動生成し、生成されたプログラムのコードの改変・拡張も容易。
- CakePHP
- Symfony
- Codeigniter
LaravelがPHPの代表的なフレームワークになっています。パッケージやライブラリの管理が可能なComposerに対応、データベースの操作も容易で、大規模開発にもスピーディーに対応可能です。一部のプログラムを自動生成し、生成されたプログラムのコードの改変・拡張も容易なため、その自由度の高さも人気の要因となっています。最近では、開発言語PHP自体のバージョンアップによる高速化に伴い、フルスタックフレームワークであるLaravelが抱えていた処理速度の問題も改善傾向にあるようです。上記以外ではマイクロフレームワークとしてSlimやLumenなども注目されています。
【Python用Webアプリケーションフレームワーク】
Pythonはシンプルな構文で、わずか1行でも多くの処理を記述できるため、コードの文字数を抑えることができるプログラミング言語です。機械学習に必須の言語でもあります。Python用の代表的なWebアプリケーションフレームワークは以下の2種類です。
- Django
- InstagramやPinterestにも活用されており、memcashedという分散型キャッシュシステムを使用した高速処理が可能
- 複雑なデータベースアクセスにも対応でき、「MySQL」「MariaDB」「Oracle」「SQLite」「PostgreSQL」を公式サポート
- Flask
- 小規模で高速性が求められる開発に向いているマイクロフレームワーク。
CSSフレームワーク
CSSはプログラミング言語でもマークアップ言語でもなく、HTMLの要素を選択的にスタイルにするスタイルシート言語です。
HTMLにビジュアルを良くする制御を組み込むと、文書構造が崩れるリスクがあるので、CSSはHTMLとの役割分担によって狙ったレイアウトでページを閲覧可能にします。そしてCSSフレームワークはひと言でいえばWebページのパーツ集のようなもので、サイト構築の効率化が図れるツールです。
タブ切り替えコンテンツやボタンおよびテキストのスタイルから、ドロップダウンリストなど、さまざまなパーツがあらかじめデザインならびにコーディングもされた状態でパッケージされています。
代表的なCSSフレームワーク
代表的なCSSフレームワークは以下の4種類です。
- Bootstrap
- マルチデバイスやレスポンシブデザインに対応。
- 再利用可能なコンポーネントおよびデザインが多数装備され、効率良くWebサイトのデザイン制作を進められる。
- Animate
- CSSのみで要素をアニメーションさせることが可能
- UIkit
- Foundation
Bootstrapが代表的なCSSフレームワークでありますが、UIkit/Foundationもレスポンシブデザインに対応できます。
ユーティリティ系フレームワーク
ユーティリティ系フレームワークは関数やデータのソート、文字列操作、テストなどのソフトウェアの機能や操作性を向上させるためのフレームワークです。
代表的なユーティリティ系フレームワーク
代表的なユーティリティ系フレームワークは以下の2種類です。
- Java Collections Framework
- Google Guava
データサイエンス・機械学習系ソフトウェアフレームワーク
最後に、厳密にはライブラリに属するものになりますが、近年のデータサイエンス・ディープラーニングの需要の高まりから、以下を紹介します。
代表的なデータサイエンス・機械学習系フレームワーク・ライブラリ
- Pandas
- NumPy
- Matplotlib
- scikit-learn
- Keras(ケラス)
- TensorFlow(テンソルフロー)
- PyTorch(パイトーチ)
pandas/Numpy/Matplotlib/Scikit-learnはいずれもデータサイエンスによく用いられるpythonのライブラリです。Keras/TensorFlow/PyTorchはディープラーニング(深層学習)のためのライブラリとなります。
ここで紹介した個々のフレームワークのほとんどは、以下の記事で解説しているので、参考にご覧ください。
ソフトウェアフレームワークを使う際の注意点
ソフトウェアフレームワークを使う際の注意点としては、課題で挙げた脆弱性への対策に尽きます。サイバー攻撃はサーバーに対して行われるものだけでなく、プログラムの脆弱性を突いてくる攻撃もあり、サーバーとプログラムの双方でセキュリティ対策が必要です。
不正アクセスの発生時に迅速に対応できる人材がいれば、セキュリティリスクを下げることが可能です。また、サイバー攻撃はたえず進化して、脆弱性を探りつづけています。メンテナンスやアップデートをこまめに行なっていないとサイバー攻撃には対応できません。常に最新の状態にすることも、システムを安全に保つために必要な項目です。
まとめ
ソフトウェアフレームワークは、システム開発において特定の機能やプロセスを一からコードを書かなくても組み込めるように、あらかじめパッケージされたものです。上手に活用すれば開発効率は格段に上がり、保守性や品質の向上も図れます。
ただし脆弱性に問題があるので、特に個人情報などを扱うシステムの場合はセキュリティにいくら配慮してもし過ぎではありません。その辺りさえ認識しておけば、非常に便利な開発の補助ツールであることは間違いありません。