Agile Manifesto

I was thinking back years ago when I was shown the Agile Manifesto… just recently I fired it up to re-read it.  Worth the post here again:

http://agilemanifesto.org/principles.html

Principles behind the Agile Manifesto

We follow these principles:

Our highest priority is to satisfy the customer
through early and continuous delivery
of valuable software.

Welcome changing requirements, even late in
development. Agile processes harness change for
the customer’s competitive advantage.

Deliver working software frequently, from a
couple of weeks to a couple of months, with a
preference to the shorter timescale.

Business people and developers must work
together daily throughout the project.

Build projects around motivated individuals.
Give them the environment and support they need,
and trust them to get the job done.

The most efficient and effective method of
conveying information to and within a development
team is face-to-face conversation.

Working software is the primary measure of progress.

Agile processes promote sustainable development.
The sponsors, developers, and users should be able
to maintain a constant pace indefinitely.

Continuous attention to technical excellence
and good design enhances agility.

Simplicity–the art of maximizing the amount
of work not done–is essential.

The best architectures, requirements, and designs
emerge from self-organizing teams.

At regular intervals, the team reflects on how
to become more effective, then tunes and adjusts
its behavior accordingly.

Followup- check out Mark Shumann’s blog post ‘The one essential Agile ingredient’

JavascriptMVC

I stumbled across a very cool framework today and wanted to pass along the links and description:

http://javascriptmvc.com 

From the website:

JavaScriptMVC is an open-source framework containing the best ideas in enterprise JavaScript development. It guides you to successfully completed projects by promoting best practices, maintainability, and convention over configuration.

 

What’s Inside?

We’ve made everything you should be doing as easy as possible.

  • Maintainability via the ModelViewController architecture pattern.
  • Application Concatination and Compression via include.
  • Testing via Test.
  • Documentation via include.Doc.
  • Error Reporting via DamnIT.
  • Updates and Dependancy Management via update.
  • Ajax and DOM functionality via jQuery.

I suggest watching the video on their website.   The framework is very ‘ruby on rails’ like in it’s concept. 

I could see utilizing this technology for example with ASP.NET MVC and Json ActionResults as a way to facilitate the data requests from the model via a RESTful architecture approach.

Learn more here:  http://javascriptmvc.com/index.html#&who=learn

Web Dev Update: ASP.NET Templates – YUI 2 – Grails

I’m going to combine these two short comments together

ASP.NET MVC 2 Templates

Brad Wilson does a good job explaining some features of the asp.net mvc 2 templates:

http://bradwilson.typepad.com/blog/2009/10/aspnet-mvc-2-templates-part-1-introduction.html

 

YUI – Treeview and Datatable Together

Carlos Bueno blogs about the YUI 2 features of linking a treeview and datatable together:

http://www.yuiblog.com/blog/2009/10/12/using-yui-treeview-and-datatable-together

Carlos was kind enough to email me a response on using this with asp.net mvc.  Here is the snippet:

You create an AJAX endpoint that returns data in the format described in that link. 
Then instead of a static javascript datasource, you instantiate a json data source 
and give it the URL to pull from:

var myDataSource = new YAHOO.util.DataSource("/foo/bar/some-data");
myDataSource.responseType = YAHOO.util.DataSource.TYPE_JSON;

To change the URL (and thus refresh the table) you would call datasource.sendRequest() 
with a new querystring, like so:

var requestString='QUERY=’ + some_query + ’&sort=timestamp&dir=asc&startIndex=0&results=25';
var oCallback = {
  success : myDataTable.onDataReturnSetRows,
  failure : myDataTable.onDataReturnSetRows,
  scope   : myDataTable,
  argument: myDataTable.getState()
};
myDataTable._oDataSource.sendRequest(requestString, oCallback);
 
See: http://developer.yahoo.com/yui/examples/datatable/dt_dynamicdata.html

.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, “Courier New”, courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }

 

More on Grails – Simplifying Java EE With Grails

Graeme Rocher introduces Groovy and its corresponding web framework, Grails, followed by a code writing demo intended to highlight the advantages of using Grails over Java EE in order to develop web applications.

Learn more here:

http://www.infoq.com/presentations/Web-Development-Grails-Graeme-Rocher

I’m very impressed with Grails!

Web Dev Update: ASP.NET Templates – YUI 2 – Grails

I’m going to combine these two short comments together

ASP.NET MVC 2 Templates

Brad Wilson does a good job explaining some features of the asp.net mvc 2 templates:

http://bradwilson.typepad.com/blog/2009/10/aspnet-mvc-2-templates-part-1-introduction.html

 

YUI – Treeview and Datatable Together

Carlos Bueno blogs about the YUI 2 features of linking a treeview and datatable together:

http://www.yuiblog.com/blog/2009/10/12/using-yui-treeview-and-datatable-together

Carlos was kind enough to email me a response on using this with asp.net mvc.  Here is the snippet:

You create an AJAX endpoint that returns data in the format described in that link. 
Then instead of a static javascript datasource, you instantiate a json data source 
and give it the URL to pull from:

var myDataSource = new YAHOO.util.DataSource("/foo/bar/some-data");
myDataSource.responseType = YAHOO.util.DataSource.TYPE_JSON;

To change the URL (and thus refresh the table) you would call datasource.sendRequest() 
with a new querystring, like so:

var requestString='QUERY=’ + some_query + ’&sort=timestamp&dir=asc&startIndex=0&results=25';
var oCallback = {
  success : myDataTable.onDataReturnSetRows,
  failure : myDataTable.onDataReturnSetRows,
  scope   : myDataTable,
  argument: myDataTable.getState()
};
myDataTable._oDataSource.sendRequest(requestString, oCallback);
 
