How to lose trust and alienate your email subscribers.
I am very trigger happy when it comes to hitting the spam button in my mailbox. The moment I even have the smallest suspicion that you are spamming me, off you go to the spam folder - never to be seen again. This is not because of a need for 100% control (Well maybe a little bit), its probably the only thing that keeps my mailbox and me sane.
So why am I writing this:
Already mails from google / facebook / linkedin / many shopping sites like newegg etc. go to the spam folder directly. I used to have twitter and Amazon alone in my mailbox as corporate mails - because they had actual value prop: Amazon locals told me about wonderful deals, and twitter used to mail me only when I get a new follower. This changed last week.
Twitter has recently started sending mails like “Alexis Ohanian, Jeff Atwood have tweets for you!”. I was fooled the first time and when I checked Obviously they were regular tweets from them - nothing special for me. Fool me once, shame on you. You are not fooling me twice. So there twitches the spam-killer click - for me to see twitter mails no more! Good job twitter - you just stopped being interesting enough.
What I will be looking for when I interview you?
I have done over 100 interviews for Amazon, without counting most of the college recruitment drives - if included, probably around 200. Before that I have done 200+ interviews on behalf of Microsoft. My stats: I have marked about 5% of my interviewees as great hires, 2% or so as good hires.
In both Amazon and Microsoft, the hiring is done by a group of people instead of a single interviewer - to ensure one bad hour doesn’t make the company lose out on the talent. This also means I have had some of the folks I marked for hire not getting hired, and some who didn’t clear my round with flying colors indeed get hired. But all decisions usually happen in a group - and this is where we usually re-calibrate our interview process.
Amazon Web Services is hiring!
AWS is hiring big time! If you are in US - you can get a chance to work in our Seattle offices with the best and brightest on the coolest of tech. If you are outside US and are willing to relocate to Canada, we have a swanky office coming up in Vancouver! Drop me a message or comment if you are interested!
In most of the interviews, the table almost feels tilted in favor of the interviewer. After all, he is setting the tone of the conversation and taking it where he wants to. The reality couldn’t be far from the truth though: the interviewers are actually looking to hire you. As I had blogged before, right now - the market is booming, and companies are fighting to get the best folks in their fold. If you are unlucky, you can indeed run into one of the bad apples, but those are very few in number and don’t last long. Anyone who is out to prove a point is usually weeded out early or they tend to learn / adapt with time.
Interviewing is actually quite daunting if you think about it.
- You start wondering what gives you a right to judge someone else.
- You hope that this power doesn’t corrupt.
- You hope you remain fair even on your worst days.
- You evaluate everyone of your decisions to ensure that your personal biases didn’t affect the decision.
- You also hope that you do not over compensate and burn the candidate if you happen to admire any of her/his traits.
- Above all, you really hope that the candidate will validate your decision after you make it. You don’t want to be the one who didn’t hire someone great (What would you do if he turns out to be a super star in your competitor’s team?).
- Even worse, you don’t want to be the one who hired guys who destroy the organization.
Why this blog?
I have been debating for a long time on how we do interviews. The worst part of all is the secrecy surrounding the whole process: If a guy can really game a whole interview loop because he comes prepared, isn’t that a credit in itself?
And all the secrecy isn’t even worth it - the guys who do their homework indeed know of sites like http://www.careercup.com/ where they can find almost all the questions asked in a regular Amazon interview!
As an interviewer, you really have to revisit your process if you don’t have a fall back option if you figure out that the candidate knows about your question/program. With a little bit of homework and sites like http://uva.onlinejudge.org/, you can indeed find a list of interesting problems to solve and discuss with candidates.
So let me take the first step here: I am going to publish what I look for in an interview. If as a candidate you have employed your google-fu and already read this blog, more power to you! You are in a way making my job easier and more enjoyable!
1. Your resume
The interview process begins much before we actually meet. I get an invitation from my recruiter at least a couple of weeks in advance, and I do look at resumes to figure common areas of interest to discuss about.
Your resume should ideally tell me about what you have done, what you have learnt and what you are proud of. A link to your online presence is a huge plus: You would be amazed how many people are surprised by this. Come on - we are an internet company.
So bust out your stack overflow profiles, git hub developer URLs, published papers or even your twitter account if you have been tweeting about software industry consistently! If you have worked on any OSS - that almost finishes the interview right there. Most of the time I am assigned for technical knowledge rounds, and almost all my answers will be there in your code.
NOTE1: I do check the licenses before looking at any public code. So if you are writing under any license that affects commercial usage / reading of the code (GPLv3?), I am not going to read it. If you really own that code, please do host it in a free public repository with a less restrictive license. I like to keep my job :)
NOTE2: I don’t look at patent website links for the same reason.
NOTE3: You could make a real fancy resume, but sadly I am not going to be able to see it in all its glory. Most of the big companies take only the text from it and put it in a text box - so in fact, if your resume uses fancy formatting / multiple columns - you could end up with a sorry state of affairs.
Make your resumes plain text friendly.
2. The first impressions
I frankly don’t care about how you look/dress. I myself interviewed with amazon in jeans and tennis shoes. But I do like people who show a real interest in the company and a smile wouldn’t hurt.
3. The questions you ask
After settling down, I usually launch into a small story about what Amazon does, what AWS does, what DynamoDB does and what I do. Then I will give you a chance to tell me about something you are proud of, and ask me any questions you have about what I just spoke. This is your first chance to verbally impress me: If you have read about DynamoDB, you know a ton about Amazon businesses we are off to a good start. As I said before,
I am a sucker for people who have done their homework.
I also look for your personal ownership when you talk about your project: Claiming to have worked for the International Space Station team is indeed fascinating, but I am looking for your contributions to it.
Sell yourself in an interview, not your previous company / team. A tag like “I was with Microsoft” goes only so far in an interview.
4. The actual interview
I usually split my interview into multiple parts:
- A basic coding question tuned to your experience. I am not going to insult a 20 year veteran by asking him to reverse a linked list, but I am not going to tax a very new candidate by asking him to build a concurrent btree either.
A sample question: Find all the anagrams in a given list of words.
Almost 80% of my interviews are over at this point. The number of candidates who hope to ace an Amazon/MS SDE interview by just showing up without having coded ever in the past 5 years is mind boggling.
- Part 2: If its an entry level position, A reasonable question that will test your programming skills / knowledge of data structures, algorithms, patterns etc.
A good coding style, checking for boundary cases, providing enough test cases are all huge bonuses. The question is most probably going to be vague or high level as well - so I expect reasonable clarification questions. As in the real world making assumptions without valid reasons is bad. Don’t forget to let me know all your assumptions either.
The question is probably going to have multiple answers too. A brute force one, A smart one and the most elegant one. I don’t expect the best answer every time, but someone who does it will get extra cred. Sometimes I will have an extra twist that I can add to the questions optionally, to give me a better picture.
- If you are a senior candidate, I am going to push for the better answer as well. This will tell me whether you are able to take a step back and analyze your answer or if you get stuck in one solution.
A sample question: A cobbler takes up fixed pay jobs with a clause that he will pay 1 cent fine per day of delay. You are given a list of possible jobs and the number of days required for them. Order the jobs in a way that he will make the most money. Twist: How would you change it if each job pays different?
- In case of senior candidates, I might be doing a design round instead of coding - so I will ask you to design a solution to a very big problem. I am not looking for the exact solution, but your approach, and whether you think about all the related issues like scaling/security/throughput/operational pain etc.
A sample question: Design a system to page service owners when their service has an issue / outage.
Depending on various factors like where I am with my verdict, I will be asking the candidate to code up either of the questions in a piece of paper. In this,
I will look for good coding patterns and organization. I don’t care for syntax / language / hand writing.
I might also give an existing code base and ask you to do a code review, If I have a good sense of your coding from the above or your online presence.
If this is a phone interview, I will ask the candidate to code/review offline and send it over to me by email. In that case, I will be expecting some unit tests and generally extra care in the code since I am assuming you have IDE/debugger/internet support.
Treat offline interview questions like a mini project.
5. General pointers I look for.
I try to stay on the technical side because that is where I am most comfortable at. So I don’t do behavioral tests etc. The only extra thing I look for is integrity. Tell me if you have seen the problem already / read my blog and you score extra!
That’s all! You are hired!
My interview preparation checklist
Preparing for an interview is a long process for me - Here is a checklist I use to ensure I feel prepared.
- Algorithms / Data Structures refresher. Either books like Data Structures and Algorithms and Introduction to Algorithms or wikipedia would do.
- Design patterns - Head First Design Patterns is awesome.
- Industry relevant reading. If you want to work on DynamoDB Transaction Processing: Concepts and Techniques (The Morgan Kaufmann Series in Data Management Systems) is a great start.
- General preparation for process related questions.
- Refresher of all the work I have done and quoted in my resume.
- Set up references. A reference from a noted luminary is a great start!
The whole process took me about a month the both times I interviewed. Also, general reading of books like The Pragmatic Programmer: From Journeyman to Master and great websites like http://www.codinghorror.com/blog/ help a ton in the non-technical rounds. It doesn’t hurt to be over prepared! Good luck!
The art of debugging or Why schedules are only theoretical.
How do you arrive at a schedule for a small piece of work? Do you include only the coding time?
- What about design time / time spent talking to the customers / product management to ensure you are in the same page?
- What about unit tests?
- Code review time? How do you plan for code review delays from others? (I still have a 2000 line change that is pending on code review from the past 3 months, because of various priority issues).
- Checkin, Integration and reverse integration time?
- Build time in each branch?
- Dependency change management?
- Deployment to test environments?
- How about integration testing?
- How about prod deployment?
- What if the prod deployment happens in batches in your team?
- How about your desktop going bust and you having to restart?
- How about the context switch time if you were dragged away in between for something else?
- How about you discovering a nasty side-effect in one of these stages or worse in production - do you account for that too?
As human beings we are harshly quick judges and we linger on to those judgments for long indeed.
“Oh John finishes everything in half the time he estimates, On the other hand multiply any estimate from Pat by 5”.
What if Pat works on Windows Kernel while John writes Visual basic front ends for a 20 year old software which has only one customer?
I have a theory.
Time to do ship a change is directly proportional to the impact (not size) of your change * size of your project * complexity of your project.
You can use a ton of “Software engineering” ways to do it - but in reality, it is an arcane art. There is no telling when an expected change will be actually done from the perspective of everyone involved. Many engineers and even companies get by with an old trick: Every issue is a new work item. This is primarily why people who deliver often and on time are revered more in the industry.
I came up with that big rant, because of the current problem I am working on.
I have a Java layer that calls into C++ via JNI (horror!). I have also hoped to complete this by end of week so that I can move on to other hairier issues next week, and hence the estimate connection.
JNI comes with its own set of wacko rules around local references / global references and there is a limit on number of these local references you have. If you cross the count, the VM is going to croak differently on different architectures, and not immediately either - it does so at a later point of time when it feels like it.
The global references story is even more wicked - because people usually store these in static variables in C/C++. As you might know, the static variables in C/C++ get initialized on the first pass and there is no way to force a re-init. There is no way to know ALL the static locals in the program you reference either, essentially meaning any kind of reinit code you write is going to be really fragile and spread out across many functions. Add all that into a big project like the one I am in, you are headed for a world of pain.
I have 2 planned days left in this sprint and the code is complete per se - albeit for some funky unit test failures. I need to complete most of the above laundry list which by now looks impossible unless I put some serious muscle into this. Nothing depresses me more than a looming deadline that looks ripe to be missed.
Thankfully there is no other person immediately pending on this, else the depression would be manic.
The problem and symptoms
I have a set of unit tests that run fine when ran individually. They also run fine in particular groups. But whenever I added one particular test class (Let’s call it X) to the suite, Java exits with a SIGSEGV. Of course, The helpful VM dump does very little other than taking up disk space.
On to debugging
Thankfully the error was perfectly repro-able. Sporadic issues make me want to curl up into a ball in a dark room. It is a sad situation that in our age of GHz speeds and TB spaces, we still can’t catch all pertinent information in Real Time somewhere for later analysis.
Step 1 (Or how I spend most of my time staring at repeats after repeats)
We have to find out what is special about this test and where exactly it is failing. With a lot of run throughs, funky break points and a gallon of coffee, I figure this happens every time an exception is thrown from the native code.
Step 2 (Or how I should have been a better student in college)
On to reading up about JNI and how this exchange happens. This is when you see some code in C++ that boggles a regular Java programmers mind:
How the hell do you reach the delete code? Then you figure that the Throw() in C++ is more like a subtle hint rather than a scream for mommy scenario in Java. Oh well.
Step 3 (Or how I suck at reading 500 pages of docs)
This is where you can perilously go off track - it requires you to read up EVERYTHING about JNI / reference handling I talked about before - meaning a ton of time investment and more caffiene.
Step 4: (Or how I should have known better than to skim through code)
Programming in Java has mellowed me up. I tend to skim through a lot of code instead of ensuring I get every line. This has tripped me up in the past when dealing with C/C++/ASM - but looks like I have not learnt the lesson.
I did the same mistake with my native code - so got into a bit of code tweaking without realizing the “static ness” of some variables and their implications / initialization semantics. By now my body is realizing that I have been tricking it into performing at very high concentration levels for a very long period of time and is making me glitch.
Step 5: A refreshing bike ride home. (Or how focusing on a mundane task helps my brain process the backlog information)
You might have read my commute saga - what I forgot to mention there is how it keeps me sane. When I feel like I have backlogged all the queues to my brain - I tend to get up and get out.
Step 6 (Or the dodgy underbelly of Java testing / debugging)
This issue doesn’t recur if I run the tests from ANT - because obviously eclipse and ANT have different opinions about the order in which they have to execute tests - how else would you ensure those over-paid programmers earn their bread? Now I could take a segue and try and fix ANT test run order, but thankfully the sane man in me pushed it to the backlog. So now the tests have to be run from inside eclipse.
Step 7 (Or why I sometimes wish I was back in windows world).
When you run into corner cases like mixed mode debugging, that is when you realize how much better VS is than eclipse / the whole Linux dev environment. Because - obviously there is no way to allow debugging JNI directly from eclipse. No can do. So this makes debugging JNI is scratch your eyes out kind of pain and you need gdb. But wait - GDB cannot native java debugging gracefully either - so you need your eclipse to handle the java part! Weeee!
Step 8 (Actual debugging)
Finally, I setup with eclipse, get gdb to connect in - ensure it has its break points and then release it for running from eclipse. Hey - what was that weird signal that just landed? Oh yes eclipse also handles its breakpoints etc. in signals - meaning if you have any runaway breakpoints in eclipse and try to debug in gdb at the same time - now you have two problems.
Some people, when confronted with a problem, think “I know, I’ll use regular expressions.” Now they have two problems.
http://www.jwz.org/ (Cool website - check it out!)
You could add a Thread sleep in your java program, just run the units from eclipse and connect from GDB, but this means a 30 second delay every time. Nothing like staring at your screen for 30 seconds hoping for it to come back to life - gives you great nostalgic feelings about Windows 3.1.
Somewhere around here at mid night - I fall asleep.
My internal alarm goes off promptly at 5:30 AM next day morning and back on the buggy train!
Step 9 (The grind)
From gdb, I see that JNIEnv::NewObject is failing. Now I wonder whether we have run out of local reference space or is this something even more sinister. Obviously the VM doesn’t tell you why it is calling “report_and_die” and getting JVM symbols to step through JVM is another 200 step process. The rabbit hole only gets deeper.
Step 10 Or the ray of hope
I figure out that there is a way to reserve extra local ref space - so to weed that line of reasoning out, I go ahead and reserve a ton of space and re run the debug setup.
This is a classic win-win scenario if there one ever was in debugging: If the program runs fine, you have one less thing to worry about. If it fails, you have actually solved the problem.
The program ran fine.
Step 11 Or the Aha moment
There is no issue with the JNI code per se - everything checks out. This means the NewObject call is failing because the class load result is somehow getting destroyed. And for some reason, the VM is fine with this memory corruption the first 5 times it hits it. The 6th time is the devil apparently - and it HAS to SIGSEGV there. And they tell us computers are predictable.
Step 10 Or taking a step back
I realize that the local variables holding the Global references are static and I also hold the global references in a vector. This vector gets destroyed every time someone calls cleanup. So back to looking at why this vector is getting destroyed. Some more breakpointing tells you we are indeed calling the Cleanup code after every test class is done executing!
But oh no - I based the test class religiously after the answer found in the mecca of software engineers!
If you create a @BeforeClass / @AfterClass on a base Junit test class, and derive your tests from here - the after code will get executed only after ALL your tests have executed!
No Sir! It gets executed after EVERY test class. Logical my ass.
Step 13 The aftermath
By now it is 8 pm, and the saga has been going on for two days. I finally know how to fix this. So I make the fix. A timid climax to a 2 day romp! Now my units pass gracefully - I am back to digging my backlog.
This is the part where I feel grateful to work for an understanding manager - who has actually developed software instead of just having opinions about it. He feels my pain and gives a knowing nod instead of a judgmental stare when I tell him I might miss this sprint plan by a couple of days.
I also added a small note to the above stack exchange site on a 3 year old answer hoping it will save another soul some of the pain.
The nihilist in me tells that he will see this only too late.
How to choose a team / company?
Software industry is booming - there is no doubt about it. You might have read about the recent Splunk splash - a non-social, tech oriented company getting a $3 billion evaluation on the first day can never happen in a bear market. Splunk CEO Sullivan says,
In addition to hiring an additional 200 engineers (which Sullivan says is harder than ever in Silicon Valley), the CEO says the company is working on building up its technology portfolio
A quick plug
AWS is hiring - we have a swanky new office coming up in Vancouver and we have a lot of openings in Seattle too! Message me with your resume if you are looking to work at the cutting edge of cloud computing!
All this means it is a programmer’s market. Over the years, few questions arise repeatedly.
- How do I choose one company over other?
- Amazon or FB or Google or MS or Twitter ?
- LinkedIn or Netflix?
- Why did you choose Amazon?
- Why did you move from Microsoft to Amazon Kindle and Why move again to AWS DynamoDB?
Sadly, the answer to the generic questions is the classic - It depends. But I do have a few tenets that I used to plan my career path.
#1. What do I really want now? Do I want more money or more experience?
If you choose experience - all power to you. So many avenues - even non corporate ones are open for you. But if money indeed is a concern, you should consider this. though money is necessary to take care of your life / family / gadget needs, once you reach a certain point, the value of small increments are practically nothing. IMO the graph looks somewhat like this.
<Sorry for the crappy x axis - this was the best the software can do and I don’t have access to excel on my home pc>
Here I have mapped various milestone points (y-axis) in relation to of income (x-axis).
- Rented home, Single life, commute by bus.
- Married life, car, future planning
- Kid, Own House, May be second car
- Your million dollar home, real investment or retirement potential.
- Studies indicate people start to feel rich only around here - first class travel / Yachts etc.
- Chartered Jet!
- Really rich - not much you can do with 2 billion that you can do with 1 billion
- Top richest folks in the world - if you fancy yourself to be the next zuckerberg.
Obviously these are approximate, and YMMV. The plateaus are the positions where you might choose a 64-GB iPad over a Kindle Fire, or a ZL1 over 2SS but the differences are going to be minimal / cosmetic.
For what it is worth, I didn’t plan my life exactly considering my child was born when I was 24 and the money I was making was no where close to the estimates in that graph:). Having said that - this kind of defines my thought process when I am thinking about raises etc. Unless it is going to bump me up a level, it really doesn’t matter. I know my current level in this and the target level I want to be (not what I dream to be, but where I realistically want to be). Once you take money out of the equation, the problem becomes a lot simpler.
#2. Is the project you are going to be working on challenging enough?
Do you see your project making a chronic github pusher out of a 501 guy? Do you see a future for your project?
This is something that gets neglected way too often in comparison with #1 above or other reasons, but unless you are fully and emotionally invested to your project, you won’t be able to find satisfaction / growth there.
#3. Do you like the people and place? Does your family like the place?
Again - another decider that brings forth the cynic in you. Yes you might move to Seattle from sunny California because Microsoft offered you $1 million stock, but if you can’t take rain and clouds, you are gonna have a bad time. Same way, If your colleagues don’t match your bandwidth, it is not going to work out. If your wife doesn’t take well to the new place, you are probably going back.
#4. What is your best operating mode and risk potential?
I have seen people who survive best in a sprint environment. I know some great people who disappear for 3-6 months at a time and come out with mind boggling amount of code. I know dare devils who live on the edge. I know the marathoners who can push one more 80 hour week, always. I know ideators/dreamers responsible for some great products. I know executors who don’t stop until the code is in. I know delivery specialists who have great knowledge in what to ship and what to cut. I know motivators who have made mediocre teams great.
Once you have a decision on the above four tenets, the choice becomes very straightforward from there on. My choices have been mostly shaped by my desire for learning more, continuous delivery and love for mentoring/motivation.
Amazon fits the bill perfectly in this case. I work in one of the best and senior most teams in Amazon, I get to work on databases which are very close to my heart - the pace is furious - what not to like?
Full time startups are a hard thing for a guy with a new family - so for now that is not on the cards either (I am always open for weekend code4fun though!).
Finally, I am in one of the plateau’s in the above money graph right now. Unless someone is going to offer me enough money to help me jump a level or two in my money graph - There is just not enough value in moving.
So there! Enough about me - how did you decide? Feel free to add your comments below!
The length of the line at your door is directly proportional to your value to the team.
Are you looking for a project to do? #1
I tend to keep cooking up new projects to do - but I never get around to actually doing them, because I am off to dreaming up the next one. As they say - ideas are dime a dozen - we need executors! So if you are looking for ideas to work on, you are in the right place.
This is a real problem - and a real solution, with no equivalent solution out there in the market. I guess I will never get around to doing it so adding it here - go ahead and make it into a product! (feel free give me a cut please:)
Problem: How to make scrum planning meetings more efficient?
Usually scrum planning meetings of any decent sized teams take away half a day or so. This means team size * 0.5 days lost just in this. I would be ok with that if everyone had opinion / interest on every user story, but that is never the case. This leads to people just sitting and working on their computer when the meeting is going on and perking up only when their issue comes up.
I have also seen draconic scrum masters banning laptops in these meetings, meaning people sit there day dreaming instead - which is an even bigger waste of time.
The worst is when the most talkative of folks distract every agenda - not out of malice, but just because they have an opinion.
This problem is most prevalent in any planning meetings / meetings with a ton of choices / items on the agenda. Better collaboration tools are always a hit (Think hosted web documents before the time of individual copies).
A program where you can
- List all the issues / import them from JIRA or so,
- These issues should be concurrently editable, using a browser (add login /security etc).
- This list is displayed for all the members and they should be able to add their opinion about importance AND size of the task.
- The tasks must be split according to small owner teams.
- The votes and estimates from owners carry more weight than others.
- This should also allow for higher powers like product managers to add their weights.
- There should be small chat windows that can be spun up like IRC rooms that people can assign to topics on the spot and flag it for attention/to show interest in working on - it should also allow to ping people as necessary for the discussion.
- The chat window must be better than regular IRC - in the sense that people should be able to get a summary of whats going on there (and keep adding to the summary - a todo list so to say, with simple hashtags / other means) This allows for quick checks on various tasks and each ones dashboards show where they are required the most.
Once this phase of individual prioritization is done, the team members can pick their topic of interest and get together in smaller groups. (Ideally the chat window should say people are discussing it in X group.)
We could expect one of the folks to take notes and add it right there in the chat or even large scale speech recognition!
When everyone comes to a conclusion about the weight of tasks and stuff to do on that sprint, this final summary information must be posted on the actual tasks, and the chat logs must be added there for posterity.
There - more efficient planning meetings, which should hopefully be done in a couple of hours and everyone feels productive. Obviously this can be improved on (Votes can be done by giving x number of stars to each person and let them assign it to tasks that will cover the sprint. Product managers get more stars).
Do talk to me if you are interested in doing this as a college project / OSS - I will try and contribute as I can.
My office commute saga.
When I started thinking about driving to office - the number of cons were overwhelming. How can this ever be a cheery thought?
- I didn’t see how sitting in traffic for 1-2 hrs a day, at your peak concentration levels do any good.
- The parking rates are atrocious in Seattle ($220 a month or $15 a day!).
- There is the cost of gas + insurance + loan payments and maintenance for the extra car.
- The car gets used only twice in a 12 hour period.
So the master plan was to commute by bus.
There was another catch with this - my house is 1 mile away from the bus stop. Now I could leave my car in the park and ride, but most of the above issues still apply. I could walk the mile or I could take the local bus for the mile. I will still have to walk 5 blocks from my bus stop and add some wait times at the bus stop.
Time taken for walk & bus = 14 minutes (1 mile walk) + 5 minutes (at bus stop) + 15 minutes (actual travel)+ 7 minutes (final bit of walk) = 41 minutes.
Time for local bus & main bus = 5 minutes (wait at first stop) + 6 minutes (local ride) instead of the mile walk. We save 3 minutes and a bunch of weather beating!
As always yet another catch with this fabulous plan: The last local bus left at 6:40 - meaning I have to leave at 6 from office too. Due to bus scheduling, I reach home only by 7.00 pm - meaning I actually spend 100 minutes every day commuting. The worst part is, the commutes themselves are short, and the weather is usually foul, meaning my kindle / iPad can’t be engaged fully.
You would think it is something like,
but in Seattle it’s more like,
So I bought a cycle recently. Also, I used to run / hit the gym for about an hour almost everyday - which I can now forego, considering this is a 1000 calorie work out - so worst case, instead of spending 100+60 minutes on commute and workout, I can spend 2 hrs riding my bike. A 40 minute per day saving is nothing to sneeze at - Brilliant!
A quick aside: The cycle might cost only $450, But the accessories (lights, rain wear, shoes, modifications, bell, pump etc.) total came up to $1000! So don’t low ball the cost like I did, if you are planning to do this.
Another mistake I did was in the estimation of my biking prowess. After all, I run 6 miles almost every day - Boy I was wrong. The muscles involved are completely different. Also, Mercer Island to Seattle route is quite punishing for the beginner with steep hills and a 8.2 mile commute. Initially it took me around 1 hour to do one way.
Yet another mistake was my estimation of time for the prep and cool down: after parking the bike in office, I lost another 15 minutes in the locker room - so I was actually spending 150 minutes - the savings don’t look so good no more, with the added cost around cooling down from the workout - I was tired, twice a day!
This was the point I seriously considered giving up. The nice guys at my bike store www.hellobicycle.com was willing to take back my bike for $350 too, so I could always come out with my ego and wallet only slightly bruised. But, quitting while ahead has never been my strong suite. So now on to what any self respecting engineer would do: profiling and optimization!
I started measuring time taken using mapmyride and noticed I do 8mph - only 1.5 mph over my running speed! I have been spending most of my riding time gawking around! Also, The initial setup I had purchased, had a ton of unnecessary stuff. This is where the real worth of REI membership and 60 day returns shines through. I had also bought a commuter bike instead of racing bike - means that added 10 odd pounds and a wind-resisting posture. Identified a few steps to solve this:
- reduce the weight. I returned my bike rear rack, panniers.
- Stop carrying so much stuff! I carried rain clothes + a change of clothes + fruits + my 2 meals. (Yeah I eat 5 small meals a day).
- Leave a pair of shoes at office.
- Commute by bus 1 day of the week. On this day I hit the gym instead, and I carry 2 pairs of jeans and fruits for the week - that I left in the office. Now I have to carry only a laptop+tshirt+underpants+meals+rain clothes in a backpack.
- Changed my bike pedals to lighter clipless models.
- Net: I lost about 15 pounds in carrying weight. I will hopefully lose a couple more when I exchange my t410 for an x201.
- I also seriously considered switching to a racing bike to add more speed. On the flip-side, this required an investment of another $1000 for a reasonable bike of my height and there was the probability of more punctures. I also had a strong feeling that the issue was on above the seat rather than below the seat. So for now, this will be a toy of tomorrow.
I have implemented this for the past month now and end results are very cool indeed. I bike at more than 12 mph now and reach office in less than 40 minutes and I am not as tired! The changing time also reduced to 10 minutes since i change in our Men’s room instead of locker - so the awesome time saver plan is back on track!
Also interestingly, according to the helpful pro-bikers at office - this is not apparently the peak speed I can do - Those guys average 22 mph! That means back to what I do most - Tweaking and more optimization:
- I suspect my 200+ pound weight is a huge drag (I blame you B&J and CanAm pizza!)- so onto a reasonable diet plan again after 6 months of American style eating.
- More leg workouts - I have the common Indian body builder syndrome: Heavy upper body and chicken legs. Finally a reason to solve that.
- More biking - Am looking at doing more weekend rides.
- harder biking - I guess it is time to include the family now that spring is here. So thinking about a Trike for the girl and another bike for the wife! Weekends are going to be more involved!
There are two kinds of intelligence (and a billion kinds of stupid - but that’s another post for another day :):
- The kind that one is born with: It’s the kind possessed by the Mozarts of the world, who came in with a high IQ and a natural talent and inclination for whatever they do.
- The kind that is acquired over time: This is sheer knowledge, acquired over years of hard work.
Growing the former one is quite hard - its like trying to improve your IQ or increasing the processor speed. At one point, you hit a wall beyond which growth stagnates. Obviously you can’t come in with the latter. But the growth potential here is infinite, limited only by how hard you try.
Guess who bleeds at the bleeding edge? You.
A picture is worth 1000 words. A working prototype is worth millions!