Remote Pairing with Microsoft SharedView

pairon As part of some contract work I’m doing for one of my clients, I am pairing with one of the new developers in the company to bring them up to speed on the code base.

I can’t say anything new about paired programming in general that someone else hasn’t already said, but I can say this: it is freaking awesome. Others seem to agree.

I want to talk about my paired programming setup. We tried VNC, but it apparently sucks a lot these days. It was flakey and kept dropping connections. No idea what that was about. It also required all kinds of firewall fiddling I have no love for.

Sean Chambers told me about SharedView and Tokbox on twitter, and while I  haven’t used Tokbox yet, I must say SharedView has rocked my world. It’s so cool! No firewall baloney, you only share what you want to share, and it’d dead simple.

We use Skype for voice communication, which is always clear and well behaved. I love Skype for video chats, too. With a modern webcam, the quality is so amazing.

The combination has worked great, and combined I think we have dramatically reduced the friction of remote operating.

Save Time and Money – Remap F1 in Visual Studio

This guy is hardly the first one to say it, but he’s right: if you want to save yourself lots of time, remap Visual Studio’s F1 key away from help. We all know the Visual Studio help system sucks hard, so just give up on it. Welcome to a world where a missed ESC slap doesn’t paralyze your computer for 2 painfully grueling minutes.

But what to remap it to? So many ideas!

Sock it to me now!

Manifesto for Software Craftsmanship

A sort of sequel to the Manifesto for Agile Software Development, I am proud to be a signee of the Manifesto for Software Craftsmanship:

As aspiring Software Craftsmen we are raising the bar of professional software development by practicing it and helping others learn the craft. Through this work we have come to value:

Not only working software, but also well-crafted software

Not only responding to change, but also steadily adding value

Not only individuals and interactions, but also a community of professionals

Not only customer collaboration, but also productive partnerships

That is, in pursuit of the items on the left we have found the items on the right to be indispensable.

© 2009, the undersigned.
this statement may be freely copied in any form,
but only in its entirety through this notice.

Software quality is of huge importance to me. I have always believed that if you are going to do something, it is worth doing right. I believe that quality is an end unto itself, but I also believe that as a side-effect of quality, tremendous business value can be realized.

If you are a software developer that takes pride in the things you create, then I urge you to sign the manifesto.

Buba XPath Builder

This is the tool I reach for anytime I need to pull data out of XML’s cold bird-like claws.

It let’s you interactively write XPath queries against an XML document. It’s simple. It works well. It’s got syntax highlighting.

Basically, it’s the cat’s meow.

Stateless Network Service (A Rant)

Ok so I’ve got an idea for a stateless network/application service.  Check it out.

It’s a simple concept. The service will accept requests that are wrapped in a protocol specific envelope, perform an action, and then return results in a similar protocol specific envelope. Simple! Clients will perform a series of actions, get a series of results, and generally navigate the world.

Now, the totally awesome part: My Custom Implementation. Every request that comes in will logically specify what type of request type it is. Maybe it’s “List Employees” or “Process this Order”. Each request type will have some sort of textual key associated with it like “ListEmployees”. I’m going to take that textual key associated with a request, look for a file in the software project’s directory with the same name as the key, run it, and that file will be responsible for displaying the results.

In case you’re wondering, I just re-invented Http, and hopefully illuminated one of the more insane aspects of it: Why do requests map to files in our software applications in almost all http servers?? Am I the only one that thinks that is absolutely insane?

The only originally conceived usage of HTTP. I understand that it sort of started out that way with static html files and stuff, which is fine, I can still see that use case being valuable. But we don’t even call Http Servers “Web Servers” anymore, they are marketed as “Application Servers”, ostensibly designed to serve applications.  Too bad they almost all focus on the use case of serving html or jpegs of kittens with guns.

This rant was all brought on by a post from Phil Haack entitled Handling Formats Based On Url Extension. In it he describes jumping through hoops to essentially perform an action that can be simplified as “I want to perform one action based on one request type, and a different action based on a second request type”?

How is it that this can still be so difficult? Why can’t we enable a mode in our Application Servers that simply says, “Ok, you know what? I’m not serving static Html. Give me the damn requests and let me decide what I want to do with it.”

How much time have you personally spent trying to get craft some ASP.NET Routing Rule (or MonoRail Routing rule, or mod_rewrite rule) because application server X is just completely hell bent on matching http://foo.com/employee/add to to a file named add.html or add.aspx in a directory named employee?

Imagine if NServiceBus or MassTransit routed messages to components based on their filenames? Epic Fail!

If you’re going to call yourself an Application Server, at least pretend like you’re actually in the business of serving applications.

C# Enum Type Automatic-Figure-It-Out-er

I want this:

public enum MeowSound
{
  Angry = 1,
  Happy = 2
}

public class Cat
{
  public void Meow(MeowSound meowSound)
  {
    // Do stuff
  }

