こまぶろ

技術のこととか仕事のこととか。

『エリック・エヴァンスのドメイン駆動設計』におけるリレーショナルデータベース

近頃、以下に挙げるようなイベントで話を聞いたり議論をしたりする中で、オブジェクト指向とリレーショナルモデルについて思いを巡らせている。

今回は、その中間報告として、『エリック・エヴァンスのドメイン駆動設計』におけるリレーショナルデータベース*1について考えたことを一度まとめておく。

永続化ストアとしてのリレーショナルデータベース

ドメイン駆動設計の原典である『エリック・エヴァンスのドメイン駆動設計』(2004年)において、リレーショナルデータベースは主要な永続化ストアの地位を占めている。

第6章「ドメインオブジェクトのライフサイクル」において、ライフサイクルの中期にあるドメインオブジェクトの格納先/再構成に関わる要素としてリポジトリが紹介される。リポジトリは、何らかの永続化ストアとのやりとりを担うドメインオブジェクトである。このやりとりの相手、つまりライフサイクル中期にあるオブジェクトの永続化先として、エヴァンスは複数の種類の永続化ストアを挙げている。しかし書籍において、永続化ストアのなかでもリレーショナルデータベースは特別に手厚い言及を受けている。

リレーショナルデータベースにオブジェクトを格納する際に考慮すべき事柄として、エヴァンスは以下のように述べている。

・データベース*2をオブジェクトの格納先として見る場合には、マッピングツールの能力に関わらず、データモデルとオブジェクトモデルをかけ離れたものにしてはならない。関係モデルと近づけておくため、オブジェクトの関係性が持つ豊かさを若干犠牲にすること。オブジェクトとのマッピングを単純化するのに役立つなら、正規化のような、関係モデルが持つ正式な標準に関して、ある程度は妥協すること。
・オブジェクトシステムの外部にあるプロセスからは、そうしたオブジェクトの格納先にアクセスしてはならない。オブジェクトが強制する不変条件に違反する可能性があるからだ。また、そうしたアクセスがあるとデータモデルが固定化されてしまい、オブジェクトをリファクタリングする際に、変更するのが難しくなる。*3

上記の引用箇所のうち、前半部分ではオブジェクトモデルとリレーショナルモデルの双方を妥協させるべきであるということが述べられている。マッピングツールが優秀であれば、永続化ストア上の形式とアプリケーション上の形式とが乖離していても技術的には困らないが、エヴァンスは複数のモデルの分離を強く警戒して、モデリングをなるべく近づけるように提唱している。

リレーショナルデータベースもまた、モデルが表現されるべき場所なのであり、オブジェクトに一方的に譲るような関係性ではない。オブジェクトの表現力を最大限活用することよりも、モデルの統一性を重視しているという事実は、ドメイン駆動設計の何たるかを考える上でも重要ではないだろうか。

「不変条件の強制」という役割の担い手

一方、後半部分では、オブジェクトが(リレーションには与えられない)特別な役割を担わされている。それは、「不変条件の強制」である。不変条件の強制は、オブジェクト(とりわけ集約)が担うものであって、リレーショナルデータベースに期待されているのは格納したオブジェクトを外部から守ることである。

データが満たすべき一定の条件の記述は、必ずしもオブジェクトの専売特許ではない。リレーショナルデータベースにおいても、CHECK制約や参照整合性制約など、さまざな制約を記述することができる。実際のRDBMS製品においてはあまりサポートされていないが、複数のテーブルをまたいだかなり複雑な制約も関係演算を利用して記述できるASSERTION(表明)というものも標準SQLには存在している。

リレーショナルデータベースの機能として、データベースの主要な機能である検索と蓄積に対応した2点、すなわち、

  • 集合演算によるリレーションの導出(検索)
  • ディスクへの書き込みによる永続化(蓄積)

に加えて、3番目のものとして、

  • 各種制約によるデータの整合性の確保

挙げるのは不当ではないと思うが、その役割はドメイン駆動設計においてはリレーショナルデータベースにはあまり期待されていないのである。

