島までは遠い

佐藤正志@サークルアラウンドのことが少しわかる場所。プログラマーを育てるトレーナーとして、現役のソフトウェア技術者として、経営者の端くれとして、想うことをつづる予定。しばらくは工事中。

プログラミングは難しい

uxmilk.jp

このエントリ、ズバッと言っててすごく良かったです。乗っかります。

プログラミング習得には時間が掛かる

プログラミングを学ぶのに私がかけた時間は初期の方だけ数えても

  • 中学くらいでたまに数時間ずつ使って数ヶ月で完成させた簡単なBASICのゲームらしきもの(もはやゲームじゃなかった)
  • 大学二年くらいから触り始めたVBでのプログラミング。その後VC++。 年単位で同じアプリをこねくり回していた。
  • それから大学院卒業までの4年程度は趣味として、研究データを編集する道具として、かなりの時間をプログラミング(コードを書くことももちろん、書籍を買って読んだりすることなど含めて)に費やしている。
  • 大学院出てからは一年間はWEBのシステムを開発するために、一年間活動している時間はほとんどLinuxの設定やPerlのコードと格闘した。

結構費やしていると思います。断続的ですが数年単位の時間がかかっていますね。その後お金を稼ぐプロになってから15年この仕事をしています。今も記録更新中です。

これだけ時間をかければ大抵のことはある程度上達すると思います。

プログラミングにおける成長曲線 〜 必要な忍耐

成長曲線についてですが、もともとは下記で書いていたことで、拙いながらもこの内容は今でも初心を思い出すための大事な記録です。

最初の成長は頑張っただけ伸びることができないものです。ある一定の経験を積んでからいきなり伸び始めます。私が多数の方の学習を見てきた経験上、伸びることができない長さに影響しそうなのは下記のような要素だと思っています。

  • 考える訓練ができているか
    • 物事を突き詰めて考えることや、一つ一つ丹念に確認することに慣れていない人は、集中力が続かないので成果を出しにくい
  • 調べ方の訓練ができているか
    • インターネットから必要な情報を得てそれを問題に適用することができないと成果を出しにくい
  • 大きな問題を小さく分解できるか
    • 大きな問題をいきなり解決するのはとても難しいので、今対応している問題を小さな単位に分解できることが必要です
  • 簡単な英語が読めるか
    • エラーメッセージは英語。本当に簡単でいいので英語を読めること。英語が出たらすぐ閉じる癖の無いこと。

上記は結構な忍耐が必要なタイミングがあります。脳みそがオーバーヒートしそうな程考え込むことも、エラーの原因がわからなくて頭を抱えることもしょっちゅうです。

「簡単」という嘘

「簡単に学べる」と言っているのは、全体の大きな山のうち最初の丘を越えるくらいの部分のことを指している事が多いと思います。そしてそれをあたかも大きな山を登頂するようなミスリードを生む宣伝が存在することは否めないでしょう。

逆に言うと、一ヶ月二ヶ月ちょっとやっただけでその人のセンスは判断できないとも思っています。元記事では自分の頭が悪いと諦めている例がありましたが、それはまだまだ早過ぎる判断ではないでしょうか。

簡単に始められるけれども、しっかりと身につけるには時間がかかると思って取り組んで欲しいです。

どうすればいいの?

私のところに相談に来る人には、一見「プログラミングの習得にかなりの時間がかかるだろう」と感じられる方もいます。「スクールで学んだけれどよくわからなかった」という経験を持つ方もよくいらっしゃいます。「スクールが教えてくれないのでトレーニングして欲しい*1」 という依頼まで受けました。

それでもその人に合わせたやり方を取ったり、問題の粒度を調節して一歩ずつ進んでいけばちゃんと上達していきます(かかる時間についてはマチマチになりますが、放っておくよりは諦めずに続け、成果にたどり着く確率は確実に上がっていると思います)。先述のように「急に一気に成長し出す」モデルになるので、理解を1個ずつ積み重ねるとある時いきなり繋がって回り出す気がします。

