On.. My Internet Hive Mind

I no longer know anything.  I have ceased to hold knowledge in my brain for long periods.  Effectively my mind has become an array of pointers to actual information sources powered by a sophisticated search and retrieval system.

What has caused this complete emptying of retained knowledge?  The internet.

It is now easier and more reliable for me to look up solutions to problems than to work them out for myself.  A quick search with the correct key words or phrases and I’ll have the answer to my question in minutes.  When presented with a bug, unless it is something very obvious, the error is copied and pasted into Google, in quotation marks with msdn added to the end.  A few seconds later I’ll be staring at the answer to the issue.

Is this bad?  Yes!  I’ve stopped understanding at a level that I would like the issues affecting my code.  I can find an answer, work through the steps to fix the problem, get the code running again and forget about it, without truly understanding what I have just done.  In the long term this can’t be good for the quality of code.

Is there a solution?  Yes!  I work on a couple of applications on the way home on the train each evening.  Its a thirty minute window with no internet access.  If I come across a problem I need to fix it by working through the issues.  If I don’t know how to do something off the top of my head I need to check out what the .NET framework will let me do and what methods are available.  Occasionally I will need to look something up, which I can do when I get home, preferably in a book, but once or twice I’ve taken to the internet for answers.

By trying to limit my internet use I have found that I have a much more complete understanding of the solutions I am building on the train, which in turn means I am fixing bugs faster, and stopping them occurring in the first place more often.

If you are finding you are using the internet as your default bug fixing tool perhaps it might be worth having a “no internet answers” day or try programming and application or a module without referring to the internet for your answers.  If it is overly frustrating at first then you know that you are relying heavily on other people to solve your problems.

On.. Web based adverts

It didn’t come as a huge surprised that the demographic of people that click on adverts when browsing the web are not necessarily the most savvy of people, or indeed the people that you might want visiting your site.

I run a couple of sites that could happily take adverts as a source of revenue, the problem comes that I want the relationship to work for both parties.  Sure I could just bung on some google adwords and get a bit of money each month, but its not good enough, I’ll have no real relationship with the people advertising on my site and no real control over the quality of the products being advertised to my users.  Then there are the users who automatically block adwords and the like, so there is no benefit for advertisers there.

The unfocused and all pervasive nature of internet advertising has created a situation where they are no longer doing what they intended.  What advertising through google and other advert aggregators is basically a scatter-gun approach, spray your message over a large area and someone might see it, hardly the well targeted advertising that might actually achieve some results.

I’m guessing that Adwords and the like must work for some people otherwise they wouldn’t pay for it?  Or is it just a case of hard numbers, it is easy to track so anything that comes through looks like success.

The problem isn’t that Adwords exist, its the fact that a suitable alternative is difficult to come by.  I’ve often considered sponsorship for sites, however I feel that is the road to having to consider your content in relationship to your sponsors.  Maybe this is the commercial reality of wanting to fund your website activities, somewhere along the line you are beholden to someone if they are putting money in.

I’m intrigued by things like Ebay affiliates and the similar Amazon scheme.  They seem much more targeted, for my there is an issue around customisability, I’d like to make them much more dynamic, maybe have the searches and results based on the meta data within the page, or content, yet it doesn’t seem to be able to handle this.  With the ebay one in particular I’d like to make all links on my site to ebay go via my ebay affiliates ID, they don’t offer this as an out the box solution, I can hack a solution together, so it appears that the link came up on one of the searches it displays in its banner, but I’m not sure if I’ll violate some terms of service agreement and forfit and money from it.

The big issue is that if online advertising metrics do start to show a negative correlation between the desired results and the actual results then the bottom falls out of the web, again.  Maybe bubble 2.0 won’t be the result of an over abundance of social networks and candy floss websites, but it’ll be as a result of never getting a proper handle on high quality advertising revenue models.

On.. Platform Vs. Software

I read with a wry smile this morning Paul Stovell’s blog entry for the software super villan that is “Platform Man”. I’m currently living with the chaos that platform man can cause. We are coming to the end of our first phase of Sharepoint development, I argued early on that we should use Sharepoint as a document storage solution and program everything else ourselves. However platform man struck and suddenly Sharepoint was the solution to all of our problems for sites and content management, with “just a bit of customisation”. This was a mistake. We knew this at the time, but platform man stuck and that was the end of it.

