TOGAF Level 1 Examination

By Kenneth 'RabidDog' Clark at December 14, 2011 22:31
Filed Under: Architecture, Work

 

It has been a long time coming. I put it off for way to long and then the expiration of the exam voucher started creeping up so a few weeks ago I decided to book the exam date and get on with it.

 

I will not lie, the stress levels were high. I found a few resources regarding revision and the best ways to prepare for the exam. I also found a significant number of practices test kindly provided by people also studying for the exam.

 

So I decided to adopt my own study still of notes and testing myself. The day before the exam my office was kind enough to give me the day off and I spent it behind the books. After a full 9 hours of studying (yes with breaks between) I went to Systema to blow off a bit of steam. I then arrived home, did some more revision, hit the XBox 360 for an hour and finished the revision.

 

This morning I headed out early and arrived at the exam center 40 minutes early. This allowed me another look at my revision cheat sheet before doing the exam.

 

Going upstairs I was greeted with some nervous faces also writing their exams. After waiting for everyone to arrive we sat down and began the process of registering and opening the test which comprised of 40 multiple choice questions.

 

I started the test and 15 minutes later was finished. Not to brag but I figured that if I didn’t know it, reading the questions over and over wasn’t going to help. So I answered the questions and waited for the results. by God’s grace alone I passed!

 

So now on to level 2!

C# XML and Binary Serialization

By Kenneth 'RabidDog' Clark at November 08, 2011 17:55
Filed Under: C#, Code, Architecture

Recently was working on a small project that required me to store a collection of objects. So I figured I would refresh my knowledge of the serialization available in C#.

 

First I had a look at the XmlSerializer. First you need to define an object to serialize.

 

[Serializable, XmlRoot(Namespace = "http://rabiddog.co.za")]
public class Dog
{
    public Dog(String name, int age)
    {
        this.Name = name;
        this.Age = age;
    }

    public string Name { get; set; }
    public int Age { get; set; }

    //The XmlSerializer requires a default Constructor
    public Dog() { }
}

 

Now that we have the class defined, lets create a collection and serialize that collection to an XML file. Create a console application and then add the following method

 

private static void XmlSerialize()
{
    Dog dog1 = new Dog("Charlie", 42);
    Dog dog2 = new Dog("Jim", 32);


    List<Dog> myDogs = new List<Dog>{dog1, dog2};

    using (Stream stream = new FileStream("MyDogs.xml", FileMode.Create, FileAccess.Write, FileShare.None))
    {
        XmlSerializer xmlSerializer = new XmlSerializer(typeof(List<Dog>), new Type[]{typeof(Dog)});
        xmlSerializer.Serialize(stream, myDogs);
    }
}

 

Then call the method from the Main() function, let it run and you should end up with a file called MyDogs.xml in the debug/bin directory. The file should look something like this

<?xml version="1.0"?>
<ArrayOfDog xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <Dog>
    <Name xmlns="http://rabiddog.co.za">Charlie</Name>
    <Age xmlns="http://rabiddog.co.za">42</Age>
  </Dog>
  <Dog>
    <Name xmlns="http://rabiddog.co.za">Jim</Name>
    <Age xmlns="http://rabiddog.co.za">32</Age>
  </Dog>
</ArrayOfDog>
 

Well that was pretty simple. All we had to do was add the [Serializable] annotation to the class and then create an instance of XmlSerializer to write it to. You could also set the properties to be attributes by decorating them with the [XmlAttribute] annotation.

 

Cool, lets move onto the binary serialization shall we? Using the same Dog class we are going to serialize this down to a binary file.

 

We do that by changing the serializer we are using to the BinaryFormatter:

private static void BinarySerialize()
{
    Dog dog1 = new Dog("Charlie", 42);
    Dog dog2 = new Dog("Jim", 32);


    List<Dog> myDogs = new List<Dog> { dog1, dog2 };

    BinaryFormatter formatter = new BinaryFormatter();

    using (Stream stream = new FileStream("MyDogs.dat", FileMode.Create, FileAccess.Write, FileShare.None))
    {
        
        formatter.Serialize(stream, myDogs);
    }
}

 

Don’t forget to call this method from the Main method. This should produce a MyDogs.dat file in the debug/bin directory. Happy days but there is just one problem. What good is it serializing it if we can deserialize it?

 

