2012-05-16

Go言語の型宣言をHaskellから理解する

という誰得記事を書いてみたいと思います。

Goの型システム……というかtype宣言はなかなか面白いんじゃないか、ということに最近気づきました。type宣言は新しい型を宣言するものです。たとえば、A Tour of Goのだと、
type Vertex struct {
X int
Y int
}
のように宣言します。これは当然のように思われるかもしれません。
ところが、type MyFloat float64 のように宣言することがあります。これはどういう意味があるのかというと、実態としてはfloat64なのだが新しい型として定義したい、という意思表示となります。

具体的に、これが意味するものとしてメソッド宣言を見てみましょう。VertexにAbsというメソッドを定義した場合:
func (v *Vertex) Abs() float64 {
return math.Sqrt(v.X*v.X + v.Y*v.Y)
}
このように表記します。このとき、*Vertex 型の変数 v について v.Abs() とメソッド呼び出しができるわけです。
同じように、type MyFloat float64 として宣言したMyFloatに対しても、メソッドの宣言ができます():
type MyFloat float64
func (f MyFloat) Abs() float64 {
if f < 0 {
return float64(-f)
}
return float64(f)
}
というか、どんな型に対してもメソッドの定義ができます。ただし、異なるパッケージの型に対して勝手にメソッドを追加したりできない、ビルトインの型も同様に挙動を変更させることはできない、という制限があります。そのため、既存の型と実態は同じだが独自の意味合いを持たせたい(実態としては数値だが特別な意味を持たせたい、というような場合)にこういう型定義によって別の型をつくることになります。この場合、Abs()というメソッドはMyFloatという型に対してついているのであって、float64に対して呼ぶことはできません。
つまり、float64MyFloatはほんとうに別な型なのです。たとえば上のコードサンプルでreturn fとすることはできません。Abs()が返すべきのはfloat64だからです。MyFloatfloat64は加減乗除等の演算も行えません。事前に型変換を行う必要があります。

たしか『入門OCaml』だったかとおもいますが、会計処理的なシステムで、消費税込みの金額とまだ税を組み入れてない金額が両方あるので混乱しがちになるという話が出てきて、phantom typeを導入して型安全を保つという事例があったとおもいます。同じことがGoのtype宣言では可能です。

この挙動は面白いし便利だと思う一方、C/C++のtypedefを知っていると、とても奇妙に思えます。C/C++のtypedefは簡単に言うと型に別名をつけるだけだからです。typedef float MyFloat、などと書いてもMyFloatfloatは区別されません。floatを引数に取るメソッドにMyFloatを与えても構いません。C/C++を使っている場合、これはこれで便利なものです。

ここでC/C++のtypedef相当の言語とGoのtype相当の言語を両方併せ持つ言語といえば、そう、皆さんご存知のHaskellですね(やっと出せた)。Haskellでいうとtype宣言がC/C++のtypedefであり、Goのtypeに相当するのはnewtype宣言だと言うことができるでしょう。
Haskellのnewtype宣言というのは、実態としては他の型と同等であるが、全く別の新しい型として定義したい、という場合に使います。たとえばA Gentle Introduction to Haskellでは、Integerと実態は同じであるが正数のみを扱うNatural型を定義しています(日本語訳)。Goのtypeはまさにこれと同じことをします。Natural型に対して定義したメソッドがIntegerに影響を与えないところも同じです。

ところで、Goにはtypedefはありません。既存の型に別名をつけることはできません。例えば上でVertexという構造体が出てきました。ここで、type Vertex2 Vertex などとしても、*Vertexに対して宣言されたAbs()メソッドは、*Vertex2型の変数にたいして呼ぶことはできません。
不便じゃないんでしょうか。そもそもtypedefってなぜ必要なんでしょうか。

Haskellのtype宣言は、既存の型に別名をつけるという意味で、まさにtypedefです。実例としても、String型は実際のところ文字のリスト[Char]型である、という代表例もあります。これはまさに同じであって、String型の値はリストとして扱うことができます。リストを引数に取る関数はすべてStringを扱うことができるし、パターンマッチもできます。これがnewtypeとして別の型になってしまうと、Haskellのリストを扱うためのパワーをスポイルしかねません。いっぽう、Stateモナドは、実態としてはただの関数だけども、newtype宣言でState型として宣言されています。こういうものはHaskellではtype宣言では扱いづらいし、ややこしい問題もありますが、newtype宣言によって状況はかなりクリアになります。
ようするに、「メソッドは引き継がれない」「別の型として扱われる」という点がメリットになるかデメリットになるか、というのがnewtypeを使うか、typeを使うかの違いになっているといえるでしょう。

