社会人のメモ帳

忘れたくないことアレコレ

AI vs. 教科書が読めない子どもたち 書評

AIに何ができて、何ができないか

情報

著者:新井紀子

発行:2018年2月2日

目次

  • MARCHに合格――AIはライバル
  • 桜散る――シンギュラリティはSF 読解力と常識の壁――詰め込み教育の失敗
  • 教科書が読めない――全国読解力調査
  • 最悪のシナリオ

書評などなど

AIにはロマンが詰まっている。

いずれAIは人間を超え、AIが自身の能力を超えるAIを作り、そのAIがさらにAIを作り、というループを繰り返すことで起こる技術革新。その特異点をシンギュラリティと呼び、AIの世界的権威であるレイ・カーツワイルが提唱した2045年問題――要は2045年にその特異点が訪れるという訳だ。

そんな高度な成長を遂げるAIが、人の仕事を奪うと言われ続けて何年が経過したか。

そんなAIのロマンとされている部分を数学的・科学的に否定し、これからの社会を生きていく上で必要な読解力が失われつつあるということを、問題提起しているのが本著である。

前半部ではAIに出来ることと出来ないことを精査している。後半部ではAIには出来ない(とされてきた)読解問題に関して、現代の日本人はAIレベルにまで落ちているのではないか? という教育に関連した問題提起を行うという構成になっている。

本著を購入した読者は、そのどちらに期待しているのかで本著に対する評価は二分するように感じた。

まず前半部に関して、AIにできること/出来ないことを二分する上で、数学的・科学的に定義できる/できないという形で精査している。例えば、人が当たり前に持っている常識を数学的にAIに教え込むことはできないとし、AIと人間とを分け隔てる境界としている。

もう少し分かりやすく例示するならば、『人は運動すると疲れる』という常識を、AIは本当の意味で理解できない。何故なら『疲れる』とはどういう状態か理解できないから。

この辺りの議論は多くの哲学者が通ってきた命題であろう。アラン・チューリングが提唱したAIが知能を持ったかどうかを判定するチューリングテスト、それに対する反証として哲学者ジョン・サールが出した思考実験『中国語の部屋』のように。

そもそもAI開発の歴史は、「人間の持っている知能とは何か?」という命題に挑む人類の挑戦だと思っている。さきほどチューリングテストは知能を持っているかどうかの判定に使うと書いたが、知能の定義によってはチューリングテストの判定結果は正しいし、逆に正しくないとも言える。

この知能とは何かという命題に対する答えは、未だに出ていない。そしてその答えは永遠に出ないだろう、なぜならば数学では表現できない限界が存在するから――ここは本著における大きな柱になるのだが、ここは議論の余地がある気がする。

現にAIが読解問題に挑む上で重要な技術、自然言語処理は目まぐるしい発展を遂げている。AIが小説を書くAIノベリストは序章の序章に過ぎず、『文脈を読むことが可能になった』とされるBERTが公開された。今も尚、AIのロマンは終わっていないとブログ主は思っている。

 

さて、後半部は教育現場に対する問題提起だ。

そもそもAIの限界を数学の限界という結論に達したのは、AIが東大合格を目指すという一大プロジェクト『東ロボくんプロジェクト』を推し進める上で感じた限界によるものが大きい(そもそもプロジェクト開始当初から無理だと感じていたようで、それをプロジェクトを通じて改めて確認したという方が正しい)。

そして、そんなAIが仕事を奪っていき残された仕事を考えた時、人々に残された武器は読解力であるとした。しかしながらその読解力に、日本人は多くの問題を抱えており、そこをどうにかしなければいけないと論じている。

その問題は、AIに解かせていたRST(リーディングスキルテスト)と呼ばれる読解力を測るテストを、人間にも解かせたことで発覚したというのだから面白い。正しくAI開発の副産物による成果だといえよう。

このままでは読解力のない人々は、AIによって仕事を追われ淘汰されていく。それによって引き起こされる大不況を最悪のシナリオとして描き、社会に対する問題提起としている。

そんなこれからのために鍛えるべき読解力をどのように鍛えるか――この多くの人が気になるだろうポイントについては語られていない。筆者は数学者であって教育者ではない、そこを求めるのはお門違いだろう。