  public void AngryMeow()
  {
    // Meow(MeowSound.Angry) // I don't want this.
    Meow(Angry);  // I want this.
  }
}

That is all.

Options

I don’t like WordPress. This has been documented somewhere in this blog. I’m too lazy to link it.

Some other people don’t like WordPress either sometimes. I was just bitten by that same caching issue.

You see, I had made the mistake of thinking that enabling the WP-Cache plugin would actually enable caching on my system. I always thought “Man WordPress sucks! My blog is so slow! And nobody reads it anyway so it can’t be because people actually care about what I’m writing!”

But I digress. I enabled the WP-Cache plugin, and it was still slow. I looked a bit further, and the default options of an enabled WP-Cache plugin explicitly disables caching. You have to go into the plugin’s settings page and click “Enable”.

What the hell is that?! You know what that is? That’s a programmer right there. We love options. “Oh well if my toaster could turn inside out I could use it as a space heater in my bathroom.” Nobody wants to do that, but we love the fact that we could. We end up designing software for ourselves instead of our customers.

This is bad! Bad, I tell you! Bad! If i could hit you on the nose with a rolled up newspaper I would! Twice!

Users don’t want options, nerds want options. If you have a techy audience, then consider piling in options. R# has a million, and I think each and every one is delicious.

However, if your users are Johnny down on the warehouse floor, he doesn’t want to know about transactions, offline/online operation, or whether or not the circuit breaker is tripped or not. He wants to do work so he can get home and play with his kids.

And remember, DON’T LISTEN TO YOUR USERS. I love this quote:

Definitely don’t believe what people predict they may do in the future.

External Dependencies and You

I’m having a lot of problems with external dependencies lately. Especially with Castle Project. It’s not because Castle Project is bad. I think it’s more because Visual Studio is stupid.

Visual Studio basically encourages people to put all their external dependencies in the GAC. The problem with this is that when you go to build it on your build server or some other dev’s machine, you have incredibly annoying task of downloading and installing all the MSI’s for all those libraries you used.

My solution, according to “SVN Best Practices” (Best practices rarely are ‘best’), is to have an Externals directory at the root of my SVN, with binaries of the libraries I use in it, in a folder hierarchy like so: http://server/Externals/LibraryName/VersionNumber/*.dll

Then, to each project I add a “/lib” folder in the project path, and add an svn:externals property to that lib directory for each library I need.

You probably already know this. Almost everyone does this (or should do some variant on this). The problem? It’s a damn pain in the ass!

Every single project has to have this lib folder, which is maintained to only include relevant libraries, is a pain in the ass to add. Maybe it’s because there is a lack of tooling. Imagine if VisualSVN or some other too understood this hierarchy and just let you select libraries to add to your lib folder. Wouldn’t that be nice?

I’m annoyed. It’s very annoying. Any thoughts?

I just had a semi-obvious thought: Maybe I should put my lib folder at the solution level in the folder hierarchy. At least at that point I don’t have to maintain 50 different lib folders and their external dependencies. But I hate that too, I hate dependencies above my project file.

ALT.NET Seattle

So, I know ALT.NET Seattle closed 2 day ago, which, in “Internet/Blogger Time” is approximately 1.5 million years ago, but I want to blog about it anyway. Warning: rambling ahead.

Passion.

That sums up a great deal of what the conference was about. People were insanely passionate about the things they were doing, which seems simple enough, but sometimes I feel like nobody really gives a crap. These people loved what they do. They see that there’s a better way to develop software, and they want to show the world how well it works. Since I tend to hop around and wave my hands all over the place when I get excited about software related things, being around people who show such passion (maybe not by hopping around) was really refreshing.

Sessions.

I really enjoyed the session by John Lam on IronRuby. I’m very much not “in the know” on IronRuby, so I had a couple months ago gotten the mistaken impression that nothing really was going on. That was immediately dispelled, and I realize now that I got that impression because there are no binary releases of IronRuby. It’s a sort of implicit warning sign along the lines of “There be dragons here.” This was a theme throughout the conference. I need to get over it I guess. We’ll revisit that.

Anyway, the IronRuby talk was good, although it was a bit deeper than I would have liked to see, personally. Of course everyone else knows about 50 times more about IronRuby and Ruby in general than I do, so I don’t feel personally slighted in the least. It was still really interesting, and I plan on stealing John’s setup of using Vim inside Visual Studio (ViEmu) and FireFox (Vimperator). I’m less convinced about Vimperator, but ViEmu sounds pretty sexalicious.

Agile Coaching

The two sessions that had the most profound influence on me personally was the session “Coaching Agile Teams” hosted by Jim Shore. I have inherited a team, and I am trying very hard to incorporate new technologies and techniques into our development practices while at the same time not overpowering them. It’s a little overwhelming at times, being fresh out of school and suddenly finding myself in charge of our daily software development efforts. It was great to talk to these guys though, and get a few ideas (well 4 pages of ideas) and a little confirmation that I haven’t just completely screwed it all up, heh.

