Archive for May, 2008

May 27th, 2008

ASP.NET MVC Preview 3 Released

The ASP.NET MVC Team has released an refresh of MVC. To all those that are interested the new Preview Release is posted at:

http://www.codeplex.com/aspnet/Release/ProjectReleases.aspx?ReleaseId=13792

The new release contains many new features over the 2nd Preview Release and the Interim Release from a month a half ago. In this post I am going to outline the features that are new from the Interim Release to Preview Release 3.

Action Method and Result Changes

As you remember from the previous release, you are now required to return an ActionResult. Many of the ActionResults were renamed to the following types:

  • ViewResult: Renders the specified view to the response.
  • EmptyResult: Does nothing. Returned if the action method must return a null result.
  • RedirectResult: Performs an HTTP redirect to the specified URL.
  • RedirectToRouteResult: Given some routing values, uses the routing API to determine the URL and then redirects to that URL.
  • JsonResult: Serializes the specified ViewData object to JSON format.
  • ContentResult: Writes the specified text content to the response.

There were also new helper methods added to the Controller class for these new ActionResult types.

  • View: Returns a ViewResult instance.
  • Redirect: Redirects to the specified URL. Returns a RedirectResult instance.
  • RedirectToAction: Accepts an action (and optionally a controller) and redirects to another controller action. Returns a RedirectToRouteResult instance.
  • RedirectToRoute: Redirects to a URL that is determined by the routing API. For example, this method lets you specify a named route. Returns a RedirectToRouteResult instance.
  • Json: Returns a JsonResult instance.
  • Content: Sends text content to the response. Returns a ContentResult instance.

One of the more interesting ActionResults is the JsonResult which returns a serialized form of your ViewData object using the JavaScriptSerializer class. I don’t know why they didn’t use the DataContractJsonSerializer, but the team probably had their reasons.

View Data Changes

There is also the addition of implicit conversion for Action methods that return anything other than an ActionResult.

If an action method returns null (or has a return type of void), the action invoker implicitly provides an EmptyResult instance, which does nothing. If an action method returns anything other than an ActionResult instance, the action invoker calls ToString(CultureInfo.InvariantCulture) on the instance and then wraps the return value with a ContentResult object, which writes the content to the response.

A Model property was added to ViewDataDictionary. For ViewDataDictionary, the type of this property is System.Object. For ViewDataDictionary<T>, the type of this property is T.

The ViewData property of ViewPage<T> is no longer replaced by T. In Preview 2, the MVC framework replaced the ViewData property with the specified strongly typed view data (that is, the T in ViewPage<T>). In Preview 3, the Model property of ViewData is set to the instance of type T.

Route Changes

An IRouteConstraint interface was added.

If a constraint value is specified as a string, the string is interpreted as a regular expression. If the constraint value is specified as an instance of IRouteConstraint, route processing calls the Match method of IRouteConstraint.

A new HttpMethodConstraint type was added, which changes the way you constrain routes on the HTTP method. Unlike previous versions of ASP.NET routing, in this release, the constraint name “httpMethod” is no longer special. Instead, use the HttpMethodConstraint to add a constraint based on HTTP verbs. The following example shows how to use the HttpMethodConstraint type.

routes.MapRoute(
    "route-name",
    "{controller}/update",
    new {action = "update"},
    new {httpMethod = new HttpMethodConstraint("PUT", "POST")}
);

Other Changes

The versions of the System.Web.Abstractions and System.Web.Routing assemblies that are included with the MVC project template have been changed to version 0.0.0.0. The versions that are included in the Preview 3 release are newer than those that ship in the .NET Framework version 3.5 Service Pack 1 Beta. Therefore, they were assigned a private version number so that no conflict occurs between the assemblies in this release and the assemblies installed by the .NET Framework 3.5 SP1 Beta release.

And a ton of bug fixes

So in conclusion the ASP.NET MVC team has released another great release. Many of the new features have been on the request list of many of the active MVC developers. I still have to try out a couple of my requests to see if they are included, but I will make sure to provide a new post with those details.

Update: ScottGu has just released his notes on the MVC Preview Release 3, which I must admit are more in depth than my own.

Update 2: I have also updated IdeaPipe to reflect the latest PR3 changes. It took me about an hour to go through all my code and then test it. I am pleased to report the default page is now working, so that you don’t need the Default.aspx page anymore.

Tags: ,