業務のルールの一部である不変条件を、オブジェクトが表現するというのは、ドメイン駆動設計にとっては重要な事柄だろう。リレーショナルデータベースに不変条件の強制を担わせるのは、「ドメイン知識の流出」につながる。業務ロジックとしてのチェックに加えてクライアントのUIでの入力チェックを行うことが否定されないのと同様に、重畳的にリレーショナルデータベース側でも不変条件を強制することは許されるだろうが、リレーショナルデータベースでしか表現されない業務ルールの存在は忌避の対象であろう。

DOMAINやASSERTIONが広くサポートされていたとしても、リレーショナルデータベースはドメイン知識を表現する場所になれたかどうかはわからない。しかし、リレーショナルデータベースにおける制約は宣言的に記述されるものであるから、大きなポテンシャルを持っているもののように思えてならない。

 コッド博士は、冗長性を制約ととらえて、それを満たしている状態を、一貫性がある状態と定義する。こうした定義は若干狭いように思う。例えば部品表では、完成品の親部品は存在してはならないという制約がある筈だが、これは冗長性とは関係が無い。冗長性と制約はイコールではないと思う。
 一方で、データに関する制約を(手続き的にではなく)宣言的に記述するというアイデアは先進的だったし、40年以上経った現在でも部分的にしか実現されていない。*4

おわりに

だいぶまとまってきたつもりだったのだが、いざ文章を書き出してみるとまだまだ理解が足りないことを感じる。記事になりそうなネタは育ってきてはいるので、連休中にあと1、2本くらい書きたいと思う。

*1:リレーショナルモデルとリレーショナルデータベースの区別を明晰に語るには時期が早いと感じたので、以下ではリレーショナルデータベースを議論の対象とする。

*2:この引用箇所は「関係データベースに合わせてオブジェクトを設計する」という項目の一部であるから、データベースとはリレーショナルデータベースのことを指しているとみて間違いないだろう。

*3:『エリック・エヴァンスのドメイン駆動設計』160ページ。強調は引用者。

*4:Coddの1970年論文、"A Relational Model of Data for Large Shared Data Banks"に対する杉本啓さんによる訳注より。

関連テーブルへの操作と、ドメイン駆動設計における集約・リポジトリ

ドメイン駆動設計を意識しながら設計をしている*1ときに、関連テーブルの操作に関して悩んでいたことがあった。人に相談に乗ってもらい、自分でも改めて書籍などを見ながら考え直したところ、自分の集約への理解が全く不十分であったことがわかった。

TL;DR

問い:

ある集約への変更のために、関連テーブルへの操作を実体のテーブルへの操作と別に提供したくなったらどうする?

回答:

集約の単位とは独立に提供したくなるのは集約をちゃんと考えられていないからかもしれないので考え直そう。

前提

「部署」と「社員」という2つの実体*2の間に、「所属」という多対多の関連が存在しているとする。部署は部員として複数の社員を持つことができる一方で、社員は所属先として複数の部署を持つことができる(つまり、兼部を許す)。「所属」を連関エンティティとすることで、以下のようなデータベース設計になっているとする。

このようなデータの保存形式をとっている部署に対する、以下のようなユースケースをサポートしたい。DB上のデータ操作も併せて記載する。

部署への操作 操作対象テーブル データ操作
名称を変更する 部署テーブル UPDATE 部署名カラムを更新する
新たな社員を配属する 所属テーブル INSERT 新たなレコードを追加する

問い:

以上の操作を提供するために、データベースアクセス手段をどのように提供するべきなのか。

悩みと相談

集約の単位として部署を用いるのであれば、部署リポジトリのメソッド、たとえばsave()で両方をまとめて実行するというのがセオリーだろう。しかし、操作対象のテーブルが異なっており、ユースケースとしても独立しているという理解であったため、あえてドメイン層で束ねる意味があるのだろうか、という疑念が頭から離れない。

先日参加した勉強会の懇親会で、n.sienaさんとkabukawaさんがいらっしゃったので、疑問をぶつけてみたところ、n.sienaさんから「ユースケースに合わせたデータベースアクセス方法を提供するというのは、トランザクションスクリプト的な発想ですね」との言葉をいただいた。

やはり、集約として部署を設定したのであれば、部署リポジトリのsave()メソッドの内部で複数のテーブルにアクセスするのが自然であるという話になった。実装するならば、以下のようなコードになるようだ*3

