Seasoning the Raw through Extreme Programming

5 06 2007

One of the biggest issues facing IT companies in India today is hiring good staff. I think it’s become abundantly clear to my regular readers that this has become something of an obsession in my work. So, to break the monotony of dealing with idiots who claimed they were experienced, I started an experiment a month back with a couple of raw recruits straight out of college. Now these boys were sharp guys who had a good attitude to learn, and plus some basic knowledge, albeit quite limited and convoluted.

I’ve concluded that the primary drawback of hiring people “fresh” out of college is that they don’t know anything practical. The sad part is that their heads are so full of theory that by the time they get out into the real world, they’re completely confused and absolutely incapable of practical programming. I’ve mentioned this before in my earlier posts on the state of freshers in India.

In this case, I initially gave each of my two freshers some very simple tasks, different tasks mind you, that would require them to learn the basics of .NET programming. But after 10 days, they had made very little progress and I was left tearing my hair out and sitting with them for 3 or 4 hours just trying to explain how to use classes, how file reader operations work, etc. I mean this was baby stuff they’re supposed to have learned in college. And people wonder why I’m greying prematurely.

The trouble was that I really couldn’t devote this much time to these boys on consistent basis, and the company wasn’t big enough to justify a formal training program like what the big boys at Infosys and all do. At the same time, I was sure that just throwing them in front of a computer with some books and saying, “Code!” wouldn’t work fast enough. So, I hit upon an idea. What if I instead of using them as two separate programmers, I made them work as a single unit?

I got this idea from an article I’d read a few years back on how HP was using Extreme Programming to improve its coding standards. You can read up on Extreme Programming here @ Wiki. One of the concepts that I recalled from this particular article was that instead of have two programmers work separately on different tasks, HP assigned two programmers to a single workstation to work on a single task together. The idea was that the number of bugs in the code went down because there was a second person to verify the code as it was written. So while it didn’t actually speed up the development phase, it did reduce the time taken for the testing phase, an added bonus being that it reflected a higher standard of programming quality.

So getting back to my problem, I realized that the issue I was facing was that on their own these freshers didn’t have enough know-how to accomplish the task, but each of these guys had some knowledge that the other didn’t have. So, I made them work as a team, or one logical programmer to use geek speak, to accomplish a single task together at a single workstation.

I’m happy to say that this experiment was succesful. They delivered their new task inside of 3 days [the new task being one of equal complexity to previously assigned tasks]. I then had them work under a project leader to develop an in-house project for me. Not that I desperately needed the application, but it was a challenging project that required my freshers to cover all the basic concepts you need for a real-world .NET web application. 2 weeks in and they’re almost done.

What I learned from this exercise was that having a second person working on the same problem helped the freshers to think a problem through before implementing a solution, rather than operating on a trial-and-error basis. Additionally, the second “brain” helped to fill in gaps of knowledge that were lacking in the other person. So, together they would discuss a strategy, pointing out flaws in each others theory, and then implement that strategy together, testing and debugging it together. At the end of the day, they accomplished far more simply because they had more knowledge at their disposal, plus the ability to think things through before coding.

I’m not saying they’re perfect though. There’s still a lot of things they need to learn before they can become independent programmers. One major issue I’ve encountered, and one that I haven’t fixed yet, is getting them to conceptualize concepts and problems. For some reason, whenever I asked them something a little abstract like how does a web application work according to the client-server model, or how is a file uploaded handled, or how do URLs work, I encountered a major mental block. I’m only after the theoretical concepts, but for some reason since it’s applied theory, rather than definitions, they have trouble wrapping their brains around these ideas.

In the end, I realize that how to use these boys is not to talk to them about solving problems, but to clearly define the tasks to be delivered and them instruct them to do it. It requires a hands-on presence in the form of a team lead or project manager to clearly define for the boys what needs to be done, but once they’re clear on whats expected of them, they are able to deliver as per schedule. Based on the current results, I’ve decided to keep them together for another 3 or 4 months for them to gain more exposure before splitting them up.

The primary benefits of this approach are that a company does not need to invest in a formalized training program to train “freshers”, and that at the same time these freshers get exposed to real world programming from day one. They understand how live projects are dealt with, what methodologies are in place, what problems they are likely to face, etc. Most importantly, they learn the skills that are needed for them to become productive programmers quickly, especially those needed for the company’s ongoing projects. The company also benefits as it’s no longer dependent on hiring “experienced candidates” [refer to some of my other posts for my take on these clowns], and is able to groom and shape a team for the future.

So, in the near future, I can transition these two freshers into productive programmers who are capable of completing tasks alloted to them. True, they might not be ready to tackle problem solving and such, but that only comes with experience. But, rather than have non-productive people for 4-6 months, I have productive programmers within 3 months. And at a fraction of the cost of the “experienced programmers”.





