It was a typical day in a typical project in a typical IT services company in India. The team was building a warehouse inventory management system for a medium size wholesaler in Europe. The application was built using a forms-based system. When the offshore project manager opened his inbox in the morning, he found out that design team had come up with an idea of building a Java applet which would display the floor plan of the warehouse, thus making it easier for the end-user. The applet, which was to be based on Swing, was to be completed in three weeks.
After acknowledging the request, the project manager decided to entrust the task to Ashish and Benny. Neither of them had any prior experience in Swing but they had a reputation of “getting work done”. On receiving their new assignment, Ashish and Benny set out to work. They both read the requirements thoroughly and sat down together to discuss for a few minutes. And then, they took different paths.
Ashish headed to the library to pick up a book1 on Swing. He spent the next week reading about the Swing architecture and its capabilities. He built small programs during this period to understand the various possibilities of Swing. During the second week, Ashish started building generic classes which he felt would help in finishing his part of the task. He also felt that some of the classes might be reusable in other projects and therefore he was careful to make them as generic as possible. He started putting the code together on the first day of the third week.
As with Ashish, Benny built a mental image of the code in his mind as soon as he read the requirements. He soon found himself googling for code samples using the keywords which the mental image of the code had given him. On obtaining the code samples, he went through the code to understand it. In case he did not understand something, he made small changes and executed the program to see what would change. By the start of the second week, Benny started putting together the code for the task. And by the end of the second week, he was able to produce something which resembled the required output.
Which approach is better? Ashish or Benny.
I have left out the conclusions in the descriptions above. It is my intention to raise a number of questions which project managers and strategists need to look at. The answer to this question might have a large impact on the working of the IT industry. It has the potential to change project management, training practices and on the long run, even hiring could change.
Do the approaches have an impact on the various parameters of a software project?
From the perspective of the organization, if the manager was under pressure to get the code working within the required time limit, without giving due importance to any other parameter, it wouldn’t matter to the manager as long as the task is completed on time and gets cleared by QA (assuming that QA is also under pressure). On a hunch, I feel that Ashish’s code might be more robust and might get through QA in lesser number of iterations. However, there is a possibility that the approach might take longer than the allocated development time. Any time overruns might be offset time for QA, if the code is robust as I assumed.
If the manager is concerned about other parameters like code quality, it would be interesting to understand whether the approaches have any bearing on the different parameters.
What about the long term effects of the approaches?
As Ashish has obtained foundational knowledge in Swing, would he be faster and more efficient in a future project that requires Swing? Or is it not really worthwhile to put in the extra effort, as the knowledge would fade away with time? In the interesting world of IT services, there is a probability that either Ashish or Benny might never ever work on Swing again. There is also a probability that they might work on Swing again. If that is the case, the effect of the approaches would have a large impact on efficiency. So, the questions that organizations have to deal with are threefold:
1. What is the knowledge retaining capacity of humans? How often does one needs knowledge to be refreshed?
2. Does a particular approach make someone more efficient when it comes to a similar task in a future project?
3. If the bearing on the efficiency is definitive, what steps must an organization take to promote the approach?
For an individual, do the approaches have an impact?
Last week, my team had a meeting to decide on the “efficiency” of each of the approaches. When I walked out of the meeting, I decided to write a blog on the approaches. Quite interestingly, a lot of related discussion sprang up on blogosphere. In his blog, Doug writes,
“I learn in tiny nuggets, and I only learn the stuff that gets me to the next step in a project. If I’m working on a project and I need to figure out how to pull in an RSS feed into a flex app then that’s exactly what I want to learn, and only that. Once I get stuck at another point then I’ll go and figure out what I need to get past that point.”
There is a difference between the approaches mentioned by Doug and the question that we are trying to answer here. During the course of the project, both Ashish and Benny might do what Doug writes in the paragraph quoted above. Our question deals with what one should do when starting off on a new technology (or concept). Should one read up the basic information on Swing (or Flex in Doug’s case)?
Though, Jeff in his blog, provides a lot of deep insight for programmers, it does not deal with this question directly. The advice on the blog is more about building generic expertise in programming (which is not dependent on any particular language or technology).
To make the question clearer, let me make an attempt to provide an analogy. If you are asked to learn to drive a car within a specified time, does it make sense to spend some time and effort to learn rudimentary ideas about internal combustion engines, gearboxes and brakes? It is entirely possible to drive a car without knowing about anything under the hood. But does having the basic knowledge help in anyway?
Is the question valid?
On a final thought, it is also necessary to look at whether the question is valid. Though this is probably the first question to be answered, I moved it to the end with a purpose. An answer of “No” might create a bias while dealing with the other three questions.
Maybe, it is impossible for people to change their approach thus invalidating the question itself. Or to put it in another way, it is just a difference of how people work and it really does not matter as long as the goal is accomplished. But if the question is valid, there is a lot at stake for both organizations and programmers!!
1. It need not be a book in the strictest sense. It could be an introductory article on the web or Sun’s introduction to Swing.
PS: Forgive my long title for the blog.