Go言語では、どうして他の型のエイリアスを作らなくても問題にならないのでしょうか。たとえば、
var f1 MyFloat = MyFloat(1)
var f2 float64 = 1.0
f1 + f2
などとするとコンパイルエラーが発生します。f1f2は異なる型なので演算はできません。実際、上で挙げた例のように、税抜の金額型と税込の金額型を別の型として宣言している場合、この2つの型の変数同士を気軽に足せてしまったら分けた意味が薄れるので困る。f1 + MyFloat(f2)などとしなければならないわけです。

ところが、
var f1 MyFloat = MyFloat(1)
f1 + 1.0
これはエラーになりません。
Go言語には暗黙の型変換はないのだけど、数値リテラルは特定の型の値を持つわけではなく、文脈によって適切な数値型となり、実態として数値の型であるモノ(MyFloatとか)も数値型とみなされます。演算子もまた、数値型に対して有効であるという定義であり、オーバーロードや再定義ができません。このように演算子やリテラルを特別処理にすることで、暗黙の型変換なしに、異なる型であっても、こういうよくある表記では問題を起こさないようになっています。

また、メソッドについてはどうでしょうか。HaskellのString[Char]と同等なのはリストに対するオペレーションを使いたいからだと思います。ただ、Go言語のメソッドや関数では、多くの場合インタフェースが一致しているかどうかだけが大事で、継承関係を必ずしも持つ必要がありません。このため、既存の型と構文上も同等に扱いたいというモチベーションがそれほど高くないのではないか、と推測しています。
Go言語を設計するにあたり、どれぐらい慎重にこういったことが決められたのかはぼくは知らないのですが、こういった事例からは、「こうしておけば実用上問題ないでしょ」という思い切りのようなものがあるな、と思うのです。
実際のところ Haskell にしたって type 宣言を書くことはそう多くない気がします。なくてもかまわないといえばかまわない、Stringだけがうまくいけばそれで良い、そういうヤツなのではないでしょうか。だが、既存の言語の枠組みで「String[Char]のように扱う」ためには、type宣言のようなものを持ち出すか、さもなくばStringを特別扱いしなければなりません。特別扱いはイヤだ、言語の定義で直交性を保ちたい、という美的センスがあるのではないかと思うのです。

直交性というのはプログラミング言語の「美しさ」を語る上では大事なキーワードだと思うのですが、Go言語では、そこまで最重要なポイントとみなされていないんじゃないかという疑念を抱いています。もちろん軽視しているのではないでしょうが、「大事だけどほかに重視すべきことがある」という価値観があるように思います。
でもそれでいいじゃん、動くし実用上は問題ない、といえるのがGoの面白いところだなと思った、というところで締めたいと思います。

2012-04-17

mosh (mobile shell)の論文を読んでみた


mosh: MITからモバイル時代のSSH代替品という記事を読んでmoshというモノの存在を知りました。で、USENIXに採録予定の論文があるというのでそれも読んでみました。

moshでは、作者が独自に設計したSSP (State Synchronization Protocol)というトランスポート層の独自プロトコルを使っています。SSPというのは大雑把に言うと、下層にUDPを想定して、状態を送り合うというプロトコルのようです。
ターミナルのようなアプリケーションの場合、クライアントにせよサーバにせよ知りたいのは最新の状態であってそれ以外はドロップしてしまっても問題はない。そこで、UDPの1データグラムに収まる範囲で状態を送り合うということを想定しています。コネクションを張らないことで、クライアント側は途中でいきなりIPアドレスが変わっても問題が起きない、というのが「モバイル時代の」という触れ込みの所以です。
暗号化と認証についてはSSHに乗っかるようです。まずクライアントはサーバにSSHで接続します。するとサーバ側ではふつうにユーザプログラムとしてmoshサーバが起動し、ランダムな暗号鍵を生成してクライアントに送ります。クライアントがこれを受け取ったらSSHのコネクションは切断しても大丈夫で、あとは各パケットをこの共通の暗号鍵で暗号化します(nonceも使うので、リプレイ攻撃の問題はありません)。

