Posted On: Monday, 07 May 2007 by Rajiv Popat

When one of my early projects where I had programmed by co-incidence ended I was really happy to move on to other things in life. Then suddenly, I was told to support the same project for a few more months and then a few more and then a few more.

On one hand maintaining my own code that sucked, made my life miserable. On the other hand however, it taught me how to take ownership of my code early on in my development life.

It taught me to set things right, by ruthless refactoring slowly with time, rather than just giving up or running away. Much like a painter who draws something that he thinks is really beautiful and then sells it at a price, I’ve felt a tinge of sadness in transitioning code over to the client in every other project after the one where I programmed by co-incidence.

 

Every now and then in my development career I’ve been involved with projects in and outside work where the primary project was migrating from one technology to another.

Migration projects at times are exciting. In migration projects it is implied that you will be spending a lot of time reading code (a skill every developer should cultivate) that folks from all over the world, who you may or may not have ever met or talked to have written. All you end up knowing is that months ago the clients hired a team of consultants. They wrote some code, transitioned it and have now moved on.

Migration projects have also exposed me to my share of Code Smell and snippets that would qualify for Daily WTF (now called worse than Failure).

Every now and then during my development career I’ve also met (and interviewed) a lot consultants. Of all the consultants that I’ve met, I’ve observed a particular kind very closely. Let’s call a consultant of this type – Fred.

Fred has the following peculiar characteristics:

  1. Fred usually works in short term billable projects.
  2. Fred gets very uncomfortable when he is asked to work in a project that will last for more than 5 months. 
  3. Make Fred work in a long term Product that lasts for more than a couple of years that he would have to support and Fred becomes very nervous. 
  4. Fred has a tendency to introduce Code Smell and writing snippets that qualify for “Daily WTF” every once-in-a-while.

Long story short, this type works under a philosophy that can be described in a line: Code, Hand over the code, Run and Don’t Look back!

As you dive deeper into Fred’s mentality you realize that there’s a little bit of Fred in all of us. Writing good code is all about getting rid of Fred! So what’s fundamentally wrong with Fred?

Fred is not really a bad programmer. Like all other good programmers Fred is struggling with the same issues we all struggle with: changing requirements, dead-lines, pressure from customer etc. What Fred lacks however is – ownership.

Fred Codes, Fred Codes More. Fred Hands over the code to the Client. Fred turns around and then Fred Runs as fast as he can, to another project. He doesn’t look back and he knows that he got away – Scot-Free! Year after year Fred continues to add “successfully transitioned” projects to his resume but doesn’t learn the art of Refactoring, the art of throwing away code and the art of elasticizing the iron triangle of software development . Big Design Up-front methodologies with no iterations help Fred tremendously in his Run-Away attitude.

An acquaintance in a 300 person process oriented CMM software consultancy house defends Fred - “but he successfully completed a project, right?”- Yeah. (I think I will not answer that question).

Actually, he doesn’t need to defend Fred because this discussion is not about criticizing Fred. Like I said, there’s a little bit of Fred in all of us. Do you have a little bit of Fred in you too?

The first step to getting rid of Fred is to cultivate a sense of code-ownership. Throw out a framework or a tool and commit to support it for at-least a few years. This could be a simple Accounting tool you write for your finance department or an open source project you start with a very small user base. The size of the project or lines of code aren’t important. Start by writing something that you are proud to support and maintain – for a very long time.

If you have posted articles / code out to the world, take time to support your code and content. Answer questions you get related to these. Don't abandon your content and code! Support it. If possible, Get involved in a longer project or product with support contracts.

In other words, learn to stand by your code, writing and words when they are released to the world. Learn to own and support them! Jumping from organization to another or jumping from one project to another, every few months, doesn’t take Fred anywhere in the long run.


Comment Section

Comments are closed.


Posted On: Wednesday, 02 May 2007 by Rajiv Popat

Scott W. Ambler compares software development to the iron triangle as follows:

He states the problem rather elegantly:

Recognize that the iron triangle must be respected. The iron triangle refers to the concept that of the three critical factors – scope, cost, and time – at least one must vary otherwise the quality of the work suffers. Nobody wants a poor quality system, otherwise why build it? Therefore the implication is that at least one of the three vertexes must be allowed to vary. The problem is that when you try to define the exact level of quality, the exact cost, the exact schedule, and the exact scope to be delivered you virtually guarantee failure because there is no room for a project team to maneuver.

For a Software Project / Product to be successful, we as development teams and above all, as responsible individuals, need to learn how to elasticize the triangle. Scott suggests over four ways to introduce elasticity in his article. He suggests that you can actually alter any side of the triangle, depending on your project / situation.

