Search This Blog

Caring for Our Raw Materials

I greatly respect the Pragmatic Programmers, Andy Hunt and Dave Thomas, and I have always enjoyed reading their stuff. I was perusing their publishing website recently, and came across a nice article about how we should develop ourselves as programmers because we are the raw materials that go into the construction of software. In their own words:
We are the only raw material of consequence in software development. Oh sure, the process will involve a few keyboards and mice, some compilers, database products, and myriad office supplies, but they’re all completely secondary. Contrary to popular myth, we don’t write software on computers. We don’t write software in programming languages, integrated development environments or case tools, whiteboards, or 3×5 cards.
We write software in our heads.
They go on to describe a number of ways to prepare ourselves to be good developers:
  • Use the right tool for the job, and know how to use the tools.
  • See the software you're writing within the larger context in which it will be used.
  • Own up to our mistakes, and offer solutions, not excuses.
  • Communicate what we're doing, how we're stuck, and where we plan to go next.
  • Learn, not just about new technologies, but also about our own abilities and shortcomings.
That's the summary of an already quick article, and they're all excellent points. The article may have been short, but it left me thinking about what we can do to get the most out of our own mental capacity. These five points cover how a good developer approaches software development—what quality raw materials look like—but there's another aspect of these raw materials that's equally important. How do we take care of our raw materials?

Learn Three Ways


All of those aspects of a good developer are things that need to be learned. In software we learn about tools, we learn problem domains, we learn how to problem solve, we learn to communicate, and we learn how to learn. Each of these topics is an article, or an entire book, unto itself, but let's briefly explore the last one, learning how to learn.

Learning how to learn is a lifelong endeavor, if you keep working at it. I have never been better at learning than I am now, but next year I hope to be better. I'll have picked up more knowledge that will act as a foundation for still more knowledge. I'll also know myself better and what learning methods work best for me.

When I was in high school, I thought learning meant studying. I would immerse myself in books of all subjects and work through plenty of assigned problems in math and science. While this method of learning does give you loads of practice with the concepts, it doesn't provide much context for using what you've learned in real world applications. That's probably why math teachers so commonly get asked, "When will we ever need to use this stuff in real life?!"

I still study a lot, and I can't read enough books to satiate my appetite. But in college I learned the value of actually doing things in addition to studying. You can study until you're blue in the face, but you don't really know something until you've tried to use it in a real project. Take circuits for example. You can read all about Ohm's law, how op amps work, negative feedback, stability, PSRR, and all that stuff. Once you've read about it all, do you know how to build an amplifier circuit for conditioning a signal from a pressure sensor? Almost certainly not. You should have some idea of how to do it, but you'll learn a great deal more about circuit design by actually doing it.

Over the last couple years I've found that studying and doing are still only part of the whole learning picture. The last part of the picture is teaching. Teaching something to others requires an entirely new understanding of the topic you're trying to teach. I've constantly come up against this issue when writing my more technical blog posts. I thought I knew statistics pretty well, but that series was still pretty challenging. I looked up a lot of things that I use all the time to make sure I got them right. Part of the difference is that when you're using knowledge to do something, you have your own understanding of things, and that works to get the job done. When you need to turn around and teach that knowledge to others, you need to think about how to convey that knowledge in a clear enough way that a reasonable number of people with widely varying backgrounds have a chance of getting it. That's a hard thing to do, and you learn a ton by doing it.

Attempting to teach, even in the small way that I'm doing it on this blog, has given me an even greater respect for all of the people that do it as a full-time career. It's also helped to show me that learning is so much more than studying. Learning by studying, doing, and teaching gives you a much deeper understanding of a subject than reading books alone. With that complete picture of learning, we can move on to the other ways to care for our raw materials as programmers.

Body and Mind


Our minds are not disconnected from the physical world, able to operate at full efficiency regardless of how we treat our bodies. We can't expect to do all of this learning and thinking and problem solving while ignoring the rest of our well being. Our minds are intimately connected to our physical selves, and how well we feel greatly affects how we think. There are at least four aspects of taking care of ourselves that directly impacts our ability to be effective programmers.

First, get enough sleep. This point should be obvious, but just because it's obvious doesn't mean it's easy. The average person should get about 7-8 solid hours of sleep a night. When you're busy working on multiple projects at work and at home while taking care of and taking part in the rest of what life has to offer, that kind of sleep goal is hard to meet. When you do get enough sleep, the return on that investment is worth it. You think more clearly. You're better able to deal with the minor stresses that happen throughout your day. Your problem solving abilities greatly improve. If you skimp on sleep to try to get more done in a day, you're building up a debt that you're going to have to pay sooner or later, and it's counter productive in the mean time. Get enough uninterrupted, quality sleep so you can be a rock star instead.

Second, eat well. Your mind needs fuel to think, and the right kinds of foods will help improve your performance. Loading up with lots of greasy, fatty foods and sugary soft drinks will either make you feel dull and sluggish or energized for a short time before crashing hard. A good balance of fruits, veggies, complex carbs, and protein will do a much better job of keeping you humming along, thinking at full capacity all day long. Oh, and don't even thinking about skipping breakfast. It's what kick-starts your day. Don't skip lunch, either. And don't eat dinner too close to bed time. You'll sleep better.

Third, exercise regularly. Whenever I exercise, I feel much more alert and better at taking on problems, and that feeling lasts for a good day or more. On the other hand, when I skip a workout, I definitely feel down the next day. I hate skipping workouts. A good workout doesn't have to bring you to your knees. In fact, it shouldn't. A good workout should make you feel rejuvenated, and a simple 30 minute walk each day, whenever you can fit it in, could do that for you. It helps you breathe more deeply, take in more oxygen, and get your blood flowing to help you think better. Regular exercise also helps you sleep better.

Finally, relax. We are not machines. We can't expect to go, go, go all the time without taking a break. Leisure time is important, too. It gives your brain time to rest and recharge, and you'll remember some of the other good things in life, besides programming. Taking some time off can also help you solve some of those programming problems you've been struggling with. Stepping away from a problem, and letting it simmer in the back of your mind, will often lead to sudden realizations and new insights. When you come back to that mind-bending problem after a good vacation, you may be surprised by a moment of clarity where everything falls into place. The problem that you were working so hard on before may seem to solve itself. Additionally, taking time to relax will reduce your stress level and, you guessed it, help you sleep better.

While we do write software in our heads, and preparing ourselves as the raw materials of software development is largely a mental process, We should take a very holistic view of how to care for our raw materials. We are not just brains sitting in jars, building complex programs through pure thought. Our minds are inseparably linked to our bodies, and our thought processes are highly dependent on how our bodies feel. To learn all we need to learn to be effective programmers, we need to take care of ourselves through quality sleep, good nutrition, regular exercise, and some R&R. With that, I think it's time for bed. Sweet dreams.