Well, looks like we want to improve the Scrum in our company.
We need a nail-new
information radiator.
An Information radiator is actually a whiteboard, or a big piece of paper, even better a monitor, sometimes also a true traffic light! and its meaning is to provide status information on the hot projects running in a development team, in a packed, essential and easily understandable form.You could compare an information radiator to an
information cache.
CruiseControl's main page is a good example of information radiator.
The nature of the single sources from where the
informations that have to be displayed are fetched can be totally
inhomogeneousm. In our case, for an example, we want to get our latest
burndown graph displayed, the results of the currently run tests, analysis tools results, bug graphs, current build status, and even coffee machine status, or toilet paper-o-meter.
So what we actually want, is kind of
an information center about the
activites of our company, which should display status of X projects in a
choosen format and a specified sequence.
Especially it should be
minimalistic. Totally minimalistic. Showing only the essential, that is. For an example, we are not
intrested in showing any log data in it. Or error / warning messages that
occoured through the build process, even execution information would be skipped for an example. That kind of
detailed information can be fetched from the
primary source of information, for example the builder /compiler reports
themself (in our case the
CruiseControls project status pages). The information radiator only resembles a
quick view of what is going on in our company.
Now that the idea is clear - how do we get this beast together?
The ratio of the above is :
We want to present information fetched from inhomogeneous sources in a compact, distilled and easily understandable form on a single medium easy-accessible medium.There will thus be a need for
a) homogenization of information (from the different sources)
b) presentation of the homogenized information
c) last but not least : scalability
Suppose our company has 1000 projects going on, with 100000 employees, 34000 test cases and 3000 different test tools. We need a system which could merge the relevant
status information from
all of the source that have been included in the display cycle on one single information radiator.
The first thing that comes to my mind is
CORBA, for some strange reason. It is scalable, customizable (thus can homogenize different information sources), and can be supplied with a good presentation logic quite easily. The reason why I thought of
CORBA is actually that the
behaviour of our information radiator shows up many parallels with the behaviour of
CORBAapplications.
But of course, we don't have
CORBA nor do we plan to use it. Our needs can be easily
fullfilled with simple
webpages sa well. We will "borrow" some of
CORBA's paradigm pieces to find an easy solution, for an example
by separating presentation logic from the information sources through the use of adapters.
Im a big fan of
XP, so since I have enough design to start with, I'll start right away.
First I'm going with the presentation logic (the easy part, and the one that gives more satisfaction :) ). The idea is to use Ajax to load the pages from a specified location, and Javascript to refresh the page's content. So first we are looking at the
timed events in javascript.
Javascript supports
timed events through two methods :
setTimeoutclearTimeoutSince the presentation logic will be based on Javascript, this is a good occasion to dive into
Javascript's classes - which I haven't been doing since I was at university.
Javascript is very
powerfull. But that we know already. Fact is that Javascript
doesn's support classes. Java is a language for
prototype-based object modeling. Everything in Javascript is an object.
Everything. Every object in Javascript has a so-called "prototype", which can be
raffly compared to the generic class definition of common
OOP languages like Delphi, C#, C++, and (yes sadly) VB. The objects in javascript are
dynamic objects, which means that you can add new properties, methods, or anything you like at any point of execution to any of the objects you have defined. object's prototype. Confusing, ha? But nifty. This actually gives you a total freedom about structure control. On the other hand, the definition of a "class" in the classic sense is a bit different in Javascript. For instance, as I told you already, classes need to be defined differently than from other programming languages, starting from an object's prototype, more than from a single (static) class definition. What this means practically is :
a) you will find no "class" keyword in Javascript or whatsoever
b) The most common way to define a class is to construct it starting from an object's prototype
Point a) is pretty much straightforward. Point b) is the obscure part.
But just think: if anything in Javascript is an object, and thus has a prototype, we can construct a class out of
everything. The most common way is to use a function prototype. In our case, for an example, I want to make use of the Ajax technology for updating the
slideshow on the Information radiator. I will thus need a class to group this kind of behaviour, and of course I need some code (a function) that initializes the
XmlHttp Object (depending on the browser
etcetcetc..). So suppose our function will look like this :
function XMLHttpFactory()
{
try
{
// Firefox, Opera 8.0+, Safari
this._xmlObj = new XMLHttpRequest();
}
catch (e)
{
// Internet Explorer
try
{
this._xmlObj = new ActiveXObject("Msxml2.XMLHTTP");
}
catch (e)
{
try
{
this._xmlObj = new ActiveXObject("Microsoft.XMLHTTP");
}
catch (e)
{
alert("Your browser does not support AJAX!");
return false;
}
}
}
}
This function will not only instantiate the XmlHttp Object but also be our "spinal" for the XMLHTTPFactory class. The "self" item references the object's prototype.
In fact, we can add more behaviour to the function's prototype by adding a (private) variable for storing the reference to the XmlHttp object:
//Variable for XMLHTTP Object
XMLHttpFactory.prototype.__xmlObj;
//Getter
XMLHttpFactory.prototype.getXmlObj = function () {
return this.__xmlObj;
}
In the same way, we want to provide more functionality for our XMLHTTP factory to react to different requests issued to the server in specific ways.