Andy Hunt and Venkat Subramaniam in their book – Practices of an Agile Developer suggest time-boxing as an answer:

“Setting a near-term, hard deadline for an activity that cannot be extended. You get to choose which other aspect will suffer, but the deadline is fixed. You probably don’t know the exact number of time-boxes that are required to complete the overall task, but each individual box is short, is finite, and accomplishes a clear goal-setting a near-term, hard deadline for an activity that cannot be extended.

You get to choose which other aspect will suffer, but the deadline is fixed. You probably don’t know the exact number of time-boxes that are required to complete the overall task, but each individual box is short, is finite, and accomplishes a clear goal.”

The book offers a very real example (which I can relate to from past projects that I've worked on):

For example, iterations typically run a couple of weeks long. When the time is up, the iteration is done. That part is fixed - but the set of features that makes it into that particular iteration is flexible. In other words, you never slip the date, but you may slip a feature.

I’ve seen developers around the world (I refer to them as Fred :)) give-in to the temptation and try to make the triangle elastic by lowering quality. We (a mentor and I) also even went ahead and termed this - the Junior Developer Syndrome.

Having said that, Time-boxing really works wonders in introducing elasticity into the triangle and at the same time maintain sanity! Especially if you are shipping projects / products with a strong leadership and a mature team that will not compromise on quality.

As developers, we all suffer through the I-can-do-it syndrome. It’s easy to get into trap by having a conversation with a marketing person / client, which goes somewhat like –

“Can we build this?” – Developer: Sure.

“Can we build this in 3 months?” - Developer: Ummm….

“Thanks! Our current team is enough to build it, right?” – Developer: I think so... I...

“Great! Thank you so much! Let’s start building it then!”

The next time you estimate or say “yes” continuously in a conversation like the one above ask yourself – have you respected the iron triangle? Have you left enough room for elasticity? If you haven’t, chances are that the fourth dimension - quality - will suffer. Time-boxing, prioritizing features and dropping the ones that don’t really add value is the safest, smartest way to introduce elasticity into the triangle. When in doubt prioritize up-front!


Comment Section

Comments are closed.


Posted On: Sunday, 29 April 2007 by Rajiv Popat

My fascination for fish tanks at one point in my life is well known to all who know me. When I owned the fish tank I spent hours reading the big fat fish encyclopedia and other fish-tank-management (my term :)) books. My objective: To create a self sustaining tank that I would never have to clean or maintain.

“Why can’t this darn thing turn into an eco-system of itself?” - I often wondered. I read about how the eco-system in a real river works and figured that a Fish tank had everything it needs to turn into a self-sustaining eco-system by itself after I had read something in those lines. The fishes could eat the plants, the plants could use what the fishes leave behind, as manure – you know – the whole tiny replica of a real life fresh water eco-system.

I was actually starting to think about simulating the whole running water thing the way it happens in real rivers... I was obsessed; not with actually maintaining the tank but in making sure that I would never have to maintain it! :)

Memories came back to life years later today as an engineer during an interview mentioned this as one of his long term goals:

“I want to manage my own team”.

After some discussion and playing with words (I do this with people I'm friendly with) he was a little confused about what he wanted. Here’s what he was basically saying:

  1. I want a team. My team! And I want to manage them.
  2. I don’t believe in hierarchies! It'll be an open friendly team... It’ll be my team with no hierarchies.

Here’s what I was hearing:

  1. Let’s have just 1 level of hierarchy. I’ll be the one who manages everyone else and everyone else can be my junior. 
  2. I hate hierarchies. :)

I was just kidding! Seriously, this guy is awesome and I was just pulling his leg. He knows it! 

But for now, I think I’ll stop playing with words and get back to fish-tanks and software... and my obsession with both of them, which is what I'm comfortable talking about.

At age 12 what I was trying to do with my fish-tank, was this - I was trying to develop an eco-system that I would not have to manage. I soon realized that this was very difficult to achieve with a fish-tank. Doing the same thing with product / software development team is relatively easier. Here’s why:

  1. Fishes by their very design aren’t as intelligent as software developers.
  2. Fishes suck at communication. They don’t even speak the same language we do.
  3. Fishes can’t ask for help when they are failing (or when the tank beings to suck), fishes can’t shout, yell... ok, I think you get the idea. :)

Coming back to the point, jokes apart, I don’t feel that a software team that needs to be managed can survive in the long run. A team that automatically forms a self sustaining, self managing unit, much like that eco-system in the fish-tank, has much higher chance of success.