moshのもうひとつの特徴がlocal echoです。ふつうのリモートシェルではキー入力はサーバに送られ、サーバからエコーバックが返されて初めて表示されるわけなのでどうしても遅延が発生します。moshではローカルの側で一時的にエコーを表示しておいて、予測通りだったらそのまま確定させる、といったことをします。このため入力のフィードバックがすぐ得られるという利点があります。
もっともこれは大きな問題もあって、sudoしたりとかvi使ったりとかすると余計な文字が出てきてしまう。そこで状態を予測してlocal echoしたいときだけする、みたいなことが書いてあります。しかし論文には出しちゃいけない状態だということがわかったらすみやかに消す、みたいなことしか書いてない気も……。コードを見ても、たんにRTTとかをみて充分に高速だったら表示しないだけな気も。あまり良くわかりません。sudoのパスワードは見えそうな気がしますが……。
なんとなく直感的には、状態をlocal echoあり、なし、不定の3状態にしておいてありのときだけlocal echoする、改行等で状態を不定に戻す、不定からはサーバのエコーバックを見てありに遷移、といった単純なものでも充分マシな気もしますが、毎回微妙な遅延があるのが嫌だったんでしょうか。

この論文はしかし、以上に書かれていない、全体の4分の1ほどの内容がなかなか味わい深いのです。moshというのはようするに仮想端末の再実装なので、仮想端末のめんどくさいところにいろいろ遭遇してしまった、そういう苦労話みたいな話があるのですね。たとえば、

  • ISO-2022は状態があるのに、状態を戻さない壊れたファイルをcatしたりすると端末が文字化けして回復できなくなるんだぜ!
  • UTF-8も表示できるようにしたぜ! ところでECMA-48にはそういう話は記載がないのだが(略)
  • CJK文字って倍幅なんだよな! しかも行末に半分だけ余白がある場合は(略)
  • ローカルとサーバでlocaleが違うばあいに(略)
  • そもそもどうやってlocaleを指定するかというと(略)
……などなど。
論文本体よりは個人的にはこの辺の苦労話が味わい深く感じられる論文でした。そういうところはあんまりまっとうな論文という気はしないけど(USENIXにはありそうだけど)、片手間に読む分にはなかなか面白いのでみなさんもぜひ読んでみてください。

2012-03-31

BBCのテレビドラマ『シャーロック』第二期を見た

昨年夏にNHKでも放映された、イギリスBBCのテレビドラマ『シャーロック』。シャーロック・ホームズの物語を、舞台を現代に置き換えて翻案したドラマで、評判になりました。本国では実は第二期がこの冬に放映されていて、もうDVDは出ていたので見てみました。

設定は同じで、ストーリーも第一期の直接の続編。ただ、ワトソンの書くブログは趣味的な側面が強くなっていき、ホームズの活躍を伝えるものとなっています。そしてブログによってホームズの存在も話題になり、ネット世代のプチ有名人みたいな扱いに。
画面のつくり、とくにシャーロックの推理シーンのかっこ良さは第一期そのままなので、そのままの続編として楽しめる作りで、おすすめです。第二期も第一期と同じく、1話90分で全3話。ひとつのエピソードで90分は長い気がするのですが相変わらずスピーディな展開。またハイスピードカメラを使った映像など凝った画面がとてもカッコイイ。

第1話 A Scandal in Belgravia
原典の「ボヘミアの醜聞」 (A Scandal in Bohemia) をベースにしたエピソード。アイリーン・アドラーが登場してシャーロックと丁丁発止のやりとりを繰り広げるサスペンス+淡いロマンス。シャーロックはアイリーン・アドラーのもつ機密を奪回することになるが、アイリーン・アドラーはシャーロックとも渡り合えるほどの切れ者で、シャーロックとは惹かれ合うようになる……。
タイトルのBelgraviaはロンドン中心部の高級住宅街のことだそうです。

第2話 The Hounds of Baskerville
『バスカヴィル家の犬』 (The Hounds of the Baskervilles)をベースにしたエピソード。タイトルのわずかな違いからもわかるように、このエピソードではバスカヴィルというのは家名ではなく地名。バスカヴィルという場所に軍の研究施設があり、周辺では恐ろしい魔犬のうわさが流れていた。軍研究施設から脱走した強化犬だというもっぱらのうわさだが……?
途中の推理シーンは今期の白眉ともいうべきシーンでしょう。カッコイイ! 岩石の上に立ち、周囲を見渡すシーンもカッコイイ。

