2023-09-18に更新

矛盾のない命令系統を備える階層の作り方(^~^)

ramen-tabero-futsu2.png
「 もう一回 階層について 記事を書くぜ」

kifuwarabe-futsu.png
「 熱心だな」

ohkina-hiyoko-futsu2.png
「 失敗しただけ、要らん記事が量産されてるのよ」

命令を出す者

202309_program_16-2211--Commander.png
Commander

ramen-tabero-futsu2.png
「 まず、コマンダー(Commander)は、別のコマンダーへ、コマンドを出せるぜ」

202309_program_16-2215--2Commanders.png

ramen-tabero-futsu2.png
「 👆 絵にすると こんな感じだな」

階級は全順序

202309_program_16-2217--Class.png

ramen-tabero-futsu2.png
「 👆 で、コマンダーには 階級というものがあるぜ。
階級が上のコマンダーは、階級が下のコマンダーに コマンドを出せるぜ。
階級が下のコマンダーは、階級が上のコマンダーには、コマンドを出せないぜ」

ohkina-hiyoko-futsu2.png
「 序列があんの?」

ramen-tabero-futsu2.png
「 上と、下が ひっくり返ることはないぜ。全順序」

下のコマンダーから上のコマンダーへの向きは、報告を上げるだけ

202309_program_16-2221--Report.png

ramen-tabero-futsu2.png
「 👆 階級が下のコマンダーが、階級の上のコマンダーに投げれるものは
レポート(Report)でも呼ぶとしよう。
ここで、階級が上のコマンダーは、レポートを読んでも、
コマンドを送り返すことは しないことにしろだぜ」

kifuwarabe-futsu.png
「 レポートを受け取ったら すぐにコマンドを出したいような
決まりきった処理だって あるんじゃないか?」

202309_program_16-2229--InfinityLoop.png

ramen-tabero-futsu2.png
「 👆 Bという報告を受け取ったらAという命令を出すコマンダーと、
Aという命令を受け取ったらBという報告を返すコマンダーが コンビを組むと
インフィニティ・ループ(Infinity Loop;無限ループ)に陥る」

kifuwarabe-futsu.png
「 じゃあ 階級が上のコマンダーは 階級が下のコマンダーに もっと働いてもらいたいと思っても、
レポートを受け取ることしかできないのかだぜ?」

ramen-tabero-futsu2.png
「 階級が下のコマンダーが もっと働くというのが おかしいんだぜ。
階級が下のコマンダーは、階級が下なりの、それなりのことしか しないぜ」

部下の名前は知ってるが、上長は誰か知らないかのように作れ

202309_program_16-2343--cellAutomaton.png

ramen-tabero-futsu2.png
「 👆 プログラムでは、
部下の名前は知ってるが、上長は誰か知らないかのように作れだぜ」

kifuwarabe-futsu.png
「 そんな マヌケ な部下でいいのかだぜ?」

ramen-tabero-futsu2.png
「 マヌケなのがいいんだぜ」

ohkina-hiyoko-futsu2.png
「 上長が すり替わっても 仕事はできますもんね」

末端の部下に、組織全体をひっかき回すぐらい仕事してほしいケースがよくある

202309_program_17-0006--undoRedo.png

ohkina-hiyoko-futsu2.png
「 👆 でも プログラミングやってると、
一番末端の部下に 組織全体をひっかき回すくらい仕事してほしいケースが よくあるのよ」

ramen-tabero-futsu2.png
「 設定ファイル 書きかえるボタンとかな。
上長の言うことが変わるような権力を 設定画面が持ってたりするな」

kifuwarabe-futsu.png
「 設定画面は 上の方の 上長にしないといけないよな」

ohkina-hiyoko-futsu2.png
「 でも みんな設定したいのだから、末端にいてほしいのよ」

kifuwarabe-futsu.png
「 インフィニティ・ループが始まってしまう」