At work, I've seen multiple teams of three to ten really awesome developers do just that and complete projects successfully without ever feeling the need of being "managed' by someone. I feel privileged to have worked with some of those teams. During the project, we would move in as a team, where everyone had his set of specialization and knew what each one of us would do.  We were all think-skinned developers who would shout if we had a problem.

This brings me back to the more important question - "Can you even Manage smart people?" - In a smart, self sustaining, self managing team, a manager is just like a servant of the rest of the team! When needed, he moves in, cleans up the mess and move out. It just involves ensuring that everyone has everything they need to function so they are on one single track. Doesn't sound very glamorous when I put it that way, does it? 

Mature methodologies like Scrum don't even refer to them as managers. Mature organizations like Yahoo have a better name for them - they call them the single wringable neck. :) -  Ken Schwaber remarks:

The Product Owner job is incredibly difficult. Almost all people fulfilling the Product Owner role are surprised by how much work it is. Historically, Product Owners were questioned by the development organizations about their requirements...They are responsible for elucidating these requirements as needed, decomposing these requirements on an ongoing basis, changing them to optimize return on investment, and even meeting with development teams frequently to tell them what is needed and to review what they have done. The Product Owner has gone from someone who could blame development if a project failed to someone who is responsible for the success or failure of the project. At Yahoo, this person is called the “single wringable neck.” 

Managing a team is not as glamorous as a lot of young engineers make it sound; The trick (much like managing a fish-tank) is developing a team that doesn't have to be managed! And by the way, while we're at it - may I also suggest we change the term "My Team" to "The Project Team"? :) And yes, if you are a young developer who really wants to manage the life cycle of a product; I definitely wish you luck and success in due course of time.


Comment Section

Comments are closed.


Posted On: Friday, 13 April 2007 by Rajiv Popat

Every now and then I meet young, talented and enterprising developers and interns who are hesitant to post code snippets, out of their work environment into the open world. There are some who will not write Code-Project articles for the fear of getting negative feedbacks.

Others won’t speak at knowledge sharing sessions or trainings, even if it’s just within their own organization, until they are fully prepared with an elaborate PPT and have spent hours learning a topic and know it like they know their mother-tongue. Some even worry too much about what their audience thought about a particular training they conducted last month.

Here’s a piece of advice to every young intern and engineer starting out on their careers:

Learn how to get naked!

You should have nothing to hide! Nothing. If you are succeeding in your project, say it. If you are failing, say it in a louder voice! If you are an expert in a topic, say it. If you don’t know a thing about a topic, say it, in a louder voice!

And once you’re naked, develop a thicker skin!

Don’t let the critisms get you down. Instead, use them to become a better developer (and a better person).

Being a think-skinned shameless developer who has nothing to hide is a life-style. After you have lived it, you begin to wonder how the developers, who don’t follow it, live without it :)

Are you a thick-skinned developer? Are you ready to become one? Try the life-style! You might love it! Here are a few steps that can help get you started:

  1. Realize how much your code sucks - and then learn to say it with a sense of humor - shamelessly. After all, we all make shitty software… with Bugs
  2. Ask for more time and make your code better - Pick one of your modules that sucks the most and ask for some extra time to re-factor it. If it’s not ready to ship and you need to work harder, learn to say so without feeling particularly ashamed about it
  3. Besides writing code learn to talk about code - Try walking into a training that you are about to conduct with just a topic you think you know really well or feel passionately about. No elaborate PPTs, No Preparations! If possible, do this every few weeks. 
  4. Throw out a few articles at code-project or start a blog - Blogs and articles open up forms of dialogs where it’s really easy to be shameless and ask questions or say “I don’t know” while answering them. The critism that comes in as comments through your blogs, articles or just ad-hoc email from your readers is usually very constructive. Personally I have and will (hopefully) continue to, learn a lot from Ad-hoc emails and feedback I receive from this blog and my articles.  
  5. Read Code – Read code that’s better than code that you would generally write – Quite a few good open source projects are usually a great place to start. If you can’t commit to an open source project submit bug-fixes and patches for the ones you use in your every-day life! 
  6. Copy Shamelessly – I’ve copied patterns of coding from every good programmer I ever worked with. In my professional life at work, the most recent example of shameless copy was a different way of writing Configuration Handlers that I picked up from a very capable Developer in my current project.

The above points don't form a definitive guide to becoming a shameless thick-skinned developer but if you’ve never made fun of your own code in a meeting or in a public blog post – they might help you get started on the road of thick-skinned-shamelessness where you might be able to learn much more by being a little more shameless and thick-skinned! I wish you a Safe and a Happy Journey on this road of shameless and thick-skinned development.


Comment Section

Comments are closed.


Posted On: Thursday, 29 March 2007 by Rajiv Popat