public class DepartmentRepositoryImpl implements DepartmentRepository{
  @Autowired
  DepartmentDao departmentDao;
  @Autowired
  AffiliationDao affiliationDao;
  @Override
  public void save(Department aDepartment){
    // 部署テーブル側の更新
    departmentDao.update(mapper.map(aDepartment, DepartmentEntity.class));
    // 所属テーブル側の更新(挿入)。この辺はORM依存になりそう
    List<AffiliationEntity> affliations = someMethod(aDepartment);
    for (AffiliationEntity e : affliations){
      affiliationDao.updateOrInsert(e);
    }
  }
}

ここまでの話で、「アクセス先のテーブルが別々でもひとつのリポジトリでまとめて処理するのでいいのだ」と納得したので、その場は別の話題に移った。そのまま遅くまでリレーショナルモデルについてなどの話をして、すっきりした気分で帰宅した。

もやもやの正体:集約への無理解

翌朝、ブログを書こうと改めて整理を試みてみると、集約の境界とは異なる単位でデータベースアクセス手段を提供したくなっていたのは、集約の設計に違和感があるということの現れだということに気づいた。

そもそも、ドメイン駆動設計における集約とはトランザクション整合性の境界であり、なんらかの不変条件に服するデータ群を整合性のある状態に保つためのパターンなのである。

整合性の境界の論理的な意味は、「その内部にあるあらゆるものは、どんな操作をするにかかわらず、特定の不変条件のルールに従う」ということだ。この境界の外部にある、あらゆるものの整合性は、集約とは無関係になる。つまり、集約はトランザクション整合性の境界と同義である。*4

したがって、リポジトリは集約全体をまとめて永続化する以外の手段を提供すべきではない。ORMのDaoが提供するような個別のテーブルに対する更新は、集約の一部を独立して更新する手段を提供するものであり、バグを生みかねないのだ。

 DAOやそれに関連するパターンを使って、集約の一部とみなされるようなデータに対する、きめ細やかなCRUD操作も行えるので、これはドメインモデルと組み合わせて使うのを避けたほうがいいパターンだといえる。通常の条件の下では、集約自身にビジネスロジックなどの内部処理を管理させて、それ以外にはもらさないようにしておきたい。*5

集約の単位を考え直す

今回の例であれば、名前と部員を同時に変更するというのを、トランザクション整合性の求められる操作として見るべきである、つまり「ひとつの部署の名前と部員との間に担保すべき不変条件がある」のであれば、上に示したような部署リポジトリの設計・実装になるであろう。

しかし、もし部署の名前と部員との間に担保すべき不変条件がないのであれば、集約というトランザクション整合性の単位に括るのではなく、別々の集約として整理して、結果整合性*6を用いればよいのだろう。

いずれにせよ、「ドメイン駆動設計だからリポジトリで関連テーブルも併せて更新する」というようなものではなくて、モデル自体を吟味することが必要なのだ。

おわりに

『エリック・エヴァンスのドメイン駆動設計』や、実践している人のブログなどを読んで、何となくわかってきている気がしていたが、実際に適用してみようとすると全く理解できていないことを痛感させられる。まだまだこれからだ。

※なお、この記事で挙げた部署と社員の例は、実際の業務とは関係のない架空のものである。

Special Thanks

n.sienaさん、kabukawaさん、長時間相談に乗っていただき、ありがとうございました。

また、今回の相談の現場となったのは、「OCHaCafe#5 - 避けては通れない!認証・認可」の懇親会でした。勉強会本体もとても勉強になりました。ありがとうございました。

*1:「エンティティ」、「リポジトリ」、「集約」等の用語はドメイン駆動設計におけるものとする。

*2:ERモデルにおける「実体=エンティティ」であり、ドメイン駆動設計の「エンティティ」ではない。

*3:なお、ここではORMで2種類のDaoを使ってそれぞれのテーブルにアクセスしている風で記述しているが、特定のORMの正確な構文にはなっていない。

*4:『実践ドメイン駆動設計』340頁)

*5:『実践ドメイン駆動設計』425頁。

*6:『実践ドメイン駆動設計』350頁

Eclipse(STS)でJavadocコメント挿入時に自動で入力されるユーザ名を変更する(Windows/Mac)