Posted in ASP.NET, C#, Programming, Review | kick it on DotNetKicks.com | Bookmark | View blog reactions | 1 Comment »

May 23rd, 2008

Microsoft Source Analysis Still Needs Work

Somebody is wrong on the internetMicrosoft just released a tool called Microsoft Source Analysis for C#. Apparently it is a tool they use internally to make sure all their souce code looks the same and is easily readable by all those who use it. According to the blog post that announced this:

Source Analysis comes with a set of default rules analyzers covering approximately 200 best practice rules. These rules are full compatible with the default layout settings in Visual Studio 2005 and Visual Studio 2008.

Specifically, these rules cover the following, in no particular order:

  • Layout of elements, statements, expressions, and query clauses
  • Placement of curly brackets, parenthesis, square brackets, etc
  • Spacing around keywords and operator symbols
  • Line spacing
  • Placement of method parameters within method declarations or method calls
  • Standard ordering of elements within a class
  • Formatting of documentation within element headers and file headers
  • Naming of elements, fields and variables
  • Use of the built-in types
  • Use of access modifiers
  • Allowed contents of files
  • Debugging text

So being a neat freak about my code I had to download this tool and give it a shot. I was very excited about the tool and had great hopes for it. However when I actually tried the tool, there was no configuration for turnning off some of the rules that you didn’t agree with, like there is in the code analysis analyics tool.

I got literlly over 1000 messages about using spaces instead of tabs, in 3 files, because they felt it nessisary to alert me about every single line of code in my files. They also suggest I put the using statements inside of my namespace. I don’t know about you, but I hate the look of that, because stuff should be logically packed together. Only the classes show up in the namespace when you are referencing them, and the using statements are just a compiler indicator, not actual code. It did alert me about a couple of things that I found useful, such as when some of my XML comments weren’t long enough and or missing, and other nicities that I can agree with.

However, I am one of those strange developers, according to Microsoft, that likes to use tabs and have my declartion of using statements outside of my namespace. If I were to take this tool seriously I would have to be shunned from the Microsoft Campus and shammed in to never coding again. I guess I should start including the Rob Conery SupressMessage on my code:

[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "1000:YouShouldntBeCoding", MessageId = "1#",
Justification="That's not very nice... but I'm used to it :p")]

Of course I am joking about this, and I think these rules from Microsoft are totally wrong and out of wack with most C# developers. Mostly for the fact that the rules are not fully compatible with Microsofts own defaults they ship. First of all when you create a new class in C# the using statements are outside of the class you create. Second I find that using spaces just forces me to resync my code formatting more often because the spaces tend to get out of wack when you are developing software. Plus you are creating 400% more bytes in your file by using spaces over tabs. I know harddisk space doesn’t cost that much, but if you are using a system like TFS it just adds unnessisary bloat to your SQL Server database.

I would have probably agreed with a good 95% of their over 200 rules, if I could get past the 3 files with over 1000 messages about using spaces instead of tabs. I really feel one alert is good enough. It still has many usability and configuration issues to overcome before it will be widely accepted by non-Microsoft developers. Plus all that being said above, I am just stubborn and like my coding style.

Posted in C#, Rant | kick it on DotNetKicks.com | Bookmark | View blog reactions | 8 Comments »

May 23rd, 2008

How to create a non-Native jQuery event

Today I had the need to create a custom event using jQuery, in order to launch a customized form validation event from a global submit event. I did this so I could focus in on the first form field that had an error. My event from the global.js script, that is included on every page of IdeaPipe, looks like this:

$("form").submit(function () {
	var valid = $(this).validate();

	// if the form didn't validate then focus the input on the first error
	if (!valid)
		$(this).find(":input[error]:first").focus();

	return valid;
});

This is pretty standard jQuery. What this code above does is set a custom function for the submit event for any <form /> tag on the page. The submit event will only be allowed to continue if a return value of true is returned from the function.

I was able to create this custom jQuery event with the following code:

jQuery.fn.extend({
	validate: function (fn) {
		if (fn) {
			return jQuery.event.add(this[0], "validate", fn, null);
		} else {
			var ret = jQuery.event.trigger("validate", null, this[0], false, null);

			// if there was no return value then the even validated correctly
			if (ret === undefined)
				ret = true;

			return ret;
		}
	}
});

There are two different states to this method. Primarily because in JavaScript all parameters are optional for functions. So the two states of this function are:

  • validate(fn) - sets the event
  • validate() - fires the event