AIと数学の関係性、そして読解力と教育の関係性、それぞれを学ぶことができる良書だったのではないだろうか。

ITのプロが本気で考えた!演習で学ぶ!プログラミング思考最高の入門書 書評

プログラミング思考の入門書

情報

著者:ひぐま

発行:2020年1月11日

目次

  • はじめに
  • プログラミングとは何か?
  • プログラミング的思考の基本
  • アルゴリズム

書評などなど

「プログラミング的思考」とは。

2020年よりプログラミング教育が小学校教育の現場に導入された。その目的の一つに、「プログラミング的思考」を身につけさせるということが上げられている。そんな今後注目されている思考法について、超絶シンプルにまとめられているのが本著だ。

その内容はあまりにシンプルで、本著のページ数は表紙やあとがきを含めて58ページという収まりの良さである。しかも命題とすべき「プログラミング的思考」の本質について議論されているのは、第三章『プログラミング的思考の基本』のみで、第四章『アルゴリズム』は演習問題とその解説が列挙されているに過ぎない。

そもそも「プログラミング的思考」とは何かという問いに対し、本著では『「作業を分解すること」「物事を抽象化すること」を組み合わせ、作業手順を考えること』とまとめている。

それを実際にプログラミングで利用する際の基本が、第三章『プログラミング的思考の基本』でまとまられている。ここではC言語Pythonといったように多岐に分かれるプログラミング言語のどれでも通用する考え方をまとめており、その考え方を実際に使った場合――要はアルゴリズムを作ろうとすることを演習問題で練習する……という構成になっている。

 

演習問題の一つを例としてあげてみよう。

演習問題1では、『うるう年の判定』を行わせるアルゴリズムを考える内容だ。うるう年の条件としては、下記の三つがあげられる。

  • 西暦が4で割り切れる年はうるう年である
  • ただし100で割り切れる年はうるう年ではない
  • ただし400で割り切れる年はうるう年である

この条件をベースに、4で割った際の余りを考えたり、それぞれの条件に優先順位をつけたりといったことを思考し、プログラムを書く際にフローチャートを作成。解説自体は2ページくらいでまとめられている。

こういった演習問題が6個あり、それぞれの簡単な解説が繰り返される。

アルゴリズムを学びたいという方には、些かボリューム不足感は否めない。本気で取り組みたいという方は、アルゴリズムを専門にまとめた書籍が探せばあるので、そちらを参照すべきであろう。

まとめると本著は本当の意味で入門書となっている。入門する上で、門の前に立つための準備とでもいうべきか。この一冊をやりきったところで、ようやく入門の門の前に立つことができて、そこから一歩踏み出すと深淵が待っている。

それでもある程度の指標があれば、深淵に落ちることなく歩ける。その指標としては役に立つかもしれない。

よくわかる組込みシステム開発入門 要素技術から開発プロセスまで 書評

組込みを学ぶならこの一冊

情報

著者:組込みシステム技術協会 人材育成事業本部

発行:2021年2月9日 

目次

  • 組込みプログラムの最初の一歩
  • ”思ったとおり”に動かそう
  • 組込みとタイマを実装してみよう
  • マイコンの基礎知識
  • 外部の情報を知るための周辺機能
  • リアルタイムOS
  • 組込みプログラミングでの注意事項
  • 通信サービスとネットワーク技術
  • 開発プロセス
  • 開発プロセスに関連する用語と解説

書評などなど

組込み開発とは、車や家電といったハードウェアが期待する動作を実現させるために実装するソフトウェアを開発することである。開発を進めるためには、ソフトウェアの知識は勿論のこと、ペリフェラルと呼ばれる外部の周辺機器、それとの通信などといったハードウェアの知識も要求される。

ソフトウェアだけ、ハードウェアだけの知識では、組込み開発を進めることは困難である。そこで全体を良い感じに網羅してくれる書籍が、組込み開発の導入教育では重宝されると思う。

そういった書籍を個人的には探していたが、満足のいくものはなかった。まぁ、両方を網羅しようとすれば、割くべき時間や字数は増えていくことは避けられない。結局、それぞれを網羅した書籍を二冊という形に落ち着く……とはいえ両方の繋がりが見えないと難しい。

そんな悩みを解消する上での最適解が本著なのではないか。

