Important Blog Posts, Part 2

This is the second part of an ongoing series in which I list blog posts that have profoundly impacted my personal thinking.  The first part is here.

 

1. Joel Spolsky: The Development Abstraction Layer

If you are someone who manages software developers, then your first priority must be to build the development abstraction layer.

Please read this essay.  I'm begging you.

 

2. Steve Yegge: Good Agile, Bad Agile

The inimitable Steve Yegge at his best.  There are so many jewels in this post.  No other blogger can consistently deliver epic posts with such absolute lucidity.

In this post, Steve paints a vivid picture of what it's like inside Google.  He describes how the developers are able to ship excellent products on time without following any particular methodology.

Stevey's ultimate point: be agile, not Agile.

 

3. Joel Spolsky: Human Task Switches Considered Harmful

This is another one of Joel's essential essays that I wish all managers would read.

In past jobs, I've noticed that many managers have little or no understanding of this concept, and have no idea that they are killing their developers' productivity.

Ruby on Rails Shops in Grand Rapids, MI

Updated 1/24/2008


In the spirit of some posts I've done in the past, I've made a list here of all the companies I could find in Grand Rapids using Ruby on Rails.

As you can see, it's slim pickings. Let me know if I've forgotten anyone!

Important Blog Posts

I've been voraciously reading blogs for about two years now, and in that time, I've come across some pretty amazing stuff.

I decided a couple months ago that I really needed to make a list of my all-time favorite blog posts and essays, and share that list with others.  This list would only include things that have profoundly impacted my personal thinking.

Here is the first subset of that list.

 

1. Joel Spolsky: The Law of Leaky Abstractions

This is my favorite thing that Joel Spolsky has ever written.

This essay took on a whole new significance for me when I started learning Web development with ASP.NET.

Even if you know how to drag and drop in the Visual Studio designer, you still must know how to write HTML, CSS, and JavaScript.  Even if you use an object-relational mapper like SubSonic, NHibernate, or even the NuSoft Framework, you still must know SQL.

As a software developer, you'll need to rely on abstractions created by others.  These abstractions will leak, and it will be your job to plug those leaks.

 

2. Paul Graham: Great Hackers

Paul Graham can certainly seem arrogant and full of himself at times, but this classic essay remains a must-read.  Get inside the mind of a great programmer.

 

3. Joel Spolsky: The Joel Test: 12 Steps to Better Code

Just a note to every company I've interviewed with since college: whether you knew it or not, you took the Joel Test. ;)

Perfect Design Is Asymptotic

"Perfect design is asymptotic. You can get infinitely close, but you can never reach it."

- Phil Haack

I thought that was one of the more profound things I'd read (about software) in a while.

Native IntelliSense for SQL Server Management Studio 2008

In case you haven't heard, SQL Server Management Studio 2008 is getting native IntelliSense.

What took so long?

I know that SQL Prompt has been filling this gap for a while, but I've always found it to be buggy and inconsistent.

It's nice to know that we'll finally have first-class IntelliSense when writing T-SQL.

I Can't, in Good Conscience, Ignore TDD for Much Longer

"Over the last twenty years I’ve seen the rise of Structured Programming and Object-Oriented Programming and Message Passing and the Relational Model and those are all good things, but TDD is the single biggest advance in my lifetime. It might (finally) turn software from an amateur’s kitchen to an engineering discipline.

...

If you already know about...TDD and you’re not using it, you should be waking up in the night in a cold sweat, because you’re being less than professional.

...

If you’re a Software Development Manager, ask your engineers if they’re using TDD, and if they’re not, make them start.

And if you’re a CIO, ask your development people if they’re using TDD internally, and if they’re not, go order some copies of Kent Beck’s Test Driven Development: By Example and hand them out and tell them to get with the program. Anything less would be unprofessional."

- Tim Bray, 2004

Notepad++ Tip: Syntax Highlighting for ASP.NET Files

Notepad++ has a spot in my toolbox mostly because I like it as a lightweight viewer/editor for one-off situations where I really don't feel like loading up Visual Studio just to take a quick peek at a file.

When I first started using Notepad++, one of my common usage patterns was to take a quick look at a file that was part of some solution that I did not currently have open in a Visual Studio instance.  I'd just find the file in Windows Explorer, right-click on it, and select "Edit with Notepad++" (which is a context menu addition the Notepad++ installer makes that you'll actually find handy rather than annoying).  No long load time, no fuss.

But one of the things I quickly missed that I would have gotten in Visual Studio was syntax highlighting.  For example, if I opened a Web.config file in Notepad++, I wouldn't get any syntax highlighting, because Notepad++ didn't know that *.config files are really XML.

The solution to my problem lied in a very obscure Notepad++ setting that took me a lot of digging to find.

Here's what you do:

- On the Notepad++ menu bar, click "Settings" -> "Styler Configurator..."

screen1
- Under "Language", select "XML"
- Under "User ext", type in "config".  While we're at it, let's also type in (space delimited) "aspx", "ascx", and "master".
- Click "Save & Close"

That's it!  Now when you view config files, ASP.NET pages, user controls, or master pages in Notepad++, you'll get syntax highlighting.

