My Life as a Software Developer in India

I am Siva, working as a Software Developer in Hyderabad, India. Working as a Software Developer is very exciting as you see new things coming in everyday. If there are no new things at least we put a new fancy name to some old concept and celebrate (#microservices) :-). But in my opinion working as a Software Developer in India is little bit different and hard too. Few things are good, and few things are bad.

The opinions of Software Developers from other countries on Indian Software Developers surprised me a lot.

Here I would like to share How I feel as a Software Developer in Indian IT Industry.

Note: These are all purely my opinions, you may agree or may not agree. If you feel I am generalizing something I mean MAJORITY not ALL.

My First Job
I got a job in a small organization as a Java developer. Along with me couple of my close friends also joined in the same organization. I am fortunate that I got a chance to work with very talented people in the very beginning of my career.

My first manager used to force us to use only Notepad++/EditPlus for coding for the first 2 to 3 months so that we get familiar with how to compile, run programs and be familiar with compile time and runtime classpath etc. On the other hand our Architect thinks other way. One day he saw me coding in EditPlus and came to me and asked “Do you go to war without any weapons?”. I have no idea what he is talking about and he understood that based on my blank face expression. He pulled keyboard from me and downloaded Lomboz Eclipse (one variant of Eclipse, not active any more) and explained how to use it. Also every now and then he taught me some interesting keyboard short-cuts and I am amazed how quickly we can code in an IDE instead of Notepad/EditPlus.

I learned very important things from my manager and architect like how important it is to understand how things work and how to effectively use tools to speed up the work.

On the other hand my team lead was very hands-on experienced developer. He literally remember most of the core Java API methods and have good grasp of design patterns. He is a kind of perfectionist. He never let us commit the code even if the code indentation is not correct. One day we were working late night (12:00 PM) and we got to deliver some urgent deliverable. At that time also he insisted to correct the indentation, cleanup imports, unused variables, strictly following TABs or spaces consistently etc.

But later we realized how important it is while merging all the code changes from different developers. He always says “If you are going to do something, do it well. Otherwise don’t do it”.

As my other team members were also my close friends we didn’t have any conflicts and no politics at all between us. We used to have Friday night parties from 9 PM to 2AM, cracking jokes on all the people in office. So everything was wonderful.

The Real Journey Starts
After  3 years at my first company I resigned and joined a BIG company assuming “Big company means better work, better pay and better work culture“. I quickly realized that it is not at all the case!. There I was working on a legacy application which has horrible codebase that I have ever worked till then.

In addition to that I ended up working with developers who stick with that company for a long time, stopped learning anything new, have no interest to make the application better and want to do things in the same familiar way even though it is painful.

As Indian IT industry is mostly based on offshore development model, most of the times we end up maintaining the legacy code bases. Rarely we got chance to work on greenfield projects. Even for those greenfield projects the key architecture/design aspects will be done by onsite team.

Fortunately I got chance to work on few greenfield projects and involved in designing the application from scratch.

In many of the organizations there is no clear career path for those who want to continue in Technology Stream and don’t want to go to People Management. Even worse some companies force developers to step into people management after some years of experience.

Different people will have different interests in their life and not all developers must be passionate about the technology, and that’s fine. Some people are 9 AM to 6 PM types, and some are just get it done by whatever means and don’t care about code quality or maintainability etc. It is very difficult to find the passionate developers in India because most of the people start programming as part of the Job only, not for fun or habit.

At times when I learn something new or did some cool stuff then I look around to share my wow moment and I find no one who can understand my excitement.

The New Blogger On The Floor
I was working in a project using Struts 1.x framework and I got into some tricky issue. I couldn’t find any solution after struggling for 3 days also. I kept on debugging and searching all over the books and forums. Finally someone wrote an article on the exact problem and provided a solution. I followed his solution and it worked. I told million thanks to the blog author. But the thought that some unknown developer’s blog helped me a lot stuck in my mind. I too wanted to start a blog. May be I too can give something back to the community. So I started my blog writing about the things that I learn.

Soon my articles got published on community websites like DZone and JavaCodeGeeks. Though my English writing skills are not good enough I keep on writing articles and I hope now I am getting it little bit better.

When someone post a comment saying “Your article helped me to learn something”, I feel very happy. I take lot of help from community like StackOverflow, blogs, forums etc. If possible I try giving something back to the community, my 2 cents πŸ™‚

Becoming A Book Author

After I started blogging and my articles got published on DZone and JavaCodeGeeks, my blog started getting more and more visitors. One day I received an email from Packt Publishers asking me whether I am interested to write a book on MyBatis and I was very excited about it.

Once I agreed to write the book, they explained the writing process and the payment details. They might not know that I would have written the book even without any pay. I agreed to write book because of my passion for technology, not to earn money.

When I almost completed writing my first book I was asked to write another book on PrimeFaces and I agreed. Approximately it took 18 months to write those two books. During all these 18 months I didn’t have any breaks, no week-ends, no outings, nothing. Whenever I find time I keep on writing or reading what I have already written to see if I can make it better.

That was the time I realized how important it is to have some free time in life. Writing book is incredibly time consuming. If you are planning to write a book with the motivation of earning money, I would suggest to look for other options!!

Finally one day I got a courier and I see the printed copies of my MyBatis book. It feels great to hold the book in your hand that you wrote. I got very emotional that day.

Challenges for passionate developers in India
There are many issues that Indian Software Developers face.

Good developers are like war heroes

As most of the projects we got are legacy projects or may be in maintenance mode, the management likes those people who are loyal and stick with the company (even though you don’t pay well or treat them like one type of RESOURCE) rather than strong technical people.

Good developers are like war heroes, they are required while starting a new project or creating some core design. Once the core design is ready other developers can follow the design and add methods to the flow. Just like once the war is over no one cares where are those heroes, once the core design of the system is ready many companies won’t care about those good developers.

Many Non-Indian Techies hate Indian developers

Every now and then I read articles about Indian Software Developers by someone bashing all the Indian software developers concluding the whole Indian IT is crap. Well, that is one individual’s opinion and different people have different opinions, and that’s perfectly OK.

See this article and read the comments. Even someone wants sponsor Pakistan to bomb India. Very matured people!!.

The main problem with Indian IT companies is in order to get the project they convince the client that they can deliver the project in almost impossible timelines. To meet these crazy timelines they push managers to get it done and managers force team leads to get it done and the team leads put deadlines to developers. And here is is the biggest problem with Indian developers. Many of the Indian Developers don’t know how to say “NO”. They simply accept the crazy timelines and try to finish it. And the outcome of this whole process is “Unmaintainable crappy code”.

But I always have few questions in my mind. How the on-site Non-Indian client believes “Indian off-shore team can build it in 6 months when on-site team estimated 18 months for the same project”? Why don’t they ask for End-To-End Test Suite? Why don’t they ask for Code Quality reports?

Greediness to get it done for cheapest possible cost!!  You get what you paid for!!

Those who generalizes and say “The whole Indian Software Developers are bad” should think before saying things like this. I don’t think all the people living in one geographical location will automatically become good or bad. There will be good developers as well as bad developer everywhere. I worked with some onsite developers who are very arrogant. So is it correct to say all the on-site developers are arrogant. That will be ABSOLUTELY WRONG.

I strongly believe that there are great developers and architects also In India and I worked with some of them.

There are people like me who want to learn something everyday and become a better developer than yesterday. Over the years I learned “How to learn new things quickly?”. So I learn as many things as possible and be ready to work on anything. You want me to work on Spring or JavaEE, I am fine. You want me to work on Python or RoR I am ready. You want me to use Eclipse or NetBeans, no problem.

Following the Community
As I said it is very difficult to find passionate developers in India, I try to make contacts with the passionate developers around the world using Social Networks like Twitter.

I like to attend technical conferences and meet other great developers. But unfortunately there are very less conferences happens in India compared to USA. So I try to watch those conference talks on InfoQ, Parleys or Youtube and I enjoy it a lot.

I love the talks by Venkat Subramaniam (@venkat_s) which are very informative and funny. I can’t stop laughing after reading few jokes in his book  Programming Groovy 2: Dynamic Productivity for the Java Developer He is really an amazing man.

Talks by Venkat Subramaniam on Parleys
How To Approach Refactoring by Venkat Subramaniam
Ten Cool Things We Can Do with Popular JVM Languages
33rd Degree 2012 – Pointy haired bosses and pragmatic programmers – Venkat Subramaniam
Scala for the Intrigued

I am a big fan of Rod Johnson and I love his talks on Entrepreneurialism and the “Things I wish I’d known”  in which he shared his journey of building Spring framework and creating an ecosystem around it. What a great presentation.

I also watched his “Scala in 2018” talk and a discussion regarding the same Scala talk on youtube His way of taking the constructive criticism amazed me. He is awesome man.

I also love the talks by Uncle Bob, Martin Fowler, David Heinemeier Hansson (DHH). We can learn lot of things from their decades of experience.

I follow the talks and blogs of the awesome Java community leaders like
Antonio Goncalves @agoncal
Adam Bien @AdamBien
Reza Rahman @reza_rahman
Arun Gupta @arungupta
Josh Long @starbuxman
Phil Webb @phillip_webb
Cagatay Civici @cagataycivici
Oliver Gierke @olivergierke
David Blevins @dblevins
and many more.

I don’t miss even a single blog post or tweet from the rock star bloggers like
Baeldung @baeldung
Petri Kainulainen @petrikainulaine
Vlad Mihalcea @vlad_mihalcea
Abhishek Gupta @abhi_tweeter
Manuel Jordan @dr_pompeii
Lukas Eder @lukaseder
Trisha Gee @trisha_gee
Thorben Janssen @thjanssen123
Nicolas Frankel @nicolas_frankel
and many more.

I love this whole awesome Java community!!

Looking towards better future

In recent years things are getting changed. Now Indian IT industry is not completely depending upon USA based projects. There is a lot of growth in technology adoption in Indian businesses. But again unless the thought process changed nothing is going to get better. Companies should stop expecting “9 developers to deliver a baby in 1 month”.

Developer should become more professional and have guts to say “NO” when they asked to code which they can’t implement with good quality.

Anyway, over the years I learned Software Development is not all about technology. The key part is understanding the business domain and communicating with the other people.

Hoping things will get better πŸ™‚

Can MicroServices Architecture Solve All Your Problems?

IT is one field where you can find new things coming everyday. Theses days the whole developer community websites are flooded with MicroServices and Docker related stuff. Among them the idea of MicroServices is very exciting and encourages better way of building software systems. But as with any architectural style there will be pros and cons to every approach.

Before discussing what are good and bad sides of MicroServices approach, first let me say what I understood about MicroServices.

MicroServices architecture encourage to build small, focused subsystems which can be integrated into the whole system preferably using REST protocol.

Now lets discuss on various aspects of MicroServices architecture.

The dream of every software architect/developer:
First of all the idea of MicroServices is not new at all. From the very beginning our elders suggest to write classes focusing on one Single Responsibility and write methods to do one particular thing and do it well. Also we were encouraged to build separate modules which can perform some functionally related tasks. Then we bundle all these separate modules together and build an application delegating the appropriate tasks to respective modules. This is what we try to do for many year.

But the idea of MicroServices took this approach to next level where you can deploy each module as an individual deployable unit and each service can communicate with any other Service based on some agreed protocol (preferably REST, another trendy cool thing :-)).

