Filed under Productivity

Sunday Selection 2012-03-11

Happy Daylight Savings Time Day everyone! (Or something like that)

Around the Web

Are you a Zen coder or a distraction junkie? It’s been a while since I’ve worked on a project where “my code’s been compiling” has been a valid excuse for not working. But now that I am on such a project, it’s important that those mini-breaks don’t turn into longer breaks.

Successful people are successful Einstein is rumored to have said that compound interest is the most powerful force in the Universe. Whether or not he actually said that, compound interest is still pretty powerful. Maybe it applies to reputation and achievement just as much as it applies to money.

The power of diligence in creating a remarkable life Keeping one’s options open seems to be a pretty common strategy but it could be the wrong one. Perhaps it’s a better idea to pick an area and dive deep rather than to spread your bets.

Videos

On being an introvert Everyone seems to be busy building the next social thing to help us “connect” better to everyone else. But a lot of the best work requires solitude and independence. Introversion might be a hidden superpower. (There’s a written synopsis, but the video is well worth the 18 minutes of your time.)

Etudes for programming

From Wikipedia:

An étude (a French word meaning study, French pronunciation: [eˈtyd], English pronunciation: / ˈeɪtjuːd /) is an instrumental musical composition, most commonly of considerable difficulty, usually designed to provide practice material for perfecting a particular technical skill.

I noticed today that Michael Fogus (one of the authors of Joy of Clojure) has a number of Github repos with names such as etude-ocaml and etude-syntax. I also realized this week that I’m a pretty slow programmer. I’ve been getting better over the years but I’m still slow, especially if there’s a good amount of API design involved. While I think that writing lots of code will make me faster over time, I do wish there was a more structured, focused approach.

In general, I wish there was more by the way of études for programming — problems and exercises of considerable difficulty designed to provide practice material for a particular (set of) skills. There are of course great textbooks for programming and computer science and those books have good exercises (I particularly like SICP and the K&R C book), however in most of those cases the point is to teach first and practice second. What I’d like to see is the reverse – assume that the reader already knows about functional programming or the C language but needs to “level up”, so to speak. The exercises would be harder and more in number but would also cover a broad area in terms of application of the concepts involved.

This is related to what I’ve written earlier in terms of deliberate practice for programmers. That post talks about “level up” lists – a list of programs to make that help explore the different areas of computer science and help you gain experience and hence “level up” as a developer. On the other hand études would focus on depth rather than breadth – each one would focus on a small technique or technology and fully explore that area. Together a continuous habit of working on études and doing level-up projects would give programmers a steady stream of deliberate practice exercises to work on.

The question is, where are we to find these études? I’m not sure if there are programming books out there that fit that description. If there are, I’d love to here about them. But in the meantime I’ve found an acceptable alternative — homework and assignments for college level courses. This semester I’m the TA for a course on functional programming and throughout the semester we have a set of 6 assignments for students to do. Each of them have about 3 to 4 problems (each with multiple parts) that tackle a small area of functional programming. I think exercises like this are great material for études. I’m currently working through the exercises at the same time as the students (other TAs are making them). Even though I’m already familiar with most of the material it’s been a good learning and great practice for me. I can’t really measure if I’m improving (apart from running my solutions through the test harness) but it’s more direct and practice in functional programming that I’ve ever had.

I’ll be done with this particular étude in a few months. I don’t think I’ll be releasing the code since the problems often get reused. However I do think there will be lot more where those came from. There are lots of college courses with website out there and there’s lots to learn. I’ll probably try compilers next. All that being said, it would be great to see some curation and collection. With Amazon’s Kindle Shorts and the growing interest in short, self-published books putting together a regular series of études might be a pretty lucrative endeavor.

Tagged ,

How much do environments matter?

The last week and a half has been really productive. I’ve written a lot of code, made progress on my research project and learned a lot of stuff in the process. Unfortunately it’s all been in one area, but that’s a matter for another post. But given how productive I’ve been one thing that I’ve been wondering is how important an environment really is to productive.

I’m usually of the opinion that environment (both physical and in terms of setup) is really important for any sort of creative or intellectual work. However I’m not quite so certain anymore. My current working setup is less than perfect. Though I have a nice DIY standing desk and a brightly lit office I also share the office with six other people and at times it can get pretty busy and crowded. I have a very powerful work machine but most of my recent work has been in a basic Ubuntu virtual machine with no customization other than my Bash and Emacs setups.

Despite the fact that my environment is not perfect the last week has probably been the most productive I’ve had all year. This begs the question: are environments really as important as I had thought they were? Or is it sufficient (and necessary) to have a project you’re really interested in? Of course, I understand that this is a personal question, so I’m just going to try it for myself.

What I’m starting to think is that the environment doesn’t need to be perfect, it just has to be “not painful”. There are some things that I just can’t stand: I can’t stand bad chairs, environments that are too noisy or too high of a room temperature. But once I have air conditioning, a standing desk and decent set of headphones I can quite easily tune out everything else. Similarly, once I have a command-line UNIX environment and a decent enough keyboard I care much less about what window manager I’m using, what size my monitor is or even what my language or toolchain is. Once I’m in the zone there’s very little that I care about.

I would say that environments matter, but only to some extent. After a point an interesting and exciting project can easily make up for any deficiencies in the environment. However, the opposite – a great environment but an uninspiring project – hardly makes you want to jump out of bed in the morning and get to work.

