プログラミングの知識を身につけようと思ったとき、最初のハードルになるのが「専門用語」です。勉強すればするほど知らない用語が登場するため、1つずつ調べながら学ぶことになるかと思います。インターネットを使うと簡単に調べられるようになった一方で、“知らない用語”は調べられないものです。
そこで今回は、プログラミングをするときに最低限知っておきたい基礎的な用語をご紹介します。似ている用語と比較をしているので、その違いも意識してみてください。

機械語とプログラミング言語
コンピュータは、人間が設計書を書けば動いてくれるわけではなく、「機械語」と呼ばれる言語で指示を出す必要があります。しかし、機械語を人間が書いたり読んだりするのはとても大変です。
そこで「プログラミング言語」を使って、人間にとってわかりやすい記述ができるように工夫をしています。ただし、コンピュータにはプログラミング言語が理解できないので、これを機械語に変換する必要があります。
ソースコードとプログラム
プログラミング言語のルールに沿って書かれたものを「ソースコード」と呼びます。そして、このソースコードを機械語の「プログラム」に変換することで、コンピュータが実行可能になります。

なお、プログラムと似た言葉に「ソフトウェア」や「アプリケーション」があります。ソフトウェアはハードウェアと対比して使われる言葉で、プログラムだけでなくデータや文書などのファイルも含みます。また、アプリケーションは「応用ソフト」と訳されるように、OS(基本ソフト)以外のソフトウェアを指します。
コンパイラとインタプリタ
ソースコードをプログラムに変換する方法は、「コンパイラ」と「インタプリタ」に大きく分けられます。
コンパイラはソースコードからプログラムに事前に変換しておくことで、実行時に高速で処理を行えます。ただし、ソースコードに修正が発生した場合は、毎回変換作業をやり直す必要があります。
インタプリタは実行時に変換しながら処理を行うため、コンパイラよりも処理に時間はかかりますが、ソースコードを修正した場合もすぐに実行ができます。

ただし、最近では「バイトコード」と呼ばれる中間言語の増加や、「JITコンパイラ」という方式を採用した言語の登場など、コンパイラやインタプリタの分類が難しくなっています。
また、機械語に変換するのではなく、他の言語のソースコードに変換する「トランスパイラ」と呼ばれる言語も登場しています。
コーディングとプログラミング
プログラマがソースコードなどを記述することを「コーディング」といいます。ただし、プログラマの仕事はこのコーディングだけではありません。ソフトウェア開発の大きな流れとして、「V字モデル」という言葉があります。
次の図のように要求分析から始まり、要件定義や基本設計、詳細設計などが前段として存在し、その上で実装をする作業がコーディングです。コーディングを行ったあとには、単体テストや結合テスト、システムテスト、受け入れテストが待っています。

このうち、設計や実装、テストまでの広い範囲が「プログラミング」だと考えられます。この言葉の指す範囲は曖昧で、その会社や組織によってプログラマが担当する範囲は異なることがあります。
データ構造とアルゴリズム
『アルゴリズム+データ構造=プログラム』という本があるように、プログラムを作る上でアルゴリズムやデータ構造についての知識は必須です。
「データ構造」によって、プログラム中どのようにデータを格納するかが決まります。整数や小数、文字などを格納する「基本データ型」だけでなく、これらを組み合わせた「配列」、その格納方法や取り出し方として「キュー」や「スタック」などの言葉も知っておきましょう。

一方、プログラムでの処理手順を示したものが「アルゴリズム」です。配列の中から欲しいデータを見つけ出す「探索」や、昇順や降順に並べ替える「ソート」など、基本的なアルゴリズムは書籍などで学んでおきましょう。
計算量とオーダー
複数のアルゴリズムの中から、最適な手法を選ぶためには基準が必要です。その基準として「計算量」という考え方がよく使われます。
“良い”アルゴリズムには、処理するデータが増えても、それほど処理時間が長くならないと考える「時間計算量」と、メモリやディスクをそれほど消費しないかを考える「空間計算量」といった基準があります。
その中でも、アルゴリズムの比較では時間計算量がよく使われ、「オーダー」という表記がよく使われます。オーダーを考えるときは、入力のデータ量(サイズ)が大きくなったときに、処理時間がどれくらい増えるのかを調べます。例えば、繰り返し(ループ)において、その実行回数を数えてみるとイメージしやすいでしょう。

フレームワークとライブラリ
最近ではアプリケーションを作成する際に、「フレームワーク」を使うことが一般的になりました。
フレームワークは多くのプログラムで共通して使える処理の枠組みのことで、Windowsの場合は.NET Framework、iOSのApp Frameworks、Webアプリを作成する場合のWebアプリケーションフレームワーク、CSSフレームワークなどがあります。
フレームワークに似たようなソフトウェアとして「ライブラリ」という言葉が使われることがありますが、ライブラリはメールの送信やログの記録、数学的な関数や画像処理など、便利な機能をまとめたものです。
フレームワークを使って共通の処理を土台として実現し、ライブラリを使ってアプリケーションに独自の機能を簡単に追加できます。

APIとシステムコール
ソフトウェアがライブラリを呼び出すときのインターフェイスとして「API(Application Programming Interface)」があります。Windowsの機能を呼び出すときにはWin32 APIなどが使われ、WebアプリでもGoogle Chart APIや、SNSの自動投稿用として、そのサービスの提供元からAPIが提供されています。

また、OSが提供するインターフェイスを「システムコール」といいます。ハードウェアを制御するソフトウェアを作りたい場合には必須の知識ですが、ゲームや組み込みなどの開発を行わない場合には、使う場面が減っています。
テスト手法とテスト駆動開発
ソフトウェアは開発するだけでなく、「テスト」が必要です。テストは、作成したプログラムが使用通り動作しているか、不具合がないかを確認する作業です。
正しいデータや操作を正常に処理できるかを確認するだけでなく、誤ったデータが与えられた・想定外の操作が行われた、といった場合にも異常終了しないことを確認する必要があります。
なお、テストで不具合が見つかった場合に、その原因を調べて修正する作業や、修正する必要があるか探す作業のことを「デバッグ」といいます。
また、そのテストが動作するように実装する開発手法として、「テスト駆動開発」があります。テストを自動的に実行できる環境を用意することで、プログラムを修正した場合にも、他に悪い影響を与えていないかチェックできる可能性が高まります。
ウォーターフォールとアジャイル
開発手法としてウォーターフォールやアジャイルなどが取り上げられることがあります。
「ウォーターフォール」はV字モデルにおける要件定義や設計、開発、テスト、運用というステップを大きな流れとして、できるかぎり逆方向に戻ることがないように進める方法です。
一方、「アジャイル」はこのサイクルを小さな単位で繰り返す方法だと考えられます。

ただし、実際にはアジャイルにはスクラム開発やXP(eXtreme Programming)のほか、いくつかの手法があります。スクラム開発の場合であれば、見積ポーカーという見積手法や、スプリント計画、デイリースクラム、スプリントレビューなどプロジェクトを進めるにあたり、さまざまな手法が用いられており、単純にサイクルを小さくするだけではありません。
おわりに
プログラマとして働く上では、次々と新しい用語が登場します。それらを1つずつ学ぶだけではなく、複数のキーワードを関連付けて、調べていくことが大切です。知らない用語を見つけた、新しい用語が気になった場合には、これまでとどう違うのか、その違いを比べながら学ぶようにしましょう。
このコラムの内容は、2019年7月10日に開催した「プログラマを目指すときに知っておきたい基礎用語とは」と題したイベントで、より詳しく増井さんにご解説いただきました。今後も皆さまのスキル向上を支援するイベントを定期的に開催いたします。ぜひご参加ください。