ramen-tabero-futsu2.png
「 じゃあ仮に リバース・ワーカー(Reverse worker;逆転する作業員)とでも造語しよう。
リバース・ワーカーをいないようにするのが 優れた階層だぜ」

202309_program_17-0030--reverseWorker.png

ramen-tabero-futsu2.png
「 👆 リバース・ワーカーは 上位に置けだぜ」

判定ラインは?

kifuwarabe-futsu.png
「 どいつが リバース・ワーカーで、
どいつは 部下にコマンドを送っているつもりが、リバース・ワーカーに
レポートを上げることになった末端のコマンダーなんだぜ?」

ramen-tabero-futsu2.png
「 考え方が逆だぜ。
末端作業員の ボトム から確定していって、
最後の方まで残る 余り のようなやつが リバース・ワーカーだぜ。
その リバース・ワーカー が、ボトムにいたら プログラムは崩壊するんだぜ」

データとプログラム

202309_program_17-1034--object.png

ohkina-hiyoko-futsu2.png
「 👆 コマンダーって、自分の裁量で扱えるデータと、そのデータをどう扱うかのプログラムを持ってると思うけど……」

202309_program_17-1040--objectHierarchy.png

ohkina-hiyoko-futsu2.png
「 👆 そのデータと プログラムも 階層構造になってると考えると」

202309_program_17-1049--size.png

ohkina-hiyoko-futsu2.png
「 👆 上長になるほど バカデカくなって、 部下は ちょっとのことしか できなくない?」

ramen-tabero-futsu2.png
「 それが理想だぜ」

kifuwarabe-futsu.png
「 優秀な部下が 勝手に動いてくれないと 忙しい上長は 楽できないんじゃないか?
めんどうな仕事は 部下に押し付けるのが 組織なんじゃないか?」

ramen-tabero-futsu2.png
「 デベロップメントでは 逆だぜ」

ramen-tabero-futsu2.png
「 コントロール可能で簡単なことしかしない部下と、コントロールする上長にしろだぜ」

ramen-tabero-futsu2.png
「 造語すると、ビッグ・ボスと スモール・メンバーだぜ」

上長が持ってるデータをほしい部下

202309_program_17-1128--bossData.png

ohkina-hiyoko-futsu2.png
「 👆 部下が仕事するには、上長が持ってるデータが欲しいときがあるでしょ」

ramen-tabero-futsu2.png
「 よくある」

ohkina-hiyoko-futsu2.png
「 命令だけじゃなくて、データも よこしなさいよ」

kifuwarabe-futsu.png
「 リバース・ワーカーになるのでは?」

ramen-tabero-futsu2.png
「 上司の持ってるデータを 部下に渡すと 部下が でかくなるぜ。
上司がデータを部下に渡すのが 階層の序列崩壊の始まりだぜ」

ohkina-hiyoko-futsu2.png
「 部下の仕事が進まないんだけど」

ramen-tabero-futsu2.png
「 部下が、 上司が持っているデータが無いと進められない仕事 を持っていることが おかしいんだぜ」

ohkina-hiyoko-futsu2.png
「 じゃあ、部下にやってほしい仕事の多くを 上司がやることにならない?」

ramen-tabero-futsu2.png
「 プログラミング の中の価値観では、そうなるぜ」

ramen-tabero-futsu2.png
「 リバース・データ(Reverse Data)とでも造語しよう」

ramen-tabero-futsu2.png
「 競技プログラミングのようなものは除くが、
大きな組織を作るときは、リバース・データは しないことが重要だぜ」

横のデータがほしい自分

202309_program_17-1726--sibling-o2o0.png

ohkina-hiyoko-futsu2.png
「 👆 上司のデータは要らないけど、同僚のデータがほしい場合は どうすんの?」

ramen-tabero-futsu2.png
「 厳密には、横だと思ってるやつが 本当に横かは分からない。
自分のボスが誰かさえ 自分は知らないからな」

kifuwarabe-futsu.png
「 悪の組織みたいだな。密輸でもしてんのか」

202309_program_17-1740--network.png