Gently Chirping Crickets

"Given the level of fierce competition out there now, Microsoft must have some really killer features up their sleeves for Internet Explorer 8, right?

Pretend that I've inserted the sound of gently chirping crickets here."

- Jeff Atwood

Vetting New Technologies

"No, demo applications are not good enough. You need a real project or two to get things rolling. You need to bang your head against a technology. You need to code in anger and swear eternal vengeance against the authors' ancestors nine generations back and three forward."

- Ayende

Brain Food 11-9-2007

I've started reading Head First Object-Oriented Analysis & Design recently, so I've rounded up a few good high-level OO related links today.

The Future and Viability of IronRuby

I'm trying to decide if IronRuby will be important.  More specifically, will it ever be important to my career?

Will IronRuby allow me to sneak Ruby into my day job?

For various reasons that I won't go into, I've given up on trying to work for a company in Grand Rapids that uses Ruby on Rails, at least in the short term.  So I'm firmly seated in .NET Land for the foreseeable future.

Don't get me wrong, C# is a pretty nice language, and is getting more interesting all the time (see the stuff coming out with 3.5).  But, given what I know of Ruby (which, honestly, is not much, but I'm planning to change that), my gut feeling is that Ruby is still a more advanced language than C#.

So just what the hell is Microsoft planning to do with IronRuby?  Will it be "first-class"?  By that I mean: will IronRuby ever ship with Visual Studio?  Will it ever approach the popularity of C# or VB?

What would it take for me to be able to use IronRuby in my day job?  I'm still trying to get a feel for how progressive my employer is, so I really have no idea how likely they'd be to adopt a "new" language.

<TANGENT> I've already gone down this thought-path with some other things, like Test-Driven Development. What would it take to get TDD accepted at my employer?  Or, more to the point, is there any real chance of TDD ever being adopted at my employer?  If TDD is (almost) universally accepted as being a Good Thing, why aren't we doing it?  Scott Hanselman does itPhil Haack does itJeremy Miller does it.  (All .NET guys, BTW)  Why am I not doing it? </TANGENT>

As a pragmatist, I have a really hard time getting excited about things that aren't clearly useful and applicable to my everyday life.  With so many other cool things out there fighting for my limited attention, should IronRuby make the grade?  Is it likely that in the near future, I'll be able to write an MVC web app with IronRuby for a client at my day job?

If any of my readers out there (all three of you), have any thoughts on the viability or future of IronRuby, please chime in.

The Obliterator Pattern

"The Obliterator pattern is a combination of the Iterator pattern, which is useful for walking through a list of objects, and deletion functionality. When applied to any list of objects, it automatically walks the list and deletes all members, then removes the list, the calling function, and the application itself. Variations of the pattern have been known to also destroy the operating system, the computers running the system, the networks on which the pattern is deployed, and the universe in which the pattern exists. Use with care, or at least ask your users to test it for you before declaring the product final."

- Chet Haase

The Ultimate Reference for .NET Regular Expressions

If you're looking for a definitive reference on the regular expression syntax in .NET, here it is:

Regular Expression Language Elements

This is one of my most treasured bookmarks, and I wouldn't feel right about keeping it to myself.

I constantly refer to this link, and it's saved me hours of time that I used to spend cobbling together information from other sources.

Technical Debt

"[Technical] debt accumulates from taking hundreds or thousands of small shortcuts--generic variable names, sparse comments, creating one class in a case where you should create two, not following coding conventions, and so on. This kind of debt is like credit card debt. It's easy to incur unintentionally, it adds up faster than you think, and it's harder to track and manage after it has been incurred."

- Steve McConnell

Greatness

"I've found that people who are great at something are not so much convinced of their own greatness as mystified at why everyone else seems so incompetent."

- Paul Graham

They Got Rob Conery, Too !?!?

I knew it would happen!

How long until Atwood and Galloway fall?

Congrats, Rob. You really deserve it.

Microsoft seems to be making all the right moves lately.

Brain Food 10-26-2007

Visual Studio Tip: Navigate Backward/Forward

One small but handy feature in Visual Studio that took me a while to notice is the "Navigate" feature.

Have you ever right-clicked on a method call, selected "Go To Definition" (another feature I hope people know about), and then struggled to find your way back to the file and line you just came from?

Have you ever been messing around with some method, decided to take a quick look at some property or field declared near the top of the code file, and then couldn't remember the exact name of the method you were just looking at or where exactly it was buried in your file?

Next time this happens, look for the little "Back button" pictured below, and click it!  You'll be magically transported back to your last cursor position.  And I'm sure you can imagine what the little "Forward button" sitting next to it does as well.

Navigate button

Never "lose your place" again!

(Maybe next time I'll write about the "Bookmark" feature, this feature's more robust and long-term cousin.)

Easy Notifications with System.Media.SystemSounds

I was working on a console application the other day that very commonly took several minutes (or in some cases, hours) to run to completion.

Right before terminating, it would print out a little summary of what it had done.  Instead of sitting there staring at the console waiting for my program to finish, I would start it up, work on something else for a little while, and periodically pull up the console to see if the program had finished.

