Saturday, February 27, 2010

Is building software unpredictable?

Had a really interesting discussion at work yesterday.

We had our usual development meeting and I presented a lightning talk titled "The Software Craftsman and Tools". In a nutshell, I started off the talk by stating though the strong emphasis on Software Craftsmanship here at work is fantastic, we must also be conversant with the tools and platform that we are working on.

I then went one step further in saying that those two elements are not necessarily that important, without an overall vision (ie. goal). This overall vision is basically where the business wants to be in the future (ie. within a time period)

I then finished my talk by stating that I believed that "Only by having an architectural vision, can a software craftsman; who is conversant with his/her tools set, be truly effective in delivering value to the business"

Which then lead into our fishbowl conversation, "Do we need an overall architecture vision here at work?"

What really intrigued me was the statement made by one of the developers here, which goes along the lines "... building software is inherently unpredictable, thus its unnecessary to have an overall architectural vision." [not in these exact words, something similar]

This statement really bothered me and got me thinking late into the night. What is this unpredictability that he is referring to? To me, when building software there are basically two types of requirement:
  1. Functional Requirement (aka What the Business wants)
  2. Non-functional Requirements. (What we build to support the software)

The only thing that is unpredictable is the functional requirements (aka "What the Business wants"), because processes can change, scenarios that were not considered before, etc.

So that leaves us with the Non-functional Requirements. What are non functional requirements? These are things like
  1. How do we scale the application?
  2. How do we monitor the health of the application?
  3. and so on.

NOW, do we pull this non-functional requirements out of thin air? No we don't. We asked the business (product owners, stake holders, etc)
  1. Why is this software important to you?
  2. How do you see this software fitting into the overall strategic vision of the business?
  3. What is the expected uptake and potential growth of user base for this piece of software?
Its only by understanding what this piece of software means to the business, can we clearly articulate the non-functional requirements. And leading on from there, we can define an architectural vision... aka a roadmap -> Where the software needs to be, and How we are going to get there.

So when an important application which suddenly becomes popular with end users and is one of the major revenue earners for the company starts performing sluggishly, we SHOULD NOT shrug our shoulders and give the excuse that this was never in the requirements. It probably was in the requirements (ie. the non-functional requirement), but no one actually thought about having a conversation with the relevant people and thinking about the bigger picture and the future.

So I putting it out there, "We need to determine what parts are unpredictable and what are not." Building software is NOT unpredictable. We are just not asking the right questions.

In summary, I still believe we need to have an overall architecture vision (which is derived from the business strategic vision). Its only within the confines of this vision, can a software craftsman who is conversant with his/her tools be truly effective in delivering value to the business.

Just my 2 cents :)

Wednesday, February 25, 2009

Change of Scenery

After a whirlwind of planning and packing, I have finally found myself in London. Yes that's right, I'm here in the Northern Hemisphere, braving the cold English weather. Missing the warm NZ summer at the moment.

I'm quite thankful that I've just missed the snow but according to weather forecast, the outlook is snow next week. (Praying that the weather man got it wrong). Been keeping myself busy job hunting. I know this is probably the worst time to head over to the UK for my big OE, but anytime is a good time. Not going to let a little recession stop me from coming over.

So what's my initial thoughts of London? Hate the weather here (I mean who doesn't?) Love the city. Been visiting most of the museum here and exploring the city.

I think this little change of scenery will be good for me. I finally finding that I know have plenty of time, in between the job hunting and visiting the museum. So will probably catch up on ASP.NET MVC before it's expected 1.0 release. Its all good :)

Thursday, January 24, 2008

Creating Your Own Ajax ControlToolkit Extender Control

Great resources here:
I can across an interesting gotcha when creating my first ajax control extender (created a validator extender control, which "highlight" a target control if validation fails)


The javascript error only happens in IE. FF is quite forgiving.

Expected Identifier, string or number

When I clicked Yes to debug, it takes me to the below line of code in Visual Studio...

