2022-02-12 CS 旧来の設計技法を学びなおす

2
ほえほえ@スプシマン @hoehoe1234

昔の設計について書かれた書籍には綺羅星の如く知見とヒントが隠されているのを実感します。プログラミングに必要な要素技術にうもれてきましたし、また実際それは必要なんですが「設計手法」という背骨、骨格がないと結局は偽物なんだと今、痛感しています。

2022-02-11 05:37:41
ほえほえ@スプシマン @hoehoe1234

極論を言えば、設計にはトップダウンとボトムアップしかなくてこれが幾重にも機能、データと違う属性を対象にしながら重層的にかさなっているんですけど、そのようなことは「すでに発見されている」んですね。機能とはなにか?データとはなにか?みたいなことも書かれていますね。

2022-02-11 05:39:44
ほえほえ@スプシマン @hoehoe1234

機能と機能がつながるためにはデータを共有するしかないんですね。そりゃそうですよね。機能は(狭義の)実行コードであり、機能同士は別のメモリ位置にある別のコードなんですから。お互いをつなぐにはデータという仕組みが必要になりますね。

2022-02-11 05:41:13
ほえほえ@スプシマン @hoehoe1234

機能というとわかりにくいので関数という言葉を使います。関数Aと関数Bがデータを共有するには2つの形式があります。 ①戻り値と引数を利用して関数Aが関数Bを呼び出す。 ②関数Cがコーディネータとして関数Aを呼び出してデータを取得後、データを関数Bの引数として関数Bを呼び出す。

2022-02-11 05:44:05
ほえほえ@スプシマン @hoehoe1234

どちらも関数Aと関数Bで情報を共有していますが、①と②の差を言語化して理解することはかなり重要なポイントになります。これがわかっていないと関数分割をうまくできないといってもいいでしょう。答えは書きませんのでもし興味があれば考えてみてください。

2022-02-11 05:45:52
ほえほえ@スプシマン @hoehoe1234

教えることによる脳の活性化?レディネス効果はすごいものがありますね。本職時代にはわからない、重要ではないと思ったことがこれほど大切だったんだなという発見がたくさんあります。設計が俯瞰して見えるようになったような感覚なんですね。業務をコードに落とすには何がどういう理由で必要で

2022-02-11 05:47:45
ほえほえ@スプシマン @hoehoe1234

自分がいま何を記述しようとしているのかが見えるようになりました。いや、その能力、本職時代にほしかったですけど。点と点がつながってあとになって見ると線になる話は有名ですが、数多くの経験が一つのルール、考え方でつながる経験をしました。理由は旧来のモジュール分割手法を学んだことです。

2022-02-11 05:49:55
ほえほえ@スプシマン @hoehoe1234

そんなものは現役時代にたくさん読んではいたのですがその裏にあるルールとか仕組み、全体を通じての関連性がまったく理解できてなかったんですね。他の表現をすれば「コードをパクっていた」に過ぎなかったということです。

2022-02-11 05:51:14
ほえほえ@スプシマン @hoehoe1234

多くを言う必要はないと思います。手法を知るとはその裏に隠れた思想とか関連を見出して言語化しなければそれは単にコードのコピペと同じということです。目の前の問題を解決できますが浅いということです。別に深くなる必要はありませんが「偽物」であることは自分が知っているわけですね。

2022-02-11 05:52:27
ほえほえ@スプシマン @hoehoe1234

このような経験からプログラミングレベルを高めるにはむずかしいですが次のような取り組みが有効と考えています。 ①②以下について人に教える機会を見つける ②旧来の設計手法を学ぶ ③基礎のアルゴリズムを学ぶ ④アプリのコードレビューをする いや、かいていてかなりこれむずかしいやん?

2022-02-11 05:55:44
ほえほえ@スプシマン @hoehoe1234

って感じになってしまいましたね。すみません。ひとつだけにしましょう。 ①人に教える機会を自分で作り出す ということです。自作アプリのコードレビューでもいいし、アルゴリズムの解説でも、業務の解説でもいいです。今勉強中のことでもいいですね。「人に教える」ことはズバリ「言語化」ですので

2022-02-11 05:57:09
ほえほえ@スプシマン @hoehoe1234

多くの、曖昧にしていたことがクリアになります。そしてそれがもたらす効果は「まとめて扱える」ってことになります。配列について言語化ができれば以後は詳細に関わらず「配列」っていう言葉だけで済むということですね。言語化すればするほど高度に抽象的にかつ正しく表現表現できるようになります。

2022-02-11 05:58:39
ほえほえ@スプシマン @hoehoe1234

これは直接プログラミング能力の向上につながります。プログラミング言語は言語ですので、日本語での概念の言語化ができれば同じ要領で関数を作れるようになるのです。関数が処理の連続ではなくて「概念」としての関数を抽象的に作れるようになります。この効果は大きいと思います。

2022-02-11 05:59:55
ほえほえ@スプシマン @hoehoe1234

抽象的に記述するとどういうメリットが有るかと言えば「組み合わせて使える」というこになります。そのレベルに達していない人のコードはすべてが具体的です。なので似たようなコードが多発します。これは保守性を著しく下げることに直結しますね。

2022-02-11 06:01:37
ほえほえ@スプシマン @hoehoe1234

よいコードは、もちろん具体的なコードが必要なのでうが、抽象的なコードを組み合わせて具体的なコードを作っている。といっていいかな?なんて思います。もちろん共通化の罠はありますけど。

2022-02-11 06:03:39
ほえほえ@スプシマン @hoehoe1234

関係のないことをいろいろ書きましたが、「教えること」により直接能力が向上します。これは比喩とかではなくて「教えることは知っていることを言語化することだから」です。言語化による抽象思考によりそれをどう使えばよいかがクリアにみえてくるからです。とりとめなくてすみません。 おしまい。

2022-02-11 06:05:11