After many instances of pulling up the console only to see it had not yet finished, I started to think about how I could have the application notify me upon termination.  I wanted to stop having to check in on it every couple minutes and just have it let me know when it was done.

Knowing that many applications that occupy the taskbar notification area (or the "system tray") often use a standard Windows sound to notify the user of events, I began looking for something easy I could do from C# to get a similar effect for my console application.

I had to look no further than System.Media.SystemSounds to get what I wanted.

Right before my program is set to terminate, I simply added the line:

System.Media.SystemSounds.Beep.Play();

Now my console application emits a standard Windows "ding" right before it terminates, and I avoid having to constantly check in on its progress.  Problem solved!

 

Note: You can also try Console.WriteLine('\a') to write out the ASCII control character known as the "alert" or "bell," but I wouldn't recommend it.  I scared myself half to death doing this, as the sound you'll hear is not regulated by the Windows volume setting and will likely be very loud and unexpected. :)

Debuggers Considered Harmful?

"Debuggers are based on the idea that the code base has enough places bugs could happen that the work of locating the bug is involved enough to justify machine assistance. This is not true of well-tested code. More importantly, the whole point of [T|B]DD is that you identify the bugs before you write the code. As tools which track down bugs in existing code, debuggers presume and encourage a workflow which is exactly backwards."

- Giles Bowkett

Web 2.Overload

"If I was Mike Arrington I’d go to the nearest bridge, tie a noose around my neck, jump off, shoot myself during the freefall, and have my head torn off by the amount of slack in my rope."

- Mark Seremet

What's It Like to Be a Web Developer?

I was thinking today about how to describe the experience of being a Web developer.

I'd compare it to having a schizophrenic family member (or friend) that you visit every day at the asylum where he lives.

The first day that you go to visit, his ramblings are so chaotic and disorganized that you're almost overwhelmed.

one_flew

But as time goes on, you start to discern patterns in his ramblings and become familiar with his eccentricities. He's still obviously crazy, but you can faintly detect a certain order in his madness.

You eventually come to terms with his insanity but always hold out hope that one day you might be able to have a normal conversation with him.

ASP.NET DropDownList for the 50 States

