Drawback that you might not aware in crashing your schedule

Typical scenario - you have a handful of features but your team can only finish part of them, now you want them to work overtime to do them all.

We all have this desire and probably have experienced this. You should have heard about the different draw back, like decline in quality, and a drop in morale. But there's one thing you might not aware.

Upon finishing your tasks, your team will get through a period of procrastination.

Why? They are paying the debt that have loan, just like the oxygen debt that build up through exercise. Your team will feel they have already done a lot and "deserved" to laid back a bit, to regain the momentum before marching forward for the new tasks. And this is the problem, the laid back usually drags on, and even when they can ramp up to move forward, they need time to get back to the momentum.

Thus, try to avoid the temptation to sprint. Keep the pace that your team that feels comfortable, and you can get a more consistent focus factor for each iteration.




Why you should buffer an additional day in your current project schedule

Someone call it an iteration, someone call it a milestone. Whatever it is named, it means the period of time for a cycle of software development.

The pace of development and the granularity of task in a project affects the duration of each cycle. Thus, the duration of a cycle may varies among different team and different projects. But for easier manipulation, one month or two months is the duration of time that will be adopted mostly.

I am sure you have read a lot of articles on how to structure the work into each cycle. But one thing I want to share with you is, reserve a day for packaging of your deliverable. If you are like me, who demand a release of the development that is capable to execute either a fraction or a complete set of functions at the end of each cycle, it is better to reserve a day for the team to tidy up their work and prepare for the release.

In my team, the deliverable for each release will include all or selection of the followings,

  • release notes (text file or an additional entry on the product web page)

  • change log

  • binary (e.g. compiled java classes, war)

  • program source

  • user guide (or any sort of document to describe the usage)

  • email announcement

  • tag a version on SVN




As you can see, the list is quite extensive and thus I feel it's easier for the team to spend a day for preparation. In turns, it helps them to review what they have achieved and give them a sense of satisfaction. With the release properly organized, it helps you (the project leader) to review the development as a whole. You can evaluate if the pace is proper and allow you to send out your product for testing or simply to experience at the earlier stage.

What is the perfect team size?

Say hi to your team


You start working with a team. But have you ever wondered, how the size of your team will affect your work? Have you thought about what is your perfect team size?

Larger team = Shorter project time? Not necessary so.


When you have a lot of work, it's natural to hope there are more people to help out. Sometimes it work but not necessary so during a product development. Or to be precise, the "efficiency" of having more people in your team does not scale linearly with project time. The more people you have, the larger the overhead in managing them - the daily update get prolonged (I will talk about the work around later), more concurrent tasks means more context switching.

What's more, no two individuals are the same. We have different personality, some communicate better than others, some do backend better than UI frontend. So the larger the team size, you have to possess more "set" of communication profile with the team member.

When we work solo, the project schedule is simple, we have a lot of flexibility to shuffle the tasks around. But once we have a team, we need to deal with multiples of working schedule. Tasks dependency among different people shows up and more consideration is needed if we want to execute the project efficiently.

A big team is not necessary evil.


So, should I avoid having a big team?

It depends.

There are tasks that scale well, tasks that are repetitive or demand just manual labor. One of the example is functional testing, although you can automate many of your tests, functional testing (or UI expectation for GUI program). When you have a proper test plan on hand, tester can carry out the test execution by themselves.

If you have a larger team (i.e. larger then my desired perfect team size), I can suggest some twist to ensure an efficient daily update.

Attend multiple of daily update
Instead of getting everyone together, you may split the big team into smaller entity. Group them together by functions and talk to each of them. This prevent the whole team but you to sit together for a lengthy period, yet, knowing what's happening to everyone is your job, isn't it?

Just bring the team lead
Another approach is just grab the team lead together and have them update on behalf of their team mate. The advantage of doing so is, all the team lead know what's the whole project is happening and they can then divert the message to their team mate in their own update session. You may have fewer chance to meet some of the team mate but compensate for it in other occasion, like a tea session or lunch gathering.

Three, the magic number


I prefer having a team of 3 people or 4 the maximum. If the 3 people are working as individual, there will only be 3 stream of work proceeding at the same time, which I can follow through and understanding the details. When there are more concurrent tasks, I find myself will begin forgetting the detail for each of them. For a more complicated tasks, I have the flexibility to assign 2 of them working together.

Also, preparing work that can "feed" 3 people is much easier than feeding a bigger gang. Since you only need to prepare a handful of tasks, you shall have sufficient time in defining them clearly. When the team are busying working on the tasks assigned, you have the buffer to prepare the next wave and also have time for your own work, too.