First lets deserialize our XML like so

private static void XmlDeserialize()
{

    using (Stream stream = new FileStream("MyDogs.xml", FileMode.Open, FileAccess.Read))
    {
        XmlSerializer xmlSerializer = new XmlSerializer(typeof(List<Dog>), new Type[] { typeof(Dog) });
        List<Dog> myDogs = (List<Dog>)xmlSerializer.Deserialize(stream);

        foreach(Dog dog in myDogs)
        {
            Console.WriteLine("My Dog {0} is {1} years old", dog.Name, dog.Age);
        }
    }
}

 

And the method to deserialize our binary file would be something along the lines of

private static void BinaryDeserialize()
{
    BinaryFormatter formatter = new BinaryFormatter();
    using (Stream stream = new FileStream("MyDogs.dat", FileMode.Open, FileAccess.Read))
    {
        List<Dog> myDogs = (List<Dog>)formatter.Deserialize(stream);

        foreach (Dog dog in myDogs)
        {
            Console.WriteLine("My Dog {0} is {1} years old", dog.Name, dog.Age);
        }
    }
}

 

It thought this was a particularly neat way of storing data on application close. Serialize your object graphs and exit. When you start the application deserialize back to the original state and off you go. No over head of setting up database connections or any other mechanisms of persistence.

 

Yes I know it is old school but is facilitates the requirements for the application I am using. The reason I raise it is because we far to often get caught up in distributed application mentality when something simple like this would do just fine! Below is the enter class file. I hope some one found this useful Smile

 

using System;
using System.Collections.Generic;
using System.IO;
using System.Runtime.Serialization.Formatters.Binary;
using System.Xml.Serialization;

namespace RabidDog
{
    class Program
    {

        private static void XmlSerialize()
        {
            Dog dog1 = new Dog("Charlie", 42);
            Dog dog2 = new Dog("Jim", 32);


            List<Dog> myDogs = new List<Dog>{dog1, dog2};

            using (Stream stream = new FileStream("MyDogs.xml", FileMode.Create, FileAccess.Write, FileShare.None))
            {
                XmlSerializer xmlSerializer = new XmlSerializer(typeof(List<Dog>), new Type[]{typeof(Dog)});
                xmlSerializer.Serialize(stream, myDogs);
            }
        }

        private static void XmlDeserialize()
        {

            using (Stream stream = new FileStream("MyDogs.xml", FileMode.Open, FileAccess.Read))
            {
                XmlSerializer xmlSerializer = new XmlSerializer(typeof(List<Dog>), new Type[] { typeof(Dog) });
                List<Dog> myDogs = (List<Dog>)xmlSerializer.Deserialize(stream);

                foreach(Dog dog in myDogs)
                {
                    Console.WriteLine("My Dog {0} is {1} years old", dog.Name, dog.Age);
                }
            }
        }


        private static void BinarySerialize()
        {
            Dog dog1 = new Dog("Charlie", 42);
            Dog dog2 = new Dog("Jim", 32);


            List<Dog> myDogs = new List<Dog> { dog1, dog2 };

            BinaryFormatter formatter = new BinaryFormatter();

            using (Stream stream = new FileStream("MyDogs.dat", FileMode.Create, FileAccess.Write, FileShare.None))
            {
                
                formatter.Serialize(stream, myDogs);
            }
        }

        private static void BinaryDeserialize()
        {
            BinaryFormatter formatter = new BinaryFormatter();
            using (Stream stream = new FileStream("MyDogs.dat", FileMode.Open, FileAccess.Read))
            {
                List<Dog> myDogs = (List<Dog>)formatter.Deserialize(stream);

                foreach (Dog dog in myDogs)
                {
                    Console.WriteLine("My Dog {0} is {1} years old", dog.Name, dog.Age);
                }
            }
        }

        static void Main(string[] args)
        {
            XmlSerialize();
            BinarySerialize();
            XmlDeserialize();
            BinaryDeserialize();
        }
    }

    [Serializable, XmlRoot(Namespace = "http://rabiddog.co.za")]
    public class Dog
    {
        public Dog(String name, int age)
        {
            this.Name = name;
            this.Age = age;
        }