Error: “Professional Ethics” not found

12 04 2007

I’ve been debating whether I should rant about this particular topic for a while now. While its not an earth-shattering pronouncement that people in IT are so damn self-centered and unprofessional, I just think its so pathetic that people are allowed to get away with this kind of behaviour because they’re in IT. Let me fill you in on the story that inspired this thought.

A few weeks back we’d interviewed and offered a guy a position in one of my client’s projects. Now, for a proper character assassination, this guy is in my opinion the dictionary definition of “obnoxious”. I mean he talked like he was some major IIT or Harvard MBA hostshot about career growth, client interactions, business soft-skills, becoming an entrepreneur, yadda yadda yadda. Thats all fine, but we’re talking about some kid from the boonies in Tamil Nadu, India, who I was interviewing as a developer, not as a marketing poster boy. Still, he seemed to have some development ability, and being as desperate as we were for a reasonably skilled developer [meaning he knew that a keyboard wasn’t a musical instrument, and that a mouse was not a footpedal], we gambled and took him on, figuring that if the bugger didn’t perform we can always chuck him out.

So, he’s supposed to join me the beginning of this month. I call him a couple of days before he’s due to join us and confirm that he’s joining us. He says “Yes I am! My resignation notice was until today. I’m just clearing some paperwork up. I will join you Monday” “Ok!” I thought and left it at that. Come Monday, I’m waiting until 1pm and our hero is a no-show. So, I grab the phone and dial his mobile, and ask him, “Boss! You’re supposed to be joining me today! Where are you?” His response is, “Ummmmm… sir… I regret to inform you that I’m not joining your organization.” “Why?” “Sir, my previous company gave me a better offer, so I took that.” I was taken aback since I’d only talked to the guy 2 days before this and there had been no hint of a counter-offer.

“When did they offer you this?”
“Friday, sir!”
“When did your resignation notice period end?”
“Wednesday, sir.”
“When did my contract with you come into effect?”
“Wednesday, sir.”
“So, as of Wednesday, you’re a contracted employee of mine. And you told me on Thursday that you’re joining me. Why didn’t you tell me?”

And I swear, this bastard’s response was, “Sir, they gave me this offer sir. What could I do sir?” I replied, “You could have said no? You could have said that you’ve signed a contract with me? You could have called me and told me about this at least? We might have revised our offer? Why didn’t you do this?” Here he changes his tack a bit, since he’s been pushed into a corner, “Sir, they refused to let me go sir. They wouldn’t give me the relieving order. How can I join without a relieving order?” I said, “The relieving order is just to say thank you for working with us. What matters is that you tendered your resignation. Once the notice period mentioned in that came into effect, you were released with or without the relieving order. And your contract with us comes into effect. We would have accepted an affidavit signed by you, along with a copy of your resignation letter, stating that your previous employer refused to hand over the relieving order after you tendered your resignation. The fact is you had to have given us notice before joining them. No employer can hold you back against your will if you tender a resignation.”

I know its not an entirely convincing argument, but I was MAD, fuming actually. This bugger had given me the run around for over 3 weeks, and talked out of his ass about dealing with clients, on-site relationship management, being a business liaison, and after all that he didn’t even have the basic courtesy to inform me that he’s taking another job. Don’t get me wrong. I would not have stood in the way of him joining anyone else. I can’t do that nor will I do it. But, I do expect people to have basic decency to be forthright and inform me of such things, especially after they have a written commitment to work for me.

Getting back to the saga, our boy tries another tack, his third for those counting, “Sir! You only gave me an offer sir, not a firm order.” I said, “Look at your damn letter boss. Its an appointment order, not an offer letter. Its a contractually binding document. You are bound by that document.” “No sir! that’s not true.” “LOOK AT THE BLOODY DOCUMENT! STOP ARGUING WITH ME! YOU HAD AN ORDER NOT AN OFFER!” “But…, but… How can I join without a relieving order? What if I go to the US and the client asks me about my previous history and asks “Where’s your previous documentation?“” “Boss! Thats my problem not yours. I have to deal with the clients, not you. I have to make sure your papers are ok with immigration and the clients, not you. Your problem is to deliver on what work I assign you. Don’t give me this bullshit! That’s the weakest bloody excuse you could have come up with!”