Eclipse(STS)で開発しているとき、Javadocコメントをショートカットキーなどで挿入することがよくある。このときに、@authorタグの項目が自動で入力されるのだが、デフォルトでは値としてOSへのログインユーザ名が使われる*1。これを自由に変更する方法を書く。

f:id:ky_yk_d:20190404225431p:plain

設定方法:eclipse.ini(SpringToolSuite4.ini)を修正する

設定方法は簡単で、eclipse.ini(SpringToolSuite4.ini)*2に以下のように書き込めばいい。

-product
org.springframework.boot.ide.branding.sts4
--launcher.defaultAction
openFile
-startup
../Eclipse/plugins/org.eclipse.equinox.launcher_1.5.200.v20180922-1751.jar
--launcher.library
../Eclipse/plugins/org.eclipse.equinox.launcher.cocoa.macosx.x86_64_1.1.900.v20180922-1751
-vmargs
; ↓これを追加
-Duser.name=other_name
; ↑これを追加
-Dosgi.requiredJavaVersion=1.8
--add-modules=ALL-SYSTEM
-Xms40m
-XstartOnFirstThread
-Dorg.eclipse.swt.internal.carbon.smallFonts
-Xdock:icon=../Resources/sts4.icns
-Xmx1200m

書き込んでから保存し、Eclipse(STS)を一度閉じて改めて起動すれば、設定の変更が反映される。

補足:Macの場合のiniファイルの所在

Windowsであれば、eclipse.ini(SpringToolSuite4.ini)が実行ファイルと同じフォルダにあるのでわかりやすいのだが、Macの場合はEclipse.app(SpringToolSuite4.app)しか見えていないので一瞬どこにあるかわからない。

正解としては、以下のパスにiniファイルは存在する。

Finderを使ってアクセスするには、Eclipse_2018-09.app(SpringToolSuite4.app)を右クリックして、「パッケージの内容を表示」を選択すればいい。これにより、選択したアプリケーションを起動するのではなく、内側に入ることができる、

f:id:ky_yk_d:20190404225619p:plain

パッケージの内容が見えたら、Contents->Eclipse*3と分け入っていく。すると、お目当のiniファイルが見つかる。設定の内容はWindowsであってもMacであっても変わらない。

f:id:ky_yk_d:20190404225808p:plain

参考

iniファイルの設定方法は以下の記事から。

necoyama3.hatenablog.com

Macの場合のiniファイルの所在は以下の質問から。

stackoverflow.com

*1:パッケージ新規作成時にpackage-info.javaを同時に生成した場合も同じ。

*2:余談)iniファイルのシンタックスハイライトは"dosini"とすればよい。 ";"がコメント記号になる。

*3:これはSTSであっても同じ。

コードの改善に使うEclipseショートカットキー(Windows/Mac)

Eclipseには、様々な編集機能や、自動リファクタリングの機能が搭載されている。Eclipseのショートカットキーを幅広く紹介する記事は、すでに優れたものが存在しているので、よく使うものだけをメモ。

qiita.com

Eclipseによるコードの改善

以下のライブコーディングでは、Eclipseの機能の力によってものすごい速さでコードが書き換えられていく様が見られる。手元が見えないのが非常に残念なのだが、ショートカットをかなり駆使していることは間違いないだろう。Java 8(ラムダ、Optionalなど)の使い方の紹介としても優れた動画だと思うのでおすすめ。

よく使うショートカットキー

以下、普段使うことの多いショートカットキーをつらつらと紹介。下記ツイートのような次第で、WindowsMacの両方でのマッピングを併記する。なお、Win/Mac対照についても網羅的なものが既に存在しているので紹介しておく。

hutyao.hatenablog.com

名前変更

Windows Mac
alt + shift + R command(⌘) + option(⌥) + R

変数やクラス、メソッドなどの名前を参照元も含めて一括で変更できる。参照の数が少ないと手で書き換えることもあるが、油断をすると書き換え漏れが発生することもあるので基本的にこれを利用している。ファイル名と同名のクラスに対して実行した場合には、ファイル名にも変更が反映されるのが便利。

メソッドの抽出

Windows Mac
alt + shift + M command(⌘) + option(⌥) + M

