tommy_0’s blog

自己紹介

SQL を書くときに意識していること

この記事は?

普段 SQL を書くときに意識していることを整理してみた(業務では分析クエリを書くことが多い)。

具体的な SQL の説明、How to 的な内容は載せていない(一部具体例として載せている)。

本記事の内容は、以下の本を読んで自分なりに整理したものなので、気になる方はぜひ!

前提知識として押さえておくこと

メンタルモデルを認識する

まずメンタルモデル(基本的な考え方の枠組み)について認識する必要がある。

SQL は「集合指向」という考え方に基づいて設計された言語。一方で、多くのエンジニアが最初に学ぶのは手続き型言語

最初に学んだ言語の考え方がメンタルモデルとして固定され、それを通して世界を見るようになるため、無意識のうちに異なる考え方を持つ言語の理解を妨げてしまう。なので、既に身に付いている無意識のメンタルモデルを切り替えて、「集合指向」という考え方を習得していく必要がある。

以降、既存のメンタルモデルが手続き型言語によって構築されているものとして、両者を比較する形で説明していく。

還元論全体論のイメージを掴む

メンタルモデルの違いについて、少し抽象的な表現で説明する(個人的にはとてもしっくり来たので)。

手続き型言語の発想は「還元論的」と言える。

全体を分解して捉える。複雑で理解困難な対象も、具体的な要素に分解して単純化すれば理解できるという考え方。

具体的に言えば、

  • 代入・分岐・ループという基本的な処理単位に分割していく
  • 大量データをレコードという小さな単位に分割して扱うファイルシステム

一方で、SQL の発想は「全体論的」と言える。

全体を全体として捉える。体系とそれを構成する要素は、部分の集合としてではなく、全体として捉えるべきだという考え方。

手続き型言語の特徴と比較すると、

  • SQL には代入やループなどの手続きは現われない
  • データもレコードではなく、もっと複合的な集合の単位として扱う

還元論全体論について補足しておく。これら考え方はどちらが正しいというものではなく、適材適所で使っていくことが大切だと理解している。還元論に基づいて、分解した具体的な要素をすべて理解しても、対象の全体を理解できるとは限らない。全体を要素に分解する・要素を全体に再構築するときに、「重要ではない」と考えられた要素は切り捨てられているかもしれない(本当に「重要ではない」ことは保証されていない)。その部分を見落とさないよう、全体論に基づいて、体系とそれを構成する要素を、部分の集合としてではなく、全体として捉えてみる。この辺りの話はこの記事にまとまっているので気になっている方はぜひ(このブログためになる)。

基礎理論を押さえる

SQLRDB を支える基礎理論は大きく 2 つあり、SQL はそれぞれの側面を併せ持つ。

  • 数学の一分野である集合論
  • 現代論理学の標準的な体系である述語論理

つまり、全てを集合と関数でやろうとするのが SQLの発想と言える。

ちなみに、手続き型言語における処理は、SQL で以下の機能を使って表現できる。

  • 分岐
    • CASE 式
  • ループ
    • 相関サブクエリ(ループクエリ)
    • window 関数
    • GROUP BY 句(集合演算)

なので、一見手続き的にしか解けないと思うような問題も SQL に落とし込むことができる。

以降、「集合指向」「関数指向」それぞれの側面で具体的なポイントを並べる。

集合指向としての側面

テーブルは集合である

処理単位を「行」ではなく「(行の)集合」として記述する。

SQL は集合操作の機能が充実しているため、手続き型言語であればループや分岐を使って記述する複雑な処理を、非常に簡単で見通し良く記述することができる。

例えば、以下テーブルについて、歯抜けデータを探すことを考える。

SeqTbl テーブル

seq name
1 ichiro
2 ziro
4 siro

仮にこのテーブルがファイルで、手続き型言語を使って調べるなら、次のような手順になる。

  1. 連番の昇順か降順にソートする
  2. ソートキーの昇順(または降順)にループさせて、1 行ずつ次の行と seq 列の値を比較する

この単純な手順の中にも、手続き型言語ファイルシステムの特徴が浮き彫りになっている。ファイルのレコードは順序を持ち、それを扱うためにプログラミング言語はソートを行なう。

代わりに SQL は、複数行をひとまとめにして集合として扱う(テーブル全体を 1 つの 集合 と見なす)