If you need a DropDownList that contains all 50 states and DC (and who hasn't needed this at one time or another?), feel free to copy these and paste them into your project.

There are two flavors here.  Credit for the first one goes to this fellow.

Flavor #1

Flavor #2

Enjoy!

ReSharper Tip: Go to File by Name

This is one of my favorite little ReSharper features that took me a while to discover and fully appreciate.

Let's say you're working in a huge application with a deeply nested directory structure.  You're chugging along, editing some arbitrary file somewhere.  Ok, now you're ready to jump to some other file in your application and read some code or make some changes there.  The things is, you only kind of remember the name of the file, you don't really remember which folder it's in, and you really don't feel like digging through the whole folder structure of your application to find out where the file is hiding.

In comes ReSharper's "Go to File by Name" feature to save the day.

Let's say that file you're looking for is a master page, and you think it's name starts with "Guest".

Hit Ctrl+Shift+N and start typing "guest".  You'll get a list of all the files in your application that start with "guest".  Now just select the file you're after, and bam!  There you are.

screen1

Let's say you know that the file you need is a master page, but you don't remember anything else.

Hit Ctrl+Shift+N and start typing ".master".  Unfortunately, since the file name obviously doesn't start with ".master", ReSharper can't match any files, and you see that the text turns red.

screen2

But, thanks to a little feature I discovered recently, you can type an asterisk ('*'), and ReSharper will treat it as a wildcard.

So, try your query again, but this time type "*.master".  Now you'll see a list of all the master page files in your application, and you can easily locate the file you're after.

screen3

Obviously, this is only a very simple example.  I'll leave it as an exercise to the reader to imagine all the various ways that this could help one to locate arbitrary files in a large application.

Enjoy! (And get ReSharper if you don't already have it!)

Dear Twitter

I mean this in the most constructive way possible: Why is your Facebook application such a piece of crap?

I love the idea of your Facebook application so much.  But in reality, the application is so unreliable that it's essentially worthless.

How much of a priority is it for you guys to fix this thing?  Facebook is so hot right now, and I'd think the number of users you turn off because of the terrible quality of your Facebook application would be unacceptable to you guys.

Please keep in mind that I'm only writing you now because I love you, and I'm hoping against hope that you will someday get your act together.

Your loyal fan,

Matt B.

Problems Debugging ASP.NET Apps in Vista

I was having an extremely annoying problem while debugging an ASP.NET app in Visual Studio 2005 under Vista.

It'd set a break point in my code and start debugging the app.  After stepping through a few lines of code and stopping to ponder a particular line, Visual Studio would suddenly exit out of debug mode, and I'd be unable to continue stepping through my code.

After googling around for a while, I finally found the answer to my problem in the ASP.NET forums.

 

Here's the solution:

- Launch the IIS7 manager
- Find the application pool your app is running under, right-click on it, and select "Advanced Settings..."

app_pools
- Under "Process Model" find the setting called "Ping Maximum Response Time (seconds)".  Change the setting to something large.  I used "3600" (one hour).

advanced_settings
- Click "OK"

 

That's it.  No more mysterious terminations of your debugging sessions.

Use Firefox to Debug ASP.NET Apps

Did you know that you can configure Visual Studio to use Firefox when debugging your ASP.NET apps? Here's how it's done.

- Under the Solution Explorer, right-click on any ASPX file and select "Browse With..."


- Click "Add..."



- Click "..."




- Find "firefox.exe" and click "Open"



- Click "OK"




- Make sure Firefox is selected under "Browsers" and click "Set as Default". Close the dialog.





Done! Now when you debug your ASP.NET apps, they'll launch in Firefox rather than Internet Explorer.

Blog Post of the Year?

"When I told one of our users, a business analyst, that using just one field for the name meant a huge amount of work for programmers, she actually asked me what our job was, if not to do the work that makes users productive. I’m very much afraid that things are out of hand. I tried to explain how our database schema works, and so on, but she impatiently insisted that it was our job to make things work."

I've been reading blogs like crazy this year, and I can say, with no exaggeration, that this may be the best post of the whole lot.

Reg FTW!

Multiline String Literals in C#

That little @ is even more magical than I thought.

C# still has a few surprises left for me.

RESTful Wankery

"An insider at MyTube tells us confidentially that they get up to 100 users before the system slows to a crawl, causing bored users to delete random files from their servers by requesting well-formed URLs like http://mytube.com/database/delete and http://mytube.com/debugger/start. 'It's just so rude', MyTube engineers were overheard saying in their Atlanta office. 'Some of our users are just plain wankers.'"

- Steve Yegge

Living in the Future

Just thought I'd take a minute to point out the work Dave Winer has done to bring Flickr and Twitter together.

I've been following him on Twitter for a while and witnessed his early experimentation.

In a recent blog post, he described the experience of using this new service in a way that was so captivating that I just had to reproduce it here:

"So when I go out for a walk, and see a lovely tree with red flowers, I take a picture, route it to Flickr, my iPhone upstreams it, my agent notices it, posts a tweet, and then 80 or 100 of my followers (awful terminology, btw) click the link before I'm home. In real-time, their eyes and minds have taken the walk with me."

Dave goes on to describe the feeling one gets from being part of this experience as "Living in the Future."  And I have to admit that I felt something quite special, myself, when I first read the last sentence of the quoted passage above.

This is such a fantastic example of the wonderful connectedness being ushered in with the Web 2.0 movement.  I thank Dave for his work.

NBL is JavaScript 2

It's official!  NBL is JavaScript 2.  Just thought I'd pass that along.

P.S. If you don't read Steve Yegge religiously (as I do), then you'll probably have no idea what I'm talking about or why this is a big deal.

TwitKu: No Pownce Integration Yet

I'm excited to see something like TwitKu come along.  I've been wanting something like it for a while, and I figured it was only a matter of time before someone built it.

Unfortunately, the killer feature in my mind is still missing: Pownce integration.  But, this is not TwitKu's fault, because the people at Pownce have yet to expose an API like Twitter and Jaiku have.

According to the Pownce blog, they "hope to have the initial implementation up and running in September."  Get a move on, Leah!

JonGalloway.Kills.Bunnies

"I don't care what [Jeff Atwood] says about namespaces...my default namespace prefix is now JonGalloway.Kills.Bunnies"

- Phil Haack

Beautiful Code

"I find it immensely helpful to work on the assumption that I am too stupid to get things right. This leads me to conservatively use what has already been shown to work, to cautiously test out new ideas before committing to them, and above all to prize simplicity."

- Jonathan Edwards

BuiltWith.com

I love this idea.  I'm always curious about which technologies web applications that I come across in the wild are using.

I just hope they improve their algorithms a bit.  For example, they weren't able to tell me that Cork'd uses Ruby on Rails.

I'll be keeping an eye on them.

LinqToSpaceTime

"Tangent: anyone notice the clock on Scott's computer during that Airline demo webcast? It read 10:30 pm and then magically, when he added the reference to the web service, it became 12:20 am. I asked Scott what the deal was and he told me that a new feature in .NET 3.5 is LinqToSpaceTime... I wonder if I can use that to get my day back today..."

- Rob Conery

Out With the Old, In With the Nu

It's official! I'm leaving my old haunt and heading to NuSoft, a company I've admired and respected for years.

This is a great opportunity and a huge step up in my career. I'll be working with the best and brightest in Grand Rapids.

Wish me luck!

Expert Developers

"Experts are lazy, they work smarter rather than harder. Experts prefer the easiest solution that gets the job done. Experts aren't interested in creating complex solutions simply to have the complexity, that misguided egoism is the territory of more junior developers."

- Frank Wiles

Brain Food 8-5-2007

Executing a Query in SQL Server Management Studio

Is there no single keyboard shortcut that I can always use to execute a query in SQL Server Management Studio?

In the most common scenario, when I've got a table open and I want to write a quick query in the "SQL Pane," the keyboard shortcut is Ctrl+R.  But in the less common scenario where I start by clicking the "New Query" button on the toolbar, the keyboard shortcut to execute the query is F5.

Why are there two separate keyboard shortcuts I have to memorize to do the exact same action?

Evolutionary Psychology and Open Source

I've always been fascinated by psychology.  In fact, psychology was the runner-up when it came time for me to pick a major in college.  Although computer science won out, I went on to take several upper-level psychology courses just for the fun of it, and had no trouble breezing by most all of the actual psychology majors who filled those classes.  Ultimately, the career prospects of that field were just not promising enough, but to this day my ears still perk up when I hear discussions of psychology out in the wild.

So I was pretty intrigued when I saw this post by Nat Torkington on the O'Reilly Radar blog.  Although the post is only meant to be semi-serious, it still got me thinking about the reasons why open source developers contribute huge amounts of time to something that yields them no compensation.

The "costly signal" argument that Nat mentions, although interesting and valid in many other situations, seems ridiculous in this instance.  Seriously, has any man ever won over a woman because he contributed heavily to open source software?

The larger issue of the intrinsic satisfaction people get from engaging in esoteric hobbies like programming or model trains is outside the scope of this post, but is very interesting nonetheless.  Although I strongly believe that there's an evolutionary basis for all behaviors, I won't try to tackle the issue of hobbies.

I think another very compelling reason that people contribute to open source projects is the very real boost it can give one's career prospects.  Writing code in one's free time and releasing it to the world without any compensation publicly demonstrates the passion one has for their chosen field.  This alone can be a very strong signal to others in your field, especially potential employers.

This meme of "open source contributions as portfolio" seems to be spreading, and is certainly a very compelling reason why one would give his free time to open source projects.

Home Networking in the Mac Universe

I just spent the last several hours banging my head against the wall trying to get my home network to behave again.

Here's the general pattern:

  1. Tell Google my problem.
  2. Sift through the results.
  3. Try random suggestion.
  4. One random thing starts working. Another random thing stops working.
  5. GOTO 3.

Yeah...gotta love computers.

As I've witnessed many people I respect migrating over to the Mac universe, and thought about making the move myself, I've often wondered about the networking story for the Mac.

From what I've heard, everything in the Mac universe "just works."  Does this hold for home networking?

If my home network consisted of an iMac, a MacBook, and an AirPort, would everything "just work?"

Is there a home network configuration that exists that would allow me to move a file between computers without having to cringe and look away as I deliver the final mouse click?

Would going all Apple all the time save me from this endless (home networking) torment?

Look, Ma! My First Rails App!

I am one proud papa.


Brain Food 6-30-2007

Supporting Open Source .NET Projects

Get on over to Coding Horror and let Jeff Atwood know which open source .NET project you think deserves some money.  (hint, hint)

Brain Food 6-24-2007

Another hodgepodge of links today.

  • C#: Uninitialized instance variables - I remember hearing early on in my experience with C# that variables were automatically initialized.  For some reason this issue popped into my head again recently, and I just had to look it up.  It turns out the issue is a bit more complicated.
  • wordUnit: A Document Testing Framework - Document-Driven Documentation is the wave of the future!
  • The Things That Pass For Simple I Can't Understand - I've always subscribed to the KISS principle, but determining the simplest thing to do is often very complicated.
  • SubSonic: Some Clarifications - Rob Conery has assured the community that SubSonic is not going away...ever.  All I can say is: Thank god!
  • Asshole-Driven Development - A great listing of some hilarious (and sadly accurate) software engineering methodologies.  The ones that were most recognizable to me were the Get Me Promoted Methodology (GMPM), Shovel-Driven Development (SDD), and No Customer Left Behind Development (NCLBD).  Make sure to read the comments.
  • Creating My Own Personal Hell - A great post about the pitfalls of being the sole developer at a company.  After finding myself in this position in my first job out of college (although it was definitely not as bad as the one portrayed in this post), I vowed that I would never take another job at a company without an established team of developers.

The List

This list is a loosely defined catchall for the various things related to software development, in no particular order, that I want to grok at some point in the future.

I'll be revisiting this list and adding new interesting things as I come across them.

  • The Castle Project (MonoRail in particular)
  • Ruby
  • Ruby on Rails
  • Erlang
  • F#
  • Scheme
  • Object-oriented analysis & design
  • Unit testing
  • Test-driven development
  • Functional programming
  • Emacs
  • Macs/OS X
  • Design patterns
  • REST
  • Software management
  • Interaction design
  • Software architecture
  • Setting up and maintaining a website on my own domain
  • Firefox extension development

Updated 1/25/2008

Steve Yegge's Back!

Stevey!  Where the hell have you been, man?  Don't ever leave us like that again!  You had me worried half to death!

Brain Food 6-10-2007

My brain's been all over the place lately.

Brain Food 6-3-2007

My brain has been on a Ruby/ORM/Editors track lately.

  • RubyConf*MI - Who knew there was a Ruby conference in my very own backyard? It's not clear from the website if they're putting one on in 2007. I checked out the schedule from 2006, and it looked pretty worthwhile.
  • SubSonic - The SubSonic team just launched a new project site. It's certainly a lot nicer than their old CodePlex lair. I'm actually trying to use SubSonic on an app at work now, and I have to echo the sentiment that their docs do suck. (SubSonic is still awesome, though.)
  • Does Visual Studio Rot the Mind? - This is a talk by Windows programming guru Charles Petzold. I originally heard of this a while back, but just got around to reading it yesterday. I hesitated to read it for a while because I figured it was just some guy bashing Microsoft, but after reading it I can say that it's totally different from what I expected. This guy has been around the Microsoft dev world from day one, and he's full of insight. If you're a .NET developer like myself, this talk will seriously alter the way you view Visual Studio.

Brain Food 5-26-2007

In the tradition of some other bloggers out there, I'm going to simply post a few links to things that influenced my thinking in the last few days, and write a sentence or two for each one.

So, without further ado:

  • Is SQL Manual Memory Management? - I've been thinking about ORM a lot lately, and this post by Ruby on Rails aficionado Giles Bowkett makes a very tantalizing point/prediction about the future of ORM. This sentence sort of sums it up: "Maybe one day the idea that database management should be part of the language will seem as obvious and basic as the idea that programmers shouldn't have to do memory management by hand." I also found one of the comments left on the post to be very insightful: "Having SQL in a language will most likely turn into the same type of feature as having regular expressions in a language."
  • Hanselminutes Podcast 65 with Martin Fowler and David Heinemeier Hansson - This is a mindblowingly good interview that addresses many of the things that have been on my brain lately, and does so with two of the greatest minds in the dev world.
  • Rob Conery on Subsonic - This is an excellent .NET Rocks! podcast featuring the creator of an awesome tool called SubSonic that brings many concepts from Rails into ASP.NET.
  • Meetuplex - Biting satire of Google from the people at Meetup.com. I love Google, but this is just too funny. "At Google, you get your free Google-approved haircut at the Googleplex by a Googler with an IQ in the 99% percentile of all haircutters."

Moving from .NET to Ruby: The IDE Question

I've been thinking a lot about Ruby lately. From the limited experience I've had with it, it seems like a very cool language. But one thing has always been present in the back of my mind: what about the IDE?

After being severely spoiled by Visual Studio for the past couple years, I can't help but wonder how I could really ever become serious about Ruby (and Rails) development without something equivalent to Visual Studio. More specifically, how could I ever feel productive without IntelliSense and the wonders of ReSharper?

Keep in mind that I programmed for years without ever seeing an IDE. Throughout college, my toolbox consisted solely of Kate and a console. It wasn't until an internship that I undertook during my senior year that I first felt the sweet embrace of Visual Studio and the truly awesome productivity gains a nice IDE can grant you. But now that I've seen these wonders, I can't "unsee" them.

From what I've read, it appears the de facto standard editor for the Ruby hacker is TextMate for OS X. I've heard wonderful things about TextMate, but could it really replace Visual Studio?

If I were determined to get serious about Ruby/Rails, would it be silly of me to continue using Windows and Visual Studio with something like Ruby In Steel (which I just read a great review of on SDTimes)? Or should I abandon my comfort zone and dive in head first with a Mac and a TextMate license?

I would love to hear from other developers who have gotten heavily into Ruby/Rails after spending years in Visual Studio. Which IDE/editor did they end up using? If they eschewed Visual Studio, was it a traumatic experience?

Silverlight != Sugarlight

Why did Microsoft have to rename WPF/E to Silverlight after I'd been listening heavily to X for several months?

The following refrain has been running through my head for days:

"Silverlight! Silverlight! I can't believe..."

Stupid Microsoft! Stupid punk rock!

Dynamic Languages with Silverlight

HOLY CRAP.

Finally

After waiting patiently for nearly two months, SICP is finally here.

Pulling it from the box and seeing it "in the flesh" for the first time was a little magical. The cover is enchanting. A wizard appears to be casting a spell. There's a mysterious lambda floating in the air.

Who knew a computer programming book could be so seductive? The cover superbly captures the mystique of the contents.

I can't wait to dive in and begin casting spells in Scheme.

Conservation of Complexity

I don't remember exactly when it happened, but it was many years ago that I reached an intuitive understanding of the law of conservation of energy. One way to state this law is: "Energy can neither be created nor destroyed." My perception of the world was forever changed the moment that I first understood this idea. This was a similar moment to when I first intuitively understood the theory of evolution. These are ideas, that when you really understand them, reach out their tendrils and snake their way into every aspect of your perception. Nothing can escape their implications.


So I found it fascinating to read this posting to comp.lang.forth (which was linked to from the programming reddit), in which Elizabeth Rather discussed a certain axiom supposedly formulated by Chuck Moore.


She referred to it as "conservation of complexity," and it goes like this:


"Any given problem has a certain intrinsic level of complexity. In the solution of the problem, this complexity will be conserved: if you dive in with too little advance thought, your solution may become very complex by the time it's done. On the other hand, if you invest more in thought, design, and preparation, you may be able to achieve a very simple solution (the complexity hasn't gone away, it's become embodied in the sophistication of the design)."

After reading that description, a light bulb lit up in my head as I realized that this may be another one of those deep ideas. Conservation of complexity may be a special case of conservation of energy. This is very intriguing and seems to me to intuitively make sense. Looking back on software I've written, I have indeed seen this in action. I even once told a co-worker at my last job, when we were discussing the design of a program I was writing for him, that, "I want all the complexity on me, not on the users." I convinced him to change the requirements of the program so I could shove more of the complexity "behind the curtain," as it were, and not burden the users with it.


So really what Chuck Moore has (supposedly) said is just a more elegant formulation of what I have known to be true of software all along: you can move complexity around, but you can't destroy it.

Thoughts on "The Mythical Man-Month"

I just finished reading "The Mythical Man-Month," and I wanted to write down some thoughts before I forgot them.

Although each discussion in the book drips with insight, there were a few things that particularly got my attention.

The thing that most struck me was a thing that had been in my mind and on the tip of my tongue for months before I picked up the book. Brooks calls it "conceptual integrity," and it serves as one of the central themes of the book. The most critical thing to the success of a software system is conceptual integrity. In order to be successful, the idea of what the software system is and what it does cannot be decided by committee, but should instead be determined by one or perhaps two minds. Although I've only been developing software professionally for a couple years, I've seen a lack of conceptual integrity plague just about every piece of software I've worked on.

Another of my favorites was the chapter "Plan to Throw One Away" because, again, it strikes close to home. The general idea here is that when an organization is building software based on a totally new idea, the plan should always be to recognize that this first system will be a prototype that will be discarded and not delivered to customers. The organization and the powers that be must accept that it is literally impossible to get a new concept right the first time. Trying to pile new features on top of a prototype as a long term strategy will only lead to much sorrow and gnashing of teeth.

I also loved the chapter "No Silver Bullet--Essence and Accident in Software Engineering." This is the essay through which I originally became aware of Fred Brooks. Many times I would be reading a discussion of some new magical approach to software engineering on the Web, and someone involved in the discussion would reference this essay. I always thought I knew the general gist of it just going by the context in which I saw it referenced. But now that I've actually read it, it's even more insightful and prophetic than I could have ever imagined. It faithfully predicts many of the trends that have emerged since its original publication in 1986 and which ones would catch on. I was fascinated reading Brooks when he talked about how all the difficulties in software engineering can be classified as either accidental or essential, and that new approaches only really matter if they attack the essential.

As someone who cares deeply about his craft, I feel that I've been enriched tremendously by reading "The Mythical Man-Month." I could certainly never look at software engineering the same way.

State of the Blog Address

I just wanted to list some of the unexpected and wonderful things that have happened since I started this blog last month.

I don't anticipate that anyone reading this will be floored by these things, but they've personally affected and impressed me. I never really thought anyone would find this blog.

So here we go:


1. Within hours of my very first blog post, in which I discussed YubNub and a couple commands I submitted for it, the creator of YubNub himself left me a comment thanking me for my contributions.

2. After lamenting the dearth of shrinkwrap software companies in Grand Rapids and writing a blog post about it, the part owner of a really cool company in Grand Rapids, that was unknown to me at the time, left a comment to tell me about the shrinkwrap software his company was producing.

3. The day after I wrote a blog post about Aardvark'd and why I really enjoyed it, one of my favorite people (who is also featured in Aardvark'd), Aaron Swartz, left me a comment.

4. Within hours of writing a blog post about how I wanted to start contributing code to an open source project for the first time (possibly Firefox), Asa Dotzler wrote a post on his blog asking his readers to help me get started contributing code to Firefox.

5. Also in response to the blog post mentioned in #4 above, the co-founder and executive director of the Participatory Culture Foundation, makers of Democracy Player, emailed me and invited me to work on that project.

6. My blog currently occupies the first search result for "Matt Blodgett" on Yahoo, and the third result on Google.


Yay for blogging!

Contributing to an Open Source Project (Part I)

I'm thinking seriously about contributing to an open source project for the first time.

It's about time I put my money where my mouth is and get some code out there in the open.

As I've never done anything like this before, my head is swimming with questions:

1. Which project should I contribute to?

There are a million of them out there. Should I just pick the one that I respect the most? If that's the case, then it'd be Firefox, hands down. Should I choose the one that needs the most help? Should I choose one that's written in a language I like? What the hell language is Firefox written in anyway? C++?

2. What should I contribute?

Should I start out doing bug fixes? Should I contribute something entirely new...a Firefox extension perhaps? Oh god...I've heard some awful things about Firefox extension programming. I'm hoping the upcoming "Programming Firefox" might be able to lend me a hand there. Maybe I could start really simple and contribute a search plugin to my beloved Mycroft project.

3. How do I contribute?

How the hell do I even get the code I write included in the project? I suppose I'll have to revert back to my college senior project days and fire up TortoiseCVS or perhaps some Subversion client. How long does it take to get new code into the code base? What does that process look like?


As you can see, I've got a lot to learn. But it's about damn time.

Aardvark'd

I just finished watching Aardvark'd: 12 Weeks With Geeks, the movie about the development of Copilot at Joel Spolsky's company, Fog Creek Software.

The DVD came out a while ago, but I hesitated to buy it because most of the reviews I had read were not exactly glowing. Now, I'm a little bit sorry that I didn't buy it sooner, because I really liked it.

It seems that many reviewers didn't like the movie largely because it didn't deliver what they expected: an in-depth look at the software development process within Fog Creek. And while this is true, I still found the movie to be extremely interesting and worthwhile.

What I really loved about the movie was getting to see the people behind Fog Creek in-person. For the last few years, I've been reading Joel's thoughts on how to judge developers and about his excruciating selection criteria for Fog Creek employees. Now, I actually get to see the people who have made it through the gauntlet and what they're actually like. I found that quite thrilling.

As a bonus that I wasn't at all expecting, the movie features interviews with Paul Graham and the founders of Reddit, one of my favorite websites. It was fascinating for me to see these people live and (as stupid as this may seem) hear their voices and how they speak.

I also loved seeing the bionic office in Manhattan and the view out its windows.

In short, watching Aardvark'd was like going backstage and meeting the rockstars in my nerdy world. So if you're like me, and you would consider Joel Spolsky, Paul Graham, and Aaron Swartz rockstars (as pathetic as that is) and Fog Creek's office equivalent to Madison Square Garden, I would wholeheartedly recommend Aardvark'd.

The Real Release Cycle

Someone linked to this in the comments at Joseph Cooney's blog.

I found it hilarious and, unfortunately, very relatable.

Embracing the Constraints of Web UI

Jeff Atwood's recent post on web application UIs reminded me of why I chose to get into web development. This quote, in particular, matches exactly what was going through my mind about one year ago, when I made the decision that I was going to move into web development:


"Eckel sees a world of JavaScript and DHTML that's inappropriate for large applications. I see a world of large applications that are inappropriate for most users. It's high time we scaled down and scaled back. If anything, this is a beneficial side-effect of the limitations inherent to the platform."

What excited me so much about the prospect of web applications was that they gave me an excuse and a vehicle for expressing my minimalist urges and instincts regarding software design.


This mindset has also been popularized to a large extent by the 37signals religion. And while I find it annoying in many ways, I also agree wholeheartedly with some of its tenets, especially embracing constraints and sticking to the essentials.


Instead of focusing on packing feature after feature into our applications that no one cares about anyway, let's embrace the constraints of the web browser as a platform, and keep it simple, stupid!

Software Consulting Companies in Grand Rapids, MI

Updated 4/23/2008

In order to illustrate the relative dearth of shrinkwrap software companies in Grand Rapids, I thought I'd post a list of companies doing custom software consulting in Grand Rapids. I've been cobbling this list together for several years using various sources. Some of the companies on this list are a stretch, as software consulting might be a very minor part of their business. I've tried to keep the "heavy hitters" near the top of the list and the "stretches" near the bottom.

Shrinkwrap Software Companies in Grand Rapids, MI

Updated 3/16/2008


I wanted to put together a list of every company producing shrinkwrap software in Grand Rapids that I could find. I'm using Joel Spolsky's definition of "shrinkwrap," and by "Grand Rapids" I really mean West Michigan.

I'll be adding companies to this list as I become aware of them.

I'm really hoping that people will stumble upon this list and leave comments to let me know of any companies I may have overlooked or mislabeled as shrinkwrap. I'll update the list based on these comments as well.

Here's what I have so far, in no particular order:

Freebase

This Freebase thing sounds cool but, I mean, come on.

YubNub

When I first started using Firefox a few years ago, I was quite taken with the Smart Keywords feature. After using Linux pretty heavily in college, I started to really appreciate the power of doing things from a command line. Smart Keywords struck me as a way to bring the spirit and power of the command line into the address bar of Firefox. "You mean I can type 'imdb escape from new york' into the address bar, and the IMDB.com page for Escape From New York will magically appear? What a time to be alive."

I don't recall how much time passed before I stumbled across YubNub, but it was like a revelation. "Holy crap! Someone actually drew this web command line thing out to its logical conclusion. Those clever bastards!" Later I discovered that someone had made a Mycroft search plugin for YubNub. So the Firefox search bar could come into the act, and be fully abused as a command line. Friggin' awesome.

Cut to a few weeks ago, and I'm getting really tired of the standard procedure for getting Jeff Atwood's thoughts on whatever's knocking around inside my head at a particular moment. I had checked the Mycroft site several times before, at intervals of a month or so, to see if someone had gone to the effort of creating a plugin for Jeff's search engine yet. After yet another "no dice", I decided to take the matter into my own hands. As I was feeling far too lazy to create a whole Mycroft plugin myself, I turned to YubNub.

After about five minutes of research, I had unleashed my first YubNub command onto the world: coho. Go ahead...try it...I dare you. Drunk with power, I later came back to get my fix in the form of an ASP.NET Forums search: aspnet.

Now that I've contributed two commands to the "web command line", the sky's the limit. I know, I know...I haven't exactly created vi or grep here, but I'm not gonna let you bring me down from this high.

And so...to wrap up here...I rediscovered the awesomeness that is YubNub, and along with many of the other great things in my life, it's all due to my extraordinary laziness.