本著はそもそも、ETECと呼ばれる組込み開発技術者試験の運営委員会が執筆した書籍である。そのためETECの試験を受ける上で大事な要点がまとめられていると言って良い。電子書籍版の場合は、ETECを受ける優待券がついているくらいだ。

試験合格に向けた座学の一冊と要約することもできよう。しかし、この一冊で得た知見は実際の現場では最低限必要とされている知識が凝縮されている。言葉や知識、最低限のことは分かるようになっている。

 

他の組込み開発の書籍とは違う点として、第七章『組込みプログラミングでの注意事項』を上げたい。ここでは組込み開発でうっかりしていると、大きなミスに繋がりかねない懸念点を簡単にまとめている。

例えば。

組込み開発では、処理速度が重要視される。その求められる速度を実現するための一環として、コンパイラに備え付けられた最適化という機能を最大限利用する。ただこの最適化によって処理が変わってしまうことがある……こんなこと知らなければ、対処のしようがない。

上記で示したように、本著でまとめられた内容は、あくまで簡単にであるし、他にも懸念点なんて腐るほどある。それでも、これらが書いてあるというだけで大きな学びとなる。

第九章『開発プロセス』には、組込み開発を行う流れとして、V字プロセスというものが使われていて、その内訳がまとめられている。ここがかなーーりしっかりしており、一冊でここまで学べるというだけで有り難いことこの上ない。

まとめ方も、それぞれのプロセスを『新規開発』と『派生・流用開発』で分けて解説されており、MISRA-Cといったセキュアコーディングにまで言及している。何度もいうように、あくまで簡単にであるが、言及してあるというだけで前提知識がついてくる。

この一冊で満足するべきではないが、それぞれ細かな言及箇所をより深掘りしていくような学習を進めれば、ETEC試験にだって受かるのではないだろうか。ちなみにブログ主は受けたことすらないので、いずれ受けてみたい所存である。

ヒューマニティーズ 教育学 書評

教育学とは何か

情報

著者:広田照幸

発行:2019年3月21日

目次

  • はじめに
  • 教育論から教育学へ
  • 実践教育学と教育科学
  • 教育の成功と失敗
  • この世界に対して教育がなしうること
  • 教育学を考えるために

書評などなど

まず大前提として、ブログ主は教育業界に身を置いている人間ではない。教育学の「き」の字も知らないド素人であるが、教育という分野に興味だけあるという社会人だ。

さて、教育を学びたいとした時、何から手を出せば良いだろうか……ネットで検索したところで何も分からず、難しい書籍ばかりがオススメに出てきて頭を抱えた。そんな中、岩波文庫から出ているヒューマニティーズシリーズの教育学が目に付いた。

『humanities』という英字が表紙で踊っている同シリーズは、社会学政治学、文学といったように、それぞれの学問に対して「○○学とは何か?」という問いからスタートし、意義や定義といった話に踏み込んでいく。教育学も例外ではない。

『はじめに』には、現代教育学は方法学や心理学といった多岐にわたる入り口が用意されており、それぞれを個別に見るのではなく、教育学の全体像を捉えて考えていけばよいか考えるべき、という思考の出発点を提示している。

そもそも教育学には、教育心理学や教育方法学、教材学といったように細分化されているということすら知らなかったブログ主にとって、これは大きな成果である。その全体像や繋がりを、歴史の歩みを学ぶことで理解できるように描かれているのが本著だ。

最終章『教育学を考えるために』では、そういった全体像を学んだ上で、「どのように教育学を学んでいけばいいか」という問いに真摯に答えてくれている。おすすめの書籍が多大に紹介され、それぞれ何も分からない初学者向けや、実践に基づいたエッセイといったようにカテゴライズされているのも嬉しい。

他にも教育に関する書籍は読んでいるが、本著を踏まえてもう一度読み直そうかと思っているくらいだ。

 

教育というのは時代と共に変化している。教育なんて本質は時代が変われど変わらない……と勝手に思っていた認識は、早々に捨て去られることとなる。

個人的に印象に残っている話がある。

ヨーロッパ近代となって学校が広く普及・拡大してきた要因として、「文字文化の普及」と「身分社会から階級社会への変容」が本著では上げられている。「文字文化の普及」のきっかけとして、印刷技術の発達と、ルターらの宗教革命によって聖書が各国の言葉で翻訳されたことが説明された。