        public string Name { get; set; }
        public int Age { get; set; }

        //The XmlSerializer requires a default Constructor
        public Dog() { }
    }
}

Microsoft cannot stop being a rebel.

By Kenneth 'RabidDog' Clark at September 27, 2011 10:34
Filed Under: C#, Architecture

Well they have done it once again. Microsoft has never been know to conform to what the world of software engineering classes as best practises. They are also known not to confirm to widely published standards.

 

This is true in their Internet Explorer browser (although with the new versions they seem to be getting there) and other products. Yes I know that is how they make money but it is also the way they are losing a great deal of potential customers.

 

I was investigating the SvcUtil tool earlier and was asked to figure out how to enforce the declarations in the XSD limiting the length of string values. Now it would make sense for a client to support this right? Well not according to Microsoft. The XSD.exe utility also doesn’t support doing this.

 

The ONLY reason I can figure Microsoft didn’t do this is because they believe that the service should truncate and enforce the maximum lengths of the strings being supplied. While this might have you nodding your head going “ah yes, well then they have a valid point” my next question to you is, why is that valid?

 

Sure the contract needs to be enforced on the server side, that is a given. If it is not enforced on the server side it is not really a contract is it? However, does this mean that we should allow huge sets of string data to be transmitted if the first 250 characters are going to be consumed? I don’t think that is viable as you are polluting a call that was probably designed to be as efficient as possible. Still not convinced?

 

Well let me throw it back to the consumer or client. If you are generating a client for a web service and you have not explicitly checked the XSD will you be aware of the restrictions? Well you won’t if you haven’t checked it. Then next thing is this. If the validation of those maximum lengths has fallen to the client to verify, how are you going to do that? How are you going to know that string you are submitting must only be a length of 200 characters? The only way you can do this is to verify that the restriction exists inside the XSD and then implement some sort of check on the field with a message letting you if the max length is exceeded.

 

While this might seem like a viable solution, I am incline to disagree. There is a significant amount of work attached to doing this and if the contract should change for what ever reason, you will have to go back and find all the places you have implemented this.

 

I will be contacting Microsoft with regard to this and try and figure out their thinking behind it and if there is a road map to fix it. Until then, if you have any ideas or suggestions please let me know.

Object Relation Mappers (ORM) vs Stored Procedures

By Kenneth 'RabidDog' Clark at September 21, 2011 15:21
Filed Under: Code, Hibernate, Methodologies, nHibernate, Work, Architecture

Recently I was tasked with doing some investigations as to the best route to go. Now before you go getting all excited I am not going to be posting performance comparisons or declaring an outright winner. What I am going to point out is how to make the decision based on other factors.

 

As I was looking for feed back on the respective technologies it became very clear that this is a holy war that no one can win due to the emotional attachment to our egos and having to be right and the lack of really clear distinctions between the two.

 

First lets look at some basic best practise in writing maintainable software:

  1. Make code readable
  2. Use automated testing
  3. Use version control
  4. Ensure software is well designed
  5. Use less code
  6. Encapsulate
  7. DRY – do not repeat yourself
  8. Loose coupling
  9. Write unit tests

 

This is the essence of what I feel the articles in the reference section encapsulate. The primary reason for writing maintainable code (asides from having to maintain it) is to facilitate change. Businesses are becoming more dynamic and cannot afford to wait for months or years for the implementation of a vision they had. First to market is more important than ever with smaller businesses finding it easier to compete due to software and the internet.

 

Now the generally preferred structure of a software application is view layer, business logic layer and data layer. If designed properly one can very easily attach multiple views for different platforms to the solution without having to reengineer the business logic. The data stores can also be swapped out with relative ease or perhaps extended to include other data stores.

 

So what is a stored procedure? According to wikipedia: “A stored procedure is a subroutine available to applications accessing a relational database system. Stored procedures (sometimes called a proc, sproc, StoPro, StoredProc, or SP) are actually stored in the database data dictionary.”

 

Now the benefits claimed with using stored procedures have always been related to performance. It is a common belief that stored procedures run quicker than generated SQL. While this might be the case with an experienced writer, I have had the distinct displeasure of seeing it go horribly wrong as well. This does not mean that I have not seen it happen in code but generally it is easier to fix the code than the stored procedure due to the unit tests. When changing a stored procedure inevitably you are going to have to change code. When changing DB structure you will have to change all the procedures that use that dataset and the code that maps to it.

 

