創造性について考察する

プログラミング教育で得られるものというと、「論理的思考力」と「創造性」とよく言われている。

その創造性について考えてみたい。

 

創造性の定義はいったん置いておき。

プログラミング教育で創造性が身に付くのか?

僕はエンジニアといっぱい仕事をしている。プログラマーの多くが創造的だったかと言われると、NOと言わざるを得ない。むしろ、そうでない人のほうが多い。

ユニークなビジネスアイデア、企画を出す人は(もちろんエンジニアにもいるが)プロデューサーのような役割の人が多いし、エンジニア出身のスタートアップ経営者も相対的に(日本では)少ないと思う。

何より、僕はエンジニアだが、自分が創造的だとはまったく思わない。

 

プログラミングができると創造的でなくなる、と言っているわけではない。プログラミングができて創造的な人もたくさんいる。でも、プログラミングができることと、創造的であることに相関関係は見られない

 

仮に創造性を「アイデアをひらめくこと」だとすれば、プログラミングは、ひらめいたアイデアを具現化するプロセスである。創造性とは関係ない。

 

ではなぜ、プログラミング教育が創造性を育むと言われるのか?

新しいものを創るにはプログラミングが必要、だからプログラミングを学べば新しいものが創れる、すなわちプログラミングができるようになると創造性が身に付く、という論理の飛躍かな、と個人的には考えている。

 

なんとなく、創造性という言葉を、漠然と使っているのではないだろうか?

調べてみると、創造性という言葉は、ウィキペディアにもページがない(投稿時点)。

創造的な人として僕が真っ先に頭に浮かぶスティーブ・ジョブスは

創造性とは「なにかをつなげること」なんだ。

http://diamond.jp/articles/-/150351

と言ったらしい。

 

では創造性とは何なのか?創造的な人とはどんな人なのか?

 

僕が定義するならば、「新しいことをひらめいて」「それを実行に移せる(あるいは表現できる)」人は創造的な人だと思う。

 

じゃ、新しいことをひらめくにはどうしたらいいのか?

子どもに、何でもできるツールを渡しても、それで目新しいことはあまりやらない。むしろ、知っていることの半歩先の(あるいは半歩ズレた)ことをやる。

いきなりすごいことをひらめく天賦の才能を持った人もいるだろう。でも普通の人は、いろんな経験することでこそ、その半歩ズレた世界が広がっていき、ひらめくことが増えていくのだと思う。経験の延長にひらめきがあると思う。

そして、いろんな経験をどんどん体験するために必要なのは、「未知のことでも失敗を恐れずにとにかくやってみるマインド」と「ダメでも試行錯誤して解決しようとするマインド」だろう。

これは、ひらめいたことを「実行に移す」ために必要なものでもある。

 

つまり、(僕が定義する)創造的な人になるには(天才はおいておき)、

未知のことでも失敗を恐れずにとにかくやってみるマインド

ダメでも試行錯誤して解決しようとするマインド

を身につけるようにしたらいいのだ。

 

 

うん、これは、プログラミングの学びですごく大切なことであり、適切にプログラミングを学習すれば身に付きそうだ。

ただ、プログラミングができてもこれらのマインドが身に付いているとは限らない。単に論理的思考力が高いだけの人はできちゃうし、暗記が得意でパターン化された問題が解ける人でも、プログラミングはある程度できちゃうから。

 

つまり。

プログラミングを学ぶなかで(僕が定義する)創造性を育もうと思ったら、プログラミングができるようになることを目的化するのではなく

未知のことでも失敗を恐れずにとにかくやってみるマインド

ダメでも試行錯誤して解決しようとするマインド

を育むようなプロセスこそを大事にするべきだと思う。

 

他の子より進むことや作品の完成度を求めるのではなく、そのプロセスでどういうマインドを持っているか、それが伸ばせる環境を周りが用意しているか。

それことが大切なものなのだろう。

(そしてプロセスを大切にしていけば、すぐにではなくても、結局はアウトプットも自然と高まるはずだ)

 

プログラミング的思考とテクノロジーの感性

プログラミング教育とは、子供たちに、コンピュータに意図した処理を行うよう指示することができるということを体験させながら、将来どのような職業に就くとしても、時代を超えて普遍的に求められる力としての「プログラミング的思考」などを育むことであり、コーディングを覚えることが目的ではない。

–文部科学省 小学校段階におけるプログラミング教育の在り方について(議論の取りまとめ)http://www.mext.go.jp/b_menu/shingi/chousa/shotou/122/attach/1372525.htm

 