An example of setting the event is:

$("form.user-login").validate(function () {
	var userNameValid = ValidateLoginUserName();
	var passwordValid = ValidateLoginPassword();

	return userNameValid && passwordValid;
});

In this example the form is valid if both the login user name and password validate.

An example of using the event is the same as the method above.

$("form").submit(function () {
	var valid = $(this).validate();
	// do some stuff
	return valid;
});

This may not be the standard bind() and trigger() that most jQuery programmers are use to, but I needed an event that would return a value of true or false, so that I my submit event handler knows if it should focus on errors or continue the submit process.

Hope everybody finds this useful.

Tags: , ,

Posted in How To, JavaScript | kick it on DotNetKicks.com | Bookmark | View blog reactions | 1 Comment »

May 18th, 2008

How to create a YUI Compressor MSBuild Task

Recently for IdeaPipe I have been looking for ways to deliver my content more quickly and reduce unnecessary bandwidth use.

According to Yahoo’s Performance Team more than half of the viewers of the Yahoo websites start with an empty cache, which means the browser has to download all the resources for the first time. This combined with a high traffic website and unneeded white space and comments can really add up to a significant bandwidth use. There are many popular ways to minify your static content tax on your bandwidth, using many popular tools, as described in this excerpt from Yahoo:

In terms of code minification, the most widely used tools to minify JavaScript code are Douglas Crockford’s JSMIN, the Dojo compressor and Dean Edwards’ Packer. Each of these tools, however, has drawbacks. JSMIN, for example, does not yield optimal savings (due to its simple algorithm, it must leave many line feed characters in the code in order not to introduce any new bugs).

The goal of JavaScript and CSS minification is always to preserve the operational qualities of the code while reducing its overall byte footprint (both in raw terms and after gzipping, as most JavaScript and CSS served from production web servers is gzipped as part of the HTTP protocol).

The cream of the crop seems to be a tool Yahoo developed to deliver its own static text content scripts and styles, the YUI Compressor:

The YUI Compressor is JavaScript minifier designed to be 100% safe and yield a higher compression ratio than most other tools. Tests on the YUI Library have shown savings of over 20% compared to JSMin (becoming 10% after HTTP compression). Starting with version 2.0, the YUI Compressor is also able to compress CSS files by using a port of Isaac Schlueter’s regular-expression-based CSS minifier.

The YUI Compressor is a Java JAR file that can be download from Julien Lecomte Blog.

The YUI Compressor yielded exceptional results, however it was missing one thing. Integration in to my build and deployment process. In IdeaPipe I use a MSBuild script to compile, manipulate, and prepare for publishing. So naturally I built a MSBuild Task to minimize my JavaScript and CSS files.

The magic actually happens by invoking Java in an external process for each file passed in to the task.

Process process = new Process();
process.StartInfo = new ProcessStartInfo {
	FileName = @"c:\program files\java\jdk1.6.0_06\bin\java.exe",
	Arguments = String.Format(
		@"-jar ""C:\development\tools\yuicompressor-2.3.5.jar"" --type {0} --charset utf8 {1} -o ""{2}"" ""{3}""",
		type,
		ShowWarnings ? "--verbose" : String.Empty,
		newFile,
		oldFile
		),
	UseShellExecute = false,
	CreateNoWindow = true,
	RedirectStandardOutput = true,
	RedirectStandardError = true
};
process.Start();
process.WaitForExit(5000);

Then I read the warning from the standard error output and send them back to Visual Studio as a compile warning if the ShowWarning property is true.

string[] warnings = process.StandardError.ReadToEnd()
	.Replace("\r", String.Empty)
	.Split(new string[] { "\n\n" }, StringSplitOptions.RemoveEmptyEntries);

foreach(string warning in warnings)
	Log.LogWarning(null, null, null, oldFile, 1, 1, 1, 1, FormatWarning(warning), null);

To integrate this in to my MSBuild script I had to first register my task:

<UsingTask TaskName="ManagedFusion.Build.YuiCompress" AssemblyFile="$(ProjectDir)..\ManagedFusion.Build\bin\$(ConfigurationName)\ManagedFusion.Build.dll"/>

Then setup my ItemGroup for the files:

<ItemGroup>
	<JavaScriptContent Include="$(SourceWebPhysicalPath)\**\*.js" />
	<CssContent Include="$(SourceWebPhysicalPath)\**\*.css" />
</ItemGroup>