-- 欠番があれば'歯抜けあり'を返す
SELECT
  '歯抜けあり' AS gap
FROM
  SeqTbl
HAVING COUNT(*) <> MAX(seq) - MIN(seq) + 1
;

このクエリを集合論の言葉で表現すると、自然数の集合(歯抜けのない連番)と SeqTbl 集合(SeqTbl に実際に含まれている行数)の間に 一対一対応(全単射)が存在するかどうかをテストしている、ということになる。

閉包性を意識する

テーブルはただの集合ではなく、閉包性を持っている。

閉包性は、端的に言うと「演算子の入力と出力が共にテーブルになる(テーブルの世界が閉じていることを保証する)」という性質のこと。

SELECT 句は、テーブルを引数にとってテーブルを返す関数として捉えられ、サブクエリやビュー利用の前提になっている。

他にも閉包性の例として、UNIX のファイル・シェルコマンドが挙げられる。UNIX は、デバイスからコンソールまで全て「ファイル」として扱っている(プリンターやディスプレイのような物理的なデバイスも、/dev ディレクトリの下にある普通のファイルのように見える)。これらファイルが、様々なコマンドに対して入力・出力になることで、UNIX のシェルプログラミングに高い柔軟性を与えている(例. cat test.txt | sort +1 | more)。

また、テーブルの閉包性は、代数構造のうち「体」の条件もクリアしているため、「自由に四則演算が可能な集合」と考えることが可能(和の射影や制限の差等が行える)。数学的に厳密な基礎付けを持つことで、集合論群論など、すでに多くの実績の積み重ねがある分野の成果を援用している。

四角を描くな、円を描け

集合指向を身に付ける近道として、入れ子集合をイメージする(データを集合の観点から把握する)ことが 1 つの鍵になる。

  • GROUP BY・PARTITION BY 句によって、テーブルを部分集合に切り分ける
  • HAVING 句によって、集合単位の条件を設定する(WHERE 句と違って、集合そのものに対する条件を設定できる!)

それらを的確に表わす視覚図は、「ベン図」つまり「円」になる。

手続き型言語においての視覚的なツール(構造図や DFD 等)では、手続きが箱(四角)・データの流れが矢印で表現されるが、この伝統的な道具は SQL には不向き。

ベン図のイメージ

関数指向としての側面

処理の分岐は「式」で行う

手続き型言語では、処理の分岐は「文」の単位で行なうが、SQL では「式」の単位で行う。

具体的には、IF 文や CASE 文は、CASE 式で置き換える。

CASE 式は、最終的に 1 つの値に定まるために、他の式や関数の引数に取ることもできる。

一階述語論理の導入

SQL のEXISTS 述語が一階の存在までしか引数に取れないため、SQL が採用している述語論理は「一階述語論理」になる。

RDB における存在の階層は以下になる。

  • 0 階:行
  • 一階:テーブル(行集合)
  • 二階:テーブルの集合

述語論理において「複数の対象を一つの入力として扱う道具」である「量化子」「全称量化子」は、SQL では前者を EXISTS、後者を NOT EXISTS を使って表現する。

特性関数と組み合わせる

特性関数とは、各要素(行)が特定の条件を満たす集合に含まれるかどうかを決める関数のこと(集合を定義するという意味で定義関数と呼ぶ)。

例えば、条件を満たす行については 1・そうでない行については 0 を返す CASE 式 は、「ある行が条件を満たすかどうかを判別する関数」を作っていると言える。

CASE 式による特性関数と HAVING句 組み合わせることで、集合の性質を詳細に調べることができる。

例えば、以下テーブルについて、女子の平均点が男子の平均点より高いクラスを探すことを考える。

TestResults

student_id class sex score
1 A 70
2 A 100
3 A 50
4 B 100
5 B 50
6 C 100
7 C 50
-- 男子と女子の平均点を比較するクエリ:その2 空集合に対する平均をNULLで返す
-- B,C クラスは比較対象が存在しないため対象外になる
SELECT class
FROM TestResults
GROUP BY class
HAVING
  AVG(CASE WHEN sex = '' THEN score ELSE NULL END) < AVG(CASE WHEN sex = '' THEN score ELSE NULL END);

FROM 句から書く

上記までの内容を意識した上で、自分が SQL を書く際に必ず実践していることが一つある。

