# Motive Matters
URL: https://www.abhinav.co/motive-matters
Date: 2011-04-15T00:00:00+00:00
Dr Michael Sandel, Professor of Philosophy at Harvard, teaches a very
popular and widely attended course - "Justice - what is right thing to do".
These lectures are also available online. Although many a times,
ideas discussed are very abstract in nature, but Prof Sandel keeps
them interesting by
involving his students in the discussion.
Through one such lectures, I got to know about Philosopher and
Teacher, Immanuel Kant. Kant, while answering what is morally right,
gives an example of a shopkeeper,
who avoids cheating his customers because he thinks word may get out
and it may negatively hurt his business. As per Kant, although the
shopkeeper does the right thing, but his action is morally wrong. A morally right thing to do
not only means doing what's right,
but also doing it for the right reasons. Motive matters.
Kant mentions duty and inclinations, and argues that morally right is
done for sake of duty and not for selfish inclinations. Consider this - if a shopkeeper
does not cheat his customers because he thinks he is a moral person,
then again, he is morally wrong. He should consider it as his duty.
In Hindu context, this is exactly what Krishna said in Geeta, and we almost
always misunderstand the message.
Doing your duty without considering the potential benefit you might
get is the right thing to do (_Karmanye ma phaleshu kadachana_)
whereas the common notion is doing your duty will improve your karma
points which will help you later (if you believe in reincarnation,
they might be helpful in laters births too). Hope you see that all of this is morally wrong.
---
# What is your good name?
URL: https://www.abhinav.co/what-is-your-good-name
Date: 2011-06-23T00:00:00+00:00
Have you ever wondered how kids learn their first set of languages,
and how it is different from the way, we grown-ups, learn new languages?
I think, kids learn them and the real world at the same time,
hence they map words with real things - like the word 'chocolate' with
something sweet in a wrapper they love to eat.
On the other hand, when grown-ups try to learn one - they
mostly map words in it with corresponding words in the language they
already know - like 'halu' in Kannada means milk.
Intuitively, the grown-ups' way of learning new languages looks more
efficient, but if you have ever tried learning a new language, you
will know it's not that easy. Somehow,
kids seem to pick languages easily than grown-ups. Of course, there are
people who are very good at picking them up, and can learn multiple
languages with comparatively ease,
but they are more or less exceptions. Another problem with grown-ups'
way is that they are limited by knowledge of
their previous known languages.
I think all this holds true for programming languages too. When you
learn your first programming language - you are not only learning a
new language, you are learning programming too.
After that, every new programming language you learn you subconsciously
try to map it's constructs with known ones. And this is when, for
starters, learning one from a different paradigm
seems very tough. In my particular case, I found it extremely hard to
learn second programming language (after C) because I was trying to learn
C++ and Java, which are from a
different paradigm of object oriented programming. I gave up and
instead learnt Perl, gradually started using objects in it and finally
learnt object oriented programming.
Although I am still a beginner in funtional programming, but I think
object oriented programming to functional programming jump was
comparatively easy.
Be it human languages or programming ones, you learn them by practicing
them. And in this context, I feel, programming languages are easier to
learn than human languages. It takes courage
and readiness to make mistakes to learn new human languages, and
therefore, not surprsingly, you will still find me trying to use Hindi instead
of Kannada on the streets of Bangalore.
PS: "What is your good name" is literal Hindi transalation of "Aapka
shubh naam kya hai", a polite way of asking somebody's name in North
India.
---
# Future of Mobile Apps
URL: https://www.abhinav.co/future-of-mobile-apps
Date: 2015-04-26T00:00:00+00:00
I found it hard to convey my thoughts in form of coherent text, wrote in points instead.
{: .notice}
* Today's desktop browsers are very powerful. We use them for communication,
entertainment and almost all our needs. And we use search engines
and social networks to discover websites and pages.
* Mobile OS market is pretty fragmented with iOS, android and windows platforms.
It is difficult for app makers to develop, maintain and market native apps for all these
platforms.
* It is also very difficult for consumers to discover and download all these
special purpose apps. There are no equivalent alternatives for search engines
in mobile world.
* Mobile phones are yet to develop an app like desktop browsers - an app which
can become your interface to other apps.
* Cards presents a brilliant interface for other micro-apps to run inside one
app. Look at Google Now to experience these cards.
* I believe, these micro-apps are the future and an app, with the ability to run
these micro-apps inside itself, will rule the mobile world.
* Probably, Facebook and Google are already working towards this. Facebook Messenger has
opened up it's platform for businesses, whereas I think, Google is approaching
this as a technology problem and is trying to make chrome on android more
powerful and better. They also have Google Now which they can open up for other
third party integrations.
* The way these micro-apps will interact with users will be very different from
traditional pull based search engine model. Interaction will be more contextual and
personalized depending upon users' habits and preferences. It will also be
more pushed based then pull. It is the future of Siri too.
---
# The Country of the Blind
URL: https://www.abhinav.co/the-country-of-the-blind
Date: 2015-05-05T00:00:00+00:00
As a kid I have read a few stories that have stayed in my mind and thoughts for years now. This post is about one of such stories that I read in my English text-book - "The Country of the Blind". I don't remember the exact class I read it in, but even during those days, it made me think about evolution and as a society, how hard it is to accept something which is different from our own established notion of correctness. This is how I remember the story:
In a valley near Ecuador, a small tribe of people is cut-off from rest of the world by an earthquake which has blocked the only passage from outside world to the valley. This isolated tribe, though prosperous and self-sufficient, suffers an epidemic and everybody looses their vision. Children also start to take birth blind. Over time society adapts itself to life without sight; concept of sight and vision is lost.
After a few centuries, one of the mountaineers from outside world gets lost and slips into this part of the world. Mountaineer, among other things, notices that people of this tribe prefer sleeping during the day when it is hot and work in night when it is cool. Their idea of beauty is also not conventional for they consider people with rough skin as more beautiful. This surprises him, and remembering the proverb 'in the country of blind, the one-eye man is king', he starts seeing the opportunity to rule the tribe. He tries explaining the concept of sight to everyone but fails. In fact, whole tribe starts thinking of his obsession with sight as a disease. To make him 'normal', tribe doctors propose an operation to remove his faulty eyes. Having fallen in love with a girl, and wanting to marry her, he reluctantly agrees. However at the sunrise before the operation, when whole tribe is asleep, he leaves to escape the valley.
This story is brilliant. When I first read it, it took me some time to accept the fact that people with no concept of sight and vision will find person with ability to see as abnormal. It opened my mind to the thought that, at times, an idea or perspective, however counter-intuitive it may seem to you and to whole of your little society, can actually be right and valid for other societies. Similarly, many old traditions may seem irrelevant now, but probably in the past they all made sense.
I believe we all need to be a bit more considerate about others' ideas and traditions. We need to try not to look at the world as black and white, but with some shades of grey. Does God exist or is there any answer for which religion is the best? Or is capitalism better than socialism? Or is it morally obligatory to be a vegetarian? Is my country better than yours? Or is static typing better than dynamic typing or vi better than emacs? Though one certainly has the right to have one's own opinions, but does fighting over them make sense? Fundamentalism of any kind is bad.
>It's not only moving that creates new starting points. Sometimes all it takes is a subtle shift in perspective, an opening of the mind, an intentional pause and reset, or a new route to start to see new options and new possibilities.
- Kristin Armstrong
At times, we fail to empathize with each other, because we fail to understand each other's viewpoint. As we move forward, one of the most important requirements to be a world citizen would be to develop empathy and an open mind. Develop and grow.
---
# Growing startups and technical debt
URL: https://www.abhinav.co/growing-startups-and-tech-debt
Date: 2015-06-06T00:00:00+00:00
I recently read a post - [Why the way we look at technical debt is wrong.](https://bigeng.io/post/118399425343/why-the-way-we-look-at-technical-debt-is-wrong)
I do agree that for a company it is important to reach to its users as soon as possible. However, in my opinion, a growing startup, which has got millions of active users, but is still struggling to find product-market fit, can not afford to take a lot of short-term calls very frequently.
Although a company can be structured such that small teams function as independent startups, but if team hasn't invested in building frameworks, modules and services and writing good code in general, their iteration speed will be slow. And most unfortunate thing for a company with slow iteration speed would be it's inability to cope with growing number of users and their requests. I think, each growing startup needs to understand the scale at which it operates and how to try out various things in a controlled manner.
Agility is important. And, however well one plans, after every x time, one will have to fix technical debt - because market behaves differently from assumptions made, and to calibrate with that, one will change code/feature to incur some technical debt.
The way to look at this is to build version 0 which can help to validate initial assumptions and then version 1 and so on - this should happen more from product perspective than code. Assuming that code which was written for version 0 will work with version 2 is not right and this is the most common problem which most non-technical product owners face. They should accept that it may so happen that one will have to go and rewrite whole code for version 2.
Companies need to choose - whether going to market early is important or later iterations are also as important. Twitter was built in two days (it was a matter of do or die for them), and you will also remember "fail whales" - it took them more than a year to fix just that. Similarly, Amit Singhal did a complete rewrite of Google’s search engine in 2001.
Another thing which works very well for smaller startups, but affects mid-sized growing startup in a negative manner is chaos in the company. Reducing chaos, so that every employee can focus is important. You loose a lot in context switch - at times, this is unavoidable, but accepting it as normal is a problem.
Such companies also need an environment where everybody is productive and people only worry about problems in hand. Employees use abstractions, work at higher level and also build abstractions for others. Startups mean chaos - true, but according to me, it should be imposed by market forces only. And even then, attempt should be made to reduce it.
It is said successful entrepreneurs take only calculated risks and work towards minimising them. I believe, they also work to allow only structured chaos in their companies. Look around, all successful entrepreneurs and companies have done the same.
---
# Ten years
URL: https://www.abhinav.co/10-years
Date: 2015-07-04T00:00:00+00:00
Ten years ago, on this day, I started working at my first job. I was in Bangalore for six months already and had interned at LG before. I still remember the day I joined, and what I wore that day - a blue shirt, which as a ritual, I wore on first days for next couple of jobs as well. Because of a certain confusion, HR department and my manager didn't know that I was joining that day and hence no computer and seat was arranged for me. I spent whole day exploring FreeBSD for the very first time on a temporary desktop.
Overtime, I got to know my colleagues and Yahoo! better. Yahoo! felt very different as a company. There were a lot of talented and creative engineers around, and it was overwhelming. And I believe, being overwhelmed was the right state to be in. Over a course of two years, I learnt a lot of new things, some very obvious and some very different.
I spent some time reading a lot of good quality code written by one of my team members, Ajay. And within six months, I was copying his style. I learnt how to write production grade code, how to handle 1B+ user records and a fair amount of internal technologies. If you are a Yahoo, you would remember `udb` - a multi-region, NoSQL DB, even before the term NoSQL was invented, `repl` - data stream APIs, `yinst` - best package manager I know of, `ypan` - Yahoo's Perl library collection, `yroot` - docker like containers, `yjoin` - my most favorite technology using which I wrote a flat file based database, `yfreebsd`, `yapache`, `yphp` and many others. Hadoop was just starting to come out. In terms of software infrastructure, Yahoo! was ahead by miles when compared to the rest of the world.
After a few months of joining, my manager, Mahesh started asking me to reply to the emails sent by US team on a regular basis. For initial few months, I felt uncomfortable doing this, but eventually I learnt and started enjoying it. Only after that I understood what Mahesh had done for me. He not only made me comfortable in formal dialogue via emails, he also made everyone in the US team know about me. I was not an anonymous software engineer in another continent anymore. Now, when I mentor people, I try to do something similar whenever possible.
I gained a lot of confidence at Yahoo! and that confidence prompted me to take the next step, trying my hand at starting a new company. However, I realized, I had a lot of learn, and therefore I joined Ahmedabad based NirmaLabs for six months grooming programme. It was an eye-opener and I learnt about design, product, marketing, sales and finance. I also met one of the smartest people I have ever met - Dr. Madhu Mehta. Although I rarely get to talk to him these days, but I still consider him as one of my mentors. I admire him ardently for his clarity in thought and speech, and his determination to support and mentor budding entrepreneurs. By late 2007, Google had released Android framework, Apple had released iPhone. It was challenging but exciting time. However, in retrospect, I don't think I worked hard enough executing my startup idea, and gave up too quickly because of external and personal reasons.
Economy was moving into recession, and I freelanced for a while, before joining ShipX. ShipX holds a special place in my professional journey, for not only I picked up whole set of new technologies, I also learnt about logistics, supply-chain domains and how business is done in India. We did a lot of iterations, added numerous new features, and got paying customers. I understood how real world processes and flows are modeled into software flows. Though times were tough and I worked some months without salary, but I gained a lot of skills and knowledge from Venky, Yegnesh, Maxin, Laxman and especially Amar, who treated me like his family member.
I eventually left ShipX after working there for close to two and a half years - longest I have worked in any company. It was a very hard decision. I joined a games startup called PlayUp - they were just starting their social gaming vertical, I joined the engineering team and worked on a couple of interesting games. I started as an individual contributor, but in between started leading a team of talented engineers. We not only delivered products on time, we wrote good quality code with right set of engineering practices. It is here, where I developed a lot of platform microservices (I didn't know the term then) and assembled them to create scalable backend. We also started to work on single page apps using frameworks like backbone.js - learnt a lot, discovered hidden leader inside me. I must thank CTO, Kangesh, for convincing me to lead the team.
I was itching to do a startup again, and left PlayUp just after a year. Idea we started working on was brilliant and ahead of its time. We built a fantastic product in a short span of six months, but alas, we could not continue because of unavoidable circumstances.
I was about to get married, and yet again, I was without a job. Shikhi had just told about the wedding in her office, and her company, in response of her brilliant work, as an exception, had given her an opportunity to work from Gurgaon office. Now I needed a job badly in Gurgaon and after a few tensed weeks, I found one - at hike messenger. Most I liked about hike was its engineering driven culture, which was and still is an exception in Gurgaon. I restarted again as an individual contributor, and in past two years, have worked at a critical juncture of hike’s growth.
I have worked in small companies and I have worked for large companies, but for the very first time in my life, I am working for a company which is transforming itself from a small one to large. It's tough, chaotic, but very satisfying. Hike is poised to win in this market, and I would like to believe, in however small way, I am contributing to its success.
Rare and lucky are those, who know very early on, exactly where they will end up. I don't know what future holds for me. I am reminded of an incident, when in year 2000, I went to a cyber-cafe for the very first time with a friend. He wanted to check his email, and I saw Yahoo! webpage. He entered his username and while entering his password, he asked me to look away. Though I understood immediately that he is entering something which is private and required to see his email, but when I sneaked through, I could not understand why he would keep six asterisks (*) as password - I didn't know then that webpages don't show passwords on screen. Nor I knew that I would work for this funnily named company in the near future. Similarly, in my whole school life, I didn't know that there existed a place called Pilani and I would end up studying there.
If you ask me whether I have achieved all I wanted to achieve in ten years, answer is no. I have failed miserably and not just once, but multiple times. At the same time, most of the things that I have learnt, I could have not learnt without failing. My bucketlist is full of tens of items, and I understand that however hard I may try, I can never anticipate what I would end up doing in future. However, I pray that I keep learning and keep trying. And, that I start feeling overwhelmed again.
---
# Speed
URL: https://www.abhinav.co/speed
Date: 2015-08-15T00:00:00+00:00
I recently read a post - [Speed as a habit.](https://firstround.com/review/speed-as-a-habit/)
It's a great post, and I agree with the author on almost everything. It is very common to see decision-makers knowingly or unknowingly affect the speed of the project because they can't choose one thing over other. They work in an iterative fashion, delay making timely decisions and therefore, they miss global optimum and have to settle for local optimum. Difference between global and local optimum is called as technical debt and it requires them to stop frequently and pay this debt.
This is how I look at speed. Imagine a vehicle moving in speed, and then suddenly if you ask the driver to take a turn - vehicle has to either slow down considerably, or it will crash. Only possible way to complete the whole route from start to end is that you take timely decisions and stick to them. This does not mean that you don't take any turns at all, but instead you plan for them and also minimize them. Taking too many turns will only affect your speed.
The most important pre-requirement for speed is setting a goal and deciding a path. My advice is to take time in deciding, and plan for at least next couple of milestones, but once you have, stick to it. Revaluate when you have achieved those milestones. However, overall bigger vision is also important for you to get closer to global optimum than local optimum and avoid very short term calls.
> It is a mistake to think that moving fast is the same as actually going somewhere.
> ― Steve Goodier
---
# Game Theory and Public Systems
URL: https://www.abhinav.co/game-theory-and-public-systems
Date: 2015-09-26T00:00:00+00:00
From a game theoretic point of view, in a game, each player acts according to his incentives. He chooses a strategy that maximizes his payoff, taking into account of other players possible strategies. And in a well designed system, protocols and incentives are designed such that payoffs are maximum for a player when he follow the rules of the game (or at least most of the rules most of the time.) In other words, honesty is just a strategy and most players choose to follow it in such games.
If you look at public systems as a game, each stakeholder's behaviour is nothing but a strategy to maximize the payoffs (money, power, authority or otherwise.) And the way our systems are designed, we penalize wrong behaviour, and almost never incentivize the honest behaviour. Most of the times, it is possible for a stakeholder to maximize his payoffs by dishonest means and to never get caught, and this is the root cause for the increasing corruption in public systems today. Anti-corruption departments (incuding proposed lokpal) focus on reducing corruption by only finding corrupt officers and penalizing them. (Delhi state government has taken it to extreme by asking citizens, who are also stakeholders in the system, to conduct sting operations to expose corruption.)
I think, we need to design our public systems in such a way that they incentivize honest behaviour. If a stakeholder gains more by being honest, as a rational being, he will choose to be honest. I understand designing such systems are hard, but in my opinion they have a better chance in fixing corruption which today seems to be a systemic characteristic of our economy and society.
As I study more about better designed systems in India and elsewhere, I will try to write basic ideas behind them in future blog posts.
---
# Digital Colonies
URL: https://www.abhinav.co/digital-colonies
Date: 2016-10-22T00:00:00+00:00
I always wondered if our government was wrong to throw out multinational companies like IBM and Coca Cola from the country in 1970s. If they had not, the liberalization process and growth which started only after 1992, could have started much earlier. Similarly, I also used to believe that Chinese government is wrong in providing unfair advantages to Chinese companies over global Internet giants. Perhaps I did not have an open mind to understand other perspectives.
To be clear, I am against government's control of information and thereby minds, however much like how colonial powers fought to control over weaker countries and the new world, I also see that our attention and time as the new resources which these new age digital companies fight to acquire. And they have been successful so far.
Today's world is driven by growth; investors and shareholders want their investments to keep growing and therefore, it is important, even for existing successful companies, to keep investing in building new platforms to sustain growth. Did you ever wonder why Facebook bought Oculus, why Google built Android and Chrome, or why both Apple and Google are interested in cars as a platform?
As a person with entrepreneurial bent, I worry about this - ten years ago, when I first tried starting up, world was very different, and it was still possible for a young startup to compete and grow. However, today it scares me to see some of the well-funded Indian companies struggle against global counterparts. I think it is exponentially difficult to build a successful company from scratch now.
Believe it or not, we are digital colonies of these new age technology companies.
---
# Inflation
URL: https://www.abhinav.co/inflation
Date: 2016-10-27T00:00:00+00:00
We take inflation for granted. We relate it with growing economies, and we see zero inflation and deflation as a sign of stagnating or shrinking economies.
Inflation in elementary terms is sustained increase in price level of goods over a period of time. For example, last year, if one could buy 1 kg of apples in 100 rupees, and now if they cost 110 rupees, simplistically speaking, inflation in apple prices is around 10%.
Prices are usually decided by demand and supply equilibrium, and it is quite natural to believe that price inflation happens because of increase in demand which also indicates growth.
However, inflation can also increase if currency starts loosing its value. And when does that happen - when government start printing more currency than it really should. It helps in the short term, however in today's globalized world, it has a big negative impact in the longer term.
This is what distinguish money from currency. Money has the ability to preserve its value over the longer term, that is, unlike money, a currency is subject to inflation.
On a related note, this is the reason Satoshi Nakamoto designed Bitcoin to have a cap. I will write more on Bitcoin in later posts.
---
# Start up vs Big Company
URL: https://www.abhinav.co/startup-and-its-people
Date: 2016-11-08T00:00:00+00:00
Your company is no longer a startup if it can succeed without its people succeeding or its people can succeed without it succeeding. First thing happens when your company has people who are no longer needed, second thing happens when you have unnecessary bureaucracy in your company.
---
# GCP vs AWS
URL: https://www.abhinav.co/GCP-vs-AWS
Date: 2016-12-10T00:00:00+00:00
[Ben Thompson](https://twitter.com/benthompson?ref_src=https%3A%2F%2Fabhinavsaxena.com) of Stratechery recently wrote a post on [how Google Cloud Platform is challenging AWS](https://stratechery.com/2016/how-google-cloud-platform-is-challenging-aws/?ref_src=http%3A%2F%2Fabhinavsaxena.com). It's a very well thought out and interesting post.
I think, AWS is Amazon's Android and GCP is Google's iPhone. To continue with the analogy, AWS has its own 'GMS' - Google Mobility Services in form of services like RDS, lambda, S3 and has a 'Playstore' with services like redis-labs, loggly etc. (In fact, Heroku, a PAAS service which runs over AWS has much richer [add-on ecosystem](https://elements.heroku.com/addons?ref_src=http%3A%2F%2Fabhinavsaxena.com))
For many startups and developers, AWS has become key part of their tech stack (directly, or indirectly via heroku, engineyard etc.) Weirder, however not very inappropriate, analogy would be that for these startups AWS is like TCP/IP, underlying layer over which HTTP and browsers work. And through AWS, Amazon controls a lot of world's tech infrastructure. In Chamath Palihapitiya's words, [AWS is a tax on the compute economy](https://www.quora.com/If-Chamath-Palihapitiya-had-to-put-all-of-his-money-in-one-investment-today-with-a-10-year-holding-period-what-would-it-be?ref_src=http%3A%2F%2Fabhinavsaxena.com). Google has just woken up to this - and therefore I think it's a very strategic move, and not just a new business model or revenue stream for Google. Why should an app on Android Playstore be backed by AWS?
Google app-engine which is/was far superior in terms of its technology offering never picked up because there was a lock-in and it's ironical yet brilliant that they are pushing Kubernetes so heavily now - very interesting times ahead.
---
# From a great consumer product to a lasting tech giant
URL: https://www.abhinav.co/lasting-tech-giant
Date: 2017-01-08T00:00:00+00:00
I love twitter for their product, and have spent some time thinking why it’s not succeeding as a company. As far as my naive thinking goes, there are more than 140 million users like me who use Twitter everyday and love it - it’s a great consumer product. But when it comes to growth as a business, it’s on a downhill.
From this context I have been thinking about how do companies become lasting giants, and have realised that it essentially boils down to two *not-so-easy* steps:
*Step 0* - create a product which your (niche) target customers love, grow it, and achieve product market fit. Easier said than done, however a lot of companies stop here (either they get acquired or perish - ex. WhatsApp, Yahoo, Pinterest, Dropbox)
*Step 1* - bring at least one other type of users (network) on your platform who create value for your consumers. They could be developers, sellers, property owners etc. If interaction between both of these networks is more efficient than any other existing mechanisms, it creates a huge network effect, and help the company elevate its status from a great company to a lasting giant.
It is arguable that advertisers (as the other type of users) alone can help create lasting companies. IMO, they don’t add enough value for the consumers, and therefore more often than not, companies need to add another types of users. I believe this is the reason Google & Apple need developers and apps on their platforms.
Amazon is a marketplace for a while now. Similarly, though it was hard for marketplaces like Uber & AirBnB to solve chicken and egg problem (step 0), but once they have, now they are unstoppable. On the other hand, Yahoo, for example, eventually perished because it only had advertisers. Facebook may look like as an exception, however in its pre-mobile days, its growth was largely fuelled by its developer platform, and these days content providers create that value for consumers which keeps advertisers interested.
It will not be easy for Twitter, however it needs to start moving from step 0 to step 1 as soon as possible. It has played an integral role in numerous social movements like Arab Spring, and world needs Twitter to exist.
---
# Speed and Quality
URL: https://www.abhinav.co/speed-vs-quality
Date: 2018-10-06T00:00:00+00:00
Speed vs Quality is a common debate in engineering and product organizations and though it is hard to move at speed while maintaining quality, but I believe it is not completely impossible. Here are some tips (in no specific order) to balance between the two
* Understand the product vision, and then engineer MVP or first version. Aim should be to develop an extensible but not the eventual system on day one. Focus on getting an end-to-end happy flow working, then edge cases, and then new scope changes.
* Do enough but do it well.
* ABC - always be closing. Minimize number of things in flight, if given multiple tasks simultaneously, always ask for priority.
Be open about writing use and throw code.
* Know what to do on server and what do on client. Initiate cross-team collaboration from planning stage.
* Don’t over-engineer (premature optimization is root cause of all evils.)
* Know when to hack and when not to hack. Know difference between good hacks and bad hacks. Keep them modular and separated from other code to allow easy refactoring/removing.
* Understand difference between tech-debt and bad code. Tech debt is something which is stopping you from moving at optimal speed; if not, it's just non-ideal/bad code. Don't try to fix it.
* Remember, tech-debt occurs when you take shortcuts and tightly couple your code. To take shortcuts, make sure to modularize your changes as much as you can.
* Leave the campground cleaner than you found it. No big refactoring projects, but continuous refactoring. If a feature takes 5 days to build, and refactoring a piece surrounding that takes 1 day - take 6 days and refactor.
* First make system correct and then make it efficient and not vice-versa (Correctness over Efficiency.)
* Though perceived otherwise, but practices like unit testing, code reviews, architecture reviews and automation helps in gaining speed while maintaining quality. Unit-test your code, and invest in automation. Find high-quality reviewers, and take feedback from at least a couple of them.
* Use a task tracking tool, and be religious about it.
* Be pro-active, and push information to other stakeholders early and more frequently. Being on same page helps a lot both with speed and quality. On a similar note, ensure silos are not formed - they give you speed in shorter term, but slow you down in longer term.
* Do frequent releases - if there are frequent releases, it automatically helps in avoiding scope creeps. Product owners know that they will get a chance to add changes in next release if changes don’t go in this release. This also means, that release dates need to be sacrosanct and if there’s a delay, everybody involved is informed as soon as possible.
> It is a mistake to think that moving fast is the same as actually going somewhere.
> ― Steve Goodier
---
# How to engineer an MVP
URL: https://www.abhinav.co/how-to-engineer-an-mvp
Date: 2018-10-08T00:00:00+00:00
As per wikipedia, MVP or Minimal Viable Product is a product with just enough features to satisfy early customers, and to provide feedback for future product development.
While it's a known paradigm in lean startup philosophy, however I have seen a lot of product engineering teams struggle to create one which can yield valuable learnings quickly. Here are some of my recommendations to product and engineering teams to help them create a good MVP.
### Before you start
* Though it is important that PMs think unconstrained while trying to build the product, however EM (and/or senior engineers) in the team should be consulted before MVP spec is locked down
* PMs should clearly communicate to engineering team the vision of the product and should list down set of hypotheses they are trying to validate from this MVP - this helps engineering team understand set of non-negotiable components and visualize future requirements
* Engineering team should also ask PMs to list down a couple of directions this MVP can take - through this engineering team can understand components which need flexibility and will change soon after.
* Remember MVP is principally a learning product, and iteration speeds will play an important to adapt product for users’ needs. Engineering team should find out time duration PMs will take to validate initial set of hypotheses - this will play a key role in deciding how much hacky/non-optimal code will be okay. If PMs can validate hypotheses in a couple of days, before team is required to work on V1 - team should likely not hack much or build code which can be iterated for V1 quickly. However if validation time is large, engineering team can enable PMs with quickly built MVP, and find time to build V1 while PMs validate the solution with users.
### Building
* Engineering is all about balancing the trade-offs and so is engineering an MVP. Good engineering teams know that right problems need to be solved at right stage, and solving them prematurely or too late can be fatal. Example - building generic systems or scaling them prematurely can waste a lot of important time, while continuing with non-optimal systems or processes for long can negatively impact your iteration speed.
* Though it is outside of scope for this document to define what is a good hack and what is a bad one, try to avoid bad hacks as much as you can. Example - hardcoding keys in client is a bad hack.
* Contain your hack. Spend time in finalizing contracts, input and output parameters - this gives you flexibility to implement API/module non-ideally and fix/refactor it later on without a need for large scale refactoring.
* Document your assumptions clearly - most of the hacks are actually nothing but assumptions which may not stay valid later on - document them, and share them widely in the team so that these hacks can be fixed at right time.
* Don’t automate from day one, but if you are spending 1+ hour as a team everyday in doing something manually, automate (at least partially) if you can.
* Backend and frontend should settle on API contracts as soon as they can, so that frontend team can stub API calls and develop in parallel. However, integration between backend and frontend should happen as early as possible - this avoids fixing mismatch of assumptions at the last moment.
---
# Slack Etiquette
URL: https://www.abhinav.co/slack-etiquettes
Date: 2020-06-20T00:00:00+00:00
Slack has become an important tool to make the workplace more collaborative. However, it has also become the primary reason for stress, fatigue and degraded productivity. Here are some basic etiquette to keep in mind:
## Email
- Slack is not email - if you are using Slack as a replacement for email, then there's something wrong. (example: weekly status reports, product specs, engineering design etc. ideally should be over wiki/email)
- Slack isn't meant for deep discussions that last for days/weeks. Use email instead.
- Slack is meant for ephemeral communication. Avoid taking decisions on Slack, and if you do - send an email or note them down in appropriate documents. Slack messages get lost very easily.
## Channels
- Default to public channels. Create a private channel if you want it to be accessible only to a few folks
- If you are creating a channel, follow your org's convention of naming channels (including underscore vs hyphen in the channel name)
- If you are part of a private channel, don't add more folks without asking the person who created or is running the channel.
- Archive channels that are no longer needed.
- Every channel must have a specific reason for existence. This might be different from the stated purpose on Slack. If a lot of channels have similar set of members, and they talk about the similar things in all the channels - merge them (by archiving other channels)
## Direct Messages (DM)
- DMs create silos and information asymmetry. I am a big fan of [Stripe's email transparency](https://stripe.com/blog/email-transparency) culture, and hence I insist on minimising DMs as much as possible.
- If more than 2 people have messaged you asking the same thing, you should consider putting your answer in a channel or a document.
- Slack allows you to DM upto 7 people at once, however I recommend at max 3 people DMs (including you), if you want to talk to more at once - use an existing channel, create a new channel (avoid it as much as possible though) or take this conversation over email. Adding more folks and giving them context about the discussion is much easier that way.
- In the WFH world like today, I would recommend not sending a DM after work hours. DMs create notifications. Send an email instead. This way the receiver can process the message at his own time.
- If you choose to DM, put the whole question in first message itself - it's stupid to message hi/hey and wait for other person to respond. By writing down the whole message, you also let the receiver decide the priority of the message.
## @Channel
- Use @channel if you really want everyone to take a note right away. Usually these situations are only emergency situations.
- Think twice before using @channel in a channel of more than 10 people during off hours. Consider using @here.
- Most of the @channel messages sent during off hours can be sent in normal working hours. Consider doing that. This helps ensure that importance of @channel message is retained, and they get enough attention from everyone
- If your channel is a support channel (ex. IT-support), consider creating a user-group (ex. @it-support) as well - this will ensure anyone needing urgent help doesn't have to @channel and disturb everyone who is in the channel to seek help.
## Conversations
- Don't be a grammar nazi
- Use DPs and add your title - there are enough bots already on Slack, you don't need to be one.
- Acknowledge messages. You can use emojis or reactions, but do acknowledge the message.
- Many times, if you are writing a really long message, it's a signal that this message probably should be sent over email. In case, you still want to go ahead, make it easy to scan by adding line breaks, bullets, and text styling.
- Utilise threads, especially for happy birthday/congratulations messages. Avoid using a separate message as much as you can.
## Availability
- One of least used features of Slack is Status - use it effectively to communicate if you are away from work.
- Pause notifications/use DND in case you are in a meeting, or working on something important. Notifications should not distract you from the work at hand.
---
# Blockr
URL: https://www.abhinav.co/blockr
Date: 2020-07-28T00:00:00+00:00
There are distractions all around. Our attention span is continuously decreasing, and so is our ability to focus and do deep work.
blockr is a command line tool to easily **block** websites to avoid distractions. At the same time, blockr makes it extremely easy to **unblock** websites in case you need to access them.
If you prefer a different workflow and like focussed and relaxed modes, blockr also lets you switch between these modes ensuring you are able to access blocked websites in relaxed mode - blockr provides **activate** and **deactivate** command to support this use case.
Please note this is alpha software, and is currently tested only on mac (Apple's OSX)
### Installation
```
$ sudo gem install blockr
```
### Commands
```
$ blockr block [WEBSITES] # block websites; shortcut -d
$ blockr unblock [WEBSITES] # unblock websites; shortcut -u
$ blockr activate # activate blockr, make all websites blocked by blockr inaccessible; shortcut -a
$ blockr deactivate # deactivate focus mode, make all blocked websites accessible; shortcut -d
$ blockr help [COMMAND] # Describe available commands or one specific command
```
### Examples
```
$ sudo blockr -b www.example.com # block
$ sudo blockr -u www.example.com # unblock
$ sudo blockr -a # activate focus mode
$ sudo blockr -d # deactivate focus mode
```
### Source code
Source code is present on [Github](https://github.com/abhinavs/blockr) - please check [README](https://github.com/abhinavs/blockr/blob/master/README.md) for more detailed documentation.
### Website
Please check [project home](https://www.abhinav.co/blockr.html) for regular updates.
---
# Microrequests
URL: https://www.abhinav.co/microrequests
Date: 2020-08-18T00:00:00+00:00
Microservices have slowly become the chosen way of building systems in large and small companies - they work because they allow decentralisation and the separation of concern which helps when the number of teams in an organisation starts growing.
Microservices, however, also present some challenges. One of them is to keep communication between different microservices simple and easy yet performant.
There are a lot of ways in which microservices can talk to each other, one of the most popular ways is to use HTTP APIs (including REST APIs) - HTTP is a sort of stateless protocol, and by default is a bit inefficient to use from the latency point of view if you have to call many microservices to serve one client-facing request.
Microrequests makes consuming microservices in Python more efficient. Python’s requests module is fantastic and highly configurable, microrequests builds a wrapper over requests module and enables connection pooling as part of initialisation. This ensures that you use the same connection instead of creating one with every new request, while still working with requests’ clean APIs and mechanisms.
### Installation
The easiest way to install microrequests is using pip
```sh
$ pip install microrequests
```
### Usage
To use, simply do::
```python
import microrequests
mr = microrequests.init()
# mr is requests' session object and you can use it in similar manner
res = mr.get("http://httpbin.org/get")
print(res.text)
```
You can also customize max_retries, pool_connections, and pool_maxsize - they are by default set to 1, 100 and 50 respectively; pool_connections is the number of urllib3 connection pools to cache and poolmaxsize is the maximum number of connections to save in the pool
```python
import microrequests
mr = microrequests.init(max_retries=2, pool_connections=10, pool_size=5)
res = mr.get("http://httpbin.org/get")
print(res.text)
```
### Future Work
In the future, I intend to add more nifty ways to make consuming microservices easy and efficient. I also want to experiment websockets as a communication protocol instead of RPC or HTTP - a lot of backend frameworks in various programming languages now support websockets and interface is mostly clean, however consuming microservices using websockets is still not mainstream and interfaces are still ugly. I intend to work on this.
### Source Code
Source code is present on [Github](https://github.com/abhinavs/microrequests), please check [project homepage](https://www.abhinav.co/microrequests.html) for more and updated details.
---
# Narrative Chasm
URL: https://www.abhinav.co/narrative-chasm
Date: 2020-11-01T00:00:00+00:00
Every company and entrepreneur needs a narrative to tell to the world. A good narrative is almost as important as an excellent product.
These narratives are forward-looking. They highlight the big opportunity and why the company is poised to capture it.
However, in an attempt to create a compelling narrative, entrepreneurs often knowingly or unknowingly exaggerate the company’s strength and hide the challenges or risks.
The biggest trouble happens when everybody in the company starts believing that narrative as reality. Mid-level managers and employees fall for this more given they hear it regularly in pep-talks. Companies become over-confident, underestimate the challenges they face, neglect org culture, forget about customer experience, build unnecessary & complex features, and get into mega-hiring spree.
This lack of self-awareness and humility prevents them from achieving their real potential.
This is a **chasm** that even most of the successful companies never cross. They never become truly glorious.
---
# Peacetime
URL: https://www.abhinav.co/peacetime
Date: 2020-11-26T00:00:00+00:00
A while back, [Ben Horowitz](https://www.twitter.com/bhorowitz) wrote a [great post](https://a16z.com/2011/04/14/peacetime-ceowartime-ceo-2/) on the concept of peacetime CEOs and wartime CEOs. I recommend reading it in case you haven't read it.
We understand that companies in wartime require a military kind of approach to execution - we also admire leaders who are able to successfully lead companies in these times.
Ben has been a good wartime leader, and it is implicit in the post that he thinks it is harder to be a wartime CEO than to be a peacetime CEO. Probably that is the case. Or perhaps, we are wired to glorify war. Look at history books, and you will find that the majority of time is spent discussing wars, jumping from one winning ruler to another.
Politically, peace is a very modern phenomenon. My hypothesis is that as human beings, we don’t intuitively understand peacetime, especially when it comes to the core of capitalism - companies.[^1]
We don’t know how to manage companies in peacetime.[^2] We either look for war opportunities, artificially create war like situations, or fail to utilise peacetime to create an edge, eventually fighting to survive. No wonder, you see many great companies vanish, die a slow death, or become irrelevant because of their inability to manage peacetime effectively.
Need examples? Yahoo!, Nokia, Blackberry, MySpace, Motorola, Pan Am, AOL, Path, Digg, JetAirways, Apple of 91-97.
I wanted moonwalk to be very fast and made choices to make it very performant. I took [no style please!](https://github.com/riggraz/no-style-please) as a base, a wonderful theme with almost no CSS and customized it heavily to express my design. I avoided the temptation to add any css or javascript frameworks and explicity made the blog text heavy than image heavy. And it's not a surprise that Moonwalk has a perfect 100/100 Lighthouse score.
If you want to see a demo - this very website is the best example of it.
Do try [moonwalk](https://github.com/abhinavs/moonwalk) for your next project.
Scoop uses
1. [Corneal](http://thebrianemory.github.io/corneal/) to make scaffolding models, controllers and views easier
2. ActiveRecord as database ORM
3. Capistrano for deployment
4. Puma as app server
5. Nginx as a proxy server
In addition,
1. it is also JSON API ready with JSON, CORS and JSONP support already enabled,
2. has a rails like console, and
3. comes up with example script and rake task that can be used to perform tasks that load the environment
You can start using Scoop by [forking this repository](https://github.com/abhinavs/scoop/fork). Scoop's [README](https://github.com/abhinavs/scoop/blob/master/README.md) has detailed steps to set up development and production systems as well as the deployment process.
Do give Sinatra & Scoop a try.
---
# Web3 - new yet old
URL: https://www.abhinav.co/web3-and-the-chasm
Date: 2021-11-07T00:00:00+00:00
Consider these questions:
- How did stock exchanges around the world originate?
- Why do governments allow them to function when they resemble gambling?
- What steps do governments take to keep them relatively safer options for investors?
I think the history of stock markets and these questions are tied to the new web3/crypto/DeFi and its future. After all, promises of shares and tokens are almost the same - communal ownership.[^1]
[Dutch East India Company](https://en.wikipedia.org/wiki/Dutch_East_India_Company) was a special company. It was the first company to issue shares to the general public. Company had a big mission and required a lot of investment. At the same time, the possibility of lucrative dividends was high. As a result, the company's and its investors' incentives were aligned.
This was the start of public companies. Quite soon people started trading their shares in the companies. Again incentives were aligned - folks with shares could get liquid money whereas the new shareholders could earn from dividends. Gradually, people were making more money by trading shares than from dividends. They would buy shares at a lower price and sell it to others at a higher price.
People started forming narratives about the companies, they also started studying financial data better to supplement the narrative. However, as it happens in the world, a lot of fraud mechanisms also emerged.[^2]
Now, many of these companies were really **important for the economy**. Some were developing modern infrastructure and hence governments started creating regulations to protect both companies and investors from these frauds. Today, while fraud has not gone completely to zero, stock exchanges are relatively safer and well-regulated.
If you see, a lot of web3 promises seem to be exactly the same as companies of earlier generations promised via shares.
However, there is very little regulation - well, that's intentional, after all decentralization is a key foundational pillar and any form of government regulation will be seen as the defeat of the original goal.
However, there's a big [chasm](https://en.wikipedia.org/wiki/Crossing_the_Chasm) that web3 still needs to cross[^3].
{:class="img-responsive"}
From this perspective I see following four distinct scenarios playing out:
1. Status Quo - web3 continues to operate without any regulation. Community self organizes and ensures that its true promise is fulfilled.
2. Governments get involved - the progressive ones try regulating it accordingly, and a few others ban them. Gradually, it gets to the balance that helps it grow, but with a few compromises.
3. Big VC firms, large companies, early believers and lobbyists keep pushing the narrative and pump in users and money. It becomes too big to fail and crosses the chasm. Governments don't regulate it at all because of various reasons (including political ones)
4. Bubble bursts. Everybody except true believers leaves. Chaos settles a bit, and these believers then create infra and use cases that help web3 cross the chasm.
Future is unpredictable. Narratives are linear and have survivor bias. What happens in the world is chaotic and non-linear. Even in web3, pragmatically speaking, a bit of everything will happen.
I do think that web3 tech, while still in its infancy, is quite neat. However, it has a long way to go. I just hope greed, fraud and associated chaos doesn't hinder web3 from reaching its full potential.
## Footnotes
[^1]: To be honest, tokens are in a lot of ways better because they are Internet native, are programmable with smart contracts and a lot more capabilities.
[^2]: A few simple fraud mechanisms were stealing share certificates, exaggerated narratives, pump and dump etc. Surprisingly many of them, in some form, exist in the web3 world too.
[^3]: Web3 critics say that cryptocurrencies haven't solved any solid use cases even after a decade of existence. Web3 believers however feel that it is still in the infrastructure creation stage, and interesting use cases will be built when the right infra is in place.
---
# Designing Microservices
URL: https://www.abhinav.co/designing-microservices
Date: 2022-08-07T00:00:00+00:00
I was recently asked about considerations while migrating to microservices architecture. While I believe not every company needs microservices, they can be really useful in scaling your org and systems.
Here are some of the top things I would keep in mind:
1. **Abstraction** - how well a problem is abstracted so that it doesn’t leak its core business rules to other services, at the same time does only one or two things.
2. **Independent DB(s)** - doesn’t share its database with other microservices. One micro-service, however, definitely can use multiple databases.
3. **Latency and number of microservices that hit in a flow** - this should ideally be limited to a specific number. P95, P99 latency, and error rates should be tracked and monitored.
4. **DAG** - there’s no circular dependency, and the relationship between microservices is ‘Directed Acyclic Graph’. This will keep dependencies, latencies, and complexity in check.
5. **Classification between core and auxiliary services** - the idea is if any of the auxiliary services die, users should face a degraded experience but no downtime.
6. **SDK** - build SDK that microservices can use to call other microservices. The idea is that this SDK becomes a core library with its inbuilt logic around logging metrics and handling degraded behavior (constructs like circuit breakers)
7. **Platform Services & Modules** - in addition, a lot of duplicated code across microservices should be pulled out and abstracted either as a supporting service or library (ex. locking, scheduler - no business logic though, connection pooling, throttling, analytics logger)
8. **Team** - take into consideration how your org structure would evolve in the next 2-3 years, the kind of product and platform teams you would have, and ensure no microservice is shared between teams.
---
# Data science libraries in Python and Elixir
URL: https://www.abhinav.co/data-science-python-vs-elixir
Date: 2022-10-04T00:00:00+00:00
Data science in Elixir is maturing at a rapid pace. This post lists data science libraries in Python along with their Elixir equivalent.
### Notebooks
- Python: Jupyter
- Elixir: [Livebook](https://livebook.dev)
### Numerical Analysis
- Python: NumPy
- Elixir: [Nx](https://hexdocs.pm/nx/Nx.html)
### Traditional Machine Learning
- Python: scikit-learn
- Elixir: [Scholar](https://github.com/elixir-nx/scholar)
### Deep learning
- Python: PyTorch / TensorFlow
- Elixir: [Axon](https://hexdocs.pm/axon/Axon.html)
It is also possible to use pre-trained models, you can use [AxonOnnx](https://hexdocs.pm/axon_onnx/AxonOnnx.html) for it.
### Data analysis
- Python: Pandas
- Elixir: [Explorer](https://hexdocs.pm/explorer/Explorer.html)
Explorer is built on top of polars library which is a lightning fast DataFrames implementation in Rust.
### Data presentation and visualization
- Python: Plotly Express / matplotlib
- Elixir: [VegaLite](https://hexdocs.pm/vega_lite/VegaLite.html)
VegaLite is Elixir bindings to Vega-Lite, a high-level grammar of interactive graphics.
### Network and geographic visualization
- Python: NetworkX (network), Folium (geo)
- Elixir: no equivalent so far
### Pipelines and orchestration
- Python: tf data, DataLoader
- Elixir: [Broadway](https://hexdocs.pm/broadway/introduction.html) and [Flow](https://hexdocs.pm/flow/Flow.html)
Elixir runs over Erlang VM called BEAM, and hence by design can work better than Python processing data in concurrent and fault-tolerant manner.
### Domain specific
For custom domains like NLP, computer vision and signal processing, Elixir libraries are still being worked upon.
---
# Notes on CBDC
URL: https://www.abhinav.co/notes-on-cbdc
Date: 2022-10-09T00:00:00+00:00
RBI has recently published a concept note on Central Bank's Digital Currency (CBDC) - it is available to read [here](https://rbidocs.rbi.org.in/rdocs/PublicationReport/Pdfs/CONCEPTNOTEACB531172E0B4DFC9A6E506C2C24FFB6.PDF).
I glanced through it and found it pretty interesting. At a personal level, I'm quite hopeful that a well-implemented CBDC can marry the benefits of cash with current pseudo-digital money.
### Why CBDC
At the moment ~3% of GDP is spent on printing, distributing, and securely storing cash. Moreover, India has around 15-30% of its GDP as a shadow economy (not all of the shadow economy is illegal, but much of it is)
Digital money in its current form (credit card, UPI) has too many entities in the middle to solve for trust. As a result, these entities charge ~2% of the transaction cost from the merchant (which essentially gets passed to customers)
I also believe, a well-implemented CBDC also has a shot to replace USD as the reserve currency of the world. China has already made some progress in implementing digital Yuan (eCNY) - AFAIK, it is primarily targeting transactions between banks (rightfully so)
China's progress is one of the key reasons why India and RBI are also so keen on CBDC
### CBDC & its implementation
Introducing CBDC should not mean that banks lose their relevance, however, it should mean they do high-order things more efficiently. As an example, they should still be the ones doing KYC, however, their recon & settlement process should be way more efficient because of CBDC.
RBI's concept note on CBDC distinguishes between retail (CBDC-R) and inter-banking entities (CBDC-W) and their respective implementation details.
I think,
- CBDC can be implemented without using blockchain and yet can be distributed with no single point of failure (think about how SSL/HTTPS certificates work)
- Direct benefit transfer (DBT) scheme launched by the govt could be more efficient with smart CBDC
**TODO: update with the design I think can work without blockchain**
### Further Reading
1. [Deepening of Digital Payments Report](https://rbidocs.rbi.org.in/rdocs//PublicationReport/Pdfs/CDDP03062019634B0EEF3F7144C3B65360B280E420AC.PDF) (January 2019) - it was written by a committee that worked under the chairmanship of Mr Nandan Nilekani.
2. [Central Bank Digital Currency – Is This the Future of Money](https://youtu.be/xoXA_mVJ504) - another interesting speech by Mr. Rabi Sankar, Deputy Governor, RBI. He talks about the difference between currency & money, then presents RBI's viewpoint. [Transcript](https://www.rbi.org.in/Scripts/BS_SpeechesView.aspx?Id=1111)
---
# addy - like apt install, but for people
URL: https://www.abhinav.co/addy
Date: 2025-07-21T00:00:00+00:00
Every company has a version of this problem.
A new engineer joins. Someone sends a Slack message to whoever manages the servers. That person sets up access when they find the time - creating accounts, copying keys, updating permission files. All done by hand, all from memory. When that engineer leaves, most of this gets undone. Some of it doesn't - old access quietly lingers on servers nobody thinks to check.
Some teams give up and share a common `deploy` or `ubuntu` user. One SSH key, everyone uses it. Fast to set up, impossible to audit. When something breaks in production - or something gets deleted - you have no idea who was logged in. The logs say `ubuntu`. That's where the investigation ends.
---
## The drift nobody notices
The manual approach creates drift quietly. Keys that should have been removed are still there. A contractor who left six months ago can still log in. Nobody knows exactly who has access to what because it lives scattered across the configuration of individual servers, not in any one place you can actually look at.
You only find out how bad it is during a breach, an audit, or a compliance review.
---
## Where the idea came from
I worked at Yahoo from 2005 to 2007. One of the internal tools we used was yinst - a package manager built for Yahoo's massive server fleet. Among other things, it handled adding and removing users across servers. One command, right setup, clean removal.
I didn't think much of it at the time. That was just how things worked at Yahoo.
Years later, building and managing infrastructure at smaller companies, I kept noticing the absence of it. The manual approach isn't wrong exactly - it works fine when the team is small and careful. But it doesn't scale with the team, and it has no memory. When someone leaves or an audit arrives, you're reconstructing history from Slack messages and gut feel.
addy is my attempt to bring that same idea - one command, predictable outcome, Git as the record - to teams that don't have a hundred infra engineers to build it from scratch.
---
## What addy does
addy treats server access like a package. Your team's SSH public keys live in a Git repository. addy reads from that repository and applies changes to your server.
```
sudo addy install user/alice # creates Linux user, installs SSH key
sudo addy install sudo/alice # grants passwordless sudo
sudo addy remove sudo/alice # revokes sudo
sudo addy remove user/alice # removes access entirely
```
No database. No service to run. No web interface to maintain. Just a Git repo and simple commands.
When someone joins, you add their public key to the repo and run one command. When they leave, you remove the key and run one command. Their access is gone - cleanly, completely, verifiably. No shared users. No drift.
---
## Why Git is the right place for this
Git gives you two things that matter here.
The first is workflow. Instead of sharing public keys over Slack and hoping someone copies them correctly, engineers open a pull request to add their key to the repository. The team can review it, the change is visible, and there's a clear record of when it was merged.
The second is audit trail. Every key addition and removal is a commit. When a compliance team asks "show me every access change in the last six months," you have an answer - not a pile of Slack threads to go through.
The actual granting of access - creating the user on the server, installing the key, updating permissions - still happens through addy commands. That part isn't automatic. But because the keys live in Git, the record of who should have access is always in one place, versioned, and reviewable.
---
## The setup
```
pip install addy
sudo addy config set git-repo git@github.com:your-org/ssh-keys.git
sudo addy install user/alice
```
Your key repository needs one thing: a `users/` directory with `.pub` files named after each person.
```
users/
alice.pub
bob.pub
charlie.pub
```
addy handles creating the Linux user, installing the key to the right location, setting correct file permissions, and validating the key format before doing any of it. For sudo access, it writes a sudoers file and validates it with `visudo` - so a malformed entry doesn't accidentally lock you out.
---
## Who this is for
Teams of 5 to 50 people. Big enough to have real access management overhead. Small enough that nobody has built internal tooling for it yet.
If you're managing server access through Slack messages and shared users, addy is worth an hour of your time.
The alternative is finding out - during an audit or after an incident - that you don't actually know who has access to what, and no log to help you figure it out.
[github.com/abhinavs/addy](https://github.com/abhinavs/addy)
---
# Microservices are a people decision, not a technical one.
URL: https://www.abhinav.co/microservices-a-way-to-organize-teams
Date: 2026-02-21T00:00:00+00:00
I've seen companies running thirty microservices with a twelve-person engineering team.
Nobody questions it. Microservices have become the default answer to "how should we structure our system?" - adopted for the wrong reasons, creating new problems while the old ones quietly follow along.
My unpopular opinion - microservices are mostly a way to organise teams, not to scale systems. And most companies that adopt them are doing it backwards.
---
## The actual value
Mel Conway observed in 1967 that organisations design systems that mirror their own communication structure. Three teams building together produce a three-part system - whether that's the right architecture or not.
This is the real case for microservices. When the payments team owns the payments service end to end - builds it, deploys it, fixes it at 2am - they stop waiting on five other teams to ship a change. Reduced coordination. Clearer ownership. That's worth something.
But it only works when the split is real. One team, one thing, completely.
Most companies don't do it this way.
---
## The mistake
The most common thing I've seen: splitting code without splitting ownership.
You have a user service, an auth service, an account service. They all touch the same user data. Any change to how a user is represented requires coordinating across three teams. The services are separate. The work isn't.
The mess hasn't gone away. It's moved into the gaps between services.
And when something breaks, it breaks across multiple services at once. A bug that takes an hour to find in a monolith takes a day when you're tracing requests through four systems and reading logs from three different places.
Every service also needs its own deployment pipeline, its own monitoring, its own on-call rotation. At Netflix this overhead is justified. At a 20-person startup it's a tax on every engineer, every day. I've watched teams ship at half their previous speed after going microservices - not because the technology was wrong, but because the team wasn't big enough to carry the weight.
---
## Why this matters more now
AI coding agents change the calculation further.
An agent can hold an entire codebase in context and make changes across multiple modules without getting lost. What's harder is reasoning across service boundaries - different repositories, different API contracts, different deployment pipelines. Every boundary you add is friction for the agent.
A modular monolith, where code is well-structured but lives in one place, is significantly easier for an agent to work with. I think this is where most teams will land as AI-assisted development matures - not because microservices are wrong, but because the tool that's transforming how we build software works best with fewer walls.
---
## When to actually use them
Microservices make sense when teams are genuinely separate - different product lines, different shipping cadences, minimal coordination needed. They make sense when one part of your system has dramatically different scaling needs from the rest. At real scale, the operational overhead is worth it.
The mistake is using them as the starting point. Start with a well-structured monolith. Split when you have a specific reason to split, not because microservices sound like the professional choice.
The architecture should follow the team structure. Most of the time, the team is smaller than the architecture suggests.
---
# On learning new things without old baggage
URL: https://www.abhinav.co/learning-new-things-without-baggage
Date: 2026-02-27T00:00:00+00:00
Whenever I'm in Bangalore, I still default to Hindi.
I lived there for ~6 years, but I never really learned Kannada. The moment someone spoke to me, my brain looked for a Hindi equivalent and came up short.
Kids don't do this. A child learning a new language maps words to real things - the sound and the reality arrive together.
Adults, on the other hand, map words to other words. Duolingo does this too - every lesson maps the new language onto the one you already know. No wonder so few learners ever hold a real conversation.
The same pattern shows up when engineers learn new programming paradigms.
I learned C first. Then tried jumping to Java. Object-oriented programming felt alien - I kept asking "what's the C equivalent of this?" and half the time, there wasn't one. I gave up, took a detour through Perl, and arrived at objects gradually. The direct path didn't work because I was carrying the old map into new territory.
This is exactly what's happening with AI right now.
Most people learn AI tools by mapping them onto familiar things. ChatGPT is like Google, but better. Copilot is like autocomplete, but smarter. An agent is like a junior employee you can delegate to.
These analogies help you start. They also limit how far you go.
I'll be honest - I catch myself doing this too. Twenty years in tech means twenty years of mental models that I keep reaching for, even when they don't quite fit.
The people I've seen get the most out of AI are often the ones without that baggage. AI-native - they didn't learn to Google before ChatGPT, didn't debug by posting on Stack Overflow before Claude Code. They're not translating. They're just using it for what it is.
That model doesn't come from reading about AI. It comes from approaching it with fresh eyes, not a map drawn from somewhere else.
The ceiling isn't the tool. It's the map you bring to it. And I'm still drawing a new one.
---
# AI doesn't have a Moore's Law
URL: https://www.abhinav.co/ai-curves
Date: 2026-04-21T00:00:00+00:00
## It has something harder to name, and harder to ignore.
In January 2023, two months after ChatGPT launched, I started building [annexr](https://annexr.com). I thought I was late. Three years later, I realize I was early.
That mismatch - feeling late while being early - is the signature experience of building in AI right now. It has nothing to do with individual foresight. It has everything to do with how progress in this field compounds.
---
## One curve vs. many
Moore's Law was one curve: transistor density doubling on a predictable clock. Clean, measurable, predictive. And even that wasn't a natural law. At Intel, it was a goal the company worked hard to keep. When physics pushed back, they adapted.
AI progress isn't like that. There is no single company shepherding a single metric. It is a bundle of partially correlated curves: compute, algorithms, inference cost, hardware efficiency, and how long AI systems can work without a human in the loop.
What makes this unusual is that two different kinds of improvement run at once.
- [Moore's Law](https://en.wikipedia.org/wiki/Moore%27s_law) runs on the calendar. Time passes, chips improve.
- [Wright's Law](https://en.wikipedia.org/wiki/Experience_curve_effects) runs on cumulative work done. The more you make something, the cheaper it gets.
In AI, both are active simultaneously. That coupling is what makes progress feel relentless. The decoupling is what produces the walls.
---
## The curves, briefly
Four numbers worth knowing:
- **Training compute** has grown roughly 4.5x per year since 2010
- **Algorithmic efficiency** improves separately: the same capability now takes about 3x less compute each year
- **Inference cost** has fallen by orders of magnitude, anywhere from 9x to 900x per year depending on the task
- **Agent task horizon** - how long an AI can work before needing help - has been doubling roughly every four months
These aren't independent. Falling inference cost enables more compute at inference time, which improves reasoning, which pushes the task-horizon curve further, until it hits a wall.
---
## Where the curves break
**The logarithmic trap.** Benchmark performance scales roughly with the log of compute. Each doubling of performance costs far more than a doubling of the training budget. The current bet is test-time compute, shifting spend from training to reasoning during use. Whether the economics hold at scale is still open.
**The data wall.** High-quality human text is largely exhausted at frontier training scales. Synthetic data and model self-play have kept the curve alive in narrow domains like math and code. Whether they generalize is the open question.
**The reliability gap.** Task horizon measures length, not robustness. An agent that can work for a hundred hours but has a 1% chance of failure each hour is unusable for anything high-stakes. Reliability data lags capability data badly, which is itself a signal about what the industry has optimized for.
**The power grid.** Moore's Law was about density, doing more in the same space. AI scaling is about absolute magnitude. Bigger clusters need more gigawatts. Power grids follow civil engineering timelines, not silicon ones.
**The institutional curve, which is essentially flat.** Compliance, procurement, security review, change management: none of these scale exponentially. The AI curves are steep. The institutional curve is close to flat.
---
## What this means practically
The line of what is worth building keeps moving. Something too expensive or too unreliable last quarter can make sense this quarter. Something that barely works today can be boring infrastructure a year from now.
But the problems blocking real adoption have shifted. They are no longer mostly about capability. They are about reliability, power capacity, data quality, and how long it takes large organizations to trust new systems.
Most of the interesting work for the rest of this decade sits in closing the gap between a steep capability curve and a nearly flat institutional one. Not pushing the frontier further. Getting organizations to the threshold.
That is a harder problem than making the models smarter. It is also a more tractable one.
---
*If you want the backstory on how these three threads came together, I wrote about that separately: [The AI moment was seventy years in the making](/ai-three-lines).*
---
## Sources and further reading
- [Moore's Law](https://en.wikipedia.org/wiki/Moore%27s_law)
- [Wright's Law / Experience curve effects](https://en.wikipedia.org/wiki/Experience_curve_effects)
- [Epoch AI: Trends in frontier AI training compute and algorithmic efficiency](https://epoch.ai/trends)
- [Epoch AI: LLM inference price trends](https://epoch.ai/data-insights/llm-inference-price-trends)
- [METR: Measuring AI ability to complete long tasks (Jan 2026 update)](https://metr.org/blog/2026-1-29-time-horizon-1-1/)
- [Stanford HAI: AI Index Report](https://hai.stanford.edu/ai-index/2025-ai-index-report)
---
# The AI moment was seventy years in the making
URL: https://www.abhinav.co/ai-three-lines
Date: 2026-04-21T00:00:00+00:00
_Three independent lines of work. Each took decades. None waited for the others._
---
In 1947, Bell Labs invented the transistor. A year later, Claude Shannon, working in the same building, published a paper on the mathematics of communication. Neither discovery knew what it was starting.
What we call "the AI moment" is not one thing. It is the convergence of three threads, each of which matured on its own schedule, developed independently of the others.
---
## The first thread: a language for information itself
In 1948, [Claude Shannon](https://en.wikipedia.org/wiki/Claude_Shannon) published [_A Mathematical Theory of Communication_](https://en.wikipedia.org/wiki/A_Mathematical_Theory_of_Communication). He was trying to solve a practical problem: how do you transmit a signal reliably over a noisy channel?
What he produced was something much larger. A mathematical language for information itself. Entropy. Compression. Channel capacity. The idea that meaning could be separated from medium, quantified, and reasoned about formally.
It laid the mathematical foundation that machine learning, deep learning, and modern AI are built on. Every token prediction in a modern language model is a descendant of that paper. Shannon did not know he was laying the foundation for AI. He was solving a telephone problem.
---
## The second thread: hardware that could actually run the math
The [transistor](https://en.wikipedia.org/wiki/Transistor) was invented in 1947. Seven decades of shrinking, specializing, and parallelizing followed.
The moment hardware met modern AI visibly was 2012. A team at the University of Toronto trained a neural network called [AlexNet](https://en.wikipedia.org/wiki/AlexNet) on GPUs and won [ImageNet](https://en.wikipedia.org/wiki/ImageNet) by a margin that made everyone in the field stop and recalculate. GPUs were designed for graphics. They turned out to be the right shape for deep learning: massively parallel, fast at matrix operations, cheap enough to experiment with.
Google followed with custom silicon. TPUs arrived in 2016, designed specifically for neural network workloads. The physical substrate that made scale possible was now being purpose-built for it.
---
## The third thread: an architecture that changed everything
In June 2017, a team at Google published [_Attention Is All You Need_](https://arxiv.org/abs/1706.03762). The paper proposed the [Transformer](