From enthusiast to user

My friend Sandro read this Slate piece yesterday and wrote this blog entry in part about enthusiasts and users.  I think his concern that today’s computer science students seem to be more users than enthusiasts is very legitimate, since they’re some of the people we’re counting on for the next advances in the field of computing and innovative new products.  The similarity he sees between advances in automobiles and computing is an interesting one.  I agree with him up to a point about commoditization, but I see real benefits to certain things becoming commodities.  He touches only briefly on case mods in the PC space, but commodity hardware (RAM, hard drives, video cards, etc) has made it a lot easier for the technically-inclined to build entire PCs themselves, instead of buying whatever Dell or HP is selling this week.  Commodity hardware and operating systems are what enable a product like TiVo to exist (along with less-capable imitators).  We have commodity hardware to thank for the XBox 360, and commodity operating systems to thank for XBMC.  This doesn’t mean that a ton of people will avail themselves of the option to build their own PC, or their own home theater PC, just that the option is definitely out there for those who want to.

I suspect it has always been the case that the vast majority of people would rather use something cool than build it.  As much as those of us in the U.S. love cars, very few of us will be building our own Rally Fighter anytime soon.  I enjoy photography as a hobby, but I haven’t been in a darkroom to develop my own film in years (nor did I ever spend enough time in one to get really good at the process).  At least with computers, there came a point for me where fiddling around inside the guts of a computer to get something working again got to be too much of a hassle.  This could mean I’m gotten lazy, but I really like it when things just work.  There’s definitely something to be said for having the ability to fix something or hack it to do something beyond its original purpose.  I’ve always admired people like that, and I think they’re responsible for a lot of the great advances we benefit from today.

I think human nature is such that we won’t run out of enthusiasts anytime soon.  As long as there are magazines like MAKE and sites like iFixit, enthusiasts will continue to do things that make users jealous.

Adventures in e-commerce

I’m working on an e-commerce site for the first time in about 10 years.  The site is Trés Spa, a skin care products company in northern California.  Unlike my previous forays into e-commerce, none of the technologies I’m using come from Microsoft.  I’m using the community edition of Magento.  So far, I’ve been able to update the configuration so that USPS shipping options show up in shipping and tax estimates.  I haven’t had to write any code yet, but we’ll see if that changes.  Despite running WordPress for awhile, I’ve done very little with PHP.

Figuring Out Google Wave

I recently received an invite to Google Wave (thanks Rory).  From the few minutes I’ve played with it so far, it seems to be Google’s next offering in collaboration (Google Docs is probably their first).  I’ve still got some spare invites, so send me an e-mail if you’re interested in trying it out.

One of my bosses from a previous company came across a couple of links that explain Google Wave:

http://lifehacker.com/5272048/google-wave-is-what-email-would-look-like-if-it-were-invented-today

http://lifehacker.com/5395376/the-complete-guide-to-google-wave-is-a-comprehensive-book-on-wave

I’ll probably be checking these out when I have time (if I’m not distracted by other “oooo shiny” toys, or life in general).

StackOverflow Dev Days DC

In this case, DC = Falls Church, VA.  I went to the State Theatre to attend this conference.  Considering the cost ($99/person), the conference turned out to be a great value.  I wrote up a conference report to share with my bosses and co-workers and it’s included below.  It has footnotes because I typed it up in Word 2007 and pasted it in here with very little editing (because after all this writing, I’m feeling a bit lazy).

Summary
The main reasons the creators of stackoverflow.com came up with this conference include the following:

  1. Bring together developers that are part of the Stack Overflow community[1]
  2. Teach developers something outside their immediate field[2]
  3. Accomplish 1 & 2 at low cost[3]

A fourth reason I would add is to pitch FogBugz 7.  It’s the primary product offering of Fogcreek Software, so it would have been odd for a conference it supports to not do at least a little advertising.  Spolsky also attempted to divide the venue by area for networking around certain topics, but I’m not sure how successful that was.

The conference succeeded in its main objectives.  At $99 per person, this conference was a bargain.  Given the diversity of topics and caliber of speakers, the price could have been higher and the venue would still have sold out.  Of the seven official topics presented (there was an eighth on Agile after the conference ended), only the ASP.NET MVC talk used technology that I had hands-on production experience with.  I was disappointed not to see a presentation on Android, but that was the only thing obviously missing from the day.

Keynote: Joel Spolsky
If I were to boil down Joel Spolsky’s keynote to a single phrase, it would be this:

“Death to the dialog box!”

Spolsky’s talk argued persuasively that software often forces users to make decisions about things they don’t care about, or don’t know enough about to answer correctly.  Among his examples were modal dialog boxes for products like QuickBooks and Internet Explorer, and the Windows Vista Start button.  He talked about the other extreme (overly simple applications) as well, using the “build less” design philosophy of the 37signals team as an example.[4] Equating those kinds of applications with Notepad was a reach (and clearly played for laughs), but described the limitations of the alternative to complex applications pretty well.  The examples did a good job of setting up the choice between simplicity and power.

He cited an experiment in the selection of jam from The Paradox of Choice: Why More Is Less[5] to show the potential drawbacks of too many choices.  When the results of this experiment showed that a display with fewer choices resulted in an order of magnitude more sales of jam, it put a monetary value on the design decision to limit choices.

Predictably, his examples of the right kind of design were products from Apple.  It takes a lot more effort to put a Nokia E71 in vibrate mode than it does an iPhone.  Spolsky pointed to the iPod’s lack of buttons for Stop and Power as examples of addition by subtraction.  The best example he chose was actually Amazon’s 1-Click shipping.  In addition to offering the most reasoned defense I’ve heard yet of Amazon winning that patent, he explained how it works for multiple purchases.

A few other takeaways from the Spolsky’s keynote that I’ve tried to capture as close to verbatim as possible are:

  • The computer shouldn’t set the agenda.
  • Bad features interrupt users.
  • Don’t give users choices they don’t care about.

iPhone Development: Dan Pilone
This talk successfully combined technical depth on iPhone development with information about business models for actually selling an app once it’s complete.  Pilone discussed which design patterns to use (MVC, DataSource, Delegate) as well as what paid applications are selling for in the App Store (the highest-grossing ones sell for between $4.99 and $9.99).

One of the most useful parts of the talk was about the approval process.  He gave his own experience of getting applications through the submission process, including one that was rejected and the reasons why.  According to him, 2 weeks is average time it takes Apple to accept or reject an application.  It’s even possible for upgrades of a previously-accepted app to be rejected.

Pilone did a good job of making it clear that quality is what sells applications.  He used the Convert[6] application (from taptaptap) as an example.  It’s just one of over 80 unit converter applications in the App Store, but it’s beating the competition handily.  OmniFocus was his second example.
Revenue Models

  • Ad-supported (very difficult to make money with these)
  • Paid
  • In-app upgrades[7]

Dan Pilone is the co-author of Head First iPhone Development[8], which will be available for sale on October 29.

His recommendation for selling apps in the App Store is to release a paid version first, then an ad-supported version.  This advice seemed counterintuitive to me, but I suspect he suggested it because there’s no data on the in-app upgrades revenue model.  I see in-app upgrades as Apple’s most explicit support for the “freemium”[9] business model yet.

ASP.NET MVC: Scott Allen
This talk was basically a demo of a preview version of ASP.NET MVC 2.  Allen wrote code for his demonstration on-the-fly (with the sort of mistakes that can happen using this approach), so the example was pretty basic.  The takeaways I thought were useful for getting started with the technology were:

  • External projects that add features to ASP.NET MVC
    • MVCContrib
    • MVC T4
    • You can combine standard WebForms and MVC in the same solution—particularly useful if you’re trying to migrate an application from ASP.NET to ASP.NET MVC.  Allen mentioned the blogging platform Subtext[10] as an example of one application attempting this kind of migration.

This talk left a lot to be desired.  StackOverflow is the most robust example of what can be built with ASP.NET MVC.  A peek inside even a small part of actual StackOverflow source using ASP.NET MVC would have made a far more compelling presentation.

FogBugz and Kiln
Even though this was strictly a product pitch, I’ve included it in the report because of how they implement a couple of ideas: plug-in architecture and tagging.

Plug-in architectures as an idea aren’t new—what was different was the motivation Joel Spolsky described for it.  One of his intentions was to make it easier for people to extend the functionality of FogBugz in ways he didn’t want.  He isn’t a fan of custom fields, so instead of building them into the core product, they’re implemented as a plug-in.  He demonstrated Balsamiq integration (via plug-in) as well, so the architecture does enable extension in ways he likes as well.

