Wednesday, February 13, 2008

Seattle Alt.Net Open Spaces - Why I hate you all

I'm going to try not to be bitter and ranting about this, but I already know that I'm going to fail. I do not care. I think this needs to be said.

First, let me just say that I have not registered because the event is full. I'll return to this subject later, but I want to point out that not being able to go to this event is NOT what is pissing me off so much and is NOT the point of this blog. My life will go on if I don't make it to this event. I won't cry myself to sleep at night. I won't send hate mail to any of the organizers.

First, to register, I need to have an openid. WHAT THE HELL IS THAT?????? So now I have to have yet another ID that I have to remember on the internet. That means now I have about 76 different logins and passwords that I have to manage instead of just 75. Great. So even though in the first HOUR of registration being open they went through half of the slots that are available, the other half of the slots must have been waiting for all the other people who have to create an openid to register. I can't just enter my email address. I can't just create an account and register on the fly in about three seconds. I HAVE TO GO THROUGH A COMPLETELY DIFFERENT SITE TO CREATE SOME ACCOUNT THAT I'LL NEVER USE AGAIN AND THEN GO BACK AND REGISTER FOR THIS EVENT WITH THAT ID.

So, I look at this openid thing anyway because I'm being forced into using it for something that I want (sound familiar? I can't think of anything else that does that). It says it's the "last id that I'll ever need" so that's nice, isn't it? We've never heard that before. So what other sites does it work with? After browsing the first three pages of the sites that they list, I couldn't find a single site that I'd even heard of, much less used. I can sort the sites by name, but that's useless since they have names that are cool, hip, web 2.0 names that don't actually reflect ANYTHING about what the site is, like "ficlets" or "pibb" or "snipperroo". I'm not saying those are bad sites or anything, but what the hell are they and why do I need an openid to use them?

It doesn't work for any of the forum sites I post on. It doesn't work for any email services that I use. I can't use it to pay my electricity bill online. I can't check my 401k balance with it. I can't use it to log on to my computer remotely. I guess what I'm saying is that it's useless to me. Oh wait, I'll be able to register for a single event that I want to go to. Great. That's so worth it and I'll use that all the time </sarcasm >

So now this brings us to my second point: It's first come, first served. Unless you have an invite. Wait, so that makes it first invited, first served, then whoever else comes, served at that time, unless someone with an invite shows up then they'll be served before you so if they take up one of those slots, then you won't actually get a slot because they're more important than you for some reason.

So I guess by "open" spaces they're not referring to the website because that doesn't sound very "open" to me. Even though the event is full and I want to go, I can't, because they only let 150 people in. But wait, it's not 150 after all. It's 100. Why is it only 100? Because they gave about 50 invites. That's 50 people that are somehow more important than me and anyone else who didn't get an invite. I guess this event is "open" but for some people it's more open than others.

Wednesday, February 6, 2008

Now with comments enabled!

I was wondering why no one was commenting on anything and it turns out that this blog disabled comments by non Google account holders by default. I have enabled comments for everyone now. Maybe I'll even try to get Gravatar icons working sometime

Great article on Agile and management

CIO magazine just published a great article about Agile and management. See if you recognize any names!

Friday, February 1, 2008

Why we can't build software like we build bridges

Many people say that software sucks. It has bugs, it doesn't work the way we want it to, it gets released late, it has useless features, it doesn't have a particular feature we need, the UI looks funny, I get epileptic seizures from its splash screen, etc. Granted, it's always going to be impossible to please everyone (duh), but with software people often find that they have a special kind of hatred (google "Windows Vista sucks" for a few examples). People say that if we build cars like we built software, they would crash every few miles, but you could completely fix them just by turning them off and then turning them back on. Obviously cars don't do that, so why must we suffer through software products that work exactly like that? Why is software so hard? Why can't we build software like we build bridges?