I think it’s been more than a year since this incident happened. Which is when I had  written this and shared it out with selected friends and acquaintances on a collective blog I shared with friends at that time. Recently I was reminded by someone that I should probably post this out on my blog :)

For all the readers who are not familiar with Indian languages here are some words used in the story and what they mean.

“Jadu” is a special kind of a broom usually kept at Indian house-holds. Besides sweeping the floor this thing is supposed to have multiple other uses, like…

Hitting cockroaches hard enough to leave them unconscious, without killing them! :)

“Gangi” is Hindi-Language-Equivalent for a vest. So here’s the post - back from the old-days. Read on!

Some More Gangi Talk from Yesterday…

Yesterday was “sofa king” (to be read very fast without stopping) long and interesting - thought I should share it out for the sake of some creative speculations that you guys might have.

A Little background: Tuesday evening I see a big fat cockroach crawling on the walls of the bathroom of my hotel suite. That is when I realized that hotels in Texas don’t give a jadu with rooms… I missed my jadu then.

Anyways, I decided to use a "gangi", climbed up the bathtub caught the bugger walking high on the wall and left him on the stairs of the hotel so that he could conveniently go into someone else’s suite and bother them. Thought that was the end of it… turns out, I was “sofa king” wrong!

Yesterday morning, just when I was about to leave for office, I see a cockroach (the same one? Milan, a friend back from school days, suspects that it was a relative of the one thrown out on Tuesday, but I have my doubts – I mean, personally, I am inclined to believe now that with the years of evolution behind them these guys can easily find their way back to the bathroom of the suite from which they were insulted and thrown out! Can’t they?)

So I see him walking on the same high spot on the same wall! (I think he was back for revenge of the insult he had been subjected to a couple of days ago) Anyways, now the turn of events begin…

The plan was laid out – the primary weapon of attack that was so successful last time (the same gangi) will be used again and the rascal will be thrown right on the streets of Houston! So, I take the gangi and climb the bathtub again! Just as I was about the attack, the rascal decides to fly right on my shirt!!! Well, I did what anyone who hasn’t participated in fear factor would do – decided to RUN! But… I slipped from the bathtub instead.

In a desperate attempt to hold my ground I tried to catch hold of the bathroom curtain rod – which I thought, being made of solid steel, would be able hold my weight! Again, I was “sofa king” wrong!

The rod just decides to break into two pieces (that was a steel rod! I am not kidding here – albeit, it was hollow but it was steel! Makes me wonder if I am putting on weight or as ifte (another friend from school days) says, becoming - 'muscular' – Well, it breaks into two pieces, comes completely off the wall, throwing the curtain on the ground. This time, the cockroach decides to hide in the kitchen area! Right under a cabin!

Now my mind is multitasking with the primary thread being – Who the phu##$% pays for this?? The secondary threads all occupied by the cockroach who was still sitting there in the kitchen!

So, I decided to go to the front desk and tell them about the cockroaches! I thought everything would be fine now. Well again, I need not say by now that I was so… wrong!

Basically, I go to the front desk with all the 3 key cards of my room safely locked in the room!

So I go and tell them – “Houston, there’s a problem” – and the lady out there starts filing a ticket for me assuring me that they will “look into it”. Then I broke the news that I have already wreaked their bathroom rod while I myself was trying to “look into it”.

Now I am taken a bit seriously. A guy is sent with me to the room. When I ask for an extra key I am told that I’ve already used up the keys the hotel had for my room – but the guy can open the door for me. Good! I think… once I get in I can get all my keys.

On the way up (we took the elevator to go to the second floor) I have a hard time describing to the guy what a cockroach is. Not sure why – but looks like the guy has never heard the word cockroach before (or maybe I am just not articulate enough). Interesting.

So he finally opens my door for me using his master key (or whatever). Luckily for me the bugger is still sitting in my kitchen! Jackpot! My point is proved! I point at the bugger and tell him – “these” (whatever you want to call them) have been coming to my room for the past 2 days!! Now he gets it or in his words – he sees what I mean. He bashes the bugger with his handkerchief and throws it out.

He tells me that there’s been some renovation going on and they’re spraying insecticides around the building so cockroaches are moving in. At the end of the day...?

I get all my three keys, I go to office… some really exciting work going on these days which makes professional life fun (but better to leave the technical mumbo jumbo out) … and when I am back I can see my room all cleaned up with the insecticide sprayed in the entire suite! And the broken rod with the curtain… it’s still lying under my sink.


Comment Section

Comments are closed.


Posted On: Saturday, 03 March 2007 by Rajiv Popat

At a client’s office, almost a year ago, a very talented developer on their team thought it was interestingly funny when I said - “and that’s how you divide and rule”. “We call it Divide and conquer” – he laughed. [Being an Indian, at times my English tends to have a slightly different touch to it. :)]