So the question is how do we recover from this, Sharepoint is about to become the central tool for information within the company, we don’t want to loose the last years work. That’s right folks a years work to change how the sites look, have our staff members search-able and create a handful of custom web parts. Hardly rocket science for most software developers, but once put through the mangle of the Sharepoint web front end and you are living in a whole world of pain.

The trick when you’ve got yourself in this situation and as you face future developments is to establish scope. What is going to live on your platform. Rather than blithely saying “everything will now go on here” and then spend months working out a way to shoe horn it on. Establish the rules around new work and what your current ‘platforms’ strong points are. Sharepoint as a ‘platform’ can do all sorts of things, but then again Word can be used as a website editor. So you establish what it is you are using it for.

For Sharepoint I’d like to be proposing only documents, web/html content, collaboration space and exchange interaction. Anything that needs reporting on will be in a separate database, anything that wants interaction beyond the standard Sharepoint interaction will be a separate application (ie anything with Ajax or Silverlight). Then there are applications that may need a slick front end by have a document management aspect to them, this is where we use Sharepoints document management with a separate front end to query it, something like an image library would be the perfect example of this.

This means we’d be using each thing for what its best at as well as setting a precedent for future technology buy in, managing to avoid the curse of Platform Man.

On.. Development Nirvana (part 2)

When I looked at how to improve our development processes and environment I gave myself 10 scenarios or stories to deal with. Situations that occur regularly that we could improve, or at least have a set way of doing. This wasn’t a comprehensive list just a starting point, I’m sure in a couple of months I’ll have another 10, but just because you can’t fix everything doesn’t mean you shouldn’t fix something. That may have been a triple negative…

So I’ve taken my 10 stories and written against them what I would like to happen. This makes me clarify what I’m trying to achieve, saying “I want a better development environment” is a fairly empty phrase without detailing how it is you would like to work.

1. Working for the first time on an existing project

What I would like to happen : I open up Visual Studio, load the project from somewhere, get the current working version of the code that builds and connects to the test/sandbox database if required.

2. New project starts up

What I would like to happen : When a new project is authorised, rather than a personal local development, it will create a centralised project store, an intranet site to track documents or progress, and it will send an email to certain people to announce all of this has occurred.

3. Project finishes

What I would like to happen : Code is stored as a release version, intranet site and documentation are moved from a project location to a reliable information store as a reference point. Post project documentation is completed and added to the site.

4. Team working on same application

What I would like to happen : Members of the team should be able to edit files within the same solution and within the same project. They shouldn’t be able to edit a file that someone else is currently editing. They shouldn’t be able to add or update files to the solution/project that will stop it from building, or that don’t conform to our coding standards. I should be able to find out who lasted edited a file, or indeed particular lines of code.

5. Error occurs in code during development

What I would like to happen : It will be easy to find out who last edited a piece of code, or one of its dependencies, it will also be easy to find out why that line of code was edited and who the project owner is.

6. New application needs to be deployed

What I would like to happen : An installer is handed off to one of the IT or infrastructures team and they will be able to deploy it in the required environment with minimal amount of setup. It will work.

7. New Webpart needs to be deployed to Sharepoint

What I would like to happen : A Webpart package will be handed off to the IT or infrastructures team and they will install it against the required Sharepoint system. It will work when activated.

8. An Error occurs in code after launch

What I would like to happen : An error will be either catastrophic or it will be fixed in the next version. If it is a catastrophic error, ie one that means people can’t use the application, a branched version will be developed to fix the issue, that branch will then be bought in line with the main code over the next full release version. Someone other than the development team decides if the error is catastrophic or not.

9. Working from home

What I would like to happen : I connect to my work network from home, I have all my current project code and intranet information available to me, without having to utilise remote desktop. I can interact with development systems as if I was at my work PC.

10. You pick up work for a different project

What I would like to happen : I can raise a flag that I have started work on this task, even if it currently ‘belongs’ to someone else. My time worked on this task will be recorded against it.

The next stage is to take “What I would like to happen” and turn it into “How to make it happen”. From that you can infer where you need new tools or processes and where you can start to improve the situation immediately.

That forms the basis of Part 3 of the article.

On.. Model View Presenter