子どもへのプログラミング教育というと、「プログラミングのスキル(コーディングスキル)ではなくプログラミング的思考」という話がよく出てきます。

プログラミング的思考 は、ざっくりいうと、論理的思考の一部、みたいなもの、でいいかと思います。

 

それはすごく正しいと思っています。僕も、小さい子どもに、コーディングの細かいスキルを習得させることは重要ではなく、プログラミング的思考を伸ばすことの方が大切だと思います。

ただそうすると、アンプラグド(PCなどを使わない、紙などでのコンピューターサイエンスなどの学習)でもいいのでは?という疑問が出てきます。

コンピューターサイエンス、プログラミング的思考を伸ばすという目的では、そうかもしれません。もっといえば、別に将棋でも科学の実験でも、ツールはなんでもよい。

論理的に考えるとそのとおり、、なんですが、そのロジック展開に自分の中で違和感がありました。コンピューターと触れ合うことは必要ないのか、いやそんなことないのでは、、という違和感。それが最近、腑に落ちました。

 

 

それは、世界の広がりと感性 という軸でも考える事。

例えば外で子どもを遊ばせるときに、狭い公園より広い公園、もっといえば大自然の中で遊ばせられたらいいなと思いませんか?

音楽も、YouTubeやスマホ、CDで聞くだけじゃなくて、コンサートやライブを味わってほしくないですか?

スポーツも、プロのプレーを間近で見たくないですか?

何事も、もっと世界は広いんだよ、すごい体験いっぱいできるんだよ、って感じて欲しい。

 

コンピューターがあることで、できることが、世界がすごく広がるんですよね。プログラミングに限らず。

映画を作ったり、音楽を作ったり。写真を加工もできるし、キャラクターデザインなどもできる。ゲームも作れるし、世界中の人とネットでつながれる。

 

つまり、コンピューターを使うのと使わないのでは、世界の広がりがまったく違う。無限の広がりのなかで、知的好奇心を刺激し、感性を磨いてほしい。

これはアンプラグドでは達成できません。

 

プログラミングを正しく学べば、(プログラミングはコンピューターの可能性を広げているツールなので)分かりやすく、世界の広がりを感じられます。

ただ、別にプログラミングじゃなくてもいい。例えば動画編集のアプリだったり、作曲、編曲のツールだったり。3Dプリンターで遊ぶとかでもいい。

 

一方で、プログラミング学習で、子ども用の教材などで簡単にしすぎて可能性を狭め、「プログラミングってこんなものか」と、子どもが可能性を小さく感じて興味を失うことは避けないとダメ。プログラミング学習がまったくの逆効果になってしまう。

 

 

・プログラミング的思考を身につけること

・テクノロジーの無限の可能性を感じ、感性を磨くこと

 

この2つともが大事であり、かつこの2つは、相互依存せず独立している。

これを意識せず、なんとなく合わせて考えて、どっちつかずになって、両方共に効果が出ない(ときには悪影響を与える)、そんなことにならないようにしていくことが大切だと思います。

プログラミング学習は、うまくやれば、この2つともにとって、とてもいい教材の1つであることは確かです。

 

、、、ただ、もう1ついうと、これらの前に、ソフトスキル(非認知能力)もさらに大事だったりします。

諦めずに最後までやりぬける、失敗を恐れず行動できる、自発的に行動する、自己肯定感がある、などなど。

学習にショートカットはない

科学的センスは答えを知るときではなく、問いかけ、探求し、そして調査するときに身に付くものだと言うことです。

— パパート&フランツ, 1987  「作ることで学ぶ」 P38

小学生のキッズたちとプログラミング教室「ArSchool」をやって、5ヶ月程度。いろいろ学ばせてもらっています。

その中で痛感したのは、「学習にショートカットはない」ということ。また、答えを教えられても伸びず、「自身の体験を通じて」こそ成長するということ。

 

突然子どもたちができるようになることはあります。でもそれはショートカットしたのではなくて、日々連続的にじわじわ成長している中で、たまたまアウトプットが非連続的になっただけ。

急成長を求めて答えを教えても、それは遠回り。答えを与えられるのではなく、自ら考える体験、他者の体験や知識を咀嚼し自身のものとするプロセス、教材と戯れるプロセス、それらを通してでないと身に付かない、成長しない。

 

答えを教えることは、子どもを成長させることではない。(場面によっては、答えを教えることで、子どもの理解を助け成長を促すこともあります)

子どもなりに教材などと向き合い、戯れること、その時間を取ることが大事。

 

