Edited at

500ページ超えの新刊『わかりみSQL』を支える技術

500ページを超える新刊『わかりみSQL』を、技術書典7 (2019-09-22) で出します。

https://techbookfest.org/event/tbf07/circle/5702345325281280

SQL初心者はもちろんのこと、SQLに挫折した人こそ読んでもらいたい入門書になってます。

好評だった『オブジェクト指向言語 解体新書』のSQL版だと思えばだいだいあってます。)

新刊の紹介はこのくらいにして、この記事では「初心者向けの本を書く上で気をつけたこと」と「500ページ執筆を支えるキーボード」の話をします。


初心者向けの本を書く上で気をつけたこと

『わかりみSQL』では、自分が初心者のときに「こういうふうに教えてくれれば良かったのに‥‥」と感じたことをつぎ込んでいます。ある意味、怨念のカタマリみたいな本ですねw

「こういうふうに教えてくれれば良かったのに‥‥」とはどういうことか、紹介しますね。


過程の説明を省略しない

初めと終わりだけを説明されても、あるいは問題点と解決方法だけを説明されても、初心者には理解できません。途中の過程をちゃんと説明する必要があります。

たとえばデータベースでの多対多の説明は、たいていこんな図がありますよね。

そして交差テーブルを使えばこうなるんです:

これで多対多が実現できました。よかったよかった‥‥

ちっともよくないよ!これはまさに初め(問題点)と終わり(解決方法)だけの説明です。そうじゃなくて、交差テーブルに至るまでの過程が説明されないなら、それは理解じゃなくてただの暗記です。

『わかりみSQL』では初め(問題点)から終わり(解決方法)に至るまでの過程をちゃんと説明しています。

初めはこれね。

次がこれ。真ん中の線にラベルをつけてます。

その次がこれ。ラベルを実体化して「執筆」という名前を与えています。

そして「執筆」をテーブル化すれば終わり(解決方法)。

どうですか、これ。図を見ただけで「ああ、関連を表していた真ん中の線をテーブルにしたんだな」と初見でも分かりますよね。こういう途中の過程を省略せずに説明すれば誰でも理解できるはずです。

別の例を出しましょう。たとえばこういう「members」テーブルがあったとして:

 id  |   name   | height | gender

-----+----------+--------+--------
101 | エレン | 170 | M
102 | ミカサ | 170 | F
103 | アルミン | 163 | M
104 | ジャン | 175 | M
105 | サシャ | 168 | F
106 | コニー | 158 | M
(6 rows)

男女別の人数を集計するには、SQLではこうします。

select count(*)  as total

, sum(case m.gender
when 'M' then 1 else 0
end) as male
, sum(case m.gender
when 'F' then 1 else 0
end) as female
from members m;

実行結果(合計6人、男子4人、女子2人)

 total | male | female

-------+------+--------
6 | 4 | 2
(1 row)

これで確かに集計できるんですが…このSQLを見せられて理解できる初心者ってどのくらいいるんでしょうか?

そうではなくて、このSQLなら次のような途中の過程を挟むべきです。

select *

, case m.gender
when 'M' then 1 else 0
end as male
, case m.gender
when 'F' then 1 else 0
end as female
from members m;

実行結果(右側の1と0の列に注目):

 id  |   name   | height | gender | male | female

-----+----------+--------+--------+------+--------
101 | エレン | 170 | M | 1 | 0
102 | ミカサ | 170 | F | 0 | 1
103 | アルミン | 163 | M | 1 | 0
104 | ジャン | 175 | M | 1 | 0
105 | サシャ | 168 | F | 0 | 1
106 | コニー | 158 | M | 1 | 0
(6 rows)

この実行結果を見れば、「male列は男子のときだけ1であとは0」「female列は女子のときだけ1であとは0」ということがよく分かりますよね。

だからこそ、group by gender を使って sum(male)sum(female) とすれば男女別の人数が集計できることが簡単に理解できます。

でも教えてる側の人はほとんどが、めんどくさがってこの途中の過程を省略します。「ページ数が〜」とか「時間が〜」とかいろいろ理由をつけてるけど、結局は「めんどくさい」が本当の理由ではないでしょうか。