第3話 The Reichenbach Fall
タイトルのライヘンバッハの滝といえばスイスにある滝ですが、ここはもちろん原典ではモリアーティ教授とホームズが対決し、墜死したことで有名(生きてたけど)。そういうわけで前期に引き続き、モリアーティとの直接対決のエピソードです。モリアーティはどうやってかロンドン塔、イングランド銀行、ペントンビル刑務所の警備システムを破り、自身もロンドン塔にある王冠の強奪を敢行。急行した警察によって取り押さえられ、モリアーティの裁判が始まる。モリアーティはいったい何を目論んでいるのか? そしてシャーロックは?
冒頭からワトソンが My best friend, Sherlock Holmes, is dead. と言うところから始まる本エピソードですが、いったい物語がどう進み、結末はいったいどうなるのか、本当に死んでしまうのか? ところでこのタイトル、直接的にはもちろんライヘンバッハの滝のことですが、いくつかの意味が込められています。

ということで、おすすめです。NHKでもまた放映するんじゃないのかなー。しないのかなぁ。

2012-03-26

ブルース・シュナイアー "Liars and Outliers"

忙しくて文章を書く暇があまりなかったが、ブルース・シュナイアーの新作 Liars and Outliers: Enabling the Trust that Society Needs to Thrive を読み終えていた。
本書は "Beyond Fear" (邦訳:『セキュリティはなぜやぶられたのか』)の続編に当たる本だと思う。シュナイアー先生がふたたび、社会を相手に自らの知見を述べるといった体裁の本だ(実際には、この間に書かれた他の本を読んでないので、もうちょっと流れがあるのかもしれないが)。
"Beyond Fear"では、9.11以降のアメリカ社会、とくに空港のセキュリティチェックが厳しくなってきた現実を踏まえ、それがいかに形骸化して効果をもたらさなくなっているかを指摘していた。そして、セキュリティというのはプロセスであり、常に人の手で運営され、見直される必要があることを提言していた。
この本は、そのもっと前提部分に立つ。社会がなぜ、どのように成り立っているのか、セキュリティはその中でどういう地位を占めるのか。
本はこういうシーンから始まる。まさに今日、見知らぬ人間が家の前に来て水漏れを直しに来たと伝える。著者はその人のIDを確認することもなく家に招き入れ、その人物もまた、ふつうに修理をする。修理が終わればお金を払う。家のものを盗もうともしないし、家主も勝手に奪ったり、支払いを拒否したりしない。そんなことがあるだろうと気に病むことすらない。
なぜか。それは信頼があるからだ。その水道工との信頼関係ではない。なんせその人とは初めて会ったところだ。でも社会への信頼がある。互いに同じ社会に属し、その行動規範に則っているという信頼がある。

これがこの本のテーマである。
たとえば囚人のジレンマという問題がある。二人の容疑者がいる。互いに別々の部屋に入れられ、相手を告発するかどうか持ちかけられる。互いに黙秘していれば、1年間投獄される。相手が黙秘して自分が告発すれば、自分は釈放されて相手は10年間の投獄をされる。両方ともが告発すれば、両者とも6年の刑に課せられる。
このとき、相手がもし黙秘しているのだとすれば、自分は黙秘をしていれば投獄され、告発すれば釈放される。もし相手が告発をするのだとすると、やはり告発したほうが自分の刑期は短くなる。したがって、どんな場合でも告発するのが合理的となる。
ここでシュナイアーがユニークなのは、いわゆる繰り返し囚人のジレンマ問題に持ち込まなかったところだと思う。よくある「しっぺがえし戦略」はここでは扱わない。囚人のジレンマの問題を1回だけ行うとして、どうなるだろう。
実際の問題で似たようなシチュエーションを考慮すると、そうするのが合理的であっても告発してばかりの殺伐とした状況にはならない。なぜか。僕たちはどうやって信頼を構築するのだろう。
というのがこの本のテーマである。
以降、様々なシチュエーションを考慮しながらいかにして社会的な圧力(societal pressure)が構築され、人々にとって協調的に行動することが合理的になるか、ということを示していく。倫理観、評判、社会システム。そしてセキュリティはそれらの仕組みを支えるためのテクノロジーとしてのみ存在する。
だが、社会の仕組みとしていかにうまく協調的な行動を導こうとしても、完全にはうまく行かないことも強調する。嘘つき(Liar)や例外(Outlier)は必ず存在してゼロには決してできない。むしろ、ゼロは目指すべきではない。それを目指すことで不必要な社会圧力や仕組みが生まれ、社会は高いコストを払い続け、失敗に追い込まれるのだ。