ohkina-hiyoko-futsu2.png
「 👆 とにかく 他の人のデータがほしいとき どうすんの?」

ramen-tabero-futsu2.png
「 部下以外から データを引っ張り出してくると、リバース・ワーカーのできあがりだぜ」

202309_program_17-1757--common.png

ramen-tabero-futsu2.png
「 👆 仕方がないので、解決方法としては、まるで 共通の部下がいるような 下位の部下を置いて、
隣と共有したいようなものは 下位の部下に置き、見知らぬ上長同士で 共有することだぜ」

kifuwarabe-futsu.png
「 ツリー構造が 破れるな」

ramen-tabero-futsu2.png
「 全順序の方が重要だぜ」

ohkina-hiyoko-futsu2.png
「 その Common のデータは、本来 上長が持っておくべきものを 部下に渡しただけじゃないの?
なんでもかんでも Common にデータが置かれて、
Common にアクセスできるコマンダーは結局、リバース・ワーカーになるんじゃないの?」

ramen-tabero-futsu2.png
「 Common に置くのは あくまで 同僚間で共有するであろうデータだぜ。用法を間違えば 階層の序列は崩壊する」

ramen-tabero-futsu2.png
「 このトピックに名前を付けておくと、 コモン・オブ・ヒエラルキー とかどうだぜ?」

コモンが めちゃくちゃ でかくなる

kifuwarabe-futsu.png
「 お父ん。ほとんどのコマンダーが 自分の持っているデータを Common に下げてしまい、
Common が リバース・ワーカーになったぜ」

ohkina-hiyoko-futsu2.png
「 横 とは 密 になるわよねえ」

ramen-tabero-futsu2.png
「 ネットワーク状になるんだろ。ヒエラルキーを侵食していくぜ」

ohkina-hiyoko-futsu2.png
「 あるところは 密なネットワーク で、
あるところを部分的に見ると 全順序 で、
全体としては 半順序 な、
そのような 機械的には収束しない、 振動する不定形なモデル を想像しないと いけなくない?」

ramen-tabero-futsu2.png
「 現実的にはそうなるか。 しかし なんらかのあるべき状態へ戻ろうとするちから が働かないと 序列は崩壊するぜ」

メンバー・ネットワーク

202309_program_17-1903--memberNetwork.png

ramen-tabero-futsu2.png
「 👆 ぐちゃぐちゃの 密結合を認める空間、 メンバー・ネットワーク (Member Network) を認めることにするぜ」

ohkina-hiyoko-futsu2.png
「 Member Network って文字数が 13文字もあって長いので、短くならないの?」

ramen-tabero-futsu2.png
「 同僚なら Colleagues、部下なら Subordinates でどうだぜ?」

kifuwarabe-futsu.png
「 長い」

ramen-tabero-futsu2.png
「 同僚なら Co、部下なら Sub でどうだぜ?」

kifuwarabe-futsu.png
「 今度は短すぎる……」

ohkina-hiyoko-futsu2.png
「 文字数は Member Network よりマシだから、変数名に困ったら ColleaguesSubordinates を使うことにしましょう」

ohkina-hiyoko-futsu2.png
「 Member Network は単に Members で十分よね」

ramen-tabero-futsu2.png
「 分かった、分かった」

メンバー・ネットワークを認めるのなら、Common は要らんのでは?

kifuwarabe-futsu.png
「 メンバー・ネットワークを認めるのなら、Common は要らんのでは?」

ramen-tabero-futsu2.png
「 まったくだぜ」

話しを覆すが

202309_program_18-0233--Members.png

ramen-tabero-futsu2.png
「 👆 上長と 部下の間に Members という名前の メディエーター(Mediator;仲介者)を置くことにするぜ」

kifuwarabe-futsu.png
「 なんでまた」

ramen-tabero-futsu2.png
「 ネットワーク構造は すぐ スパゲッティー・コードと化す。
ネットワーク構造を不可とし、ヒエラルキー構造を 強制させることにするぜ」

