Engineers hate estimating things.
One of the most-often quoted lines about estimation is “Hofstadter’s Law”, which goes:
Hofstadter’s Law: It always takes longer than you expect, even when you take into account Hofstadter’s Law.
If you want to deliver inaccurate information to your team on a regular basis, give them a 3-month-out product development timeline every week. This is a truism at every company at which I have worked over a varied career in software.
So, estimation is inaccurate. Now what?
Why do we need a product delivery schedule if it’s always wrong?
There is an answer to this question, too:
Realistic schedules are the key to creating good software. It forces you to do the best features first and allows you to make the right decisions about what to build. [Good schedules] make your product better, delight your customers, and — best of all — let you go home at five o’clock every day.
This quote comes from Joel Spolsky.
So, planning and estimation isn’t so much about accuracy, it’s about constraints.
Continue reading Software planning for skeptics
I am a longtime Thinkpad and Lenovo user as my preferred laptop for Linux computing and programming.
The Lenovo X1C 2016 4th Generation Model is my latest Linux laptop
For some context, I’ve been running Linux on my desktop and laptop machines since ~2001, and started using Thinkpads in this role starting with the famous Thinkpad T40 (2003), one of the first laptops that provided good Linux support, a rugged design, portability, power, and an excellent keyboard.
I then moved through a few different Lenovo models: the T400 (2008), the T420s (2011), and the X220 (2011).
I spent a couple of short stints in-between — which I always regretted — on other PC laptop models, including HP and Asus. I upgraded from the T420s to the X220 after coming to the realization that portability and power consumption mattered more to me than the 14″ form factor, and that I could easily expand the X220’s limited hard drive with a 512 GiB SSD.
Since 2013 or so, the X220 has been my main programming/Linux machine. The X220 was my favorite Thinkpad model of all time, despite some flaws. I’ll discuss my Linux desktop experience with the X220 briefly, and then go on to my experience with my current model, the Lenovo X1 Carbon 2016 model (4th Generation).
Continue reading Lenovo and the new Linux desktop experience
Michael O. Church wrote an essay awhile back called “Why programmers can’t make any money.” The post is no longer on his website — for some strange reason — but you can have a look at the archived version here.
If you don’t wish to read his post, this quote will give you the summary.
When the market favors it, junior engineers can be well-paid. But the artificial scarcities of closed allocation and employer hypocrisy force us into unreasonable specialization and division, making it difficult for senior engineers to advance. Engineers who add 10 times as much business value as their juniors are lucky to earn 25 percent more; they, as The Business argues, should consider themselves fortunate…!
I empathize with his thoughts, but I have struggled — for years, now — to understand the author’s conclusion.
If we want to fix this, we need to step up and manage our own affairs. We need to call “bullshit” on the hypocrisy of The Business, which demands specialization in hiring but refuses to respect it internally. We need to inflict […] artificial scarcity.
I decided to (finally) publish this response today because I have seen artificial scarcity play out in another industry; my wife is a medical doctor in the US. Are we to believe that programmers should establish artificial scarcity in the same way that doctors have — with political organizations like the American Medical Association and credentialing via something equivalent to medical school and board certification?
Continue reading The value of money in a technology career
Apple just announced that the headphone jack is going the way of the dodo, but as programmers, we know better. The headphone jack is our reprieve from cantankerous office banter, our salvation from your office mate’s obsession with cat videos, and our gateway to productive coding flow.
For those of us who still believe in the simplicity and beauty of the good old auxilliary audio input, here are three headphone options that I’ve field tested extensively and can vouch for quality and convenience.
Continue reading The 3 best headphone options for programmers
Can pair programming be done in a way that is compatible with async communication?
Pair programming is described by the original c2 wiki as a process in which “two engineers participate in one development effort at one workstation”. It would seem the process is inherently synchronous, at least as originally described and practiced.
I experimented with pair programming at my first industrial programming job at Morgan Stanley. It was 2006-2008 and two fads were happening in parallel: “agile” software management techniques and “extreme programming”, with a particular emphasis on test-driven development with Java.
I occasionally found pair programming to be effective, but noticed my results varied wildly depending on the engineer I paired with and the problem we worked on. Some people really enjoyed the “brain swarming” of having two heads attack a problem. Other people found it cumbersome and interruptive. Some problems seemed so indivisible that it always ended up that one person drove, and the other person merely watched. In the end, I couldn’t really say whether I benefited from it, despite many hours of experimentation.
Continue reading An async kind of pair programming
Data engineers should abstract their code in the most lightweight way possible to facilitate downstream integration in a large-scale data system.
You want lego blocks, not puzzle pieces.
The creators of the C programming language once famously said, “first make it work, then make it right, and, finally, make it fast.” This adage still applies today.
The difference is, we have tools to take working code and validate that it is right against reams of data. Many of these tools can also be used to make the working, right code run really fast across a cluster of machines, possibly even in real-time, as the data comes in.
But, making code work, then right, then fast, requires some discipline.
Continue reading Simple Lego Blocks for Big Data
Let’s say you’ve just joined my team and want to become an idiomatic Python programmer. Where do you begin?
Well, you can move up the learning curve quickly using resources from this blog:
I also have some good resources on web development with Python:
And on more advanced Python concepts, like dunders and functional programming:
Continue reading Idiomatic Python Resources
I read the Bloomberg piece, What Is Code?, an explanation of code artistry and programmer/hacker culture in 2015. I love this paragraph about “languages as liquid infrastructure”:
The point is that things are fluid in the world of programming, fluid in a way that other industries don’t seem to be. Languages are liquid infrastructure. You download a few programs and, whoa, suddenly you have a working Clojure environment. Which is actually the Java Runtime Environment. You grab an old PC that’s outlived its usefulness, put Linux on it, and suddenly you have a powerful Web server. Now you can participate in whole new cultures. There are meetups, gatherings, conferences, blogs, and people chatting on Twitter. And you are welcomed. They are glad for the new blood.
Java was supposed to supplant C and run on smart jewelry. Now it runs application servers, hosts Lisplike languages, and is the core language of the Android operating system. It runs on billions of things. It won. C and C++, which it was designed to supplant, also won. A lot of things keep winning because computers keep getting more plentiful. It’s weird.
Worse is better, is worse, is better, is worse, is better…
Python is the core programming language used at Parse.ly. It also happens to be a quickly-growing language with wide adoption among open source projects. It’s no wonder it’s quickly becoming the leading language for software teams.
I’ve written a couple of blog posts with original material for learning Python, including “import this: learning the Zen of Python with code and slides” and “Build a web app fast”.
Newcomers to Python are often overwhelmed by the wealth of information, available online and in print, for the language. I am often asked by others, “What are the best books for my Python team?” I plan to answer that question with this post, by highlighting what I consider to be the three best Python books on the market today.
Continue reading The 3 Best Python Books for Your Team
I realize now that one of the hardest parts of running a successful startup is “betting” on tech stacks that, 3 years out, will have a groundswell of community support around them.
It’s still shocking to me that when I chose each of the following technologies as a central part of Parse.ly, they were so new/immature as to not even show up on a Google search trends box, but are now very popular technologies.
Continue reading Picking tech stacks