It might be difficult to believe, but sometimes I love my job. I enjoy puzzles, and I enjoy the procedure of rationally exploring alternatives and reaching a conclusion. My job is a series of puzzles, no matter how closely you look, which form a great spiralling sprawling fractal.

First there is the micro-puzzle, which is: the solving of very specific concrete problems. For instance, two variables from two different data sources are changing, you don’t know which is changing first, and you need to handle each case in an elegant, efficient, coordinated manner. Or: this system breaks in this specific way, so examine the forensics and run experiments and find out why.

Then there is the design micro-puzzle, which is: the organization of each micro-puzzle solution. In fact all coding involves organizing logic, in such a way that it can be re-used flexibly, without being too complicated to understand. Bad coders do not re-use logic, making it difficult to maintain and conceptualize code. Or they endlessly shuffle things around and build frameworks for problems they don’t understand, and accomplish nothing concrete.

After the design micro-puzzle is the strategic puzzle, which is: We have these different components or systems interacting currently, and we want to add this functionality. For example: we have 4 systems doing something quite similar, in a way that they compete with one another when they should work together. By merging all four, and splitting that into two well-defined systems, we can end up with a more understandable system that reduces inefficiencies.

Then there is the social engineering puzzle, which is: how do I convince these people to help solve the strategic puzzle, or the design micro-puzzle? How can I bypass the clueless people over there, and include the smart people over here? I am not so good at solving this puzzle, but I am learning.

And finally there is the where-do-I-fit-in puzzle, which is: I do certain things on a minute-by-minute or hour-by-hour basis. How do I frame these things in a way that gains me social capital? Or: I am currently working on these exciting puzzles, but there are even more exciting puzzles over there. How can I position myself to solve those puzzles? And although those puzzles are exciting, how can I maneuver to explore puzzles that are both exciting and important? This is the puzzle I am worst at. But when people see you enjoy, and are good at solving puzzles, then you reach the exciting, important puzzles eventually.

Each of these puzzles I can explore on my own, or I can solicit the opinions of smart people and see how they would find a solution. So yes, there are times when I love my job.


Skill Acquisition and Sleep

Some skills or habits can act as enormous levers. Think about the habit of setting goals, writing to-do lists, and achieving those goals. This is a kickass lever to have in your arsenal of skills, even though it’s a little dorky and seems as though it doesn’t have any tangible benefit.

Simply put, if you write to-do lists, you’ll be more organized and deliberate about skill acquisition in another area – whether it’s learning gardening or sailing a ship.

One of these levers that people routinely ignore is sleep. If you have poor sleep habits, you will feel perpetually tired, and without any energy it’s difficult to get anything done. There’s a lot to say about proper sleep habits, and it’s an area I’m only starting to explore – my own “sleep hygiene” is quite poor right now.

That said, there’s one property of sleep I’ve taken advantage of in the past. I recently attended a talk given by a sleep doctor at NYU, and he confirmed what I’ve long suspected: sleep acts as a caching mechanism. Suppose you take two groups of people and have them try to learn something; one group then sleeps while the other group does not. The group that was able to sleep will retain the learned information better than the group that was not. Something happens while we sleep where information acquired over the day is shuffled around and put into long-term memory. Personally, I believe that dreams have something to do with this: they feel as though part of the brain is trying to interpret the caching that’s going on elsewhere in the brain.

I applied this property of sleep in college. As I believe is common with many engineering disciplines, in the first year or two there’s usually a course that’s designed to “test” majors in the subject and see if they really care about it. Where I went to school, this was a class for sophomores where we had to design and write a Stratego game with a visual display, some sort of AI, and networking capabilities so that people on different computers could play each other. There was a *lot* to learn in one semester and the project itself was basically the entire grade for the course.

On weekends when I still had a lot to do before delivering something, I found the most effective routine was a pattern where I worked for about 3 hours, took an hour break, and then slept for 2 hours. This had two advantages: first, I was able to regularly step away from the problem I was facing, allowing my brain to take a break (more on this in a later post). Second, I was able to sleep, which is the best thing to do when you step away from a problem for the reasons above.

The pattern that worked for me in this particular situation is certainly not applicable for everyone, or for long periods of time. Still, I would encourage anyone reading this to go ahead and experiment with breaking skill acquisition up: instead of doing a lot at night, do a little at night, sleep, wake up early and do something in the morning as well. Experiment with sleep and see what works best for you.

Learning Vim: Current Steps

How do you learn a new skill? I don’t know what the optimal way is, but I can discuss how I’ve done it historically, and use a skill I’m currently developing as an example. As an engineer, I always want to improve my efficiency, and establishing a baseline is key.

One of my (m741) goals is to improve my programming skills. I’ve long developed in a custom environment, and I want to get familiar with standard development tools. One of those tools is called vim, and probably every computer person has heard of it. It’s a text editor, like Notepad, and is one of the two main text editors on Unix systems, the other being emacs.

To give an idea of why it’s difficult to learn: Notepad basically has no ‘special features’. You can search, replace, open, save, quit. And that’s basically it. If you want special features, and you want them to be easily accessible, you must be able to perform them with keystrokes rather than a mouse. One option is to use ‘meta keys’, such as alt, windows or ctrl to modify normal keystrokes. For instance, ctrl-s might save. The other option is to have a modal editor, whether one mode allows you to edit, and another allows you to perform unique actions. Vim is a modal editor. In command mode, pressing ‘w’ will skip forward a word. Pressing ‘dd’ will delete a line. The problem is, by default vim probably has over 100 shortcuts, many unintuitive. That’s a steep learning curve, but the end result is massively increased efficiency.

How have I approached this daunting task? For three years, I knew only 6 hotkeys: how to change modes, how to save, how to quit, how to search, and how to get to the end of a file. That’s it, for three years! Embarrassing. I treated the editor as a more obnoxious version of Notepad.

The first step, then, was convincing myself of the power of vim, and why I wanted to learn it. Then, I had to educate myself. I searched around on some popular websites, such as Reddit and StackOverflow. This led me to several tutorials: Derek Wyatt’s Vim Tutorials and Vimcasts. Now I’m watching those tutorials, at a rate of roughly 3/week. Periodically I pause them and try the various keystrokes that have been demoed. After each video completes, I edit a sample file and try to remember all the commands that might seem useful. All of this might be considered active learning, the type of learning that you experience in high school or college: I’m learning, I know I’m learning, and my attention is focused on it.

I also discovered that my IDE at work has a ‘vim mode’. Vim is popular enough that this is an option for many systems. For example, there is Vrapper for Eclipse. I believe emacs also has a way to emulate vim! So, I’ve experimented with this new mode. In a few days, I will permanently enable it in my work IDE. I’m also trying to use ‘optimal’ keystrokes when I open vim itself. For instance, I could press the right arrow 45 times, or I could press ‘$b’ to go to the end of the line and back a word. I would categorize this as passive learning. The idea behind passive learning is to force yourself to learn something by changing your environment – but otherwise not seeking out actual lessons. A similar example might be changing your operating system language when learning a new language, or moving a few miles from work, selling your car, and biking everywhere to get in shape.

These are the current steps I’ve taken. Stay tuned for more updates.