この辺りで歴史における一つの転換期と、教育の大きな転換期が結びついた。歴史の変容が、教育に対して大きな影響を与えていたという考えれば当たり前だが、気にしたことのない物語に気がついたのだ。

そこから教育によって文字が読めるようになった庶民が、その努力次第で社会的地位を獲得できるようになった。ここから教育の機会を平等に与えるという大きな転換期まで、多くの時間と犠牲があるのだろうと夢想する。

そういった歴史的読み物として、(少なくとも)ブログ主は楽しく読むことができた。

他にも今では当たり前である教師一人に対して生徒が複数人で行われる授業形式の教育が形作られるまでに、多くの哲学者や教育者が議論や意見交換を行っていく過程が、歴史という形で語られる。

その物語が面白い。

 

歴史についてばかりではなく、現代の話も書かれている。どちらかといえば、現代における教育学の立場というものを批判的に書いており、学ぶ意義や目的について改めて確認するような内容になっている。

教育学とは。実践によって得られる学びや知恵を、体系的にまとめあげて広めていくことができる学問であり、それこそ教育学者がすべきことである。こんな一行でまとめられるものではないが、少なくともそう理解した。

まだまだ教育について学び始めたばかりのブログ主にとって、読みやすく、しかし読み応えのある一冊であった。

プログラミング言語C 第2版 ANSI規格準拠 書評

Cを学ぶならこの一冊

情報

著者:B.W.カーニハン/D.M.リッチー

訳者:石田晴久

発行:1989年6月15日

目次

  • はじめに
  • やさしい入門
  • データ型・演算子・式
  • 制御の流れ
  • 関数とプログラム構造
  • ポインタと配列
  • 構造体
  • 入出力
  • UNIXシステム・インターフェース

書評などなど

この本はめちゃくちゃ古い。

『The C Programming Language』がアメリカで出版されたのが1978年、それを日本語訳したものが第一版、第二版と改訂を経て、今の形に落ち着いている。C言語を学ぶ書籍は数多あれど、C言語を書く上での考え方を学ぶならば、本著だけで十分なのではないだろうかと思う。

当時はOSとして巨大で高価だったUNIXをベースにして開発された、OSやコンパイラを書ける ”システム・”プログラミング言語” としての特徴をまとめつつ、注意すべきポイントをまとめている。

C言語以外の言語から学び始めた人だと意識することは少ないかもしれないポインタという概念や、文字列を比較できないという性質など、本著ではきっちりページを割いている。

本著を難しい書籍……と考えている者もいるかもしれない。

しかし第一章『やさしい入門』では、詳しい話に入るよりもまず先に、『”Hello, World!” を印字せよ』という課題に取り組むことで、プログラム言語というものを書いてみることから始めさせる。

プログラムを全くやったことがないという人にとって、つまずくであろう要所に説明が行われている。それぞれの要所に関して、より詳しく知りたい場合は、『第○章に詳しく書いている』『第△章の○○に詳しく書いている』というように注意書きがなされているので、そこへ飛べば良い。

例えば。

#include<stdio.h>

『”Hello, World!” を印字せよ』という課題に取り組む場合の一行目は、上の一文が記述される。この一文の意味をきっちり説明してくれるC言語の書籍が、どれほどあるだろうか。

一言で言ってしまえば、『標準入出力ライブラリの情報を読み出す』といったように説明できるが、おそらく初学者にとって頭上に「?」がいっぱい浮かんでいることだろう。

このライブラリに関して、標準入出力に関して、は第七章『入出力』にまとめられており、学びたければそこへ飛べば良い。むしろ第六章に至るまでは、この『入出力』に関する情報は一切語られていない。

ここを知りたければ、そこだけを読めば良い。

 

第七章にいきなり飛ぶというような話をしているが、読み方としては第一章から順番に読んでいくことをおすすめしたい。書いてみることから始める第一章、第二章からは、書いてみたら気になってしまう概念を、詳細に見ていく。

プログラミング言語とは、機械にも分かるような形で指示を明記することができる言語だ。機械にはデータ――つまり数字でしか指示を理解できない。この数字を制御するために、変数と呼ばれるものを宣言し、この変数の中身である数字を変えていくことで指示を出していく。