そして下記のようなことが大事ではないかと今は考えています。

  • 学習の時間を十分に確保する
    • 時間をかけないと難しいので、時間を確保しましょう。短期間に一気にやる方が良いです。最初はすぐ忘れてしまうので、定着するまでは詰めていく形です。
  • 忍耐が必要なことを理解して取り組む
    • 問題に当たるのは当然です。プロでも毎日問題を解決し続けて進んでいます。それが日常だと知ってください。
  • 問題を適切な大きさに分解して取り組む
    • 大きな問題を小さく分解できれば解決出来る可能性が上がります。そうして一つずつ解決するんですね。

時間の確保以外の部分は、実は人が介在する方が良いことが多いです。つらい時に「今つらい。どう進めたらいい?」と相談できるのは大事ですし、問題を分解するのに一定の経験を必要とすることは多いでしょう。また「そこを掘り下げても今は実りがない」と伝えてくれるのも人の素晴らしいところです。 プログラミングの習得にはこういう部分で人の介在があった方が良いと感じます。より多くの人がストレスを減らしつつ学ぶにはこれらがポイントになるのではないでしょうか。

イメージとしては「うまくいかなくとも簡単に諦めてしまわない」ように組み立てる必要があります。

諦めてしまうケース

ところが元記事では下記のような最終的に受講生が自身の能力を疑って諦めている形で締めくくられているシナリオがあります。

Aさん「えっ、そうなの。一般的にはプログラミングは簡単なのでしょうね。私が馬鹿なだけで。」

Bさん「プログラミングは簡単だと持っていたけれど、どうやら僕が馬鹿だっただけみたいだ。」

これは最悪の結果です。「初期の成長が遅いんだ」という自身の特性への理解ならまだしも「簡単なこれすらも受け入れる能力がなかった」という拒絶で終わってしまうと感じるからです。

私はAさんもBさんも(実在してはいないと思いますが似たような方が世の中にたくさんいると思っています)、訓練次第でやれる人になると考えたい派です。

最初の一歩二歩がうまくいくと自立していける人は世の中に結構いるはずなのですが、その1歩目、2歩目の時点の躓きをカバーする方法があまりないのですね。

「努力していないから」「時間を確保していないから」はまだ理由として納得できる部分はあるものの「能力がないから」という理由にはあまり納得がいかないのです。

気づいている方もいらっしゃると思いますが、 事業者側の目線に立てば、短期的な利益を目指すなら最初に高い金額をまとめて納めさせて早々に諦めさせるのが一番大きな利益になります。辛くても継続してもらうには人的なコストが最も必要なところでしょう。諦めても良いのであれば、受講生に合わせることを拒絶すれば簡単だと思います。どんなに丁寧なドキュメントを用意しても初めてプログラミングをする人にとってはイメージしずらかったり、誤った理解をしてしまって袋小路にはまるものなんです。この話は機会があったら別のところでしようと思います。

難しいのはわかった。それでももっと早く成長できないか?

今は良い世の中になったので、わからないことを聞ける場所も多数できましたし、WEB上に情報もたくさん出ています。私が本格的にやり始めた20年前とは比べものにならない程良い環境になりました。

私も自分なりに色々とやっていて もくもく的にやったり、マンツーマンしたり、動画を利用したり、と試しているところです。成長したい期間や求めるゴールによって様々な手段がありそうです。

最後に

大変なことも多いかもしれませんが、難しいものを解き明かして作りたいものを実現するのは快感ですよ!是非それを感じて欲しいと思います。

f:id:ms2sato:20161016182732j:plain

*1:訳がわからないと思いますが私もわかりませんでした。念の為当該スクールに確認いただいて了承いただいた上でトレーニングはさせていただきました。デモデイ的なもので入選されていて、サービスもリリースできた様子です。