生き様174. IN/OUTと因果の話 ~論理的思考もあるよ~
今日から12月
今日から12月です。2022年はなんと30日しか残っていません!!
「12月なのにそんなに寒くないですねー」なんてコメントを用意していたら……。
しっかり寒くなりましたね!
12月といえば、年末!源泉徴収!確定申告!!
これから1年の総決算で領収書と格闘する季節が開幕します。
他にも年賀状の準備もありますね!僕はここ数年出していませんが。
残り少ない2022年を有意義に過ごして、2023年を迎えましょう!
テストやバグ検証はIN/OUTに注目する
1年以上前にコラムに書いたことがありますが、白柳はテストが嫌いです。
嫌いとはいえ、テストを疎かにするつもりはありません。
むしろ、テストを考えるのは好きです。
その時に特に意識するのが、IN/OUTの明確化です。
どういう入力(操作)を行い、どんな出力(結果・動作)が欲しいのか。
昨今の自動テストにも繋がる考え方です。
特にテストケースを洗い出すときはここに注目しています。
バグ検証でも、IN/OUTに注目するのは同じです。
入力と期待する出力のズレがどこで発生するのか、見当をつけながら詰めていきます。
通信やマルチスレッド処理が関わると心が折れそうになります。
コンピューターが行っているのは、単純な計算処理の積み重ねです。
ですから、突き詰めていけば、どこかに計算のミスがわるわけです。
それも、人由来のミスが。
最近は、IDEでステップ実行ができる開発環境も多くあります。
ですが稀に……特にWeb系では頻繁に……ステップ実行とは無縁な言語もあります。
そういう時には「入出力に注目する」のです。
よく稀に…頻繁に発生するレアな状況として…入出力の取り方に困ることがあります。
特に入力に一番近い出力を取る方法が分からない、というケースです。
正しく入力がされているか?は真っ先に注目するところなのです。
因果とIN/OUTの類似性・相違性
白柳の好む考え方に「因果関係」があります。
2つの出来事が、原因と結果で繋がっている、という関係性の考え方です。
原因から結果を想像するよりは、結果から原因を探究する時に使われます。
【因】があるから【果】がある。
【IN】があるから【OUT】がある。
それぞれを入力と出力に例えて、または因と果に例えて考えることをよく行います。
【IN】と【因】の音が繋がっているので、好きなのです。
ええ、単なるダジャレです。
膨大なログの中から、発生している障害の原因に繋がりそうな情報を探す。
そしてその情報につながる入力を突き止める。
実際に操作してその結果になるか確認する。
地道ですが、そうやってバグを検証・改善していきます。
その一方では、考えうる限りの仮説を並べ、状況と合わない説の消込も行います。
「因果関係が成り立たないから」と。
ですが、現実はシンプルに原因と結果が1:1で対応してくれていません。
主因や副因、多くの従因の影響により、結果となる事象が引き起こされています。
1つの要因が複数の結果につながっていることだってあるのです。
そういう事柄を全部引っくるめて【因果】の関係性を思考するのが楽しいのです。
論理思考を使おう
白栁自身は、特に論理的思考万歳!!という訳ではありません。
むしろ「論理的思考わからん」組です。
「Logical Thinking」というぐらいだから、プログラミングと関係ある?程度です。
白栁の中で「論理的思考」の現在の解説は「因果をうまく繋げること」です。
世間では、様々な物事が関係して(相関して)事象が起こります。
前述の通り、1つの事柄が必ずしも1つの事象に対応しているわけではありません。
昨今のAI技術の進化により、事柄と事象の相関を紐付けることは容易になりました。
今までは思っても見なかったような、相関関係が発見されることもあります。
しかし、それが正しく「因果」で紐付いているか?ということは判断できません。
例えば「暑い日にアイスが売れる」というのは、よく耳にする相関関係の例です。
ですが「暑い日に車で移動する人が多い」というデータがあれば、「車が多い日にアイスが売れる」と紐付けられることも考えられます。
理屈としては「車が多い(暑い)日にはアイスが売れる」と「暑い日」で結合した後に括弧内を省くことにより導き出されるのです。
実際に考えれば、こんなことは起こりえません。
当然、他にも車が多い日のデータを参照して裏付けを取るでしょう。
しかし、現在のところは「裏付けをとる」はAIの仕事ではありません。
裏付けを取り、別の証拠で相関を否定するというのことも、うまく因果を繋げることの1つです。
そしてこれらが、論理的思考なのだと考えています。
もちろん、世の中全てが理論で動いているわけではありません。
直感や感情など、理論ではない要因で動くものがあります。
それすらもモデル化して、理論に当て嵌めることを考えているのが社会学や経済学です。
しかしながら、完璧なものはありません。僕の知る限りでは。
論理的思考は沢山ある考え方の1つでしかありません。
カウンセラーである白栁は、情動的なものも大切だと考えています。
良い/悪いではなく、場合により適切/不適切で使い分けるのです。
もちろん、その前に自分の中で基準になる考え方を持つのは良いことでしょう。
以上!
コメント
お年寄り
デバッグ時の調査とか、影響が連鎖する事柄は因果関係がとても役立ちます。
でも個人的には因果関係より中学生レベルの数学的思考が重要に感じます。
ソフトの設計時に役立つのは論理集合という考え方ですね。
「x < 0、x == 0、0 < x」のような場合分けをして処理を分岐するなど、よくありますよね。
構造化プログラミングには論理集合の考え方が欠かせないと思います。
場合分けの要因が複数になってくると、デシジョンテーブルを書くとよいです。
(若いころ、先輩にマトリクスという名前で教わりましたが、行列計算と
紛らわしいので、デシジョンテーブルと呼ぶのがよいですね)
論理的思考に自信があっても、いきなりコーディングから始めると
ぐだぐだになることもあるので、ソースコードのコメントに
デシジョンテーブルを書いてみるというのもありですね。
エンジニアカウンセラー白栁隆司
To:お年寄り さん
コメントありがとうございます。
そうですね。条件式で使う論理集合は「論理」とあるぐらいですから、論理的思考が必要となりますよね。
論理集合が中学生レベルだったかは記憶にないのですが、高校時代にみっちりとやり込みをさせられたので、苦手意識感なく、当たり前に触れています。
この「苦手意識がない」という部分が大事なのでしょう。
小学校で論理的思考の学習を行っているのも、そういう思考の素養を養うためなのかもしれません。