First of all, a bridge is a concrete thing (literally and figuratively). I can touch a bridge, I can walk across it, it can kill me if it falls on me, and it has a specific function that is well defined. On the other hand, software is an abstract concept. You can't touch it, you can't hit it with something, you can't drive across it, and it can't touch you (if it can, well, let's not go there). Software is an idea. It's an abstract concept of something concrete. Someone, somewhere said "I want to do some task and I want some software to help me with that task somehow" and then asked the question "how do I do that?" and unfortunately the answer is usually something along the lines of "it depends."

Software itself is really just a set of rules (or states, but let's not go there) that a computer has to follow. A programmer's job is to attempt to turn that abstract concept that the product owner is thinking of into a concrete set of rules that covers every possible scenario that may arise as a result of the user's interactions with the computer. There is no room for interpretation, there is only what the instructions say to do. If you try to do something that there isn't an instruction for, then the computer will most likely not behave in the way you want it to because the programmer didn't think of what to tell the computer to do when you did that. In order for software to be perfect, the programmer has to think of every possible state that the software could possibly ever be in and then program rules for all of them. This may sound impossible, and that's probably because it is.

A bridge is an easy thing to build. Someone has a problem that involves getting from here to there, and usually in between here and there is an obstacle of some sort that is difficult or impossible to traverse. The person usually has a means that they wish to use to traverse that distance which is pretty much limited to walking or driving. That makes it easy. It's possible to absolutely calculate the distance so we know how big it needs to be. It's possible to calculate the maximum possible number of people or cars or whatever that could ever occupy that bridge. You can calculate the strength of various materials to know exactly what to build your bridge out of. You can measure the stability and composition of the ground to know how you have to anchor the bridge. You can even estimate the external stresses that it's likely to encounter by observing the environment around the bridge.

This is all a complex process, but it still has an answer that exactly meets the criteria of "here to there without collapsing." Also (and possibly most important) is that once you build the bridge, nothing will change. The strength of the materials is constant (let's ignore things like rust here, but those can also be calculated at design time). The distance is constant. The environment is even constant within a certain range of parameters. The maximum load of the bridge is known (you can measure it) and it will never change. In fact, if any of those things ever did change, the bridge would most likely fail catastrophically.

Let me know tell you how a piece of software would look if it was a bridge. First, it needs to be able to connect any distance provided that there is a start point and an end point. If the distance changes, it should be able to lengthen or shorten itself as needed. Also, it needs to be able to hold up as many things as possible and should be able to change itself easily and quickly if it needs to support more things than it is currently able to. I should be able to build a bridge in one place and then immediately just copy that bridge to any other location that looks similar and has a start point and an end point. I also need to make my bridge support anything that looks like it might be able to cross a bridge, such as cars, people, trucks, airplanes, boats with wheels, motorcycles, tanks, trains, platypuses (platypi? whatever), and so on. Also, if it collapses for any reason, I should be able to just turn it off and turn it back on and it will be fine again. It should also be immune to all forms of external attack and should only allow people across who are authorized to cross the bridge. Finally, if any part of it is revealed to be prone to failure or vulnerable to attack or otherwise fails to allow objects across, I should be able to rebuild just that small part of the bridge and send it to you, where you can open the package and it will automatically install itself onto the bridge and fix your problem. That's the bridge you want me to build.

Do you know a piece of software that this could describe? A website. That's right, a fucking website looks like this. It needs to scale up and out, I should be able to patch it remotely if it's broken, it must be secure, it must be able to support anything that looks like a web browser and can speak HTTP, it needs to be installable on any web server that supports the language it's written in and HTTP, it should restart itself if I restart IIS, and it needs to work. And it's only a website. It's not AI, DSP, computer vision, distributed processing, self-modifying code, or anything else complicated like that, it's just a bunch of string concatenations. It's the "A" and the "P" of the LAMP stack. It's a couple of services out of hundreds on windows. And it is infinitely more complicated than building a bridge.