So what are the advantages of this MicroServices architectures? There are plenty.

  • You will have many small services with manageable codebases which is easy to read and understand.
  • You can confidently refactor or rewrite entire service because there won’t be any impact on other services.
  • Each microservice can be deployed independently so that adding new features or upgrading any existing software/hardware platform won’t affect other services.
  • You can easily adopt the next cool technology. If one of microservices is very critical service and performance is the highest priority then we can write that particular service using Scala in order to leverage your multi-core hardware support.
  • If you are a service provider company you can sell each service separately possibly making better money compared to selling whole monolithic product.
  • And most important factor is, the term MicroService is cool πŸ™‚

What is the other side of MicroServices architecture?

As with any approach, MicroServices also has some down sides and associated cost.

 “Great power comes with great responsibility”. -Uncle Ben

Let us see what are the challenges to implement a system using MicroServices architecture.

The idea of MicroServices is very simple but very complex to implement in reality.
In a monolithic system, the communication between various subsystems are mostly direct object communication. But in MicroServices based system, in order to communicate with other services you may use REST services which means additional HTTP call overhead and its inherent issues like network latency, possible communication failures etc. So we need to consider various aspects while implementing inter-service communication logic such as retry, fail-over and service down scenarios etc.

How good is your DevOps infrastructure?

