開発を3倍速にするプログラミングの考え方4つ
目次
開発を3倍速にするプログラミングの考え方
プログラミングは禅です。
それはとても奥が深いものです。
考え方次第によって、開発者のプログラミングの効率は大幅に変化します。
プログラミングにおける効率的な考え方とはいったいなんでしょうか?
それは以下の4つです。
テスト
リファクタリング
分割統治
抽象化
これらの基本的な考え方を押さえておくことで、あなたのプログラミングの開発効率は2倍、いや3倍になることでしょう。
私は日常的にプログラミングを行っていますが、↑に紹介した考え方は私は普段から実践しています。
これらの考え方は洗練され、数多くのメソッドから抽出された結晶と言えます。
では具体的に見ていきましょう。
まずは「テスト」からです。
(^ _ ^) | 奥深きプログラミングの考え方へ |
テストを実行する
「テスト」とは、そのプログラムが正しく動いているかどうかチェックすることです。
このテストはプログラミングによってテスト用のコードが書かれます。
そしてプログラムとしてそれらのテストコードは実行されます。
このテストは、プログラミングの開発効率を劇的に変化させる威力を持っているメソッドの1つです。
「テストを実行する」という考え方、「テスト・ファースト」という思想を持ちましょう。
この考え方を持つことであなたのプログラミングは1歩前に進んだものになります。
テストという考え方はなぜ重要か?
なぜテストという考え方が重要なのでしょうか?
さきほども述べましたが、テストはプログラミングによる開発効率を大幅に変化させます。
テストをするプロジェクトと、テストをしないプロジェクトでは、開発されるプログラムの質も開発期間も大きく異なります。
テストをしないプロジェクトでは、すべての機能が場当たり的に実装されます。
そして「あっちを変更したらこっちが動かなくなった」とか、「なにもしてないのにエラーになった」とか、そういう謎な現象がたくさん出てきます。
いっぽう、テストをするプロジェクトでは、すべての機能がテストされ管理されます。
コマンドを実行すれば書いてあるテストがすべて実行され、プロジェクトに異常があればすぐにわかるようになります。
これによって「あっちを変更したらテストが失敗したから検討しよう」という風に、場当たり的な対処に変化を与えることが可能です。
どのようにテストを実行するのか?
テストはすぐに実行できるようにしなければいけません。
テストはすぐ実行できるようにして、いつでも結果がわかるようにする
これは某開発者の言葉です。
(・ v ・) | だれだよ |
そのためコマンドラインから実行できるテストが一番お手軽と言えるかもしれません。
もっと良いのはツールによってプロジェクトを監視し、プロジェクトに変更があったらテストを自動実行するようにしておくことです。
こうすることで開発者はテストを実行する手間がなくなり、開発に集中できるようになります。
コードを書けば自動でテストが実行され、そのコードが周囲に影響を与えるようであればテストが失敗するのですぐにわかるようになります。
こうすることで開発者は、自分の書いたコードが周りにどのような影響を与えるのかを把握することが出来るようになります。
テストの種類
テストには様々な種類がありますが、代表的なテストは↓のような内容です。
単体テスト
結合テスト
システムテスト
「単体テスト」とはテストのうちもっとも基本的なテストです。
これは関数やクラスのメソッドが正しく動いているかどうかをテストします。
「結合テスト」とは、それらの関数やメソッドが組み合わさった時に正しく動くかどうかのテストです。
基本的な単体テストより1つ前に進んだテストです。
「システムテスト」とは、プロジェクト全体が1つのシステムとしてちゃんと機能するかというテストです。
このテストは開発の最終工程で行われることが多いです。
テストでは、まず「単体テストをやる」ように考えるようにしましょう。
単体テストは自動化も簡単ですし、最も基本的なテストで導入も楽です。
リファクタリングを行う
「リファクタリング」とは、すでにあるコードを書き直して、プログラムの健康状態を向上させる行いです。
リファクタリングを行うことによってプログラムが改善し、コードの管理がしやすくなります。
リファクタリングは英語では「Refactoring」と書きます。
辞書によるとリファクタリングは↓のような意味になります。
リファクタリングとは、プログラムの外部的振る舞い(動作)を変えることなく、内部構造としてのソースコードを変更することである。、リファクタリング、手戻り
リファクタリングはなぜ重要か?
リファクタリングを行う場合と行わない場合とでは、プロジェクトがとん挫する可能性がぜんぜん違います。
リファクタリングをしているプロジェクトは、とん挫する可能性がぐっと低くなりますが、リファクタリングをしていないプロジェクトは、高確率でプロジェクトがとん挫することでしょう。
それぐらいリファクタリングは、中~長期的なプロジェクトでは重要な考え方です。
リファクタリングという考え方を持つということ
リファクタリングという考え方を持つということは、プロジェクトに対する愛着を持つということです。
リファクタリングは開発者のプロジェクトへの愛着を向上させます。
リファクタリングをすることによってそのプロジェクトが目に見えて改善されるので、開発者はそのことが嬉しくなります。
嬉しくなると自然とそのプロジェクトに対して好意を持ち、ある種の恋人のようにプロジェクトと接するようになります。
リファクタリングをしないとプロジェクトの機嫌がわるくなるのが、開発者にはわかるようになります。
リファクタリングという考え方を持つことによって、開発者はそのプロジェクトと密に接しようという気になるのです。
(^ _ ^) | リファクタリングはデートみたいなもの |
分割統治
「分割統治」とは、1つの大きな問題を複数の小さな問題に分割し、これらの小さな問題を1つずつ解決していく考え方です。
分割統治がうまい開発者は結果的にプログラミングもうまくなります。
それぐらい重要な考え方です。
分割統治(ぶんかつとうち)が重要な理由
開発者はプログラミングにおいて、さまざまな問題に直面します。
それらの問題を解決するのがプログラミングです。
分割統治はその問題の解決を手助けします。
分割統治を行わないと、コードが汚くなり、プロジェクトの保守性も下がります。
開発者はプロジェクトへの愛着が薄れ、まともにプロジェクトについて考えようとしなくなります。
しかし分割統治を行えば、これらの問題は解決します。
分割統治の考え方
分割統治の基本的な考え方は、先ほども述べましたとおり大きな問題を小さな問題に分割するということです。
たとえば1000行の関数があったとします。
分割統治ではこの関数を200行の関数5つに分割して考えます。
そうすることによって関数の使い勝手が上がり、再利用しやすくなります。
問題が分割されることで、その関数内での実装もしやすくなります。
各関数は引数と返り値というインターフェースによって結合されますが、うまく分割統治ができていればこれらのインターフェースがストレスになることも少ないです。
抽象化
「抽象化」とは、複数ある細かい問題を1つにまとめて、それらの問題を抽象的に扱うことです。
抽象化はプログラムの開発効率を劇的に変化させます。
これを行うとプログラミングにおける時間が節約されます。
抽象化という考え方は、プログラミングの王様と言っても良い考え方かもしれません。
プログラミングのスペシャリストになりたければ抽象化の腕を磨きましょう。
それぐらい抽象化は奥が深いテーマであり考え方です。
抽象化が重要な理由
抽象化を行わないプログラミングでは、コードが詳細になり、開発者の負担が増えてしまいます。
開発者の負担が増えると、その開発者はプログラミングが楽しくなくなります。
プログラミングが楽しくなくなると、そのプロジェクトへ貢献しようという気が薄れます。
そうなるとプロジェクトは進展しなくなり、放置気味になっていきます。
抽象化をすればそれらの問題は解決します。
複数の詳細な問題が1つの抽象的な問題になって、開発者の負担を減らします。
抽象化を行うことによって開発者はプロジェクトへのモチベーションが上がり、もっと開発をしようという気になります。
これは、プログラミングの楽しさにもつながります。
プログラミングが楽しいという人はこの抽象化が上手なことが多く、いっぽう楽しくない人はこの抽象化が下手なことが多いです。
抽象化の考え方
抽象化の基本的な考え方は、複数行のコードを1つの関数にまとめるということです。
このとき関数を作ることが抽象化を行うという行為になります。
雑多なコードはいたるところに変数がころがっていて、見るも無残であることが多いです。
これらの惨状を1つの関数にまとめ、関数の引数と返り値でもってインターフェースを整えることが抽象化です。
抽象化は便利ですが、その実行にはある程度の経験と勘が要求されます。
まったくの未経験者はこの抽象化をむずかしく感じることでしょう。
しかしスキルが上がればこの抽象化は楽しくなっていきます。
それでも難しいことに変わりはありませんが。
(^ _ ^) | 抽象化は難しい |
おわりに
いかがでしたでしょうか。
今回は基本的なプログラミングの考え方について紹介しました。
繰り返しになりますが、基本的な考え方は↓の4つです。
テスト
リファクタリング
分割統治
抽象化
これらのプログラミングにおける考え方をマスターすることによって、あなたのプログラミングスキルは大幅に向上することでしょう。