The ideas we talked about, empowering the team, investing in the team’s long term functionality, and similar things, were echoed throughout the second day of the conference in a session (I think by Oren Eini, the wiki is throwing me errors for some reason right now, I can’t confirm) discussing how to convince your team that using these advanced programming practices (IoC, AOP, SOC, TDD, SRP, etc.) is beneficial.

There was a lot of discussion about how frustrating it can by trying to convince someone that there is a better way when they aren’t interested in learning a better way. Of having people in technological positions who are not interested in technology. The frustration was palpable, but I personally got the feeling that all of the frustration is rooted in the tension of people resisting an effort along the lines of: “I want to make your life better by making your work easier in the long run.”

Em-Vee-See

The session on MS’s MVC offering was pretty good. I’m just getting into the whole MVC shebang, and what I was personally interested in coming away with was that if I choose Monorail over MVC, or MVC over Monorail, I wouldn’t get horribly screwed. A comment was made concerning MSMVC’s better integration into the IDE versus Monorail, and Chris Ortman made a comment during the session about how his personal experience was a bit of the opposite with a developer he had bringing him up to speed on MVC.

I approached him afterward for a little elaboration, as we have a web project coming up soon and I’m pretty convinced this is the way to go. His comments were very reassuring, and I came away with the thought that, if anything, the Castle Project may be the *more* supported solution, simply because the mailing lists are so awesome, something I can attest to personally. I also learned that I should probably move away from RC3 of Castle Project (the last binary release) and just use trunk. Sort of goes back to my predisposition against using non-binary releases.

Btw- Check Chris’s Blog for an idea he and some others have for a Developer Exchange program. I love the idea.

Grassroots

I also met a gent by the name of Alan Buck. He seemed pretty cool, local to Washington, and through our discussions he asked if I’d be interested in joining a micro-community of people here in Washington we can reach out to to bounce ideas off of and so forth. I contacted him yesterday, and I’m really excited about the opportunity. I’ll update with what goes down.

Also, does anyone know of any developers in Eastern Washington (read: East of Snoqualmie Pass). There are a crapload of resources for those in Seattle, Redmond, Olympia, etc., but nothing I’ve found for us desert-folk. I’d like to connect with those out there, and I’ve been considering forming an Eastern Washington User Group of some sort. Especially since for like 3-4 months a year we’re cut off (or at least seriously discouraged by such things as avalanches and tire chains) from the west side.

Other: _________

There was a lot else going on. Like how Scott Bellware came off as kind of rude, but then by the end of the show had completely garnered my respect, all without even having to personally interact with him, and how Ben completely blew me off 2 nights in a row (Thanks ben! ;) j/k), or how Steven “Doc” List was an amazing facilitator, or how Jim Shore had this amazing style of being very soft spoken, respectful, and polite while exerting a powerful control over the session. (Doc and Jim Shore have crazy awesome people skills), and umm… yeah. stuff.

It was great. I met amazing people. I didn’t meet anyone I didn’t like (I know, right!?). I can’t wait until the next one. I think I might try to go to Austin. We’ll see.

Carbonite: Still Failing

Back in the day I wrestled with the decision between Mozy and Carbonite. I eventually chose Mozy and I’ve been incredibly happy with it. It’s already saved my bacon a couple times, and I find the combination web/local interface to be incredibly helpful. Unfortunately not everyone has been as lucky as I have.

Rich B. left me a comment regarding his current Carbonite situation. Here’s an excerpt:

I’ve been a Carbonite subscriber for almost a year. I recently suffered a hard drive failure and was very proud of myself for knowing this would happen AGAIN and being prepared. Little did I know. I’ve been attempting to do a partial recovery of my files for 5 days. Partial as I’m waiting on a new drive from Western Digital. For the last 2 days the service has been ’stuck’. The interface is clunky at best and there is no way to retrieve your files except wait for something to happen.

When I first attempted to recover my files I noticed that all the folders on Carbonite showed a date corresponding to a date last year when I first subscribed. Not good when you expect to recover your most recent files. Sure enough the few files I was able to recover were old files. I sent an email to Customer Support and they responded within 12 hours which was acceptable. Subsequent email requests from me, both by Replying to the original and going back to customer support have met deaf ears – no response in over 24 hours. Their customer support form says it may take 72 hours to respond because they’re busy. I don’t know about others, but when I’ve had a hard drive failure and can’t recover my files, 72 hours is a little slow for customer support assistance. I obviously need files as quickly as possible.

Mozy hasn’t been a cakewalk either. It’s got it’s own share of idiosyncrasies, but nothing like that.

Software Engineering lessons to take away? Nothing new: Think about your users, Consider the human elements of software design (and further software support), and Interface is crucial.

That’s an interesting question: How do considerations for continued support for production software influence design?