Mediocrity…

Oh the unused potential.
1-albert-einstein
I love stereotyping. Stereotyping is good. An unfortunate stereotype that I see is of people with serious lack of resources and access to knowledge and information. These are unfortunate people and perhaps the only way for them to progress is by sheer luck. They can be very hardworking in offering human sacrifices to secure their crop but they will most certainly fail. They have an empty or perhaps regressive feedback loop which encourages them to sacrifice harder next year, contemplate on their sins more and create more rigorous rituals. Unless there is someone born with serious mental mutation to generate the idea of the century, or someone comes and teaches them from outside, they will not progress. Not for centuries.

Continue reading “Mediocrity…”

Dichotomies…

When was the last time you were in awe after reading a simple solution to a problem that had haunted you for days.. perhaps on StackOverflow, Martha Stewart’s website or in some book or forum? When was the last time you saw a product that changed by orders of magnitude how we do something like make a call, washing the dishes, driving a car? Do you have memories of things you experienced decades ago that you still cherish.. like a feature film, a song, a recipe?
How do people come up with solutions so elegant, products that charm and experiences so memorable? Are they simply more “innovative” from the get go?

Continue reading “Dichotomies…”

The year, so far…

General thoughts

The tale of two lists

2016 started on a high note. I am certainly enjoying the audiobooks. Having set up a few categories to read from this year, I am more determined than last year to cover a broader set of topics.

I highly recommend setting up two important lists: The read list and the hack list. If you are a new reader, just get reading. 1 book in a year is immensely better than 0 but once you are reading 4-5 books in a year, you will start to love it. By the time you can do 20 or more books, you will need to prioritize what you read. Similarly, the hack list helps you prioritize your personal projects. If you have not deliberately undertaken and completed a small personal project, I would suggest just commit to one and do it. Once you realize your potential (and everyone has boatload of it), you will want to do more. Once you are able to do more predictably, you will have to plan where those precious hours go.

Here is my read list 2016 (here is read list 2015). Here is my hack list 2016 (without any method to madness). I’ve started the hack-list this year so it is not very well structured and I have yet to see how it pans out at the end of the year. An experiment I am excited about.

The tale of two advantages

I have realized two advantages: The commuter advantage and the weekend advantage.

I think having a commute is a double edged sword. It is an advantage and a disadvantage at the same time. The commute (2 hours every weekday) is not terribly tiring if I get enough rest while at home. It does give an advantage of 2 hours to myself, undisturbed (mostly, not counting the screeching of the trains). This allows me to pursue personal projects and learning but it is also taking away 2 hours that I could otherwise spend with family or at work (both of which have an appetite for more).  I guess I have to spend more time in coming days in time-budgeting. My health initiative suffer greatly because of this.

Similarly, the weekend advantage is a self realized one. You could spend it binge watching netflix, traveling around, lazing around or just sleeping. Or, if you are like me, you can spend it with family in the daytime and coding/learning in the night time.

Books read

Science & Space Travel

  • Astronaut’s guide to life on earth ★★★★★
  • Starman (In progress)
  • The future of mind ★★★★★

Product development

  • Hooked ★★★

Fiction

  • The last question ★★★★★
  • Girl on the train (In progress) ★★★★

Self help

  • The confidence Gap ★★★
  • Way of the seal (abandoned) ★
  • Creativity Inc (In progress)
  • Happiest toddler on the block (abandoned) ★★★

Statistics and Data science

  • Signal vs Noise ★★★
  • Python data-science essentials (continued) ★★★★
  • First course in design and analysis of experiments (continued) ★★★★

Academics

Personal projects

  • Patio herb garden (not started) – sigh
  • Let’s Hack Book (shelved – will come back to it later)
  • Grocery planner app (to be started)
  • From the hack list, lots of smaller projects.

Have any tips, feedback or comments for me? Follow my blog or facebook or tweet to me.

H1-B timeline

For those interested in working in the US, here is a timeline I followed. YMMV.

Oct 2014 – Dec2014

Interview training.

Dec 01 2014 – Jan 01 2015

Job application/preliminary HR screening interviews. 

Jan 15 2015 – Jan 31 2015

Telephonic Interviews/online tests/peer-coding (2-3 different screenings)

Feb 15 2015 – Feb 25 2015

B1/B2 visa application / travel arrangements for onsite interview

Mar 01 2015 – Mar 02 2015

Flight to SF

Mar 03 2015 – Mar 05 2015

March – 4X – Onsite Interviews (flights + 2-3 nights fully funded with meals reimbursements)