それは、SQL の実行順序に沿って、FROM 句から書くこと。

具体的には、FROM → WHERE → GROUP BY → HAVING → SELECT(→ ORDER BY) の順番で書いていく。

複雑な SQL を書く場合、いきなり SELECT 句から書くより、実行順序に沿って FROM 句から書いたほうが自然にロジックを追える。SELECT 句がやっているのは、表示用に見た目を整形したり、計算列を算出することであり、より重要な WHERE、GROUP BY、HAVING から考えていく。

SQL のメンタルモデルが養成されていれば、FROM 句から書いていくことで、集合を操作している過程がイメージできると思う。

思考イメージ

終わりに

自分は、言語的にも利便性からも SQL が好き。

SQL的な観点から考えることを学ぶことは、多くのプログラマにとって1つの飛躍である。きっとあなた方の多くは、そのキャリアの大半を手続き型のコードを書いて過ごしてきたことだろう。そしてある日突然、非‐手続き型のコードに取り組まねばならなくなる。そこで肝心なのは、順序から集合へ思考パターンを変えることだ。 J.セルコ
達人に学ぶSQL徹底指南書 第2版 初級者で終わりたくないあなたへ 19章より

サピア=ウォーフの仮説 的なことを体感していて、それも新しい発見だった。

全てが一致しての現在にいる、ということ

結論

……ほんの少し…だったと思う
どこかでほんの少し…
何かがほんの少し違っただけで
今の余ならば、神とまでは言わぬが…この世を…
…いや、全てが一致しての現在だからこそそう思うだけなのかも知れぬ

HUNTER×HUNTER 314話 説得 より)

日常と不満

日常を過ごしていると、現状に対して何かしら不満を感じることがある。その現状に繋がる過去に対する不満、いわゆる「たられば」も含まれる。

それぞれ置かれている立場が異なるので具体の内容は異なるけれど、一貫しているのは、それらが起こるのは「現状と理想にギャップがある」ということ。

最近この「現状と理想の認識」についてふと思うことがあったので書き残しておく。

認識の変遷

結論を言ってしまうと「現状と理想の認識は変遷していくものであって、その結果として起こる不満は、ポジティブに捉えることができるかもしれない」ということ。

もう少し具体的に言うと、例えば成長した結果、以前は認識できなかった問題(不満の言い換え)を認識できるようになって、ついついその問題に囚われがちだけど、その問題を認識できるようになった「成長」そのものを喜ぶことはできるよね、ということ。

問題解決

問題は終わりなく続いていくけれど、その中で自己肯定する機会はあって、その機会を捉えることは、結果として問題解決に繋がっていくと思う。なぜなら、その自己肯定は自然と時間軸を意識することに繋がり、その結果、問題に対してより適切な対応を取れるから。

「気が付いたら、あの時の自分よりもかなり成長できているなあ」
「あの時の自分はことの大切さを認識できていなかったなあ」
「どういうことが積み重なって今に繋がっているんだろう」

現状(不安・問題と言い換えてもいい)を「点」で捉えると、その内実を見落とすかもしれない。そうではなくて、「線」「面」「立体」と次元を上げるイメージで、視野を拡げて問題に向き合いたい。

なぜなら、大抵の問題は単純な因果関係ではなく、もっと複合的な要因によって起きていると思うから。

終わりに

冒頭のセリフを読んで感じたことを勢いで書いたので、後で読んだらあれな感じになるかもしれない。

Gem 作る時のざっくりとした流れ

基本的なところを

Git リモートリポジトリの作成

gem パッケージを公開する際に必要となるので

Gem 雛型の作成

# -b: 実行ファイル(exe/gem_name)を作る
# -t: テストファイルを作る(ライブラリは別途指定)
bundle gem gem_name -b -t rspec

Gem の実装

以下を踏まえて後は良しなに

  • gemspec ファイルの編集
    • TODO コメントがあるとビルドできない
  • version.rb の編集
    • Gem のバージョンを上げる際は

ローカル環境で検証

ビルド & インストール

bundle exec rake install

動作確認

require '[Gem 名]'

# 何かテスト...

リリース

Git リモートリポジトリに反映

# 予め git remote add している想定
git push origin main

Gem の公開

# 予め rubygems.org のアカウント登録・ローカルに API キーの用意が済んでいる想定
bundle exec rake release