Now let us get out of the emotional stuff and start comparing apples with apples.

 

If we have a look at the the description above on how to write maintainable code let see how stored procedures match up.

 

  1. Make code readable – Well no, it is a structured query language. While it looks like bad English sometimes it can be difficult to read.
  2. Use automated testing – I haven’t seen a way to automate the testing of stored procedures
  3. Use version control – I have not seen a way to handle versioning of stored procedures with ease
  4. Ensure software is well designed – Being procedural in nature there is very little design that can happen
  5. Use less code – There are certain things you can do in code you can’t do in SQL. So you might end up having to write far more SQL to facilitate it.
  6. Encapsulate – While some might argue that the procedure is encapsulated in the database I would argue that the logic is not encapsulated where it should be.
  7. DRY – do not repeat yourself – With having to name tables and operations continually there is a great deal of replication happening
  8. Loose coupling – Can stored procedures be interchanged between database vendors? Well yes, if you haven’t used vendor specific functions. It is also tightly coupled to the database unfortunately.
  9. Write unit tests – I would if I could! Haven’t seen this in Stored procedures.

 

I am not going to run the code through the same assessment as we all know that code supports all the above. Right lets get into the next point. While stored procedures might perform better, does the saving from the performance increase compliment the additional cost of maintenance attached by using stored procedures? The next question we need to ask is this. How safe is it to have business logic reside inside the database as opposed to the code base? What the you had specific rules for the same entities in a database? You would have to replicate the initial procedure and fine tune it for each entity. Now should the shared logic change you have multiple places you need to go and change. Not good!

 

I am not going to go into data parity mismatching either as that is a seperate article all toghether! Just know that it is there.

 

Lets look at it from the other side. Yes generating SQL to query a database has a certain amount of overhead. That is the only concern that people have. Let me say that again, the only con that using code over using stored procedures has is the performance aspect. So what do we do? Well lets have a look at another definition: “"Premature optimization" is a phrase used to describe a situation where a programmer lets performance considerations affect the design of a piece of code. This can result in a design that is not as clean as it could have been or code that is incorrect, because the code is complicated by the optimization and the programmer is distracted by optimizing.”

 

Is this not what we are doing when we allow the decision to use stored procedures affect our system designs? How about we try this from now on. Lets write the application first, get it working properly (even if it is a single featureSmile) and release it. Once we identify bottle necks we begin to optimise the bottle necks. This might very well include using stored procedures! Lets get out of the dark ages folks. There is no right or wrong in this realm. There is only deliver on time or don’t. Lets deliver on time Winking smile Perfection is generally a refining process any way, expecting it on the initial iteration is absurd.

 

Just to clear up any ambiguity. This article does not serve to prove or disprove the use of SQL and stored procedures. The point of the article is to make you aware that using stored procedures needs to be handled the same as writing code, carefully, with a liberal serving of caution and most of all making sure that what you are gaining is worth what you spending to gain it. Store procedures have their place, as do ORM, procedural languages and hot dogs (in my tummy!)

 

References:

TOGAF Foundation day 1

By Kenneth 'RabidDog' Clark at September 19, 2011 19:08
Filed Under: Architecture, Work

What an interesting day. For a while now I have wanted to do some sort of certification in the enterprise architecture realm. Mainly because I want to see if what I say all the time is actually the case and having a certification proving you know what you talking about never hurts!

 

Well I was extremely pleased with day one of the two day training presented by http://www.realirm.com. The supporting documents are clear, there are no gaps in the presenters knowledge and the environment is fun and interactive yet professional.

 

I was very please to find that my ideas are correct but today also filled in a few gaps I have been struggling with. The thing that has become glaringly clear is that the role of enterprise architect is one often misunderstood. While a technical background is a good idea, a great deal of the initial work is done outside the context of any specific technologies. This is the part I absolutely love! Being presented with a problem or in TOGAF terms a “concern” then finding solutions to that concern. Problem solving is something I thoroughly enjoy, whether it be code based or business based.

 

Really looking to tomorrow and once I have finished the foundational aspect I will most definitely be doing the next level.

 