第二章ではこの変数について、そして宣言する方法、宣言する時に必要になるデータ型と呼ばれる概念を理解していく。第三章からは数字を変えていく制御の記述方法を理解していき……と順番になっていることが分かっていただけたのではないだろうか。

例外として、ポインタという概念も扱うことになるのだが、こいつの説明は本著に譲ろう。下手な前提知識をつけて、何か大きな誤解を抱いたままC言語に挑むと、きっと痛い目を見ることになる。

 

本著を難しいと思っている方は多いかもしれない。しかし読み込めた読み込むほどに、本著の分かりやすさと凄さが垣間見えるように、細部にわたって作り込まれている。新しい発見があり、コーディングに詰まった時に読み返せば作業も捗るかもしれない。

C言語を学ぶならば、とりあえず買っておくことをおすすめする。

組込みエンジニアの教科書 書評

組込みに関する幅広い知識

情報

著者:牧野進二/渡辺登

発行:2019年4月26日

目次

書評などなど

組込みとは。

マイクロコンピュータ、通称マイコンを搭載した機械や装置のことを指す。つまりは身近に溢れている家電は、全て組込みである。その組込み製品の開発の、いろはの「い」から学ぶことができる教科書が、本著となっている。

第一章「組込みソフトウェアエンジニアの仕事」では、そもそも組込みとは何かの説明から始まり、開発現場に関する規模や、組込み製品が提供するサービスといった組込みと実社会の関係性が分かるような話が広がっていく。

第二章「マイコンハードウェア」から第七章「組込みLinux」までで、おおよそ組込み開発に必要な最低限度の知識が身に付くように構成されている。

そもそも組込みを全て学ぼうとした場合、ハードとソフトの両面の知識が必要になる。

第二章「マイコンハードウェア」では表題の通り、ハードウェアに関する情報がまとめられている。しかし内容としては、単語の意味を確認するという意味合いが強い印象を受けた。少なからず開発現場で話をするに困らない程度の知識を付けるだけならば、本著で問題はないだろう。

第三章「組込みソフトウェア」では表題の通り、ソフトに関する内容がまとめられている。初学者にとって、おそらく大きな関門となるのではと個人的には思っている内容となっている。

第三章の冒頭でOSのあるマイコン、OSのないマイコンの話が登場する。それぞれの説明はざっくりとしており、「OSのないマイコンにはミドルウェアがなく、OSのあるマイコンにはミドルウェアがある」という風に記述されている。この段階で、そもそもOSが分からないという方は、第五章「リアルタイムOS」まで飛ぶ必要がある。

そのうえ、C言語に関する知識が当たり前のように要求される。C言語を知らないという方は、回れ右して勉強する必要があるという訳だ。本著で組込みを学びたいという方は、二章までをしっかり学びつつ、C言語の学習を並行しながら第三章以降を読み進めるという形になるだろう。

第四章ではArduinoというAmazonでも買えるお手軽マイコンを購入し、それを片手に勉強する内容となっている。つまり、実際にマイコンにプログラムを書き込んで動かしてみようという回だ。

この部分に関しては、本著だけでなくArduinoの専門書籍などを買うことをおすすめしたい。内容はかなり深くまで踏み込んでいるのだが、そこに至るまでの階段がない。開発現場にいる者にとってしてみれば、丁度いい塩梅なのかもしれないが、初学者にはハードルが高いのではと思う。

 

第五章「リアルタイムOS」に関して、個人的な見解として割かれているページ数が少ないように感じた。この辺り、組込みを教えるに当たってどこを重視するかによって変わってくると思うが。

おそらく本著で重視されているのは、第六章以降で書かれてくる今後の組込み開発で重視されてくるであろうIoTやAIといった新たな技術であったり、今後変わっていくことが想定される開発プロセスの話なのだろうと思う。

そういった組込みに要求されるようになってくる新しいものに対応するために、RTOS(=リアルタイムOS、即時性を重視している)からLinuxに切り替わっていくのだろう。Wi-Fiと接続するような組込みの製品には、RTOSLinuxの両方のOSが組み込まれた製品は確かにあるし、そういった知識があった方が良いことは確かだ。