As previously stated I’ve been using Model View Presenter as a design pattern in some form or other for over a year now. My understanding of how to implement it and the way I’ve used it have changed over the past year, but the fundamentals have remained the same. Recently I have been preaching the gospel of MVP to my co-workers, in fact I’ve written into our coding standards as our current best approach for application development. Whilst my previous MVP entry was aimed at those that understand the principle and want to implement it I am aiming this at those that want to learn what it’s all about.

A word of note, I’ll not be touching on Model View Controller, MVC.NET and any of its REST like abilities, because although they may be related in some abstract design way, implementations of MVP and MVC are different.

There are many good reasons to use MVP, testability, separation of layers, common application structure across different development streams, all of which have been documented and are part of the rise of interest in MVP. For me one of the main advantages about MVP is the way it separates it’s layers, it helps create a clear and focused design and development process. Even without the testability I find this reason enough to use MVP as my pattern of choice.

Like most patterns MVP is best represented by a diagram:

Model View Presenter Diagram

Click image to enlarge

Also like most patterns, the diagram can seem relatively impenetrable when you are first starting out trying to understand it. Whilst you can ramp up the complexity of your implementation quite quickly a basic understanding is a must. You can see in my previous post about a VB.Net MVP template an example of Hello World developed with the MVP pattern.

It is simpler to think of MVP in terms of separation of layers to begin with than it is to think of it in terms of calls and communications between classes. The following diagram shows the layer separation at work within my implementations of MVP:

My version of the diagram

MVP In Use

Click to enlarge

In effect it is a simple n-tier architecture. The View that implements the IView interface only cares about its properties and how it is displaying them. The Model only cares about its methods and how it is going to get the information requested of it. The Presenter only cares about your abstract logic and being the vessel for passing calls between the View and the Model. For database driven web applications the methods in the presenter can often just be the hooking up of a View property to a Model method to return the required data.

Once you have straightened out how the tiers work in MVP the next hurdle was what “knowledge” each of the parts have about each other. I’ve done this in a cascading manner, the View instantiates a Presenter, the Presenter is passed the View, when it is instantiated, and in turn instantiates the Model. The Model handles data access through helper classes and business objects. So the View only knows what Presenter it’s using, the Presenter only knows it has a View and a Model, the Model doesn’t know where its data is going to, but knows how to get it. In this way every part of the code is essentially hot swappable in a modular manner. We can completely rework the entire Model and never have to worry about changing anything in the View, and vice versa.

That’s the theory anyway.

My actual implemention, or: How I develop software.

Whilst the Pattern of MVP is relatively well defined actual implementations may vary. This is how I implement Model View Presenter.

My View interface will usually consist of a series of properties that I will have indirectly bound to controls. To establish my view I sit down with a pen and paper and work out my UI elements, text entry boxes, lists, comboboxes and whatever else might make up your particular interface. From there it is a case of working out what type of property they will be, if something will always be a number I’ll define it as an integer, otherwise it usually ends up as a string or a collection, I have recently been moving away from Datasets towards using collections.

During the design phase of my project I will sit down and work out what my program actually does. Most database back ended applications tend to have insert, update and delete, with a few other bits and pieces thrown in. For my Skimmp3 application I have a bit of paper that says “Get all the links on a website that are mp3s, download all mp3s from a website” and that is all. These inform me of what my model level should be doing. I can infer my methods from these lists of What does my program do?

For my own projects I will also define my business objects, what will be passing through my program? What will I have collections of? Sometimes the things that have fallen out of “What does my program do?” will work better at an object level, for example “Save Settings”, you may have a settings object that you put the Save() method in, it seems more sensible to put it with object than in the model.

At this point I’ll usually start bashing away at code. First defining my objects, then defining my model interface, I’ll implement the interface in the model class and then fill in skeleton functionality.

I then like to return to my View and implement an interface, whilst hooking up the form (windows or web) controls to the properties of the View.

This then leaves me to wire it all up with the presenter. In theory at this point it will all compile, but not actually do very much. By fleshing out the Model the full application starts to take shape.

If anyone wants a bit more detail on my development process drop me a comment and I’ll write an entry about it, I’m sure it’s not revolutionary, but it seems to work.

Difficulties

I’ve found two main problems with MVP as a pattern.

