【OJT担当者必見！】苦手意識を無くそう！プログラミングを楽しく教えるためのコツ

# 【OJT担当者必見！】苦手意識を無くそう！プログラミングを楽しく教えるためのコツ

## 序章

### まえがき

先日、電車に乗った際にふと広告が目にとまりました。

[https://x.com/urban_89s/status/1763413640609480870](https://x.com/urban_89s/status/1763413640609480870)

スタイルシートっぽく書かれた求人広告なわけですが、これを見てエンジニア歴20年の私は「にやり」としました。電車で急に「にやり」としたので、文系の妻が「なんかあったの？」と声をかけてきましたので、こんな会話をしました。（実際のやり取りにあわせて関西弁でお届けします。）

* 私：この広告見て。おしゃれやで。
* 妻：なんや、英語で書いてあるやん。あんた英語読めるんか。すごいな。私も英語勉強せなあかんな。
* 私：いやいや、プログラミング風に書いてて、なかなかおしゃれやな、と思ったわけよ。
* 妻：プログラミング！？はい、絶対無理。意味わからんしそんなん読めるわけない。そんなので笑ってたのかよ。出たよ、理系自慢。
* 私：・・・・。。。

### はじめに

世の中のOJT担当となる熟練エンジニアの方は、多かれ少なかれ以下のような経験があると思います。

* Python使ってます、と非IT系の人に言ったら神扱いされる。
* 「ソースコードに書いてるから読め」といったら「それはアナタだから読めるんです。私には読めません。」と返された。

そして、このような経験を持つ熟練エンジニアの方が、新人エンジニアにプログラミングを学ばせようとするときに、こんなことを言われていませんか？

* プログラミングが簡単っておっしゃいますけど、あなたができるからそんなこと言うのですよ。初心者の私には難しいのです。やったことないのですから！
* そりゃ、先輩のようにプログラミングできたら良いと思いますけど、文系出身の自分にどこまでできるか不安です。

この記事では、私がこれまでOJT担当として、プログラミング初学者がプログラミングに対する苦手意識を無くすために、OJT前に話をしている内容をまとめました。

プログラミング初学者に対して、このような話を最初にすることで、心理的なハードルが下がり、自発的に学習を進めてもらうことができるようになると思います。

### この記事の対象者

* 新人のOJT担当となったが、どのように教えていけば良いか悩んでいる方
* 後輩や部下にプログラミングが楽しいものである、と教えたいが上手く説明できない方

### 注意事項

このあと記載する考え方は、私が約20年間システムエンジニアとして活動してきた経験と知識から構成されているものです。そして、多少の飛躍的な考え方もあるので、熟練者の方から見たら「むむ！違うぞ。」と思う部分もあると思いますが、その点はご承知おきいただけたらと思います。

ただ、間違いがあってはいけませんので、明らかな間違いについてはコメントでご意見いただけると嬉しいです。

## 本題

### そもそもプログラミング言語ってなんですか？

まずは、初学者に対してプログラミング言語の歴史を説明しましょう。


- プログラミング言語の歴史は、1950年代のFORTRANやLISPから始まり、1960年代にはCOBOLやALGOLが登場。
- 1970年代にはCやPascal、Smalltalkが開発され、1980年代にはC++やPerlが普及。
- 1990年代にはインターネットの普及に伴い、Python、Java、JavaScriptが重要な役割を果たしました。
- 2000年代にはC#やRuby、Pythonが登場し、2010年代にはSwiftやKotlin、Goが注目されました。
- 最近ではRustやTypeScriptが新しいトレンドとして注目されています。

プログラミング言語の歴史をWEB検索するとこのような説明を見かけますが、いきなりこんな風に説明してはいけません。これでは苦手意識が高まってしまいます。

私ならこういう話し方をします。

- 昔は、コンピュータに命令するには、0と1の数字をたくさん並べて、コンピュータが直接理解できる言葉で話しかける必要がありました。まるで、外国語を全く知らない人が、ジェスチャーだけで意思疎通しようとするような感じ！ 例えば、"アセンブリ言語"と呼ばれる言語は、まさにこの0と1に近い、コンピュータに直接指示を出す言葉でした。
- でも、そんな難しいことはやってられないですよね。そこで、人間が普段使っている言葉に近い、もっと分かりやすいプログラミング言語が登場しました。これが、"高水準言語"です。例えば、"C言語"は、"足し算"を"add"、"引き算"を"sub"といった英語で表現できます。日本語で「足し算」と書くように、コンピュータにも「add」という言葉で命令できるようになったんです。
- さらに、最近のプログラミング言語は、より人間が理解しやすいように、文章のように書けるものも出てきました。例えば、"Python"は、英語に似たシンプルな文法で書けるので、まるで日本語で会話しているような感覚で、プログラムを書けます。また、"JavaScript"は、ウェブサイトに動きやインタラクションを追加するために使われる言語で、ブラウザ上で動作するため、環境構築が比較的簡単です。
- 近年では、"Rust"のように、安全で高速なソフトウェア開発に特化した言語も登場しています。Rustは、メモリ管理を自動で行うことで、プログラムの安定性を高める機能が備わっており、システムプログラミングやWebアプリケーション開発など、様々な分野で注目されています。
- このように、プログラミングは、昔は"アセンブリ言語"のように難しくて専門家しか扱えなかったものが、今では"Python"、"JavaScript"、"Rust"のように、比較的人間が理解しやすくなっており、プログラミングができる人が増加しています。

このようにして、プログラミング言語が「コンピューターとの会話のために必要なものだ」という認識を初学者にしてもらいます。重要なのは「命令」ではなく「会話」だということです。

### コンピューターと会話って言いますが、命令書くだけの一方的なものでしょう？

プログラミング言語とはコンピューターに命令をするものである、というのが一般的な定義でしょうが、私は命令という一方的なものではなく、会話をするためのものなのだと思います。

「いやいや、会話といいますが、あくまでもコンピューターに対して人間が命令を出すだけでしょ？一方的なものでは？」と思った方、それは違います！プログラミングでは、会話が必要なのです。

熟練エンジニアの方がプログラミングしてるとき、実はコンピューターと会話してます。以下、一例です。

* こんな感じで書いてみよか。
* おっと、そこでエラーになるわけね。
* なるほど、そっちの分岐を選ぶわけか。
* いや、それくらいわかるやろー。
* 動いてくれ頼む！

こんなことを熟練エンジニアは独り言のようにブツブツ言ってるのです。それもニヤニヤしながら！（笑）

でも、これってまさに対話してますよね。外国の方とオンラインチャットしてたらこんな感じになると思います。

このように、私はプログラミング言語は他の外国語と同様に対話するために必要なものだと考えています。ただ、対象がコンピューターという機械なだけです。

ですので、初学者の方には次のようにお話してあげてください。

* プログラミングを始めたばかりで、何だか難しそうだな、と感じているかもしれませんね。でも大丈夫！プログラミング言語は、実は外国語と同じようなものなんです。
* 想像してみてください。あなたが海外旅行に行った時、現地の言葉を全く知らないとどうなるでしょう？お店で何を注文したいのか、道を聞きたいのか、伝えられずに困ってしまうはずです。
* プログラミングも同じです。コンピュータは人間とは異なる「言語」で動いています。
* 私たちがコンピュータに何かを指示したり、作業をさせたりするためには、コンピュータが理解できる「言語」を学ぶ必要があるのです。これがプログラミング言語です。
* プログラミング言語には、英語やフランス語、日本語のように様々な種類があります。それぞれ特徴や用途が異なりますが、共通しているのは「コンピュータに指示を与えるための手段」であるということです。
* 例えば、「画面に『こんにちは』と表示する」という指示をコンピュータに伝えたいとしましょう。
* この場合、「print('こんにちは')」のように、プログラミング言語を使ってコンピュータに指示を出します。
* コンピュータは、この指示を理解し、画面に「こんにちは」と表示してくれます。
* このように、プログラミング言語は、私たち人間とコンピュータのコミュニケーションを円滑にするためのツールなのです。

### 人間が会話するための一般的な言語とプログラミングの違いって何ですか？

ここまでの話の流れで、初学者にとってプログラミングに対するハードルは少しは下がったと思いますが、まだまだ「ピンと来てません！」という声が聞こえてくると思います。

ここで、英語やフランス語、日本語を含む一般的な言語とプログラミング言語の違いについて解説を入れましょう。

| 特徴 | 外国語 | プログラミング言語 |
|:-----------|:------------|:------------|
|目的|人間同士のコミュニケーション|コンピューターへの命令|
|表現力|   幅広く、曖昧な表現も可能|   制限的で、明確な指示のみ|
|解釈|    状況や文化によって異なる解釈が生じる可能性がある|   コンピューターは明確な指示に従う|
|柔軟性|   文法や表現に柔軟性がある|   厳格な構文規則に従う必要がある|
|曖昧性|   曖昧な表現が存在する| 曖昧な表現は許容されない|
|進化|    常に進化し、新しい言葉や表現が生まれている|  新しい言語やバージョンが開発される|
|習得難易度| 人によって異なり、努力次第で習得できる|    言語の構造を理解する必要があるため、学習難易度が高い|
|誤り|    誤解を生み、コミュニケーションが円滑に進まない可能性がある|  エラーが発生し、プログラムが動作しない|

こう説明してしまうと、もしかすると混乱する可能性があります。ですので、例題とあわせて説明してでみましょう。

#### 例題：あなたは友人(またはコンピューター)に「明日の朝8時にコーヒーを淹れてほしい」と頼みたい。

**外国語での表現**

- 表現①: "明日、コーヒーを淹れてくれる？" (何時に、どのコーヒーを淹れてほしいのか、具体的な指示がないので8時に淹れてくれないかもしれない。)
- 表現②: "明日、8時に、ブラックコーヒーを淹れてくれる？" (時間とコーヒーの種類を明確に指示しているが20時に淹れてくれるかもしれない。)

**プログラミング言語での表現**

```python
def make_coffee(time, type):
  print(f"おはようございます。{time}時に{type}を淹れます。")

make_coffee("8:00", "ブラックコーヒー")
```

（make_coffeeという関数を使って、コーヒーを淹れる時間と種類を明確に指定し、コンピューターに指示を与えています。これだと間違いようがないですね。）

### プログラミング言語だけやっていれば良いというわけではないのですね！

つまり、OJT担当者がプログラミング初学者に伝えないといけないことは以下の内容だと思います。

- 【1】プログラミング言語はツール、人間とのコミュニケーションも大切
  - プログラミング言語をマスターしても、それを活用して誰かと協力したり、自分の考えを伝えたりすることができなければ、その力は十分に発揮できません。
  - チームで開発を行う場合、自分の考えを明確に伝え、相手の意見を理解するコミュニケーション能力は不可欠です。
  - 顧客やユーザーからの要望を理解し、それをプログラムに落とし込むためには、相手の言葉に耳を傾け、共感する能力が必要です。

- 【2】人間とコンピューターの得意分野を理解し、業務を効率化
  - 人間は創造性、柔軟性、共感力に優れています。複雑な状況判断や、他者とのコミュニケーションを必要とする業務は人間に任せるべきです。
  - コンピューターは正確性、高速処理、膨大なデータ処理に優れています。反復的な作業や、大量のデータ分析はコンピューターに任せることで効率化できます。
  - どのような業務を人間に、どのような業務をコンピューターに任せるかを判断することで、より効率的なシステムを構築できます。

- 【3】AI時代における人間の役割
  - AIは人間の能力を拡張し、新たな可能性を切り開く強力なツールです。
  - しかし、AIは倫理的な判断や責任を負うことはできません。
  - AIを活用することで、人間はより創造的な活動に集中し、より高度な課題に挑戦できます。
  - AI時代においても、人間は独自の能力を生かし、AIと協力することで、より良い未来を創造していくことができます。

## まとめ

要は、日本語、英語、スペイン語、ポルトガル語、と同列でPython、Ruby、Java、C#といったプログラミング言語が並ぶ時代になっています、ということがこの記事でお伝えしたかったことです。人間もコンピューターとも同列に扱って業務を改革していきましょう、ということですね。

ちなみに、プログラミング言語の学習については、初学者に対して私はこのように伝えています。

* これまでの皆さんの経験値で、外国語を学んだり、学習方法を調べたことがあると思います。
 * 単語を覚える
 * 文法を学ぶ
 * 最初はうまくいかずとも、積極的に使っていく
* 上記のような外国語の覚え方は、そのままプログラミング学習でも同じことだと私は考えます。ですので、あまり肩肘張らず特別なことに取り組む感覚ではなく、外国語に挑戦するような感覚で取り組んでみてはどうでしょうか。

総じて、**プログラミングは、単に言語を学ぶだけでなく、人間とコミュニケーションをとりコンピューターとのコミュニケーションを通してより良い未来を創造するための手段である**ということです。これを初学者にしっかりと理解してもらえれば、立派なエンジニアに育っていってもらえるのではないかと思います。

## 余談

まえがきで書いていた妻とのやり取りの続きです。

* 私：プログラミング言語って特別っていうけど、そんなことない。英語と一緒やで！（この後、↑の話を簡単に説明。）
* 妻：そんなわけないやろ。プログラムはプログラム。英語は英語。何を言ってるねん。

・・・、まあ、こんなもんですよね（笑）

妻には時間をかけて説明していきたいと思います！

## おしらせ

弊社X（旧：Twitter）では、Qiita投稿に関する情報や各種セミナー情報をお届けしております。情報収集や学びの場を求める皆さん！ぜひフォローしていただき、最新情報を手に入れてください:grinning:

https://x.com/kccs_digital