How is Life as a Muslimah?

On this blog I often write of being a Muslim convert. That tends to be the primary theme here, actually. But a lot of you may not know what that means in practical terms. So, I’d like to open up to…

Smartphone

独家优惠奖金 100% 高达 1 BTC + 180 免费旋转




Tech

Learnings of a noobler!

I joined Google 3 years back and got a chance to build products from scratch in GPay India. The journey has been amazing with the best part being the people I worked with. I joined right out of college, so I got to learn a great deal here.

All of us value different things, as for me, I value connecting with people and building relationships (Testing question: If not enforced, would you like to work with me?). So, this document is not a list of recommendations or teachings, it’s an introspection, listing key learning…

Table of Contents
Tech
Writing good code is hard
Bugs are never intentional
Multiple knobs are dangerous
Iterate fast
Code is cheap
Don’t code on prediction
Keep doors open
Simplify frequent use cases
Wiser default option

General
Listening is hard & super-useful
We see what we want to
Attention management
Being open to feedback
Effective processes
Productive meetings
Scary is good
Explorations beyond software
Ideas over coffee
Some battles are not worth fighting

“But this works!”, is not even an argument. I took some time to learn this. It’s not about making things work, that’s easy. Writing code/designing systems which are open to extensions and are flexible is hard, really hard, and losing sight of the bigger picture when implementing a small fix is super easy.

We can always put an if and get done with it, easy right? Or, we can handle it in a way which is consistent with the existing design. Ask, if we had to design this system from scratch with this new requirement, what would we have done?

It’s almost never worth adding hacks (yes, no one comes back to clean things up), a code is written once but read hundreds of times.

“I know this is safe, we don’t need a flag/test for this.”, I have said this multiple times when I was asked to put changes behind a flag or write more extensive tests under deadline.

Well surprise, but, no one introduces bugs intentionally. There can always be flows which we are not aware of, or have implicit assumptions. It’s always better to have a safety net. Ask, what if things go wrong, how would we damage control.

The cost of fixing things (if at all possible), almost always outweighs the tiny gain of not safeguarding.

Guarding changes is good. Having multiple knobs is dangerous.

Consider this example:

EnableCache is one flag, and DisableStorageCall is another.

This setup calls for one important question: What does EnableCache: True and DisableStorageCall: False combination mean?

Ask, do I need to change things at multiple places to achieve a single objective?

Have a single knob (extend it) for a single behavior. In case there has to be multiple touch points, document/enforce it at all the places.

In my initial days, when designing a solution, I would try to implement the perfect system, which led to no usable product coming out for months.

The lesson I learnt was, while it is good to have a vision, it is equally important to iterate on the solution and keep getting new versions out, not blocking on a perfect system. Divide the project into milestones and be open for the project to take a shape that was not expected during inception.

Small iterations come with learning and shape the longer vision.¹

“I have already coded it up, do I really need to change it?”, an argument made when I know the reviewer is correct and I am too lazy to change things.

While for a single change, it might seem OK to introduce a hacky solution. In the large scheme of things, these hacks build up and add cognitive load to anyone trying to understand the system. The tiny time advantage O(hrs) that we get from not rewriting things the correct way, results in multiple readers spending huge time O(days) in understanding.

Be open to refactor/rewrite, no hack is worth it.

“We would need this in future.”, we won’t. YAGNI is not hypothetical.

It is exciting to build something which is not needed right now, in anticipation of requirement. This type of code is generally rendered useless when that requirement (if at all) actually comes.²

Having said this..

While it is useless to implement things which don’t have clear requirements, it is important to keep the system flexible to allow extensions. Ask, if implementing A would close doors on doing B and C in future.

Don’t make systems rigid to extension.

In my initial days, I would go through all the corner cases possible and try to handle them all in a way that it all becomes easy.

This approach can be problematic, consider this example:

We are building a system which can handle use cases A, B and C.

A happens very frequently (twice a day), B (once in a month) and C (once in a year). If we have this trade-off:

Option 1 is the way to go.

The most frequent use case should be the simplest possible even if it means making the rare use case a little harder.

Experimentally it has been shown that the default option is what majority of the users/clients will choose. Make default options of your API/product/framework wiser and obvious from the client’s point of view.³

This took me some time, still half-way, not jumping on a topic, but this one skill has helped me more than anything. Just listening to views/opinions and absorbing things.

I have spent time doing experiments and read and noticed how we find data which supports our view of the world. It is critical to play devil’s advocate and look for counter examples.

Inherently we want to spend less time and get more done. When talking to people, it is important to deliver the message effectively while we still have the attention of the receiver.

On similar lines, what happens when you have a flaky alert which fires every hour without any required action? Since we asked for attention multiple times without any message, it desensitizes the receiver.

Asking for critical feedback is one part of getting feedback, taking it in an effective manner is totally different. Not getting defensive while getting feedback is crucial for getting honest feedback. This is where listening and probing is helpful.

One view point to help not getting defensive is, either we’ll know what we can improve on, or, we know there has been a gap in what we are doing and what it is perceived as.

I am a person who works on lists. There is a list for everything, I think and talk in lists, create dashboard for things, track things extensively. I try to build processes and follow them.

The lesson I learnt is, while it is important to stay organized, there is a cost to every process, which is easy to miss, and can outweigh advantages.

For example, creating one tracker for a project P and separate trackers for every milestone (Pm₀, Pm₁, …) might not be worth it for a 2 week project and might be as effective as creating one single tracker.

Have few but effective processes.

I learnt to make my meetings productive.

Every meeting has an agenda, maybe a doc which needs to be read before meeting and agenda reinforces that fact. This is especially important with a larger group of people.

Every recurring meeting has a success and failure criteria, if failure criterion is met, recurring meeting needs to be re-thought (less frequent or deleted).

The agenda needs to be pointed and focused, notice the difference:

It is easy to get comfortable with learning a few things that are needed for day to day work and not explore other tools/frameworks or skills.

I got this from my first manager, where I just explored tools for fun and it has helped me develop a basic understanding of a variety of them and hence come up with alternatives when designing a solution.

I have picked up new skills, mostly motivated by my colleagues. I went to the gym for a year, improved my diet, started reading books outside of the software domain, played pool, TT.

This helped in building a perspective about things, changed the way I look at things even in my day-to-day work and built relationships, which is personally very important to me.

Started valuing informal discussions. Whether on lunch table or over coffee, I ask people about the projects they are working on, the problem they are solving and share details of my project. These discussions led to really fresh ideas, which helped shape my projects.

While we all have our own preferences of viewing/doing things, sometimes, it’s just not worth debating over. For example, should an object in an interface be AutoValue or proto, is not something to discuss for a day or even mins.

Add a comment

Related posts:

Do Black Lives Matter to Christians?

There are moments in time that we don’t realize will go down in the history books. This is not one of those times. In that respect, it’s infuriating to see the lack of response from the Christian…

Earning Profit While Having Fun? hex.business Might be For You!

Are you still not experienced enough to find a platform that meets your expectations for a profit? Are you having difficulties in taking in all the information you can in order for you to invest in…