Extensible Design vs. Solid Design
One of the things that originally attracted me to the world of Linux was the flexibility in configurations for almost everything. I liked being able to make changes to every little aspect of all of my applications. One of the things that was recently brought up to me was that extensible configuration would never make up for poor design choices.
I have been thinking about this one a good deal recently, and I think I’m going to have to agree that there are limits to how far configurations should be able to impact software. The examples that keep coming to mind are some of the suckless tools. dwm is probably my favorite tiling window manager for X environments. One of the things that originally turned me off about it was that in order to change the color of anything in it or to adjust keybinds, you had to recompile the entire program. It’s not that it’s difficult to do, but it just seemed like a great deal of trouble for something so minor.
After using it for a while, I came to really appreciate the fact that when it started up, it was simply loading the binary. There’s something “pure” about not having to source an external configuration file to make a program work. It’s a very clean answer, and it’s not being controlled from files scattered throughout the entire directory structure.
On the flip side of this is my love for emacs. It is one of the most customization-friendly editors ever written. I have a pretty extreme set of personal files that it sources on start-up. If I don’t like something, I’m always glad to be able to try a few different lisp routines to see what the effects will end up being before I commit the changes to the init files.
Since having really taken the time to think about what the “best of all possible worlds” is, I’ve just about determined that for me it comes down to being application specific. There are some places that I want flexibility, and other places where I’m looking for simple executions. I’m not 100% sure that there is a “correct answer” to what the best choice for programmers would be. It stands to reason that if you’ve accomplished programming perfection, that there’s no reason to need any customized options. Still, the end user may not always agree with your decisions in design. I certainly wouldn’t want to force my web-browser’s bookmarks on everyone.
To quote the Zen of Python:
There should be one-- and preferably only one --obvious way to do it.
I’m not sure that I totally agree with this as a general principal for everything, but the world is much simpler when there is an accepted solution to a problem. Simplicity leads to understanding, and understanding leads to advancements. Perhaps what we’re all looking for is that perfect balance of freedom and simplicity. I’m still searching for it.