シュナイアーが"Beyond Fear"を書いたのは、9.11への反動ともいうべきアメリカ社会の反応に感じるところがあったからだろう。基本的に本書の姿勢もそこに立脚しているようで、多少は9.11に関係するポイントもある(だが、その扱いは注意深い)。いずれにせよ、日本人の読者としてはやはり震災後の原発をめぐる議論について思わざるをえない面もある。
久々の力作ということもあって、たぶんこの本もすぐに邦訳が出ると思う。そのときにでも是非読んでみて欲しい。
おすすめ。

2012-02-07

EPUBが論文出版のデファクトスタンダードになる日は来るか

で、一つ前のエントリでも書いたようにKindleはわりと愛用するようになったのですが、不満な点もあって、論文。論文が読みづらい。

KindleにはPDFの表示機能が組み込まれてはいるのですが、なにせ画面が小さいので、もともとA4(やレターサイズ)で表示されることを前提にしている論文だと文字が相当小さくなってしまう。ましてや2-columnの論文となるともう無理って感じです。またページ繰りもじゃっかん遅い。ユーザエクスペリエンスがまずい。拡大して読む、ということもできないし。
シリーズの中でもKindleDXだけは比較的大きいので論文とかも読みやすいのでは、という考えに基づいて私も買ったことがあるのですが、これも間違ってたなあというのが正直なところ。上に挙げた文句のうち、「画面が小さいので読みづらい」という問題が若干緩和されているだけで、ユーザエクスペリエンスがよくないといった話は全然解決していないのですね。
一方、携帯電話やタブレットで読むという選択肢もちょっとないな、と思っています。これも前のエントリに書きましたが、Kindleに慣れてしまうと、E-Inkの読みやすさというのを実感します。それに、特に携帯電話で、ページの一箇所を拡大表示で読むというのも読みやすいのかなぁというのが若干疑問だったり……。

というわけで掲題の話を、ちょっと前から思っているわけです。そもそも論文をPDFで配布する必然性って、ないよね? EPUBとかのほうがいいんじゃないのかなあ?

PDFというフォーマットが悪いということは全然ないのだけど、PDFは「紙」とか「ページ」とかいった概念に強く依拠するフォーマットだということは言えます。だから紙に印刷して読むならとてもいいんです。いっぽう、昨今の電子書籍フォーマットでは、もはやページという概念すらなくなっている。たとえばAmazonの「なか見検索」でも、Kindle版の場合は上下になめらかにスクロールするUIになっちゃっているわけです。
そしてこの、ページという概念がないというのがキモでして、デバイスごとに違う文字サイズで表示できるし(ユーザも文字サイズをカスタマイズできるし)、デバイスごとに一画面分の文字数(単語数)がかわるということもありうる。だからどのデバイスでも読みやすいように読める。
ま、ようは、紙で印刷して読むならPDFも優れていますが、紙を使わないなら電子書籍デバイス向けのフォーマットというものがあり、そちらを使うといろいろ捗るぞ、というやつではないかと思うわけです。

でも実際問題としてどうなの、という面はあると思います。電子書籍デバイスは現状、相当の趣味人でないと持っていないものなのは確かなので、そういう人向けに頑張るというのも何かおかしい気がします。いちおうEPUBをパソコンなどで読めるソフトもありますが、電子書籍デバイスを持ってない人はそれで頑張れ、というのもいかがなものか、という気もします。だめなら印刷する、というのもありだとは思いますが、EPUBのデータを紙に印刷してPDFの品質に勝てるのか、というのは疑問です(っていうかやったことないからわからないのですが……)。
一方で、巨大な学会のproceedingsなど、昨今もはや紙に印刷するほうが珍しいのではないかという気もします。PDFの入ったデータを全員に渡しておしまいで、後日に一部だけ選んでエルゼビアから出版される、というパターンもおなじみなのではないでしょうか。私はだいぶ長いこと学会とかには行ってませんが、私が学生時代だった当時でさえ、分厚いproceedingsは定番の「忘れ物」でした。CDなりなんなりで電子データのみを配布する、というのは一般的でした。今ではそれがむしろ普通でしょう。
とすると、紙に印刷することを前提にしたPDFというフォーマットの利点は、実はそれほど大きくないのではないかという気もするのですが、どうですかね……。

