Last Day at CFP Board

Today is my last day at CFP Board. That means that this is my last day working with RoR professionally, for a while at least, and that makes me a little sad.

RoR is a sweet piece of work. It is a platform on which a developer can be enormously productive. For example, I fixed three minor bugs before lunch today. By fixed I mean I analyzed the issue, implemented a test, implemented the change, and deployed the new version into production. I have not worked with any other system that supported that kind of velocity with any level of confidence. The dynamic nature of Ruby and Rails allows you to move amazing fast and the tight integration of testing into RoR allow you to do so without having to compromise the quality of the system.

Velocity is like a drug, the more you have the more you want. I have been super productive the last couple of weeks and everyday I wanted just a little more. Over the long run the pace I have had the last couple of weeks is not sustainableAt some point I will remember I have over 2000 unread items in my aggregator and before I know it whole days will be spent just learning stuff. Useful to be sure but it does not have the same umph as writing a boat load code., but damn it feels good while it lasts.

Life in Progress

Things have been a little quiet around here lately because my life has gotten a little busy.

We close on our new house on Friday and we close on our current house the middle of next month. Fortunately, that gives us a couple of weeks to move. The new house is a bit less characterful than we had hoped we would find but it is a great house for us. It is quite a bit larger than our current house. It has a nice backyard, not too big and not too small, and it is just around the corner from a park.

I have accepted a position with WebRoot Software. I have been looking since my current job changed. My new job is not a Rails job (yet) but it is both user facing and data oriented web applications. So my strong opinions about web application architecture and dynamic languages will serve me well. The downside of taking a new job is that there are a few loose ends at CFP Board that I need to finish off so that I can leave with a clean conscience, which means I am even more busy than usual.

I am really excited about the opportunity at WebRoot. The thing I am most excited about, though, is that at WebRoot I will be surrounded by people who live and breath software. CFP Board was nice because the technology we where using but after Donnie left we never had the sort of thought provoking discussions about software that I became accustom to while working for software companies.

Imaginative Play

The other day Elliot and I were at the dinosaur play area at FlatIron Crossing Mall1 and Elliot started playing imaginary ball. He grabbed my hand and pulled me 6 or so feet and pointed at the empty floor and said, “the ball is right there.” It took a couple of tries on his part because his enunciation was not very good2 and with no context I just did not understand him at first.

After I figure out there was an imaginary ball we had a great time playing race-ball. Race-ball is our favorite ball game it goes something like this. Someone throws, or kicks, the ball and then we race each other to where the ball lands. Whoever gets to the ball first gets to throw the ball next. Repeat until the youngest player gets distracted.

That was the first time I had seen Elliot engage in imaginative play but since then imaginative play, of various sorts, has become quite common.


  1. That malls have started using camel case might well be a sign that the end is nigh. Camel case is obviously contagious and is, therefore, an evil to be avoided at all costs.

    </li>

  2. Since then he has had ear tubes installed and his enunciation has improve rapidly since then. I am almost always able to understand him now, even in situations where there is very little context available.

    </li> </ol> </div>

JavaScript Is Sweet

While reading Oliver Steele’s article on JavaScript Memoization this bit jumped out at me.


function Angle(radians) {this.setRadians(radians)}
Angle.prototype.setRadians = function(radians) {
  this.radians = radians;
  this.getDegrees.reset();
};
Angle.prototype.getDegrees = function() {
  return this.radians * 180 / Math.PI;
}
memoizeConstantMethod(Angle.prototype, 'getDegrees'); 

The reason that jumped out is that getDegrees is a function that returns a number, but in the above code you see this this.getDegrees.reset(). In other languages that would require a reset method on number objects, but not in JavaScript. In JavaScript methods are objects and, therefore, can have methods of their own1. This allows you to get the effect of high-order messaging without all the fuss.


  1. Is that the exact semantics that allows this functionality in JavaScript?

    </li> </ol> </div>

Wikipedia Magik

I am regularly amazed by what ends up on the Internet. Today’s example is this Wikipedia article about the Magik programming language.Via \[Charlie Savage\](http://cfis.savagexi.com) Magik is a proprietary language developed by a company call Smallworld, which was later acquired by GE. I worked in the Magik programming language for six years and it is easily the second best language I have ever worked with professionally (Ruby is the best language I have worked with). I am just amazed that it has a Wikipedia page.