選択した範囲を別のメソッドとして切り出す。リファクタリングの最初の一歩ともいえるかもしれない。

移動

Windows Mac
alt + shift + V command(⌘) + option(⌥) + V

メソッドを別のクラスに移動したり、ファイルを別のパッケージに移動したりするのに使う。前出の「メソッドの抽出」と組み合わせて、コントローラに書かれた処理をモデルのメソッドに書き換えるときなどに使う。

ローカル変数の抽出

Windows Mac
alt + shift + L command(⌘) + option(⌥) + L

選択した式(戻り値の型がvoidでないメソッドの呼び出しなど)の評価値を、推論された型の変数に代入するコードが自動生成される。同じ式の箇所は一斉に新しく作成されたローカル変数で書き換えられるのがポイント。別の使い方として、代入式の右辺を先に書いてから実行することで、ローカル変数の型の記述をサボるのにも使える。

インライン化

Windows Mac
alt + shift + I command(⌘) + option(⌥) + I

選択した変数を、インライン化する。「ローカル変数の抽出」の逆。

メソッドシグネチャの変更

Windows Mac
alt + shift + C command(⌘) + option(⌥) + C

ダイアログ画面を使って、アクセス修飾子、戻り値の型、メソッド名、引数の型と名前、throws句などをまとめて変更できる。

矩形選択

Windows Mac
alt + shift + A command(⌘) + option(⌥) + A

リファクタリングに特化した機能ではないが、メソッドの位置を移動してからthis.をまとめて[パラメータ].に書き換えるときなどに使うことがある。

次の注釈へ

Windows Mac
ctrl + . command(⌘) + .

次のエラーや警告の箇所にカーソルをジャンプさせることができる。リファクタリングに特化したものではないが、非常によく使う。スクロールバーで赤い/黄色い位置に移動するのは結構面倒なもの。

クイックフィックスを適用

Windows Mac
ctrl + 1 command(⌘) + 1

「次の注釈へ」とセット。修正候補から選択するだけで自動的に様々な修正を実施してくれる。

JUnitテストの実行

Windows Mac
alt + shift + XT command (⌘) + option(⌥) + XT

以上のようなショートカットを駆使し、スピーディにコードを改変していくためには、壊していないことを確認することがやはり必要。やや手間がかかるショートカットなので別のキーを割り当ててもいいかもしれない。

おわりに

本来、IDEの機能は「手動でやっていたことを自動でできるようにする」ものだと思うが、経験の浅い身にとっては、「なるほどこういう改善の仕方があるのか」というのを学ぶいい教材でもある。まだ使えていないIDEの機能を探すことを通じて、コード改善の手法をもっと身につけていきたい。

技術者のアウトプットにおける「エモさ」とは何か

ゲストで出演させてもらった「#成し遂げたいam」のep.8が公開された。前後編に分けて収録したうちの後編である。なお、前編が公開されたときに記事を一本書いているので、ポッドキャスト収録ということについてはそちらもご覧いただきたい。

anchor.fm

ky-yk-d.hatenablog.com

後半では、「言葉にこだわる」ということについて喋らせてもらった。意味が曖昧であることが問題になる例として「技術力」を、曖昧さに加えて価値判断が込められていることが問題になる例として「レガシー」をそれぞれ挙げ、適切な言語表現を利用することが思考・コミュニケーションの両面において重要なのではないか、ということを話した。

ep.8の後半*1では、技術者のアウトプット*2について「エモい」という表現が使われるケースについて話している。今回も公開を前にして聴き直させてもらったのだが、「エモ」については言葉足らずな部分があったと思われたので、補足としてこの記事を書くことにした。以下、放送の中で「エモい」という言葉に与えている3種類の意味について記述する。

コンピュータ領域の知見の欠如としての「エモさ」

会話の最初の方では、「技術的な」の対義語として、「技術的でない」という欠如した状態について、「エモい」という表現が使われている(ように思われる)ケースの話をしている。

ここでは、「技術的」とは何かということ自体が問題になるのだが、プロジェクトマネジメントに関わる事柄などは一旦除外して、「コンピュータの動作に関わる事柄」、つまりハードウェアあるいはソフトウェアに関する知識が含まれていることを「技術的」と表現しているものとして理解してもらえばいい。

