設計力向上について考える

現場で設計力をまずは徹底的に鍛えようとのお達しがあった。
やるからには周りの誰よりもずば抜けた設計力を身につけたいと考えている。
ここでは設計力向上のために調べた(インプットした)ことをまとめる。

とりあえず、「プログラミング 設計 上達するには」でググって出てきた下記10記事を読んでアウトプットしてみる
- https://qiita.com/yiwiy9/items/6920a9e27bd0abbb7416
- https://www.bold.ne.jp/engineer-club/program-design
- https://note.com/erukiti/n/nfe26d674842a
- https://nodamushi.hatenablog.com/entry/2017/12/06/035624
- https://note.com/simplearchitect/n/n372de6190485
- https://taiyoproject.com/post-339
- https://tech.quartetcom.co.jp/2017/10/30/building-up-basic-skills-of-program-design/
- https://products.sint.co.jp/ober/blog/programdesign
- https://qiita.com/kojimadev/items/99d2aa1c9bc67a835480
- https://www.reddit.com/r/learnprogramming/comments/16wv38d/how_do_i_get_better_at_software_design/?tl=ja

1. 2年やって感じたプログラミングの上達方法
URL: https://qiita.com/yiwiy9/items/6920a9e27bd0abbb7416
ざっくり要約
- 全体の感想としては師匠を持つってのはいい考え方だなと。技術職はいかにこだわれるかが大切で、一流のこだわり=一流の技術だと以前教わったことを思い出した
- 肝心の設計部分については「問題を解決するために自分で考える力をつける」と言い換えられており、確かにその通りだなと。設計って結局は仕様という問題に対してどういう解決策を提示できるか、でしかない。
- レビューしまくるのは賛成。その際、「〇〇を書いたのは△△だからですか?」に加えて「〇〇ってこういう意図で実装した感じですか?」「ここは〇〇という風にも実装できますが、あえて△△のように実装したのですか?」みたいな感じで書き方にレパートリーを増やすとさらに実装の背景を考えることができそう。

2.プログラム設計の本質|プログラム設計のコツや実践的な流れ
URL:https://www.bold.ne.jp/engineer-club/program-design
ざっくり要約
- プログラムを組む場合も他のモノづくりと同様にきちんと何をどう作るかを考えてから作ること。他のモノづくりと違ってプログラムのいいところは気軽にトライアンドエラーができることだが、高品質なコードを書くには設計は不可欠。
- 何でも出来るコードは何も出来ないコード。処理内容が複雑かつボリューミーになると、その後の変更や何か不具合が起こったときに対処しづらくなる。一つの単位に一つの処理がベスト。
- 設計の本質は、プログラムに意味をもたせること。プログラムの意味は抽象化で発見すること。また、プログラムの設計は人間に向けて行うもの。コンピューターはどんなにコードが複雑でもただ実行するだけ。実行させるようにプログラムを組むのは人間。その人間が理解して実装できるように設計をする。

// TODO: 下記、設計ツールについてあまり深く知らないので、調べて言語化する。
- ユースケース図
- クラス図
- 状態遷移図
- アクティビティ図
- シーケンス図

3.プログラミング上達したい人に繰り返し読んで欲しい4冊
URL:https://note.com/erukiti/n/nfe26d674842a
ざっくり要約
- 設計力はテストが出来るかどうかで変わる
- メンテナンスのしやすさを得るためにはリファクタリングは必要不可欠
- クリーンアーキテクチャ本は広範囲かつ基本的な設計について学べる

// TODO:下記の本を買って読んで知識を体得する
- Clean Architecture 達人に学ぶソフトウェアの構造と設計
- レガシーコード改善ガイド (Object Oriented SELECTION)
- アジャイルサムライ−達人開発者への道
- リファクタリング(第2版): 既存のコードを安全に改善する (OBJECT TECHNOLOGY SERIES)

