2015.11.6
0からはじめるPHP#51【開発基礎知識#1-アジャイルとUNIX哲学-】
#41から#50にかけてアジャイルという概念を取り入れよう
として失敗した掲示板開発というものを行ってきました。
画像は開発中の画像で、今は返信フォームを作っています。特に新しい知識も要らないのでこっから先は記事にはしません。
さて、
前回次は
音楽素材ページの改修を行うと言いましたが、それに先立ってこの掲示板開発の反省点を、ということで
基礎知識の復習をしようかなと。
僕の悪い癖とかも含めて、5回ぐらいに分けて色んな知識というか
留意点や、将来知っておくべき知識みたいな話を書き連ねてみようかと思います。
こういった知識的な話は、僕自身もあまり好きではないので、先にモノを作ってから反省という形で学習するのが一番ストレスフリーですし、何よりわかりやすいですしね。
で、今回は
アジャイルと、それに関連した
UNIX哲学について触れてみることにします。
さて、アジャイルとは
短いサイクルをぐるぐる回す開発手法と思っていたのですが、それだと少し語弊があると思うのです。
まず最初に、
wikipediaの文章を引っ張ってみましょう。
アジャイルソフトウェア開発手法の多くは、反復 (イテレーション) と呼ばれる短い期間単位を採用することで、リスクを最小化しようとしている。 1つの反復の期間は、プロジェクトごとに異なるが、1週間から4週間くらいであることが多い。
アジャイル開発手法においては、開発対象を多数の小さな機能に分割し、1つの反復 (イテレーション) で1機能を開発する(⇒反復型開発)。 この反復のサイクルを継続して行い、1つずつ機能を追加開発してゆくのである。 おのおのの反復は、小規模なソフトウェア開発プロジェクトに似ている。 各反復では、それまでに開発した成果物に1つの小さな機能を追加する。 計画、要求分析、設計、実装(コーディング)、テスト、文書化といった、ソフトウェアプロジェクトに要する全ての工程を、1つの反復内で行う。
アジャイル開発手法では、各反復が終了するごとに、機能追加された新しいソフトウェア (ビルド) をリリースすることを目指す。 各反復が終了するごとに、プロジェクトチームは、プロジェクトにおける優先度を評価し直す。
ここで僕が失敗したのは、二段目の
開発対象を多数の小さな機能に分割というのができていなかったことだと思うんですね。
この部分的な開発っていうのが
コーディングに於いて一番重要なのです。頭では分かってるんですけど、ついついスパゲッティコードを書いてしまうんですよね。その原因は、ちゃんとした設計を立てずにただ闇雲に作っているからに他なりません。
その具体的な指針については次回に取り上げる予定の
「XP(エクストリーム・プログラミング)」とか
「テスト」といった概念を取り入れる必要がありそうなのですが、今回はそれはおいといて
UNIX哲学というものを紹介します。
UNIX哲学については、
具体的にはwikipediaを参照してもらえれば良いのですが要点だけかいつまんで紹介したいと思います。
いくつかの流派に分かれていますが、重要そうなとこだけをピックアップして、その細かい背景には触れません。
・一つのことを行い、またそれをうまくやるプログラムを書け。
これを噛み砕いて言えば
全部関数にしろっていうことで良いと思います。
これはレイモンドの
モジュール性のルールでもありますし、ガンカーズの
できる限り早く原型(プロトタイプ)を作れにも当てはまると思います。
要するに、1つのことを行う関数を先に考え、引数と戻り値を先に決めてから内部の構成を考えよ、ということです。
そして、そういった関数をたくさん用意し、後はモジュール的にそれを組み立てると見やすいコードになるのでは、と。
・全てのプログラムはフィルタとして振る舞うようにせよ。
つまり、ほぼ全ての関数は
フィルタのようなものとして考えられるべきなんですね。
この関数にあるものを通したら、こんなものが返ってくる。例えば、データベースから欲しいデータを持ってくる時、引数に数字を入れたらそのidを持つオブジェクトが返ってくる、とか。
まぁ別に当たり前の話なんですが、こういうのが用意できるとすごいプログラミングって捗るんですよね。そして、それは最初の設計の時点で決定づけられます。
僕の大きな失敗は
関数を効果的に扱えてなかった点が痛いと思っています。
そのため雑多なコードになってしまいましたし、その場の思いつきで書いているのでバグも多いです。こういったところを反省すべきだなと感じました。
・効率よりも移植しやすさを選べ。
ちなみに、これは意識して作ってます。何があるか分かりませんからね。
テーブル名なんかは静的変数に格納して、そこだけ変更すれば全部の箇所が変更されるように作ってます。
まぁ、僕自身が
設定大好き人間なので、可能な限り全てのものを設定によりどうにかできるようにしたいなと。
掲示板で言えば、理想を言えばちょっと組み替えるだけで全ての機能が変更可能・・・・・・というのがいいんですけど、さすがに限度があるんで難しいですかね。(笑)
あ、余談ですが掲示板に関しては、このシリーズと並行して
また1から作りなおしてみる予定です。
ほんとに効率的なロジックを組めれば、実際の作業量としてはそんなに多くないと思いますし、基本はコードのコピペなんで今完成しているところの実装自体は1日でできると思います。
っていうか、現段階でまだやってない作業って
返信機能ぐらいしかないですしね。ちょっと上手いことコードを書けそうにないというか、ちょっとロジックが悪いと思ったんで組み直そうかなと。設計の練習も兼ねて。