「エモい」をこのような意味で捉えることは、語の字面から離れているので、あまり好ましくないと思う。同じような文脈で、「ポエム」という言葉が使われることもあるが、これも詩という文学ジャンルに対する理解および敬意を欠いたものであり、適切ではない。

では、「エモい」の語用から離れて、このような意味での「エモい」アウトプットは、どのような意義を持つ、あるいは持たないのであろうか。まず、読み手にとっては、もし技術的な内容を求めているのであれば、読まなければいいのであり、特定の読み手にとって無益であることこそあれ有害であることはないと思われる。

ただし、Qiitaやはてなブックマークの「テクノロジー」カテゴリのランキングが非技術的な内容のもので埋められてしまうとすれば、それは本来の情報収拾を妨げる害をもたらす。この点については、書き手の側に一定の配慮が求められる場面があることも否定しない*3。最終的にはサービスの運営主体による判断次第ではあるが、Qiitaでは、

プログラミング以外の内容は投稿しない

と、コミュニティガイドラインに明記されており、ガイドラインやそれを踏まえた利用者同士の議論を参照しつつ、書き手が自主的に判断することが求められている。

一方、書き手にとってはそれぞれの記事をどのような目的で書くのかはあまりに人それぞれであるため、一概には言えない。もし、アウトプットが転職に向けたプログラミングスキルのアピールが目的であれば、「非技術的」なものはあまり有効ではないであろう。対して、このブログがそうであるように、目的が考えの整理であれば、「非技術的」なものもまた有意義でありうる。いずれにせよ、目的に応じて合理的な手段が取れているかという判断を各自がするほかない。

読み手の感情を動かすものとしての「エモさ」

2番目の意味として、読み手の感情を動かすものとして「エモい」という言葉を用いた。これは、『カイゼン・ジャーニー』について以下のように述べている場面での用法だ。

いい意味で「エモい」本であると同時に、それだけでは終わらない何かを持っている

ここでの「エモい」は、「コンピュータの動作に関わる事柄の欠如」ではなく、「感情を動かす要素の具備」を表現している。この意味が、音楽の文脈で使われていた本来の意味にも、emotionalという英語の原義にも忠実であり、適切であると思われる。なお、第一の意味での「エモい」と第二の意味での「エモい」は必ずしも一致しない。一冊の本の中に、コンピュータの動作に関わる知識と、読み手の感情を揺さぶる内容がともに含まれているということはありうる。

この種の「エモい」アウトプットが読み手に対して持つ意義については、放送の中で述べたとおりだ。ソフトウェア開発は簡単でないし、ビジネスとしてのシビアな側面も有している。また、組織の中で仕事として行われる限り、そこでの人間関係によってストレスが生じることもある。そのような苦しさを伴うソフトウェア開発という営みにエネルギーを持って向き合っていくために、この種の「エモさ」が助けになることはあるだろう。書き手にとっても、自分のアウトプットに対して寄せられる共感は糧になるものだ。

一方で、放送の中で少し言及したように、「頑張れる気はしたのに現実を変える術は得られなかった」ということになると、主観的な苦しさが紛れるだけで、開発の現場は前進しない。むしろ主観的な苦しさを紛らわすことによって実際の問題の解決が遅れるようなケースもあるのではないか。Show Notes にも記載してもらった以下のツイートはこのような考えを提示したものだった。

「現実と格闘するための武器となる知恵」は、必ずしも「コンピュータの動作に関わる」という意味での技術である必要はない。ソフトウェア開発の苦しさを生み出す現象が、コミュニケーションや見える化、タスク管理などによっても解決されうるというのは事実だろう。ただし、そのような「非技術的」アプローチが問題を解決する最良の手段であるとは限らないということは肝に銘じておかなければならない。伊藤直也さんの大好きな言葉を引用しておく*4

感情に訴えて説得することとしての「エモさ」

放送の中で用いている「エモい」の第三の意味は、「説得力を読み手の感情に訴えることによって得ようとする」ということであり、僕が独自に定義したものだ。このような「エモい」の定義は、僕の課題意識に密接に関わっている。