技術的な話としては、latex2epubというのはとっくの昔に作られています。もちろんクオリティはわからないけど、latex2htmlはもともとあったわけですから、同程度のクオリティを目指すのは不可能ではないのかなと。となると、大学の先生におかれては、ぜひ、PDFとあわせてEPUB形式でも公開してほしいなあ、と思っているところではあるのです。もっとも、latex2htmlで論文をhtml化して公開しているのも相当の「趣味人」だけでしたから、こういう草の根運動は実を結びそうもないのかも……。
この話を同僚と話していたら、「TeXやDVIから変換したPDFはパターンがあるから、PDFからEPUBに変換できるんじゃないか」というアイディアも出ました。それはクールかもしれません。それでもいいなあ。うーむ。

いずれにせよ、学術出版の世界で電子書籍というのはもっと注目されたり実験されたりしてもおかしくないのになあ、とは思います。私のあずかり知らぬところで、きっと色々進んでいるのだろうな、と期待しつつ、様子を見ている外野の私なのでした。

2012-02-03

電子書籍強化月間のまとめ

電子書籍で生活をするという30day challengeが完了したので、まとめます。

チャレンジの概要
スタート時にこちらにまとめました。紙の本を一切読まず、それに充てていた時間を電子書籍に使うというものです。まんがや雑誌も「紙の本」に含まれる、また紙で売られた本をスキャン(いわゆる自炊)したものは電子書籍には含まない、といったレギュレーションを課しました。ちなみに所有している電子書籍デバイスはAmazon Kindleのみです。Androidデバイスは持っているので、それをサポートする環境はいちおう使えるのですが、E-Ink以外で読むのは抵抗感があり、使っていません。

読んだ本
実態はどうだったか?
読書時間は平日はあまり多く取ることができておらず、これもこれでなんとかしないといけないなあと思うわけですが、この辺の改善は行わないまま、今回のチャレンジを始めてしまいました。結果的に読書時間はそれほどかわらず、大して分量を読めないままだったという現状認識が、まずあります。
とはいえ、リストしてみると意外と冊数があります。私は普段の読書量だと、月間で4-5冊といったところだったと思うので、一見するとそれよりは多いですね。とはいえ、日本語の本はどれもかなり短いものが多いので、あまりたくさん読めたという気がしません。英語の本はさすがに読むスピードも遅いし。長編は実質的には1冊、Charles Yuの本しか読んでない。Kelly LinkのPretty Monstersは短篇集、F&SF誌も中編が6本とか入っているので分量もあり、短編はちょっと体力を使うというのを実感しました。

まんがについては、余力があればウェブ雑誌を探してみたりしてもいいかなと思ったのですが、他の本だけでも十分に読むものは多かったので、けっきょく挑戦に至りませんでした。単行本も買っていません。ただし、単行本については前提として、電子書籍は刊行から数ヶ月遅れてやってくることが多い、という事情もあるような気がします。興味のあるまんがはだいたい新刊で買っているので……。

感想と今後
30day challengeは、二通りのパターンがあると思います。第一には生活スタイルを変えるというパターン。毎日自転車で会社に通う生活をしてみる、というチャレンジですね。こういうチャレンジの場合、期待される効果としては、生活スタイルが変わり、今後も毎日ではないにせよ自転車出勤生活を続ける、というものになります。
一方で、30日で小説を書き上げる、みたいに、新しいことを挑戦してみるだけでその後も続けるとも限らないタイプのチャレンジもあるとおもいます。この場合は、ひとつ何かを成し遂げるというものですね。
今回の件についてはその辺の認識が中途半端なまま始めてしまったという反省点があります。とりあえずお試しで電子書籍に注力してみたものの、今後も電子書籍のみの生活ができるかというと、まあできないだろうなと思いながら始めていたのです。かといって、何かを成し遂げるというようなタイプのものでもないし。

