Nashville, TN, US
Architect, Author, Speaker, Trainer
How did you get into software development?
I feel very lucky on this front. Some people don’t ever find their true calling in life. I found mine very early.
In the summer of 1983, just before I turned 13, my parents brought home a TI-99/4A. It was a 3Mhz machine with 16K of RAM and a cassette tape for storage. If you didn’t record your program onto the audio tape, it would vanish when the computer turned off. That setup was practically state-of-the-art for its time. After working with it for about two weeks, I knew what I’d be doing for the rest of my life. I was hooked from the start.
The TI-994/A came with TI-BASIC, so that was my first language. I remember specifically that you could design your own graphics, but you had to do it by defining your own character sprites on an 8×8 pixel grid. Each row of 8 on/off pixels was represented by a hex code, so you ended up with a series of hex values to define one sprite. I worked that out by coloring in blocks on graph paper, then calculating the hex code for each row. Then you’d use those hex codes as a custom ASCII character to represent a little ship or alien for a game, and print it to the right X/Y position on a 40×24 screen to move it around.
I spent hours writing out entire programs by hand using paper and pencil, with line numbers at the left and double-spaced. That was so I could work out the flow and edit beforehand because modifying extended blocks of code on the computer itself generally meant retyping entire lines in a line editor.
So I’m almost entirely self-taught. I picked up TI-BASIC at home. At school, we had some Apple II+ machines (then later some Apple IIe machines as well), which had Apple BASIC and a floppy disk drive. On those, I typed in programs by hand from magazine page listings, mostly games. I also remember one of my math teachers taking my assignment, writing “A” on it without looking, then sending me to the back of the room to work on a programming project he wanted to be done for that hour.
Tell us a little about your current role
I have several roles right now: author, speaker, correspondent, open-source project lead, standards advisor, and committee member. I also switch between consultant and employee on a regular basis, depending on what I find interesting or lucrative at a given point.
I am lucky enough to work from home, and being a man of routine, my days are very similar. They start with me reading my morning news sites over breakfast. Then I’ll amble over to my “office” room to read (and hopefully respond to) incoming emails from overnight and late the day before, over an Espresso and Amaro.
With correspondence out of the way, I’ll start with whatever the major project is for the day around 9:00 to 9:30am. I’ll try to get in about 3 hours of work time on it. Some days that’s a programming project, other days it’s writing a longish blog post, and still other days it’s working on a book, course, presentation, or proposal. There’s generally some interruption here to respond to IRC or email, and answer questions about a project or a programming problem.
After that, I’ll break for lunch and a nap, or a barbell workout at the gym and a recovery meal. Then it’s back to the “office” to work on side projects, or perhaps follow through on unfinished work for the morning. That’s generally another 3 hours or so, with an afternoon Espresso and Amaro. If it’s nice outside, I’ll work on the back porch with my dog roaming the backyard or napping at my feet.
Around 5:30 or 6:00pm I’ll start to cycle out of work mode and into home mode. It’s time for a snack with my girlfriend while we watch an hour of game shows and catch up on each other’s day. Email often intervenes here too, along with reading my end-of-day news sites.
Later, I’ll have a Martini or Manhattan while we prepare dinner and watch something on Amazon or Netflix. We’re working our way through Supernatural right now. Her tastes generally determine the viewing material, unless I’m inflicting one of the classics on her (“Star Wars”, “Big Trouble In Little China”, “Die Hard”, etc.). Bed is around 10:30 or 11:00pm.
I am prone to occasional insomnia, usually because some problem from the day has captured my mind, so once a week or so I’ll get up in the middle of the night and sit in front of the computer until I feel drowsy again. It can be frustrating, but it does add a couple hours of reading time to the day.
I’m always working on Aura in one capacity or another. It’s a continuing labor of love, one that admittedly appeals to a limited set of PHP developers, but they’re the kind of developers I most like working with. The real challenge here for me is marketing. The code and community are fantastic, but the project doesn’t have the widespread “mindshare” that I think it ought to have. Obviously I am not a public-relations genius.
I just finished an update to ‘Modernizing Legacy Applications in PHP‘. This is its first update since publication last year; it felt really good to incorporate many small changes and clarifications from readers who found it useful and helpful in their work lives. I also just finished a second book, ‘Solving the N+1 Problem in PHP‘. The tough part on these is always sitting down to do the actual writing, and then the editing. “Writing” is tough, but “having written” is awesome. Steven Pressfield’s ‘The War Of Art‘ really helped me in identifying and overcoming what he calls “Resistance” to creative work, and I recommend it to anyone who considers themselves creative.
Another recent project is Bookdown, a tool for generating Docbook-like HTML output from Markdown and JSON sources. I’d like to spend more time on that to bring it up to 1.0, especially to collect the Aura documentation into a single place.
My next big project is not exactly a secret, but it’s also not ready for open discussion either. Suffice to say that I’m working with video, and it’s a very different experience for me. When I stand up in front of an audience, there’s a give-and-take of energy between us, and as a performance, there’s a lot of allowance for what feels like a conversation. But with recorded video, there is very little room for error. The exact same presentation is going to be replayed over and over, so every detail has to be exactly right. It’s much more difficult than writing, and I’m having to retrain a lot of my speaking habits because of it.
When are you at your happiest whilst coding?
Happiness is not an emotion I associate with programming. My positive emotions there are more like “pride” and “satisfaction”, sometimes even “contentedness”. They rarely last for long, but they are wonderful in the moment.
Some of my favorite times are when I have refactored something that is spread across the entire application into its own separate space (whether a method or class or layer), and everything continues to work as before. Occasionally that involves a measurable performance improvement, which is a very satisfying feeling.
Creating order out of chaos, finding patterns in systems, continuous improvement on previous work: these are what give me satisfaction. It takes time, but it gives me great pride to look back and compare “what it used to be” with “what it is now.”
What is your dev environment?
It’s pretty spartan. Only in the past couple of years did I switch from TextMate 1 to Sublime 3; before that, it took years for me to switch from BBEdit to TextMate. In Sublime I have the Markdown Preview, Pretty JSON, and Open URL plugins, but that’s about it. Any time I need something more powerful, I’ll generally descend to the command line, and use a crusty old bash script I’ve maintained for years or work some very limited new voodoo. (I am a man of old habits.)
I’ve been a Mac fan since they existed, and currently use a MacBook Pro mid-2010 that got a little banged up at the tender hands of the TSA. No external monitor, and I still use a wired USB mouse; the trackpads just don’t have the same feel to them.
Homebrew has become a good friend, and I’ll use that to install most of my other tools: git, mysql, a ton of others that I’m forgetting now. I used to compile PHP by hand, and sometimes still do, but the Homebrew “josegonzalez” PHP packages have been a real time-saver.
If I’m working on a project for an employer, I’ll set up a Vagrant box that mimics their production environment. If they don’t already have one themselves, I’ll generally make that the first step in working with them. I’ve tried Docker but it just doesn’t appeal to my sensibilities.
For my own open-source work, I’m a big fan of Travis-CI for the obvious reasons, but especially because it can run tests against multiple versions of PHP. That has made it very easy to keep Aura consistently running on everything from PHP 5.4 up through PHP 7, without me having to maintain each version locally. It’s a fantastic service. Scrutinizer-CI is something I was introduced to last year, and it too has been a great aid to my work. Having an automated review and a measurable score helps me to focus my attention on parts of the code I know are not great, but have ignored because I’ve been too close to them. The dispassionate review discipline it provides is very useful.
I started using a Gaiam balance-ball chair after beginning my strength-training workouts several years ago. My lower-back flexibility was terrible, and it really showed in my poor barbell squat form. Using the Gaiam has helped immensely.
I have a couple of internet radio stations for my soundtrack: Groove Salad and Low Mercury, along with a custom collection of music in similar genres. They’re good for helping me to maintain focus and stay in my seat, instead of getting up and walking around aimlessly while pondering.
What are your favorite books about development?
My number-one most favorite of all time is The Mythical Man Month by Frederick P. Brooks. I was introduced to it by my Systems Analysis professor, to whom I owe unending gratitude, during my post-military pass through college. That book was written in 1974, and aside from the parts about COBOL, every single bit of it is still true, because human beings have not changed. I expect it to remain true until the Singularity comes (and maybe even after that) for the same reason.
After that, in no particular order:
- Peopleware by DeMarco and Lister helped me think more clearly about programming management practices.
- The Inmates Are Running The Asylum by Cooper convinced me that I, as a developer, should never be allowed to do design work. Conveniently, this suits my temperment.
- Patterns of Enterprise Application Architecture by Fowler et al., not because it teaches new techniques, but because it gives us a common vocabulary to use when talking about those techniques.
- The Pragmatic Programmer by Hunt and Thomas, and Code Complete by McConnell, are great fundamental works.
- Clean Code by Martin is a fantastic capstone work.
- How To Be A Programmer by Robert L. Read is a tour de force: personal and practical, insightful and inspiring, it is sadly unread and unknown by the vast majority of programmers I have met.
What technologies are you currently trying out?
I’d really like an excuse to try out the document-oriented JSON stores in PostgreSQL as an object database. It looks like a really great integration of document features with SQL features. Getting my hands on a Redis installation would be cool, but very little of what I’ve done has actually needed Redis.
But technologies, per se, are not what really get me going. I like new techniques, and alternative ways of thinking about existing problems that present more elegant or better-separated ways of solving them. That’s one reason I felt so excited about identifying Action-Domain-Responder as a web-specific alternative to MVC. Domain-driven design is another technique that really interests me, and while I’m not very good at it yet, I’d like an excuse to practice it more.
When not coding, what do you like to do?
I’ve mentioned the gym workouts, which I like much more than I expected to. Barbell training requires a lot of attention to good form, and I find that concentration very rewarding. It’s also a big morale boost to have a physical marker of progress; when you add more weight to the bar each time, you can point to it and see it in the real world. It’s not ephemeral and transitory like code.
I enjoy doing pistol and rifle work as well, although where I live now that’s a little more difficult to do. It’s very satisfying to line up a shot at a steel target 400 yards away, finish the squeeze on a two-stage trigger, hear the loud “BANG” of the round being fired, then wait through that long moment of silence before the “smack” of the bullet hitting steel comes back to you from across the range. I’m not as consistent as I would like to be, but when it all flows together, it’s beautiful.
What advice would you give to a younger version of yourself starting out in development?
You consider your mental and intellectual talents as the center of your identity because they come easily to you. You hold in contempt things like social success because they do not come easily to you, but does to others who are not as smart as you. The fact that those others are not as smart, makes you think their social success is of little value in the world. You are wrong. You will be much happier when you use your intellect to retrain yourself into successful social behaviors.
On hearing that, you will think doing so somehow makes you “untrue to yourself.” This too is a mistake. There are many aspects to your personality. You choose which ones to promote, and which ones to restrain. All of them are “yourself.” Your social powers are atrophied and need exercise for them to become stronger. You will become *more* like your true self, not less, by exercising them.
Even so, don’t bother too much with that until you get out of high school. Government schools are prison. You have felt this since childhood but never had the words for it. Nothing that happens there will really matter to you later. What matters is you getting out of it.
Going to college does not count as getting out of it. As a young man, what you need is true self-sufficiency, discipline, and “finishing.” You need something that doesn’t care about your precious little ego, your false sense of self. Join the Air Force out of high school, instead of going to college for 18 months and wasting your time and money by not attending your classes (and then joining anyway from financial pressure). The military experience will burn away all the narrow trivial incidentals of your ego that you think are so important. It will immerse you in a broader world, and leave a strong, resilient, core of “you” focused on larger, better, more important things in life.
Restrain your workaholism. It is too inwardly-focused, too indulgent of your desire to avoid social situations, and is another exhibition of your intellect as the center of your identity. Yes, you are an intravert, and replenish your energy from being alone. But that need not prevent you from expanding your identity and scope of action in the social world. Apply that intellect and work ethic to training yourself in how to be socially successful; there are great joys to be had there.
“Socially successful” does not mean “with other people just like you.” It especially does not mean “with your favorite role-playing group of friends.” It does mean, in particular, becoming successful with attractive women. When you can do that, you can be socially successful with anyone. You think there are only a few women in the world who might like you because in the past you have been so unsuccessful. Your lack of success is because you have internalized well-meaning but false premises from contemporary culture. There is a vast abundance of women who are now, and will later be, made happy by “you being you” — the “you” that is charming, effusive, teasing, outcome-independent, and interaction-oriented, instead of restrained, deferential, passive, and overly polite. You will need to exercise these more outgoing parts of your personality so they can become strong. Get a copy of The Game by Neil Strauss to learn how, and go from there. It will jolt some of your prized sensibilities; they need to be jolted.
“But what about programming?” you ask. Younger Me, you’re going to be good at that no matter what. It comes so easily to you. You don’t need advice there. Instead, put effort and practice into the things that do not come so easily to you. When you succeed at those, you will be more satisfied with your life as a whole, in addition to the satisfaction you will gain from your profession.
With fondest hopes for our future,
Thanks to Paul for taking the time to speak with us. Have someone you’d like to be a guest? Let us know @FogCreek.
Recent dev.life Interviews