m-eye blog

ノンプログラマによるVBAとPythonの学習記録

「人気Python技術書の著者が教える【正しいプログラミングの学びかた】〜プログラミングで仕事・人生をハックしよう〜」に行ってきました

f:id:m-eye:20181010190201j:plain

 

はじめに

人気Python技術書の著者が教える【正しいプログラミングの学びかた】〜プログラミングで仕事・人生をハックしよう〜【リピート開催】を受講。

10:00 - 19:00まで充実した内容のクラスをみっちり受けて、もう疲れ果ててます。

講義は、Jupyter Notebookでオリジナル教材を用いて進められました。

Pythonだけでなく、プログラミング一般についてもためになる話が多かったですね。

 

どんな講義だったのか

かいつまんで説明します。なお、自分のメモに基づいて思い出しながら書いているので、内容の正確性を保証するものではありません。ご了承ください。

 

1時間目:なぜプログラミングが重要なのか

プログラミングの重要性について説明されました。

 

プログラミングとは何か

プログラミングとは「手順の言語化」であり、人間は「機械 + プログラム(手順)」で「作業の自動化」を可能にしてきました。例として挙げられるのは、時計・からくり人形・オートマタ(人形)です。

 

オートマタの例(西欧版からくり人形)

Joueuse de Tympanon - automate

 

人間はなにかを自動化したいという欲求を持っている

具体例 説明
ゼンマイ・歯車・カム 金属加工技術の発達
蒸気機関・エンジン・電化 動力の進化
複雑な手順・UI コンピュータの発達
AI データを使った機械学習の発達

通信の歴史をたどって、自動化の歴史が説明されました。

交換手→機械式交換機→電子交換機→移動体通信と発達するなか、通信の一般化・デジタル化・高速化・大容量化・最適化がおこなわれてきて、その歴史的発展を指し、「世界はプログラムで動いている」といわれました。

 

なぜPythonを使うのか

ここからPythonを使う理由が説明されて、Pythonはとても守備範囲の広いプログラミング言語であり、AIや機械学習・データサイエンスなどに幅広く利用されているという説明でした。

Jupyter Notebookを使って、素朴なプログラミングの素質を試す問題を解きました。今までの過去の講義のなかで10問全問正解した人はたった1人、7問正解した人が数人、たいていが2問目か、4問目でひっかかり、制限時間10分を超えてしまったという結果がでているようです。

ちなみにわたしは4問目で「思い込みという盲点を突く」問題で時間がかかり、5問目の途中で制限時間を迎えました。

 

2時間目:なぜプログラミングは難しいのか

まず、手順を組み立てることがそもそもむずかしいんです。自然言語である日本語で業務マニュアルを書くことを考えてみるといいですね。他人に誤解されないように業務を説明し、そのマニュアルどおりに業務をおこなってもらうのはけっこう大変です。

また、ハノイの塔を解いてみてわかりましたが、プログラミングには「ひらめき」も必要なんです。「ハノイの塔」の解き方をそもそも知らないときに、それを応用したプログラミングを要求されることもありますからね。

「ひらめき」を要求されるということと、一見矛盾するようですが、直感では3囚人問題は解けません。そのことからもわかるように、基本的にプログラミングに要求されるのはロジック、論理性です。

3囚人問題では、感覚と論理の違いに注目する注意力と自分の答えをきちんと他人に説明できる再現性が重要といえます。

 

3時間目:なぜプログラミングでは数字が重要か

この時間の前半では、Pythonの入門書にあるような、組み込み型とライブラリについて説明がありました。

Pythonの書籍にあるような内容はいい意味でここだけです。他は講義をうけないと説明されないような内容だっと思います。

Jupyter Notebookを使った問題では、いわゆる銀行の窓口での待ち行列問題(M/M/4問題)の解き方を学びました。

いわゆる「ひっかけ問題」です。学校の先生なんかはこういうのすきそうですね、という問題です。

「窓口での待ち時間の最適化問題」なのか、「他人にもっとも説明しやすいロジックをえらぶ問題」なのか、「最もシンプルなロジックをえらぶ問題」なのかなどをはっきり言わず、どんな問題なのかを考えさせるというしょうもない問題でした。

「窓口での待ち時間の最適化問題」の解答がきちんと用意されていて、それ自体がいい解答でしたので、こんなくだらない問題は普通の社会人には必要ないなと思います。

