主にJavaScript(Node.js、TypeScript含む)を使っているのですが、設計力というのはどのように身につけていけば良いものなのでしょうか?
※PHPやObjective-cの経験はあります。
教えてくれる人がいないため、本などで学ぶ訳ですが、いまいち、設計力が身についている実感も自信もありません。
MVCの概念、デザインパターン、オブジェクト指向、ドメイン駆動開発、関数型プログラミング、テスト駆動開発となんとなーく浅いですが勉強はしてきましたが、ちゃんと理解出来ているのかも謎ですし、身についているかというと中途半端ですし、なんというか、ダメダメなのです。
頭の中のごちゃごちゃしたものを整理しますと、こんなところでしょうか!
1.何をすれば、どうすれば設計力が身につくのか?
2.設計力がどのくらい身についているかを知る判断基準は?
3.そもそも、目指すべき良い設計とは?
4.設計の手順は?
尚、ここでの設計力という言葉が指す対象範囲は、インフラとかDBとか含まない範囲とします。(言葉を適切に使えなくてわかりにくいかもしれませんが、すみません。)
ぼやけた質問で恐縮ですが、よろしくお願いいたします。
なんとなく分かっていること
- テストしやすいコードは良いよね(疎結合、副作用を伴わない)
- 何か変更をする必要が出てきたときに、あっちもこっちも修正しないといけないコードは良くないよね。(凝集度の高い1つのファイルを修正すれば、他を修正しなくても全部解決!)
- 設計から離れるかもしれないけど、読みやすいコードはいいよね。(Lintツール、整形ツールが味方さ!)
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答11件
0
ベストアンサー
一定ラインまで育ったプレイヤーがそれ以上のステップに進むには反省が必要になります。
上手くなるに従って、殆どのプレイヤーには変な癖がついてしまいますのでそれを取り払う事が必要です。
- スポーツ選手はコーチにフォーム等を見てもらいながら修正・矯正していく
- 演奏家は自分の弾いた曲を録音して、駄目な所や苦手な所を反復練習する
- 棋士は対局後、譜面を再現し直しながらこの手は良かった悪かったと検討する
- 格ゲーの上級者は対戦後、キーディスプレイのリプレイを見ながら注視すべき箇所や判断の問題点を洗い出す
この辺は脳モデルの話なんで割愛
成長の方法
プログラミングの世界もこれの例に漏れず、
作ったものに対して評価、何が良かったのか悪かったのかの分析をするべきです。
以下は詳細設計に絞って解説していきます。
TypeScriptやPHPはオブジェクト指向寄りの言語なんで、基本的には1ファイル1クラスでしょう。
従って、多くのファイルをまとめるディレクトリの切り方が詳細設計の力量として現れてきます。
ディレクトリの切り方はプロジェクトの立ち上がりにしか経験出来ないものなんで、
既存のプロジェクトやGitHub等に上がっているディレクトリの切り方をひたすら批評していきましょう。
自分でしょぼいCLIツールみたいなものを沢山作ってみるのも良いと思います。
- このプロジェクトのディレクトリの切り方はかっこいいな
- このプロジェクトのディレクトリの切り方は糞、俺の方がもっとこう…ってあれ?
実現出来ないから修正してたら結局同じ構成になったんだが
…等と言った試行錯誤が必要です。
この時に重要なのは評論家で終わらずに実際に作ってみて良くなったのか良くなかったのかを振り返ることです。
私も自分のGitHubに上がっているプロジェクト群を見て目を覆わんばかりのゴミプロジェクトの山で恥ずかしく感じます。
恥ずかしいってことは、今は成長してるわけですね。
成長の実感
プログラミングの世界の技術力は目に見えず感覚でしかわからないものなので、
将棋の指し手の筋の良さと同じく絶対的な数値というのはわからないものです。
コンピュータ将棋が流行って+1000という数値で表せてしまった、みたいな画期的な技術が必要でしょう。
投稿2017/09/21 01:20
総合スコア21158
0
求められている回答にならず、申し訳ないのですが参考までに。
物事が習得出来ているかどうかを判断する方法として、「人に教えることが出来るか」という基準があります。
「人に教えることが出来る」という状況であれば、十分理解しており、そして質問されることがあっても回答出来るだけの知識が必要となるため、習得出来ていると判断しても良いと思います。
なんとなく分かっていることに書かれていることが、ソートコード寄りに書かれているのでそういう話であれば
デザインパターンなどが知識ベースであり、それを実践で使えれば問題ないと思います。
投稿2017/09/21 00:17
総合スコア1336
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/09/21 00:32
0
質問はコーディングの設計力のことのようですね。
私にとってその意味での設計力とは、以下の2点です。
1.設計のパターンを多く知っていること
2.場合によって利用価値の高いパターンを取捨選択できること
それを踏まえて以下質問に答えてみます。
1.何をすれば、どうすれば設計力が身につくのか?
2.設計力がどのくらい身についているかを知る判断基準は?
他人のコードを読んでください。GitHub等であれば無数のコードに触れられるでしょう。
まず読んで理解できるかどうかが第一関門で、理解できないようであれば、自分の中に足りないパターンがあるということです。
いいと思ったパターンは取り入れ、悪いと思ったパターンは改善案を自分で考えてみて下さい。
どんな人の書いたコードでも、そこで利用されているパターンやその人特有の癖のようなものを読み取れるようになれば、かなりのものだと思います。
3.そもそも、目指すべき良い設計とは?
4.設計の手順は?
一律に良い設計というのはなかなか難しいものです。
良いと思う設計パターンを場合に応じて取捨選択し利用していくということが「良い設計」の判断基準かなと思います。
そのためにも、自分の中でどれだけ良いパターンを知っているかが良い設計をするための条件となります。
ただ、コード自体の可読性などであれば「良いパターン」ということが分かり易いのですが、保守性など、時間が経過しなければ理解できないものもあります。
重要なことは、より良い設計に向けて感度を上げて、それを忘れないことだと思います。
例えば、以前は理解できなかったパターンも、保守の場面になってみると「ああいうパターンにしておけばよかった」と思えることも多いはずです。
そういったパターンについても、後から反省し自分のものにできるかどうかが成長を左右すると思います。
投稿2017/09/21 04:01
総合スコア1947
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2017/09/21 12:00
0
主観の影響が大きい質問内容なので、一つの意見としてみてもらえれば。
1.何をすれば、どうすれば設計力が身につくのか?
- 数を多くこなす
- 他のシステムがどんな設計で動いていそうか考えてみる(自分だとこう作るかなー。みたいな)
- 他のシステムに触れる
2.設計力がどのくらい身についているかを知る判断基準は?
- 一つの要件に対して、いろんな設計方法を上げられる
- 個々の設計方法についてのメリット・デメリット(+出やすい問題)を理解している
- 多くのシステムで採用されている(基本とされている)手法を取り入れている
- 他の人に見て(聞いて)もらう
3.そもそも、目指すべき良い設計とは?
抽象的ですが「変更がしやすく、システム的に破綻の起きにくい構成となっていること」かなと思います。
テストしやすいコードは良いよね
何か変更をする必要が出てきたときに、あっちもこっちも修正しないといけないコードは良くないよね。
これらも変更しやすくするためのテクニックと考えています。
テストがある = 変更に問題がないかすぐに確認ができる(心理的な障壁の低下)
変更箇所が少ない = 影響範囲を限定しやすい
投稿2017/09/21 00:31
総合スコア421
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2017/09/21 23:11
2017/09/22 02:26
0
そもそも論ですが、システム・ソフトウェアの設計って どのようにデータ構造を作るか?それをどう利用するか?であって、コードがどうとかでは無いと思います。
MVCの概念、デザインパターン、オブジェクト指向、ドメイン駆動開発、関数型プログラミング、テスト駆動開発
上記は実現方法なので、先に根っこを押さえたほうが良いかと。
投稿2017/09/21 01:31
退会済みユーザー
総合スコア0
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2017/09/21 09:52 編集
退会済みユーザー
2017/09/21 11:58
退会済みユーザー
2017/09/21 23:16 編集
退会済みユーザー
2017/09/22 00:13
退会済みユーザー
2017/09/22 00:28
退会済みユーザー
2017/09/22 00:32
退会済みユーザー
2017/09/22 00:45
退会済みユーザー
2017/09/26 05:08
0
1.何をすれば、どうすれば設計力が身につくのか?
数を熟すことですが、結果(実装や運用してみて等)のフィードバックは必須。
2.設計力がどのくらい身についているかを知る判断基準は?
結果からじゃないでしょうか。手戻りが無かったか?システムが安定しているか?保守性に問題無いか?等
3.そもそも、目指すべき良い設計とは?
終着点は無いのでは。次はもっと良い物をと考え工夫していく事じゃないですかね。
4.設計の手順は?
手順というか設計力と言われているものにも関係しますが、如何に本質を捉えられるかが鍵だと思います。
その為に、多角的な視点からシミュレートして、本質と言えるかどうかをブラッシュアップする。
※あくまで、主観に過ぎないですけど。
投稿2017/09/21 01:16
総合スコア25138
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2017/09/21 23:13
2017/09/22 02:24 編集
0
初めまして!
今更かもしれませんが、
自分も今まさに設計を学んでいるところで同じ悩みを抱えています。
参考になるか分かりませんが、自分がやっている方法としては、
・設計やオブジェクト思考に関する本(理論と実例が載っているもの)を読む
・1章読む毎にその章で言われていることから自分のプロジェクトで使えそうなものをピックアップして、
その理論に従ってリファクタリングする
というものです。
一度本を読んで、その後ゼロから設計しようとして見たのですが、
経験が無いためかどこから着手して良いかわからず結局進みませんでした。
そこで上記のように、既存プロジェクトの設計を見直す(リファクタリングする)ことから始めて見ました。
最初は「設計」というより、読みやすいコードを書くためのリファクタリングから始めましたが、徐々にクラスを分割したり、デザインパターンを使ってみたりと難易度をあげています。
やっていくうちに、うまくクラスを分割出来て、書籍にあるような理論通りにできることもあれば、うまくいかずえ調べた上でやり直すことも出て来ます。
そういった経験を通して少しずつですが本で読んだ設計の理論が実践レベルに落とし込まれて来ている感覚があります。
あとは出来る人に叩いてもらい改善する経験が無いのでそこが今の課題です。
上記の方法で全体を網羅的に学ぶことは出来ないかもしれませんが、
一個ずつ身についていっている感覚は得られるので、最初の入りとしては良いのかな、と思っています。
私はプログラミングを始めてまだ数ヶ月程度なので、レベル感的に上記のやり方は質問者様に合っているか分かりませんが、何かしら参考になれば幸いです。
(ちなみに、今は「現場で役立つシステム設計の原則」という本を読んで実践しています)
投稿2017/09/26 19:05
総合スコア70
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2017/09/26 23:41
退会済みユーザー
2017/09/26 23:42
0
こんにちは。
一つ具体的な提案をあげてみます。
「なんとなく分かっていること」のことを知っているのであれば話は早いです。
それを雑に一言でまとめると「再利用性の高い設計」と表現することができます。
そして、最も身近であろう再利用性の高いコードとは、ズバリ「フレームワーク・ライブラリ」です。
今まで使ってきたライブラリの中で「使いやすかったAPI」を思い浮かべて下さい。それがどのように実装されているのかをソースコードから読み解いてみることを提案します。使いやすいAPIは大抵が良い設計となっているものです。
さらに、机上で学んできたオブジェクト指向やデザインパターン等を「どのように実戦投入しているのか」を知ることができるため、書籍等では理解しにくい「その設計を用いる理由」に強い説得力を得られます。百聞は一見に如かずというやつですね。
大規模ライブラリに対して本腰を入れてガッツリ構造を読み解くも良いですが、Node.jsなどはソースコードへのアクセスが容易い文化なので、例えば何かのライブラリを利用する度にさらっとそのインターフェースの設計や内部構造を探るクセを付けてみると、設計手法やノウハウなどを最速で身につけることができるようになります。
投稿2017/09/21 01:56
総合スコア4103
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2017/09/21 23:19
2017/09/22 02:53
退会済みユーザー
2017/09/26 05:06
0
「設計」というのはある程度のセンスが必要になってくると思います。センスがない人にいくら教えても、ある程度までは行けるかもしれませんが、どこかに壁があるようで、その壁を乗り越えられないようです。
情熱だけでもダメですし、資質だけでもだめで、まとめ上げていく能力が必要になってきます。
どうやって身につけていくか?はなかなか難しいですが、経験が押し上げてくれる部分は結構あると思います。しかし経験を積むには年数が必要になります。それを飛び越えて力をつけるには並大抵の努力ではなかなか難しいでしょう。
まあ、前を向いてひたむきに進めば、気がついたときにはかなりの実力がついている、だろうと信じて頑張るしか無いですね。
努力と我慢ができないのであれば、そこそこでお茶を濁すか、早々に別の道を探すかのいずれかと。
まあ、偉そうなこと言ってますが、私も結構お茶を濁してきた方です(笑)。
投稿2017/09/21 08:37
総合スコア3579
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2017/09/21 11:54
0
私もhayatomoさんと同じような設計してます。
つまり、適用できるパターンを知っていて使えるようにしておくこと、テストしやすいようにしておくことです。
また、私の場合はコーディング力が無くこまごまとバグを作るので、バグの原因がソースコードが読みずらかった(=設計が悪い)とみなして改善することです。
どこまでを求めているか分かりませんが、私の場合は結構これだけでそこそこ満足がいくコードに変化していくのが面白いです。(疎結合やネーミングルールなども、自然とこのやり方で、問題として浮かび上がってきます。)
あとは、他の人みてこの人はなぜこんなまずい設計をしたのだろうと考えます。そして、その人の欠点分野についてのパターンを書籍などで調べ、場合によって非公式のリファクタリングをして反面教師とます。(設計が上手い人のは参考になりますが、書籍などの方が身になるなと感じています。)
スキルを細かく上げていくと膨大な量になりそうなので、私は少しずつ身に着けていくつもりでいます。
投稿2017/09/21 08:09
総合スコア2883
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2017/09/21 23:21
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2017/09/21 23:14