My patience wearing thin, I gave him a way out of this mess. I told him he finds me a decent replacement within 30 days, and I won’t create any problems. Otherwise, I’ll take it up with his company. He blurts out, “OH GOD SIR! PLEASE DON’T DO THAT! PLEASE THINK OF MY CAREER!” At this point, my temper, which is already at breaking point, erupts, “LISTEN! YOU GOT YOURSELF INTO THIS MESS! YOU COULD HAVE INFORMED ME OF THIS OFFER! YOU COULD HAVE DECLINED THE OFFER SAYING THAT YOU ALREADY HAVE A PRIOR COMMITMENT! OR YOU COULD HAVE SAID YOU NEED SOME TIME TO DISCUSS THIS WITH ME! DID YOU DO ANY OF THIS????? AND YOU WANT ME TO THINK ABOUT YOUR BLOODY CAREER! YOU OWE ME YOU BASTARD! I HAVE GIVEN YOU A DECENT WAY OUT OF THIS! I COULD CREATE A MAJOR PROBLEM FOR YOU AS IT IS! I’M TRYING TO COME UP WITH A CONSTRUCTIVE SOLUTION TO THIS MESS! BECAUSE OF YOU, I HAVE SOME MAJOR PROBLEMS WITH MY PROJECTS! I MAY LOSE MONEY ON THE DEAL SO DON’T TRY TO APPEAL TO MY PITY! YOU FIND ME A DECENT PERSON I CAN INTERVIEW AS A REPLACEMENT THEN I WILL CONSIDER THIS MATTER SETTLED! DON’T SEND ME SOME IDIOT TRASH!

He tries to protest, “How am I supposed to judge a candidate sir? How can I guarantee a person will be good?” “You claim to have 3 yrs of experience? You claim to be a team leader? You talked big about being a business liaison and all? An entrepreneur? You say all that and tell me you can’t evaluate a person’s technical ability???? What utter bullshit! If that’s the case, you’re an absolute liar and I’m glad you’re not working for me! I don’t care what you do but you’re getting me that replacement? Ok!” “Ok, Sir! I’ll get you a candidate! But if he is not suitable, I don’t know!” “As long as he looks to be a good candidate, I will not hold you responsible for his failure to perform. But, don’t send me some stupid idiot off the street!” And I slam the phone down.

Its now 10 days since the conversation, and tomorrow I plan to find out just how this guy is doing. But, frankly I ask you, was I wrong in reacting like I did? Yes, this happens in this industry in India, but must I accept it lying down? Why should I? Why after putting in so much of time and effort in finding a guy should I take this lying down?

People should understand the responsibilities they assume when they sign a contract, that there are professional courtesies and principles to be observed. Like I said, I can’t stand in anyone’s way if they wish to leave, nor will I. But there is a way of bowing out gracefully. Usually, most employers will not stand in your way, so long as you don’t make it difficult and don’t try to be evasive about it. You ensure that your employers are aware of your intentions, and you transition your workload properly to your replacement. At times, you may be asked to stay on a bit longer to help the company complete some immediate tasks for which you are essential before you leave, but this is always up for negotiation.

But being hostile and burning bridges serves no purpose. It just smacks of immaturity, and at the end of the day has no real substance. Life goes on for all. The real loser is the employee because you never know when in life you might need to go back and rely on an old contact.

Sadly, kids [I’m classifying by both physical and mental ages] today are so focused on money, that they have no concept of professionalism, ethics, and courtesy. Their greed and selfishness is so rabid, that they do not think to consider the fact that sometime down the line they may need the people they’ve trod on. They may talk about all these concepts, but ask them to define them. THEY CANT!!! Its a concept completely alien to them. Which will only hurt them in the long run.

My objective in writing this is not just to vent my anger. It’s to highlight to the people who read this, especially youngsters or those starting out in their careers, that you should strive to not alienate people. Your contacts are your main assets in your professional career. Nurture them! Yes, be selfish! Try and get the best deal for yourself! If a better opportunity comes up, grab it with both hands! But ensure that you conduct yourself in such a way that you don’t burn bridges.





Fundamentally Lacking

7 04 2007

Sad to say but the title says it all. Thats my verdict on the state of graduates that are being produced on average by universities in India today. This is a follow-up to my previous post “Fittest of the Survival“. [Those of you who don’t know the article in question, shame on you for not being avid readers and not giving me feedback.] This is a record of my experience after hiring a fresher who did really well on my evaluation exam, better than most of the people who claim to have experience.

So the kid joins me 10 days back, and being a fresher I decided to make it easy for him and not throw him straight into productive work. I talked one of our project managers into assigning him a task that was non-critical, yet at the same time one that ensured that he used the fundamental knowledge that he was supposed to have learned in the 4 years he was in college. A few days later, the project manager comes up to me and says, “Boss! This guys hopeless. He doesn’t know even the basics.” I retorted saying, “How can you say that? This kid passed the test.” I even showed him the test. But this guy was adamant, “This kid doesn’t know his basics.” To find out the truth, and with the ulterior motive of proving the project manager wrong, I called the kid into my office and asked him, “Whats the matter? Why’s this chap saying that you don’t know even your basics.” I really wasn’t prepared for his answer, “Sorry sir! But I’ve never come across this kind of problem using…” At this point he drops some big programming words like polymorphism, inheritance, operator overloading, method overloading.