IoTは今後、どんどんと広がりを見せていくだろう。それらの知識と組込みの知識、両方を備えていくことで、自分のキャリアにも広がりを持たせられるかもしれない。組込みに関して、幅広く浅く学べる書籍となっていた。

リーダブルコード 書評

よりよいコードを書くためのテクニック

情報

著者:ダスティン・ボズウェル/トレバー・フォシェ

訳者:角征典

発行:2012年6月22日

目次

  • 理解しやすいコード
  • 名前に情報を詰め込む
  • 誤解されない名前
  • 美しさ
  • コメントすべきことを知る
  • コメントは正確で簡潔に
  • 制御フローを読みやすくする
  • 巨大な式を分割する
  • 変数と読みやすさ
  • 無関係の下位問題を抽出する
  • 一度に1つのことを
  • コードに思いを込める
  • 短いコードを書く
  • テストと読みやすさ
  • 「分/時間カウンタ」を設計・実装する

書評などなど

IT業界に身を置くものならば、避けては通れないコーディング業務。C言語Java、html/cssPythonといった多岐に渡るプログラミング言語を記述するために、どれほどのプログラマーが頭を抱え、神経を擦り減らせ、数多の工数を捧げてきたか。

「プログラムなんて動けば良いだろ!」という方は、本著を読んで考え方を改めて欲しい。そして個人的には、全プログラマが本著を読んて欲しいとさえ思っている。

目次にて記載した表題のことを守ってくれるだけで、どれほど多くのプログラマが救われるか。プログラマが意識すべきは「動くこと」だけではなく、その後のプログラマが引き継いだ際に読みやすい「分かりやすさ」に加え、後から変更や追加をしやすい「保守性」に、「テストのしやすさ」などまで考えて書くべきなのだ。それを声を大にして言いたい。

プログラムが動くなんて、そんなの設計した通りに書けば動くのが当たり前なのだ。仕事を頼みたいプログラマと、そうでないプログラマの差というのは、「プログラムをどこまで明瞭に分かりやすく書くか」ところなのではないだろうか。

しかし、それらは勉強しようにも難しい。そこで役に立つのが本著である。

 

開発現場には部署ごと、会社ごとに「コーディングルール」というものが作られている(なければ逃げよう)。変数名や関数名を決める上でのルール、インデントやカッコ位置などを明確に定めておくことで、プロジェクトのコードの記載を統一させることが目的だ。

基本的なプロジェクトでは、そういった最低限のルールというのは守るように定められている。プロジェクトによって、どこまで決められているかはマチマチだろうが、本著では変数名や関数名に関して、「どうすれば分かりやすいか」がきっちりまとめられている。

例えば。

本著の第二章「名前に情報を詰め込む」にて、『「get」はあまり明確な単語ではない』と説明されている。「Get」という単語は、「入手する」「手に入れる」という意味があり、関数名として使われることが多い。

しかし、それだけでは「どこから入手するのか」「どのように入手するのか」といった情報が分からない。何も考えず「Get」を選ぶのではなく、「Download」や「Fetch」といった単語を選択した方が分かりやすい場合がある。

他の例として、「Find」は「Deliver」「Dispatch」「Announce」「Route」といった風に変えた方が分かりやすいことがある。あくまで分かりやすいことがある、という意味合いが大切だ。要は適当ではなく、その関数の意味、どういう使い方をするのかということを、関数名から一発で分かるようにするべきだと説明している。

命名に関することのみならず、コメントや順番などに一工夫することで、分かりやすさは向上する。そういった工夫の選択肢が、読み進めるだけで学ぶことができる。一度読んだだけでは分からないことも、プロジェクトを進めながら、もう一度読み返してみると新たな発見があったり、発想のきっかけになることが多い。

 

本著の凄いところは、どのプログラミング言語でも役に立つヒントであるということが上げられる。Pythonなどでは、インデントもプログラムの一部であり有無次第で挙動が大きく変わる。改行もそうだ。改行の数次第では処理速度が変わるプログラム言語も存在する。

そういったプログラム言語の差異も吸収し、あくまでプログラミングする上で意識すべき発想をまとめているため、どのプログラミング言語を書く際にも役に立つようになっている。

とりあえずコーディングをする人は本著を読んで欲しい。