Then finally I setup my task to perform the minimization against the JavaScript and CSS files seperately:

<Target Name="AfterBuild">
	<!-- do other stuff to prepare for publishing -->
	<YuiCompress Files="@(JavaScriptContent)" Type="JS" />
	<YuiCompress Files="@(CssContent)" Type="CSS" />
</Target>

You can easily incorporate this in to your own MSBuild scripts or even your Visual Studio Project which is just an MSBuild file for compiling your source code for the project. I have included my source code below:

Download: YUI Compressor MSBuild Task Source

Note: There are a couple of static paths to be on the look out for and modify as necessary for your own code. In my code the Java runtime is loaded at c:\program files\java\jdk1.6.0_06\bin\java.exe and the YUI JAR is located at C:\development\tools\yuicompressor-2.3.5.jar.

Update (2008-5-21): Thanks George, apparently IIS doesn’t like serving straight C# files. So I added the code to my Coder Journal Source Control, so that it can be downloaded from there.

Tags: , , , , ,

Posted in ASP.NET, How To, Programming | kick it on DotNetKicks.com | Bookmark | View blog reactions | 15 Comments »

May 15th, 2008

What I learned about SEO from Celebrity Jeopardy!

I was having a conversation with my best friend a few days ago and we got on the subject of our preferences for how URL’s are rendered for blogs.

I fall on the side of lowercase letters and hyphens splitting the words:

http://www.somesite.com/2008/05/my-url-preference-is-like-this/

He falls on the side of title case lettering and no hyphens splitting the words:

http://www.somesite.com/2008/05/HisURLPreferenceIsLikeThis/

He has his reasons I have mine, I just think mine are more valid. Sorry Al that is my opinion. I am going to layout why I think mine are more valid, with an example from Celebrity Jeopardy. For those of you who aren’t familiar with this famous skit:

Celebrity Jeopardy! was a recurring sketch on Saturday Night Live. It parodies the Celebrity Jeopardy! edition of the television game show Jeopardy! where celebrities compete and the game’s level of difficulty is significantly reduced. Thirteen sketches have been aired to date, two per season from 1996 to 2002, and one in 2005.

Before I get to my commentary lets first watch this excerpt from Saturday Night Live’s Celebrity Jeopardy!:

I really tried to find a good example of one of the famous Sean Connery mess ups in a legal video sharing site, but none of them had anything usable. The skit I was really looking for was the famous “An Album Cover” where Sean Connery pronounces it as “Anal Bum Cover”.

As you can see Norm MacDonald playing the character of Burt Reynolds transforms the category in Celebrity Jeopordy!, on purpose for comedy reasons. In my analogy Google is going to be the Burt Reynolds of your search, however instead of finding the wrong words on purpose it is going to do it because it is a dumb machine that does what it is asked even if the results are not contextually accurate.

An Album Cover Google Example

Notice in the image above, in the highlighted words, Google finds both “An Album Cover” and “Anal Bum Cover”. This is because Google understands that the words you may be looking for don’t always fall in the same order and spacing as the exact phase you are looking for. This is something that SEO experts have known for a long and try to control so that their content shows in the top spot for the keywords they designed in to the page.

If you don’t control your URL, which is one of the highest ranking keywords on your site. You could end up decreasing the effectiveness of your keywords, as an almost duplicate keyword penalty. Granted I don’t know if something like this exists as a penalty, but when you are dealing with SEO it never hurts to be as careful and precise as possible.

So again I ask which URL would you rather have? Now knowing how a URL can be misconstrued :

http://www.somesite.com/2008/05/an-album-cover/
http://www.somesite.com/2008/05/AnAlbumCover/

So this is my way of saying be careful what your URL spells out, you may get unintended search rankings that you may not want, or you may offend a person who reads the URL wrong. Either way it is always good to control your environment with in reasonable means to make sure the message is received as you were intending it.

note: There are other factors in play that yielded the search results above.  However one thing that you will notice is that none of the URL’s were falsely highlighted, that is because they used a non-whitespace character to break up the words.

Tags: , , , ,

Posted in SEO | kick it on DotNetKicks.com | Bookmark | View blog reactions | 5 Comments »

May 13th, 2008

2 Easy Steps To Turn Your Blog Into An OpenID Gateway

Many of you probably have heard of OpenID, but have never had a chance to use it. However, I predict that most of you reading this blog will have used it by the end of the year. I can make this prediction with an almost 100% certainty because there is a growing movement behind it that has many big players actively buying developing and integrating their platforms with the OpenID protocol. Some of the biggest players are:

  1. AOL
  2. Yahoo
  3. Google
  4. Microsoft

OpenID according to the official OpenID site is explained as the following:

OpenID eliminates the need for multiple usernames across different websites, simplifying your online experience.

You get to choose the OpenID Provider that best meets your needs and most importantly that you trust. At the same time, your OpenID can stay with you, no matter which Provider you move to. And best of all, the OpenID technology is not proprietary and is completely free.

To facilitate my prediction, of most of you using OpenID by the end of the year, I am going to give you 2 easy steps to turn your blog, or any website, in to a OpenID gateway. That will work for OpenID 1.0, 1.1, and 2.0 versions of the protocol.

The first thing you need to turn your blog into an OpenID Gateway is an account with an OpenID provider, my favorite is MyOpenID, because of the abundance of features offered, but more providers can be found on http://openid.net/get/.

The second thing is pretty easy to accomplish and just involves adding some meta data to your HTML header. Just take the following snippet and replace {youraccount.myopenid.com} with your OpenID provider URL that was provided to you (there are 3 places in the snippet to replace the URL):

  <link rel="openid.server"
        href="http://www.myopenid.com/server" />
  <link rel="openid.delegate"
        href="http://{youraccount.myopenid.com}/" />
  <link rel="openid2.local_id"
        href="http://{youraccount.myopenid.com}" />
  <link rel="openid2.provider"
        href="http://www.myopenid.com/server" />
  <meta http-equiv="X-XRDS-Location"
        content="http://www.myopenid.com/xrds?username={youraccount.myopenid.com}" />

After that is done you just need to type your blogs/websites URL in to any OpenID text box. Most of the OpenID authentication text boxes look like the following (with the little OpenID logo in the left of the text box):

You probably already have an OpenID authentication account that you can use right this moment. Some of the common ones that most internet users have and don’t even realize are (just replace {username}):

  • Yahoo: http://yahoo.com/
    Flickr: http://flickr.com/
    To enable your yahoo account to use OpenId visit http://openid.yahoo.com/
    Also while there check out their gallery of OpenID enabled applications
  • AOL: http://openid.aol.com/{username}
  • Blogger: http://{username}.blogspot.com/
  • Live Journal: http://{username}.livejournal.com/
  • WordPress: http://{username}.wordpress.com
  • Technorati: http://technorati.com/people/technorati/{username}

So have fun, and check out IdeaPipe at the end of this month, we will be officially supporting OpenID.

Tags: , ,

Posted in Portfolio, Programming, Review | kick it on DotNetKicks.com | Bookmark | View blog reactions | 4 Comments »

May 13th, 2008

Software Developers Never Change

Whenever I am tasked with looking over a fellow developers code I always keep the following in mind, in order to ground myself:

your program (n): a maze of non-sequiturs littered with clever-clever tricks and irrelevant comments. Compare MY PROGRAM.

my program (n): a gem of algorithmic precision, offering the most sublime balance between compact, efficient coding on the one hand, and fully commented legibility for posterity on the other. Compare YOUR PROGRAM.

I found this on Jeff Atwood’s blog last year, and it pretty much sums up every programmer that I have ever met even my self.

What made me think of this and want to share it with my readers was a posting I saw on Lazycoder’s blog today. Which was a reposting of a Reddit comment. I am going to break down the comment with my own comments on the subject, because I feel it is important for people, especially young software developers, to fully understand the wisdom in this comment that was posted on Reddit.

I’m sorry, but this is just nonsense.

People are forever coming along and proclaiming that software engineering is in a state of crisis. And always their reasoning is that (other) programmers aren’t smart enough.

You will find many software developers, in your career, who have a martyr complex. They see them selves as gods gift to the computer, and their code could only be matched if Einstein, Mozart, and Michaelangelo could be combined in to one person of complete brilliance. Of course this is all crap and their code usually is far below average. In reality they just don’t have enough time, to study up and learn new techniques, between playing WOW and filling out their fantasy football charts. So they need a scape goat and it is usually that their co-workers are slacking off, or they aren’t “smart enough” to keep up with their brilliance.

If you can’t figure out who this guy, that I described above, is in your office, chances are YOU are “that guy”.

They, of course, are special magical code gunslingers with superhuman intelligence, members of the top 5%. (Surely software engineering is blessed to have 90% of its practitioners located in the top 5%!)