逆に、結果に一喜一憂することなく、各自のペースで、それぞれが必要としていることに取り組めば、絶対に伸びます。アウトプットはすぐに出ないかも知れないけど、確実に伸びています。子どもの成長は、本当にすごいです。

 

 

 思えば、社会人やインターンでも、優秀なエンジニア、スキルがぐんと伸びる人は、例えばプログラミングの本やWEBのカリキュラムのお題を与えて勉強するにしても、

・書いてあることをそのとおりにやって、すごく順調に、「できました!」となる人

・書いてあることをやりつつ、知的好奇心に任せ、「この場合はどうなるんだろ?」とチャレンジする人(だいたいそういう人は、「すいません、、動かなくなりました」って聞いてくるけど)

だと、後者の方がむちゃくちゃ伸びてますね。教材の正解をトレースするのではなく、プログラミングと戯れ、それを自己の体験として再構築できる人。

社会人のIT学習:#1. プログラミングとDB

前回、”社会人のIT学習:企画の予算感を把握するには” の続きです。
企画の予算感を把握できるようになるための学習として、プログラミングとDBを学習するにはどうしたらいいか書きます。
(エンジニアとしてのスキルをつけるためには、ここに書かれている内容では足りないです)

 

概要

プログラミングを学ぶと、どうプログラムが動くのか、どういう機能が大変(コストがかかる)か、イメージしやすくなります。
プログラミングに必要なインプットや求められるアウトプットが分かり、また、インフラなど他項目の学習効率も上がります。
なので、最初にプログラミングをある程度学ぶのがいいと思います。

また、多くの機能では、データの保存と抽出 が処理の主要部で、DB(SQL)をプログラミングとセットで勉強することをお勧めします。

プログラミングとDB(SQL)は、最低限、実際に手を動かした方がよいと思います。
あー、こういう機能は作るのが面倒だな、とか感覚が掴めます。

では、具体的にどういう学習をしていけばいいのか、下記3ステップを推奨します。カッコは目安時間です。

 

学習ステップ

#1.1. SQLの学習 (15h)

#1.2. プログラミングの基礎的な学習 (40h)

#1.3. WEBフレームワークの基礎的な学習 (30h)

#1.1. SQLの学習

多くのWEBシステムではでDB(データベース)を用います。DBにも多くの種類がありますがまずはMySQLからでいいでしょう。(*1)
DBとやりとりする命令文がSQLです。

プログラムとDB(SQL)との関連性は、例えば、このブログについて考えると、下記のようになります。

ブログを投稿する機能
→画面で入力された内容を、DBの記事テーブルに保存する。

ブログのトップページを表示する機能
→DBの記事テーブルに保存されている中から、(下書きでなく)公開済みの記事を、新しい順に10件取得して表示する。

個別の記事を表示する機能
→DBの記事テーブルに保存されている中から、URLにある記事番号に該当する記事を取得し表示する。下書きなど、公開でない場合は表示しない。

このように、多くの機能が、DBと密接に関連します。
実際のプロジェクトでも、「DBにどういう形で保存するか」「DBにあるデータをどういう条件で取ってくるか」を考えて、それ容易かどうかで見積り額を調整をすることが非常に多いです。

弊社では、研修で下記本のレベルのSQL学習を一通りやってもらってます。

書き込み式SQLのドリル 改訂新版
https://www.amazon.co.jp/gp/product/4822296210

やさしいSQL、のような、基礎的なものでもなんでもいいです。
ポイントは、実際にSQLを書いてみて、
・こういう風に書いたらどうなるかな?
・こういうデータを取る場合はどうやって書くんだろう?
と知識をなるべく横に広げながら、テキストの内容を習得することです。
単にテキストの内容を、そのまま書いて想定どおりの結果となっても、身に付いてないと思います。
SQLは、次のプログラミング学習に必要となるので、優しい内容は身に付くまで学習しましょう。

 

(*1) DBにもいろいろな種類があり、主にパフォーマンス要件によって使うDBが変わり(あるいは併用し)、開発手法も変わってきます。
例えば処理がむちゃくちゃ速いDBや、大量のデータに強いDB、検索に優れたDBなど。
ただ、一般的には、RDBといわれるものが使われる事が多く、特にMySQLがWEBサービスでは主流です。RDB同士では少なくとも基礎学習においては大きな差異はないです。

 

 

#1.2. プログラミングの基礎的な学習