しかし、ひとまずのところ、電子書籍のみでの生活というのはどうかというと、なくはない、といったところだと思いました。とくに英語で本を読むならほぼ支障はないと思いました(新刊が即Kindle化されるとも限らないし、すべてがKindle化されるわけでもないので、今後の電子書籍ライフではそのへんも気に掛かるところですが)。一方、和書はまだバリエーションが少ないため、完全移行は難しいと言わざるを得ないと思いました。したがって、翻訳書から徐々に電子書籍に移行していくという当初の想定通りの流れになりそうな気がします。
問題はむしろ、紙の書籍と電子書籍のバランスをどうするか、という点にあります。正直わたしも紙の本という物体への愛着は薄い方なので、紙の本は可能な限り回避したいという意識があります。またそれは今回のチャレンジでかなりはっきりしてきました。今所持している本の処分を進め、また新しく購入するのは控えめになるのではないか、と思っています。

ただ問題はまんがでして、まんがはそれ以外の書籍よりはるかに権利関係が厳しく、電子書籍化があまり期待できません(確かに、下手に弱い制限で販売して一番海賊版などが出回りやすいのはまんがだろう、という悲しい現実は理解できます)。スキャンも明白に禁止している出版社や作家が多いので、こうなるとなるべく買わないか、買っても読んだら捨てるというオプションを取るしかなくなってしまっています。まんがとどうつきあうか、というのはもう少し様子を見て考えたいと思っています。

紙の本のスキャンについて
ところで、自分で紙の本を買ってスキャンするのは、過渡期の技術としてアリかなあと思っていたのですが、なんというか、わりとどうでもいいような気がしてきました。自宅に累積した本には何らかの手段で電子化してでも保存したいものがあるため、スキャン自体は、ある程度は継続をするつもりです。ですが、持っている本の大部分は処分しても問題ない気がしますし、新しい本を買って電子化して読むというのはあまり私の生活スタイルには合わないと思いました。
スキャンした本というのは、ようするにページの画像データのことですが、電子書籍デバイスで読むのはあまりおすすめできるユーザ体験ではないと思います(Kindleの画像表示能力がそんなに高くないという個別事情もあります。解像度の調整をしないと相当読みづらい)。紙の本として購入したものを、あえて労力を費やして電子化してから読むというのはメリットが薄いと思いました。そのまま紙の本として読むほうがなんぼかよろしい。まあ、分厚い本であれば、持ち歩きやすいという利点があるかな、とは思いますが……。
とはいえ、上でも書いたように、今ここにある本の山のうち、いくらかを電子化して保存するという行為については否定的ではありません。後から参照し、必要な箇所だけ読むという面では、電子化することの利点もそれなりにありそうです。ただ現状、縦書きの書籍のOCRの精度は全然よくないものが多い気がするので、本によっては「後から検索したい」という欲求は満たしづらい場合もあります。

電子書籍デバイスについて
上にも書いたように、今回は電子書籍デバイスとしてはAmazon Kindleのみを所持という状態でスタートしました。チャレンジをはじめる前に事前調査をもっとすべきだったとあとで思いましたが、現在の日本の電子書籍サイトでKindleというのはまったく役に立たないデバイスとなっています。基本的にはSony Reader、PC向けにWindows、タブレットならiOS、という環境のサポートが主になっていて、Kindle、Mac、Androidな私はまるで手がでない(笑)。AndroidやMacのサポートはまれにあるのですが、品揃えの問題と、発光する画面で本を読むというのはちょっとありえないという考えから、まったく頼むことはありませんでした。上に挙げた日本語の本は、どれもEPub形式で購入しています。もっともKindleはEPubも表示できないので、Calibreで変換しています。
Kindle自体は私はとても好きなデバイスなのですが、実際問題として日本でもKindleが支配的であるべきだとも思いません。楽天が買収したKoboが日本に来るという話もあり、これもこれで期待しているところです。結局のところ品揃えの多寡で決まる面が大きいと思うので、いい品揃えであればデバイスには強いこだわりは、私には今のところないのです。
ただやはり、E-Inkは必須だと思いました。発光するデバイスで本を読むのは正直しんどいです。またKindleは圧倒的に軽い、という利点もあります。実際、私もいっときAndroidタブレットを入手したときにはKindle終わったな、と思ったのですが実態は全く逆でした。重量には大きな意味があります。軽くて読みやすい、という利点を他のデバイスがどう乗り越えるか、というのが要点だなと思っています。

2012-01-27

コンテキストスイッチ力

