プログラミングを覚えたいという方へ

　こんにちは。ディマージシェアの技術担当です。今回は、未経験でプログラミングに興味がある、という方へ情報を書いてみたいと思います。
　漠然と、プログラミングを覚えてみたいけど情報が多すぎて行動に移せない、という方へのお手伝いになれば幸いです。

# 向いている人、向いていない人（1）
　まずは適性があるかどうか、これに尽きると思います。プログラミングは道具です。道具の使い方を覚えたところで使う機会に恵まれなければ無駄になってしまいます。
　DIYの世界と似ています。ノコギリや金槌の使い方を覚えても実際に何か目標がなければ意味がありません。「貯金箱を作りたい」から、「家をDIYしたい」まで目標はいろいろ考えられます。
　プログラミングの世界でも同様で、「ゲームを作りたい」、「単調な繰り返し作業を楽にしたい」、「ロボットを動かしたい」など、様々な目標が考えられます。プログラミングはこれらの目標を実現する道具の1つなのです。初心者の方で多いのが、
「**プログラミングに興味がある、おすすめのコンテンツを紹介してほしい**」
　というパターンです。一言にプログラミングと言っても、目的に応じて選ばれるプログラミング言語、その他ツールは変わります。目的が無い状態でプログラミングというコンテンツに接触を試みると、あまりにも膨大な情報が広がっており初心者が捌くのは現実的ではありません。
　そして、ある程度の経験者は上記の質問に対して必ず「**何をしたいの？**」と返します。質問した方からすると意地悪に聞こえてしまうかもしれませんが、プログラミングの世界は目的が定まるとそれを達成するために必要な情報が極めて少なくなります。
　「**どの言語がおすすめ？**」と聞いても答えは同様に「**何をするの？**」です。目的によって適した言語が違うためです。
　従って、漠然とプログラミングを覚えたいという場合は、なんでもよいので何かしら作りたいもの、目標をセッティングすることが第一歩になります。経験者からの「やりたいことは？」にスムーズに答えられなければ、残念ながら向いているとは言えないと考えます。
　DIYの世界で例えると、「木製の貯金箱を作りたい」という目的なら、ノコギリ、金槌の原始的な工具で十分ですが、「家を建てたい」という話になると原始的な工具だととても大変です。電動工具や重機を用意する方法が現実的になります。目的に応じて適した道具を選ぶことが重要です。

　また、目的を先行させることで学習の効率を上げることができます。例えば、プログラミング言語の参考書籍を読む際、目的が定まっている場合は読むべきコンテンツは書籍全体の1割も要らないケースが多いでしょう。多くの書籍は道具の使い方を端から端まで書いてあります。初歩的な内容から高度な内容まで濃淡あります。内容を「必須」、「覚えた方がよい」、「いまは不要」くらいの3段階程度に分けることを考えてみましょう。目的がはっきりしない状態で書籍の先頭から読み始めると、情報の重要さの判断が難しく全ての情報を等しく覚えようとして頓挫するケースがとても多いです。目的を達成することを念頭に書籍の内容を眺めると、すぐに使えそうな情報、いまは不要そうな情報、と取捨選択することができます。
　不要そうな情報は端的に言えば難しくてすぐに理解できなさそうな情報です。C言語で例を挙げるならば、「関数ポインタ」、「共用体」などがわかりやすいでしょうか。これらはC言語の世界では比較的理解が難しい項目で、人によっては一生無縁な項目でもあります。もちろん、使う人は正しく理解して使っています。
　書籍には、今すぐに必要な情報、将来有用な情報、将来的にも使うかどうかわからない情報が混在しているのです。

　適度な目標を設定して、参考書籍の中から必要な情報をピックアップして目標を達成する、という行動は比較的短いサイクルで実行することができ、
それが成功体験として記憶されることによりモチベーションをキープしやすくなります。
　書籍全体に目を通さなくてもよいわけではありません。上記の行動では知識の網羅性を担保できないため別途補う必要があり、適当なタイミングで書籍全体に目を通す必要があります。このとき、不足している知識にフォーカスしているので必然的に読むべき情報量は少なくなり、おもむろに初見の情報を大量インプットするのと比較して効率の良い学習となります。

※補足
　コンピュータサイエンスを勉強したい、というケースは一旦忘れてください。コンピュータサイエンスの勉強でも、もちろんプログラミングは行いますが、何かを作る目的よりも学術的な知識を得る目的になるので本記事の趣旨とは異なります。

# 向いている人、向いていない人（2）
　次は、プログラミングを用いてなにか作成するときに、得手不得手がはっきり出てしまうポイントを紹介します。

　**解決したい課題の細分化**