プログラミングは、さまざまな言語があり、大きく分けると、サーバで動くものと、PCやスマホなどの端末で動くものがあります。
まずはサーバで動くものからやるとよいです。
PHP、Ruby、Python、JAVA、C#、GOなど種類がたくさんありますが、どれか1つでよいです。最近はPythonやGOなどが流行っていますが、PHPかRuby(On Rails)あたりが、資料も多く学習がやりやすいと思います。Pythonもいいかも。

まずは、基礎的な文法を学びます。いろんな関数がありますが、どのみち使うときはググることが多いので、関数の名前などはそれほど覚えないでもいいです。

弊社では、下記本を新入社員にやらせてます。

やさしいPHP 第3版 (「やさしい」シリーズ)
https://www.amazon.co.jp/gp/product/4797380896/

こちらもポイントは、ただ本に書いてあることをやるだけでなく、
・こう変えたらどうなるのか?
・こういう場合はどう書くのか?
を意識しながら、ちゃんと理解してスキルを身につけましょう。でないと、見積りにいかせません。

 

#1.3. WEBフレームワークの基礎的な学習

WEBサービスを作るときには、大体の場合、WEBフレームワークを用います。WEBフレームワークとは、WEBサービスを作りやすくするために、便利な機能をセットで提供するもの、というイメージです。
Ruby on Railsが有名です。PHPだとLaravelとかCakePHPとか。年々進化してます。

弊社ではマイナーなフレームワークを使うことが多いので、独自で研修プランを組んでいます。
本で学習するなら、10日で覚えるXX、のようなのでいいかと思います。

フレームワークは、お互い、持っている機能は似ていますが、やったことがないものだと学習コストがかかります。また、自由度の高いものや処理速度を重視しているものなど、それぞれ特徴があります。
フレームワークを勉強する際は、”はじめてフレームワークを使うときはこれだけ学習コストがかかる”というのを理解すると良いでしょう。

 

次回は、

#2. ネットワーク・インフラ・サービスレベル

です。

 

 目次

 社会人のIT学習:企画の予算感を把握するには

社会人のIT学習:#1. プログラミングとDB

社会人のIT学習:#2. ネットワーク・インフラ・サービスレベル

社会人のIT学習:企画の予算感を把握するには

先日、小学生向けにプログラミング教室 ArSchool(アルスクール)をはじめました。

その縁で、社会人のスキルとして、あるいは保護者の知識としてプログラミングを知りたい、勉強したいというお話をいただくことが多くなりました。
その中で質問されたことについて、一般的な内容なので深掘りしてここで紹介します。

質問 :

Web系サービスの立案で予算感を把握できるスキルを付けたいが、どういう学習をすればよいか?


回答 :

見積りに影響を与えるファクターは、思いつくだけで下記があり、条件次第で見積りはすぐ数倍の差がでます。
(分からない用語は読み流してください)

WHAT
・サービスの機能
・サービスのUI(デザイン等)
・ネットワーク/インフラ構成
・想定アクセス数、データボリューム
・パフォーマンス要件
・セキュリティレベル
・OSやブラウザなどの対応範囲
・SEOやOGPなどへの対応範囲
・納品物

WHO
・要件定義の粒度
・作業範囲
・発注側の熱意やスキル(リテラシー)

WHEN
・開始時期、納期

WHERE
・開発場所、開発環境

HOW
・プロジェクトの進め方(アジャイル、ウォーターフォール、承認フローなど)
・テストやQCの要求レベル
・運用保守への要求レベル(CIにどこまで対応するかなど)
・対象言語などの制約
・契約形態

WHY
特になし

 

これらを学ぶにはどうしたらいいか。

1つの方法として下記学習ステップを提唱します。カッコは、想定学習時間です。

#1. プログラミングとDB (85h)

#2. ネットワーク・インフラ・サービスレベル (30h)

#3. 開発フロー、運用フロー (20h)

#4. UI・デザイン概要 (20h)

#5. 契約やその他ファクター (20h)

#6. 市場の相場感把握 (?)

 

#2〜#5が少ないのは、手を動かさずに知識だけ学ぶ前提だからです。
#3, #5は特に、実際のプロジェクト以外で実習が難しいので。。

ただ、学習時間は学べる環境と個人のスキルで大きく左右されます。
特に#2〜#5は、きちんと学べる環境にいれば、おそらくこの6割くらい。

逆に、完全に独学だと、そもそも習得できるか微妙な上に、時間も倍くらいかかるかも知れません。
特に#6は、機密保持契約などにも絡んでくるので、学習が難しいです。

 

では、続いて

#1. プログラミングとDB

を書いていきたいと思います。