Go back and enjoy the team work.

Daily Update

I have a meeting with my team at about 2:30PM every day.

The objective is simple - everyone in the team will tell other what they are doing.

Is it a waste of time?



OK, I hear you are saying. Meetings are toxic.

But first, let me tell you what daily update is meant to me (and my team).

1. It is the time for everyone to get together. I can also notice how they look - are they tired? Are they excited on what they are doing?

2. It allows everyone to know the status of projects. Since we usually have multiple projects executing at the same time, so one may learn about the other projects.

3. It provides a platform for everyone to either raise the issue they are having or simply to show off what they have done.

4. Let them know what I am doing. Don't think about if it's of relevant to them, they have the rights to know. Being transparent helps to build the trust.

Some tips to reduce the "cost"



Asking everyone to drop their work and sit together is costly. But there are some way to reduce the cost.

1. Make it consistent. I used to meet in the morning, before everyone kick start the day, but turns out they come back at different time and thus I moved the meeting to after lunch. With the time fixed, people can allocate their work better to prevent pulling them from the "Zone".

2. Make it short. Usually, 15 min is sufficient and unless there is some complicate issue to discuss. If the issue only of interest to some of the teammate, discuss it after the meeting.

3. Make it causal. You don't want it become a burden for everyone. Apart from the regular update, try to let it be the stage for the team to show off their work! Let them get the satisfaction and applause they deserve.

4. Make your notes! Have a little notebook with you, drop down what the teammate has said, you can mark down the item to follow up on the next day and in the long run, you can review the progress of the project.

Meeting is only a gesture



So, daily update is a mean of communication. You can disagree having a meeting but you are wrong if you are not communicating with the team. You can pick the most comfortable means (IM, email or even lunch gathering) to achieve this. Just don't get the gesture prevent you from knowing your team (and vice versa).

Getting stuck? One of this method can help you.

Problem, like shadow, shall never go away



Let's face it, we can never get away from problems. And we should all have the experience of getting stuck, no matter how hard you try, there doesn't seems to be a progress in finding the resolution.

It's all because of the juice



The "creative juice" is what we need in resolving problem. The juice contains all the "nutrient" we need in solving the problem, these nutrients are what we consume everyday - the things we see, we learn and we listen. These information help us to find the best way to tackle the problem, thus, when we are stuck, it meant the "juices" is unable to circulate.

Cleanse yourself



One of the method which works very well for me is taking a bath, I have "solved" many problems during my bathing time. The sound of the shower, the isolation and the steam, establish a very well environment that I find idea is flowing around me. One of my lately encountering is designing the roadmap for my product. I need to strikes a balance along the product line and to satisfy needs of all kind and some of them is contradictory (e.g. a software solution vs a hardware solution). One night, when I am bathing, I realize that I can simply split the product into two but having one as the subset of the other.

Apart from bathing, dish washing and extensive walking can also help me to better circulate my "creative juices". The repetitive action enables me to get into the state that, idea can again flowing freely.

Zen is null



What I have been sharing is nothing magical, the activities are similar to meditation. Meditate enable us to get into a state that enable our "creative mind" to become dominant. I am no expert in Zen or Buddhism, but to describe this state of mind, I find it is close to the state "null" that we are familiar with. The state of meditation is not either an "empty string" nor "non existent".

It has been realized by a lot of people and nicely explained in various books. One book which I strongly recommend is Pragmatic Thinking and Learning: Refactor Your Wetware. It explains all the above with theoretical information.

To summarize the article, I would like to share a quote from Zen master Daisetz Suzuki

"Great works are done when one is not calculating and thinking."

Happy Meditation.

Using RCLI in Gentoo AMD64

We are operating a VMWare ESXi 3.5 server and is looking for way to perform operation on the VM via command line.

VMWare provides an API (which is a set of perl script) called RCLI (Remote Command Line Interface) and it provides the script in two flavor - Windows and Linux.

We want to issue the command on our Gentoo box which is running in 64 bit but the RCLI linux deliverable failed to deploy in 64 bit. Googling around noticed a patch to get around this.

Apply the patch by the following command

patch vmware-install.pl vmware-viperl-distrib.diff
After that, just install the script by,
./vmware-install.pl


It goes OK except a warning explaining the failure to bind with the perl module Crypt::SSLeay.

I guess it doesn't exist on my box and thus I emerge this right after. Upon doing so, when I try to issue the command "vmware-cmd", I was greeted with the following,

