仕事で例えるプログラミング

# はじめに
皆さん、「プログラミング」をやったことはありますか？

最近では小学生も「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関数を使いますよね。

これは「あらかじめ用意されている関数」なのです。
これがないと、文字を表示させたり、キーボードの入力を読み取る処理を行うのは難しそうですよね。

また、複雑な数学の計算や時間に関する処理など、たくさんのプログラムに使われそうな関数は、
予め用意されていたり、なければ誰かが作って公開してくれてたりします。

こういう「何かに関してよく使いそうな関数」をまとめて、関数セットのようにしたものを「ライブラリ」といいます。（本当は関数以外にも、定数やその他いろいろが入っていたりします）

プログラムは基本的な演算以外は関数による処理なので、そういう意味ではサービス委託だらけですね。

例えばＡ社の「自動車提供サービス」を無理やりプログラムで書こうとすると、
大体の業務は基本的な演算で書けなさそうなので、関数を用いてこのように表せます。

~~~Python
def car_provide(order) # サービス名[自動車提供], 引数[注文]
{
    # [設計]サービスを引数[注文]で依頼し、[設計図]をもらう
    blueprint = design(order) 

    # [自動車部品調達]サービスを引数[設計図]で依頼し、[自動車部品]をもらう
    car_parts = car_parts_procure(blueprint)

    #[組み立て]サービスを引数[設計図]と[自動車部品]で依頼し、自動車をもらう
    car = assembly(blueprint, car_parts)

    # 依頼者に自動車を渡す（返り値[車]）
    return car
}
~~~

（あれ、Ａ社って何もやってない…？）

関数はサービス委託と同じで、手っ取り早い分、中身を知らずに実行できてしまうので、問題があったときに自分でどうにかすることが難しいです。

もし自由度やカスタマイズ性を求めるなら、ぜひ自社製の関数をご使用ください。

# おわりに
始めて記事を書いてみましたが、うまく伝えたいことが伝わってるかどうか…。

次回があれば、こんどは「仕事で例えるオブジェクト指向」をやってみたいと思います。