In addition to my Macbook and my work machine I have a small Eee PC lying around with a bare bones Arch Linux install on it. As a small experiment I want to see if I can be as productive on that machine as I am on my work machine. In addition to my research project I’m taking a programming languages class and TAing a functional programming class, so I regularly find myself in the mood for some OCaml hacking. Admittedly it won’t be a scientifically controlled and rigorous experiment, but it will be interesting to see how far an interesting project can compensate for a less then ideal environment.

Graduate School Semester 2

I’m about a month into my second semester of graduate school at Cornell’s excellent Computer Science department. (Shameless plug: If you applied and got admitted you should definitely come visit, we’re awesome. If you’re thinking of applying contact me with questions.) The first semester involved a fair amount of getting used to grad school life. It’s pretty different from undergrad and I covered my initial impressions before. There’s a lot of autonomy (even in the first few semesters) but that means it’s all that much easier to screw up. The most important lessons I’ve learned are to start early, make plans and schedules and set up routines and environments that make getting the work done the default (this applies to both school work and research). I’m definitely not perfect at it, but I try to suck a little less each day.

While last semester was a good learning experience I got a lot less done than I could have. While I don’t want to cry over spilt milk I certainly don’t want to make the same mistakes again. My class load and TA work are about the same as last semester. However I have a better idea of how much time each takes so I can schedule blocks of time more effectively to get large chunks of work done at a time (and not worry about it otherwise). That in turn means that I can have more time for research (which is something I definitely want to do more of this time around).

I’m really happy about the choice of classes I have for this semester. I’m taking Advanced Programming Languages and Datacenter Networks – both are areas in which I have an interest but I know less than I would like to. I have great professors in both and so far the material has been very interesting (and useful). I’m the TA for a class on functional programming which is turning out to be a good learning experience as well. I’ve done some amount of functional programming but not a lot and not in a structured way. I’m working through the exercises and homeworks myself so that I can better help out the students and learning a lot in the process. Since I’m going to be doing a lot of functional programming in the future (Haskell programming in particular) this a good way to level up as well as get my TA duties done.

Last semester I had a small research project which was more of way to get familiar with the concepts and tools I’ll be using later. I am a little disappointed in that my final deliverables weren’t as complete as I would have liked but the experience will come in handy. This semester I have a more concrete (and more ambitious) project. I’m also starting sooner and thanks to last semester I have a far better idea of the challenges I’ll face and how much work it will take to get around them. My main interest in programming languages and right now the project isn’t very language-oriented. But there is a lot of cool systems-hackery involved and once the foundations are laid I can move on to the more higher-level language-oriented parts of it. I’m still taking baby steps (figure out build systems, building testbenches and having rather intense discussions with my compiler) but within a week or two I want to progress to the real meat of the project.

Aside: In case you’re wondering, it involves networks and trusted computing, but more on that in a future post.

Apart from school and research work I’m hoping to do some more exploring. Cornell has a really nice campus but I only saw a small fraction of it last semester (and probably spent a bit too much time in my apartment). I’d like to be able to get out more and take advantage of everything that Cornell has to offer. That’s a bit easier said then done in winter, but that’ll change as things get warmer.

I’m still trying to work out the best “work life balance”. While things like Cal Newport’s fixed schedule productivity seem appealing it might be unworkable for me right now. More importantly, I’m still not sure how separate my work and my life should be, or even what constitutes “work”. I haven’t decided if I consider my writing or my on-the-side hacking (which I’ve been doing far too little of recently) to be work, play or something else. Part of me would like to think that the work-life distinction is only applicable to a more Industrial Age setting where you don’t like your job and want to spend as little time doing it as possible. Ideally you should do work you love (which I’m gradually approaching) and have no need to draw a distinction. While that seems appealing I’m afraid it might lead to sitting (or standing) in front of my machine all day which is not what I want to do. Luckily these aren’t questions I have to answer definitely right now, but I can keep refining my answers over time.

I’m hoping that the rest of the semester will have lots of great learning, cool hacks and maintaining some semblance of a life away from my machines. I know that graduate school can easily become a drag and very stressful and I’m determined to not let myself end up in such a position. Luckily I’m in a good department with great support from friends, family and professors. I’d like to see this semester be more productive and a step on the way to deciding exactly how I want my grad school experience to turn out.

Tagged ,

Sunday Selection 2012-02-12

Around the Web

The Information Diet : A Case for Conscious Consumption You could consider this a counter-argument to my previous post on how we can use consume and use information. I think we’re still pretty early into the Information Age and we’re still coming to grips with the fact that we have the world’s knowledge just a few clicks away. I haven’t read the book yet, but it’s definitely on my reading list.

10 Rules of a Zen Programmer I’m not entirely sure why there seems to be a strong interest in Eastern meditation and mysticism in the hacker culture, but tit does lead to some interesting analogies. In that light, this article is both pragmatic and idealist. While I don’t agree with all of it (no. 5 for example) it’s a worthwhile read and might help change your perspectives.

How to be Relentlessly Resourceful This isn’t about technology or Zen (at least not directly). It’s more about how to get the job done. And we all want to get the job done.

Software

Spotify To be honest, I still have my doubts about streaming music. I do prefer to have my own collection that I’ve paid for and (mostly) have physical copies of. That being said, I do think Spotify is a really neat service and a good way to try out artists and albums before I decide to buy.

Follow

Get every new post delivered to your Inbox.

Join 338 other followers