これが最も大きいと考えています。プログラムを記述する際の最小単位はおおよそ、
・分岐
・繰り返し
の2要素です。プログラムで解決できる課題は細かく細分化すると、この2要素まで必ず分解できます。この工程をスムーズに行える人はとても良い適正を持っています。
　「1～10の数字を足し算して出力するプログラム」も「ルービックキューブの最短解を求めるプログラム」も、ソースコード全体から無作為に2～3行をピックアップすれば、どこを選んでも分岐か繰り返しの構文です。
　　※厳密には、入出力、関数コール、各種宣言など、他の断片もあります　　　
　　　が、本記事の本質とは外れるのでスルーしてください。
　言い換えると、分岐、繰り返しの書き方さえ知っていれば、組み合わせ次第で既存のほとんどのソフトウェアの動作を構築することができます。

　プログラミングを用いて課題を解決するには、課題を簡単な操作の組み合わせに分解する能力が必要になります。これはいわゆる「設計」ができるかどうかに当たります。
　例えば何か家具が欲しい、といった場合、組み立てキットのようなものを購入してしまえば、粗方加工済みの材料と組み立ての説明書が添付されています。道具さえ使えればほとんどの人が完成させることができるでしょう。これは設計が既に終わっているため、道具の使い方さえ知っていれば大丈夫というパターンです。
　対して、1点物のオリジナルの家具が欲しい、といった場合は設計から始めなければなりません。プログラミングを用いて何か作りたい、という際、インターネットで検索すればすぐに見つかるようなものを欲しがる人は稀です。ダウンロードボタンを押せば手に入るからです。そのため、必然的に作りたいものは1点物になります。ここで設計の課題を何とかして解決しなければ完成させることができません。ここで選べる行動は、
・自力で設計を行う
・設計を誰かにやってもらう
・あきらめる
あたりになります。自力で設計ができれば何も問題はありません。あとは作るだけです。設計を誰かに頼む場合はお金がかかるケースが多いでしょう。設計とは、解決すべき課題にもよりますが比較的高度なスキルが必要な工程です。自力で解決するのが難しい場合は誰かを頼る、という選択も十分に考えられます。
　自力で設計のスキルを得ようとする場合、誰かと同じものを作るというのは良い行動です。設計・コーディングに慣れるためにインターネット上で公開されているものと同じものを作る行動はよく採用される訓練方法です。最近流行りの、問題を解く形式でプログラミングスキルのレベルを測る類のものも有効です。

　ところで、設計という工程は得意な人と苦手な人がいます。得意な人は、初めて作るものでも次々にこなしてしまいます。苦手な人は、類似ケースを頑張って探して乗り切ることが多いように感じます。
　苦手な人は、たくさんの設計をたくさん観察することである程度のレベルまで到達することができます。しかし、得意な人に追いつけるかと言えば、あまり現実的ではありません。
　スポーツで世界大会に出場している選手を頑張って追いかければ一般の方が世界大会に出られるかといえば、そうでないのと同じです。筆者もコンピュータサイエンスで国際学会に登壇し、そこそこ有名な論文誌に採録された経験があります。いわば世界大会プレイヤーです。よくある質問で、
「どうすれば高い技術を習得することができますか」
と聞かれます。この質問に良い答えがあれば、その内容を書籍にして大儲けしたいところです。回答としては、
「今と比べて相対的に成長することはできますが、絶対値で高いレベルまで到達できるかは本人次第です」
という内容になります。訓練・学習は自己の立ち位置を相対的に進める行動で、成長のスピード、到達できるレベルには個人差があります。

　設計に関わる能力が高い人はその能力を存分に発揮していただき、苦手な人は上達のための訓練をしてもよいですし、設計は誰かに手伝ってもらい、組み立てる工程だけを楽しむのもよいと思います。

　ちょっと話が逸れますが、世間一般の数学はペアノの公理の下に成り立っています。乱暴に言うと、「1 + 1 = 2」の応用で数学は成り立っているということです。ですが、「1 + 1 = 2」さえ理解すれば応用の勉強は不要とはなりません。数学の能力を競う大会もあります。プログラミングの世界にも通ずるものがあります。

# まとめ
　漠然と「プログラミングを覚えたい」と考えても、プログラミング自体は道具であり、スパナやドライバーを使うようなものです。道具の使い方自体は覚えるのにさほど苦労はありません。そして、道具が使えるだけでは身の回りはあまり便利にはなりません。道具を使って実現したい目的が伴う必要があります。
　目的が決まったら、目的を達成するために課題を細分化する必要があります。細分化が十分にできると実際にプログラムとして記述することができます。課題を細かい部品の組み合わせとして捉える能力が必要不可欠です。
　どの工程も得手不得手がはっきりしやすい世界です。最近ではPC1台で手軽に触れることのできる世界ですが、能力の1つとして身につけようとすると、乗り越えなければいけない課題は少なくありません。

　当社ではエンジニア職の24新卒採用を実施中です。
ご興味のある方は以下のHPからエントリーしていただき会社説明会へお越しください！

**＜当社の[新卒採用ページ](https://recruit.dimage.co.jp/new-graduate.html)はこちら＞**