Starting out can be problematic, particularly if you have traditionally put the majority of your code directly in your code behind with the occasional data access class. MVP seems a cumbersome way to achieve something that you can achieve with fewer classes. It also a little confusing to set up for the first time, where to create objects and in the case of ASP.NET applications when to create them. All I can say to this is give it a go on a couple of small projects to get used to it. It really is one of those times when doing rather than talking gets you somewhere. Just don’t be put off by the first time, it can be tricky to begin with. I’ve started out with my VB.NET template when instructing other people how to build MVP applications by keeping everything in one project. Once the pattern is successfully understood then moving the Presenter and Model out to separate projects isn’t a huge leap. The most useful aspect of the Template I think is learning when and where to instantiate the Presenter and the Model. My first few attempts at doing MVP resulted in a lot of null reference exceptions!

The second issues I’ve found is events. This is mainly a problem for ASP.NET and the page lifecycle, if you are triggering events at the model level and passing the values back by the time it hits the view it can require a bit of thinking about when objects exist and when events are raised at the model level if those objects will still exist. It is a little more straight forward with windows forms although it still requires a reasonable amount of thinking through when considering the flow of information and event handling.

I hope this has been useful. If you have any questions I’ll do my best to answer them. I’ve helped a number of people get started on MVP and have written a number of real world projects myself using the pattern, so I should be able to help. Good luck with your implementations…

On.. Development Nirvana (part 1)

It seems there is a lot of talk.  The internet is full of it.  In the development community a lot of this talk is about easy, better, more fun, more innovative, more efficient, more impressive ways to develop.  The things is there is so much of this stuff that it is difficult to know what to, what to aim for.

So I’m going to attempt to work out what would currently be development nirvana for me and the team I work with.  Then ladies and gentlemen, I’m going to work out how to make it happen, rather than just talk about it.

The Constants

Okay here are my constants :

Team of about 6 developers
1 DBA
Multiple projects
.NET Based, developing in Visual Studio 2005
SQL Server
Sharepoint as major platform for deployment

These are things that we can assume won’t change, at least they won’t change for a good few months.

The Variables

When looking at what we have in place now here are the things that need changing:

Currently using Visual Sourcesafe for some projects, but not all
No Coding standards (although we have talked about them)
No Consistent deployment method (although we have talked about it)
About to start implementing more agile processes (worklogs, sprints etc.) (after talking about it for a long time)

The Approach

So there we have the boundaries in which we have to work.  Now, like a good programmer might, I need to optimise the environment in order to make it efficient at doing its job.  For me development nirvana can be summed up in one sentence; Nothing getting in the way.  That is the aim.  What principles can we apply to make this happen.

I’m going to take a tip out of Paul (our project managers) book and do some user stories of what I would like to happen in certain scenarios.  This is my starting list, I shall have to write the story of what I want to happen for each :

1.  Working for the first time on an existing project
2.  New project starts up
3.  Project finishes
4.  Team working on same application
5.  Error occurs in code during development
6.  New application needs to be deployed
7.  New Webpart needs to be deployed
8.  An Error occurs in code after launch
9.  Working from home
10. You pick up work for a different project

I will keep referring back to and updating this list, for the time being though these are the things that I would like to be as painless as possible.  I’ll attempt to tackle each one in turn, however I suspect that solutions for one thing may well provide solutions for another, or in some cases create new pain and new problems.

The act of simply listing the things I would like to be able to do smoothly has stimulated thought and created boundaries within which to make my own working day a lot easier and more fruitful.  Maybe you can give it a shot too, write ten things that you do regularly, then for each one see if there is a more efficient or better way of doing it.

On.. MVP Implementation and Project Template

I’ve been implementing Model View Presenter as a pattern for the best part of the last year in a range of projects. I think I’ve got a good handle on working with it, at least all my implementations work and are easy to maintain. The way I’ve implemented it has evolved over the past year through reading more, putting it into practice and discussions with collegues.

A Quick Intro to MVP
Model View Presenter (MVP) is an attractive way of working because of the level of layer abstraction it exhibits and the testability of the layers, particularly useful if you are an ASP.NET developer. I like the clear separation of each layer and the fact that one need not know how the other layer is implementing the interface. More to the point, it doesn’t care.

The best diagram I’ve found of MVP was this one on Flickr. It also compares it with the Model View Controller pattern. I didn’t like the circular nature of communication with MVC, one of the advantages of MVP to me is that as you scale the system you can completely rewrite any one section of it without breaking it. For example you can move everything from the Model backwards (towards the database) into a web service, or into WCF. Alternatively your designers now want the front end to be Silverlight, so you modify your View implementation to be Silverlight, without touching another part of your code. More to the point if you did both of these things the only part of your application that would have knowledge of that would be the layer adjacent to it.

