一般教養として、英語などの語学を学ぶ感覚で、プログラミングを習得したいと考える人が増えています。将来、仕事で使えるかもしれないと考えてるビジネスマンも多いでしょう。
いきなりプログラムを書き始める前に知っておくべきプログラミングの大枠の流れを解説します。
■ プログラミングとは何か?
プログラムは、コンピュータを動かすための手順が書かれたデータです。この手順を書き、それを間違いなく動かすことがプログラミングです。
プログラムが動くとは、以下のことを言います
1)コンピュータにつながった周辺デバイスを制御する
コンピュータには、キーボード、マウス、液晶画面、無線LAN、マイク、スピーカ、カメラ、スキャナ、プリンタ、ハードディスクなど、様々な周辺デバイスがつながっています。これらのデバイスは、データを入力するものと、データを出力するもの、そして、その両方の入出力デバイスに分けられます。
キーボード、マウス、カメラ、スキャナなどは入力デバイス、液晶画面、スピーカ、プリンタなどは出力デバイス、無線LAN、ハードディスクなどは入出力デバイスです。
カメラから画像を取得したり、画面を表示させたり、文書を印刷したり、ネットワークを介してサーバと通信したりなど、プログラミングによって、これらのデバイスを制御することができます。
2)データを変換する
プログラミングは、データを扱うことでもあります。その結果、データを元の形から別の形に変換することができます。
たとえば、性別を意味する数字を見て、0ならば「男性」という文字列に変換し、1ならば「女性」という文字列に変換します。また、データを暗号化して解読できないように変換します。
3)データを保管する
データは、一時的なものです。あとで使うためには、保存する必要があります。プログラミングによって、データを分類し、体系立てて保管することができます。
保管する手段は、ファイル、データベースなどがあります。これらに、保管するための手順をプログラミングすることができます。
■ プログラミングの学び方
プログラミングを学ぶ原則は、「手を動かす」ことです。キーボードをたたいてコードを入力し、プログラムを実行させ、ミスを発見し、そこから学んでいきます。
プログラミングは、基本、独学です。セミナーやプログラミングスクールで長い時間を費やすよりも、安く、早く、そして、効果的に学ぶことができるからです。書籍とインターネットさえあれば、誰でも、いますぐに、学び始めることができます。そして、何より有効なのは、それを実際に仕事で使ってみることです。学んでから使うのではなく、使いながら学んでいきます。
プログラミングを学ぶ手順は、以下となります。
①プログラミング言語を選ぶ
②プログラミング環境を作る
③プログラミングに必要な知識をインプットする
④ロジックを組む
⑤デバックする
■ プログラミング言語を選ぶ
プログラミング言語は、コンパイル言語、スクリプト言語の2つに分けられます。
コンパイル言語とは、コンパイラを使って、いったん、マシン語と呼ばれるCPUが処理できる命令データに変換します。この変換した命令データをOS上で実行させれば、直接、CPUを動かすことができます。そのため、プログラムを早く実行させることができます。
スクリプト言語とは、コンパイラを使わず、プログラミング言語で書かれた文(センテンス)を一行づつリアルタイムに実行していきます。そのため、プログラミングしながら実行することが可能です。これによって、プログラミングの間違いをすぐに修正できます。ただし、マシン語ではないので、コンパイル言語に比べ、処理時間がかかります。
何のプログラミング言語を使うかは、以下を勘案して判断されます。
1)嗜好とトレンド
プログラミング言語にはファッションのように流行り・廃りがあります。新しく作られたプログラミング言語でも、既存のプログラミング言語よりも使いやすそう、面白そうとプログラマーに認知されれば、一気に広まっていきます。
たとえば、Web系であれば、PHPやJavaなどの昔からある慣れ親しんだプログラミング言語ではなく、あえて慣れていないJavaScript、Ruby、Pythonなど、新しいプログラミング言語を使おうとします。
プログラマーは、常に、高機能で扱いやすいプログラミング言語を探し求めています。新しいプログラミング言語を学ぶことは、新しい道具を手に入れるかのように楽しいからです。
そういう意味では、プログラミング言語は、プログラミングをする人の好みで選択されると言ってもいいでしょう。
一方、もっと現実的に、プログラマーの過去の経験から得意なプログラミング言語が選択されることもあります。たとえば、受託開発のように、QCDの要求がとても高く、プログラミングの生産性と精度が必要な場合です。このような場合には、既存のプログラミング言語を使わざるを得ません。変化しないことが、正しい場合もあり得ます。
2)OS
プログラミング言語は、OS(オペレーティングシステム)が提供する中心の機能です。OSがサポートするプログラミング言語には違いがあり、何のOS上で動くプログラムを書くのかによって、プログラミング言語の選択肢が異なってきます。
たとえば、Windowsであれば、VC/C++、VB.NET、C#、VBScript、ASP.NETなどがあり、Linuxであれば、C/C++、PHP、Ruby、Java、JavaScript、Perl、Pythonなど、MacOS/iOSであれば、Objective-C、Swift、AndroidであればJava、kotlinなどのプログラミング言語があります。
また、OSの機能を使うためのシステムコール、ライブラリの使用法も異なります。
VC/C++とC/C++は、OSの機能を直接使うシステムコール、および、各種ライブラリを直接使用します。同じプログラミング言語であっても、OSの機能を直接使うシステムコール、ライブラリの差異によって、実際に書かれるプログラムの内容は、WindowsとLinuxとは、全く異なるものになります。
PHP、Ruby、Java、JavaScript、Perl、Pythonなどのスクリプト言語は、Linuxに限らず、Windows上でも使うことができるようになっています。また、OSの機能であるシステムコールや各種ライブラリを使うインタフェースも、プログラミング言語の機能として統一されているため、OSの差異に関係なく動作します。そのため、OSに依存しないこれらのスクリプト言語が選択されることが多くなってきています。
3)開発対象と処理速度
プログラミングするソフトウェアが装置に組み込むものか、Webシステムのように汎用のPC上で動作させるものかによって変わってきます。
原則として、組込にはコンパイル言語、汎用にはスクリプト言語が使われます。その理由は、処理時間にあります。
組込は、装置に入れ込むため、CPUの性能にも限りがあり、プログラム実行のオーバヘッドが少ないコンパイル言語が使われます。一方、汎用のPCのCPUは高性能であり、処理時間をあまり気にする必要はなく、プログラミングのしやすいスクリプト言語を使うことが多くなります。
■ プログラミング環境を作る
プログラミングするためには、以下のようなものが必要です。
①コンピュータ(PC)
プログラミング言語によって、適切なOSを載せているコンピュータを使います。
WindowsやLinuxであれば、インストールすれば、同じハードウェアで動作させることもできますが、VMWareなどの仮想マシン環境を使えば、Window上でもLinuxを動かせますし、その逆も可能です。
ただし、MacOSやiOSが搭載されたiMac、iPad、iPhoneなどで動作させるプログラムをつくるには、iMacでしかつくることができません。Objective-CやSwiftは、iMacでしかコンパイル、実行することができないからです。そのため、プログラミングの準備に費用がかかります。
②コンパイラー/実行環境
プログラミング言語を利用できるための実行環境をセットアップします。
コンパイル言語であれば、コンパイラーをインストールします。Linuxのコンパイラーはgcc、WindowsのコンパイラーはMicrosoftのVisualStudioに同梱されています。Javaであれば、統合環境(Integreted Development Environment)と呼ばれるパッケージをインストールする必要があります。
組込で開発を行う場合、CPUにあったコンパイラーをベンダーから購入する必要があります。
スクリプト言語であれば、実行環境をインストールします。Pythonであれば、Python3、あるいは、Anacondaなどのパッケージ化された実行環境をインストールします。
Webアプリケーションを開発する場合、プログラミング言語の実行環境の他に、Webサーバもインストールする必要があります。
PHPやASP.NETなどは、Webアプリケーション開発専用なので単独では実行するこはできません。常に、Webサーバといっしょに実行させる必要があります。
③エディタ/コンパイル/デバック環境
プログラミングをするには、文字の編集を自在にできるスクリーンエディタが必要です。エディタには、コンパイルとデバックの実行がセットになっています。文章と違って、プログラミングは、書くことと動かすことが一体ですので、エディタもそのような構造になっています。
コンパイル言語は、コンパイルをするとプログラミング言語の文法の間違いを指摘するコンパイルエラーが大量に発生します。修正を容易にするため、コンパイルエラーにエディタが連動するようになっています。エディターからコンパイラーを実行し、出力されたコンパイルエラーを指定すると、該当のコードが箇所が表示されて、すぐに修正することができます。
さらに、エディタからプログラムを実行させ、プログラム内部の動作を確認し、ロジックに矛盾があれば、修正することができます。この作業をデバックといいます。
これを容易にするデバック機能が、エディタには付随しています。プログラムを1ステップづつ実行させたり(ステップ実行)、指定の場所で実行を一時的に停止させたり(ブレーク)することで、条件分岐が正しいか、変数の値が違ってないかを確認できます。
このような高機能のエディタには、WindowsとLinux上の両方で動作するマイクロソフトのVisual Studio Codeなどがあります。
④ネットワーク
クラウドサーバ環境上にWeb環境を構築する場合など、ネットワークを使うWebアプリケーションなどのプログラムをつくる場合、ネットワーク環境が必要となります。
また、プログラミングを学ぶ際にも、インターネットが必須です。インターネットさえあれば、正直、書籍さえ、必要ありません。書籍は、検索したり、まとめたりするのが面倒なときや、ひとまずプログラミング言語の全体像を把握したい場合に使います。
プログラミング言語に関するコンテンツは、ありがたいことに、ネット上にあふれています。これらを見繕って、学んでいけばほとんど事足りてしまいます。バグの修正方法もインターネット上で見つけることができます。いま目の前にある問題は、すでに誰かが遭遇し、その解決策を提供してくれています。悩む前に、検索してみると、数多くの糸口を見つけることができるでしょう。
■ プログラミングに必要な知識をインプットする
プログラミングに必要になる知識は、次の3つです。ただし、どれも受験勉強のように暗記する必要はありません。あとで調べ直せる程度で、キーワードを頭に入れておくだけで構いません。
①プログラミング言語の文法
どんなプログラミング言語も、学ぶことは決まっています。以下について、ざっと知っておきます。うる覚えでかまいません。心配しなくても、プログラミングしていくうちに覚えます。
・データ型
整数、実数、文字列、バイナリの表現
・配列
データを複数入れるための入れ物の扱い
・基本文法
四則演算子(+、-、×、÷)、論理演算子(AND、OR)、スコープ(一文の終わり、範囲の指定など)
・条件分岐
IF文(もし~ならば)、CASE(パターン分け)
・繰り返し
同じ処理を回す方法
②ライブラリの使い方
プログラミング言語に、どんなライブラリと関数があるのかを知っておきます。
プログラミング言語には、標準に備わっているライブラリがあります。文字列操作、データ変換などの基本的な処理をわざわざプログラミングしなくてもライブラリが備える関数を呼び出すだけで実施できます。その他、ファイル、通信、セキュリティ、データベースなどを制御する関数も備えています。
③システムコールの使い方
OSにも、システムコールと呼ばれるOSの機能を使うための関数があります。システムコールはC言語の関数として定義されていますが、他のプログラミング言語からこれらの関数をライブラリ経由で呼び出せます。OSのシステムコールについても、どんな関数があるのかを知っておき、それに対応するライブラリを知っておきます。
■ ロジックを書く
プログラミングとは、言葉でロジックを考えて、それをプログラミング言語に置き換える作業です。
プログラムのロジックとは、プログラミング言語を使ってつくる一連の処理の流れ(フロー)です。たとえば、「もし、明日、雨ならば、傘を持って行く」という文章は、条件と行動が正しいと考えられる理屈です。同じように、「もし、商品数が100個未満になったら、仕入れ先に発注データを送信する」というように、まずは、言葉でロジックを組み立てます。
この言葉のロジックを、プログラミング言語で定義されるデータ型、配列、基本文法、条件分岐、繰り返し、そして、ライブラリとシステムコールを使って、置き換えていきます。
「商品数」は”整数”、「100個未満」は”条件分岐”、「発注データ」は”バイナリ”、「送信する」はTCP/IPで通信するためのライブラリやシステムを呼び出す、というような流れでロジックをプログラミングします。
いきなり、プログラミングをすることは難しいでしょうから、まず、プログラミングに慣れるため「コピペ・コーディング」をしてみます。興味のあるテーマでインターネットを検索し、誰かが書いたプログラムを見つけ、そのままコピペして、動かしてみるのです。動かしながら、コードを追って、その動きを理解していきます。これによって、ロジックの組み立て方を学んでいきます。
これを繰り返していくと、これらの処理をマネて、新しいロジックを考えられるようになっていきます。
■ デバックする
プログラミングしたロジックが、一発で考えた通りに動作することは、ほとんどありません。必ず、何かしらの間違いが含まれているものです。そのための、間違い探しの作業がデバックです。
デバックでは、動作させるための仮のデータ(テストデータ)を使って、考えた通りのロジックになっていることを念入りに確認していきます。テストデータは、ロジックの入力となるデータであり、以下の例であれば、商品数となります。
「もし、商品数が100個未満になったら、仕入れ先に発注データを送信する」
たとえば、商品数のデータを仮に99個、100個、101個として、プログラムを動かし、ロジックが正しいことを確認します。このロジックでは、商品数が99個のときだけ、発注データが送信されることになります。
しかし、実際にプログラムを動かしてみると、99個と100個で、発注データが送信されてしまうことがあるかもしれません。これは間違いです。
その場所を見つけるため、デバッカーを使って、商品数に100個のデータを設定し、1ステップづつ動かしていくと、条件分岐のコードが、100個未満ではなく、100個以下で判断していることがわかります。条件分岐を100個未満に修正し、再度、テストデータを使って動作させ、ロジック通りであることを確認します。
このように、デバックによって、プログラミングする人の思い込みによる間違いを客観的に観察することで、ロジックの正当性を見極めていきます。
■ まとめ
プログラミング言語は、どれも骨子は同じです。新しい言語も細かなルールや定義の違いがあるにせよ、どれも似ています。
したがって、何か一つのプログラミング言語さえ身につけてしまえば、新しいプログラミング言語を習得するまでの時間を短縮することができます。
複数のプログラミング言語を使いこなすエンジニアは、「フルスタックエンジニア」と呼ばれたりします。
システムやソフトウェアは、役割や機能によって幾つかのサブシステムに分割されて開発する必要があり、各々に適したプログラミング言語が使われることになります。
そのため、一人で何役もこなせる「フルスタックエンジニア」が求められるのです。
ソフトウェア開発・システム開発業務/セキュリティ関連業務/ネットワーク関連業務/最新技術に関する業務など、「学習力×発想力×達成力×熱意」で技術開発の実現をサポート。お気軽にお問合せ下さい