RSSAmplifier

Blog

Software the Hard way

Thoughts on Software Development

software.rajivprab.comRSS feed ↗28 posts

Latest posts

Using Subagents to Improve Claude Code Results: A Step-By-Step Guide

Unless you’ve been living under a rock, you’re well aware of AI agents like Claude Code and Codex revolutionizing software development. These tools are undoubtedly easy to learn, but are also hard to master. There are a ton of nuances and best-practices that can help you get much better results from your coding agent. As … Continue reading Using Subagents to Improve Claude Code Results: A…

Tech debt can’t be solved as a roadmap item. It needs to be part of your daily routine

As an engineering leader, I’ve seen the following pattern play out multiple times, across multiple companies The trap that people keep falling into over and over again: assuming that “Tech Debt” is a single technical problem. And the best way to solve it is by putting an item on your roadmap, where you tell a … Continue reading Tech debt can’t be solved as a roadmap item. It needs to be part of…

Moneyball for Software Teams – An Imperfect Heuristic for Quantifying Dev Performance

Someone on Reddit once asked for “unethical career advice” for software developers. Here’s the most highly rated answer with over two thousand people liking it: Make a good first impression and you’re set for a while. Something takes longer? They’re a good developer so I guess we under pointed that. It is actually insane to … Continue reading Moneyball for Software Teams – An Imperfect Heuristic…

Product-Engineering Collaboration – Getting Past Waterfall

I was reading a book on a lazy Sunday afternoon when I learnt something that completely changed the way I looked at one of the iconic movies from my childhood – Toy Story. This was the first computer-animated feature film ever attempted, and, as I was beginning to realize, the challenges were staggering. One of … Continue reading Product-Engineering Collaboration – Getting Past Waterfall →

18 Years A Transient – My Journey Through the American Immigration System as a Computer Engineer

It sounds surreal to even say it out loud, but I’ve been living in America for the majority of my life, ever since I was a teenager. And for 18 of those years, I was legally a transient – hopping from one temporary visa to another. I’ve explored so many nooks and crannies of the … Continue reading 18 Years A Transient – My Journey Through the American Immigration System as a Computer Engineer →

Our Engineering Principles and Best Practices

As the CTO for an early-stage startup, I had put together a version-1 of the Principles and Best Practices for our engineering team. Most of these are borne out of my past work experiences at a variety of companies, including two of the FANGs. There are many great things I’ve learnt from these companies. But … Continue reading Our Engineering Principles and Best Practices →

My Path to Financial Independence as a Software Engineer

One of the watershed moments of my life was as a 20 year old intern attending a workplace presentation about personal finance. Over the course of one hour, I learnt about the power of buy-and-hold investing and compound growth. I learnt that even an average engineer with a five-figure salary can become a millionaire by … Continue reading My Path to Financial Independence as a Software Engineer →

The Law of Net Design Costs

Suppose you’re working on a software system and need to implement user-logins using a userID and password. After a bit of research, you narrow it down to two possible options. Your first option is to implement it yourself – hash/salt the password, store it in a database that you manage, and use it to authenticate … Continue reading The Law of Net Design Costs →

Experiences working with an Outsourced Dev Shop

Many years ago, a younger and more naive version of myself decided to try bootstrapping a startup together with my co-founder, while still juggling our full-time jobs. She had the idea, product vision, and contacts for initial users, while I was in charge of tech development. Our plan for the MVP was to launch using … Continue reading Experiences working with an Outsourced Dev Shop →

Mutation Driven Testing – When TDD Just Isn’t Good Enough

As someone who loves discussing Software Craftsmanship and best practices, Test Driven Development (TDD) is a bit of a sore spot for me. Let me start off by saying that I love TDD’s emphasis on testing. Too many software projects skimp on testing. And the results speak for themselves many years down the road, when … Continue reading Mutation Driven Testing – When TDD Just Isn’t Good Enough →

Why Is There So Much Crap Software In The World

All around us, we are surrounded by crappy software. Pension funds that are stumbling along using decades old batch scripts with faulty assumptions. Credit agencies have leaked over a hundred million social security numbers and other confidential data. Planes need to be rebooted every 51 days to prevent “potentially catastrophic” bugs.And not to even mention … Continue reading Why Is There So Much…

If Founders Treated Their Investors The Same Way They Treated Their Employees

Founder: Hey Joe! How are you doing? Everyone here loved meeting you, and we would really love to have you on board as our investor! We really respect your expertise, and think this could be a great partnership. What do you say? Investor: Glad to hear! Can you give me more details about how much … Continue reading If Founders Treated Their Investors The Same Way They Treated Their Employees →

Preventing Software Rot

I recently came across a story that is just as amusing as it is shocking: One of my clients is responsible for several of the world’s top 100 pension funds. They had a nightly batch job that … crashed. No one knew what was wrong at first. This batch job had never, ever crashed before, … Continue reading Preventing Software Rot →

Bayes vs Frequentists – An Empirical Test In Code