『わかりみSQL』は、途中の過程を省略しません(できる範囲で、ですが)。そのおかげで初心者でも読めば分かるような内容になっているし、ページ数のわりにスラスラと読めるのはこれのおかげです。

ただし代償として、ページ数がすごく増えます。500pにもなった最大の原因はこれです。途中の過程を省略しないで説明すると、ページ数はすごく増えます。集計用のSQLではこれが顕著で、集計結果は2行や3行なのに、集計前の過程を説明すると十数行やそれ以上が必要になります。そりゃページ数も増えるよね。

それでも「初心者が読んで理解できる」というメリットに比べれば、「ページ数が大きく増える」デメリットは大した問題ではないと考えています1


難しい用語を使わない

『わかりみSQL』は初心者向けの入門書なので、難しい用語はなるべく分かりやすい言葉で言い換えています。たとえば「昇順」や「降順」という用語を使わず、「IDの小さい順」「背の高い順」という言葉で説明しています。

「用語を説明するな」と言ってるわけじゃないです。『わかりみSQL』でも用語は説明しています。ただし、その用語を使わなくても説明に支障がないようであればその用語は本文では使わないようにし、脚注で説明するにとどめています。

「昇順」や「降順」はまさにその例です。「小さい順」「大きい順」で通じるのにわざわざ「昇順」「降順」を使う必要はないです。格調高い文章が書きたいなら別ですけど、『わかりみSQL』では格調高いことよりも初心者が読んで理解できることを目指しました。すでに説明されていた用語だとしても、慣れてない言葉が出るたびに初心者は読むのが止まるのだから、慣れている言葉で説明したほうがいいという方針です。

また一部では「IDの小さい順(昇順)」「背の高い順(降順)」のような併記をしています。初心者向けにしたい、でも用語もちゃんと覚えてほしいと思うなら、併記するのが落とし所でしょう。


必要な用語は何度も説明する

使わなくてもいい用語は使わずに説明しますが、説明に必要な用語は登場するたびに繰り返し説明します。

たとえば『わかりみSQL』では「主キー」という用語が出てきます。そのたびに「主キーとはテーブルの行を特定するための列や値のことです。詳しくは第X.X節(XXページ)を参照してください。」と脚注に書いています。これを3回4回と繰り返しています(なので『わかりみSQL』では脚注が多めです)。

初心者は、用語を説明されてもすぐに忘れます。慣れてない分野の用語なんてそんなものであり、たとえば料理ができない人は「ポン酢」と「味ポン」の違いを説明されても次の日には忘れてるし、おしゃれにまるで関心がなければ「FURLA」の読み方を教えてもらっても5分後には忘れてるのと同じです。なので初心者向けであれば、すでに説明した用語でも繰り返し説明し、詳しく説明したページを紹介すべきです。

このように初心者向けの本では一度説明した用語を何度も説明するほうがいいのですが‥‥アカデミア出身の人はこれを極端に嫌うんですよね。「この用語はすでに説明済みだからここでの説明は必要ない」「一度説明した用語を覚えてないならそれは読者が悪い」「用語が分からなければ索引で調べればよい」等々、頑なに説明の繰り返しを拒絶します。論文だったらそれでいいんでしょうけど、初心者向けのドキュメントは違うんだから考え方を変えてほしいのに、ほんと頭が硬いというか性格が頑なというか‥‥。自分とは違う世界の人に向けたドキュメントなんだから自分のルールを押し通すのほんと止めて‥‥。世界はあなたのような人ばかりじゃないのよ‥‥。

ハッ、いつの間にか話が脱線しました。このように『わかりみSQL』では大学のセンセイが書くような教科書とはまるで違う書き方をしていて、同じ説明の繰り返しになろうとそれが初心者にとって必要なら気にせず繰り返しています。このおかげで「用語が分からなくてページを戻る」という行為が少なくなり、ページ数が多いのにサクサクと読み進められます。


初心者のつまづきを観察する

初心者がどこでつまづくかは、上級者がいくら頭で考えても分からないです。初心者のつまづきポイントを知るには、初心者を観察するしかありません。優秀なデザイナーやマーケッターが一般ユーザを丁寧に観察するのと同じですね。

