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.