何かを書き留める何か

数学や読んだ本について書く何かです。最近は社会人として生き残りの術を学ぶ日々です。

『Effective Debugging』の査読を担当しました

一年越しの夢がかなう

2017年6月24日にオライリージャパンから『Effective Debugging』の邦訳が発売される。

www.oreilly.co.jp

この度、邦訳の査読者として参加させていただいた。 オライリーの方から話があったのは2017年1月ごろ、査読を開始したのが3月中旬ごろである。

筆者のDiomidis Spinellisさんは『Code Reading』や『Code Quality』で有名なギリシャの計算機科学者である。 経歴を見る限り、GoogleのSREエンジニアとして1年間働くなど実務経験もあるすごい人である。

book.mynavi.jp book.mynavi.jp

私は原著を2016年6月頃に紀伊國屋経由で入手している。

『Effective Debugging』も『Effective Python』のように読み進めようとしていた。

xaro.hatenablog.jp

最初の4項目で断念していた。 どこかの出版社から邦訳が出ないかと思っていた。 英語ができない、デバッグに関するドメイン知識が足りないという要因もあるが、筆者が英語ネイティブではないという要因も少なからずあった。 査読をしつつ、楽しみながら読み続けた。

さて、内容としては効果的にデバッグを行う方法が書いてあるのだが、この手の技術では珍しく心理学の観点からデバッグの心構えを説いた項目がある。 「項目9:デバッグを成功させるために心の準備をする」がそれである。 本の帯にも採用されて、

最初に、問題を特定して解決できると固く信じることが必要だ。

から始まり、果ては睡眠時間の大切さまで話が進む。

こう書くと精神論めいたテクニックばかり書いてあるかのような印象を受けるが、1章、2章でデバッグ戦略の全体像、心構えを説明し、3章以降で各場面・ツールに着目してデバッグの手法を解説している。 特に面白いのはハードウェアに関するデバッグでデバイスをアルミホイルで包んで劣悪な通信環境を作ってバグの再現手順を確立したエピソード(「項目16:特別な監視およびテスト装置を使う」)である。

デバッグそのものは言語によらない技法であるが、中で登場するのはC/C++, Java, Python, Lua、各種Unix系のツール、そしてシェルスクリプトである。 使われている言語をよく知らなくても十分読むことができると思う。

ちょうど『Effective Debugging』の書影が公開された時期に業務中に作成したAPI群のデバッグに迫られていた。 そこで役に立ったのが5章の「プログラミング技法」、「項目3:前条件と後条件が満たされていることを確認する」、そして「項目9:デバッグを成功させるために心の準備をする」である。 様々な要因が重なってとてもつらい状況下でもデバッグであったが、『Effective Debugging』を読んで得たものを心の支えにして乗り切ることができた。 アルゴリズムデバッグのようにすぐには役には立たず、じわじわと役に立つと目論見を立てていたが、すぐに効果が出るとは思っていなかった。

原著を所有している方はお気づきであると思うが、邦訳版と表紙のデザインが異なる。 邦訳版は『Effective Python』のテイストに寄せている。 偶然ではあるが、表紙を決めるやり取りを垣間見ることができてとても面白かった。

読んでためになる本である。ぜひ職場、研究室、ご家庭、座右にと思う。

『Eric Sink on the Business of Software --革新的ソフトウェア企業の作り方』を読んだ

『Eric Sink on the Business of Software –革新的ソフトウェア企業の作り方』を読んだ。 きっかけはジュンク堂池袋店で行われていた「ラムダノート取扱い記念フェア「ラムダノートはじめました」」で並んでいたのが目に留まったからである。 ジャケ買いならぬPOP買いである。

www.shoeisha.co.jp

読んだ、と言っても一通り目を通したに過ぎない。 そして感じたのは今の段階でこの本のすべてを飲み込むのはきついぞということである。 一回読んで満足する、役に立つ本ではなく、折を見て、見返して少しずつ咀嚼していきたい。

一見消化不良を起こしているような記述になってしまったが、その中でも心に残ったものとして、第13章「キャリア計算」がある。 その中で、開発者のキャリアにおける基本的な方程式として、以下の式を紹介している。

{C = G + LT}

{C}は実力、{G}は素質、{T}は時間、そして{L}は学習である。 3つの変数の中で自分でコントロールできるのは{L}の学習のみであり、実力{C}に着目するのではなく、実力の時間による一次導関数{\frac{dC}{dT}=L}に集中するべきであると説く。 つまり、学び続けることが重要である、と。

私は学び続けることができているだろうか。 最近、技術書を読む頻度が下がっていないか? そろそろPython以外の言語を学ぶべきではないか? 数学を継続して学ぶべきではないか? 流行りの服は嫌いだと機械学習から遠ざかっていないか?

また折を見て読み返したい。

cmathとmatplotlibでMandelbrot集合を描画する。

cmathに思いをはせて

cmathモジュールの活用例を求めて色々と考えた後、まずはMandelbrot集合を書いてみようと思い立った。 Mandelbrot集合の定義はWikipediaを参照してほしい。

マンデルブロ集合 - Wikipedia

簡単に述べると、ある複素数列が収束する初期値の集合である。

最初は定義をよく確認せず実装してしまいうまくいかず、以下のサイトのお世話になった。 以前からMandelbrot集合の存在は知っていたが定義をきちんと理解したのは今回が初めてかもしれない。

aoking.hatenablog.jp

方針として、複素数列が収束するかを判定する函数floatrangeとなるジェネレータを実装し、Mandelbrot集合を計算、matplotlibで描画、いう流れである。

import cmath
import decimal
import itertools

import matplotlib.pyplot as plt


def mandelbrot(c):
    z = complex(10, 10)
    for _ in range(1000):
        z = z**2 + c
        if abs(z) > 2:
            return False
    else:
        return True

def drange(x, y, jump):
    while x < y:
        yield float(x)
        x += decimal.Decimal(jump)

xs = []
ys = []
for x, y in itertools.product(drange(-2, 2, 0.01), drange(-2, 2, 0.01)):
    if mandelbrot(complex(x, y)):
        xs.append(x)
        ys.append(y)

plt.axis('off')
plt.plot(xs, ys, ".", color='k')
plt.savefig("mandelbrot.png")

実行結果は以下の通りである。

f:id:XaroCydeykn:20170620225403p:plain

あまりきれいではない。

解析学っぽいことに触れると、自分の中に位相空間の知識が欠落していることにいやでも気づかされる。 しばらく時間ができそうな気配がするので、位相空間という借金を返済しようかと考えている。