過去にSQLを初心者に教えた経験でいうと、たとえば「1対多」と「テーブル結合」が混ざると初心者は混乱するケースがありました。「1対多」は分かる、「テーブル結合」も分かる、でも両方が混ざると分からなくなるのです。

たとえば、これは映画とキャラクターが「1対多」であることを表す図です。初心者でもすんなり理解できます。

そしてこれが「1対多」であるはずのテーブルを結合した結果です。よく見てくださいね。

testdb1=> select movies.title, characters.name

testdb1-> from movies
testdb1-> join characters using (movie_id)
testdb1-> order by movies.movie_id
testdb1-> ;
title | name
------------------+----------
風の谷のナウシカ | ナウシカ
天空の城ラピュタ | パズー
天空の城ラピュタ | シータ
天空の城ラピュタ | ムスカ
となりのトトロ | さつき
となりのトトロ | メイ
(6 rows)

この結果を見ると、映画タイトルのほうが何度も現れてますよね。なので初心者は映画とキャラクターを「多対1」だと勘違いしてしまうんです!言われてみれば確かにそう見えます。

なので『わかりみSQL』では、上の図も下の結果も、どちらも「1対多」を表しているんだよ、と説明しています。初心者がつまづきやすいポイントを先回りして潰しているわけ。「そんなの勘違いするほうがおかしい、頭悪い」と言っちゃう上級者もいるけど、『わかりみSQL』は初心者の味方なので、せっせと落とし穴を埋める方向でがんばりました。


理由やメリットを説明する

算数や数学が嫌いな人は、みなさんが思っている以上に世の中には多いです。なぜ嫌いかというと、「分からないから」「面白くないから」という理由も挙げられますが、「何に役立つか分からないのに強制的に勉強させられたから」という理由が実に多いです。「将来役に立つんだからつべこべ言わず勉強しろ!」という人もいるけど、それは「将来役に立つんだから若い頃の苦労は買ってでもしろ!」という老害ブラック企業と同じですよね。

この解決方法は簡単で、「算数や数学が将来、何にどう役立つのか」を説明すればいいだけです。子供が納得できるような説明ができればよし、できなければ大人の負け。じゃないと「算数ができるよりサッカーできたほうがモテる」「数学できるよりバンドやったほうがモテる」と子供が考えても仕方ないです。

同じことはデータベースやプログラミングでも当然のようにあります。

エクセルがあるのになんでデータベースをやらなきゃいけないの?

この質問にちゃんと答えられる人がどれだけいるでしょうか。答えられたとしてもそれは初心者を納得させられる答えになってるでしょうか。そんな状態で「SQLを勉強しろ!」と叱りつける権利が先輩や上級者にあるのでしょうか。

『わかりみSQL』では第1章をまるごと割いて、データベースの特長をエクセルと比較しながら説明しています。なぜならここで「エクセルでいいじゃん」という考えを「データベースは重要なんだな」という考えに変えてもらわないと、そのあとの勉強が続かないからです。なにせSQLを実用的に使えるようになるには500ページでも足りませんからね2。学校の勉強ですらサボってた人にSQLを勉強してもらうには、きちんと理由やメリットを説明する必要があると思うのです。


入門書向けのレイアウトを採用する

本屋さんにいって何らかの入門書を読んでみると、次のような特徴に気づきます。


  • 入門書はフォントサイズが大きめで、A5サイズだと10ptか11ptです。
    中級者向けの本だとフォントサイズが9pt、オライリーだと8ptの本もあります(8ptはさすがにちょっと見づらい)。

  • 入門書の多くがセクションごとに改ページしています。
    たしかにこのほうが、セクションが変わったことがよく分かります。

なので『わかりみSQL』でもフォントサイズを10ptにし、セクションごとに改ページしています。いつもは中級者向けの内容なので、A5サイズで9pt、1行あたり39〜40文字というスタイルにするのですが、『わかりみSQL』は入門書なのでA5サイズで10pt、1行あたり36文字にしました。たしかにこのほうが読みやすいですね。初心者が紙面から受ける圧迫感が減っています。

『わかりみSQL』はレイアウトでも初心者に優しいことを目指しました。


まとめ:初心者と向き合う覚悟

