Loading
0 comments

Great software is worth paying for

The open source software development model has been a revolution, a sweeping tide of change and innovation that has lifted and invigorated this industry while seeming that it ought to be antagonistic to it. It is private industry for the most part that provides programmers with salaries, and giving things away for free is almost certainly going to take revenue away from some, right?

Strangely, wonderfully, the opposite is true; the technology industry is booming, populated by a veritable Cambrian explosion of entrepreneurs, innovators, makers and dreamers who are enabled by free and open-source software. Even those of us who work primarily within private industry, contributing few or none of our work products back to the community still benefit enormously from the vibrant, competitive, changing ecosystem that surrounds us.

Still, when you embrace open-source software and start using it on a daily basis, it's perfectly obvious that a great deal of it lacks a certain something. Call it usability, or perhaps the correct word is beauty. Grace? Elegance? Polish? It's hard to pin down exactly what it is, but something is missing oftentimes. Look at the software that comes with your very-much-not free Macintosh, and it you'll ...

read more
0 comments

A custom iterator pattern for Go

I have been working on a substantial web application that will be deployed on Google AppEngine’s Go runtime. Learning and programming in Go has been a very rewarding experience. It is a terrific language. I feel enormously productive with it, and it’s easy to keep the whole thing in my head at one time. It is not without its foibles and hills to climb, of course. All languages have quirks and intentional design decisions that one runs up against.


In my case, I found myself needing to create a custom iterator for a type that I had created. My custom type Foo was commonly found in collections, and it is easy enough in Go to make a slice of any type: []Foo. I was able to iterate over the collections easily with Go’s range. I was all set.


Before long, I found myself needing to add a function that would take my []Foo as a receiver, but Go does not allow me to have a slice of anything as the receiver in a function definition:


func (this []Foo) Gronk() int {} // not allowed!


I needed to declare a type for my slice:


type FooList []Foo


I can now ...

read more
0 comments

Investing in a Community

When I discovered Usenet in 1986, I fell in love immediately. It was fascinating to have access to so many people in so many places with so many different perspectives and experiences. It was a vast bank of knowledge that was as receptive to questions as the main computer on Star Trek. It was full of creators, fecund and unpredictable. It was bizarre and entertaining, and in many cases, a community. Even when it sank into legendary flame wars and jackassery, it was a community, and that is fundamentally why it was so addictive.


Over the years, I became less-and-less of a presence there, drawn elsewhere by the changing priorities that come with age, career and the emergence of new technologies, but I never forgot that feeling of membership in even the most anarchic of groups that was Usenet.


It wasn’t until I started visiting StackOverflow in 2009 that I found as compelling an experience. I originally came across it while using Google to find an answer to a tricky programming problem. In addition to getting a solution to my pressing issue, I found that my experience with AppEngine allowed me to contribute rather quickly, and I got sucked ...

read more