It’s not about just making it work, It’s about how long it stays.
When I started writing source code a few years back I had only one focus,get the shit done. After working on building multiple products and features, I realized there is more than getting it just to work and it’s more about how long it stays i.e maintainability. Being a front-end engineer, I have a great taste for user experience and I care a lot about the developer’s experience reading the source code I write, they should be able to understand code easily and should be able to add more functionality without my help.
Code is read more than it is written
There are 2 main things to take care while writing code.
Here are some of my tips for making source code live longer.
It hit me the other day that I've been working full-time remotely for more than a decade now. This is actually my 11th year! To those who are thinking of working remotely or perhaps those who are new to it, I thought I'd share some thoughts on how I've made it work...
People always comment to me that if they worked from home, they'd just watch TV all day and not get any work done. "How do you do it?" they ask. My answer: I get my work done because I actually like working. I like the people I work with and the job that I get to do, so I work just as hard (maybe even harder) because I want to do it.
If that seems too simple, it's because it is. If you struggle to be interested in your job while someone is watching over you in an office, how do you expect to do it when no one is watching you while at home? So, find a job that you enjoy doing. For those who think that there's no job they'd actually enjoy, then find a team that you enjoy working with. You'd be surprised how much work you'll do when people you like are counting on you to do it.
One of the best things about working from home is all the time I save because I don't have a commute. While most spend an hour+ in a car every morning, I get to sleep in... and I almost always do! This means I'm a little more rested before I start working. If you're the kind of person who would wake up early regardless of a commute, spend that extra time doing something fun: Catch up on a TV show. Go for a walk. Make a really delicious breakfast and then actually sit and enjoy it.
And remember: You also have free time at the end of your day while most are driving home!
"Try" being the operative word here because this is something I still struggle with. If I'm not careful, I'll often find myself staring at my computer screen all day in complete silence. This can make me feel tired even if I'm well rested, leading to lack of focus or slowed-down productivity. To help with this, I play music while I work. I prefer film scores or stuff without lyrics, which I play it at a low volume so it's just background noise-- similar to the buzz of co-worker conversations across an office. I also have a tv set up on my desk that plays movies on mute. I position the tv so it's in my periphery, which results in my brain constantly processing movement-- similar to co-workers walking by if I were in an actual office.
This is the main thing people struggle with when working remotely, and why it's the longest section of this post.
It's really easy to become isolated and feel lonely when you work remotely. Many combat this by joining a co-working space a few days a week, but for an introvert like me who actually enjoys being physically alone while I work (with the exception of my dog), what can I do? Well, I socialize virtually. Regularly and a lot.
My team and I are super active on Slack and talk just as much as we would if were sitting side-by-side in an office. Here's what I do personally to combat isolation:
At the start of my day: When I start my day, I say hello to my co-workers and ask how things have been going. This helps in a few ways:
Throughout the day: My team and I continue to chat through the entire day, including video chats.
We also let each other know when we're stepping away (if it's for more than just a coffee or bathroom break) and for about how long.
At any given time in the day, I know exactly what my teammates are working on, where they are, and how they feel. It's really tough to feel alone when you're genuinely connecting with people on a daily basis-- even if just virtually.
Now it's your turn: If you work remotely, what do you struggle with and how do you work through those things? Any tips you'd like to share? I'd love to hear about your own experiences!
I was an excellent performer in my 1st job and had all the perks of being one. After a few years, the work became monotonous. I felt I wasn’t learning or doing anything interesting. Decided it was time to change.
Fast forward to my 2nd job, I was an average performer unable to meet either mine or my teams expectations. I had difficulty in getting things done and felt left out.
On retrospect, it dawned on me that there has been a huge upward movement of the average bar. I found it extremely hard to face this new challenge. Whereas in my 1st job the work was the same everyday and soon it became boring.
When the goals we take upon is very high than our skill set, we enter into a state of anxiety and procrastination. We end up not doing it feeling depressed about our inability.
If the tasks we perform is limited in comparison to our skills, we feel boredom. Everything then just becomes a routine like brushing our teeth and we don’t enjoy it anymore.
For a person to perform efficiently, the challenges should be of sufficient complexity to evoke intrinsic interest and improve the skills but not too complex to discourage. Challenges we take upon and our skills should be in sync with each other.
Goals and skills are related together as reinforcing feedback loop. Increase in the challenge of our goal increases our skill which in turn allow us to face more challenges and so on.
Being a software engineer, I hardly have any physical work which made me weak so, 2015 I decided to join gym, for the almost entire year I didn’t join but I pushed myself to join the gym on 31st December 2015 :D
I didn’t really have a plan about my goal and I didn’t have experience working out. The people at the gym recommend me to for a personal trainer which was really expensive. For a week I workout without anyone’s help and soon I understood this is boring task and I won’t be able to continue this way which made me to go for a personal trainer. My trainer really helped me to understand the importance of exercise and I understood lots more about working out and building a healthy lifestyle. He helped for 9 months and I feel this is the most valuable thing I have ever done in my life.
After working out for 6 months I became stronger, healthier and happier. I Understood more about my body, my posture problems and had a better understanding what I wanted. I started giving more importance to my diet. After almost a year, working out became my routine and missing it a day made me gloomy for the complete day and it even effect my sleep. Now I enjoy working out and made it my habit.
I hardly remember the memories that happened during my school/college days, I used to ask my friends how do they remember what happened 10 years ago? and this is one of my weakness. Being a software engineer I write lots of code and I won’t be able to remember why I wrote a piece of code. So I force myself to write code which anyone can understand easily and I make my commits as small as possible so that I will have a better understanding why did something.
I am very lazy or its better name would be clever, I try to use the easiest way out. The only subject I liked in school was math because the only thing that matter in the exam is the final result. Being so lazy, I hate repetitive even if its typing 1 word more every time. I use lots of aliases to help me being lazy/clever.
Being lazy made me more organized, One example is, I hang all my cloths and arrange it so every morning I don’t have to think what I should wear, I just wear which ever is the first one.
As most of you know, today is my last day at Recruiterbox.
It has been an incredible experience here; I sincerely feel that working here has made me a better person overall. Joining Rbox is undoubtedly the best decision that I have made so far in my career.
I will really miss you guys.
I wish you all the best for the future, and I hope you guys achieve everything you set your eyes on.
Bye, and thanks for the memories!
For the last month the administering Rbox team has been working hard on api v2 and I felt it is now a good time to share what we have achieved.
Today in Recruiterbox we have the following versions of the api
Some of the problems with the above approach
It is desirable to have a single canonical api for recruiterbox that both our app as well as customers use. This means that you add new features and fix bugs in one place.
Today api v1 has over a hundred endpoints. This is hard to grok for even devs inside Recruiterbox, let only external customers. We need to have a small api surface area and a consistent api, so that is easier for devs to start with and work with. React.js is a very good example of it.
The goal is to totally take out api v1 and have our app use api v2. If an app as complex uses the api, then a lot of our customers can as well. The trick however is to keep the design generic enough and not couple it how our app does certain things. This means we need to have routine discussions on the design of the API.
The admin team has already built a few basic endpoints as a first cut. The idea is that if we build anything new, we should use ApiV2. This isn't as easy as it sounds because you may be enhancing a feature that already has an api, rewriting the api layer can add a lot to your delivery times. This a call that every team needs to take after discussing it with other teams and the admin team. Bigger features like for example the candidate profile page redesign will make sure that we use the new APIs. It has become easier to write and modify the api because of the changes in RIP.
RIP had a few rough edges and issues and it was hard to write resources. The admin team has refactored RIP and fixed the following issues
When we want to present what we are working on -
We typically present a list.
I am working on
Painting the car
Organizing the dashboard
Cleaning the boot
Changing the oil.
We do this is many places.
When asked - Why is your product better? - Out comes, a feature list.
When asked - What is the benefit of a process? - Out comes, a list of benefits.
When asked - How are you solving a problem? - Out comes, a list of items.
When asked - What does your NGO do? - Out comes, a list of activities.
The problem with lists are -
* They are hard to remember
* They are unexciting
* Hard to build on
* Very boring
It does not help that "To do" apps focus on lists.
It does not help that finally we have a bunch of activities to do.
Instead try to build and tell a story.
Stories excite everyone.
Stories are easy to present.
Stories are easy to remember.
"I will be driving my car on a cool trip - Visit places mentioned in this historical novel. So getting my car ready for it."
We have been tuned (evolution) to relate to stories.
"My very educated mother just served us nine pizzas" (or some variation if it).
So when someone asks
"What do .."?
Try starting with
"Once upon a time .."
"Should I put 4 cups rice and 1 cup daal?" - Me
"No. Why do we need so much? We are only 4 people" - Renuka
"But we always use that measurement" - Me
"Come on. We need it for 2 days of Dosa and idlis" - Me
"Oh. I thought you were asking measurements for the Khichdi" - Renuka
"Oh ok" - Me
When we communicate - we make lots of assumptions.
We think what we ask is what the other hears.
We think what we intend is what the other intends.
It is easy to start with wrong assumptions.
It is simple to correct.
Verify your assumptions.
If you are not sure - Ask.
If you are sure - Ask.
If you are really sure - Ask.
A dear friend of mine used to have a saying about assumptions.
It goes something like,
"Assumption is the mother of all fuckups"
"But I guess this time - It is ok. You are not well and It is hard to manage her" - Rajesh
"No" - Renuka
It is easy to explain away the deviation from the principles during difficult circumstances.
"I will skip the code review this time because ..."
"I will respond to customer late because ..."
"I will push my agenda this time because ..."
"I will pay bribe to get this done this time because ..."
"I will test this later at this time because ..."
The "cause" may be genuine.
The deviation may be warranted.
Either you stand for a principle or you do not.
There is no "but this time".
It is OK to decide that you do not agree or stand for a principle.
It is NOT ok to have deviations once you decide to stand for it.
That leads to
above all - "Broken trust"
Below passage was given to me by one of my mentors when I was feeling very down about my volunteer work, where I was receiving a lot of criticism for the work I was doing. He mentioned that 'what you are doing is very rare, try to get more people like this to do' and gave this passage which was spoken by Theodore Roosevelt. Nelson Mandela was also inspired by this and gave it to his national sports teams.
It is not the critic who counts;
not the person who points out how the strong person stumbles,
or where the doer of deeds could have done them better.
The credit belongs to the person who is actually in the arena,
whose face is marred by dust and sweat and blood;
who strives valiantly; who errs,
who comes short again and again,
because there is no effort without error and shortcoming;
but who does actually strive to do the deeds;
who knows great enthusiasms, the great devotions;
who spend themselves in a worthy cause;
who at the best knows in the end the triumph of high achievement,
and who at the worst,
if they fail, at least fail while daring greatly,
so that their place shall never be with those cold and timid souls who neither know victory nor defeat.
"Why do you go to work, why not mama"? Titli
"Some answer .."
"For a restaurant it is good if they turn tables fast in a evening" - Rajesh
"What is 'turning tables'" - Girish
"Why is it good?" - Girish
"Is it true for all restaurants?" - Girish
Here lies the answer for the "Creator's curse".
When a question is asked about a thing that we have created mostly we do NOT hear the question being asked.
We hear it as "blah blah? You have not considered it? I just found that gap. What the heck you were thinking?"
or some variation of it.
If you have an inherent curious nature - You will probe more.
You will ask questions to understand more.
You will try to understand.
But that is hard.
Our instinct plays it part esp. when we are presenting to audience.
It make us defensive.
So here is a simple trick.
Always have a note book and pen when you are presenting.
When someone asks a question - Write it down.
(This helps to increase your response time. It cuts your instinct to add unnecessary addition to the actual question being asked. It helps to get clarity about the question. )
If you are not able to note it down clearly ask only questions that help you to note it down well.
Repeat the noted question to the person who asked it.
Thank the person.
Follow up later (if that is possible else respond now).
I am going to call it "Child like curiosity". (for obvious reasons)
Either have it.
or fake it.
It is a perfect Anti- Dote.
A recent post about - 'how wrong our instincts can be!' triggered some thought process.
I always wondered -
If eating healthy food is good, why do we get attracted (most of us) to sugar and fatty foods?
If exercising is good, why we have to discipline ourselves to do it regularly?
If learning is good, why do we have heated arguments with others who have different point of views?
If evolution works the way we think it does then, given the above - Why is our gut/instinctual reaction wrong?
We should be enjoying eating healthy food.
We should be exercising for pleasure.
We would be naturally curious.
Then a realization stuck me.
Our current level of abundance (in terms of food), freedom ( in terms of time), interaction action (with others) are a very recent phenomenon. Probably the last 100 years have changed these so much that our instincts that developed over millennia is yet to adapt to it.
Instinct for eating foods high on sugar and fat developed when they were scarce and body wants to consume and hoard as much as possible.
Instinct of intense physical activity is primarily oriented towards getting food. it is primed to NOT perform other activities. You have to be physically fit and able to use your body to hunt else you go hungry.
Instinct of defense developed to survive "Death by curiosity" or "Dissidence".
Our instincts are highly developed and good.
Just that it is a like "Gladiator" surviving in the modern civilization.
They do not fit in with the existing environment.
We have to control our instincts and work to get it right in the new environment.
That is why,
It is hard.
This thoughts reminded me of Robot_AL-76_Goes_Astray - A fascinating (little) story of a lost robot who was designed for working in the moon but lands in rural Virginia. Check it out if you are a fan of Asimov in the "The Rest of the Robots"
"Have you considered this scenario while ... ?" - X
"Do you think that is how a person will think ...?" - Y
"This seems to be confusing when I click ...?" - Z
It is surprising how quick the inputs flow through from people who are looking at anything you built (UI/UX, Product, Code, Business plan, Startup idea ...) for the first time.
Our first reaction is
"I have spent hours thinking about it. I have a good reason why the thing I built is like this. Do you think I am stupid. Here is the explanation for ...."
We are cursed to be blind - Being the creator of the thing, we are very deeply aligned with what has been created. We become blind to its short comings.
A simple test:
When someone presents you the outcome of their work - count the number of gaps/challenges you see in the output, without thinking a lot.
Take any of your finished work - see if you can match or beat the above number in the same amount of time.
You will know if you are cursed.
There is a simple and effective way to workaround this (not sure if it can be avoided) - In the next post.
There seems to be another definition already for Creator's curse. But I could not come up with a better name for the phenomenon I described.
"Are you not bathing today?" - Renuka
I get irritated.
"Why are you not asking 'When are you not bathing today?'?" - I retort (with a raised voice).
"That's what I asked" - Renuka
When I hear the question, there is a narration in my head.
It is based on my background (combination of ethnic, cultural, beliefs).
I was brought up as an equivalent of a "TamBhram - Iyer".
Only "brushing teeth" was allowed without bathing.
Bathing is the first (may be 3rd if counted accurately) thing we do in a day.
So what I hear when the question is asked as
"Are you not bathing today?"
"It is way past bathing time. You have not shown any inclination to take bath and are performing activities that should not be performed without bathing. Are you going to continue with this?"
We think what we ask is what the other person hears.
Not necessarily true.
We all have a narration in our head that interprets what's being said.
What you ask is "Have you considered simplifying the options, this seems complex?". What the other hears is "You seemed to have come up with a complex option. Why can't you come up with a simple one?"
What you ask is "Do you need help to have clarity on what and how you are going to do things?". What the other hears is "Hey! I think things are not being planned well. I want to know what and how you are planning to do things."
* When asking - be sensitive to the narration in the other persons head. If it triggers behaviour you do not expect probably what you asked is not what he hears.
* When responding - clarify the story in your head. What you hear is not probably what the other person asked.
It will make work and personal life simple.
"Interface" is an interesting concept of Object Oriented Programming.
I am fascinated by the 2 (the ones that I like most) important tenets of an interface:
* Interface exposes the behaviour i.e. what is expected out of the function call if you pass the defined parameters? It does not expose the implementation. In Fact it is designed to abstract the implementation. It is a contract with the external world.
* Interface enforces the implementer to think through contract of the exposed functions and handle them well. It ensures that whoever implements it, need not reinvent the contract everytime. Removes the communication overhead that comes with change of contracts.
As Recruiterbox is growing and more people have started contributing at various levels, the 2 tenets are helping me to think about how I can work well with them.
* I am treating each function (engineering, ops, product, design, marketing, sales) as an interface. I know exactly what every function is expected to do - "Defined by outcomes". But I do not have to worry about how it is done (curiosity may still exist).
* Within each function, the team understands the promised outcome and designs ways of achieving the outcomes. There is a conscious evaluation of the contract and implementation that works well for that team's current strength. This is defined by the "Rituals" (I prefer this term over process - details in another post) followed by the function.
Reference : What is Interface? - http://stackoverflow.com/questions/3355408/explaining-interfaces-to-students
While visiting other countries I noticed that many of these countries had some form of citizen duty. There was jury duty, military duty, even precise waste segregation and proper disposal is a duty. Before leaving out of India I have not heard about this, where citizens are supposed to do their part. I feel we are the most pampered citizens in this world. In these countries it was not just limited to country duty, people were signing up for a lot of things which I usually have not observed at home. At one of the startups I was having an assignment, the CEO and his family dusted and mopped the company in the weekends while I was leaving my used cups on the table. This visit changed me, I made it a point to never litter even though there is someone employed to clean it up later.
Recruiterbox is unique, it was very evident for the office move. Apart from the core team there were many who reached out asking how can they help. There were a lot of people helping over the weekend with whatever task they can do including cleaning the desks, fixing network, buying food for others, running errands all in the middle of that dust, paint smell and long hours of standing. I have been part of office moves in other places, people usually wait for someone else to ask volunteers. Most of the office moves, people just stepped out of the old office and the next working day came down to the new one unlike us. This is what will make us stand out when we go behind our business goals as well.
When I chose my specialization in undergrad (Engineering) - The following was my thought process:
"Mechanical engineering is an evolved subject. Everything has a reference book (strength of materials, ratios to be followed for design etc).
Computer science is still evolving. New languages come every 2 years - Java had just been out. How long you will have to keep learning new things?
So - Mechanical it is."
Life laughs with ironies.
Though relatively young, it is amazing to see the number of paradigms that are evolving in computing science.
One that has created profound influence is - The free and open source software.
Professionals (who are really accomplished) - write free code for others to use.
From small libraries to operating systems there are tons of free (with source) stuff available.
Newbies can learn from it.
Good ones can contribute to it.
Others can use it.
As a amateur in some fields - Food production, Earth based construction, Design - I find the lack of equivalent of "free open source content" are not present.
Does this reflect on the professionals?
or the profession?
Abstraction and compression are used interchangeably. What is the difference?
In a restaurant setting the restaurant manager or waiter has to deal with abstractions on how a food is cooked, presented to the customer. All they need to know is how long dishes take to make, how much does it cost and is it doable on that particular day. The kitchen is a black box for these people, they place the order and expect an output, some times even if it is doable or not. It is not that the manager and waiter are not capable of understanding what is going on inside the kitchen, it is just not judicious of their mind space.
Inside the kitchen abstractions are not productive. Each person needs to know what the other person is doing and they will use compressed language. For example, lime juice marination means the exact same way the marinade is prepared as the chef intended and the cook does exactly that. If there is a change they discuss the details. It is the process and the outcome together.
In software development business works with the engineers in abstract terms. It is a black box for them. Engineers work within themselves using compressed terms, each one knows the exact steps that will be taken by the others. From the outside both looks like abstraction, it is not.
"We should always heat the older packet before opening the new one" - Renuka
"Yes I agree. The way to do it is, by ensuring the oldest packet is in the front. We have to ensure that" - Me
"But why don't you check the dates before heating the milk? It is possible that we may forget to put it in the front"
"How can we forget if we agree that is what we will do? It is waste of time and mindspace (hmm Rbox effect), if I have to check it every time. It is a very simple rule to follow"
"But it can ..."
"No. I Guess then you are ..."
We DID agree on the intended outcome.
What we did NOT agree about was "How to get it?".
It happens a lot.
As long as we agree on the outcomes, leave the "How?" to the person who manages it.
Discussing 'how' leads to discussing unintended 'whats', 'whys' and 'hows'.
If you feel strongly about the "How?" then may be you should own it or talk about it later.
* We buy unpasteurized organic milk. It has a shelf life (in refrigerator) of 2 days. The supply can be erratic and so we maintain one day inventory. This milk has to be be heated (boiled) before consumption.
* Being the early riser, I put the milk packets in the refrigerator - Oldest in the front and the last in the back. When I heat the milk, I just pick up the front most packets. When Renuka heats the milk, she checks the dates :-).