$create(KbWebToolkit.ValidatorHighlightBehavior, {"HighlightControlID":"",
"HighlightCssClass":"error_highlight","id":"NReq_HL"}

Debugging it further would return the javascript below:

Microsoft JScript runtime error: 'KbToolkit' is undefined

Fix:
Remove the last comma in the prototype definition.

Wednesday, July 11, 2007

vmware: I've seen the light.

I’ve just been running a 30 days evaluation copy of VMWare Workstation 6.0 and I got to say very I’m impress!

The number one wow feature has got to be the ability to take "snapshots" of your virtual machines, and reverting back to them. Check out the screen shot of the Snapshot Manager below




Another cool feature, is that you can “Clone” out from snapshot.

Say, I’ve been working hard out on my BizTalk vm and have lots of my personal development files on it.

Someone comes up to me and asked for a copy of the BizTalk vm , I don’t have to give them a “dirty copy” but I could clone out a clean copy base on an earlier snapshot I’ve taken.

Now that's way cool! :)

I’ll post little cool things as I find them. (But this feature is it for me)
Now, to convince my boss to get the full version...

Update:
If you are wanting to import your MS Virtual Server / VirtualPC images across there a nifty utility to do so, which can be found here.

Thursday, May 10, 2007

3 Easy Steps to ASP.NET Caching with SQL Cache Dependency

It has been a while since my last post. I have been mostly preoccupied at work, but have been fortunate enough to be assigned to some really interesting project here at the bank using the latest Microsoft technologies. One of my project even made it into the .NET 3.0 case study, unfortunately my name wasn’t mentioned. But that’s ok cause I had fun working on it ;)

Anyway the purpose of this post is to outline the steps I’ve taken in getting caching going using SQLCacheDependency with SQL Server 2005 for ASP.NET 2.0.

In this scenario, I have a lookup table that Iwould like to cache on the first call, but have that cache item invalidated if the any value in the underlying tables changes.


Update:
I'm assuming that SQL Broker is enabled against the underlying database. To enable SQL Broker, run the following

ALTER DATABASE Store SET ENABLE_BROKER;
GO

1) In your Global.asax, add a reference to System.Data.SqlClient.



2) Call SqlDependency.Start() method in the Application_Start() method (Global.asax), passing in the connection string.



protected void Application_Start(Object sender, EventArgs e)

{

...

string connectionString = WebConfigurationManager.ConnectionStrings["YOUR_DB"].ConnectionString;

SqlDependency.Start(connectionString);

}



3) In my data access code, I instantiate a new SqlCacheDependency object passing a reference to the SqlCommand object. This SqlCacheDependency object is then used in the Cache.Insert() call. (I’ve hightlighted the relevant lines of code below)

Dictionary<string, bool> switches = new Dictionary<string, bool>();

string connectionString = WebConfigurationManager.ConnectionStrings["YOUR_DB"].ConnectionString;

using (SqlConnection conn = new SqlConnection(connectionString))

{

SqlCommand cmd =

new SqlCommand("SELECT SwitchName, SwitchValue from dbo.ExternalSystemSwitch", conn);

SqlCacheDependency dependency = new SqlCacheDependency(cmd);

conn.Open();

using (SqlDataReader reader = cmd.ExecuteReader())

{

while (reader.Read())

{

switches.Add(reader.GetString(0), reader.GetBoolean(1));

}

}

Cache myCache = HttpContext.Current.Cache;

myCache.Insert("ExternalSystemSwitch", switches, dependency);

if (conn.State == ConnectionState.Open)

conn.Close();

}

Note: There is a whole bunch of rules to how you should write your select query, but the two important ones are

  1. Do NOT use Select *, instead use individual fields
  2. Must use fully qualified table names, eg. dbo.Customer

The complete list of rules can be found on MSDN here.



Update:
I'm assuming that SQL Broker is enabled in the underlying database. If not, you can run the following to enable it.

ALTER DATABASE Store SET ENABLE_BROKER;
GO

Tuesday, November 07, 2006

.NET Framework 3.0 RELEASED!!

I was trawling the msdn blogs this morning, and very pleased to see that .Net3.0 has RTM'd!!

Congratulations to everyone involved!! (WCF, WPF, WF, CardSpace)

The relevant links are as
(P/S: There's an uninstall tool for previous version of the .NET3.0)
Now, I need to get this on added on as part of the ADS script for our servers here ;)

Monday, August 14, 2006

Strong Naming Enterprise Library 2.0

Mike Wo put up an excellant entry here.