初心者向けのSQL入門書『わかりみSQL』を書くときに気をつけたことを紹介しました。ポイントはいくつかありますが、結局のところ初心者と向き合う覚悟があるかどうかじゃないでしょうか。初心者が読んで理解できない入門書ってたくさんあるんですけど、それは著者の人が初心者と向き合う覚悟がなくて説明をめんどくさがっていることが大きいと思います。

初心者向けの本を書くなら初心者と向き合う覚悟をしましょう。


反省点

新刊『わかりみSQL』は自分が初心者だったころの経験と、初心者にSQLを教えた過去の経験をもとに執筆しました。けど本当なら、新刊を何人かのSQL初心者に読んでもらってわかりづらい点を探るべきでした。最初はその予定だったのにページ数が膨れ上がってそんな時間がとれなかったのが大きな反省点です。その点で言えばこの新刊もまだまだ覚悟が足りなかったですね。はい、すいません。

ただし今回は質のよいレビュアーを1人お願いできました。ページ数が多すぎて全部のレビューはとても無理でしたが、質のよいレビュアーにいくらか見てもらえただけも幸運でした。ありがとうございます。


500ページの執筆を支えるキーボード

さて、ここからはガラッと話が変わって、キーボードの話になります。500ページの執筆を支えたのはどんなキーボードでしょうか。


エレコム TK-FCM103BK

HHKBやRealForceや自作を期待してた人にはガッカリでしょうが、500ページのうち大半はエレコムの安物キーボードで執筆しました。

このキーボードは最近(2019年2月)に発売されて以来、安物キーボード界で称賛され続けている一品です。安物キーボードの決定版と言っていいでしょう。


  • 打鍵の感触がよい(柔らかすぎず硬すぎず)。安物メンブレンとは思えない。

  • キー配列が普通。変な個性を出そうとしていない。

  • テンキーレスである。でもカーソルキーはついてる。

  • 安い。とにかく安い。量販店では税込で1200円もしない。

安いというのは重要です。キーボードの良し悪しが分からないうちに2万も3万もつぎ込むのはリスクが高すぎます。まずは安物で様子を見て、それから高級キーボードに移行するパスが望ましいです。

またこれだけ安いと、会社用と家用で2つ買っても懐がまったく痛くないです。家庭内財務大臣に稟議書を通す必要もないでしょう。右手用と左手用に2つ買って分離キーボードとして使うのもアリです。同じことをHHKB Proでやると4万や5万はするでしょう3

もちろん欠点もあります。


  • 初期不良が多い。安物だから仕方ないけど、初期不良率はかなり高いと覚悟すべし。

  • 「無変換」と「変換」のキー幅が小さい。スペースキーを少し狭くして、その分をこの2つのキー幅に割り当ててほしい。前モデルはそうなっていたのになぜ変えたのだ。

  • 本体の剛体性が弱く、わりと簡単にねじれる。ねじれるとキーボードが安定せず、キー入力のたびに本体がガタガタ揺れる。なので自分でねじり直す必要がある。

  • キートップの印字がすぐ薄くなる。安物だから仕方ないけど、薄くなるくらいなら最初から文字色をグレーにして欲しかった(白だと薄くなったことが目立つ)。

欠点もありますが、それでもこの安さでこの打感なら満足度は高いです。95点をつけましょう。


エレコム TK-G01UKBK

茶軸のキーボードも使ってました。茶軸が何かは説明しないので各自で調べてね。

メカニカルキーボードなのに6千円くらいだったので、試しに買ってみました。茶軸はいいね。黒軸は重すぎ、赤軸は軽すぎ、青軸はうるさすぎ、茶軸こそ全方位にバランスのとれたメカニカル軸。

でも茶軸は少し重かったです。使い始めて1週間で左手小指が痛くなりました。長時間の執筆には向かない。でも赤軸は軽すぎる(中華赤軸を使った経験アリ)。赤軸と茶軸の中間が求められる。その点、荷重を変えられるLibertouchや複数の荷重が設定されているRealForceはうらやましい。


富士通 FKB-312、FKB-8724、SK-5400

富士通のキーボードも使ってました。なんとPS/2接続!