ohkina-hiyoko-futsu2.png
「 今度は Members メディエーターに コードが集中してくるんだけど」

ramen-tabero-futsu2.png
「 上長と 部下を シンプルにして、 Members メディエーターに 密結合を 押し付けろだぜ。
押し入れみたいなもんだぜ」

kifuwarabe-futsu.png
「 部下のコードが Members メディエーターに取り上げられて、
部下は なんにも隣と連携しない 木偶の棒 みたいになってしまうぜ?」

ramen-tabero-futsu2.png
「 それでいい。それが理想。疎結合。あるべき姿」

ソース・フォルダーの使い方

  📂 Ramen Project
  └── 📂 Models
    └── 📂 Book
      └── 📄 MemoModel

ohkina-hiyoko-futsu2.png
「 👆 ヒエラルキーを作ると、フォルダー階層が深くなるのよねえ」

ramen-tabero-futsu2.png
「 ファイルパスは 文字数上限 256文字の壁がある。
  フォルダー階層を作る方法は いずれ 行き詰る」

ohkina-hiyoko-futsu2.png
「 じゃあ ソースはどう配置したらいいの?」

ramen-tabero-futsu2.png
「 例えば、悪い方法から見てみよう」

悪い方法:テレスドン

202309_program_17-1654--SiteMap.png

ramen-tabero-futsu2.png
「 👆 例えば 上図のような画面遷移があるとしよう」

悪い例:

  📂 SiteMap
  ├── 📄 Portal
  └── 📂 Portal
    ├── 📄 Introduction
    ├── 📄 Downloads
    ├── 📂 Downloads
    │  ├── 📄 Windows
    │  └── 📄 Linux
    └── 📄 FAQ

ramen-tabero-futsu2.png
「 👆 例えば サイトマップの階層を そのままフォルダーを使って表すのは 悪い例だぜ。
わたしは こんなことをする人を テレスドン と呼んでいる」

kifuwarabe-futsu.png
「 テレスドンには 風評被害だぜ」

ramen-tabero-futsu2.png
「 ファイルパスの 256文字制限は わりとよく ぶつかって
深い階層のフォルダーで 圧縮ファイルを解凍したとき、ファイルを破損したりするぜ」

ohkina-hiyoko-futsu2.png
「 じゃあ どうすんのが ベスト・プラクティスなの?」

202309_program_17-1708--Typing.png
ramen-tabero-futsu2.png
「 👆 ひとまず、流し込むコンテンツが違うだけで 同じテンプレートでいけるだろ、という画面は
1つにまとめるぜ。
わたしは これを タイピング と呼んでいる」

良い例:

  📂 Pages
  ├── 📄 ByOS
  ├── 📄 Downloads
  ├── 📄 FAQ
  ├── 📄 Introduction
  └── 📄 Portal

ramen-tabero-futsu2.png
「 👆 あとは Pages フォルダ―を作って、その下に ABC順で フラットに並べるだけだぜ」

ohkina-hiyoko-futsu2.png
「 階層構造が 分かんなくない?」

ramen-tabero-futsu2.png
「 そんなものは 設計書か何かに書いておけだぜ」

ツイッターでシェア
みんなに共有、忘れないようにメモ

むずでょ

光速のアカウント凍結されちゃったんで……。ゲームプログラムを独習中なんだぜ☆電王戦IIに出た棋士もコンピューターもみんな好きだぜ☆▲(パソコン将棋)WCSC29一次予選36位、SDT5予選42位▲(パソコン囲碁)AI竜星戦予選16位

Crieitは誰でも投稿できるサービスです。 是非記事の投稿をお願いします。どんな軽い内容でも投稿できます。

また、「こんな記事が読みたいけど見つからない!」という方は是非記事投稿リクエストボードへ!

有料記事を販売できるようになりました!

こじんまりと作業ログやメモ、進捗を書き残しておきたい方はボード機能をご利用ください。
ボードとは?

コメント