全てが「(生命がある、あるいは生命がないに関わらず)それ自身の明確な存在を持つと感知される、知られている、あるいは推定される何か」になる

前置き

昔「すべてがFになる」というドラマありましたね(観ていないんですが、この記事のタイトルを書いていてふと思い出しました)。

記事のタイトル長いですよね(多分今までで最長だと思います)

全てが「(生命がある、あるいは生命がないに関わらず)それ自身の明確な存在を持つと感知される、知られている、あるいは推定される何か」になる

日本語 Wordnet

特に「」内の内容が謎だと思うのですが、これは何かと言うと「日本語 Wordnet」の内容です。

bond-lab.github.io

公式サイトから抜粋すると、

日本語ワードネットは日本語の概念辞書です。個々の概念はそれぞれ「synset」という単位にまとめられており、それらが他のsynsetと意味的に結びついています。 ... 日本語ワードネットに収録されたsynset数や単語数、語義数は次のとおりです。

57,238 概念 (synset数) 93,834 words 語 158058 語義 (synsetと単語のペア) 135,692 定義文 48,276 例文

こちらで検索してみるとよりわかりやすいと思います。

検索結果の Relations に概念の関係性が書かれていて、例えば、Hypernyms(上位語)はより一般的な概念を表し、Hyponyms(下位語)はより具体的な概念を表します。

具体的な例を挙げると、「犬」という語は「動物」の下位語ですが、「動物」という語は「犬」の上位語といった感じです。

他にも様々な Relations があり、それらがまとめられている辞書になっています。

データ自体が古いから言い回しが古かったり、最近のトレンドは反映されていないです。ただ、一度は使ったことあると思う「英和和英辞典」の内部でも使われているようです。

階層関係を可視化する Gem を作った

今回、この「日本語 Wordnet」を作って、上位語・下位語の階層関係を可視化する Gem を作ってみました。

github.com

もしよかったら、手元にインストールして遊んでみて(Gem を知らない人が簡単に試せるように、Web サービスでも作るかな)

例えば、「サウナ」で可視化すると、

キーワードによっては、結構複雑な図になって面白い。

タイトル回収

試した範囲だと、全ての(最上の上位語)が「(生命がある、あるいは生命がないに関わらず)それ自身の明確な存在を持つと感知される、知られている、あるいは推定される何か」になりました。

恐らくこのノードが始祖的な存在になっているんでしょうね。

それにしても中々言い回しがすごい(分かったような分からないよう)

自分はこういうグラフを眺めるのが好きで、↑に気づいたので勢いで記事にしました笑では

インサイド・ヘッド 2 観てきた

 

ネタバレ避けたい方はそっ閉じで

 

 

インサイド・ヘッド 2、結論言うと良かった

www.disney.co.jp

 

1 は観ていないので、既存キャラクターを把握するところから

基本的な流れとしては、ある感情がパネルを操作すると、主人公に思考や行動にその感情に応じた影響を与えるというもの

この映画を観てまず思ったのは、前提として鑑賞者に「感情をキャラクターとして扱うこと」を受け入れさせていて、それは感情をメタ認知するきっかけになると思うのでとても良いなと

 

ストーリーとしては、主人公が思春期になって新たな感情が生まれて…という内容で、いくつか印象に残ってるシーンをメモしておく

ちなみにセリフは記憶で書いてるので、こんなこと言ってたくらいに思ってもらえたら

 

前半でヨロコビがパネル操作してやらかして、シンパイに司令塔の座を奪われるという流れはテンポよくて良かった(?)そういう構図の話なのねというのがすっと入ってきて、この後どうなるんだろと興味をそそられた

 

ずっとテンション高いヨロコビが唯一キレるシーンがあって、「ずっとポジティブでいることがどんなに大変かわかる?」というセリフが確かになーと

その後、自分の置かれている状況(司令塔から追い出されて路頭に迷っている)は成長に伴う仕方のないものと落ち込んでいるところを、仲間から「ヨロコビがないと生きていけない」と言われて立ち上がる流れは良かった

 

ストーリーの中で割と重要だと思ったのが、主人公が幼少期に好きだったアニメ?のキャラクターの存在

このキャラクターがいくつかピンチを乗り越えるために必須な役割になっていて、こういうある種のあそび的な存在は重要というメッセージなのかなと思ったりした