僕のブログを読んで、揶揄する意図を込めずに「エモい」という感想をくれる人がいる。一方で、「エモい記事ばかり書いていてはいけないよ」と諭してくれる人がいる。恐らく前者の「エモい」はこの記事における第二の意義に近く、後者の「エモい」は第一の意義で用いられているのだと理解している。いずれも、ありがたいフィードバックだ。

先に述べたように、技術者としてのアウトプットで「非技術的」なものがどれだけ有意義なのか、あるいはその執筆に費やした時間で「技術的」なものに取り組んだ方が有意義なのではないかという疑念は常にある。上記の「エモい記事ばかり……」という問題提起には確固たる態度決定をいまだに行えていないのだが、現状の自分の姿勢は、「非技術的なアウトプットにも書き手である自分にとっての意義がある」というものだ。でなければこんな記事は書かないし、ポッドキャストにも出ない。

第一の意味での「エモい」記事を書くことに対して、自分は抵抗はない*5。また、第二の意義での「エモい」記事については、あえて書こうというつもりはないが、読み手が「エモい」と感じるのであればそれは止めない。そう受け取られることにも抵抗はない。いずれの意味においても、「エモい」という言葉はあまり大きな意味を自分に持たない。

もちろん、「エモい」という言葉を使わない、無視するということもできる。しかしながら、「エモい」という言葉があまり意味を明確化されずに、しばしば揶揄のために用いられていることに対するささやかな抵抗を試みたい。この言葉を、単なる揶揄ではなく、何かしらの問題を適切に言い当てるものとして定義し直したいという欲望を持った。

そういう訳で考え付いたのが、「説得力を読み手の感情に訴えることによって得ようとする」という「エモさ」の定式化だった。この意味の否定的な評価は、自身の過去の記事について自ら下しているものでもあったし、自分以外の記事や各種の発言についても感じる部分があったものだ。「エモい」という言葉で言い表すことで、取り組むべき問題としてより強く意識できるのではないかと考えた。

この定義は、まだ練る余地のあるものだろう。感情に訴える説得とは何なのか。そもそも感情に訴えない説得というのがありうるのか。いまいち明確でない。「伝われ」という思いを持っているのも正直なところであり、「エモい」の定義自体がまだ「エモい」ものになっている。しかし、「そこに何かしら問題がありそうである」ということを指摘するのには十分に意味のあるものなのではないだろうか。

おわりに

以上、放送の中で用いている「エモい」の3つの意味について、補足的な説明を試みた。第一の「非技術的」という意味は、その過度の広範さを理由として自分としては使いたくないものである。第二の「読み手の感情を動かす」という意味は、最も字面や語源に忠実であり、この意味で使うことは今後もあるだろう。第三の「説得力を読み手の感情に訴えることによって得ようとする」という意味は、自分自身で持っていた課題意識のために「エモい」という言葉を転用したものであり、放送でも述べたようにこの種の「エモさ」はブログから減らしていきたいと考えている。

「説得力を読み手の感情に訴えることによって得ようとする」ということを避けようとするとき、自らを戒めなければならないと思っていることがある。それは、科学的な手続きで得られた根拠をもっと重視すべきだということだ。言語や論理ということに愛着を持つ一方で、自分はあまり実証に対して関心を持っていないという自覚がある。科学的な根拠に裏付けられた主張のみに価値があるという立場は採らないが、科学的な根拠の必要な場面で印象論を述べてしまうようなことは避けなければならない。印象論はまさしく第三の意味での「エモい」ものに他ならないのだ。

*1:28分頃〜。

*2:以下では、記述の冗長さを避けるため、断りがない限りは、アウトプットの代表として、ブログの記事を前提とした場合の表現を用いる。つまり、アウトプットの出し手は「書き手」と、受け手は「読み手」と記述する。これは、あくまで便宜上のものであり、口頭発表やポッドキャストなど別の媒体でのアウトプットを言及の対象から除外することを意味しない。

*3:もっとも、はてなブックマークの場合は、アウトプットの媒体に依らずに勝手にカテゴライズ、ランキング掲載されるので難しい。

*4:伊藤直也「大事な問題にフォーカスする」(『エラスティックリーダーシップ』所収より。

*5:ただし、この意味で「エモい」という言葉を用いることには反対である。