4.初心者がプログラムの設計を出来ない理由を考えてみた
URL:https://nodamushi.hatenablog.com/entry/2017/12/06/035624
ざっくり要約
- 設計するためには処理を理解し、分割しまとめて、再構築する必要がある。
- 処理を分割し、まとめて、再構築することが出来ない。原因は、観察力、考察力、説明力、データの概念が不足しているから。処理内容を3行で説明出来なければ上記のどれかが不足している。
- データの概念において、必要なデータ以外のデータがあることは悪と考えてしまって設計が出来ないパターンもありえる。つまり、データ処理上は必要なものを不必要を判断することで、必要な処理を再構築出来なくなり、設計ができなくなる。

メモ
この記事めちゃくちゃ良かった。
自分が言語化出来ていない箇所をズバッと的確に表現してくれていた。
また、no.2の記事内でも出てきたが、ほとんどの処理は「入力」「処理」「出力」でしかない。
「理解には基礎知識が大切で、基礎知識の身につけ方はまずは全体をざっと知る」ってのは改めて大切な考えだなと思った。とりあえず目の前の機能が動けばいいや〜的な短絡的指向になりがちだった。そもそもWebアプリケーションの全体像から学び直そう。

5. 筋肉ですべてを解決する人のプログラミング上達方法
URL:https://note.com/simplearchitect/n/n372de6190485
ざっくり要約
- 記事に出てくるレジェンド筋肉エンジニア(ここでは勝手に筋さんと呼びます)の方のスキル習得方法は「ドキュメントを全部読む」「関連する動画を10本見る」「公衆の前で発表する」「資格を取る」という流れ
- 設計については、スピード意識で設計と実装がごっちゃになって進む場合があるが、その場合でも、一度プログラムから離れて、紙に実装手順を書いてTODOリストに入れて順番に機能を実装していくってのが効果的
- 設計には要件が重要なので、その要件をリストアップしておくことも良い

メモ
設計と直接関係ない内容もあったが、どれも有用で今後に使えそうだった。こういう思わぬ収穫ってしばしばあるけど、遭遇するとラッキー!っていう気持ちになってなんかいいよね

6.【初心者向け】超速でプログラミングが上達する方法【10年先まで戦う】
URL:https://taiyoproject.com/post-339
ざっくり要約
- 入門書を別の著者で3冊手を動かしながら読破して基礎をつける
- コーディングのアンチパターンを実感することは有用
- プログラミングの上達した=端的でわかりやすいコードが書ける

メモ
コーディングアンチパターンについて
設計に関する記述はなかったが、コーディングアンチパターンを知るなぞ考えてもなかったので、早速取り掛かってみる

7.プログラマーの設計力を伸ばすための土台づくり
URL:https://tech.quartetcom.co.jp/2017/10/30/building-up-basic-skills-of-program-design/
要約
- 設計力は学びづらい。場数の上手な踏み方を知っていないと、ただ場数をこなすだけでは確実な設計力は身につかないし、そもそもためになる設計(変数名の変更みたいな軽い修正じゃなくて機能追加みたいな大きな実装)に数多く当たるとは限らない。設計してから機能をリリースしてそのフィードバックをもらうまでに時間がかかり、改善行動につなげるまでに時間がかかるから。
- 設計力向上の基礎は「論理的思考力」と「技術知識」。**論理的思考力とは「物事を何らかの観点で分類・整理する力」「論理的に筋道を立てて主張を述べる(検証力)」「複数のとりうる立場を検討し、それぞれの立場から見る能力(批判的思考力)」のこと。**技術知識はないとお話にならないのは言うまでもない。
- 設計力を向上させるには「変数などの名前でなぜその名前をつけたのかを説明する」「実装した処理で何をやっているか説明する」こと。自作機能の場合はあえて仕様変更して実装内容の良し悪しを判別し、仕様に合う実装をする。

メモ
ここでも出てきた論理的思考力。自分で実装した機能や自分で名付けた変数など、なぜそうしたのかのプロセスを意識的に明示してこなかったからな。だから自分は設計が弱いのかもしれない。