“But you’re probably correct. You don’t just want to conquer. What you really want to do is to conquer and then control the situation and rule, for a long time.” - He added on.

No, we were not making a sinister plan to take over the world. We were just talking about how we can break one big Monolithic BizTalk Orchestration into smaller, easy to mange, easy to comprehend and faster orchestrations.

He had drawn up this Big Design of their existing approach on the left and then I had proceeded to draw smaller designs of multiple Orchestrations and how they would talk to each other on the right when I finally wrapped up the meeting with the line “divide and rule”. I was suggesting that he break his Orchestrations down to smaller moving parts so that when a part doesn't work - he can take it out - independently - and Analyze it!

I don't think any programmer disagrees with the fact that we should Code Smaller. A Lot of basic concept articles, teach a person who is starting out on his programming endeavors how he can Break Larger Pieces of Code into Smaller Pieces. But divide and conquer (/rule) design paradigm goes beyond just writing cohesive, small and easy to maintain functions and classes.

Every now and then I see even good developers forget the Divide and Conquer paradigm under pressure. Or they simply do not put it to practice for tasks other than coding. I've recently seen a very capable business analyst trying to learn build management by taking a CuriseControl configuration file and trying to configure CriuseControl to get the source code from SVN, fire the build, send email notification when the build fails and log the result in the formatted HTML report, all at once.

When I was called in to help, my first reaction was to wipe out all other code from the 50+ line config file - and leave just 5 lines that will have cruise control fire the build. Turns out, those five lines were broken. Once that was fixed we moved on to Getting the source code from SVN - another 3 lines which just worked. We kept fixing a part at a time and soon we were done in a couple of hours.

I've seen so many engineers (Highly capable ones. At times, I'm guilty of this too) run through more than 10 screens before they can reach a reported bug and just reproduce it. Then apply the fix, go through the screens all over again only to find out that the fix doesn't work. Then start thinking of a different fix. Over and Over again. Spending more than 5 minutes on every attempt, just to check if the fix worked. 

When we do this the time taken to fix a bug increases dramatically, the frustration level increases dramatically and the ability to think using a Pragmatic Approach comes down with every failed attempt. We start programming by co-incidence! In situations like these, Isolating the problem by replicating it using smaller code snippets and moving it out of your codebase so that you can analyze it separately, can help a lot. 

If you are trying to fix a bug that requires more than a couple of minutes to just reproduce and has taken more than 5 attempted fixes already, you might be better off isolating the bug by bringing it out of the codebase and reproducing it independently using simple code snippets. If you are finding a bug too complex to fix you're probably trying to fix more than one bugs at a time. If a feature you're building in your sprint seems too complicated you're probably trying to build two connected features simultaneously.

In the pressure of fixing a bug that refuses to get fixed or in the excitement of writing code for something fairly complex, it's very easy to tell yourself - "I'm almost there!" - and it's easy to spend away hours or sometime even days - by continuing to tell yourself that, not realizing that you're in fact, getting nowhere!

If something takes much longer to fix or build than you initially expected or you're starting to get frustrated with a problem - Divide and Conquer! And then, once you've conquered the problem, enjoy your Rule over the situation! :) 


Comment Section

Comments are closed.


Posted On: Tuesday, 13 February 2007 by Rajiv Popat

A couple of months ago I had to make a difficult choice. A choice between Vista and Powershell (I still need time getting used to this name:)). Vista had officially RTM'ed and Powershell for Vista wasn't available. It was a difficult choice - wait on XP/2003 and continue to use Powershell or Move to Vista and wait for Powershell to become Vista Ready. I decided to move to Vista.

Recently, after about a couple of months, exactly as promised by Jeffrey Snover, the Moand team has Vista'ed the Powershell Installer and that means I can have both Vista and Powershell now. To add to that, I can totally continue to Skin Powershell and make it look beautiful, just like my Vista. And that's very important! Right? :)

I've been playing a lot with Powershell and now I think it's time for me, to put it to some real use, in project deployments on QA / Production.

One of the problems I always had while writing anything about PowerShell is that there are just too many good things to talk about in there and almost anything that could have been written about, has been written by someone else. That's one of the reasons (excuses? :)) why I haven't been writing a lot about it. For now, I'm just going to start by talking a little bit about XML and how you can read XML files in Powershell.

Let's just assume that we have the following simple XML file which lets me run various Uninstall and Install SQL scripts on the database depending on the Application version that I am pushing to the server.