You and your friend are walking by a magic store and find a trick coin. You have no clue how biased the coin is, and decide that all possible levels of bias are equally likely. In order to estimate the level of bias, you toss it 14 times and end up with 10 heads. Your … Continue reading Bayes vs Frequentists – An Empirical Test In Code →

When Feature Flags Do And Don’t Make Sense

Over the past years, I’ve worked in multiple teams adopting very different strategies when it comes to feature flags. I’ve seen the pros and cons of both, and over time, I found myself disagreeing with any fundamentalist position on their use. There is a lot of nuance to this topic, and I think it is … Continue reading When Feature Flags Do And Don’t Make Sense →

The Birth of Legacy Software – How Change Aversion Feeds On Itself

Here’s a common pattern that I see play out very often in software teams: There is a need to change the existing system behavior to accomplish new functionality. The software engineer looking at the task realizes that the existing design isn’t well suited to the change needed. They suggest design changes and refactoring, as part … Continue reading The Birth of Legacy Software – How Change Aversion…

Abstractions Are In The Eye Of The Beholder

One of the most common debates I see, is on the right level of abstraction to use when coding. The line between over-engineered and unnecessarily-verbose is a very fuzzy one, and is the source of never-ending debates. Unfortunately, this debate is unlikely to ever get resolved. For one simple reason. The correct answer is both … Continue reading Abstractions Are In The Eye Of The Beholder →

Nuances of Overloading and Overriding in Java

I’ve been programming in Java for over half a decade, and thought I had mastered all aspects of overloading and overriding. It was only once I started thinking of and writing up the following edge cases, that I realized I didn’t know it nearly as well as I thought. In an effort to gamify these … Continue reading Nuances of Overloading and Overriding in Java →

Alert Fast

A dichotomy I often see in many different teams and projects, is the dilemma between “failing fast” and “failing gracefully.” Here’s a simplified example of what I see far too often, and gets to the core of the dilemma. and its close cousin: On the face of it, this looks extremely reasonable. When working with … Continue reading Alert Fast →

Hiring is Broken And Yours Is Too

I can’t keep track of the number of articles I’ve read about hiring in the past few years. Inevitably, they all follow the exact same format. First, they claim that hiring is broken. Next, they describe the hiring practices used by XYZ company. The present an extremely thorough analysis of every possible way in which … Continue reading Hiring is Broken And Yours Is Too →

SSH Considered Harmful – Why You Should Be Using Persistent Sessions

No, there hasn’t been any new vulnerability found in SSH, nor am I denying the usefulness of SSH as a building block in the dev toolchain. This article is about why you shouldn’t be (and how you can avoid) using raw SSH sessions for development work. Here’s a little story. I spent many years working … Continue reading SSH Considered Harmful – Why You Should Be Using Persistent Sessions →

Cracking the Senior Software Interview

The following is a post which I found on the Blind app. It covers all the preparation and experiences of someone who received multiple job offers from the best tech companies, including multiple offers in the range of $550,000/year. Because it can only be accessed via the app, I have copied it in its entirety … Continue reading Cracking the Senior Software Interview →

Rethinking Software Testing: Perspectives from the world of Hardware

The hardware and software worlds may seem poles apart, and in many ways, they indeed are. But there’s a wealth of knowledge that each can learn from the other. Despite the seemingly massive differences in the final product, they share more in common than you might expect. Computer engineers at places like Intel, just like … Continue reading Rethinking Software Testing: Perspectives from the world…

An Alternative to Dependency Injection Frameworks

I have a confession to make. I hate Dependency Injection (DI) frameworks. My very first job as a Software Engineer involved working with a very complex system that powered a ~100 person hedge fund. We made extensive use of Dependency Injection… but only via Constructor or Setter Injection. We did not use any DI frameworks … Continue reading An Alternative to Dependency Injection Frameworks →

Myths Programmers Believe about CPU Caches

As a computer engineer who has spent half a decade working with caches at Intel and Sun, I’ve learnt a thing or two about cache-coherency. This was one of the hardest concepts to learn back in college – but once you’ve truly understood it, it gives you a great appreciation for system design principles. You … Continue reading Myths Programmers Believe about CPU Caches →

Don’t be an Evolutionary Programmer

When you run into a problem, a bug in your code, how do you try to fix it? Do you try to debug the problem, in order to figure out what the root cause is? Do you use tools like debuggers, loggers or code inspections, in order to better understand where and what is causing … Continue reading Don’t be an Evolutionary Programmer →

Building a WebApp from A-Z: The Caucus Tech Stack

When building Caucus, my first personal project, I had a couple of core goals and philosophies that I used to guide all my decisions. Keep it simple. Keep it small. Be very lazy Focus ruthlessly on your user experience and value add. For all other distractions: Outsource and minimize Enable rapid scalability to millions of … Continue reading Building a WebApp from A-Z: The Caucus Tech Stack →

From Hello-World to Web-Launch in 2 Years

There was a time when I had never seen nor touched an IDE. I had never laid eyes on Java, SQL, AWS or even REST APIs. If you had told me that over the next 2 years I would go on to build and deploy my own web API, with the entire REST interface coded … Continue reading From Hello-World to Web-Launch in 2 Years →