My first decade as a professional software developer
Today (at the time of this writing) I completed my first decade of being a professional software developer. Though I usually hate using the term 'journey' for things unrelated to travel, I'll make this one an exception for all the mental displacement I went through during this period.
Summary
In this article, I reflect back on how I started as (or ended up being) a software developer, what all I experienced in this professional world till this day and how I saw myself change in almost every aspect of my approach towards programming, computers, and technology in general.
My background with computers and software development
Not so long ago...
'First Contact'
My first encounter with a personal computer was in 1995 when I saw it from across a glass window covered in cloth over the monitor screen and an "anti-glare" layer of dark glass over the screen. The owner of the computer was kind enough to let me play a couple of boring games on it for about an hour and that was it.
Computers at my school
A few months later, computers were introduced to my class at school. It was my fifth grade and my second experience with a personal computer, only this time officially. 'Computers' was a course in every grade until the ninth grade with syllabus consisting of the same repetitive topics, the first chapter in every grade being "Introduction to Computers" over and over again. While the world outside the campus was already using Microsoft Windows 98 and Microsoft Office, they "pretended to teach" us outdated software like Wordstar, Logo, Basic and QBasic, etc. with no context what-so-ever.
Our teachers had no idea what they were talking about, all of their speech during the lectures was based out of some hand-written notes and just tried to act smarter than the rest of the faculty for them being next-gen because they knew computers, or at least they believed they did. We did have practical sessions where they divided the class into two parts, each half taking their turn in the computer lab with three kids sharing one computer, taking turns to play PacMan or Snake (or Dragon Ball) for the entire one hour, wasting that precious time that could have been utilized to teach us basics like for example what those hundred keys on the keyboard were for. The computer fees were significantly higher by magnitudes compared to the rest of the entire curriculum and all that money just to play arcade games on a monochromatic screen without being taught what a computer was. Oh wait, they did teach us what a computer was, over and over again that itself being the first statement in the first chapter for every grade and the answer was, "A computer is an electronic machine". That's all that you need to know, don't you?
I remember memorizing QBasic programs for practical exams because neither did they tell us, nor did I ever learn how the let
statement was different from an input
statement. Yes, they did teach us the difference between a variable and a constant in the first chapter, in every single grade till the ninth grade, but never explained to us or showed a real example for us to realize the role of a variable in a computer program.
The first desktop computer in my family
The very first computer to get introduced in my (entire) family tree (or even the neighboring trees if I think about it now) was a pre-owned desktop computer at the end of the year 1999. It had brand new white-colored peripherals including a Samtron 15" color CRT monitor and a heavy three-button ball-mouse. The processor was an 80486 running a few Megs of RAM with a dual-boot of Windows 95 and Windows 3.1, which I had no idea about and learned what it all actually means after about a year of playing DOS-based games through memorized commands typed on an MS-DOS Command Prompt Window. Along with the well-known 'C' drive, the computer also had 'A' and 'B' drives for 3.5" and 5.25" floppy drives so I never really had the question that a kid would have today: why the drive letters start from 'C'.
It was already my two years of 'learning' computers at school by then, but I still wasn't that comfortable with computers, given the kind of curriculum we had at school.
What I thought of a computer before 1999
For me, computers almost had only two primary uses: creating those boring monochromatic documents that I saw people at my dad's workplace create, and playing fun video-games that a few computer technicians made us believe spoilt computers.
I had a Little Master TV video-game system at home that I had limited exposure to, and that was the only thing that I imagined our new computer in the house will replace. During a few conversations during recess at school, some kids talked about a few video-games that I had never heard of. I later learned that they were mostly Prince of Persia and Dangerous Dave but before I did, all that I could relate those to was Super Mario, which wasn't exactly my favorite game.
On the day the computer-guy assembled our first computer at home, I was surprised to learn that the same audio disc that we played on our Sony music system could also be played on a computer. There were a lot of unknowns though, as the need for a music player software like Winamp or Windows Media Player, which were almost the only two options that I knew of at that time.
Computer books and magazines
I had a near-regular supply of outdated Computers@Home magazines at home via a family friend between 1999 and 2001. It formed my second most read written material after my mathematics textbooks from school.
It was quite similar to Digit and PCQuest, which were two of the very few computer magazines available in India back then. Getting my hands on a new magazine issue every month was exciting and something that I looked forward to. I read all the answers to the questions from readers they featured every month. Yes, I don't remember people talking about online forums back then. People mailed them questions and waited for an answer to be printed in the next magazine issue. Every issue came with a compact disc containing goodies that ranged from essential software like WinZip and WinRar to Windows Media Player and Winamp themes to video-game demos. Not having an internet connection at home, the disc was our only source to update Winamp to the latest version.
We also took a subscription for a year so that we received the latest magazines along with the latest software versions without that one-month delay and this time we didn't have to return magazine (and the disc) after reading. I still have them stashed at home back in India just for memories.
Computers, Indian kids and Indian parents
I come from a (lower) middle-class Indian family where computers were (and to an extent still are) considered hazardous to kids as they are believed to be a distraction from studies. It's almost as if (and it may sound hilarious) access to a computer at home could potentially ruin the 'career' of a child.
As soon as I realized the potential of computers, my interaction was not limited to just playing video-games anymore. I used the desktop at home to learn things, contrary to what my elders must be imagining that I was losing a few marks in my exams with every minute spent with the machine.
Discovery of my resonance with computer programming
There was no doubt anymore that computers were helping me so much. I was learning things at a rate I never did before. It was partly because I was not the regular kid who would go out and play with my friends after school and learn a few things here and there, but I was one who didn't know what to do with my time once I'm home apart from drawing weird little shapes on paper with a worn-out pencil and counting them in different order every time.
I improved my hand-writing by closely observing computer fonts, learned English as a spoken language from dialogues in video-game demos from those monthly compact-discs (we rarely bought full games and that wasn't a time where there used to be free games). Neither did I have an idea that I'd have a career with computers, nor did I know of a way to convince my parents that computers aren't hurting my academics but are helping me and hence my interaction with computers remained limited.
Being a computer/gadget geek at school
With my interest in all things computers, I always had an edge among my friends in school. In ninth grade, I took the initiative to understand most of what those QBasic programs meant. I finally appeared for my computer practical exams without re-memorizing the same programs that were taught in previous grades and managed to clear the tests writing all programs on my own. That's what I call progress!
My non-CS education
I took up engineering after my high-school which was fairly rare in India in the early 2000s, where most of us (especially kids from my community) were to choose between either science, commerce or arts. It was almost the start of a trend for Computer engineering over there right when I was in the decision phase and I decided not to pick that option mostly because it was too mainstream. There were a few other majors that I could've gone with including Automobile engineering (for my love for cars) for which there were no colleges in my city and Mechanical engineering (out of my interest in physics) for which a few people scared me about how difficult it would be for me given how physically weak I was in school. Almost no one from my community had ever traveled away from home for education so how could I?
I started with my course of Diploma in Industrial Electronics engineering which was fairly easily available in colleges nearby. I joined as a computer nerd with plenty of interest in learning about computers but with almost no understanding of computer programming. With the limited exposure that I got with computer programming subjects in my college, I had no resources to reach out to for learning more. I was probably the only one in my entire classroom who enjoyed our first programming subject: "Programming with C" while the rest of us were really scared of it. Their fear must be partly due to the way it was presented to us. I consider myself lucky to get past it and still end up liking it. There were instances when I was the one to reach out to for solutions to errors in programs during practical sessions, sometimes even by the educator.
In 2009, I graduated as an Electronics Engineer looking for a career in computers. It was exactly the other way around for most of my friends and classmates where they were being pulled towards this profession out of limited opportunities in Electronics or anything else in general but they were still scared of programming and had limited to no interest in working with computers.
My first job as a software developer
And the decade finally starts...
On December 7th, 2009, I started working with Infosys Limited in India, the second-largest software exporter in the country at that time.
My entry into the 'corporate' world
As it is mostly the case for engineering graduates in India, my first job was through a campus placement drive where I was offered a job more than a year before I completed my degree in Electronics engineering. Out of about 480 of us appearing for the recruitment drive that day, I made it to the final 11 to get a job offer. I later learned that I barely passed the tests before the final HR interview, but somehow managed to convince the interviewer that I was worth hiring for even an entry-level role as a software developer, even with terrible communication skills and close to zero general knowledge.
The job started with a six-month training on a specific random technology stack that they thought would work for my group. The entire batch of hundreds of candidates from all over the country was divided into groups and put into technical training for a very specific technology, which followed after a mandatory three days of "introduction to computers", once again! The ones among us with a computer science background were exempted from the 'basics' and were assigned projects way quicker than us. Needless to say, the training was by far my best days at the company where I got to learn quite a lot about software development at the pace that suits me, sort of what I always dreamed of during my engineering, which was spending a little more time with variables and methods than with filters and amplifiers.
How things were different than what I imagined them to be
The training ended in about six months and we were again randomly assigned to projects according to some fictitious business requirements. The assignment made no sense at all, where a colleague of mine who went through rigorous training on Java for around six months was now assigned a project based on .Net. On the other hand, after nailing my .Net stack training, I was assigned a project based on some alien technology where programming was not even remotely involved. It was Siebel CRM, completely out of a random.
It wasn't that I was afraid to learn something different, but looking at a few people who were working on the technology (and in the team) for a few years, it was not that difficult to figure out that it was not the kind of work (or place) I'd want to spend time at. Many people in the team had lost the ability to think like a programmer or to an extent, even write a basic computer program!
Me being trapped in a toxic work environment
I worked on a couple of projects at my first job. The first one gave me a few very haunting months of my professional career. Nothing 'taught' to me during the training was even remotely helpful in my first project assignment, be it technical skills or professional skills. Work-life balance was worse than terrible and most of my team-mates including my manager made me feel that I don't belong there in the first place and looked down at me.
I couldn't believe that someone like me, who aced in almost every effort related to programming during my school and even the technical training right before this job was now facing issues to deal with work pressure on the kind of job that I was supposed to be comfortable at. I spent most of my time learning .Net, having fun writing my programs and sort of preparing for my next job during late hours after work until around 01:00 AM every day.
Leaving my first job
I couldn't continue working like that where work was punishment every single day. Out of the disrespect and demotivation at my first job along with irrelevance to technology, I switched my job. After wasting around two years of my career working on (or pretending to work on) things that didn't make any sense to me, I took a job as a .Net developer with zero professional (but plenty of practical) experience on the stack.
Further into my professional career
Life gave me another chance to work with an entirely different crowd, and this time it was a team of exceptionally talented people at my second job. Except for the initial few weeks of imposter and insecurity, life was now fun again. I got to work with people who not only helped me at work but also encouraged me throughout my term at that job.
Another unplanned shift in my career
My second job brought an unplanned shift in my career. Just like my first job, this one was not exactly around what I wanted to do: the job title was ".Net development" but now I was a front-end developer. Because I started with CSS, I was unofficially referred to as a UI developer for quite a few months, later stepping into the rest of the front-end. I quickly became one of the best with CSS at the organization.
I was still missing writing VB in Visual Studio, the feeling of being able "fly with code", talking to the computer and communicating exactly what I want from the program. However, on the other hand, going back to basics like HTML, writing my first CSS style-rule, and finally realizing what JavaScript was all about was just priceless.
A few months into the front-end world, I started replacing all my previous personal web-implementations with front-end code written using open technologies. JavaScript helped me reduce my dependency on ASP.Net, plain HTML and CSS helped me get rid of Silverlight controls written in XAML.
Massive switch in my expectation from computers
Moving from proprietary technologies like VB, C#, WPF, Silverlight, and .Net in general to a few as open as JavaScript that can run almost without any external dependency, my tool-set began to change as well. The only thing 'Microsoft' in my entire stack was all that was required to compile and run my ASP.Net websites.
My brother (my first human contact, my partner in all things related to technology, my teacher who also taught me computer hardware, and my successor who's better than me in almost everything I do) tfKamran, just like he always comes up with new stuff, also introduced me to the world on Linux. That new direction changed the way I looked at computers for the rest of my life.
This did not happen all of a sudden but over a period of a couple of years during which we carried an instance of Ubuntu Gnome on a USB flash drive with us for cool stuff that we only knew one could do on Linux. Somewhere in 2013, I took the leap and replaced Windows on my first primary personal workstation with Ubuntu Unity 13.04. This did get me scared about my .Net dependent development tasks for which I had a VM running Windows 7 for over a year on my constantly changing Linux distros, while the rest of my setup could now reside naturally and with ease on Linux. A little further into the timeline, I replaced my entire .Net dependent code with JavaScript running on Node.js and gave up Windows entirely, except for a few video-games running via a dual-boot with a reasonably sized Windows partition on the same hard-drive.
Working with Linux taught me so much more than I would probably have ever known about computers. From running commands in a terminal for everyday tasks instead of using the graphical interface, to maintaining my workstation setup scripts and whatnot. Not to mention that inexhaustive list of choices for Linux distros, desktop environments, and window managers, etc. This also helped me cope with the Carpal tunnel syndrome that I acquired during my first job as I had limited use for a computer mouse with my increasing use of keyboard shortcuts.
A few years later, both of us switched to macOS with him leading once again as always. This did not change our operating system this time but just added another dimension to our computing experience. I still have at least one instance of Linux residing in a virtual machine on my MacBook Pro to still be able to play with toys like Fedora, i3wm, etc. just like the old times.
Finding resonance also at the workplace
Working on cool cutting-edge technology and with a great team brought my love for programming at work back to life. Adding to that my first best friend from work who was also my team-lead, coding at work was enjoyable again. Apart from our project deliverables, I also participated in various official and non-official technical training, coding-competitions and other technical fun activities in the company.
I gained a new hobby: presenting technical talks in front of a group of people, which is something that given my personality, I never thought I would be able to. Once I literally turned-over a request for a front-end training in the organization saying that I won't be able to pull it off especially in front of an audience full of people whom I have never interacted with before. Later after a few months, I received "the best trainer" award for a quarter, just proving the point that things were different now.
My introduction to open-source and free software
I was introduced to open-source software right in the middle of the decade. Some of it came to me due to the kind of work I was doing and the rest with the tools I was using for the job.
Discovering GitHub
Many of the libraries that I worked with for my front-end development role were found on GitHub. For me, it was a portal where downloading a library was an exception. They kept suggesting that one could clone
the source which was something that I had no idea for what it meant or how it would help me either.
My first project on GitHub was one to contain my solutions for problems on Project Euler. All my solutions were in JavaScript, a language that I used to hate not any longer than half a year ago. During the same time, a random conversation at work (with the same person who made coding at work fun) about another alien term "Emacs" changed "the world" around me, giving birth to my second GitHub project that I used to store my personal configuration. I didn't know that a practice to store one's Emacs configuration as a GitHub project existed until I posted a "barely-working" configuration and later found a few very mature ones. Fast-forward to last month, I just made my 500th commit to the repository and decided to create my 71st project for the very same thing, to once again extract my Emacs configuration to a separate repository of its own.
From txt
to md
I started with not knowing the purpose of an md
extension for a text file to hold plain text and ended up realizing the importance of the Markdown language, learning it, using it and even teaching and promoting it at work. Now I had my own README.md files for all my source projects on GitHub and also made a few attempts to use the language for much more than just documentation.
At the time of this writing, I had already made five attempts to create my custom presentation tool out of which three of them used markdown as a language directly or indirectly.
Being an active contributor to the community
At the end of the decade, I ended up owning over 70 open-source repositories at GitHub around a few different areas of software. There are:
- Front-end libraries
- Node.js libraries and apps
- Small web-apps
- Emacs starter-kits, extensions and color themes
- Google Chrome extensions
- Project templates and boilerplate code
- Documentation projects, lists, and training-material
- Docker images
- My dotfiles and Emacs configurations, the kind of stuff where it all started
- ... more
Many of them are libraries and extensions that are hosted on package managers and archives for their respective platforms.
I finally crossed 1k reputation on StackOverflow and a little on a few other StackExchange communities. I created a few failed YouTube video series on my channel and wrote a bunch of boring posts on DEV.to with almost a thousand followers. It's hard to believe that there are real people that find me worth listening (or reading) to. :)
A few noteworthy experiences
Ten years is a big time to be able to recollect experiences from those exactly a hundred and twenty months. Below is a very small list mentioning a few significant ones.
Humiliation and discouragement at the start of my professional career
My first professional project assignment not only still upsets me, but also haunts me to a certain degree. Leaving out the fact for how a high-performer from the on-job training could prove out to be a low-performer on the real job, there were way too many issues at the set over there. Workaholic managers who didn't care about the personal life of their teams, arrogant team-mates who made every effort to scare and intimidate new joiners, people who ensured job security by keeping their code as encrypted as possible to make it almost impossible for someone else to do the job, and the list goes on. I expected (and still do) team-members to help new people and get them on board, not only as a gesture of good-will but also for their own good in the future. The culture over there was exactly the opposite.
I was asked the reason for not using my brains at work and was even indirectly asked to consider changing my profession. Well, here I am, I just completed a decade being a software developer and that person works right in the neighboring state. I'd love to meet him one day and talk about my incredible experiences after I left his degrading team.
Realizing that I'm not a "star"
I was told at my first job that no matter how many times my colleagues and I will change our jobs and wherever we go in the future, we'll always be standing out from the crowd because of our talents and skills. However, my second job was an eye-opener where I got to meet a few very talented and hard-working people, only to quickly realize that I'm not kind of "star" they told me I was.
Some people were far better at their job than me and my training batch-mates from my previous job. It was just that they were not only getting appreciated for that kind of performance but were also getting compensated well for the job without the toxic environment I had to spend months of my life in.
Being asked to slow down at work
This was another shattering moment for me when I received instructions at work to slow down and not work a little too hard outside my boring daily job. Not able to contain my passion for computer programs and technology, I was just trying to do my job a little better than they would've expected from me at that role, not realizing the kind of insecurity it poses to people who've been there in the organization since a few years before me. I'd not use any names here (nor would it be of any positive help), but all I'd say is that it was devastating.
People stealing credit for their own career path
This is something that I'm sort of used to now. This hasn't happened to me just once or twice. Moreover many instances ended up the other party getting publicly applauded and even offered a promotion. It's also a mistake at my part that I tend to take every question asked at work seriously, even those discussed in small-talks and side-conversations and end up not only losing the credit for it but see it reach the masses through someone else who did not even have the courtesy to pass a small credit or acknowledgment for my selfless help.
A few things that I learned
Learning technology was relatively easy but the decade was full of learning other things as well.
Cool things vs Real-world code
It's very easy for a technology enthusiast to drown in fascination with new things showing up on the surface of the earth every day. As you get familiar with new stuff, get a little comfortable with it and realize the good things that it brings in your software, you tend to use it in every single implementation you create. At work, not everyone welcomes (or even accepts) change that quickly which makes it a little difficult to introduce "that cool thing" in a team of more than a single person, which otherwise would have been just you.
Having said that, it's not impossible to do that either. I've seen people pull that off without much reasoning and end up changing the entire codebase just because they 'think' something awesome is out there and we should use it. On the other hand, I've been into situations where I could see a solution to a particular problem but failed to convince my team to use it either I wasn't assertive enough or they didn't trust me due to being new at the job.
Loving your job vs Being good at your job
I'll start by stating that even after spending hours with code outside of work daily for over 15 years now, I think I'm still a mediocre developer. My passion for software and technology may not be affecting how professionally effective I am. I've learned that one won't always be great at something one loves to do.
One example of this comes from my unpopular interest in mountain biking. I love it but suck at it at the same time. I've spent months trying to get even a basic bunny-hop to work but failed to lift the rear-wheel in the air by more than even an inch. I did end up hurting myself at multiple places back in late 2018, eventually indefinitely postponing my learning.
Speed vs Experience
I've learned that there are at least two ways to solve a problem: speed (which in most cases is pure brute-force) and experience (which I relate to smart-work). I realize that over the past few years, I may have lost the speed at which I code, but I've gained experience and resilience so that I can take those shorter routes facing more resistance and reach the desired goal with lesser effort and maybe even earlier.
Skills or Number of years
During the earlier years of my career, I used to believe that the number of years you spend in this industry dictates your growth. Then I came across a few people who proved me wrong by growing way beyond their year count in the profession. Later I thought that it must be your skills that help you grow, only to learn that I was wrong even this time.
Now I realize that there is no single variable for success but it's a combination of many factors that you don't get to see in the final result. I've also seen a person with far superior skills not receiving the kind of attention/respect/ears/(or whatever) one would expect for being good at their job compared to a person who has spent more years with the same company and has been around for long at the same place. This could be exactly the opposite where a new member of the team may end up stealing the show even though they may not be adding that kind of value that the older team-members may be adding.
It's all very complicated and I'm still not sure what it is. Maybe it needs more of talking, maybe a little more bragging, or maybe stealing other people's work for your own credit? Just saying.
The purpose of writing this article
One of the main reasons for me to write this article was to reflect back at the last decade to not only realize and appreciate how great the 'journey' has been but to also look at and find inspiration in my own story. I know that working for a decade in an industry is not that big of a deal where we have some experts with several decades of experience, but I still consider this an achievement for me, especially after surviving the big reset last year, that could have prevented me from completing this decade.
NOTE: Some parts of this article may sound like a brag and some like a rant but that is purely unintentional. I'm still trying to make myself worthy in the software industry, still trying to figure out what this is all about and I'm not even remotely there yet.