なんでこんな古いキーボードを?と思うでしょうが、昔の富士通のキーボードは質がとても良かったんですよ。特にWindowsキーがついていない頃のキーボードは、コストダウンの波がやってくる前だったので打鍵の感触がほんと良かった(これは富士通に限りません)。FKB-312なんてキートップをなでたくなるような絶妙な感触でした。また昔のキーボードは無変換キーと変換キーが狭くなく、かつ親指で押しやすい位置にあり、ベストでした4

上のうち3つ目のSK-5400はコストダウンの波にもまれたあとの製品なので、上の2つほどには良くないです(そもそも別の会社のOEMらしいとも聞くし)。ところがキーボードを分解してラジコン用のグリスを塗ると、別物のように生まれ変わるのです!

これにはほんとビックリしました。富士通のキーボードがすごいというよりタミヤのグリスがすごいというべきですか。グリスを塗るだけで安物キーボードが見違えるような打感になるのだから、タミヤすごい。

とはいえ、PS/2接続はさすがに不便です。エレコムTK-FCM103BKを買ってからは完全に乗り換えました。今までありがとう、富士通高見澤コンポーネント。富士通は嫌いだけど君のことは一生忘れない。


SKY配列

物理キーボードも大事ですが、日本語入力配列も同じように大事です。今はSKY配列を大幅にカスタマイズしたものを使っています。

親指シフトも試したことがあるのですが、同時打鍵がどうしてもうまくできなくて入力間違いばかりしてしまい、入力速度が向上しそうになかったので止めました。親指シフターにお話しを聞いてみたいところです。

SKY配列は、ローマ字配列のキーマップを変更すれば導入できる点がよかったです。「ことえり」はそんな機能がないのですが、かわせみ2にローマ字配列を変えられる機能があるので使ってました。その後、Google日本語入力でもできることが分かったので、今はこれを使っています。

使ってみた感想ですが、ローマ字入力と比べてSKY配列のほうが入力が速くなる、ということはないです。あったとしても大きな差ではないでしょう。それよりも、長時間入力しても疲れにくいのがSKY配列の長所です。500ページの執筆をするなら、1分間でいかにたくさん入力するかよりも長時間疲れずに入力できるほうが大事ですからね。短距離走よりも持久走を求めるならSKY配列はいい選択だと思います。

それでも親指シフトはもう一度チャレンジしてみたい。音声入力も試したい。工夫の余地はまだまだあります。

(もしお勧めのキー配列あったらコメントで教えてね。)


まとめ

エレコムTK-FCM103BKはイイゾ。量販店で探すならTK-FCM103XBKだから間違うなよ。

500ページ書くなら、入力速度よりも入力を長時間継続できるほうが大事だぞ。


余談

初心者向けの入門書を書くなら(初心者向けじゃなくても)、文章の書き方を一度勉強しましょう。

技術書典7では、よりよい文章を書くための同人誌が出るようです。買いたいけど店番が‥‥

技術書典6でも2冊でていましたね。どっちも買えました。

一般書籍だと数多く出ています。技術系同人誌界隈では結城浩先生の本を推す人が多いです。もちろん他の本でもいいでしょう。

それから、文章と同じように大事なのが、説明図!図の書き方を説明した本はあまり見かけません。技術書典5では専門家が参戦してくれて貴重な同人誌を残してくれました。

一般書籍だと開米瑞浩氏の一連の著作が良かったです。

余談のつもりが長くなった‥‥。まあこれはこれで。他にもお勧めの本があればコメントで紹介してください。


余談その2

初めて技術系同人誌を書く人は「Re:VIEW Starter」を使ってみてください。

見た目がきれいなPDFが生成できます。

また表紙の作り方はこちらの記事が参考になるでしょう。





  1. 印刷費用は問題だけどね!新刊の値段どうしよう… 



  2. 『わかりみSQL』では、まえがきに書いてますがテーブル設計やパフォーマンス・チューニングの話はしません。正規化とか実行計画の読み方は説明してないです。なのでデータベースやSQLを本当にマスターするには500ページじゃまだ足りないのです。正直、終わりのない世界。 



  3. やってる人いますけどね。 



  4. 最近はスペースキーが長くて変換キーの位置が押しにくくなった製品が多いので困ってます。新しいRealForce、お前のことだよ!