But the truth is that there is no crisis, and there never has been. The only problem, and the reason software projects keep failing, is that of unrealistic expectations.

I believe there are unrealistic expectations, because many project managers were former coders, and in my experience half of them that I have worked for are “that guy” that I mentioned above. However the blame as I see it is a project managers complete ignorance in how to set expectations with his boss.

My personal philosophy, even before I had the words, has always been “under promise, over deliver”. That is how you become a rock star in your field, no matter what it is.

Software is hard. Really hard. This should not be surprising to anyone who understands that it is really the field of assembling instructions for doing… anything. Anything that people want to get done. It’s sort of a meta-field that encompasses almost all other fields, with more being added every day.

Of course it’s hard. The only real question is why people consistently underestimate its difficulty, especially why they underestimate the difficulty of any particular software engineering task.

One word: Hollywoodization. In Hollywood all programming is done through a GUI that doesn’t look any different than the kids games of dragging the square object in to the square hole.

Also project managers conveniently forget their stints as software developers, because their yearly bonus relies on released the code by using 80% of the staff that is required and doing it in 80% of the time it would normally take.

It’s always about numbers and money.

I think there are a number of reasons for this:

1. “It fits in the little box, how big can it be?” Humans, particularly those who aren’t technical, have a tendency to judge difficulty with their eyes.

There is nothing more true than this statement. Politicians have a statement for this: Perception is reality. The perception is that small things go in small places, in reality these people don’t take in to account the vastness of a hard drive or the internet. That is why companies such as IBM spend millions of dollars in advertising to explain how a whole server room can fit in one rack of blade servers.

2. “It’s just a word processor.” Everyone understands what they are building, what the set of instructions is supposed to do, and they probably know how to do it by hand, albeit very slowly. They tend to assume that writing the software is just a matter of telling the computer to do the same thing, but faster. What they do not realize is that they don’t really know how their brain works at all, and that all the details which they can just leave to their giant neural net when doing it by hand, have to be figured out and brought consciously to the software.

Programmers have an acronym response for this mentality: SMOP which means Small Matter of Programming. It is an inside joke, because most programmers understand there is nothing small even with the smallest feature request. New features have a rippling effect through the whole application especially when your widget was never designed to do what it is now being asked to do.

3. The Cult of Smart. Programmers, on the other hand, have figured out that software is complicated, and that being smart really helps; in fact, nothing is a substitute for it. This causes them to emphasize it, convince themselves that they have an abundant amount of it, and to convince themselves that results are not the result of them learning about problem domains, and building better and better versions iteratively, but just the inevitable consequence of bringing their enormous brain to bear. This leads to things like the “Agile Methodology”, as in “I’m so Agile I don’t need a Methodology.” Instead of realizing that you have throw one away (usually more like ten), they think they can be so magically smart they don’t have to.

This mental break down usually happens with “that guy” mentioned above. He might have started out as a decent programmer, buy somewhere in his career he got one too many pats on the back and it all went to his head. He stopped searching out for new knowledge and become content with his current set of knowledge. Or he got distracted in an unrelated field because he felt he was at the top of the software development field, and while he was collecting paychecks for software development, and focusing on his distraction, the software development field passed him by, but he was too distracted to notice.

Either way this person lost sight of what originally brought them to software development and kept them thirsting for every protocol and every byte they could consume. Most of these guys never get the chance to get back in the game either. So stay focused and do what you love. If you love hockey and software development is only your 9-5 make sure you don’t fall in the trap of thinking you are at the top of your game in software development because you don’t have the time or ambition to learn anymore. And fully understand that the software development field is going to pass you by.

4. Expectations based on hardware. Chips are square. A linear decrease in CMOS transistor size results in a quadratic increase in the number that can be packed on a chip. Code is linear. A linear decrease in the amount of time it takes to produce X amount of code is merely a linear increase in the amount of code that can be produced. This results in an ever-widening design productivity gap, where capacity forever recedes away from our ability to exploit it. We can waste some of that excess capacity to save programmer time (this is why high-level languages have an expanding role in the field), but this is never going to go away. It isn’t that software is inherently blighted. It’s that hardware is inherently blessed.

Amen to that… There is no scientific break through that is going to help one software developer add 30 new features to a well developed application in 18 months. Software developers don’t have “magic bullets” that introduce instant yield like argon-injected-krypton LASERS to make our software 35% smaller. In fact most software development is a total 180 from hardware development. In hardware everything gets smaller and uses less power, however in software everything gets bigger and uses more power.