他人にわかりやすく説明することができない人間は相手にされないところで生きている方には、この手の問題は不要です。

ちなみに答えは「最も組み立てるのに時間がかからないプログラムは、1番窓口から4番窓口まで常にランダムに人を割り振る、というプログラムである」でした。

この問題の唯一いい点をあげれば、プログラミングはヒューリスティックという観点からおこなうべきだ、という考え方を学べることです。

 

4時間目:なぜ“オブジェクト志向”が使われるか

2018年現在の現代的なプログラミングでは、複雑な課題をより手軽にプログラミングするために「オブジェクト志向」が使われています。

Pythonでいうオブジェクトとは、「アトリビュート」というデータと「メソッド」という関数をひとまとめにしたものです。文字列やリストもオブジェクトです。

 

Googleの音声合成API「Google Text To Speech(gtts)」

また、後半では、Googleの音声合成API「Google Text To Speech(gtts)」を使って,漢字かなまじり文を音声に変換する例が紹介されました。

!pip install gtts
from gtts import gTTS
tts = gTTS(text="今日の天気は晴れ,降水確率は20%です。", lang="ja")
tts.save('wreport.mp3')

たったの4行で、mp3ファイルが生成されました。これもPythonから「Google Text To Speech(gtts)」を手軽に利用できるからです。

 

Webスクレイピング

もう1つ紹介されたのは、Webスクレイピングの例です。

from urllib.request import urlopen
from bs4 import BeautifulSoup
url = "http://weather.excite.co.jp/area/ar-4410/"
r = urlopen(url)
bhtml = r.read()
html = bhtml.decode("utf-8")
soup = BeautifulSoup(html, "html.parser")
today_l = soup.find_all("div", id="todayWeather")
today = today_l[0]
weather_l = today.find_all("p", class_="text_telop_code")
weather = weather_l[0]
weatherstr = weather.text
weatherstr
todayweather = '今日の天気は' + weatherstr
todayweather
from gtts import gTTS
tts = gTTS(text=todayweather, lang='ja')
tts.save('todaywreport.mp3')

この短いプログラムでWebスクレイピングをおこなって音声ファイルまで作成されました。

 

5時間目:なぜ"データサイエンス"が重要なのか

音声認識・数値演算の基礎についての説明。

具体的な技術を取り上げて、音は音波(縦波)であって圧力増加・減少をあらわすものですが、それを横波にしたものはデジタルに区切られた時間の間の振幅、時間にともなって変化する数値の列(時系列データ)として圧縮されるということが説明されました。

また、数値演算については、Numpyを用いた行列演算(線形代数の一部)が説明され、そこから予測の精度を確認する人工知能の手法の基本について教えられました。

 

6時間目:AI(人工知能)は人間を超えられるか

機械学習(マシンラーニング)や、その一分野である深層学習(ディープラーニング)についての説明。

機械学習の基本は、データを数学的に分析することによってデータの特徴を抽出し、その特徴と集めたデータを 比較・分析し照合することです。

機械学習によって起こされたパラダイムチェンジとしては、ハノイの塔の問題を解くことに代表される「手順作成→実行」から「データと分析手法があればプログラミングが不要」という特徴抽出からの解放、という変化があります。

これからのAIによってもたらされることは、複雑な問題を、原因と結果の多くの組み合わせと複数の手法を多段に組み合わせることによって解答の精度(品質)を向上させることがあげられます。

もたらされないことは、人類のヒューリスティックな類推、いきあたりばったりな物事の考え方の実現です。

巡回セールスマン問題などのNP困難を考えれば、すべてをアルゴリズムで解けるわけではなく、急激に変化する環境に柔軟に対応するための人類のヒューリスティックと高度な抽象化能力をきちんと定義することが難しいため、シンギュラリティによる汎用AIの実現はむずかしいということです。

 

おわりに

今回の講義は「Pythonのお勉強」ではなく、「正しいプログラミングの学び方」でしたので、これを活かして正しくプログラミングを学んでいきたいと思います。

つまり、わたしたちはふだん「プログラミングのしかた」ばかり学んでいますが、行き詰まったとき、煮詰まったときは、「しくみ」に立ち返り、「しくみを知りながら学ぶ」ということが重要なんですね。

ちなみに、今回の講師の方は次のような本を書かれています。

みんなのPython 第4版

みんなのPython 第4版

 

Copyright 2018 m-eye blog All Rights Reserved.