FIETS ~インフラエンジニアトレーニング場~

24歳までIT音痴・PC嫌いだった人間が、インフラエンジニアとして食べていけるようになるまでに役に立った情報を掲載

Pythonではじめるアルゴリズム入門~伝統的なアルゴリズムで学ぶ定石と計算量~を読んで

 抽選で当たりました。ぱちぱち!ので書評を。

 

connpass.com 


初書評です。本は読むほうなので、書評ブログ投稿したいと思っていましたが、なかなか手を付けられずにいました。

機会いただき感謝いたします。 

 

  

読む前の読者スペック

読む前の読者スペックはこんな感じです。

最低限の知識はあるけど、プログラミング経験は0。こいつが読めたら、誰でも読めるね。って感じのスペックです。

 

応募(本書を読みたかった)背景

インフラエンジニアとしてサーバの運用保守をしています。

昨今のSite Reliability Engineering(SRE) の流れもあり、Infrastructure as Code(IaC)を取り組む上でプログラミングはインフラエンジニアにとっても非常に重要になってきております。
そこで、勉強しようと色々なもの(オンライン教材や勉強会)に手を出しましたが、文法を教えるだけ(繰り返し分の書き方、変数の定義方法など)というものが多く、この本の第1章ですね。それは調べれば分るのだよな。。。と思っていました。
何が分からないのか分からないので、いくつか自分で実際に書いてみよう!と行動した際に躓いたのがアルゴリズムです。プログラミングをどう書けばいいか分からないのです。もしくは相当な力業でなら書けるけど汎用性がない(その問題にしか適用できず業務では絶対使えないものしかできない)のです。
プログラマーってプログラミング言語自体の知識より、アルゴリズムが大事なんじゃない?それがあれば後はどう書くか調べるだけでしょ?
と極端な考えを持ち始めたのが最近。でもアルゴリズムってどうやって学ぶんだろう。。。と悩んでいたタイミングでこの本に出会いました。上記を期待したうえで読んでみました。

 

Pythonではじめるアルゴリズム入門 伝統的なアルゴリズムで学ぶ定石と計算量

Pythonではじめるアルゴリズム入門 伝統的なアルゴリズムで学ぶ定石と計算量

  • 作者:増井 敏克
  • 発売日: 2020/01/24
  • メディア: 単行本(ソフトカバー)
 

 

本の目次

第1章 Pythonの基本とデータ構造を知る
1.1 プログラミング言語の選択
1.2 プログラミング言語Pythonの概要
1.3 四則演算と優先順位
1.4 変数と代入、リスト、タプル
1.5 文字と文字列
1.6 条件分岐と繰り返し、フローチャート
1.7 リスト内包表記
1.8 関数とクラス

第2章 基本的なプログラムを作ってみる
2.1 フローチャートを描く
2.2 FizzBuzzを実装する
2.3 自動販売機でお釣りを計算する
2.4 基数を変換する
2.5 素数を判定する
2.6 フィボナッチ数列を作る

第3章 計算量について学ぶ
3.1 計算コストと実行時間、時間計算量
3.2 データ構造による計算量の違い
3.3 アルゴリズムの計算量と問題の計算量

第4章 いろいろな探索方法を学ぶ
4.1 線形探索
4.2 二分探索
4.3 木構造での探索
4.4 さまざまな例を実装する

第5章 データの並べ替えにかかる時間を比べる
5.1 身近な場面でも使われる「並べ替え」とは?
5.2 選択ソート
5.3 挿入ソート
5.4 バブルソート
5.5 ヒープソート
5.6 マージソート
5.7 クイックソート
5.8 処理速度を比較する

第6章 実務に役立つアルゴリズムを知る
6.1 最短経路問題とは?
6.2 ベルマン・フォード法
6.3 ダイクストラ
6.4 A*アルゴリズム
6.5 文字列探索の力任せ法
6.6 Boyer-Moore法
6.7 逆ポーランド記法
6.8 ユークリッドの互除法

Appendix Pythonのインストール

第一版なので、ミスも多かったりするかと思いましたが、正誤表 以外見つけられず。(2020/2/28時点で4件)

 

期待に対する結果・本の感想

特に私と同じような悩みを持った方にはお勧めします。

よく初心を忘れている方が書いた中身が難しすぎる入門書がありますが、この本は前提(例えばos別のインストール方法や、二進数の足し算など)を漏らさず説明してから本題に入るので、挫折せずに読むことができました。また、日本語も適切で良く頭に入ってくるため、初心者から採用している企業の研修などで使ったらいいのでは?と思うほどでした。

最後の方は中級者でも楽しめる内容だと思います。

 

特に2章以降は、プログラミングが得意な方の思考を辿れます。これが初学者にはとても嬉しかったです。

いきなり簡素で正解に近いコードを見せられて、「~というアルゴリズムがあります。」ではなくて、

「最初はフロー図を作りましょう。」「一つ目の繰り返し文を実装してみましょう。」「ここの処理が重複してるので、一つに纏められそうですね。」という感じで、最終的な簡素で綺麗なコードになる理由が思考を追って理解できるのです。

読み進める前に自分なりにフロー図を作ってみたりプログラミングしてみると、よりその思考方法が勉強になります。どんどんコードが少なくなっていくことに快感を覚えながらアルゴリズムを学ぶことができました。

「あ、こういう発想があるのか!」「へーこんなにコード少なくなるのか。これで完璧だ。」「え、まだダメ?あーここも気をつけないといけないのかー。」的な。

 

更に説明文だけでなく、説明図、フロー図、コードとその実行結果があって、理解の助けが沢山あります。

例えば、「参照渡し」という私にとっては分かりづらいワードがp35にありました。説明文を読んでも図を見ても少し難しかったのですが、実行結果も込みで見たことで、理解することができました。

 

副産物(期待してたもの以外に得たもの)

計算量再帰について(本当はもっと奥が深いのでしょうが)理解が進みました。

計算量は基本情報で学んだ記憶があるが、いまいちピンと来ていませんでした。それが今ではOの記号の意味が分かり、『理系が恋に落ちたので証明してみた。』に出てくる会話が分かるくらいにはなってきました。計算量をプログラミング時に意識するべきだと強く感じました。

再帰については、高校数学を思い出しました。あの時解けても意味があまり分かっていなかった数列などの意味が分かり、数学をもう一度学びたくなりました。子どもが数列を学ぶ機会があったら、例として教えてあげようと思います。イメージができるだけで、理解度も上がるし、楽しみながら学べると思うのです。

 

終わりに

読み進めてるうちに、アルゴリズムについて理解は進んだものの、どうすれば実装時に思いつけるだろうと悩んでしまいました。

しかし、恐らくアルゴリズム一つ一つが研究テーマになるくらいのものだと思うので、まずは型を覚えて頭にインデックスを貼り、どう応用出来るかが大切かと今は考えております。

とにかく筆者の他の本も興味が湧いたくらい内容が分かり易かったです。

コードをいくつか書くうちに慣れてきたので、現在はPythonでサイトのスクレイピングをやってみています。上手くいったらまた記事にします。このように他のこともやってみよう、調べてみようという意欲が湧いた時点で、入門書としてはとても良かったのではないかと思います。

 

以上です。理解が異なる点、今後のアドバイスなどコメントいただけると幸いです。