Friday, December 30, 2005

Semco and Ricardo Semler - Agile Industry?

Some Semco links:

CNN, 2004:
http://edition.cnn.com/2004/BUSINESS/05/19/go.semlar.transcript/

Excerpt from Semler's 2004 book "The Seven-Day Weekend"
http://www.nfib.com/object/4243663.html


Wikipedia entry on Ricardo Semler:
http://en.wikipedia.org/wiki/Ricardo_Semler

An excellent interview with Semler by CIO Insight, unfortunately dated April 1, 2004:
http://www.cioinsight.com/print_article2/0,1217,a=124700,00.asp
Very good stuff about corporate email privacy, among other issues, here's an excerpt from Semler:
...we searched far and wide for anybody who could tell us what kind of software or system could be installed on our [server] that would make it impossible for our own IT people to spy on people's e-mail. We did not find one. We had to customize one.

Friday, December 23, 2005

Working Effectively With Legacy Code

I'm preparing for a new contract (with Barclays Global Investors) where I'll be helping to improve a software developemnt process in a group that has many years of existing code, so I've been reading Michael Feathers new book "Working Effectively with Legacy Code" (http://my.safaribooksonline.com/0131177052).

So far, I really like the book - it quite modern, coming from an agile/XP approach and consistently emphasizes that the basic task is to get the legacy code under a test harness, so that changes can be made with fewer ulcers.

The book goes into many different examples of how existing code is resistant to being testable, and then shows (usually two or more) approaches for overcoming or workign around those problems.

Another reason I like that the book is that Feathers consistently emphasizes how hard this is - no magic solutions, ugly compromises often required, etc. but that you can make big progess out of many small steps.

Sunday, November 27, 2005

Unit Testing in Perl with Test::Unit

I've come to prefer Test::Unit over Test::More. The main reason is that in Test::Unit you define each test as a separate subroutine, so the variables used for one test cannot pollute another test.

Test::More is a widely used module for Unit Tests in Perl. With Test::More your tests look like this:
# Test method_a()
my $expected_1 = 23 * $CONSTANT; # some value we expect;
is( $expected_1, $object->method_a(23),
"method_a(23) returned expected value.");

my $expected_2 = 17 * $CONSTANT; # A new expected value
is( $expected_2, $object->method_a(17),
"method_a(17) returned expected value"
);

# Test another_method()
my $expected_3 = _get_favorite_color();
is( $expected_3, $object->another_method('favorite'),
"another_method('favorite') returned proper color.");

my $expected_4 = _get_recent_color();
is( $expected_4 $object->another_method('recent'),
"another_method('recent') returned proper color.");

See how we need to come up with many versions of the $expected variable?

We could also just reuse it, but that can cause trouble if there are many tests and you forget to reset it.

It is better practice to use a different variable name for each test, but in many situations there are a couple dozen tests in that one file where it makes sense to use the same basic variable name for many different tests. That could lead to variable names like $expected_100. Also, there is always the risk that some temporary variables used for one test end up "polluting" a later test where the programmer didn't realize a variable was already defined earlier in the file.

The best solution is to isolate the code for each test, or small group of related tests into their own block, so that temporary variables for one test cannot interfere with another test or tests.

In Test::Unit each test is a subroutine, which can contain any number of assertions - so all the temporary variables and other setup for a particular group of tests are kept isolated from all the other tests. In addition, if you provide a subroutine called set_up() it is automatically called before running each test subroutine, and likewise, tear_down() is called after each test, this is useful for populating objects and test data structures, so that each test gets a clean set of test data to work with.

In Test::Unit the tests above might look like this:
sub test_method_a {
my $self = shift;

my $expected_1 = 23 * $CONSTANT; # some value we expect;
$self->assert_equals( $expected_1, $object->method_a(23));

my $expected_2 = 17 * $CONSTANT;
$self->assert_equals( $expected_2, $object->method_a(17));
}

sub test_another_method {
my $self = shift;

my $expected_1 = _get_favorite_color();
$self->assert_equals($expected_1, $object->another_method('favorite'));

my $expected_2 = _get_recent_color();
$self->assert_equals($expected_2, $object->another_method('recent'));
}
Test::Unit provides a bunch of assertion methods:
assert_equals / assert_not_equals

Tries to guess what kind of comparison to make. Usually works fine. If the first argument (the 'expected') is an object it checks if the == operator has been overloaded and will use it if so.

assert_num_equals,assert_num_not_equals,assert_str_equals,assert_str_equals

Force numeric/string comparison.

assert_matches(qr/PATTERN/, STRING, [, MESSAGE]), assert_not_matches

Assert that the regular expression matches.

assert_deep_equals(expected_ref, ref_to_test [, MESSAGE ])

Used to compare complex data strucrtures, like hashes of arrays of hashes. Assert that the the data pointed to by ref_to_test matches the data structure pointed to by expected_ref


See also:

Tags: ,,

Friday, November 04, 2005

Perl Best Practices

Damian Conway's new book, Perl Best Practices is a very good, thought provoking, and useful addition to any Perl programmer's collection.

From my point of view, the best thing about the book is that it provides a lot of food for thought - even if one disagrees with particular recommendations I think all the suggestions in the book areworth thinking about, and I am certain almost any reader will discover improvements they can make in their code and approaching to coding.

Tags: , perl

Sunday, October 23, 2005

PHP Comes to Eclipse

Martin Brown blogged about PHP coming to the Eclipse platform (back on Oct. 18th.) This interests me because I find that currently is the best cross-platform for , a language I like very much. (See my article at perl.com, "Perl Needs Better Tools")

Wargaming - another way of modeling the universe

I found a reference to myself in Kevin Trainor's blog, Wombat Rampant. The posting is about the decline of paper-based combat simulation games. Back in the 1970's I used to design and play , which to me, are part of my lifelong involvement with building things.