On to my implementation.

So here it is, The view of my solution explorer when I open up my new VB.NET MVP Web Application Template (download Here and follow this entry through).

MVP Solution once opened

Like all these templates its probably better to go through and rename everything as you wish, it takes a little longer in an MVP projects. On which note I’ll just add that working with interfaces and carrying function names all the way down through the layers can result in some slightly longer refactoring times, but its not that bad.

So the first problems I came across when implementing MVP was how to hook everything together. The Template does all that. I now work on the basis that the View only knows what Presenter it is using, the Presenter knows the View (because it gets passed to it) and the Model. The Model will know the Data Access Layer and other Helper classes.

Right lets create a Hello World web app with this MVP template. I’m going to get the String from the Model so you can see it passing through the system.

My interface for the View will have a property of Message As String, the interface for the Model will contain Function GetMessage() As String.

I drop a label (Label1) onto the Deafult.aspx which will be implementing IView1, I then add the following code to the Default.aspx.vb. :

    Public Property Message() As String Implements IView1.Message
        Get
            Return Label1.Text
        End Get
        Set(ByVal value As String)
            Label1.Text = value
        End Set
    End Property

One day I’ll work out how to get binding oriented programming working and then I’ll make Paul Stovell happy.

Next I’ll do Model1, to which I add

    Public Function GetMessage() As String Implements IModel1.GetMessage
        Return "Hello World"
    End Function

Now the next bit is where the magic happens baby. In the Presenter I add the following:

    Public Sub GetMessage()
        m_View.Message = m_Model.GetMessage
    End Sub

Now all that remains is to go back into our View/Default.aspx and tell it to use the presenter to get the message. I’ll do this in the page load event, but we could hook it up to a button click or whatever if we wished.

    Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
        m_Presenter.GetMessage()
    End Sub

Lets hope thats working for you, because it doesn’t get simpler than that. If you put a breakpoint on the m_Presenter.GetMessage() line you can step through the code and see how the layers are separated. In full applications I like to keep the Presenter layer for abstract and business logic, whilst the Model should be dealing with data and how its getting it. The Presenter should have no knowledge of where the actual data is coming from or how it is being transformed before it gets to it, it knows it wants a String, or whatever it is your function requires be returned, as long as it gets it, it is happy.

Lets do something silly. Lets add a Helper class that will return our string instead. Functionally this is the same as moving your datalayer from being SQL to Oracle or Access or Excel or a Web Service. I’m going to add a class called MessageFetcher.vb to the Helper folder. The entire class looks like this:

Public Class MessageFetcher
    Public Function GetsMeAMessage() As String
        Return "Hello World, from further away"
    End Function
End Class

I now change Model1 GetMessage() Function to read thusly :

    Public Function GetMessage() As String Implements IModel1.GetMessage
        Dim myFetcher As New MessageFetcher
        Return myFetcher.GetsMeAMessage
    End Function

Now it may seem trival, but that is a whole massive change when you are talking about large applications, a massive change that will only affect the Model layer. I could go further, I could fetch the message from a database. I could start passing down through the subs and functions values to tell it which message I wanted from the database. I could ship the whole model layer out to be a web service that fetched messages depending on which ID was sent to it and the View and most of the Presenter could would never have to be altered. would never have to be altered.

You can download the Template Here to get started with this stuff. Download it and follow through the entry and see it working, even if you don’t use it in the future at least you get a handle on what people are talking about.

If people want I can do a WinForms one and a C# one too. If they think they will find it useful. Just drop me a comment. Also any questions drop them in the comments.

On.. Programmer Anxiety

The Origin Of Programmer Anxiety

I’ve always worked in small development teams. I’ve work at all times on all projects on all tiers, UI, business, data and anything in between those. Working on small teams with limited experience of larger organisations has left me with a touch of what I like to call Programmer anxiety; Am I any good? Do I know enough? Can I demonstrate it?

I think this is the curse of all self taught, experienced based developers. With formal education behind you there is a certain degree of confidence that what you are doing is the ‘correct’ way of doing things. If you’ve learned as you do development work then there is a nagging doubt that perhaps if you knew a bit more then this would be easier. Or this would be obvious.

