Creating software is easy; creating quality software is hard. In today's world of umpteen open source libraries, cloud computing platforms, and StackOverflow, creating software is child's play. You can look up things on the internet, glue together components, and voila - you have created something. What is hard is creating quality software. Software that scales; … Continue reading Creating Quality Software
Tag: software
“Intentionally” Leaky Abstractions
Software abstractions that developers create should leak enough to let non-developers design the right product experience. Eons back in internet history, Joel Spolsky wrote a post on leaky abstractions. The gist of the writing is that even though we create software abstractions to make life easy, they somehow unintentionally leak through. With technology getting a … Continue reading “Intentionally” Leaky Abstractions
Competitive advantage
Are you focussing on developer productivity? If not, read why you should. Technology is getting commoditized. In the yesteryears, you could have counted on your software frameworks and technologies, hardware prowess, access to capital and talent pool as competitive advantages. In a world, which is getting commoditized, the access to these has been democratized, thus … Continue reading Competitive advantage
Make It Small
"Make it large" is the mantra these days, but when it comes to releasing software, think the opposite, make it small. The secret to a successful release is to break it into numerous small deployments; this serves a dual purpose, minimizes risk as well as gives you enough leeway to fix bugs before it negatively … Continue reading Make It Small
Knowing Versus Doing
Over-engineering is ripe in the software industry; this mainly manifests in three ways: 1. Needlessly complicated design. 2. Lift and shift engineering - Picking up technology and practices from other places without understanding the context in which it was developed. 3. Being trendy - Using frameworks and languages that are currently in fashion irrespective of … Continue reading Knowing Versus Doing
Open Source and Revenue
This is the second part in a series on open source software. In the first part, we examined why equating open source with "just" free is fool's errand. In this post, we will explore the different avenues for revenue from open source software. The first one is pretty straight forward - charge for support, maintenance, … Continue reading Open Source and Revenue
Open Source != Free
This is the first post in a series on open source software. You can read the second post here. One of the most common conflations I see people making is mistaking open source software for free software; both are not the same. Being free is just icing on the cake, the more significant advantage is … Continue reading Open Source != Free
Now You See Me
In the modern software world, where micro-services are de rigueur, observability of systems is paramount. If you do not have a way to observe your application, you are as good as dead. W A T A R I The first step towards embracing observability is figuring out what to track. Broadly, we can categorize software … Continue reading Now You See Me
Sherlock Versus Calvin Ball
We can classify software development into: 1. Maintaining and enhancing existing software. 2. Software development from scratch. Given a choice between the two, developers usually gravitate towards from scratch development. Developing something from scratch is an intensive creative work where you have the freedom to shape the product the way you see fit. Hence, it … Continue reading Sherlock Versus Calvin Ball
Concurrency Models
We can roughly classify concurrency models into: 1. Thread based concurrency. 2. Event based concurrency. Imagine that you run a store with only one customer service representative. As soon as a customer walks in, the customer service representative greets the customer with a quick hello saying – “If you need any help, give me a … Continue reading Concurrency Models
Ode To Queues
If you have a producer with an uneven rate of production and a consumer that cannot keep pace with the producer at its peak, use a queue. If you have a workload that need not be addressed synchronously, use a queue. If your customer-facing application is riddled with workloads that can be deferred, move these … Continue reading Ode To Queues
Software security
Some disparate thoughts on security in no particular order. Many security bugs can be avoided by making a clear distinction between authentication and authorization. When one logs into Facebook, one uses a username and password. Facebook lets you log in only once it is sure that you are the owner of the account by verifying … Continue reading Software security
Naming Things
There are only two hard things in Computer Science: cache invalidation and naming things. -- Phil Karlton Even though the above might have been in jest, naming variables while writing code is a head-scratching experience. Should I make it short? Should I make it descriptive? If descriptive, how descriptive? These thoughts keep running in one's … Continue reading Naming Things
Switching programming languages
Many are apprehensive about switching programming languages. It is OK to have preferences—I am heavily biased towards statically typed languages with great tooling support—but being dogmatic is not something one should aim for. What could be the downsides of switching programming languages? I am disregarding the psychological aversion to change and sticking to hard facts. 1. One … Continue reading Switching programming languages
Conventions
Most programming languages have conventions. These could be for naming or code patterns. How does this help? A simplistic view is that it helps to keep code consistent, especially when multiple people work on it. A deeper way to look at this I believe is in reducing the cognitive load. In cognitive psychology, cognitive load … Continue reading Conventions
Anti Features
When evaluating new technology, framework or library; a lot of importance is given to the salient features. While it is very important to know the positives, the negatives usually tend to be glossed over. Being aware of the shortcomings of a framework gives one the ability to anticipate problems down the road. For example, let … Continue reading Anti Features
Testing legacy applications
When contemplating on introducing automated testing in legacy applications, it is easy to get bogged down in terminology; unit testing, integration testing, regression testing, black box testing, white box testing, stress testing, etc. Quite a bit of time is spent in debates on unit testing versus integration testing, I have written about this before too. … Continue reading Testing legacy applications
Build Versus Buy
Consciously or unconsciously, as software engineers, we perennially take build versus buy decisions. It might be as trivial as copy-pasting code from somewhere versus racking up our brains to write our own; using an already available library or creating one from scratch; using a time tested framework against designing one; building a piece of software … Continue reading Build Versus Buy
Look ma, no schema
Due to the plethora of NoSQL databases available, schema-less is a tantalising option these days. While starting on a new project, NoSQL databases look attractive but reality sets in when the maintenance problems start creeping up later. If you are doing anything with data, you need to know the schema of that data. What … Continue reading Look ma, no schema
Unit test – purist versus practical
Whenever you ask a question on unit testing in a forum, there is always that one person whose only job is to point out what you are doing is not unit testing but integration testing. It is important to know the difference but it is more important to not lose sight of the goal, ensuring … Continue reading Unit test – purist versus practical
Selfie
Let us say that you want to execute a job periodically, what comes to your mind first? If you are familiar with Linux, I can hear your screaming cron. Well, no doubt about that, cron is great, but what if I told you there is another approach which you can take to execute periodic jobs? … Continue reading Selfie
SQS versus Kinesis
A lot of people are confused between SQS and Kinesis. In some ways, both act as a queue, but there is a massive difference between the two. SQS is a queue, adheres to FIFO and promises at least once delivery. Kinesis is a distributed stream processor. A simplistic and hand-wavy way to think of Kinesis is like … Continue reading SQS versus Kinesis
Release early, release often
Releasing early and often can make the difference between life and death for new age internet companies. Most of the successful dotcoms like Amazon, Google, Etsy do hundreds of deployments per day. If you are a small organization, your magnitude and frequency of deployments might not rival these big organizations, but it is always a … Continue reading Release early, release often
Nothing is sacrosanct
There is an interesting bug opened against Kafka. For those of you too lazy to click on the link and read through the description, I am reproducing it here in full.It appears that validation of configuration properties is performed in the ConsumerConfig and ProducerConfig constructors. This is generally bad practice as it couples object construction … Continue reading Nothing is sacrosanct
Designing for failure
In the world of software, failure is a certainty. Servers go kaput, databases go down, processes go out of memory, things break all the time. You can categorize software as good or bad based on how they behave in these adverse scenarios. I am not trying to imply that software has to be resilient to … Continue reading Designing for failure
The disconnect
I used to sit next to the CS(Customer Service) team for sometime and I heard them instructing certain steps to customers to redeem campaign codes the second time. The dev team had put some extended efforts to exactly prevent this sort of scenario, these campaign codes were not to be redeemed twice. Why this sort … Continue reading The disconnect
API
Whenever I hear about the government upgrading some utility website, I die a bit inside. I am strongly of the opinion that the government has no business to be in the business of building end user utility websites. A government should act as an enabler, not as a provider. How does this apply to utility … Continue reading API
To move or not to move
In the initial days, when I was trying to bootstrap the FreeCharge tech team, my team members were always trying to make me move us away from svn to git. For the past couple of years, if you have not been living in a cave somewhere without a net connection, you for sure know that … Continue reading To move or not to move
Mental model of systems
One beautiful Sunday evening our quartz jobs running inside tomcat server started to freeze. At the same moment, tomcat went kaput. I sshed into the server and started poking around the logs. No error in logs. Hmm, ok. Checked the system health, again stats looked hale and hearty. Now, what do I do? I started to reason around … Continue reading Mental model of systems