Se ha denunciado esta presentación.
Se está descargando tu SlideShare. ×

ラボラトリーオートメーションのためのソフトウェア思想教育(非プログラマ―が知っておくべきプログラミングの本質)

Anuncio
Anuncio
Anuncio
Anuncio
Anuncio
Anuncio
Anuncio
Anuncio
Anuncio
Anuncio
Anuncio
Anuncio
Próximo SlideShare
20180215 devsumi-base
20180215 devsumi-base
Cargando en…3
×

Eche un vistazo a continuación

1 de 72 Anuncio

ラボラトリーオートメーションのためのソフトウェア思想教育(非プログラマ―が知っておくべきプログラミングの本質)

Descargar para leer sin conexión

非プログラマ―が知っておくべきプログラミングの本質

https://laboratoryautomation.connpass.com/event/224912/

非プログラマ―が知っておくべきプログラミングの本質

https://laboratoryautomation.connpass.com/event/224912/

Anuncio
Anuncio

Más Contenido Relacionado

Presentaciones para usted (20)

Similares a ラボラトリーオートメーションのためのソフトウェア思想教育(非プログラマ―が知っておくべきプログラミングの本質) (20)

Anuncio

Más de Tokoroten Nakayama (16)

Más reciente (20)

Anuncio

ラボラトリーオートメーションのためのソフトウェア思想教育(非プログラマ―が知っておくべきプログラミングの本質)

  1. 1. ラボラトリーオートメーション のためのソフトウェア思想教育 Laboratory Automation Developers Conference 2021 2021/12/18 株式会社NextInt 中山心太 1
  2. 2. 非プログラマ―が知っておくべき プログラミングの本質 Laboratory Automation Developers Conference 2021 2021/12/18 株式会社NextInt 中山心太 2
  3. 3. 自己紹介 • 中山心太(ところてん) • @tokoroten • 株式会社NextInt 代表 • 著書 • 仕事ではじめる機械学習 • データサイエンティスト養成読本ビジネス活用編 • お仕事 • 機械学習システム構築に関する技術顧問 • 各種スポットデータ分析業、ビジュアライズ • 業務改善コンサルティング、DX支援、DX講演 • 新規事業コンサルティング、PoC構築 • ゲームディレクター 3
  4. 4. 発表の経緯 4 メカの人と生物の人に、プログラミン グの初歩の話をしたいんだけど、どん な内容がいいか相談させてください こんなんでどうよ? アッハイ じゃあその内容で講演してもらえますか?
  5. 5. この講演の趣旨 • 非プログラマに向けて、プログラミングの本質を解説します • プログラミングの本質を知ることで、何がプログラムで実現可 能なのか、何がプログラムにとって難しいのかを知ることがで きます • 非プログラマがプログラマとコミュニケーションをとるために 必要な考え方を短時間でお伝えします 5
  6. 6. よくある生物学部の情報教育ヒアリング • 1年生 • 教養講座でプログラミングを軽く触る • 入出力、分岐、ループ、ソートくらいでだいたい終わり • 問題をブレイクダウンしたりするところまで到達しない • 2、3年生 • 必修科目だらけで、プログラミングは一切やらない • 4年生 • 研究室で先輩のコードの引継ぎで嫌々プログラミング(3割くらい) • これができないと卒業できない、という状態になって初めて触る • 画像処理、データ解析、MATLAB • 引き継いだコードの改造が大半で、スクラッチで書くことは稀 6 LADEC2021の運営メンバーへのヒアリングより
  7. 7. 東大の教養の教科書を調べてみる • 目次 • 第4章 データ処理の基本:成績の集計 • 第5章 ライフゲーム • 第6章 放物運動のシミュレーション • 第7章 p値の計算 • 第8章 大規模データの検索 • 第9章 データからの情報抽出:回帰分析 • 第10章 拡散のシミュレーション • 第11章 高度な検索:ゲノムを解析する • 第12章 データを分類する • 日本のトップの大学でこのカリキュラムなの で、これより下の大学はもっと簡易になる 7
  8. 8. 京大理学部のカリキュラム 8 http://www.sci.kyoto-u.ac.jp/ja/_upimg/kce/OcLT2Q/files/undergrad_chart_2021.pdfより引用 • 一年の教養でしかプログラミングをしていない……
  9. 9. • 情報基礎[理学部] 2021 • 二分探索、ソート、デジタル回 路の基礎(全加算器くらい?)で 講義が終わるみたい • 大きな問題をプログラムに落と し込む、ということはやらない 京大理学部の情報の講義を調べてみる 9 https://ocw.kyoto-u.ac.jp/syllabus/?act=detail&syllabus_id=la_37956&year=2021 より引用
  10. 10. 母校(電通大、電子工学)の講義を調べてみる • 2年後期、プログラミング演習 • C言語の言語仕様を勉強して終わ りっぽいぞ…… • 私の時(20年前)は1年後期でC言 語でソートを書いて終わりだっ た覚えがあるので、あまり変 わってないみたい • 3年次の選択必修でC++の講義を 取った記憶はある 10 http://www.ds.mce.uec.ac.jp/~yuki/prog/ より引用
  11. 11. 非情報系の学部における情報教育の課題 • ソフトウェアエンジニアリングまで到達していない • 講義は言語仕様の解説、基本的なプログラミングの解説に終始 • 産業としてのソフトウェア開発技術とはどのようなものか、どのような思想 なのか、動いている複雑なソフトウェアとどう向き合うのか?というところ が伝わっていない • 「大学で学ぶプログラミング」と「ソフトウェアエンジニアリング」の間の 溝を埋めなければならない • 産業としてのソフトウェア開発技術とはどんなものか? • ソフトウェアの開発、運用、保守、信頼性 • 新しいアルゴリズムはどうやって作り出されるのか • 人間が行っている行動をコンピュータが実行可能なものに翻訳する • 極めて複雑なソフトウェアをどうやってテストしながら、安全に育てていく のか 11
  12. 12. 目次 • コンピュータはなぜ強力なのか、なぜ社会を変革しているのか • コンピュータとはどのような性質のものなのか? • 何がコンピュータにとって難しいのか • 要件定義:問題のブレイクダウン • ソフトウェアテストの必要性 • 時間が余ったとき用の予備資料いろいろ 12
  13. 13. 目次 • コンピュータはなぜ強力なのか、なぜ社会を変革しているのか • コンピュータとはどのような性質のものなのか? • 何がコンピュータにとって難しいのか • 要件定義:問題のブレイクダウン • ソフトウェアテストの必要性 • 時間が余ったとき用の予備資料いろいろ 13
  14. 14. コンピュータによる社会変革 • 1995年のインターネット革命以 後、マーケットの変化速度は急速 に加速 • この背景には、コンピュータ、イ ンターネット、ソフトウェアが存 在する 14 How Long Does It Take to Hit 50 Million Users?より引用 https://www.visualcapitalist.com/how-long-does-it-take-to-hit-50-million-users/ 製品・技術 サービス 利用者が5000万人 突破するまでの期間 飛行機 64年 自動車 62年 電話 50年 電気 46年 クレジットカード 28年 テレビ 22年 ATM 18年 コンピュータ 14年 携帯電話 12年 インターネット 7年 Facebook 4年 WeChat 1年 ポケモンGO 19日
  15. 15. 全てがソフトウェアに • ソフトウェアによって置き換わったもの • 電話 → スマートフォン • カメラ → デジカメ → スマホ • レンタルビデオ → YouTube、Netflix • 映画 → Pixar • 書店 → Kindle • タクシー → Uber • 地図 → Google Map • 小売店 → Amazon • 求人 → LinkedIn • 財布 → 電子決済アプリ • 全ての産業でソフトウェアによる変革が進む • これから先は?医療?教育?銀行?生物学? 15 画像は1980 vs 2010 – Topcultured より引用 https://topcultured.com/1980-vs-2010/
  16. 16. ムーアの法則による指数関数的性能向上 16 https://github.com/karlrupp/microprocessor-trend-data より引用 CPUの高性 能化、廉価化 コンピュータ の普及、適応 領域の拡大 CPUメーカー の市場競争 半導体の 技術革新
  17. 17. なぜソフトウェアは躍進したのか? • 集積回路の微細化による性能向上、価格下落、ムーアの法則 • コンピュータは単純だが早い • 毎秒100億回以上の計算ができる(2.5GHz*4コア=100億回/sec) • コンピュータは簡単な動作を組み合わせて、より複雑な動作を実現する • 人間にとって複雑な処理でも、毎秒100億回計算できるコンピュータには容易なこと が非常に多い • コンピュータに「疲れる」「飽きる」という概念はないので、 一度プログラムを作れば、同じ処理であれば、何度でも繰り返す • これが人間の努力を粉砕している 17 年 製品名 販売価格 製造プロセス トランジスタ 動作周波数 1971 Intel 4004 $60 10μm 2300個 500 kHz 1997 Intel Pentium II $268 0.35μm 2740万個 300 MHz 2019 AMD Ryzen9 3900X $499 7 nm 98億個 3.5 GHz
  18. 18. コンピュータは世界人口よりも多い • Armベースチップ(スマホやIoT機器に使われているCPU)は累計で 1600億個を突破、年間平均出荷数は220億個以上 • あなたは何台のコンピュータを使って生活している? 18 Armベースのチップ、前四半期の出荷個数が過去最高を更新|アーム株式会社のプレスリリースより引用 https://prtimes.jp/main/html/d/p/000000091.000022759.html
  19. 19. コンピュータという新しい労働力 • ムーアの法則により、安く、高性能になったコン ピュータはありとあらゆる職場に普及、新しい労 働力となった • 現代社会は業務改善とはソフトウェア改修、ソフ トウェアの繋ぎ方の変更になった • けれども、コンピュータという新しい労働力(奴 隷)を使うためのソフトウェアについて分かってい る人が全く足りていない • ソフトウェアを自ら改修し続ける企業が世界経済 を支配する時代になった 19
  20. 20. 世界経済の変化(時価総額トップ10) 時価総額ランキング上位企業(1992年と2019年) / 世界は大きく変化・日本の地位は低下 - ファイナンシャルスター より引用 https://finance-gfp.com/?p=10552 20
  21. 21. 世界経済の変化(時価総額トップ10) 21 石油 小売り 製造業 通信 タバコ・食品 通信 食品 銀行 銀行 化学・医薬品 石油 ソフトウェア ソフトウェア ソフトウェア ソフトウェア ソフトウェア ソフトウェア 保険・投資 投資・銀行 ソフトウェア 時価総額ランキング上位企業(1992年と2019年) / 世界は大きく変化・日本の地位は低下 - ファイナンシャルスター より引用 https://finance-gfp.com/?p=10552
  22. 22. 余談:2021年12月の世界の時価総額ランキング • COVID-19の影響で 石油産業が打撃を 受けて、Appleが首 位に • 世界的な半導体不 足を受けて、 TSMC、NVIDIA • EV、自動運転への 期待からTesla 22 https://companiesmarketcap.com/
  23. 23. 生物学もこの例外ではない • Laboratory Automationはこの流れ • 安くなったコンピュータ(とロボット)がラボに入ってきた • 疲れ知らずで働き続けるコンピュータが、ラボを価格破壊する • 生物学の問題を、コンピュータの探索問題に変換する • 人間が根性でアタリの実験条件を探すのではなく、 コンピュータが総当たりでアタリの実験条件を探し出す • コンピュータ、ソフトフェアをうまく扱えたやつが、マーケッ ト、アカデミアを支配する時代へ • なので、コンピュータ、ソフトフェアについて勉強しましょう 23
  24. 24. 目次 • コンピュータはなぜ強力なのか、なぜ社会を変革しているのか • コンピュータとはどのような性質のものなのか? • 何がコンピュータにとって難しいのか • 要件定義:問題のブレイクダウン • ソフトウェアテストの必要性 • 時間が余ったとき用の予備資料いろいろ 24
  25. 25. コンピュータはどのような性格なのか? • コンピュータという新しい奴隷(労働力)を躾け るには、コンピュータの性質を知っていなけ ればいけない • 彼らの独特な言葉(プログラミング)を話せなけ れば、彼らに指示を行うことができない • 通訳(プログラミング)はプログラマがやってく れる • しかし、通訳がいるからといって、相手の風 習を知らないでいいわけではない 25
  26. 26. CPUとはどんなものか? • 計算を行う半導体 • メモリ上に格納された命令列を読んでいって逐次実行していく • 基本的な命令は数十個程度、マイナーなのも含めると数百 • 基本的な命令を組み合わせて複雑なことを実現していく • 実行結果をメモリ上に書き込んでいく • たったこれだけの機能で、きわめて複雑な機能を提供する 26
  27. 27. CPUができることは極めて少ない • 逐次実行 • プログラムカウンタが指し示すメモリを読み取り、その命令を実行する • 実行が終わったら、プログラムカウンタがインクリメントされる • レジスタ演算 • レジスタとは、CPUの中にある数~30個程度の演算用メモリ、レジスタ間や特定の数値と演算 • プログラムカウンタもレジスタの一種 • 足し算、引き算、掛け算、割り算、大小比較、同値判定、論理演算などができる • CPUは2つの数値の間の演算しかできない • 条件ジャンプ • レジスタやフラグを読み取って、条件に合致したら、プログラムカウンタの値を変更する、無条件 ジャンプも可能 • メモリIO • レジスタと大容量の主記憶メモリの間で、値の読み書きを行う • あるレジスタが示すメモリアドレスに、別のレジスタの値を書き込む、などができる 27 ※アルゴリズムの説明に必要な機能に限定して抽象化されたCPUなので、実際のCPUの機能とは異なります
  28. 28. コンピュータができることはとても多い • 「ループ」はコンピュータが強力である理由の一つであるが、 ループが機能として存在しないCPUも存在する(ARMなど) • 「ループ」は「レジスタ演算」と「条件ジャンプ」で実現される • コンピュータの多くの機能は、基本機能の組み合わせで実現される • コンパイラの内部では左から右のような変換が行われている 28 for(i = 0; i < 100; i++ ) { do_something(i); } i = 0; LOOP_LABEL: do_something(i); i++; if (i < 100) {goto LOOP_LABEL;} ※C言語風の疑似コードなので、C言語っぽく読んでください ※※ x86などのCISCにはLOOP命令があるが割愛、マイクロコードのレベルではたぶん一緒じゃないかな、しらんけど
  29. 29. 余談:関数コールは何をやっているのか? • 関数コールは、スタック(メモリIO)と、ジャンプで実現 • スタックに引数と、リターンアドレスを積んで、関数のアドレスへジャンプ • 関数は返り値をレジスタに入れて、リターンアドレスへジャンプ 29 result = do_something(i); stack.push(i); stack.push(RETURN_LABEL); goto DO_SOMETHING; RETURN_LABEL: stack.pop(), stack.pop(); result = REGISTER0; DO_SOMETHING: return_address = stack[-1]; k = stack[-2]; REGISTER0 = k * 2; goto return_address; int do_something(int k){ return k * 2; } ※コールスタックを強調する書き方になっていますが、普通は関数コール専用の命令、リターン専用の命令を使います
  30. 30. プログラミングは技術の組合せの積み上げ 30 • プログラミングの学習とは、下 から上への積み上げ • 簡単なアルゴリズムを組合せ、 複雑なアルゴリズムを作り上げ る • この繰り返しで、コンピュータ が実行可能な世界を広げていく • 何重に積み上げられたとしても、 毎秒100億回以上計算できるコン ピュータにとっては非常に容易 なことが多い • 愚直に組むと、一瞬で組み合わ せ爆発するので、計算量を抑え るためのテクニックが必要 逐次実行 条件ジャンプ メモリIO レジスタ演算 ループ ソート ディープラーニング 動作計画 行列演算 制御理論 多重配列 逆運動学 組合せ最適化 統計処理 キュー スタック 画像処理 機械学習 画像認識 CPUが提供する機能 アルゴリズムを 組み合わせるこ とで新しいアル ゴリズムを作り 上げる 数理モデリング グラフ理論 数値微分 関数 現代的な言語と、 標準ライブラリ のサポート範囲 ファイルIO 構文解析 ※それっぽく並べているだけなので、厳密性はないです
  31. 31. CPUはどのような性質なのか? • 逐次実行 • あらかじめ記述された命令列を実行する • レジスタ演算 • コンピュータはたった2個のものしか見えない、操作できない • 全ての操作を2つの値の操作に帰着させる必要がある • 条件ジャンプ • 条件ジャンプによりループを実現することができ、無限の労働力を提供 • パラメータを変えたループは無限の試行錯誤を提供する • メモリIO • 人間に比して莫大な記憶能力を持つ • 人間とコンピュータがどうやってソート(並べ替え)を行うのかを 例に出して、これを性質の違いを説明する 31
  32. 32. 人間がソートを行う • 人間は「全体」が見えるので、ソートはとても簡単 • 見れば分かる 32 緑、橙、青、赤紫、 水色、紫、っと
  33. 33. コンピュータがソートを行う • コンピュータは2つの数値しか操作できないので、ソートのアルゴリ ズムは難しい • 2つの数値の比較、入れ替えを何度も繰り返す • コンピュータは超高速なので、それでも人間よりも早い 33 水色と橙だと、 橙のほうが大きいな つぎは、水色と紫だな…
  34. 34. コンピュータのソートのアニメーション 34 https://visualgo.net/en/sorting より引用 • 2つの変数の比較と操作しかしていないのが分かる
  35. 35. 人間がソートを行う • 人間は膨大なデータの「全体」が見えないので、ソートはとて も難しい • 見ても分からん 35 ええぇぇぇ
  36. 36. コンピュータがソートを行う 36 さっきと同じ要領でやればえ えねんな… できました(1ms) • コンピュータは2つの数値しか操作できないので、ソートのアルゴリズム は難しい • 2つの数値の比較、入れ替えを何度も繰り返す • コンピュータは超高速なので、それでも人間よりも早い
  37. 37. プログラミングとは何か? • プログラミングとは、限られた機能のCPUに、複雑な物事を実行さ せること • CPUは「命令の逐次実行」 「レジスタ演算」 「条件ジャンプ」「メモリ IO」しかできない • プログラマはコンピュータの気持ちになって、「2つしか物が見れないコン ピュータがどうやって全体を見るのか」を考える • 象を撫でる盲目の賢人を作り上げる • 「無意識を意識する」のがプログラムの設計プロセス • 「見れば分かるじゃん」は禁句、それは人間の考え方 • 人間は「全体」を見れば自明なことは考えない傾向にある • 人間が行っている無意識の動作を、意識的に記述する必要がある • 意識的に記述できれば、ブレイクダウンを繰り替えして、コンピュータが実 行可能なものに帰着させていく(=要件定義) 37
  38. 38. コンピュータはどのような性質か? • プログラミングは「無意識を意識」して、CPUの機能に帰着されるよう に記述しなければならない • CPUは逐次実行、あらかじめすべてを記述する必要 • CPUは局所的な構造(たかだか2点の値)しか操作できない • メモリは莫大な空間を持つ • 無限ループにより、パラメータを変えた動作を何度も繰り返す • 記憶力が超人的で、盲目で、二つの変数の操作に限っては思考速度が人間 の数兆倍速く、外国語を話す奴隷、に渡す作業マニュアルを我々は書かな くてはいけない • 上記の性質を持つコンピュータは苦手なことがとても多い • コンピュータが苦手なことを知ることで、それらを避けるアプローチを検討するこ とができる 38
  39. 39. 目次 • コンピュータはなぜ強力なのか、なぜ社会を変革しているのか • コンピュータとはどのような性質のものなのか? • 何がコンピュータにとって難しいのか • 要件定義:問題のブレイクダウン • ソフトウェアテストの必要性 • 時間が余ったとき用の予備資料いろいろ 39
  40. 40. 何がコンピュータにとって難しいのか • 人間は「全体」が見れる • コンピュータは「全体」が見えない、できるのは2つの数値の操作だ け • 画像認識のような、「全体構造」を認識することはコンピュータに とって極めて難しい • というか「全体構造」が見えるのであれば、それは「強い人工知能」 • 現代の技術では「全体構造」を見ることはできない • どうやって、全体構造を見ないで全体構造を見ているフリをするのか?が求 められている • 細胞をカウントする問題を例にとって説明する 40
  41. 41. 人間が細胞のカウントをする 41 https://commons.wikimedia.org/wiki/File:Staphylococcus_aureus_01.jpg より引用 見れば分かるじゃん 1,2,3,4,5,6,7,8, 9.10,11,12,13 … … (1時間後) 120個/mm2くらいかな
  42. 42. コンピュータが細胞のカウントをする 42 https://commons.wikimedia.org/wiki/File:Staphylococcus_aureus_01.jpg より引用 • バイラテラルフィルタでノイズ除去 • DB-SCANを使って、セグメンテー ション • 連接領域の面積を見てバックグラウ ンドを排除 • 連接領域の縦横比を見て異常な形状 を削除して…… いや、むしろ • バイラテラルフィルタでノイズ除去 • キャニーフィルターでエッジ抽出 • エッジをハフ変換して円状の物体を 抽出 • 円の大きさを見て要らんやつを捨て て…… (10ms後) 100個/mm2ですね
  43. 43. プログラムから画像はどう見えるのか? • プログラムから画像はただの数値の配列 に見える • 画像の左上のピクセルの輝度は252 • 数値の配列に対する操作を繰り返して画 像を認識しなくてはいけない • コンピュータは二つの数値の間の操作し かできないので、人間的な認識をさせる ことはできない • コンピュータが実行できる画像処理を繰 り返して、画像認識を実現する • バイラテラルフィルタ、DB-SCAN、キャ ニーフィルター、ハフ変換、etc… • 超大変 43
  44. 44. 統計によって、全体を見ないで全体を見る • 前提条件を確認する • 細胞は明るい、バックグラウンドは暗い • 出力するのは統計値なので、誤差が許容され るよな? • 前提条件をハックできないか? • 細胞はより明るくできないか? • バックグラウンドはもっと暗くできないか? • ハックしてみる • 実験環境を弄る前に、まず画像を弄って検証 してみよう→割といけるやんけ • 右図はパワポの機能でコントラストを修正 • 画像の輝度の強度から、細胞数を推定するプ ログラムを作成できそうだな • 撮影環境を改善したら割と精度よくなりそう 44 コントラスト改善 平均輝度 181 細胞数 輝度 181
  45. 45. なぜ統計とコンピュータが相性がいいのか? • コンピュータは「全体構造」を見ることができない • 一度に見ることができるのはたった2つの数字だけ • 統計量は莫大なデータを、たった数個の数値に次元圧縮(写像) • 次元圧縮された数個の統計量を見ることで、コンピュータでも 疑似的に「全体構造」を見ることができる • コンピュータにとって難しい問題を、簡単な問題に変換できる • 余談:なぜディープラーニングが流行っているのか? • いい感じの次元圧縮を繰り返して、一度に2つの数字しか操作できない コンピュータでも「全体構造」を認識できているフリができるから 45
  46. 46. 余談:統計量ハック • 統計量しか見てないプログラムは容易にハックされる 46 https://www.autodesk.com/research/publications/same-stats-different-graphs より引用
  47. 47. 目次 • コンピュータはなぜ強力なのか、なぜ社会を変革しているのか • コンピュータとはどのような性質のものなのか? • 何がコンピュータにとって難しいのか • 要件定義:問題のブレイクダウン • ソフトウェアテストの必要性 • 時間が余ったとき用の予備資料いろいろ 47
  48. 48. 要件定義とは何か? • 雑に説明すると「やりたいこと」をヒアリングし、「それを実 現するは何が必要なのか」を考えること • 大きな問題を小さな問題の集合にブレイクダウンする • 小さな問題をもっと小さな問題の集合にブレイクダウンする • これを繰り返し、「コンピュータが実行可能な問題の集合」に分解し ていく • その他、要件定義で決めること(割愛) • 機能要件、非機能要件の洗い出し • 予算・スケジュール・人員の見積 • コミュニケーション方法の確定 48
  49. 49. 分散をブレイクダウンしてみる • 分散の公式のそれぞれの演算を、CPUの機能に落とし込んでみると、比 較的簡単にプログラムにできそうだと分かる • 数式をプログラムで表現するには、全く性質の違うもので再現しようとし ているので、割と大変 • 数式: (高校数学では)時系列はない、連続、無限小、無限大を取り扱う • プログラム:時系列がある、離散、有限で取り扱う • 余談:多くの人が、高校数学の発想でプログラムを理解しようとして挫折する 49 𝑆2 = 1 𝑛 i=1 n (𝑥𝑖 − 𝑥)2 割り算 ループ+ 足し算 メモリIO 平均値= ループ+メモリIO+ 足し算+割り算 二乗=掛け算 def variance(x): n = len(x) ave = sum(x) / n t = 0 for xi in x: t += (xi - ave) * (xi - ave) var = t / n return var
  50. 50. 要件定義はブレイクダウン 50 細胞培養を行うロボット モータ制御 ハードウェア制御 センシング 画像処理 細胞の分類 機械学習 カメラ制御 逆運動学 画像認識 ロギング 設定を読み込んで 実験条件を固定 制御理論 やりたいことを分解していって、 「コンピュータが実行できること」 に還元する コンピュータが実行できることとして、 よく知られていること 動作計画 JSON読込 ※それっぽく並べているだけなので、厳密性はないです
  51. 51. 再掲:プログラミングは技術の組合せの積み上げ 51 • プログラミングの学習とは、下 から上への積み上げ • 簡単なアルゴリズムを組合せ、 複雑なアルゴリズムを作り上げ る • この繰り返しで、コンピュータ が実行可能な世界を広げていく • 何重に積み上げられたとしても、 毎秒100億回以上計算できるコン ピュータにとっては非常に容易 なことが多い • 愚直に組むと、一瞬で組み合わ せ爆発するので、計算量を抑え るためのテクニックが必要 逐次実行 条件ジャンプ メモリIO レジスタ演算 ループ ソート ディープラーニング 動作計画 行列演算 制御理論 多重配列 逆運動学 組合せ最適化 統計処理 キュー スタック 画像処理 機械学習 画像認識 CPUが提供する機能 アルゴリズムを 組み合わせるこ とで新しいアル ゴリズムを作り 上げる 数理モデリング グラフ理論 数値微分 関数 現代的な言語と、 標準ライブラリの サポート範囲 ファイルIO 構文解析 ※それっぽく並べているだけなので、厳密性はないです
  52. 52. 要件定義は上と下のすり合わせ 52 「コンピュータが実行できること」 を知らないと要件定義できない プログラマと会話するのに必須 「CPUは何ができるのか?」 を知っておくと、何が難しいのかが分かる プログラマが何とかしてくれる やりたい こと 逐次実行、レジスタ演算 条件ジャンプ、メモリIO コンピュータが 実行できること やりたいことをMECEに分解していって、 「コンピュータが実行できること」 に還元する、分解能力、言語能力
  53. 53. 要件定義はなぜ難しいのか? • 「やりたいこと」を細かくブレイクダウンしていき、何度もブレイクダウ ンを繰り返し、最終的に「コンピュータが実行できること」に還元する • そのためには「人間が無意識に行っていることを意識して記述する認識能力、言語 化能力」「大問題を小問題分解する能力」「コンピュータが実行できることに関す る知識」が要求される • 「コンピュータが実行できること」を知らないと、誤った方向にブレイク ダウンしていってしまう • ダメな人は「人間が実行できること」にブレイクダウンしてしまう • 「やりたいこと」に制約条件を加えると、うまくコンピュータが実行でき るかも、という発想が要求される • 何がコンピュータにとって簡単なのか、難しいか、を知らなければ、適切な制約条 件を導入することができない • 前述の細胞のカウントを例に出すと、「厳密なカウントではなく、大体あってれば いい」という制約を発見できるかどうか 53
  54. 54. 余談:要件定義はなぜ難しいのか?inリアル • リアルワールドの要件定義は「やりたいこと」を複数人が主張 • 複数の人が、各自が自分の業績評価が上がるように別のことを主張する • 「やりたいこと」同士がコンフリクトして同時達成困難 • そもそも、動くものが出来上がってこないと「無意識を意識する」ことができないので、 適切な要求が上がってこない 54 https://xtech.nikkei.com/atcl/nxt/column/18/01157/051900036/ より引用 https://diamond.jp/articles/-/144498 より引用
  55. 55. プログラマーの考え方を身に着ける • 要件定義が上手くできるようになるためには、プログラマの考え方 を身に着けることが大事、プログラマーの能力≒言語能力 • プロセスや作業に名前を付ける • 「無意識の行動を意識する」には、名づけが必須 • 人は言語によって世界を認識する、名づけと認識は表裏一体 • 例:虹の色数は言語によって異なる • 名前がついたものはパラメータを除いて不変であること • パラメータしか違わないものには同じ名前がついていること • ありとあらゆるものを、 f(x) にしていく • プロセスや作業の集合の順序構造で、全体が定義できること 55
  56. 56. 何が変更されうるかを事前検討する • 非プログラマは、何がどう組み合わさっているか分からない • 出来上がったものを見て、気軽に「このへんを直したい」といいがち • 「最初から交換する可能性があるって言ってくれてれば……」となる • 要件定義段階で何が変更されうるかを検討しておく必要がある • プログラムの保守性や、変更可能性を引き上げることができる 56 楽 楽 楽 難 難 難 無理 このへん 非プログラマから見る 出来上がったプログラム プログラマの見る世界
  57. 57. 細胞カウントシステムの顕微鏡を交換したい • デジタル顕微鏡が変わるとどうなるのか? • デジタル顕微鏡のデバイスIDが変わる • レンズの色収差、歪み、絞り、被写界深度が変わる • 顕微鏡の照明が変わるので、画像全体の明るさが変わる • 画像の解像度、画角が変わる • 撮像素子の感度曲線が変わる、ゲイン調整やガンマ調整が必要 • 顕微鏡が交換されることを前提にプログラムを組んでいないと、動作しなくなる • 画像処理のために設定されたパラメータが全滅する • 顕微鏡ごとに異なる画像処理パラメータを保存できる仕組みを作る必要がある • プログラムを作成する前に、顕微鏡が変わる可能性に気づいて、それをプログラ マに伝えられるか? • Wetの人は顕微鏡が変わることが当たり前なので、自明すぎて気づかないかもしれない • 人間にとって当たり前のことでも、コンピュータにとって難しいことは極めて多い • だからこそ、コンピュータの性質について知っておく必要がある 57
  58. 58. 余談:プログラマが大変だと思うこと 58 • 0個を1個にしてくれは、ちょっとツライ • 新しいシステムを作ってくっつけるだけなので、まぁなんとか…… • 1個を2個にしてくれは、無茶苦茶キツイ • 不変であることを前提に作られたプログラムを可変個に対応させなければい けない • 2個を10個にしてくれ、はほぼゼロコスト • 配列の中身の数が変わるだけ • オーダーが1つ変わるだけなら、割とそのまま動く • 10個を1000個にしてくれは死ぬ • オーダーが2つ変わると、処理方式やアルゴリズムそのもの、画面構成を見 直さないといけない、場合によってはプログラミング言語も変更する
  59. 59. 目次 • コンピュータはなぜ強力なのか、なぜ社会を変革しているのか • コンピュータとはどのような性質のものなのか? • 何がコンピュータにとって難しいのか • 要件定義:問題のブレイクダウン • ソフトウェアテストの必要性 • 時間が余ったとき用の予備資料いろいろ 59
  60. 60. ソフトウェアテストの必要性 • ソフトウェアテストは、ソフトウェアを安全に改修するための仕組み • ソフトウェアテストを知るには、まずV字モデルを知る必要がある。 • システム開発における開発工程とテスト工程の対応表をあらわしたもの 60 要求分析 要件定義 基本設計 詳細設計 コーディング 受け入れ試 験 システム テスト 結合 テスト 単体 テスト コード レビュー ↑ココで使われる技術
  61. 61. ソフトウェアテストとは? • プログラムをブラックボックスとしてみなして、外部からのプログラムの振る舞いの同 一性をある程度保証し続ける仕組み • ソフトウェアテストのやり方 • 入力値と、期待する出力値のペアをいくつか作成する • プログラムを作成し、ある入力値を入れた際に、期待する出力値が出るかどうかを確認する • プログラムが改修されたとしても、同じ入力値と出力値になることを自動で確認し続ける • ソフトウェアテストは、ソフトウェアの機能を保証しながら開発し続けるために必要 • これにより副作用を発生させないで機能追加することができる • 副作用が発生したとしても、テストが落ちるので、バグ入りを出荷することが減る • 現代の開発では、単体テスト、結合テスト程度まで自動化している • 頑張ってる会社はシステムテストも自動化、入力パターンのシナリオを作り、人間が操作するのと 同じように入力を行い、同じ挙動、同じ画面出力であることを確認する 61
  62. 62. ソフトウェアテストの実例 • 平方根を取るプログラムがちゃん と平方根を返せているかをテスト する • 期待する動作 • 正の値に対しては平方根を返す • 負の値に対して、エラーを返す • 全てTrueなので、入力と出力が期 待値通りだと分かる 62
  63. 63. コード改修によるテストの失敗検知 • 平方根をmath.sqrtではなく、 0.5乗を使うようにコードを修正 • テストが一つFalseになってい るので、コード改修によって、 コードの振る舞いが変わってい ることが分かる • 0.5乗の場合、負の値を入力する と、複素数を返すので、エラー にはならない 63
  64. 64. 生物学はテスト可能になっているか? • 現在のWetの実験は、再現性が怪しい • 実験のたびに無意識の行動や実験機器の状態が変化してしまう • 実験が成功するまで繰り返して、チャンピオンデータを論文発表する • 実験者の性別によってラットの行動が変わるなんてこともある • ラットは男性のテストステロンによってストレスを感じる https://www.nature.com/articles/nmeth.2935 • 論文に書かれているのと同じ条件で実験しても、同じ結果が返ってこない • 論文に書かれていないパラメータが無数に存在している • 無意識の行動は論文に記載されない • 再現できないことが当たり前なので「 ○○○○細胞はありまぁす!」が発生 • Laboratory Automationは、実験の手続きをすべて記述し、ロボットに実 行させることで、なるべく再現可能にする • ソフトウェア業界ではInfrastructure as a Codeという概念がおそらくLAと近い 64
  65. 65. 余談:Infrastructure as a Code • IaaC以前 • サーバのセットアップは、人間がコンソールにログインしていろいろ とコマンドを叩くものだった • 作業者によってサーバの環境が違う、作業時期によってライブラリの バージョンが違う、クラスタ運用しているのにマシンごとに環境が違 う、といった問題が発生 • IaaC以後 • クラウドの普及で仮想サーバが当たり前になったので、 サーバのセットアップを、プログラムに行わせるようになった • 同じ設定のサーバを簡単に作れるようになった • プログラムを動作させるサーバの環境違いによる挙動の違いに悩まさ れることが無くなった 65
  66. 66. まとめ • コンピュータの性能向上によってありとあらゆる場所にコン ピュータが普及、すべての産業が変革を余儀なくされている • プログラミングの知識だけでは、現実の複雑さに向き合うこと はできない、ソフトウェアエンジニアリングの知識が必要 • CPUはできることが非常に少ないが、それらを組み合わせて複 雑な動作を実現することができる • 要件定義とは、「やりたいこと」を「コンピュータが実行可能 なことの集合」に分解していくこと • 分解していくための認識能力、コンピュータが実行可能なことに関す る知識が必要 66
  67. 67. 次に読むとよさそうな本 67
  68. 68. 目次 • コンピュータはなぜ強力なのか、なぜ社会を変革しているのか • コンピュータとはどのような性質のものなのか? • 何がコンピュータにとって難しいのか • 要件定義:問題のブレイクダウン • ソフトウェアテストの必要性 • 時間が余ったとき用の予備資料いろいろ 68
  69. 69. Laboratory Automationのクラウド化 • LAの汎用マシンを大量に並べた事業者がそのうち現れる • 現在のLabの実験請負がシステム化される • 最初はメカニカルタークみたいな感じで、裏側に人間がいるだろうが、徐々 に自動化比率が上がっていく • Wetの人は手順書をプログラムで書いて、APIで事業者に投げつける と結果が返ってくる世界になる • 裏でデジタルツインが動作計画を評価して、実験の成功確率を評価 • 成功確率が一定を上回った動作計画であれば、実行する • 論文にもプログラムが付いていて、事業者にそれを投げつけると、 同じ結果が返ってくるので、誰でも検証できる世界になる • 機械学習系の論文では、論文に使われたコードとデータセットがGitHubで公 開されることがよくある、同じことがWetでも起こりうる 69
  70. 70. Laboratory Automationとダイバーシティ生産 • ダイバーシティ生産とは、落合陽一が提唱する新しい製造業の形 • インテリジェンス化した製造装置が、多様な製品を作り出す世界観 • LAは図中の「多様な生産」に相当すると考えることができる • MIで候補薬を設計して、LAで実験する体制が作れれば、全自動オーダーメイド医療が可 能になる • がん細胞を採取したら、勝手に培養してくれ、勝手に効く薬が出てくる世界 落合陽一 日本再興戦略 「近代とは何か」より引用
  71. 71. 余談:半導体からCPUへの積み上げ 71 NAND AND OR NOT ブール代数 フリップフロップ SRAM マルチプレクサ 半加算器 乗算器 メモリIO レジスタ DRAM 逐次実行 条件ジャンプ レジスタ演算 全加算器 集積回路 XOR CPUの創りかた LEDの点灯から、ブール代 数、カルノー図から、最終 的には4bit CPUの作成と、 そのうえで動くアセンブラ の作成まで行う 大学のデジタル回路の単位 はこれで取りました トランジスタ 除算器 コンピュータシステムの理 論と実装 nand2tetrisという、NAND からCPUを作り上げて、そ のうえでコンパイラを作り、 テトリスを動かすという大 学の講義の教科書の翻訳版 CPU 論理素子を 組み合わせ た回路 デジタル素子 アナログ素子 量子力学(固体物理学) 基礎理論 ※それっぽく並べているだけなので、厳密性はないです
  72. 72. 余談:なぜCUIが今でも使われるのか 72

×