![catch-img](https://ferret-one.akamaized.net/images/66a8867aef4d3a043e5e9a41/original.png?utime=1722320506)
哲学とプログラミング
エンジニアとしての開発に取り組んでいると、自身の知らない領域や技術に立ち向かわなければならない状況は多々存在します。
そんな中、自分なりの問題への立ち向かい方のコツは哲学にあるので、その哲学を踏まえながら解説していきたいと思います。
はじめに
エンジニアのお仕事は基本的には課題や問題といった何かを解決をすることと考えます。
何かお仕事を引き受ける際には、その対象には課題や問題が必ず存在します。
それらの課題や問題を捉え、エンジニアとして開発に取り組む際の解決法は哲学的な視点から考察することで解決に導くことができます。
注意事項:
言葉に対する解釈は人それぞれ異なるかもしれません。
そのずれを埋めることは非常に困難であるため、ここで語られる言葉は言葉そのものとして捉えるのではなく、言葉が何かを表現しているふわっとした空間として捉え、真なる意味を解釈しすぎることによって理解の齟齬が生まれないようにいただきたい所存です。
全ての出来事には
問題を捉える時、そもそも問題とはなんなのかを考えてみましょう。単体で見ると出来事と言えるでしょう。 認識齟齬、システムや構造の欠陥、不確実性によるリスク発生これらは出来事が起こり得て発生するものと言えます。(深掘りするとそれらは事実の総体であるとも言えるので、出来事として捉えることはできませんが)そしてその出来事に対する考えとしてライプニッツの充足理由律があります。「どんな出来事にも、そうであるためには十分な理由がなくてはならない。」という哲学の考え方です。まず問題を捉える為には十分な理由を列挙していく必要があります。
※充足理由律についての情報はこちらから
https://ja.wikipedia.org/wiki/充足理由律
構造として捉える
理由を列挙する為には実態を捉え、どこに理由が存在するかを見つけなければなりません。存在を確認する為にはその出来事に対して点と線で捉えることが重要だと考えます。私たちITに携わる言葉を使用するとノードとリンクという言葉に置き換えることができると思います。そして、対象(ここの対象とは出来事でもあり、実態でもある)の構成要素が特定の対象に相対したとき、その対象はどのように捉えることができるか、それはノードとリンクの集合であると考えることができます。
このノードとリンクをどういったものが繋ぎ合わさって実態となっているかがその対象を捉えることの第1歩となります。例えば、1つの鉛筆削りが存在し鉛筆が削ることができないもしくは削るスピードが遅いという解決すべき出来事に遭遇した場合、まずは構成要素として削る部分、削る動力を生み出す部分、そして動力が伝わった結果を集約する部分などいくつかのノードに分けることができます。この分割により出来事の実態を捉えることが可能になります。
四原因説を使った対象の認識
では出来事を捉えると物をとらえる作業に入ります。
対象を捉えることができれば次に考えるのは、それぞれの対象が持つ因を検討する必要があります。先ほど1の構成要素を上げる際に、〇〇な部分としてあげたのは目的を持った表現になりますのですでに対象の1つの因は特定できていると思います。この因は形を捉える説としてアリストテレスが論じている4原因論説を参考にしています。
4原因論説とは
1 質量因 存在するものの物質的な原因
鉄、アルミニウムなど
2 形相因 そのものがなんであるかそのものをたらしめている原因
鋭い刃とその配置、鉛筆を固定するためのホールの形状
3 動力因
鉛筆削りの製造プロセス(設計、生産、組み立て)、または実際に鉛筆を削る行為。
4 目的因
例: 鉛筆の先を尖らせて、書くための道具としての性能を向上させること。
そしてこれらの要素は階層的に分解していくことも可能です。
※4原因論説についての詳しい解説はこちらを参照ください
https://ja.wikipedia.org/wiki/四原因説
こうして物を捉えることで巻き戻ってしまいますが、出来事を捉えることができます。この巻き戻る作業が起こりうる可能性を引き出すことに非常に役立ちます。対象は分解すればさらにその分解した対象を分解することもできます。システムやオブジェクトを階層的に分解し、上位レベルから下位レベルへと段階的に詳細化することで対象の何を解決しなければならないかを明確にします。複雑化した対象を取り扱う場合はこの階層的分解は非常に重要な項目になります鉛筆削りでは少々単調なので、飛行機を例に挙げると、
飛行機:
- エンジン(構造分解)
- タービンブレード
- 燃焼室
- コンプレッサーファン
- 翼
- 翼の前縁フラップ
- 後縁フラップ……….etc
さらに分解をすると
ネジ(それぞれの階層化した部品及び対象):
- 素材(質料因)
- 鉄
- ステンレススチール
- 形状(形相因)
- 頭の形(平頭、丸頭)………….
のような分解ができます。
構造を捉えることで先に挙げた4原因の深掘りができるようになります。
ヴィトゲンシュタインと構造分解とモデリング
構造分解は、すでに明確な分解構造が決まっている場合に比較的容易です。しかし、対象の構造がはっきりしていない場合には、ヴィトゲンシュタインの『論理哲学論考』の概念が非常に役立ちます。ヴィトゲンシュタインは、世界が基本的な事実や命題(論理原子)によって構成されていると考えました。これにより、複雑な問題を基本的な要素に分解することが可能となり、対象のモデリングにおいて有用です。モデリングを通じて、対象がどのような事実に基づいて構築されているのかが明らかになります。これは、対象の本質や構造を理解するための第一歩です。
ここでは深く言及しませんが、ヴィトゲンシュタインは、言語と世界の対応に基づいて、対象の構造と事実の構造を捉えることが「真実」を見ることであると論じています。この視点は、問題解決への手助けになると考えています。
論理哲学論考についてはこちらの本を一読することをお勧めします
https://www.amazon.co.jp/論理哲学論考-岩波文庫-ウィトゲンシュタイン/dp/4003368916
問題解決アプローチ
上記に挙げた4つの思考を頭にぼんやりと入れつつ、解決に対するアプローチをとっていきます。
- 仮説段階
事実はわからないが対象に対して先の4つをもとに起こり得る要因を列挙していく。
-
部分特定
仮説に対しての検証や真実を見出す検証を繰り返す。
-
解決
問題がはっきりしている場合はその特定の対象に対しての解決取り組みを行う。
特定した対象がさらに細分化できるのであれば1の仮説段階に戻る。そして、対象の解決が行われる際に注意したい点があります。それは関係する要素への影響です。
それは対象と同じ特性を持つ要素かもしれないし、具体的に表現すると使用者やそこに関わるステークホルダーといった対象です。
その関連するものがわからない場合はさらに関連する事にまつわる分析をしていく必要があるかもしれません。
疑うのではなく明確にすること
哲学は特に目の前にあることを疑うことがおもきにあると感じますが、ヴィトゲンシュタインは「重要なのは疑うことではなく、当たり前の中身を明確にすること」と述べており自身の問題が正しい正しくないのではなくただただ明確にすることが大事であるのです。
明確にするという過程で自身の方向が止まらぬきっかけのために疑うという事をあえて使うのは良いかもしれません。
明確にすれば似たものが見つかる
対象の持つ要素が明確になれば、一方で考えていた在り方が他方でも成り立つことがわかります。この哲学とプログラミングという話も、この事と同じでより知れば知るほど類似点に気づき活用ができると私は考えます。
まとめ
哲学とは在り方を問う学問であると私は認識していますが、その在り方を問うことは問題解決の第一ステップでは非常に重要なことです。在り方を問うと類似するものも見えてきます。類似するものが見えると自分が経験してきた問題の方法が積み上がり応用が効きます。問題を捉える→要素分解→構造理解→類似の気づき それらを意識することが私が考える哲学を通したプログラミングの問題解決を行うコツであると考えます。
ただ考えすぎは思考が止まってしまう原因にもなりかねないので、あくまでもふわっと頭の隅においておくほうが良いでしょう。ここで問題解決の具体例については、あらゆる問題に対して柔軟に構えることから1つの具体例が必ずしも他の具体解決につながっているとは感じにくいもので解決する時のコツというのは非常に抽象どの高いかつ証拠のないものであり心構えであると私は考えます。そこに明確さはなく共感も得ようとするものではないと思います。
問題に対処する人物によってコツの掴み方も違いますのでこれらの捉え方も千差万別です。
ただ1つ思うことは哲学を意識すると自分の中の問題解決へのコツに広がりが見えるかもしれないということです。