My jaw drops. I can’t believe it. Why the heck is this kid talking about this junk? I know the complexity of the task at hand, and I, for one, can tell you that its not even close to garbage science [fyi, the opposite of rocket science]. So I ask him, “Do you understand how to solve the problem that you have been assigned?” The answer is, “Yes Sir, but I’m not sure how to implement this using… [big words again]. ” So, I ask him again, “Do you understand how to solve the the problem/task you have been given?” I get the same answer peppered with big words and theoretical concepts. I repeat this question a few times to make sure the kid understands that I’m asking him if he has a grasp of what exactly he has to achieve. I even ask the question in Tamil [my questionable version i.e.] to ensure my point is being made. I finally get the answer, “No Sir! I don’t know what this means.”

I finally ask him to explain the problem that was given to him [if you think I’m being repetitive, until now I was only asking him about the solution. Now I wanted to know if he understood the problem in the first place.] His explanation was somewhat convoluted but having been briefed by the project manager earlier one, I understood what he was trying to say. But, that wasn’t satisfactory. This kid was unable to breakdown the task in to steps that he could implement using basic code. To test him further I gave him an even simpler task. I asked him to explain to me how he would implement the following problem. Mind you, I specified I’m not interested in the coding, but was more interested in the approach he will take. The problem was, “You have a file with 4 lines of data. I want you to interchange the 3rd and 4th lines, and to rearrange the new 3rd line so that the text that was in the 2nd half of the line, was displayed in the first half of the line, save the new output to the same file.”

In practically every programming language developed and used since 1971 when they invented C [the language], the approach is the same. You open a filestream, load each line into an array [for you non-IT types, an array is a type of data storage used in programming], then swap the 3rd and 4th lines, and transpose the new 3rd line by getting the length of the new 3rd line and constructing a new line with the order reversed.Then you write out the new data to the file. Programatically, its a straightforward task that draws upon all the basics you’re supposed to have learnt in college.

Our hero gets to the open a filestream part and stalls. He starts again using big words such as polymorphism, object oriented coding, inheritance, etc. as ways to implement it, but he’s not able to address the basic task at hand. At this point, I’m really ticked off. I start questioning this kid as to what exactly he’s learnt in his 4 years in college. He uses even more big words, and I grill him some more on what exactly he means by those big words. He finally gives me the story that he’s memorized most of the stuff from a book, and has a total experience of 2 months of actual coding. I asked him why that was. He said, “This what I was taught by my prof. I had 3 profs in my final year, and they only taught us by the book.”

Sadly, the trend is that people who are unable to get jobs with IT majors become lecturers in CS and IT at universities to hold some gainful employment until they can be absorbed by an IT company. These guys don’t even have experience but they’re being tasked with teaching young kids on programming. What are they going to teach? Obviously, whats in the book ’cause they don’t know anything else. Net result, they student’s have got their heads full with all sorts of theoretical and abstract concepts swimming around, but with no practical foundation of what exactly you do in programming. Where does that leave the students?

Nowhere is the answer. The students are left high and dry, and it is up to the companies to take the responsibility to actually, and practically [as in imparting practical training], train these freshers. Going back to the point I made in my other article, Fittest of the Survival, its all very good for big companies but where do the small companies stand? They can’t ordinarily afford to train freshers. At the same time, they cant afford people who’ve been trained by the IT majors.

It’s a very sad state of affairs that exists, and it is leading to a major crisis point where there is no value in a 4 year CS or IT degree cause you’re gonna be retrained anyway. Whats the point in having universities then? Why should students waste 4 years of their lives, when it serves no real purpose? My suggestion to most people entering college is get a degree in something other than CS or IT, and if you want to get into IT at that point, attend some professional course for 6 months or just join an IT major as a fresher. Atleast then you have a fallback option of another degree. I, for one, am extremely skeptical of the quality of candidates who are available in the industry today.

Getting back to my problem, how do I address my staffing need? Forget recruiting from the IT majors, I don’t think I can afford them. But, what am I left to work with? Universities and colleges have to look into overhauling their policies so that they do prepare their graduates for the real world. Otherwise, they’re only diminishing their own value by undermining the caliber and reputation of the students they produce. And at the end of the day, what other benchmark do they have to justify their importance?