031.1 ソフトウェア開発の基礎
Web Development Essentials | 2023/11/22

このトピックについて

このトピックはWeb開発の基礎であるソフトウェアについて取り扱っているんですが、基本ソフトウェアについてはLinux Essentialsで学習をする為、「Web Development Essentials」ではWeb周りのドキュメントと、少しだけアプリケーションソフトウェアについて学習を行っていきます。
 Linux Essentials についてはこちらから学習をすることができますので、気になる方は是非、ご拝読くださいね!

ソフトウェアとは

「ソフトウェア」とは、一体何でしょうか? 「ソフトウェア」とは、コンピュータ使用者が、コンピュータに対して意図した動作を行わせるために、特定の命令を与えることを目的とした「プログラム」の集合体のことを指します。プログラムという単語は「計画」や「予定」といった意味があります。
 ではITの世界におけるプログラムとは何でしょうか?

ITの世界における「プログラム」はコンピュータプログラムとも呼ばれます。
 コンピュータプログラムは、ある命令が与えられたときに、どのような順序で処理を行うかを記述したもののことを指します。 

プログラムの集合体であるソフトウェアは完成された一つの製品であり、それぞれの製品毎に利用目的を持ちます。
 ソフトウェアにも様々な機能があります。ソフトウェアの具体例として、コンピュータで建物の設計などを行うソフトウェアやコンピュータゲームを行うためのゲームソフトがあります。
 CADなら設計を行うために必要な、線を引くツールや、その線の長さを計測する機能、ゲームソフトなら、ゲームデータを保存する機能、キャラクターを動作させる機能、など沢山の機能があります。
 これらの一つ一つの機能を処理するのものが「プロ グラム」です。 つまり、「ソフトウェア」とはたくさんの「プログラム」の集合体であることが、わかるかと思います。

ソースコードとは

プログラミング言語を使って記述されたテキストベースのファイルや文書のことを指しており、ソフトウェア開発において、ソースコードは「コンピュータに指示を出す指示書」のようなものになります。
 では、そもそもプログラミングとは何でしょうか。

プログラミングとは、コンピュータに人間が意図した処理をするように指示を与える作業の事を指します。更に、プログラミング言語とは、プログラミングを行うため専用の言語となり、現在のプログラミング言語は数百以上存在するといわれています。

「Web Development Essentials」の第一章では、「C」「C++」「C#」「Java」「JavaScript」
「Python」「PHP」といったプログラミング言語を紹介しており、以下の図は、その中から一部抜粋してそれぞれの簡単な特徴を紹介いたします。

この図から分かる通り、それぞれのプログラミング言語によって記述方式や使用用途が異なったりといった違いがあります。
 試験対策としては、各言語の特徴などを覚えていれば問題ないでしょう。たとえば、「PHPは、オープンソースなインタープリタ言語でWEB開発に適している」といった具合です!
 ちなみに「Web Development Essentials」の単元として扱い、詳しく学習するプログラミング言語は「JavaScript」のみとなります。
 図中で紹介しきれなかった「C#」「Java」「Python」も同様に、ご自身で調べてみてくださいね!

コンパイル型言語とインタープリタ型言語

プログラミング言語には大きく分けて「コンパイル型言語」「インタープリタ型言語」の2種類が存在します。

プログラミング言語で書いた文章(ソースコード)は人間によって記述する為、この内容は人間が理解することが出来ますが、プログラミング言語によってはコンピュータがソースコードの内容を理解・実行する事ができないものがあります。
 そのような場合、コンピュータがソースコードを理解するためには、一度コンピュータが理解できるように言語に変換し、変更後に実行するといった手順を踏む必要があります。この変換を一度に行う作業をコンパイルと呼びます。

コンパイルしなければ実行できないプログラミング言語をコンパイル型言語といい、一方、インタープリタ型言語の場合は、人間が読めるコードをインタープリタを使って、コードを逐次解釈しながらプログラムを実行します。

コンパイラ型とインタープリタ型はどちらもコンピュータが理解できるように変換し、実行することに違いはありませんが、それぞれメリットとデメリットが存在します。

コンパイルが必要なプログラムは、コンパイルするのに時間がかかり、プログラムの変更を行うたびに、必ずコンパイルする必要があるので、時間と手間がかかるという欠点があります。しかし、一度コンパイルしてしまえば、実行速度が早く、記述間違いなどによるバグを発見しやすいといったメリットもあります。

