私の異常なプログラミング教育

 私の異常なプログラミング教育

BPStudy#122 〜いかにプログラミングを学ぶか?プログラミング教育を考えるの発表資料です。

https://bpstudy.connpass.com/event/66418/

14df37d630a1ca88d34747736bc85dc3?s=128

YUMOTO Michitaka

October 20, 2017
Tweet

Transcript

  1. ࢲͷҟৗͳϓϩάϥϛϯά ڭҭʹ͍ͭͯ YUMOTO Michitaka(a.k.a ͟͝ઌഐ) @gothedistance BPStudy#122

  2. ࣗݾ঺հ n 1979.11.12 東京⽣まれ ͪͳϠΫ育ち n マイメンはؗࢁণฏ n (株)クオリティスタートの代表⼾締役 n

    ござ先輩とも呼ばれる n GoTheDistanceというブログの中の⼈ n ツイートの99%は野球の話 2
  3. BPStudyʹ͓͚Δొ൘ཤྺ n BPStudy#79(初登場 / 野球) n BPStudy#91(野球) n BPStudy#92(エンジニアの経営学) n

    BPStudy#100(野球) n BPStudy#103(野球) n BPStudy#108(⾃社紹介) n BPStudy#112(野球) n BPStudy#115(野球) n BPStudy#122(プログラミング教育) n BPStudy#124(野球) 3 /&8
  4. 4 ϓϩάϥϛϯάڭҭΛ ࢝ΊΔ͜ͱʹͳͬͨ ͖͔͚ͬ

  5. ͦΕ͸Ұ௨ͷϝʔϧ͔Β࢝·ͬͨ n ブログ仲間のSさん(えらいひと)からの連絡 n 毎年受講させている、F社の研修の学習効果が芳しくないと報告 があった。 n 学習カリキュラムを変える必要があると感じているけれども、 他社のものにどうこう⾔えない。 n

    フリーランスで講師をやっている⼈に来てもらって、カリキュ ラムの作成を内製しながら改善するやり⽅が良さそうだ。 n そんなことをやってくれるエンジニアで講義もできるような ⼈ってそうそういな・・・あっ(察し 5
  6. 正直、教育にはあまり興味がなかった 6 ⼊⾨書を書いた以上、後には引けない 1 最⼤の理由が「独習Python⼊⾨」という本を出したこと。 プログラミングの⼊⾨書を書いておいて、教える仕事から 逃げるのはバツが悪くて嫌だった。 2 参考までに⾒せてもらったF社の研修資料を⾒て、これじゃ わかるもんもわかんねーわ、おもんねーわと思い、⾃分なら

    もっと上⼿に教えられる⾃負が芽⽣えた。 教えることはあまり好きではないけど、得意なことでした。 得意なことを活かして「まずは塁に出る」ことに決めました。 3
  7. 7 PythonΛ࠾༻ͨ͠ཧ༝

  8. Javaはプログラミングの⼊⾨に不向き 8 現場がJavaだからっていうの辞めて〜 1 Javaは「オブジェクト指向が使える⼈」のための⾔語です。 これからオブジェクト指向を学ぶ⼊⾨者には無駄にハードルを 上げる格好になります。これが最⼤の理由です。 2 Javaは環境構築が他の⾔語に⽐べて⾯倒です。IDEを⼊れて ボタンを押せば実⾏できる時代ですけど、コンパイルを説明

    する時にはやっぱり環境の話が必要。 クラスローダーとか、ヒープやスタックとか、プリミティブ とオブジェクトとか、初学者には無駄に重たい概念が多い。 3
  9. こういう説明をして実際に提案した 9 「Python」でやらせて頂きたいです 1 Pythonは型宣⾔が不要で、記号もかなり少ない⾔語です。 その分「可読性」が問われる⾔語なので、コードの意味を 考えるのにプラスに働くと考えています。 2 PythonはJavaに⽐べて、Webアプリの構築がとても簡単に 実装できます。⾔語の⽂法や設計思想等を理解することが

    ⽬的ではないので、実装⼿段はシンプルなのが望ましい。 Google三⼤⾔語(Java,C++,Python)に挙げられるほど、特に 海外では⼈気のある⾔語です。マイナーではございません。 3
  10. 10 ϓϩάϥϛϯάͷֶश ϋʔυϧ͕ͳͥߴ͍ͷ͔

  11. 抽象と具体の⾏間が広いから 11 変数 制御構造 データ構造 関数 オブジェクト クラス設計 ⾏間の広さを独習で埋めるのは難しい 抽象的な部分

    具体的な部分 Θ͔Β΁Μ
  12. ハードルその1〜繰り返し〜 12 n プログラミングの基礎⽂法は⼤別すると2つ n 「条件分岐」と「繰り返し」 n 条件分岐は「ここに⼊る」というのが直感的にわかる n 繰り返しで詰まる理由

    n ॲཧ͕Կ౓΋܁Γฦ͞ΕΔ͜ͱ͕ɺίʔυ͔ΒಡΈऔΕͳ͍ n 何回もprintって書いてあるわけじゃないのに、何度もprint が実⾏される所が腑に落ちるまで時間がかかる。
  13. ハードルその1〜繰り返し〜 13 n XIJMFจ͸GPSจΑΓ೉͍͠ n forは配列を回せば勝⼿に繰り返す n while⽂は「開始条件」と「終了条件」を、同時に満たす条 件を記述する必要があるので頭を使う。 n

    繰り返しが始まない or 無限ループに遭遇することが多い n 条件式に設定した変数が再評価されることがなかなか頭に⼊ らない。
  14. ズンドコきよしとかいう試⾦⽯ 14 n これをwhileで実装できれば繰り返しが腑に落ちる⼈多い。

  15. ハードルその2〜データ構造〜 15 n 配列ぐらいから怪しくなる n 1つの変数に1つの値(スカラー値)は⼤丈夫 n 連想配列と配列の区別がピンとこない⼈が出てくる n データ構造を意識させるには⼿書きがベスト

    n 実際に紙に書いてもらうとイメージが喚起される n 連想配列の配列がクリアできれば、もう⼤丈夫。 n ίʔυͷࣸܦ͚ͩͰ͸ຒΊ͖Εͳ͍ͷ͕͜ʔΏʔॴ
  16. ハードルその3〜オブジェクト指向〜 16 n ͍ͭ͜ʹدΓఴ͏ϝϦοτ͕·ͣ఻ΘΒͳ͍ n クラスを作って抽象化できる有り難みが感じられない n グローバル汚染が〜と⾔ってもダメ。汚染されたことがない イノセントワールドには届かない。 n

    if⽂のネストの⾟みは視覚的に伝わるので、そこを排除する ⽅向でイメージ戦略で⼊る。 n オブジェクト指向はあくまで ⽅法論の⼀つであるという⽴ ち位置が重要。哲学や求道の ⽅向性に⾏くと無事死亡。
  17. ハードルその4〜⾏き過ぎた抽象化〜 17 n WTFormsが理解できるまで相当時間がかかった。 n WTFormsはHTMLのフォームを抽象化して便利機能が沢⼭ある ナイスなライブラリです。 n HTMLのフォームを表現しているのが伝わりにくかった。 n

    苦戦したのが「form.populate_obj(src,dest)」関数でした。 n request.form[ʻkeyʼ]でデータが取れるのは伝わるが、WTFormsのクラスの オブジェクトとSQLAlchemyのオブジェクトがマッピングされて、値が⾃動 代⼊される凄さが伝わるまで、時間を要した。 n 多くのことを瞬殺してくれているおかげで、逆にわかりにくかった。 n ⾏き過ぎた抽象化は、⿊魔術と区別がつかない。 n Pythonの外(Web/DB)に出ると前提知識が増える。
  18. 18 Ͳ͏΍ͬͯࢥߟΛ੔ཧ͢Δ ΂͖ͳͷ͔໰୊

  19. 機能を作るには順番に考えるしかない 19 処理内容の順番をどう表現するか? 1 フローチャート、正直好きじゃないです。ですが、機能を 実装するには「どういった処理を、どの順番で実⾏するか」 ということを考え無くてはならない。 2 いきなりコードを書くと⼿戻りが多いのはわかったけれど、 じゃあどうやって⾃分の考えを表現していいかわからない。

    そういう声が多かった。 箇条書きで書くと抽象度が⾼すぎる。フローチャートだと、 粒度が細かくなりすぎてわけがわからなくなる。難しい。 3
  20. 機能を作る時に何を考えているのか 20 ϒϥοΫ ϘοΫε 検索項⽬ 検索結果 ü 検索項⽬を元に検索結果が作られる ü その中⾝はブラックボックス状態

    1. 検索項⽬を取得する 1. 顧客コード 2. 顧客名 3. 担当者 2. 検索条件を組み⽴てる 3. 検索を実⾏する 1. 1件もない場合は空の リストを返す 2. 存在する場合は以下 の検索結果を返す
  21. 感覚的にはゴルフのアプローチに近い 21 ⼤きな⽬標を、⼩さな課題に分解する 1 ゴルフのコースマネジメントに近い気がしています。 ホールアウトするまでの戦略をどう作るか、コースの ⾒取り図を元に攻略するあの感覚です。 2 やったことがないものは、ティーショットをとりあえず 打つしか無い。経験が増えてくると、コースの全体像が

    ⾒えて、ピンまでの距離が明確になり選ぶ⼿段も正確に。 バックキャスティングの習慣を⾝につけてもらうこと、 条件に落とし込んでYES/Noでコースマネジメントを 作ること。この2点をコーチングすることが重要。 3
  22. 22 ࠷ޙʹ͓఻͓͖͍͑ͯͨ͠ ϓϩάϥϛϯάͷֶशۂઢ

  23. 23

  24. 24 GAME SET!! Thank You!!