In order to go with MicroServices architecture, organization should have a good DevOps team to properly maintain the dozens of MicroService applications.
Do your organization has DevOps culture? Or your organization has the problem of blame game between Devs and Ops? If your organization doesn’t have a good DevOps culture and software/hardware resources then MicroServices architecture will be much more difficult to adopt.

Are we fixing the actual problem at all?

Now many people are saying MicroServices architecture is better than Monolithic architecture. But is Monolithic architecture is the actual reason why many projects are failing? Will MicroServices architecture save the projects from failing? I guess NO.

Think, what were the reasons for your previously failed projects. Are those projects failed because of technology issues or people issues?
I have never seen a project which is failed because of the wrong technology selection, or wrong architectural approach. But I have seen many projects failing just because of problems with people.

I feel there are more severe issues than architecture issues which are causing projects to be failed such as:

  • Having developers without sufficient skills
  • Having developers who don’t want to learn anything new
  • Having developers who don’t have courage to say “NO, we can’t do that in that time”
  • Having Architects who abandoned coding years ago
  • Having Architects who think they know everything and don’t need to listen to their developers pain
  • Having Managers who just blame the developers for not meeting the imposed deadlines without ever asking the  developers for time-lines

These are the real problems which are really causing the project failures.

Now do you think just moving to MicroServices architecture saves the IT without fixing these problems?