インタープリタ型は、ソースコードを1行ずつ解釈し実行するため、プログラムに不具合が生じた際、その場で修正が可能です。しかしコンピュータの処理工数が増える分、コンパイルされたファイルより実行速度が遅くなります。

「Web Development Essentials」の試験では各プログラミング言語がコンパイル型とインタープリタ型のどちらに分類され、どのような特徴があるのかをしっかり暗記しておきましょう。
 ちなみに、コンパイル型とインタープリタ型はそれぞれに一長一短がありますので、どちらが優れているかという話よりも、シチュエーションに合わせた選択が重要になります。

サブルーチン(関数)

プログラミングにはサブルーチンという仕組みがあります。
 特定の処理のプログラムを1つにまとめ、毎回決められた処理を行い、結果を返すことが出来る為、1つのプログラムの中で再利用することが出来ます。

ちなみに、サブルーチンはプログラミング言語によって別の言葉で表現されることがあり、関数プロシージャと呼ばれることがあります。厳密には異なりますが、ここでは関数と覚えていたら問題ないかと思います!

では、実際に例をみていきましょう。
 例えば、「数字を二乗して、全ての合計を求める」といったシステムがあるとします。
 では、そのシステムをJavaScriptを使って実際に関数を作成すると、以下のようになります。

簡単に説明をしていくと、図中の「function squared」と書かれている箇所が関数となり、括弧()の中にある「num」は引数を表しており、図中の上から「result1 = squared(1)」と「result2 = squared(2)」で関数squaredを使用して、それぞれ括弧()の中にある数字をもとに二乗を行っています。

今回例として紹介した「数字を二乗して、全ての合計を求める」というシステムはシンプルでとても簡単な記述になりますが、プログラムの中に二乗を行う場面が何度も出てくる場合や、もっと複雑な計算式を繰り返し書く必要がある場合などは、関数を1つ作成しておけば、必要な際にこの関数を呼び出して、再度同じ処理を行うことができます。

このように、関数を使用すれば、同じソースコードを何回も記述する必要はなくなり、効率的にシステム開発を行うことが可能になります。

そして、関数のような汎用性の高い便利なプログラムを集めた物をライブラリといいます。

ライブラリ

ソフトウェアの開発を進めていくと、似たような機能や似たようなコードを何度も繰り返し記述してしまう事があります。その都度、重複するコードを書き続けると、ソースコード全体の行数が増えてしまったり、バグの特定が難しくなったりします。

ライブラリはこの様な汎用性に高い重複する機能を取り出し、1つのファイルにまとめパッケージとして纏めたものです。その中身はソースコードであったり、オブジェクトコード(コンパイルしたプログラム)だったり、或いは専用の形式になっている場合など、形は様々です。
 ソフトウェアの実行プログラムで必要な重複するような処理がある場合は、ライブラリを呼び出し、動作を行います。
 これにより、ソースコード全体の保守性や管理性を上昇させることができます。

オブジェクト指向

オブジェクト指向は、プログラム設計の方法論であり、変数や関数等で構成されるモノ(オブジェクト)とモノ(オブジェクト)間の関係性を中心にプログラムを設計し、システムを構築する考え方です。

では、オブジェクト指向を採用したシステム開発と、採用し無かったシステム開発の違いについて説明していきましょう。

たとえば、、、レースゲームを作成するとしましょう!
 レースゲームにはキャラクターとなる「車」が必要ですね。更にゲームなので、コントローラーを使った時にどのように動くか、という「操作方法」も必要になります。

上記の内容を踏まえて、まずはオブジェクト指向を採用しない方法でみてみましょう。

この図では、3台の車に対してそれぞれ同じ操作方法を3通り記述しています。これは実際システム開発で例えると、それぞれの車に対して「Aボタンで前進してBボタンで停止する」といった機能(操作方法)を開発しないといけません。
 今回の例では車が3台なのであまり問題ないのですが、車の数を100や1000などにもっと増やしたいとなるとどうでしょうか。。
 記述しないといけないソースコードの量が膨大となってしまいます。。
 こういった非効率な作業を効率化させるために「オブジェクト指向」という概念が生まれました。

では次にオブジェクト指向を採用した方法をみていきましょう。

オブジェクト指向では「車(オブジェクト1)」の中に各車種の種類を、「操作方法(オブジェクト2)」には各ボタンの設定を記述し、それぞれのオブジェクトを関連付けすることで、「プリウスはAボタンで前進してBボタンで停止する」ということを実現しています。