Even with this all said and new software developers learning these facts of life in their profession, nothing is going to change, 30 years from now the same problems are going to face the same people. Half of the “problem” comes from the kind of people that the software development field attacks, and the other half comes from poor education of college vs. real life. In college the focus is on perfection, in real life the focus in is on turn around time. If you haven’t realized it yet perfection and turn around time are usually poler opposites of each other.

So if you are to take anything away from this rant, take this, do what you love, and become the best at it. And if what you love isn’t your 9-5 job, deeply understand this and get out of the way of people who’s 9-5 job is what they love.

Well I hope this rant amused some of your and educated others. I guess I just had a lot to get off my chest.

Tags: , ,

Posted in Rant | kick it on DotNetKicks.com | Bookmark | View blog reactions | 15 Comments »

May 7th, 2008

Whats the idea? The reason we implemented IdeaPipe

When we first came up with the idea for IdeaPipe (no pun intended), we saw a need to fill a void in the social networking landscape. There are countless sites dedicated to connecting friends, classmates and business associates, sites that provide opinions and commentary around a specific topic and even sites that simply point to other sites, but there were few if any that enabled individuals or groups to share their ideas for the purposes of gathering feedback, collaborating or simply being heard.

There is nothing more powerful than an idea whose time has come.
-Victor Hugo

For decades, corporations have relied on costly market research initiatives to gather opinions and insights as a means of measuring customer satisfaction and developing product road maps. Each day, we see politicians like Hilary Clinton, Barack Obama and John McCain floating their ideas in the form of trial balloons only to wait on daily polls to determine voter’s reactions. By building upon this concept and giving everyone a voice, not just large corporations, we’ve created a platform that empowers individuals to have their ideas and opinions heard AND measured on everything from politics to their favorite products.

With your ideas, in concert with the collaboration of others, innovation will flourish. In fact, the world as we know it was built upon the unique ideas of individuals and it is exactly that which we hope to promote. Let’s face it… the solution to the energy crisis, global warming, and every other problem that plagues mankind, exists deep within the minds of individuals and it is our goal to assist in getting them out.

Ok, enough of the Mom and apple pie! IdeaPipe was created as a free service where individuals and/or groups can post their ideas on a variety of topics. Once posted, others will give your idea either a hype (i.e. “thumbs up”) or gripe (i.e. “thumbs down”) vote and optionally comment on the idea. For more specific information on how it works, visit our page on how it works! Sharing your ideas on IdeaPipe is a great way to:

  • Gain valuable insight into how others perceive your ideas
  • Meet and collaborate with other likeminded individuals
  • Gain customer feedback
  • Improve customer loyalty
  • Impress your friends!

IdeaPipe is available to anyone who has a thought or idea. On top of that; within the coming few weeks, we’ll be rolling out new functionality that will enable you to even create your own public or private group. Individuals or companies large and small will even be able to create their own IdeaPipe and linked to it from, Facebook, MySpace or any other web site. And yes, we’re even going to eat our own dog food! Let us know what you think the future of IdeaPipe should look like by posting your ideas about what functionality you would like to see in the future!

So create an account and get started today. Time is wasting to get your ideas heard.

Tags: ,

Posted in Personal, Portfolio, Review | kick it on DotNetKicks.com | Bookmark | View blog reactions | No Comments »

May 1st, 2008

When Dell Usability Engineering Goes Horribly Wrong

Today I was reading Engadget like I normally do in the morning to check out all the latest gadgets that they scour the internet for. And I happened across this new keyboard design that Dell is releasing with their Vostro models in the UK. I don’t know about you, but I specifically stay clear of keyboards where the backspace key is crunched down to add the backslash key on the top row. But I have never seen this keyboard layout before, where the backslash key is on the bottom left of the keyboard. I think the usability engineer that designed this keyboard should be fired, that is assuming that Dell didn’t randomly toss keys at the keyboard and let them stay where they fell.

This design has to be experienced because me describing it doesn’t do it justice for how bad of a design it is.

US Version

Dell Vostro US Version

UK Version

Dell Vostro UK Version

Somebody may want to mention this blunder on Dell Idea Storm.

Tags: , ,

Posted in Rant, Uncategorized | kick it on DotNetKicks.com | Bookmark | View blog reactions | 6 Comments »