Continuously innovating new ways of doing things is awesome and is required to move ahead. At the same time assuming “the next cool methodology/technology will fix all the problems is also wrong”.

So those of you who are just about to jump on MicroServices boat..THINK. FIX THE REAL PROBLEMS FIRST. You can’t fill a bottle which has a hole at it’s bottom.

How much crap you are keeping because “You might need it in future”?

How much crap you are keeping because “You might need it in future”?

I am planning to move to a new house in a couple of weeks, so I started packing things and throwing away unnecessary stuff.

In the process of identifying unnecessary stuff I realized how much crap I am keeping in my house thinking it might be required in future.

But I only came to know that I have these things while looking for waste to throw away. Lots of stuff..CDs/DVDs with JDK1.4/1.5, Eclipse 3.2, Spring, MySQL4.x, WebLogic Server 10, Utilities(AVG 2007, MS OFFICE 2003, Winamp/VLC players), broken DVD Writer and HardDrive and lots of clothes which I can’t wear anymore, many other electronic goods which are not working and many more.

While cleaning up all these things and throwing away all unnecessary things I got a thought like “Aren’t we doing the same mistake while developing software?”.

First we keep adding unnecessary features assuming we might need them in future to support all types of *bilities(Scalability, Extendability,Maintainability etc). After a while “That future purpose features” becomes a “Dark Room” where no one knows what exactly in there and many people don’t even bother to know why it is there in the first place.

Even horrible thing is you might be in a situation where “whenever you add some new required feature you might have to add some code/configuration in that future purpose module as well”. You don’t know why you have to do it or you have to do it just because to pass the build.

Moving to a new place quickly is painful when you have unnecessary luggage. Being Agile is very difficult if you have unnecessary future purpose code about what you forgot a long time ago.

Less luggage, more comfort. Applies both to personal life and Software Development as well πŸ™‚