For more info on TOGAF check out:

http://www.opengroup.org/togaf/

 

Other interesting links

http://www.zachman.com/

http://www.isaca.org/Knowledge-Center/COBIT/Pages/Overview.aspx

http://www.itil-officialsite.com/

The importance of rigid definitions – or why a verbose explanation is sometimes a good idea.

By Kenneth 'RabidDog' Clark at September 14, 2011 00:20
Filed Under: C#, Java, Architecture, Work, Code

So I have been wiping the cobwebs from my Java skills and kicking myself for neglecting them. I suppose with work being focused on .NET development, two young children and a training schedule that leaves very little time for exploration on personal projects, it was bound to happen.

 

Anyway, things have changed now and I am able to squeeze in personal development time by sleeping less Open-mouthed smile. Right, lets get to the point of this article. While designing an API in Java I noticed that I was finding it very difficult to package my classes the way I was doing it in .NET so I started doing some digging.

 

My first thought was to have a look at the access modifiers available in both languages. Do a like for like comparison and see if there were any equivalents. So the C# language has the following access modifiers:

 

C#

  • Public: This is pretty much a free for all. The class can be accessed by everything inside the assembly and anything referencing the assembly. This applies to types and type members.
  • Private: This makes members of the class only accessible to operations in the definition of the class. Kinda like private parts Surprised smile
  • Internal: This allows the the types or type members to be visible from the within the same assembly. So even if a different assembly shares the namespace (for whatever reason) it will not be able to access the internal types or methods of the referenced assembly.
  • Protected: This is a member access modifier that dictates that only types that extend the declaring type can access this member. So a shared property, field, method or function that you want to be visible inside a type extending the type declaring the members but not available internally to the assembly or publically.

 

Right lets move on shall we?

 

Java

  • Public: Pretty much the same as C#. Free for all on everything declared.
  • Private: Again, pretty much the same as C# and the private parts.
  • No Access Modifier: This means that anything declared in the type or the type itself will only be visible in the package space it is declared in. Remember this! It is the topic of this post.
  • Protected: Available to types extending the declaring type.

 

Right lets get to the point of this article. Now that we have established each languages modifiers, lets have a look at this http://www.javacamp.org/javavscsharp/internal.html

 

Looking at that you will see that the C# access modifier “internal” is implied to be the equivalent of the Java default or no access modifier declaration. Does the Java definition behave the same as the C# internal definition? Well have a look at the definitions again:

  • C# Internal: Accessible to everything inside the assembly. This means namespaces moving up to the root namespace and down to the last namespace node.
  • Java No Modifier: Only available inside the package it is declared in.

 

Can you see it yet?

 

Lets have a look at a code sample real quick:

C# Code sample

//Assuming this is inside assembly my.cool.dll
namespace my.cool.project{
  internal class Cheese(){}
}

namespace my.cool{
    public class StartTheCheese(){
        var cheese = new Cheese(); //valid
    }
}

namespace my.cool.project.goes.on{
    public class DigestTheCheese(){
        var cheese = new Cheese(); //valid
    }
}
//end assembly

//Assuming this is inside assembly my.ref.dll
namespace my.cool{
    public class DoWeHaveCheese(){
        var cheese = new Cheese(); //invalid
    }
}

Java Code Sample

package my.cool.project

class CatchMe(){ // note that no access modifier is declared
 //body
}

package my.cool

public class TheCheese(){
    CatchMe catchMe = new CatchMe(); //fails!   
}

You can see it now right? The primary, intrinsic difference is that the C# internal modifier can span multiple namespaces in the same assembly. The Java declaration with no access modifier cannot be seen outside the package my.cool.project. This means that there is no equivalent “internal” in Java. So here is the crux of the matter. If making comparisons, like in maths, we have to find the lowest common denominator before comparing or performing operations of logic in deciding the equivalents. Compare apples with apples to avoid confusion. Things we might take for granted will drive other people mad!

 

References:

Seriously, Do not Repeat Yourself

By Kenneth 'RabidDog' Clark at September 05, 2011 23:53
Filed Under: C#, Work, Architecture