To compound this programmer anxiety I have also chosen to use VB.NET as my primary language. Although this is a conscious choice, which I will cover in a later post, the apparent snobbery that surrounds VB.NET and C# in the .NET community leads me to believe I’m a second rate programmer. This however is not the case. In fact I can develop in C# as competantly as I develop in VB.NET.

The more programmers I meet the less anxious I feel about the level of quality of my code and choices I’ve made in development. The ability to converse with people, both online and offline, on subject as diverse as implementing user interfaces, the intricacies of class structures and the relative usefulness of different patterns has shown me that I can at least talk the talk.

Walking the walk?

Now days it occasionally occurs to me that whilst my code might work, is it high quality code? Is it efficient, is it elegant? Sure I can implement a model, view, presenter pattern and have all the layer separation in the world working in a seemingly slick manner, but is the code high quality? Am I passing the ‘right’ objects around? Does this matter if it works?

Model, view, presenter (MVP) brings me on to another more recent anxiety. Let’s say I think I understand a newly presented concept, I now approach the implementation. I’ve got all my code working, the pattern seems to be working as it should be. Then I go and check out some other peoples implementations of it and they’ve implemented it in a different way. What’s more they have implemented in a different way to each other. Who is right? Is my implementation still valid? Is it better or worse than someone else’s? How do I evaluate this? Are we all correct?

The most ready source of other peoples code to examine is open source projects. Are they a fair comparison to what I am working on in a commercial environment? I occasionally feel that the code is full of sparkling brilliance because its been engineered to look that way, the same solution could have been achieved in a similar manner, but then as it is very public code it has to appear to do back flips whilst juggling and making the breakfast,.. instead of just making the breakfast. Or is this how everyone programs?

This questioning is compounded by the fact that just picking up other peoples code is hard. Sure if they have developed using a pattern you are familiar with you should be able to pick it up relatively quickly, but what happens if they haven’t. Are you having problems working out what’s going on because this developer is leagues above you in terms of ability, or is it because they have made a horrible spaghetti soup of their code in an effort to impress everyone with their brilliance? Were they trying to impress everyone or is this just how they program? Does it make me a genius because I can in five lines of code what its taken them fifty to do?

Back To School

This all then brings me on to the question of education. That back up, the shield of steel that says ‘I know what I’m talking about’, after all people with letters after their name always know what they are talking about. The problem is this; What qualifications to get?

Should I become qualified? What am I proving and to who? At this point in my career I have a track record of developed and released products, for companies I’ve worked for and as personal developments. I am able to demonstrate my understanding of programming principles as they related to real world applications, I can demonstrate an knowledge and understanding of current technologies. My experience stands up to close scrutiny. Do I need qualifications now?

What do I gain by have an MCTS, or whatever relevant qualification companies are trying to sell me training for? More money? Do I need that, if I wanted more money I’d move to C# as my primary language of choice. If I’m staying and progressing at the company I currently work for then its not going to be something relevant to getting another job, particularly as qualifications are often out dated within a couple of years. Would people be more likely to listen to me if I was an MCP, why?

If I did decide to get qualified, what do I go for? A general .NET qualification or two? Specialisation could be the path to guru status and riches beyond my wildest dreams (if indeed riches figured in my dreams). Would I be better off being an early adopter, gaining LINQ qualifications (whatever form they might take) now could benefit me in the future both in my current job and future career, however what would happen if LINQ doesn’t take off, early adopting is a gamble.

Non Conclusion

Perhaps I need to get more code out there, find out where I sit in the whole developer pond. In the mean time I can covet the skills that Paul Stovell, Anders Helsberg and others seem to exhibit with consummate ease…. *sigh*

On.. The Future Of Development

Today I, like many others, read ReadWriteWeb’s feature on the Future Of Software Development, whilst it was an interesting read I believe the picture it left was incomplete and inaccurate.

Continuous Waterfall

A lot it written about Agile methodologies, indeed I’ve written about them myself from time to time. It is interesting to note the derision piled upon the waterfall development methodology that often emanates from Agile evangelists. As someone who has implemented Agile on actual live projects with development teams I find that it can be best summed up by a phrase I heard Roy Osherove use; Continuous Waterfall. Whilst your actual implementation of Agile may vary, you are in effect reducing your version development times, so your specifications for your product are shorter and more current, your testing phase is shorter (through use of Unit Testing), your releases more often. However you are still maintaining the waterfall methodology of specification, estimate, develop, test, release, just in a compressed state.