演出的にもこのキャラクターだけ鑑賞者に語りかけてくるシーンがあって、何か意図があるんだろうな

 

シンパイが暴走してコントロールが効かなくなって涙するシーンも良かった

シンパイの「ごめんなさい、主人公のためを思って」というところで泣いてしまった

基本的にシンパイはいつも焦っているキャラクターで、誰しもパネル操作されていたなーと思うことあるのでは

こういうストーリーがヒット(多分)してること自体が、何かある種の救いになってる気がする

 

ここまで書いたように作品が良かったこともあってエンドロールも見入っていた

社会人になってそれなりに経っているので、こんなに多くの人が関わってるんだよなーとしみじみ思いながら

 

一日の終わりにキャラクターが短期記憶を長期記憶にする的な作業を、綺麗な演出を通してやっていたのをふと思い出す

 

今日は早く寝よう

REALFORCE R3 を買った

REALFORCE R3 に一目惚れした

元々使っていたのは、Magic Keyboard。キーボード自体はセパレートキーボードを使ってみたり色々試してきたけど、Mac を使っていたこともあって↑に落ち着いた感じ。

もう数年になるけど最近になって、作業が終わった後に指が疲れているなと感じることが増えてきて(気になり出すとキーを押すことにストレスを感じるようになる)、もっと楽にキーを押せたらいいなと。ネットで調べるだけでなく、実際にキーを押してみて、ちゃんと気に入ったものを買いたいなと思っていたところ、以下の記事が目に止まる。

note.com

試し打ちが出来るお店として紹介されている「ビックカメラ池袋本店(パソコン館)」に行ってきた。記事に書かれている通り、多分50近くのキーボードの試し打ちができる(すごい)。

試し打ちした結果、決めたのは「REALFORCE R3(30g)」。端から順番に試し打ちしていて、このキーボードを試した時に衝撃が走った。キーを押した時に脳内で何か快感物質が出ているような感覚があった笑。

実際に買ったのは、

機能説明は公式がわかりやすい(静電容量無接点方式というワードに惹かれてしまう笑)。ちなみに、自分は45gよりも30gの方が好みだった(元々より楽にキーを押したかったし)。ただ、今だと 30g は Windows 用キーボードしかない(ここの不便さは後で触れる)。

REALFORCE CONNECT を使おう

Windows 用キーボードをそのまま Mac で使うのは不便過ぎるので(日本語・英語の切り替えできない)、キーマップを設定したい。

公式のカスタマイズ用ソフトウェアが提供されている。

www.realforce.co.jp

↑を使うことで、キーマップの設定を行うことができる。設定はキーボード本体のオンボードモリーに保存されるので、一度設定してしまえば他デバイスでも有効になる(便利)。ちなみに、他にも機能提供されていて、キーを打つ時の感触を微調整できる「APC」や、打ったキーを確認できる「ヒートマップ」などがある。

www.itmedia.co.jp

study.comgate.jp

ちなみに、↑を利用する場合は、キーボードを Bluetooth ではなく USB 接続する必要がある。思ったよりも USB 接続するまでに時間がかかった。いくつか USB Type-C変換アダプタ(AnkerやELECOM)を試みたが認識されず。Apple 純正品で試してみると認識された(ちゃんと書かれている)。それでも接続されない場合は、この辺りも確認するといい。

Windows 用キーボードのつらみ

