はじめに
皆さん、「プログラミング」をやったことはありますか?
最近では小学生も「Scratch」を触っていると聞いて、「時代変わったな…」と思ったりもしましたが、
今回は特に「CUIプログラミング」の方についてお話しようと思います。
「CUIプログラミングって何?」って思った人へ。あの「文字がダーッと書かれてるヤツ」です。
(CUI は Character User Interface の略です。Characterが『文字』の意味なので、「使用者側が文字ベースでやり取りする」ということです。一方で「Scratch」の方はGUI(Graphical User Interface)プログラミングと呼ばれ、使用者側が図で直感的にできるプログラミングとなります)
C言語やPythonといったプログラミング言語が、CUIプログラミングの方に当てはまります。
上二つの言語を習ったことがある人の中には、
「結局プログラミングって何?」
「課題で書いたことあるけど、何やってるのか分からなかった」
と思っている人もいると思います。
今回はそんなプログラミングを「仕事」に例えてお話してみようと思いますので、興味のある方はぜひご一読ください。
(個人的にプログラミングしていて思ったことを、つらつらと書いています。あくまでも例えなので、内容の正確性を保証できません。ご了承ください。)
プログラムは命令文の集まり
プログラミングしたいと思うときは、多くの場合「コンピュータにこんな事をさせたい」という要望があると思います。
プログラミングはその要望を叶えるために、基本的な命令文を組み合わせて一つの大きな命令「プログラム」を作る作業の事です。
コンピュータができる処理は
- データ(数字、文字など)の記録
- 基本的な演算
- 外部機器との通信or操作
ですので、上の3種類の処理を上手に組み合わせて、要望通りの処理を行うようプログラミングしていきます。
プログラムを「企業の業務」で例える
例えばあなたが、ものづくりサービスを提供するA社の従業員だとします。
今回、あなたにはA社から新しく「オーダーメイドで自動車を提供する」サービスを作る仕事が与えられました。
一言で自動車を作ると言っても、やることはとても多そうですよね?
まず動力部分やボディ、タイヤなどのパーツが必要ですし、各パーツごとに分解していけば、最終的にはネジなどの機械部品がたくさん出てくると思います。ここで話を簡単にするために、主な仕事内容は
- 依頼者から注文を受け取る
- 注文に合わせて自動車の設計図を考える
- 必要な部品を揃える
- 組み立てる
- 依頼者に自動車を渡す
としましょう。さて、あなたなら、どのようにサービスを作りますか?
実はこの「サービスの設計・構築」こそが、プログラミングなのです。
仕事で例える「関数」
サービスの中身を考える
さて、A社から仕事を与えられたあなたは、
「部品を一から作ろう」
なんて考えるかもしれません。
もちろん、A社やあなたに「金属を集める能力や加工する技術」があれば、十分にあり得る選択肢でしょう。
しかしA社が新しく自動車製作サービスを始めている以上、そんな高度な能力や技術はないと考えた方が自然ですね。
自動車を制作する仕事を与えられたら、普通、
「部品は注文して手に入れよう」
と考えると思います。
さて、この「注文して手に入れる」という選択ですが、これはつまり「自動車部品を提供するサービス」に依頼をする、ということです。
仮に、この「自動車部品提供サービス」の運営会社をB社としましょう。
よってあなたが構築する自動車提供サービスの中身は、
- 依頼者から注文を受け取る
- 注文に合わせて自動車の設計図を考える
- B社に必要な部品を注文をする
- 組み立てる
- 依頼者に自動車を渡す
となります。
ここで、注文を受けているB社の「自動車部品提供サービス」の中身を見てみましょう。
- 依頼者から注文を受け取る
- 注文に合わせて自動車部品の設計図を考える
- C社に必要な材料(金属)を注文する
- D社にネジなどの機械部品を注文する
- 加工して自動車部品を製作する
- 依頼者に自動車部品を渡す
A社とやっていることがすごく似ているのが分かりますか?
注文を受ける > 製作する(必要に応じて他社に注文する) > 製品を渡す
つまり、
「A社のサービスにはB社のサービスが必要で、B社のサービスにはC社とD社のサービス必要で…」
という風に、サービスの中にまたサービスが入っていることがよくあります。
よく「下請け」と呼ばれるようなものも、外からは見えないような、サービスの中にあるサービスでしょう。
サービスはものづくりに限らず、
依頼を受ける > 仕事をする > 結果(報告・完成した製品)を渡す
という流れとなります。
「関数」はサービス
プログラミングも同じです。
プログラムを「要望通りの処理を行う」ようなサービスだと考えると、その中の処理で、プログラムを簡単にするために他のサービスに頼ることが頻繁にあります。
そこで、
依頼を受ける > 処理をする >結果(情報)を渡す
という一連のまとまりを、プログラミングでは「関数」と呼びます。
さて、関数はどのように使うのでしょうか。実は、サービスと全く同じ考え方が適用できます。
例えばプログラム内に、「複数行にわたる一連の処理」が度々現れるとき、その度にいちいちコードを複数行書くのは面倒ですよね? 部品を一から作ると大変な作業になるのと同じように、プログラムが長くなって見づらくなったり、エラーを生み出しやすくなります。
そこで別会社のサービスとして、新たに一連の処理を行う関数を作ります。
def 関数名 (引数)
{
処理内容
return 返り値
}
関数名(サービス名) :一連の処理の名前
引数(依頼書・注文書):一連の処理に必要な情報
返り値(結果の提供) :関数呼び出し元(依頼主)が求めている情報・データ
処理内容 :一連の処理のこと
これらを決めて、プログラム内に定義する(サービスを立ち上げる)ことで、プログラム内で関数が呼び出せる、つまりサービスを利用することができるようになります。
関数の呼び出し方は、例えばこんな感じでしょうか。
関数名(引数) #関数の返り値がない場合
変数 = 関数名(引数) #関数の返り値を受け取る場合
プログラミングはサービス委託だらけ
関数は自分で作るだけではありません。
PC上で文字を表示させたい、あるいはキーボードに入力した文字を読み取りたいとき、C言語だとprintf関数、scanf関数、pythonだとprint関数やinput関数を使いますよね。
これは「あらかじめ用意されている関数」なのです。
これがないと、文字を表示させたり、キーボードの入力を読み取る処理を行うのは難しそうですよね。
また、複雑な数学の計算や時間に関する処理など、たくさんのプログラムに使われそうな関数は、
予め用意されていたり、なければ誰かが作って公開してくれてたりします。
こういう「何かに関してよく使いそうな関数」をまとめて、関数セットのようにしたものを「ライブラリ」といいます。(本当は関数以外にも、定数やその他いろいろが入っていたりします)
プログラムは基本的な演算以外は関数による処理なので、そういう意味ではサービス委託だらけですね。
例えばA社の「自動車提供サービス」を無理やりプログラムで書こうとすると、
大体の業務は基本的な演算で書けなさそうなので、関数を用いてこのように表せます。
def car_provide(order) # サービス名[自動車提供], 引数[注文]
{
# [設計]サービスを引数[注文]で依頼し、[設計図]をもらう
blueprint = design(order)
# [自動車部品調達]サービスを引数[設計図]で依頼し、[自動車部品]をもらう
car_parts = car_parts_procure(blueprint)
#[組み立て]サービスを引数[設計図]と[自動車部品]で依頼し、自動車をもらう
car = assembly(blueprint, car_parts)
# 依頼者に自動車を渡す(返り値[車])
return car
}
(あれ、A社って何もやってない…?)
関数はサービス委託と同じで、手っ取り早い分、中身を知らずに実行できてしまうので、問題があったときに自分でどうにかすることが難しいです。
もし自由度やカスタマイズ性を求めるなら、ぜひ自社製の関数をご使用ください。
おわりに
始めて記事を書いてみましたが、うまく伝えたいことが伝わってるかどうか…。
次回があれば、こんどは「仕事で例えるオブジェクト指向」をやってみたいと思います。