■概要
以下のURLに掲載されているディレクトリに関する記事を読んだ際、内容が難しくさっぱりわからなかったのでなぜこんなに難しく説明しているのか疑問に思いました。
その疑問についてChatGPTに聞いた結果、これまで漠然と感じていた「分かりやすさ」と「正確さ」の関係について考えをまとめることができたため記します。
■引用記事
■内容1_きっかけ
ディレクトリとはLinuxにおいて基本的な用語です。
ネットやChatGPTで調べると以下のような説明が返ってきます。
- コンピューター上でファイルや他のディレクトリーを分類・整理するための仮想的な「入れ物」や「保管場所」のこと
- 階層構造を持ったファイルを保管する為の場所の総称
- WindowsやmacOSにおける「フォルダ」と同じ概念
一方、引用記事ではディレクトリについて、以下の3つの観点から定義が示されています。
- POSIX(ポシックス)
ディレクトリは「ディレクトリストリーム」として扱われ、struct dirent という構造体を通じてエントリを取得する仕組みが定義されている。
struct dirent には、ファイル名(エントリ名)や、実装によっては inode 番号などの情報が含まれます。
- glibc(ジー・リブ・シー)
readdir() が返す struct dirent の構造についてファイル名(d_name)は必ず利用できるが、inode番号(d_ino)などは実装依存であるため注意が必要とされている。
- Linuxカーネル
ext4ファイルシステムにおいて、ディレクトリはほぼフラットファイルであり、任意のバイト文字列(通常はASCII)をファイルシステム上のinode番号に対応付ける役割を担う。
■内容2_最初の感想
投稿された記事に「初心者向け」のマークがあったが全然初心者向けではありませんでした。
ext4の説明でinode番号を持ったファイルであるということは分かりましたが、正直ピンときませんでした。
データファイルを分類するための入れ物という認識で良くないかと思いました。
(記事を書いた方、申し訳ありません。)
■内容3_疑問と探求
ChatGPTになぜこの記事の説明は分かりにくいのか、わかりやすく書かれていないのかを質問しました。
以下に私の疑問とChatGPTの回答を抜粋して記載します。
- なぜこのようなまどろっこしい説明をしているのか
この記事はディレクトリという抽象的な概念を厳格な定義で説明している。
「入れ物」という表現は感覚的には分かりやすいが専門用語を省いてわかりやすく捉えると誤解を生む危険がある。
- なぜわかりやすく表現することが危険なのか
ディレクトリの要素であるinodeやmountなどの説明をする際に破綻してしまう。
例えば「ディレクトリは入れ物である」という理解で考えるとディレクトリAを削除すると中のファイルも消えるように思える。
しかし実際には、ファイルはディレクトリに入っているのではなく「名前 → inode」の対応関係として参照されているだけである。
そのため、ファイルBに別のハードリンクが存在していればディレクトリAを削除しても別リンク経由で引き続き参照できる。
⇒要するに仕様ベースで語ると説明が可能になる。
- わかりやすく捉えることによる実務で支障が出る可能性はあるか
du、dfコマンドのディスク使用量の違いやrsync / cp -a の挙動、ログを削除しても容量が減らないなど対応力に差が出る可能性あり。
- ディレクトリは入れ物ではなく、正確にはファイル名にiノードが結びついた対応関係を格納しているファイルの一種というのが正しい認識か
どちらも正しい説明だが用途が違う。
前者は初学者や普段の実作業時に事足りる説明だが、正確性に欠ける。
後者は厳密に捉えた仕様ベースの説明だが、初学者には抽象的が過ぎて理解されにくいという説明の違い。
■内容4_理解モデルの違い
ここでは、このような理解モデルを「便利な嘘」と呼ぶことにします。
複雑で分かりにくい事柄について正確ではないが、初学者や直接関わっていない人にも
理解しやすくするために人間の感覚に合わせて説明した理解モデルのことを指します。
逆に抽象的に物事を正確に説明している理解モデルを「仕様ベース」と名付けます。
「ディレクトリは入れ物である」という説明も、便利な嘘の一例です。
実は今回のような「ディレクトリは入れ物」以外にも、深く理解するためには仕様ベースでないと不十分な便利な嘘がIT用語にはたくさんあります。
■例1
- 便利な嘘
- ファイルはデータが入っているもの
- 仕様ベース
- ファイルはディレクトリエントリで管理され、inodeが実体情報を保持しデータブロックを参照する
■例2
- 便利な嘘
- rmコマンドはファイルを削除する
- 仕様ベース
- rmコマンドはディレクトリエントリを削除する
■例3
- 便利な嘘
- ネットワーク接続はケーブルでつながっている
- 仕様ベース
- ネットワーク接続とは、MAC/IP/ポートによる通信対象の識別、ARPやルーティングによる経路解決、L2/L3/L4によるデータ転送によって成立する。
重要なのはこの「便利な噓」がデタラメではなく複雑な現象のうち、初学者が理解すべき本質だけを人間の感覚に対応させた理解モデルであるということです。
人間は抽象的な事柄を理解することが難しく、最初から実体に即したことを教えると早めに行き詰ってしまいます。まずは形を変えて自分の中に落とし込むことが大事で、その後に正確な理解モデルをアップデートしていけばよいと思います。
ただし、レベルが上がったからと言って便利な嘘の理解モデルを捨てる必要はありません。
実作業で必要な場面に理解モデルを切り替えて考えれば済む話です。
■補足
「便利な嘘」という言葉は造語ですが、この考え方自体はさまざまな分野で使われています。
- 教育/認知科学⇒教育的モデル、単純化モデル
- 心理学⇒メンタルモデル
- 世間一般⇒具体化
■結論
一見すると分かりにくく回りくどく感じる説明は内容が難しいのではなく前提としている理解モデルが違うことに原因があります。
人は抽象的な概念をそのまま理解することが難しいため学習の初期段階では「便利な嘘」のような割り切った表現が必要になります。
そして理解が進むにつれてその説明では辻褄が合わなくなる場面に出会いより正確な理解モデルへと切り替える必要が出てきます。
これまで使ってきた理解モデルは無駄なのではなく次の理解へ進むために必要な通過点と捉えましょう。
■伝えたいこと
生成AIが世の中に浸透し分からないことを言語化できれば、自分が納得できるところまで調べられる環境になりました。
一方で、人と話すことや実際に誰かに説明してもらうことで理解が一段深まる場面も多いと感じています。
今、多くの業界で人手不足が続いていて新しく現場に入ってくれる人はとても貴重な存在です。
ただ経験者の視点から見ると、初学者の方からは思いもよらない質問を受けることもあります。
その時に大切なのは、「何を説明するか」だけでなく相手がどのような理解モデルを持っているかを意識して抽象化と具体化を行き来しながら自分自身の説明を調整できているかが大切だと感じました。
私自身まだ学ぶ立場ではありますが今後誰かから教えを求められたときは
相手に伝わる説明を心がけていきたいと思います。
この内容を最後まで読んでくれたあなたにもそう思ってもらえたらうれしいです。