Tagging isn’t a new idea either—what I found very interesting is how they apply them in FogBugz.  Spolsky pitched them as a substitute for custom workflow.  His idea (as I understood it) was that bugs could be tagged with any items or statuses outside the standard workflow.  There wasn’t much more detail than this, but I think the idea definitely is worth exploring further.

Python: Bruce Eckel
His talk was supposed to be about Python, but Bruce Eckel covered a lot more than that.  The most important takeaways of his talk were these:

  1. In language design, maintaining backward compatibility can cripple a language.
  2. The best programming languages change for the better by not being afraid of breaking backward compatibility.
  3. “Threads are unsustainable.”

Eckel’s talk gave the audience a history of programming languages, as well as a hierarchy of “language goodness”.  For the main languages created after C, the primary motivation for creating them was to fix the problems of its predecessor.  So C++ was an attempt to fix the problems of C, while Java was an attempt to fix C++.  His assertion about the primary motivation behind Ruby was this (I’m paraphrasing):

Ruby intends to combine the best of Smalltalk and the best of Perl.

He made his point about the problems of backward compatibility by comparing an attempt to add closures to Java to language changes made by Ruby and Python.  An article titled “Seeking the Joy in Java” goes into greater detail on the Java side of things.[11] In the case of Java, the desire to maintain backward compatibility often prevents changes to a language which could fix things that are poorly implemented.  The authors of Python and Ruby aren’t afraid to break backward compatibility to make improvements, which makes them better languages than Java (in Eckel’s view).

Here’s Eckel’s hierarchy of programming languages:

Python (his favorite)
Ruby, Scala, Groovy (languages he also likes)
Java
C++
C

Eckel also mentioned Grails as a framework he likes.

Another one of his pronouncements that stood out was a hope that Java would become the COBOL of the 21st century.

Eckel’s argument regarding the difficulty of writing good multithreaded code is one I’ve heard before.  He pointed to Python as a language with libraries for handling both the single processor task-switching and multi-processor parallel execution models of concurrency.

Google App Engine: Jonathan Blocksom
Jonathan Blocksom gave a great overview of Google App Engine.  He’s a member of Google’s Public Sector Project Team (not the App Engine team), and I think that helped him present the information from more of an audience perspective.  He did a nice job of describing the architecture and the advantages of using it.  Some of the applications running on Google App Engine include:

Blocksom also discussed some of the limitations of App Engine:

  • 30-second time limit on asynchronous tasks
  • No full text search

jQuery: Richard D. Worth
This may not have been the best talk for those already familiar with jQuery, but for me (someone unfamiliar with jQuery), it was close to perfect.  The presenter did an excellent job of showing its advantages over regular ECMAScript.  He used a clever trick to minimize the amount of typing during his demos by using slides with only the changed lines highlighted.  The “find things then do stuff” model he explained made it very easy to grasp what he was doing as he increased the complexity of his examples.[12]

Wrap-up

After the conference ended, a “metaStackOverflow” question was added to collect reviews of the conference from its attendees.[13] The top answer (as of October 28, 2009) also includes links to slides for three of the talks, which I’ve included here:


[1] http://blog.stackoverflow.com/2009/05/stack-overflow-developer-days-conference/

[2] Ibid

[3] Ibid

[4] http://gettingreal.37signals.com/toc.php

[5] http://www.amazon.com/gp/product/0060005688

[6] http://taptaptap.com/#convert

[7] This revenue model is brand-new—Apple only began to support this within the past week or so.

[8] http://www.amazon.com/Head-First-iPhone-Development-Applications/dp/0596803540

[9] http://en.wikipedia.org/wiki/Freemium

[10] http://www.subtextproject.com/

[11] http://www.artima.com/weblogs/viewpost.jsp?thread=173229

[12] Worth used http://jsbin.com/ for some of the more complex demos.  It’s a very good tool I hadn’t seen before.

[13] http://meta.stackoverflow.com/questions/27367/devdays-reviews-washington-dc/27377#27377

Adding File Headers Made Easy

One of the things on my plate at work is a macro for adding a file header and footer to all the source files in a Visual Studio solution. The macro I put together from my own implementation, various web sources, and a colleague at work accomplished the goal at one time–but inconsistently. So I’d been exploring other avenues for getting this done when Scott Garland told me about the File Header Text feature of ReSharper. You simply put in the text you want to appear at the top of your source file, add a new Code Cleanup profile, check the Use File Header Text option, then run the new profile on your solution.

