12 Jan 2006
•
Software Development
I have never really been drawn to the Mac the way many of my peers seem to be. I am very happy with Ubuntu and could really not see any reason why I would move off of such a nice platform.
My boss, Donald MarinoDonnie is a card carrying koolaid drinker, by which I mean he has a mac.com email address., had other plans, and has ordered PowerBooksThe old G4 machines, not the new MacBooks. for all the developers where we work. Donnie did offer to let me keep my Linux box but after throwing my back out lugging my Dell XPSI inherited this box from a previous employee. It is very fast, has a great screen (though the reflectivity is annoying most of the time) and an arbitrarily large hard drive. Unfortunately, it weighs as much as the desktop for which it is a replacement. back and forth to work a few times I decided to try this Mac thing. At the very least it will hurt my back less.
I find my self a little sad to leave Linux, even though my new machine will probably not arrive for weeks. I am consoling myself with the fact that I will have a nice BSD machine underneath the slightly garish GUI. I really have no doubt that I will find the Mac a fine place to work, once I get use to it. Many people that I respect claim that the Mac is a great place to develop software. But I still feel a bit like lemming.
20 Dec 2005
•
Software Development
I finally upgraded to Firefox 1.5 yesterday. I had been holding out for an Ubuntu[Ubuntu Linux](http://www.ubuntulinux.org/) completely rules, BTW. Everything I have tried has just worked. (Well, except for dual monitors but that is a different story.) package, because the reviews have been pretty mixedI would provide some links but I cannot figure out how to get NewsGator to search the posts I have already read.. I was forced to upgrade because I needed to write a Greasemonkey script to improve the usability of NewsGator OnlineThose who design web pages that render the primary content in a smaller font than the default will be _first_ up against the wall when the revolution comes. I have my fonts setup the way I do for a reason, please respect that. and the Greasemonkey site says that if you use Greasemonkey with Firefox 1.0.7 you will be instantly 0wn3d and your children will be sold into slavery.
No big deal. I can figure out how to upgrade by hand. Everything went well and now I have a shiny new Firefox on my box. Firefox 1.5 seems a little nicer but the differences to the user do seem pretty marginal. It is faster but that is about the only noticeable improvement. The configuration dialog is completely different but not really better or worse than the old one. However, multiple profile support is completely broken, as far as I can tell, which is very annoying because I used that feature quite heavily.
I havePerhaps I should say had, but I am hoping that the lazyweb can help me fix this problem. three Firefox profiles. My default profile is the one I use for normal browsing, reading my aggregator and blogging. I have another profile that I use for web development. This profile has lots of extensions installed to support web development, and it’s home page is the dev instance of the application on which I am currently working. The third profile is the one I use for looking at documentation. It has several homepages, all of which are online documentation.
In a normal day I run three instances of Firefox, one for each profile. But with Firefox 1.5 apparently you cannot run multiple instances of Firefox at all. If you start Firefox with the default profile and then execute firefox -P webdev you get another window in the default profile, rather than a new instance of firefox running the web development profile. The profiles all work if they are the only firefox process running. For example, if there is no firefox process running I can execute firefox -P webdev and I get Firefox 1.5 with my web development profile.
So my upgrade was pretty much a wash. I can read my subscriptions without my eyes hurting but I have to install a bunch of extensions in my default profile and change the way I work. It is just annoying.
17 Dec 2005
•
Personal
Christmas is around the corner, and with Christmas comes the pop culture icon Santa Claus, which raises some serious issues for me. Elliot is two this year, which makes it the first time he really understands Christmas. Already Elliot knows who Santa is. This does not bother me, in itself. The idea of Santa is deeply embedded in our culture and Elliot should be aware of the idea. The problem is that Elliot does not know that Santa is not real.
I try not to lie.Of course, I do lie all the time because not doing so would devastate the other person and the lie does little damage. But it makes me feel wrong when I do that. I do try to only ask questions for which I really want to know the answer so that others are not put in that position. I try even harder not to mislead Elliot, even when it would be more convenient. This causes my dilemma, I know that Santa is not real. How can I let Elliot believe that there really is a Santa? How can I not let Elliot believe that there really is a Santa?
The idea of Santa a nice one. Some guy you have never meet comes to your house and leaves presents, no strings attached. The idea adds a bit of magic to Christmas. Also, there is something amazingly innocent about believing in Santa and innocence is something we value in our children. On the other hand, I believe that Christmas is magical because the people near you make it so. In some ways, off-loading the magic on to some fantasy creature trivializes the spirit of Christmas.
Which still leaves me with my dilemma. How do I reconcile my desire to not mislead my children with my desire to have them fit in with the culture around them?
12 Dec 2005
•
Software Development
In the humane vs inhumane… err, I mean “minimal”… interface debatesJoey DeVilla has done a pretty nice [summary](http://farm.tucows.com/blog/_archives/2005/12/9/1443435.html) of the discussion. synonyms don’t seem to get much respect. You would expect this from the minimalist crowd but many otherwise humane people seem to have little regard for method aliases. Here are a couple of examples.
Charles Miller
Having two otherwise equivalent ways to perform the same operation is bad user-interface design, and it’s bad library interface design, because the existence of the synonyms actually adds to your cognitive load by making you choose between them.
Joey DeVilla
I do have one complaint about the Ruby approach — method aliases. While it’s convenient for luring in programmers from other languages, I think it actually detracts from code readability to have two method names mean the same thing.
I think that synonyms are a valuable tool. Even if Charles Miller is correct that having multiple names for a method “adds to your cognitive load by making you choose between them” I still think that method aliases are great.
Any given piece of code is likely to be read a lot more than it will be written so it is far more important to optimize the reading of the code than the writing of the code. The fact that it takes the original author an extra tenth of a second to decide between length and size does not really concern me because every time I read the code and see that they choose size it indicates that the Array I am looking at is being treated more like a set or bag than an ordered list. Expressing the intent of the code effectively is worth the slight additional cognitive load for the original author.
I would argue that synonyms reduce the overall complexity. From an interface consumers point of view an alias is just another behavior of the interface, the fact that it is exactly the same as some other method is an implementation detail that should be of little or no interest. From the interface producers point of view they are an efficient and low cost way to provide a nuanced variety of similar behaviors. Humans are well suited to handling multiple words with similar meanings. No one argues that we should rid english of it’s synonyms, because while synonyms increase the number of words one must know they also increase the expressiveness of the language
If you think of method aliasing as an implementation detail to make the implementation of certain methods less costly (and that is exactly how you should think about it), the argument against method aliases sounds pretty much like the argument for minimal interfaces. That the clients don’t really need those extra methods because they can affect the same outcome using a more limited set of behaviors. While this is true it misses the point. Programming is, first and foremost, about is about expressing the intent of a program to other humans, not performing a mathematical reduction. Humane interfaces allow interface consumers to be written in a more expressive and intentional way.
{Update: Fixed main link to point to Martin Fowler’s bliki page like I had meant to do the first time.}
07 Dec 2005
•
Software Development
Martin Fowler has posted a nice article on humane interface design (as opposed to minimal interface design). I am definitely on the side of right and good (read: humane interfaces) in this debate. Nothing takes the fun out of programming faster than having to write a bit of code that you know has already been written a bazillion times.Even if it is only a few lines code. When I program in Java, which exemplifies the minimal interface approach, I feel like this most of the time. I almost never feel that way in Ruby because humane interfaces are deeply ingrained in the community.
Minimal interfaces shift the maintenance burden to the clients. This is great for the library writer because they have less to maintain, but it is devastating for the community. Humane interfaces have the extra behavior because clients need them.It is rarely, if ever, appropriate to provide behavior that no one needs, regardless of the interface style style. The fact that a minimal interface does not provide an particular bit of behavior does not change the fact that clients need that behavior, it just means that that bit of behavior will be implemented independently in a significant subset of clients. This duplication of common but non-standard behaviors will, over time, significantly increase the total amount of code that a community has to maintain.
This is made worse by the fact that a well designed minimal interface requires fairly small amounts of addition code to implement each individual bit of common behavior. The fact that each of these common behaviors can be implemented quite easily means that they rarely get packaged and reused. For example, you are probably not going to add a dependency to Jakarta Commons IO to your project just to get RegexFilenameFilter, you will just implement it yourself because “it’s only 5-10 lines of code” even though someone has already packaged it for you. And you are definitely not going to package and publish that useful 10-15 line utility you wrote last week because cost far outweighs the value of that one utility. Each of those decisions are reasonable in isolation but put together pretty soon you and your community are stuck with a lot more code to maintain than if that behavior had been included in the core library to start with. (See: boiled frog syndrome)