A few projects I have been on and off seem to suffer the same problem. Tight deadlines and the dreaded Ctrl+C, Ctrl+V. I honestly can’t figure out how this happens. Repeated logic is not consolidated into a single method that performs the required actions and returns the result.

 

Let me illustrate the problem very quickly

 

public Class1 CreateInstanceOfClass1(SuperInformation superInformation){
    var myInstance = new Class1();
    
    myInstance.SuperInfo = superInformation;

    return myInstance;   
}

public Class2 CreateInstanceOfClass2(SuperInformation superInformation){
    var myInstance = new Class2();
    
    myInstance.SuperInfo = superInformation;

    return myInstance;   
}

 

Right this is a very simplified example but lets examine it anyway. I am pretty certain that we have all gathered that these methods create an instance of class, assign a shared object to it and return it.

 

Do you notice a pattern here? Every time an instance of the object is created the shared superInformation definition is assigned to the instance and returned. Can anyone see how we are repeating ourselves? How do you think we might resolve this? Well my first thoughts would be to use a generic mechanism to create the instance and assign the shared object to the instance.

 

This might look something like

public T CreateClassInstance<T>(SuperInformation superInfo){
    var output = Activator.CreateInstance(typeof(T));
    
    output.getType().getProperty("SuperInfo").SetValue(output, superInfo, null);

    return output;
}

 

Which now changes our code to in the first example to

public Class1 CreateInstanceOfClass1(SuperInformation superInformation){
    return CreateClassInstance <Class1>(superInformation);
}

public Class2 CreateInstanceOfClass2(SuperInformation superInformation){
    return CreateClassInstance <Class2>(superInformation);  
}

 

Well that is one way of addressing the issue using Generics in C#. A similar mechanism can be applied to if else statements following the same logical flow inside different functions.

 

I guess the point of this article is this. If you copy and paste one piece of code you have replicated that code. If that code contains one bug, you have now created two bugs. If something intrinsic to the one changes you have an additional place to go and change. Perhaps I am just to pedantic but I am incline to state that if you replicate one piece of code, you would be far better off wrapping it into a general method. This doesn’t mean trying to find all places this might potentially happen. In my experience, code bases are organic (well kinda). They grow, they change, the expand, they contract. When the expansion happens, expand with wisdom, when they contract, shrink with wisdom, when they change, change with wisdom. We can all identify a pattern in our code. If you identify one, fix it. I know the deadlines are tight but taking a shortcut now will cost a substantial amount to rectify down the line when the 4th change set comes in. If you identify something that you can fix without adding risk to the project then do it. If it means an extra hour behind the machine, do it.

 

If you are working on a legacy project and are asked to add features to the project be smart. If you see that the previous code base was replicating code, don’t do the same thing! Identify the pattern and figure out how to not replicate the code in your feature set. Do not push these changes across the whole system unless you have done a risk analysis. Keep your area clean. Be proud of your work and craft it, be proud of your teamj mates work and offer feedback. To often it is just a matter of writing as much code as possible in the most contrived fashion possible to prove how smart we are. I tell you something, you are going to look like an idiot when the next guy steps in and has to work with your code. Don’t be afraid to ask for help, don’t be so arrogant as to not give help when asked for. At the end of the day, the success of the project is not based on an individual's effort but the combine effort of the team involved in the project. Work together and deliver something you can all stand back and look at with admiration. If projects fail we need to take a hard look at ourselves and accept responsibility, no finger pointing.

 

Code hard, think hard and polish until  it is done and by virtue of the fact that it continually changes, it never is done Winking smile

Web X.0 is in effect! Cross Site Scripting and the new dev order.

By Kenneth 'RabidDog' Clark at April 28, 2010 14:02
Filed Under: Architecture, Web