builder vmware-rcli-distrib # vmware-cmd
Can't load '/usr/lib64/perl5/site_perl/5.8.8/x86_64-linux/auto/XML/LibXML/Common/Common.so' for module XML::LibXML::Common: /usr/lib64/perl5/site_perl/5.8.8/x86_64-linux/auto/XML/LibXML/Common/Common.so: wrong ELF class: ELFCLASS32 at /usr/lib64/perl5/5.8.8/x86_64-linux/DynaLoader.pm line 230.
at /usr/lib64/perl5/site_perl/5.8.8/x86_64-linux/XML/LibXML.pm line 12





No help to google around but I suspect it's again the missing of a proper perl module, so I emerge it again and try. Turns out I am right but I am seeing yet another error message on a different module. I repeat until I can execute "vmware-cmd" without an error.

Below is the list of module I have emerged,

  • emerge Crypt-SSLeay

  • emerge libxml-perl

  • emerge XML-LibXML-Common

  • emerge XML-LibXML

  • emerge Class-MethodMaker


After that, all is running well.

Internet booming in China

Came across an annual report about internet development in China today and notice a significant adoption of internet usage in China.

Also, internet access is no longer for people living in big city. The increment in rural area and villages has outgrown those in the bigger city (60.8 vs 35.6%). What's more, most of them are using broadband for internet access (around 90%), and surfing on the mobile phone has a significant gain as well (133%).

I think the explosion can be seen in two fold, one is the general public adoption while the other is the booming of our own internet application. We are now having all kinds of localized web application, which break down the language barrier for the user adoption.

Talking about web application, it is found that about 24% of the web site hosted in China is using PHP, which is the most popular languages among all.

The report is very informative and I am seeing that the internet user in China is now more comfortable in using this media to do things more than web browsing. The penetration of using the internet to do ecommerce might be coming soon.

The iPhone that never sleep


Mobile Blogging from here.


I like my iPhone, the apps and games are wonderful. But I can only realize the true power after subscribing to a data plan.

See the above? I can now blog at anywhere, locate myself at any time and what's more is to get the latest information on the road.

But are we not getting connected enough? Now, other devices, such as the digital camera or portable gaming console, can also gain access to the net.

I wonder when would we feel exhausted in sending update to our friends round the clock.

Before that, I will enjoy the using of my iPhone. :)

ForkLift

There are several apps which I come back and forth and deciding if it fits into my usage pattern.

ForkLift is one of them.

The first thing to intrigues me in using it is the 2 panel display. I've been grown up from the DOS and Norton Commander is my preferred way of file manipulation. There are several offering of apps on the Mac platform that enable this but I like ForkLift in several way.

First, I can create "Groups" on the left panel. For instance, I can crete a new group for work and drag all work folder as a short cut. Then, there's a built-in app delete tools. I can remove application that I no longer needed easily. Also, the lower panel provides information that I need at times, one of them is the size of the folder. And the integrated "Connect" capability let me transfer file to my remote server in the same application.

Yet, there are some features which I want. I use terminal a lot, and I hope there's a short cut to let me open a terminal and change location to there. Alternative, it would be nice if they provide a shortcut key to copy the filepath.

I've mentioned I like the "Connect" option but I couldn't find a protocol that I used a lot - SAMBA. When I need to connect to the SAMBA share, I need to do it in Finder and switch it back to ForkLift.

I've found it can be bought in a discount from MuPromo. Go check it out.

Product Promotion - Timeline 3D