Where was Microsoft in all this?

Another important point missing from the ReadWriteWeb feature was the presence of Microsoft and the .NET framework. When talking about current technology that is changing the way people program the article fails to mention the .NET 2.0, 3.0 and 3.5. Version 2.0 has enough contained within it to justify a article entitled “How .NET 2.0 can and has revolutionised the web and your development processes”. That is before we get onto the real show stealers of Workflow and LINQ (.NET 3.0 and 3.5 respectively). Whilst LINQ is looking like it is going to be a great use in the future, for me right now Workflow is the developer tool that I’d say is most likely to effect the future of development.

Workflow allows you to map a process, so all those flow charts you designed years ago can now literally be turned into a product, one that development wise looks exactly like it does on your bit of paper. What’s more, in business you can sit down with someone and map their processes straight into your IDE, straight into your code base. This is more than the “workflow” you see in some HR systems that are glorified database triggers, this is proper long state programming. It is also where developers can bring some of the most useful value to a company, when you have a business process turned into a workflow you can see, as a programmer, where it can be more efficient, by implementing changes you can effect your companies efficiency very directly.

Development demands are non-linear

The other slightly misleading statement is that libraries have helped make for small development teams. Sure this is sort of the case right now, libraries are great for efficiency gains within the development environment. However there is a flaw in the statement, development challenges are not linear. Each year the scope and complexity of the development worked asked of us becomes more and more complex. So whilst it may have taken twenty developers six months to do something six of seven years ago the same can now be achieved by five people in six months instead. The thing is that those twenty people will now be working on a product that is significantly more complex than the previous one they worked on.

The games industry is a great case in point for this, sure they now have the graphics engine as a library and their physics engine as a library and their audio engine as a library, but the games they are producing are so much more complex than the previous generation that they require as much, if not more overall development time.

The article is an interesting talking point, but I think it is wide of the mark in its vision of the future, and its estimation of the problems solved by agile and library based development. The future of web development may seem to be small teams for social sites, however social sites are not the only future for the web.

On… Programming Skimmp3

In the beginning

I’ve always found that if I need an application to perform a specific function, not currently fulfilled by another, it usually means that I’m not the only one.

AudioBlogScraper.sln had been floating around on my hard drive for ages, I used it to download all the mp3s linked from audio weblogs.  The version I used for the best part of a year had two text entry boxes and a button, simply source URL, destination directory and a Go button.  Once the Go button was pressed it would just hang the program until all the mp3s from the destination URL had downloaded.

This was not the most user friendly code, it was, as is often the case with something developed by a programmer for themselves, very unintuitive and not very friendly.

Programming for an audience

I’ve also found over the years that by programming for an audience you can improve the quality of your code, suddenly your program needs to work on more than just your machine, you need to have a user interface that your mum can use, you need to write an installer (usually), then there is the scary thought that someone else may one day look at your code, so you need to keep that nice and neat.

It was with all this in mind that I approach developing what became Skimmp3.

Skimmp3 is a relatively simple windows program, initially I kept the same entry boxes as before, but added a list of the mp3s that had been found and the name of the one currently being downloaded.  This became v0.3.  From then on I wrote a features list that once complete would make for version 1.0.  I attempted to follow the features list by implementing a bit of agility on my own project with 2 week sprints to each version.  Then a days test, then adding bugs to the work log followed by a review of the features list in order to work out my next version work packages.

Hurdling

The biggest hurdles I came across when working on it were a reliable download library in vb.net, more of that in a later post, and keeping motivation levels going on what is effectively a personal project that I doubt will set the world alight, although some people may find it useful.

So I treated the project as a test bed for all the new techniques and ideas I had for development in my day job, a way to try before you implement, even if it is small scale I could get a handle on what patterns and practices were working and which weren’t, also being a small project with no deadline I could change its entire structure from version to version in order to try out different design patterns.  This has fed back into my day to day work behaviour and has paid dividends.

I’ll be going into detail about some of those patterns and practices I used in forthcoming posts.

For now visit www.buzzsort.com and download skimmp3 v0.9 and point it at your favourite audio blog.

Next Page »