After doing some research into cross domain scripting to allow injecting content from one domain to another I cam across two interesting articles. One was regarding the new XDomainRequest object now available in IE8 (http://msdn.microsoft.com/en-us/library/cc288060(VS.85).aspx) and the headers that FireFox has added(? you can add headers without consulting the w3c?) (http://ejohn.org/blog/cross-site-xmlhttprequest/).

Now this is all groovy and everyone is excited. The fireworks are going off, finally we have an answer to a nasty problem! People are singing in the street, hanging out windows smiling and dancing away.

Then comes along little old me. The profit of doom. The realist, the guy who makes the dreams and ideas of business a success or failure. The little monkey who sits behind his desk coding all the business ideas. While I agree it is exciting, I get a little nervous. These new feature sets are only supported by the new browsers, and I mean brand spanking new. Yes one day they will be old but right now they are new. Many people in 1st world countries update their software and hardware more regularly than they change their underwear. Out in the 3rd world countries like South Africa we still have people running Windows 98 with Internet Explorer 4, or Netscape Navigator. Yeah laugh it up and tell them to upgrade. No seriously though, I know business needs to make decisions and people need to keep up, the problem is the trouble you have to go through explaining the issues to business. Inevitably business will tell you to hack a fix together because 95% of their customer base is running Windows 3.11 and Internet Explorer 0.1a. To that I generally reply that the mechanisms for achieving what they want will have to be re-looked at.

The nastiest case is when business has already decided your platform and delivery mechanism. Then heads roll, tears flow and fingers bleed while trying to hack around new technology implementations. Anyways to cut a long story short I worked up this dialog.

[A white walled office with two executives enjoying a cup of coffee and a discussion on what to do next after researching facebook]
Business guy 1: "Ah cool! we can start consuming resources form other domains!!!!"
Business guy 2: "How do you know this?"
Business guy 1:  "I read about it on facebook"
Business guy 2:  "Ah ok, it must be true then"
Business guy 1:  "Cool get the developers to start consuming the other sites"

[Business guy 2 runs to the project manager and gives him the great news. The project manager gets so excited he shaves weeks of the development time to try and get that bonus the business guys promised him should he start getting projects in before the scheduled deadline]
Project manager:  "Right guys you got a week to over haul our faulty, rickety, bug prone website written in out dated languages and glued together by a number of applications on the server doing file replication and downloading using CSV files ever 24.34 minutes. The best part? you get to rebuild it using this glorious new technology! Right, now that everyone is excited, how long you think it is going to take?! “
Mike *in the background* : "2 - 3 days"
Project Manager: "great do it!" 
Me: "ummm, what about older browsers? They won't be able to support this"
Big Boss: "I don't want problems, I want solutions. Now make it happen!" 
Me: "Ok, maybe I didn’t make myself clear when I said '"’won’t be able to support this’, the older browsers DO NOT support this."
Big Boss: "all you ever say is can't can't can't!"
Kenneth: "… but ... "
Skulkinator: "why don't we just write our own browser that supports everything! That way we can take over the planet when we launch it and not have to worry about updates because the updates will be done via the website every time it renders a page, we will call it “Just In Time Page Renderer or (because we in South Africa and love acronyms so much) JInTiPaRe. So we control the web and no one else will use any web browsers because they can’t because we will rewrite the HTTP protocol to suit our specific needs!"
Big Boss: "Yes! Answers! I like that!" How long will that take?"
Mike: "2-3 days"
Big Boss: "Yes! You guys are legends! Do it!"

[ Gun shot rings out *BANG!* ]
Big Boss: "What was that?"

[Team runs off screaming like girls, while I lay in the corner with a big hole in my head]
Big Boss: "Clock is ticking guys! Get on it”
Devlin *mumbles* : “Any one got a spare bullet?”

I am pretty certain you get the point and as if HTML 5 wasn’t enough to worry about, now we got this puppy. This is just a dramatic reaction to something really unimportant and not a cry for help or anything like that, please relax. I am not going to do this at home or work, I listen to the WWE wrestlers.

Happy day to you and yours :)



I am South African. Always have been always will be. I love my country. I love my wife and two children.


I also really enjoy solving problems. I currently work as a Software Architect exploring new solutions for business problems. Having been round the block a few times I enjoy showing new developers how best to solve problems, how to find answers and how to approach solution development.


In my spare time I enjoy riding my super bike, training in Systema and horsing around with my family.


Month List

Visitors

Twitter Feed

6. February 18:01
Unit tests don't check if code works. They PROVE the code works!

12. January 23:34
@Annaling horrific. People like that should face sever punishment. Unless of course they tried to find the cat :(

12. January 08:28
@Annaling to fix cat problems u need a dog :)

9. January 15:34
@UnexpectedPippa my boy is 2. They rock! My daughter, son and myself have endless fun with them!