Mar 07 2015 – Mar 10 2015

Offer Decision/negotiation-Acceptance

Mar 15 2015 – Mar 22 2015

Document submission to lawyer

Mar 31 2015 – Apr 01 2015

Petition for work permit submission

May 04 2015 (~)

Petition selection / result

August 25 2015 (~)

Petition approval notice

Sep 4 2015 (~)

I-797 Approval doc

Sep 10 2015 (~)

I-797 and other documents package

Sep 14 2015

Visa stamping

Sep 20 2015

flights, protractor, funds arrangement

Sep 29 2015

Flight

Sep 30 2015

land in SF

Oct 01 2015 – Oct 10 2015

settle down

Oct 12 2015

first day at job

2015: Year in reading

2giphy2015 was a good year for reading. It was also one of the most challenging year I have had so far. From changing houses 3 times, finding a new job and moving thousands of miles away from home country, it was far from a “year on the couch”™. Quiet the contrary!

But don’t most busy people have the most time to do most of the things they want to?

At least that is the motivation for reading so many productivity books.

The process

Every year I setup a read-list for the next year. I also setup a “read-list-inbox”. All the recommendations I get throughout the year (from the books I am already reading, from other people, from blogposts, etc.) go into read-list-inbox. From the read-list-inbox I prioritize books and put them in read-list. The priority is based on what I want to learn in the year. I will write later on some learning themes I follow.

80% of my reading is thru audiobooks, 15% on the paperbacks and 5% on my laptop.

The ratings

giphyPlease note that these are not absolute ratings. These are my ratings and how I feel about the book and whether I found it useful, entertaining, mind-opening and recommend worthy to people who are similar to me. For example I have already read so much on personal discipline and productivity that I didn’t find anything new in “Eat that frog”. It may still be a nice book. Similarly, I find Nasem Talib’s tone a little over the top for my taste and hence I didn’t like Antifragile. It may have been a good book.

The books

giphy1From 3 books in 2013, 5 books in 2014, I was able to go thru 20+ books in 2015. 2016 looks promising and I hope to double that number while improving on the quality I extract from these books.

Here is the list of books I went thru in 2015.

★★★★★ (Books I love and highly recommend)

★★★★ (Books I enjoyed and recommend)
★★★ (Books that were a good read and may interest some people)
★★ (Books that I couldn’t get much out of)
★ (Books that either had errors or were not up to my taste)

If you have read or are currently reading any of these books and want to have a discussion, feel free to find me on facebook or drop me an email at [zakishaheen-at-me-dot-com].

Be a 10X programmer with Myles Bryne

Today I attended a talk at Dev Bootcamp by their ex-CTO Myles Bryne who is now teaching at Bradfield (preparing students and professionals for tech job interviews). A disclaimer: There is no such thing as a 10X programmer, neither does programming look like the animation on the right.

Personal plug: If you would like to get more reviews on tech talks in the Bay Area that I attend, subscribe to my blog. I usually do 1-2 posts a week.

 

Although the talk was geared more towards in-the-making and junior engineers, there was a lot of takeaway for experienced people as well. I’ll summarize a few takeaways and then discuss my biggest takeaway in detail.

  • Invest your time in “Mind vim”. Vim is a simple text editor that has made so many people so productive. Easier != Better. Invest your time in techniques to stretch the brain muscle.
  • Learn about evils of software state and side effects and avoid them whenever possible. Prefer function of methods. A simple google search on Function vs Method would result in a more nitty gritty answer and some go on a pedantic journey for explanation. Myle’s point was to learn the original soul of functions: i.e. to produce the same output for the given inputs predictably without side effects in any other part of the system. This makes it more manageable, readable and testable.
  • Learn about ‘reduce’ (also called inject in ruby) and treat them as primitive building blocks of programming thinking.
  • My first biggest take away was the introduction to Epigrams of Programming. What a gem of a reading. Thanks Myles!
  • Learn beyond just libraries and frameworks and dig deeper into the basics. Learn data structure primitives like trees and graphs. Learn their application and use that instead of regexing your way thru all the things (and treating everything as a string). Do leetcode and hackerRank problems.
  • The command line has been around and Lindy’s principle suggests that it will be around for as much again. Its a pretty good bet to learn it early on.
  • Learn the event loop. Its the staple of all programming models and will make life easier in any development environment or framework.

In the Q&A that followed after the talk, I asked Myles whether his talk goes against the very basis of Dev Bootcamp: To teach programming in a very small time skipping over a lot of really fundamental things which are only taught in an undergrad course in computer science? Here is what he said which I think is my biggest takeaway tonight:

Courses like Dev Bootcamp show you in 9-12 weeks whether you are made for this stuff or not. Undergrad CS would be much easier and relatable after some work in the software world, in fact – it should be mandatory for undergrads to do 2-3 years of real world industry programming before starting the degree.

Oh boy, what is he talking about?

As unintuitive as it sounds, Myles makes perfect sense to me. In my experience, the most ‘talented’ programmers were all those who had prior real world programming experience before joining the undergrad course. We knew what a process is and what happens when it gets killed so operating systems was more interesting to us. Other students always painfully asked me (or those who have had prior programming experience) how on earth was I able to enjoy those courses.

So its not the students fault that they find themselves in such a miserable situation. There really is a great deal of homework required by most people to understand really hard and deep concepts that are taught in theoretical computer sciences courses. A lot of people I know in the industry want to go back to college and learn more! A little priming before the university is absolutely critical.

The idea that students should invest time in going through Dev Bootcamp or similar activity (in a paid institute or on their own) really struck me and is my biggest take away today.

Until next time, code away!

Window management for Developers in Mac OS X

If you are spending 8+ hours a day on a computer, you will invariably wonder how you can optimize those for productivity. While you might have installed a few good productivity tools, one of the biggest productivity killer is a psychomotor context switch.

The most common psychomotor context switch is moving your hand(s) between your keyboard and mouse. Even if you are using a laptop with a large trackpad, mentally you still have to switch from using more than a hundred keys to using 3 keys but able to precisely move the pointer. Think about how many times you do that everyday. For developers, that happens a lot more than they can like.

To improve this situation, I use a window management tool: Slate. Slate lets you define how you want to layout your windows and assign keyboard bindings for common operations that you perform. While it may look intimidating at start because it does not have a GUI, starting small helps.

Slate requires a .slate file to be existing in your home (~/) directory. You can make a simple configuration for or a JS based configuration file. Slate has a good wiki page to detail both ways. I based mine on a blog post.

At work, I use a 3 monitor layout. I sometimes move to conference rooms where I switch to 2 monitor layout and finally when I am home or in a cafe, I am in 1 monitor layout. It can be quiet painful to (every time) rearrange half a dozen application windows exactly where you like them for the current monitor layout in their exact sizes. By using Slate I don’t even have to think about it. I can make it detect automatically when new screen is attached and how to rearrange my software so that they are at their appropriate place. Zero context switch.

For instance, here is how I define the 3 monitor layout:

# 3 monitor layouts
layout 3monitor 'Calendar':REPEAT ${full} 0
layout 3monitor 'Spotify':REPEAT ${full} 0
layout 3monitor 'Finder':REPEAT ${topleft} 1
layout 3monitor 'Wunderlist':REPEAT ${topright} 1
layout 3monitor 'Google Chrome':REPEAT ${full} 1
layout 3monitor 'Textual IRC Client':REPEAT ${full} 1
layout 3monitor 'Messages':REPEAT ${topleft} 1
layout 3monitor 'Sublime Text 2':REPEAT ${full} 1
layout 3monitor 'Xcode':REPEAT ${full} 1
layout 3monitor 'Instruments':REPEAT ${full} 1
layout 3monitor 'iTerm':REPEAT ${topright} 2
layout 3monitor 'Simulator':REPEAT ${topright} 2

Here,  I am telling slate to throw Calendar and Spotify on Screen 0 (the laptop’s smaller screen). I don’t see them often but like them around just when I need to. Then Finder, Wunderlist, Chrome, Textual, Messages, Sublime, Xcode and Instruments stay on screen 1. iTerm and Simulator are on screen 2. I have also defined size variables like $(full) and $(topleft) so that the windows are moved in the apropriate place too.

Another neat ability that slate provides is to bind applications to specific keys

bind r:cmd;alt focus 'Calendar'
bind x:cmd;alt focus 'Xcode'
bind w:cmd;alt focus 'Wunderlist'
bind f:cmd;alt focus 'Finder'
bind g:cmd;alt focus 'Google Chrome'
bind t:cmd;alt focus 'iTerm'
bind s:cmd;alt focus 'Sublime Text 2'
bind u:cmd;alt focus 'Textual IRC Client'
bind p:cmd;alt focus 'Spotify'

So I don’t have to use a mouse to activate a screen and I can even bypass Cmd+Tab as well. To switch to Spotify from anywhere, I only need to press cmd+alt+p.

You can find my slate dotfile here.