I love MacWorld, definitely because of the keynote by Apple (sad that it's gonna be the last one this year) for the new product announcement. Apart from that, vendors will usually offer special promotion in this period.

Today, I came across a very nice offer from BeeDocs. They are offering a big discount on their flagship product - Timeline 3D, which usually cost $65, is now offering to user at a special price of US$30.

I tried this once sometimes ago and love it. But I encounter some problem in using it, which Andy reply to me promptly and turns out it is the driver from Logitech that break the software (to be precise, that driver render Growl from working properly).

If you need to draw some timeline, go grab it before it goes away.

BeeDocs

The Netbook Era

2008 is definitely the era of netbook - low cost but under power laptop, which is good enough for day to day internet surfing and light enough to bring along.

I keep hearing a voice telling me to get one and finally, I could resist this temptation and place my hand on this.



The price of a netbook varies, some could be as costly as a low end notebook but in general, the specification for most of them is more or less the same. As a secondary machine, I prefer to spend less on it, although there are some drawback (which I will talk about it later).

The brand "Hasee" might be unfamiliar to most of you as it is a manufacturer in mainland China. The specification of the machine as follows - 80G HDD, 1G RAM, 1.6GHz Atom CPU, 10.1" LCD (LED Backlit), 130 Megapixel webcam and it all costs me US$346.

It comes with no OS and I am having Ubuntu 8.10 running on it just fine (with most of the drivers available except the webcam), the only draw back is the size of the keyboard. It's small when compared to the others (HP M1000 offers the best keyboard btw) but I couldn't complain for the $$$ I am paying.

It serves very well as a browsing machine but I found that the resolution (1024 x 600) hinders the using of IDE application since some of the menu items cannot be shown properly in this resolution.

Before MBA comes down in price (or given a refresh in hardware specification), I will settle my desire in having a small notebook with the Hasee.

Finding the right user to test your software

Over the years of development on my product, I have been working with different batches of tester. And I have noticed some good time, as well as some bad time with some of them. I noticed a "trend" that lead to my different emotions.

I feel fruitful and respected when I work with tester who is knowledgeable. The "knowledge" I am referring to, is the understanding of the domain that the software is dealing with. One analogy I can thought of, is the necessity to recruit driver in testing out a car. You won't find someone who don't know how to drive a car for testing.

OK, I hear your voice. You say the test is biased if the user is already "contaminated".

I would agree if the test is focused on the perception on something intangible. E.g. the color should be used or where the submit button should be placed. But if the test require the knowing of the mechanism, it falls into another dimension.

What's more, if your test is composed by a league of such user, I could not imagine how diversify the feedback will be. Each of them will likely to represent the personal preference of the user and what matter worst is, these user will likely NOT to be the same group of user who gonna pay and use your product.

Developing software is an art, but spotting the right gang of people to give you feedback is even so. Now I will go back to my cave and meditate on the next features to implement.

Case sensitivity in namespace prefix affects XML Signature Operation

We were diagnosing an exception thrown in XML signature validation.


<Cannot check signature - Current Node: [#document: null]>



After digging around, we noticed that the XML in process is referencing an element with the name space value in different letter case.

The name space is declared as follows,


<SOAP-ENV:Envelope xmlns:SOAP-ENV=" ... >



But in the transform, we reference the element like this and turns out to be failed


<ds:Transform Algorithm="http://www.w3.org/...>

  <ds:XPath>
    not(ancestor-or-self::node()[@soap-env:actor=\"urn:oasis:names:tc:ebxml- ...

  </ds:XPath>

</ds:Transform>



Did you spot the difference? Yes, it's the case of "SOAP-ENV" declared in the Envelope to be upper case but the one referenced in the transform is in lower case.

Once it is fixed, all works.

Low end dedicated server vs a powerful VPS

Lately, I am having an "itch" in owning a dedicated server, which enables me to install VMWare Server and run multiple of virtual OS. All to satisfy my control freak deep within.

But most of the subscription plan are expensive. You can find dirt cheap bargain but the "server" they are offering is even slower than the PC I have at work.

I have finally found a reasonably priced plan (around US$79) which offers a Dual Core CPU with 2G RAM and 320G of HDD space, not bad in terms of specification. Right before I click the "order" button, I came across this discussion thread, VPS vs. Dedicated - New Benchmark Results. Reading it through and noticed the availability of a benchmarking scripts.

I downloaded the script and have it run on my 2 VPS account, to my surprise, one of them is having a benchmark result 6 times faster than the other! And I am amazed to notice the result of some VPS plan is very close to the dedicated server which I am interested to order.

After a bit of struggling (on money and necessity of course), I opt for a VPS replacement on my slow account instead.

Below are the benchmark result for your reference.

VPS#1 : 241.8
VPS#2 : 164.7
VPS#3 : 29-30

My PC (Core2Duo E6600, 2G RAM, 250G HDD) has a benchmark result of 423.3

Interested to try it on your machine? Download UnixBench v4.1.0 - WHT Variant now!

The unit testing for the web pages - Twill and Selerium.

Unit testing the web application is not a new problem. But unlike the close counterpart of unit testing in Java, where JUnit is the de facto standard, there isn't a methodology that is as common.

I am trying out Twill and Selerium today, both of them has been around since 2004. The two are both scriptable and differs in two aspect.


  1. Javascript support
  2. Browser integration


Twill cannot support javascript, for instance, you cannot script it to enter the date value through a popup calendar.

It works in plain text mode so you cannot test out the cross browser functionality.

You can get more information from their web site

Having said that, it is very lightweight and it can integrate nicely with your CI framework.

Selerium address the opposite aspect, the javascript support enables you to test the functionality of your heavily AJAX web pages. You can even use the fiefox extension to create the testing script.

Can't follow what I am saying? Try it out yourself from this URL.

Selenium Functional Test Runner

Oreilly has published an ebook of the Short Cuts series which gives you a quick good read on these tools. Check it out from here