Optima

生産性を向上する系ブログ

構成する力と粘り強さ

プログラミングを学ぶ意義はどこにあるのか

たしかにプログラミングは受験数学や学術研究、ビジネスのフレームと近い構造を持っていますが、それだけを取り上げてアピールしてもプログラミングの真価を推し量ることはできないと思います。

そういったプログラミング以外の人間の営みとの類似性だけでは、プログラミングを学ぶ純粋な意味での重要性が見えにくいはずです。

私は、何かと見落とされがちなプログラミング独自の特性を把握するために、少しプログラミングについて考えてみることにしました。

そういった本当の意味での「プログラミングを学ぶ意義」を把握できていない状態では、結局どのような教材やカリキュラム、指導が最適なのかを判断できないまま、ひとまずそれらしく体系立てたものを手当たり次第に教えるだけ(学ぶだけ)のプログラミング学習になってしまう気がしています。

私たちはプログラミングを学ぶべきか

今日、ピアニストにならない多くの子どもがピアノを習うように、プログラマーにならない多くの子どもがプログラミングを習う時代にさしかかっているように思います。

とはいえ、プログラミング学習によって生計を立てるだけのスキルを身につけやすいこ点では、他の習い事と毛色が違っています。

現役のプログラマーがなぜ生計を立てて暮らしていけるかというと、一定水準以上で「分解し構成する力」と「粘り強さ」を持っているからだと私は考えています。

つまり、プログラミングに親しむ中で「分解し構成する力」と「粘り強さ」が向上する水準は他の学習とは一線を画しているという仮説を持っています。

「プログラマーにならないとしてもプログラミングをやる価値はある」のかどうかは丁寧に議論されるべきだと思うのです。

重要なポイントは、プログラミングを習ったにも関わらずプログラミングはそれほどできるようにならなかったが、構成力や粘り強さは身につくか否か。この一点に尽きるのではないでしょうか。

このテーマで考えを整理することで、プログラミングを学ぶこと自体の真価やプログラミング適正(その人がプログラミングを技術として身につけられるか否か)の判断基準に迫るきっかけ等が得られるのではないかと期待しています。

構成力・粘り強さ(*)とは何か  これら(*)があれば①アプリケーション開発ができるのか?②受験数学の問題が解けるのか?③研究活動を高い水準で行えるのか?④ビジネスを成功させることができるのか?創造性の高い仕事ができる(★)のか?

答えは「できない」である。 構成力・粘り強さは上記の①~④そして★の複数ある要件の一つである。 ①~④にはそれぞれ別の要件(#)があることが推測される。

 (★) = (*) + (#)

前置き

仮に①~④の*以外の要件#を以下のようにそれぞれ固有に仮定する。 ただし、これらは記号が違っているものの、共通する要素も含まれている可能性もある。

 ①:○  ②:◎  ③:◉  ④:● すると、要件が揃えば①〜④を満たすことを以下のように表現できる。

 ① = * + ○  ② = * + ◎  ③ = * + ◉  ④ = * + ●

 このように①~④全てに*が共通するからこそ、プログラミング学習時にも「構成力や粘り強さ(*)」を身につける意識が非常に重要である。その一方で、わざわざプログラミングをやる以上は、その技術も十分な水準で獲得することが望ましいことも明らかである。それを実現するためのヒントは①の他の要件である○と他の◎◉●の違いに隠れていると考えられる。

プログラミングを身につけるために必要な3つの力とは?

昨年の秋ごろから半年ほどプログラミングを学んでみて気づいたことがあります。

それが何かというと、プログラミングを身につけるために必要になってくる力がどういうものなのかがわかったような気がしているのですね。

せっかくなのでこれについて書いておこうと思います。

 

私は、プログラミングを身につけるために最も必要な力は「最適を自ら判断し受け入れた上で即実践する力」だと感じています。

これを3つに分解してさらに具体化すると以下のようになるかと思います。

 

構造化プログラミングとアプリケーション構成の基本事項を忠実に守り、その前提を完璧にクリアした上で「自由」に組み立てる力

 

  • 逐次実行、条件分岐、繰返しの概念
  • クラス、インスタンス、オブジェクト指向
  • モデル、ビュー、コントローラーの概念

 

 

それが最適ならどれだけ多くても小分けにして「全て」試しきる粘り強さ

  • タイプミスエラーの特定
  • ライブラリやフレームワークの衝突の解消
  • 環境構築で詰まった時に必要な再インストール

 

簡易的なアプリケーションの再構成を最低限の量経験し、それを踏まえて自分で作るアプリに最適な全体設計を帰納的に導く力

  • データベースの設計
  • ページのレイアウト構成
  • 使うライブラリやフレームワークの選定

 

プログラミングをやる上で鉄の掟を守って自由にいろいろ創ること

守るべきことを守った上で攻める、というのは、マナーやブランドイメージを守った上でバリバリ働くとか、「お行儀よくすること」が求められる状況ではそれを守った上でそれが必要ないところでは好奇心の赴くまま自由に振る舞うとか、そういうのに近いですね。


『あらかじめルールを決めておきそれを守ることで、あとで不都合を出さずにうまくやっていくことができる』

 

プログラミングを学ぶと、論理的な思考ができるようになる

ということを最近よく聞くようになりましたが、上記のようなことを考える中で、プログラミングを通して論理力よりも大切なことが学べるような気がしたのでした。

【手習い】JavaScript + Node.jsでつくる簡易的なタスク管理アプリ

プログラミングはアプリ作りながら要点を押さえることで爆速で学べます。

 

本やネットでの基本の解説はとても大切ですが、どうしてそれをするのかがわからないということが多々あります。

プログラミングができるようになるには、なるべくエラーが出ない環境で実際に動くアプリを作ってしまうのが最善手です。

 

なので、プログラミング学習を最適化する試みの1つとして、プロジェクトマネジメントシステムで私自身が学んだことをレクチャーしながら手習い教材としてまとめていきたいと思います。

 

目次

記録の理由

WEBサービスをつくる過程のログを取る理由

このブログではWEBサービスを公開するまでの道のりの記録も行っていきます。 理由は3つあります。

  • 今後10年間で拡大していくワークスタイルを実践するにあたりプログラミングは強力な武器になるから
  • 一方で、ネットにはスキル習得を助ける情報があふれていてサービスのつくりかたを0〜10まで説明するページはほとんどないから
  • 自分自身が複数のWEBサービスをつくる中で、WEBサービス制作のスキームを最適化するため

作りたいと考えている生産性を向上させるアプリケーション

  • プロジェクトマネジメントシステム
  • 学習を加速するチートシートまとめ
  • クラッチタイムマッチングシステム
  • 最適化された動画研修システム
  • 子どもの集まる場の管理者向けに最適化された管理システム