最近、社内で関わるプロジェクトが移り、当然と言えば当然だが生産性が低下している。ついでに、長いビルドの暇な時間に、プログラマの生産性ってなんだろうな、ってなことをぼんやり考えたりしている。
スーパーエンジニアは凡百なエンジニアの数十倍とか数百倍という生産性があるという。数十倍かはわからないけど確かにものすごく生産性の高いエンジニアというのはいる。いるのだけど、何故彼らは生産性が高いのか。っていうか、そもそも生産性、ってなんだろう。

一般的にプログラマの生産性というとコーディングスキルだと思われている気がする。だけど、それだけなんだろうか。そりゃ優れたコードを書くのは才能だし、スピードも才能で、ぼくにはそんなものはない。ただ、言語も開発環境も大同小異なプロジェクトのメンバー同士でも、かなり生産性には差がある。この差がコーディング能力だけでつくとはとても思えない。

高林さんの文章で、プログラマの生産性についての考察があった。いちいちうなずくこと然り。レスポンスが異常に速いとか、フットワークが軽いとか、終わらせるとか……。と読みながら、ひとつ付け加えることがあるとすれば "コンテキストスイッチ力" があるんじゃないかと思った。コンテキストスイッチのコストが低い人は総じて生産性が高い。

プログラマの仕事というのは、意外と待ちの時間があるものだ。ビルドに費やしている時間、データをダウンロードしたりアップロードしたりする時間。解析プログラムが巨大なデータを処理している待ち時間。レビューやメールの返事待ち。その他もろもろ。
そういう細かい空き時間をどう使うかというのは生産性に大きく寄与している。複数の作業を効率良く並列に進められるか。関連するコードを読んでみたり、論文に軽く目を通してみたり、メールの処理時間に使ったりもできる。
私はコンテキストスイッチのコストが高めなので、ビルドのログが流れていくのを眺めながら、比較的どうでもいいこと(プログラマの生産性ってなんなのか、みたいなこと)をあれこれ考えたりしてしまう。
ビルド中にメールでも書こうか、とメールの画面に移って、書いていたら意外と手間取ってしまって送信してほっと一息ついたら実はとっくの昔にビルドが終わってて、本当はその後にテストを実行させないといけなかったのだが……みたいなあるあるネタを実際にやっちまったりして。……あるよね?

コンテキストスイッチのコストはどうやったら下げられるのだろう。

そんなことが分かっていたら、こんな文章を書いているはずがないので(笑)、私にもよくわからない。だがひとつ仮説として考えているのは、自分の作業フローを見通す能力なのではないかということだ。今からメールの返事を書くのにどれぐらいの時間がかかるのか。ビルドはどれぐらいの時間で終わって、その間にできることは何か。作業時間の予測とか、比較的短いスパンで何ができて何をどの順番でやるか、というのを把握していれば、テンポよく作業を進めることもできる。
レスポンスが速いというのもそういうことだ。メールやチャットで連絡が来たときにプライオリティ付けがきちんとできないと、連絡したのにいつまでも返信ができない。逆に、チャットで相談に乗っていてひととおり解決したところでさっきまで何をしてたっけ……とならずにすぐ復帰できる人は生産性が高いし、自分はすぐ復帰できるからこそ連絡にきめ細かく対応できる。
また、こういう知識や優先順位づけは一般化しづらく、プロジェクトやチームによっても往々にして変わるから、プロジェクトが変わると生産性がいったん落ちたりするのだと思う。

プログラマの界隈ではよく「フローに入る」という表現がある。それがどういう意味なのか正確に把握している自信はないけど、少なくともコンテキストスイッチをよしとしないということだ。人間、コンテキストスイッチのコストは決してゼロにはならないので、それを減らして作業に集中するというのもひとつの作戦だ。だけど、それが全てでもないのでは、と思う今日この頃。
たぶんきっと、このへんはプロジェクトの性質にも関わっている。ビルドにどれぐらいの時間がかかり、テストの実行やレビューや各種のプロセスがどうであるか、というのにもよる。個人プロジェクトに近いものほどフローが重視され、大きなプロジェクトではコンテキストスイッチは避けられないものとして対峙する必要があるのかも。

いずれにしても、コードを書くパワーだけが生産性ではない。だけど何しろコードを書いて生活しているように思っているので、そこを頑張ってしまいがちなのではないか、とちょっと思っている今日この頃です。