The result: if the filename ends in “.cs”, ReSharper will add the value in File Header Text as a comment to the top of the file. It’s even clever enough not to add duplicate text if a file already contains it in its header. So if you need to add copyright notices or any other text to the top of your source code files, and you use ReSharper, you’ve already got what you need.

Snow Leopard: Days 1-2

Thanks to a pre-order from Amazon on August 3, a copy of Snow Leopard arrived on my doorstep August 28. The install was uneventful–typical of Mac OS X installs. I put in the DVD, clicked through a few dialog boxes, went to run a couple of errands. When I got back, I logged in as usual.

So far, I haven’t noticed many differences between Leopard and Snow Leopard.  The few of note:

  • Hard drive space.  Before installing Snow Leopard, I had around 14GB of free space.  After installing Snow Leopard (and the latest version of XCode) I have 27GB of free space.  It’s quite a bit more freed space than the 7GB Apple advertised
  • Printing.  I have a HP LaserJet 1022.  I had to re-install it after upgrading to Snow Leopard and use an Apple driver.  It still works just fine.
  • Battery Status.  Apple added information on battery health.  Since my MacBook Pro is closing in on 3 years old, the “Service Battery” message is most likely correct.  Apple Support already has a thread about it.  Another thing I’ve noticed which may also be new to Snow Leopard is that I’m getting battery life percentages for my Bluetooth keyboard and mouse as well.
  • Character/Keyboard Viewer.  A new widget in the upper-right of the screen.  I haven’t found any particular use for it yet.
  • Mail.  When I first started it, the app prompted me for some sort of upgrade.  Once it was done, the notes from my iPhone showed up under a Reminders item.
  • Quicken.  I’m still using Quicken 2007 for Mac, so I saw a little prompt about Rosetta when I first launched it.  What I really need to do is get out of Quicken 2007 into something else, but that’s a subject for another post.

I can’t say I’ve noticed any speed differences one way or the other so far–but it’s only been a couple of days.

A long overdue upgrade

I’m finally running the latest version of WordPress (I’ve been way behind on upgrading).  I’d be curious to hear from those of you who visit regularly what you think of the new look.  I’d considered a couple others:

I ultimately chose this one for the random post feature that appears in the upper-right of the page.

Introducing Doxygen

Last Wednesday evening, I gave a presentation on Doxygen at RockNUG.  I didn’t actually bother with slides in order to give as much time as possible to actually demonstrating how the tool worked, so this blog post will fill in some of those gaps.

Doxygen is just one of a number of tools that generate documentation from the comments in source code.  In addition to C# “triple-slash” comments, Doxygen can generate documentation from Java, Python, and PHP source.  In addition to HTML, Doxygen can provide documentation in XML, LaTeX, and RTF formats.

Getting up to speed quickly is pretty easy with Doxywizard.  It will walk you through configuring all the necessary values in wizard or expert mode.  When you save the configuration file it generates, the purpose and effect of each setting is thoroughly documented.  One thing I will note that may not be readily apparent is that you can run Doxygen against multiple directories with source code to get a single set of documentation.  It just requires that the value of your input (INPUT) property contain all of those directories (instead of a single one).

Sometimes, I really love the web

I’m at the airport to pick up a couple of friends, just back from a week in Spain. Adam asked me last week if I could pick him and his fiancée up from the airport. Somehow, we didn’t exchange a flight number along with the airport and arrival time, so I had no easy way to see if anything changed. Thanks to the web, this was no problem.

A search for Dulles Airport brought up their website. A search for today’s arrivals from Spain revealed the flight number and scheduled arrival time (which turned out to be about 30 minutes later than Adam and I discussed last week). I put the flight number into flightstats.com, and not only did it give me both segments of the return flight, it updated the scheduled arrival time and provided a near real-time map of their flight as it approached.

So instead of showing up way too early, I got to Dulles just a few minutes before Adam called to let me know they’d landed. I was able to do all that (and write this post) with my iPhone 3G.

Microsoft Gets It Wrong Again

According to this story, there’s no direct upgrade from Windows XP to Windows 7.  Given all the stories of people “downgrading” from Vista to XP, or not upgrading at all, it seemed obvious to me that Microsoft should make upgrading as smooth as possible.  Instead, XP users will have to backup data, re-install programs, and restore data.

Having used the Windows 7 beta on a spare laptop for awhile, I can say it’s a distinct improvement over Vista.  It’s just a shame that Microsoft has decided to make the upgrade experience more difficult for XP users.