What is your favorite open source project?

I do spend at-least couple of hours everyday reading about what is going on in Java community to be aware where we are heading and what is hot these days.

Because in Java land everyday new frameworks, new libraries came out and few of them might be really good and can drastically simplify the work you are doing. So I thought it is good to know about these new and hot stuff even if you are not going to use them in your official project.

In the last few years it looks like frameworks craze is gone and Programming Languages era begins. Ceylon, Kotlin, XTend, Go, Dart, Swift etc etc…every BIG company is trying to invent their own programming language.

But I feel like again things got changed in 2014, now everyone talks about MicroServices and Platform.

Based on my understanding, Platform means a generic infrastructure tailored to solve one type of domain problem by using one or more programming languages (Polyglot programming) based on the need. You no need to stick to one programming language.

And then I am seeing on web, more and more companies started calling their “framework” as a “platform” which makes me wondering when this framework turned into Platform.

To tell this satirically I posted the following tweet on twitter.

“Seems frameworks & programming languages craze is gone..Now if u want to sound like a model IT developers spel Platform as much as possible.”

Interestingly this turned into another interesting discussion where my favorite twitter buddies participated.

Now the topic of interest is “Whether writing a book is good option or not. If yes, writing on what? Spring, SQL, JOOQ???

My friend @lukaseder feels instead of writing about Spring, better to write on SQL. And @petrikainulaine expressed his opinion that “he is not that passionate about SQL” which is my opinion too.

Twitter isn’t nice place for long discussion because of 140 char limit. So I created this post on my blog so that we can continue on this topic more elaborately.

First is writing a book a good option?

Yes, if you are passionate about technology and the topic you are writing about. No, if you are writing just to earn money. No, if you don’t want to spend your weekends also writing content thinking you could improve content within the page limit :-).

And my friend @dr_pompeii brought up another issue “Piracy”. Yes, that’s one of the problem. You can get a pirated e-copy of most of the books in 2 months.

On what topic should you write? Better to write on SQL instead of Spring?
Here I disagree with LukasEder :-). I write on topics which I am interested in and have good understanding. And let me shamelessly agree that I am not very good at SQL and I can’t write a book on it which is more interesting than any of the existing SQL books. And most importantly I don’t have a passion on SQL.

Promoting the articles on popular website might not be that difficult. I can write couple of posts about JavaEE 7 and let Reza do the promoting part πŸ™‚

I like Spring not just because of its popularity, I do learn how to design and code in a better by going through its source code. I learn how to write a good abstraction layer by looking into various Template classes and Adapters in Spring source code.

At time I also feel like I am after this Spring framework for a very long time and want to learn something different and more interesting.

So if it is not Spring, what is a good open source project that you suggest worth reading its source code and learn something good?
I thought of taking a deep look into Jersey (JAX-RS) and SLF4J libraries.

What would you suggest? Any ideas?

Do you have defect id to burn the hours spent on code refactoring?

Working on a large legacy code-base is challenging(painful?) and is inevitable.
You may need to keep on refactoring the legacy code to fix bugs, to add new features or enhancements.
For these changes normally we would have a defect or new requirement created in QualityCenter/VersionOne or whatever the tool you use for tracking the tasks. We burn the hours spent on these tasks against the respective defect-id or requirement-id.

Then assume you identify some piece of code which is written in horrible way and thought of refactoring that logic. Generally we will create a defect-id explaining the need for refactoring and refactor, test, commit, done.

In some organizations, as per process every commit to the source code should be associated with some defect-id or requirement-id.

What if your manager said

As per our process, every commit should be associated with a defect/requirement.
We can create a defect for code refactoring that you are suggesting. Every code change should go through all the QA/UAT cycles. But the business will prioritize the defects/features for the next release as per release plan. So I can’t assure you whether this will go in next release or not.

I guess you can understand what that manager’s reply implies :-).

But I felt like from the manager’s perspective it is valid point. His target might be to deliver the planned bug-fixes/features for the next release.

So guys, I am curious to know how is code refactoring is happening in your organizations?