Archive for 3月, 2009

何から手をつけたらいいのかわからない時

新しい企画を作る時や、プログラムの要件定義を作る時、ユースケースなどを考える時に、何から手をつけたらいいのかわからなくなる経験があるかと思います。
このエントリは小ネタだし、誰でも思い浮かぶことではあるのですが、メモ程度で、このような時の僕の取り組み方を記述します。

「問題の具体化・細分化」
なぜ、何から手をつけていいのかわからないかというと、今自分がやろう!としていることがよく見えていないからなんだと思うのです。
たとえば、ソーシャルブックマークのシステムを作ろう!と考えた時に、いざユーズケースを考えようとしても中々はかどらない。。。なんてことがあると思うんです。
そんな時は、対象物(ここでいうソーシャルブックマーク)という機能を実現させるために具体化・再分化してみるといいと思います。
いきなり全部の機能について仕様書やユースケースを書こうとしてしまうから、行き詰ってしうのであって、必要な細かい機能に分解してから書くとかなりすらすら書けたりします。

Aという機能を作りたいのであれば、まずAを実現させるためには、大きく分けてA-1、A-2、A-3という機能を作らなければならない。では、まずここから仕様書を書いてみよう。といった具合に。
たとえば、上記のソーシャルブックマークの場合だと、これを実現させるためには、まずフロントエンドの仕様を決めないとなりません。ユーザが任意のwebページにブックマークができることや、それを共有できることなどなど。これをA-1とすると、バックエンドでは、定期的にユーザのブックマークをカウントして、ランキングを生成したいといった機能をA-2とする。などなど、対象物を再分化することによって考えなければならないことがもりもり!と出てきます。

よく「とりあえず手を動かせ!そうすれば進みだすから!」みたいなことを聞くのですが、それは確かに事実だと思います。でも、「とりあえず!」というのができないときは、今一度今抱えている問題が何なのかを具体化・細分化してみることから初めてみませんか?これはプログラミングのみならず、企画にも応用できると思います。

※注意 プログラムを作る手順は人・流派によって最適な手法はまったく異なります。今回はあくまで、何かをしようとしたときに行き詰ったときの一例としてプログラミングを用いましたが、プログラミングの工程で今回の内容が最適であるとは思っておりません。

perlの使用メモリサイズを取得する

perlのプログラムを走らせていて、長時間走らせれば走らせるほど、そのプログラムのメモリサイズが増大していってしまうことがあります。
そのプログラムが何かしらのでデータをメモリ上にキャッシュしていくモデルならばそれは、当然のことなのですが、プログラムが巨大化すればするほど、いったいどのオブジェクトがメモリを食っているのか発見するのに困難になります。

そんなときは、Devel::Sizeが便利です。このモジュールは任意の配列や、ハッシュ、クラスオブジェクトに対して使用しているメモリサイズを計算することができます。

以下のようにインスタンスオブジェクトに対してtotal_size()を使うとそのオブジェクトのメモリサイズがわかります。異常にメモリを食ってしまうバグなどを生んでしまった時などに便利です!

#!/usr/bin/perl
 
use strict;
use warnings;
use Devel::Size qw/size total_size/;
 
use constant TEST_NUM => 100;
 
package Class1;
 
sub new {
my $class = shift;
my %hash;
my $self = { hash => \%hash };
return bless $self, $class;
}
 
sub add_key {
my $self = shift;
my $key = shift;
$self->{hash}->{$key}++;
}
 
sub get_key_num {
my $self = shift;
my $key_num = keys %{$self->{hash}};
return $key_num;
}
 
package main;
 
my $cl1 = Class1->new();
for(my $i = 0; $i < TEST_NUM; $i++) {
my $rand = rand(10000);
$cl1->add_key($rand);
my $key_num = $cl1->get_key_num();
my $mem_siz = total_size($cl1);
print "key_num:$key_num\tmem_siz:$mem_siz [$i]\n";
}

Tags: ,