オブジェクト指向を採用したほうがよいメリットは3つあります。

1つ目は、仕様の変更が発生した時に対処がし易い、という点です。
 例えば、Bボタンを押したときの動作を「停止する」から「後進(バック)する」に変更したい場合は「操作方法」というオブジェクトの中身を変更するだけで済むようになります。

2つ目は、不具合箇所の特定が容易になる、という点です。
 これも1つ目と少し類似していますが、例えば、「プリウスだけ前に進まない」といった不具合が発生した場合、オブジェクト指向を使わずに作成している場合は、プリウスのソースコードを確認してバグを発見しないといけませんが、オブジェクト指向を使っていないので見た目から操作まですべての内容が含まれているソースコードの中から不具合の箇所を割り出し、修正する必要がでてきます。
 なので、ソースコードの記述量が多ければ多いほど、原因の特定が難しくなりますよね。。

一方、オブジェクト指向の場合は「操作方法」というオブジェクトのソースコードを調べるか、「車」というオブジェクトの「プリウス」の中で記述している「操作方法」との関連付けしている箇所だけ確認すれば不具合箇所が確認できます。

3つ目は、開発の効率化です。
 オブジェクトにわけて開発を行うため、それぞれの担当が任されたオブジェクトを作成する、という形をとるため、同時並行で作業することができ、開発期間を短縮させることができます。

このように、オブジェクト指向を取り入れると大規模なプロジェクトや、複数の開発者が関わるような開発を効率よく行うことができます。

ソースコードエディタと統合開発環境(IDE)

まず、ソースコードエディタとは、プログラムのソースコード編集を目的として作られたテキストエディタを指します。
 プログラミングは普通のテキストエディタにソースコードを記述することでも動作しますが、テキストエディタの場合、不具合の原因となるスペルミスなど構文ミスがあれば、発見することは難しくなります。
 ソースコードエディタは、ソースコードの入力の効率化が図れるように設計されているため、コードの記述間違いを色分けして指摘してくれたり、一度入力した言語を補完してくれたりなど、便利な機能を備えているものもあります。

では次にIDEとはなんでしょうか?
 IDEとは日本語で統合開発環境といい、その名の通りすべての開発する環境がそろっていることを指します具体的な違いとしては「ソースコードエディタ・コンパイラ・※デバッガ」が最初から揃っている点となります。(※デバッガ::デバッガは開発したソフトウェアにバグが無いか、機能が仕様を満たしているかテストする上で、必要不可欠となります。)

IDEは開発作業においてよく使う機能が最初からひとまとめにされており、 大抵の作業はIDEの中で完結するようになっていますが、最初から全部入りの状態なので、容量のサイズも大きく、動作が重いのがデメリットとなります。

前述にも書きましたが、最近のソースコードエディタは多機能になってきている為、IDEとの境目も無くなってきています。

前記事でも紹介したVisual Studio Code(VSCode)はまさに代表的な例で、デバッガ機能も備えており、また多数のプラグイン(追加オプション機能)を導入することができます。
 VSCodeの導入や設定方法は前章の記事で確認する事ができますので、是非ご確認くださいね!!

VSCodeの導入と初期設定について

バージョン管理システムの知識

ソフトウェア開発は機能の変更や追加、削除を行ったり、ソースコードを少しずつ修正して行きます。このソフトウェアの修正のことをバージョンアップと呼び、ソフトウェアのバージョンアップを行うと、修正していない箇所で問題が生じる事があります。
 そういった場合、古いバージョンのソースコードを保存しておき、ソースコードを比較しながら修正します。
 一人でソフトウェアの開発を行う場合は自分で管理できますが、複数人でのソフトウェア開発を行う場合は困難です。

そこで、ソフトウェア管理専用のバージョン管理システム(VCS:Version Control System)を使うことが一般的です。

バージョン管理システムは集中型分散型の2種類があります。
 集中型は元となるソースコードをサーバに設置し、クライアントがオリジナルのソースコードを交互に開発していく仕組みです。一方、分散型はサーバとクライアントに個別のソースコードを置き、都度同期を行いながら開発を行います。
 主な管理システムとして、集中型は「Subversion」、分散型「GitHub」「GitLab」というサービスが有名です。ちなみに、どのVCSを使用するかは企業によって結構まちまちです。

試験対策としては、VCSの種類とそれぞれの有名なサービスを把握してれば問題ないかと!

それでは今回はここまで。

PAGE TOP