↑の設定を行うことで、最低限(日本語・英語の切り替えとか)は何とかなるけど、それでも記号の一部入力がキー表記と異なっている。例えば、”@” を入力しようとすると”[”が出力される。”@” を入力するためには、Shift+2 を押す必要がある。設定で ”@” キーに「Shift+2 結果」を割り当てることはできるけど、そうなると ”@” キーは Shift が効かなくなってしまう。そもそも「入力したい記号を出力するキーがわからない」「Shift 有無の結果がキー表記と異なる」については、設定できない?と思われる。

なので、設定を一通り完了しても、キー表記と異なる箇所がいくつかあって打ち間違えたり、そもそもこの記号は入力できないという、状態になっている(これはこれで結構ストレスになっている笑)。

まとめ

REALFORCE R3 を使い始めて、当初のキーを押した時のストレスはなくなって、もはや押すことが気持ちいい。

カスタマイズ用ソフトウェアで、キーマップ設定などができるので、最低限(個人の感想)使う分には問題ないと思う。

それでも Windows 用キーボードを Mac で使っているため、キー入力に不便を感じている(何かいい方法があったら教えて欲しい 🙏)

問題に名前を付けよう

日常は問題の連続。仕事でもプライベートでも様々な問題がある。その際にきっと役立つのが今回紹介する本。きっかけは、昔の上司に勧められて(まさに本書の内容を実践している問題解決の上手い方だったな)

本書でも触れられているように、本書の内容を理解できてもそれを実践できるわけではない(何でもそうか)。つまり、何度も失敗して立ち返ってを繰り返す必要があって、そのためには簡単に見返せるように整理しておきたい。というわけで整理した。

マインド

ノウハウどうこうの前に大切なマインドについて、訳者前書きに書かれていたので、印象に残っている部分を抜粋した。

... 訳者は世慣れない方で、ここに書いてあるようなことでしょっちゅう失敗する。この本を訳したいと思い続け、深読みを繰り返したお陰で、近ごろ少し失敗が少なくなったような気がしている。 本の副題にあるように、問題発見についての本である。学校では問題を解くことを教わる。だが問題は、解くより発見する方がずっとむずかしく、ずっと面白い。実人生で本当にものをいうのはそこなのだ。 ...

「だが問題は、解くより発見する方がずっとむずかしく、ずっと面白い。実人生で本当にものをいうのはそこなのだ。」という言葉、とても大切なことだと思う。

サマリー

ざっくり本書の要点を抜粋すると以下かなと。

  • まずは問題を定義しよう
    • 問題とは「認識と欲求の間のズレ」である
    • 「問題を抱えているのは誰ですか?」「あなたの問題の本質は何ですか?」を明らかにした上で言語化する
  • その上で、問題を解決しよう
    • 具体的には「認識と欲求の間のズレ」をなくす
    • 問題解決によって、今ある問題をより小さい問題に変えていく
  • 順応している状態を認識しよう
    • 自然と状態に順応していくと問題として認識できなくなる
    • 自分がある状態に順応していることを認識する

問題とは

普段生活していて、ふと「何か問題を抱えているなあ」と思うことは多々ある。自分が問題を抱えていることを漠然と感じるのは容易だが、「何が問題なのか」を明確にするのはその限りではない。

問題とは「認識と欲求の間のズレ」である。

認識と欲求の相違は至るところに存在する。一つも問題が思い当たらないように思えても、認識の感度を少し高めれば様々な問題が見つかる。例えば、「家の中が寒過ぎる」という認識に対して、「暖まりたい」という欲求が存在する(一定数の問題は感受性を下げることによって認識されなくなる)。

問題を定義する

ある種の訓練によって、最初に現れた「問題らしきもの」に飛びつくという習性を身に付けてしまっている。未熟な問題解決者は、解くべき問題を定義する前に、それらに飛びつき、急いで掘り下げ、苦い結末に辿り着く。経験を積んだ問題解決者であっても、社会的圧力にさらされると、この誘惑に負けてしまうことがある。解答はたくさん見つかるかもしれないが、それが解くべき問題の解答だという保証はない。問題があって初めて解答が存在する。解決方法を問題の定義と取り違えてはいけない。問題解決で急ぐことは間違いの元になるが、問題定義で急ぐことは厄災の元になる。

一方で、いつまでも何とか問題を定義しようとして堂々巡りしてしまい、問題定義は間違っているかもしれないが解答を出してみよう、という勇気が出ない状況は好ましくない。ここでのポイントは、ある問題を曖昧さを含まないただ一つの形に定義することではなく、問題について何かしらの共通理解を掲げることで、間違った問題に対する解答を出さないようにすること。そもそも問題の絶対的に正しい定義(究極の解答)は存在しない。大切なのは、その確信を持つための営みを継続していくことであり、その時点の前提を踏まえて都度問題定義していくこと。

具体的には、以下を明らかにした上で、問題を言語化する

  • 問題を抱えているのは誰ですか?
  • あなたの問題の本質は何ですか?

問題を抱えているのは誰ですか?

本書で紹介されている「エレベーター問題(簡単に言うとエレベーター待ちが多くて困る問題)」について考えると、即座にいくつか具体的な解決策が浮かぶ。ただ、その時に注意すべきは、無意識のうちに「エレベーター利用者の問題」として捉えていることである。仮に「ビル所有者の問題」として捉えてみるとまた解決策は異なってくる。

エレベーター問題において、誰の問題として捉えるかによって、少なくとも 3 つの問題として考えられる。

  • 労働者の問題として捉えるなら
    • エレベーターの待ち時間が長いことによる苛立ちを最小限にするにはどうしたらいいか
  • ビル所有者の問題として捉えるなら
    • 利用者からの苦情を解消するにはどうしたらいいか
  • 入居会社の関係者の問題として捉えるなら
    • 従業員からの労働結成の脅しを解消するにはどうしたらいいか

誰の問題として捉えるのか決める必要がある。

あなたの問題の本質は何ですか?

この問題はどこから来たか?を問う。

問題の原因を「自然」に委ねてしまうと、問題解決に関する手掛かりが掴めない。それは自然(本性/摂理/etc)なことだからどうしようもない、という気持ちに陥り、それ以上の検討が行われない。問題の原因を人やものに向けられれば、問題を解決したり軽減する方法を検討することができる。問題を自然の領域から引き出して、建設的な思考と行動に移すこと。

本書で紹介されている「ビザ問題(ビザに関する役人とのやり取りが上手くいかない問題)」において、問題を官僚主義のせいにしたい気持ちが働くのは自然なことだった。彼女は役人に慣れていなかったため、相手の不作法さからパニック状態に陥り、何もかも官僚主義のせいにしようとしていた。あれこれと思考を巡らして挑戦的な姿勢を取り、自分自身が問題の源泉となっていた。そのことに気付いた彼女は、自己開示を行い相手に礼節と敬意を持って接した結果、単に役人に複写してもらうという解決に到った。

問題を解決する

問題解決とは、「認識と欲求の間のズレ」をなくすことを指す。大抵の問題は、その問題が何であるのか分かれば、それを解決することは難しくない。

エレベーター問題について考えてみる。あるビルのエレベーターの待ち時間が長く、それに伴い様々な人々にとっての問題が起きている。仮にエレベーター利用者の問題として捉えると、認識とは「エレベーターの待ち時間が長い」ことになる。この相違を埋めるための方法として、「実際にエレベータの待ち時間を短くする」「時間を長いと認識させないよう暇潰し用コンテンツを用意する」などが考えられる。

様々な制約を取っ払って解決策を検討する。実現性や倫理的な問題があったとしても、それが思わぬ形で実現できるかもしれない。エレベータ問題では、後日談として、一見現実味のないと思われた解決案(「ビルを燃やして保険金を受け取る」「隣のビルからエレベーターの運行時間を盗む」)が、もしかしたら隣ビルとの連携で実現できたかもしれないことが分かる。ここでのポイントは、物事を柔軟に捉える姿勢を持つこと。

問題は認識と欲求の相違であるから、ある問題を解決してその状態を変えると、一つ以上の別の問題を発生させる。問題と解決、そして新しい問題は終わりのない連鎖を織り出している(決して問題を追い払うことはできない)。期待できるのは、解決した問題がより小さい問題に置き換えられること。ある問題について、その解決によってどのような問題が起きるか考えることで、よりその問題の理解を深めることができる。

状態に順応すること

ある状態に順応することによって、環境の中の不変部分が打ち消され、生活は単純化されていく。人が問題について考える時、順応したことは考慮から除外される。

そして、ある問題解決によって、順応した要素が変化して初めてその影響を把握する。医療が発達して老人の人口が増えるという副作用に驚くのは何故なのだろうか?

自分達が順応している状態、無意識に泳いでいる「水」を見ようと努力しなければならない。

まとめ

本書を読んでから気を付けていることがある。何か課題に取り組む時、自然とその事象に対して「〜問題」と名前を付けるようにしている。名前付けすることによって様々なメリットがあって、例えば、その事象をより自分事にできたり、また関係者間の共通言語となってコミュニケーションコストが下がったりする。人VS人という構図ではなく、人VS問題という姿勢で物事に取り組みたい。

また、ある状態に順応して問題が認識できなくなる話は、思い当たる節がある一方で、実際にどのように改善していくかは難しい。自分の解釈としては「慣れ」によって良い面もあれば悪い面もあるという話で、具体的には鈍感になっていく。日々の中で感じる「違和感」を曖昧なままにせず、言語化することをやっていこう。