See: http://developer.yahoo.com/yui/examples/datatable/dt_dynamicdata.html

.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, “Courier New”, courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }

 

More on Grails – Simplifying Java EE With Grails

Graeme Rocher introduces Groovy and its corresponding web framework, Grails, followed by a code writing demo intended to highlight the advantages of using Grails over Java EE in order to develop web applications.

Learn more here:

http://www.infoq.com/presentations/Web-Development-Grails-Graeme-Rocher

I’m very impressed with Grails!

Role of P&P Team in the Microsoft Dev

Lately I’m trying to sort out exactly what the role of the Microsoft Patterns and Practices team. 

Couple of example come to mind:  Prism and Unity.

Currently, I’m starting to wonder if they just code up some tools and then drop supporting them.  First step, go visit their website:

http://msdn.microsoft.com/en-us/practices/bb973206.aspx

There is one, yes one ‘Recent Update’ that is marked as 2009.  The rest is 2008.

“Unity Application Block 1.2 (October 2008)”

I have even read where developers were told it would open for contributions, but for over a year now, no contributions have been applied.

Silverlight, one of the hottest new technologies from Microsoft – we have ‘Prism’ for building composite applications.  They promote Prism, and yet again, the last download release is from February 2009  http://www.microsoft.com/downloads/details.aspx?FamilyID=fa07e1ce-ca3f-4b9b-a21b-e3fa10d013dd&DisplayLang=en

What concerns me is I have gone to clients who use these tools because they are ‘from Microsoft’.  But I’m not too convinced they represent the best patterns and practices.  Actually I am starting to consider them writing tools that they promote (many times against existing open source projects that are kept relevant) and they abandon.

Even going to the Codeplex, they have a survey where you can provide input… well, that survey has been closed for quite some time now.  But the site isn’t update.   It doesn’t seem very professional, and yet they claim to be agile, collaborative, etc… and I’m to entrust companies into using their software and yet they don’t appear to support it very well.

We call this approach, “customer connected engineering” and it ensures that what we deliver actually meets the needs of our customers.

Another example is their new flagship Blend product for Silverlight – well, Prism isn’t very friendly with Blend.  There are individuals (the MVVM light toolkit) that strive to provide compatibility with Blend, and yet the Microsoft team that does Prism has hasn’t update Prism since before the release of Silverlight 3

Once we understand the scenarios and technical challenges, we work with product and technology teams across Microsoft, industry experts, and with customers and partners, to build guidance that reflects both the current, practical state of the technology and that is also aligned with future Microsoft technology plans. Often, the underlying scenarios and solutions guidance ends up influencing future Microsoft product direction.

and the latest Blend.   I’m not sure how to read them not updating their best patterns and practices – it would seem their pattern is to not provide updates and their practice is to well… not to follow an agile collaborative environment with the Microsoft community (see their quote below).

I don’t really want to rant negatively toward these tools and practices, but it concerns me when I don’t see any follow up to these tools.

We employ an Agile software engineering process is a combination of SCRUM style project management with XP development practices. Our work area is a mix of collaborative development rooms, where entire teams sit and work together, augmented with private spaces and offices. The layout allows us to run many projects simultaneously.

I’m guessing their iteration cycle on Unity using Agile is that they have a year long iteration cycle ?   :)  I wouldn’t really care too much about this, as I typically look outside of MS for innovation and proper tooling, but at the same time, it just seems like a wasted potential opportunity to really provide best of breed tooling for Microsoft developers.

So I read about current, I read about customer connected, I read about agile – then I goto evaluate the tools and see it’s all outdated, not up to date, there isn’t a way to provide effective input.  My conclusion: it’s just another marketing tool to promote MS but not to really support it in our day to day operations.  Makes for good demos I was told.

C# 4.0 ExpandoObject

I haven’t had a chance to really look at C# 4.0 but there are certainly some cool features in it.  One of them is the oddly named ‘ExpandoObject’.

Alexandra Rusina writes about the ExpandoObject on his MSDN blog – check it out!

In his example he takes this:

XElement contactXML =
    new XElement("Contact",
        new XElement("Name", "Patrick Hines"),
        new XElement("Phone", "206-555-0144"),
        new XElement("Address",
            new XElement("Street1", "123 Main St"),
            new XElement("City", "Mercer Island"),
            new XElement("State", "WA"),
            new XElement("Postal", "68042")
        )
    );

.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, “Courier New”, courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }

 

written in Linq to Xml and with the ExpandoObject is able to work with it like this:

dynamic contact = new ExpandoObject();
contact.Name = "Patrick Hines";
contact.Phone = "206-555-0144";
contact.Address = new ExpandoObject();
contact.Address.Street = "123 Main St";
contact.Address.City = "Mercer Island";
contact.Address.State = "WA";
contact.Address.Postal = "68402";
 

You can also work with a collection : ie.

dynamic contacts = new List<ExpandoObject>()
 

Which gives you this:

foreach (var c in contacts)
    Console.WriteLine(c.Name);
 

-or-

 
var phones = from c in (contacts as List<dynamic>)
             where c.Name == "Patrick Hines"
             select c.Phone;

.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, “Courier New”, courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }

 

– instead of this-

 
foreach (var c in contactsXML.Descendants("Name"))
    Console.WriteLine((string)c);
 

Ok, I don’t mean to rewrite his article, so go read it if your interested –I think this a cool feature!

.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, “Courier New”, courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }

 

.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, “Courier New”, courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }

.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, “Courier New”, courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }