Over time, I've discussed with many people how they learn a new programming
language. A common theme is to write something you're intimately familiar with
over again in a new language in order to learn and judge. For example, some of
my friends like to implement standard *NIX utilities such as cat, echo,
grep etc. Usually only trivial versions, but it gives them a feel for
stdio, file access, command line argument processing, etc. Some implement
some kind of algorithmic solution to a known problem in order to get a good
feel for control structures and approaches to data structures. I am a little
bit in both camps. I tend to try and use controlled problems but I try not to
reimplement things over and over. Over-all any of these approaches are
excellent in allowing the developer to gain an understanding of how a language
works, and how to solve things in it. Learning your tools is key to being an
effective developer, and the language you're working in is one of those tools.

Sometimes though, what you want to do is extend your knowledge in a different
direction. I am currently embarking on one such journey, and I'd like to tell
you a little bit about it.

I have, for many years, been interested in microcontrollers, and writing
software which works in severely resource-limited environments (such
as a total of 20 kilobytes of RAM, or 128 kilobytes of program storage).
I've been working with one such family of computing devices for quite a while
now, and among my various projects I have developed USB devices which do
fun things such as monitor a bidirectional serial link, providing
millisecond timestamped transaction information down the USB port. However
throughout it all, USB itself has remained a fairly sealed black box. I used
libraries provided by the microcontroller vendor, and just programmed around
them.

I decided there and then, that I would improve my understanding of several
topics all at once. I was going to learn more about the
microcontroller hardware, the specifics of USB itself, and improve my
command of a programming language all at once. This is, as you
might imagine, quite a tall order, but I feel that it's worth my while to push
my comfort zone a little and do this. To keep me honest, and to keep me
working at this, I have also committed to presenting, at
a conference, some kind of results of my efforts.

I tell this story here, in part to increase the assurance that there's plenty
of people expecting me to do the work, and also in part to encourage you all to
push your comfort zones a little. Your homework, because of course there is
some, is to think of something you do a lot, that you are comfortable,
interested, and engaged with. Now think of a way to twist that so that you
learn a lot more about that topic while pushing your comfort zone just a little
bit. Why not comment below and tell me what you're going to do, and we can
encourage one another just a little.