Is Implementing Continuous Delivery the key to success?

“Until your pretty code is in production, making money, or doing whatever it does, you've just wasted your time” - Chris Read whilst at London CI.

In my opinion, this quote really sums up software development. Process and red tape are becoming an obstacle to more and more developers from doing what they are paid to do – create software.

I attended a talk by Kendall Miller whilst at DDDScotland entitled “Creating your own software company: A survival guide”. I am a huge supporter of continuous delivery and have attended many sessions but this session was extremely useful to me. It was really the first time that the reasoning and importance of continuous delivery for developers really hit home with me. I knew the benefits and drawbacks but hearing someone actually demonstrate their experience really helped me. The most important thing I learned in this session was that you have got to get your software out early, this is particularly important when you are starting up a software company. Shipping software early will not only give you a source of much needed income, but can provide potentially useful feedback that can help shape the project before too much investment, both in terms of development time and money, is wasted. This goes hand in hand with the opening quote of this blog post.

I am a huge fan of clean, SOLID, DRY code and I cannot emphasise enough about why developers should write code in this fashion. I do understand that I may be giving a mixed message here. Is it possible to create software in a clean, SOLID and DRY way and in a fast time? Could we be sacrificing quality for delivery? In my opinion, this is simply not the case. There are some fantastic guide lines laid down by Robert ‘unclebob’ Martin in his book, Clean Code. These guide lines do not take extra time to implement – they are baked in to how we write the code. As developers they should be second nature to us. If they aren’t then you should address this as soon as you can.

Fast delivery can, however, affect architecture. Architecture is one of those areas of development that really does demonstrate a lot of ways to do achieve a single task. For example there are many different frameworks, tools, code layout etc. and these are another area to be concerned with. You can implement a solution to a problem that is clean & efficient but that may not prove to be the best architecture. You could continue to work on this solution and refactor it to the nth degree until you come up with an architecture that you like.  You may feel that you have used your development time wisely to improve your solution, when in actual fact, what you may have done is to waste your development resources refactoring when other solutions may be available to you.

I would argue that release fast, fail fast is a good way to develop. Get the code out there, let some decent A/B testing give feedback on its fit for purpose and let that shape the architecture. I understand this may be easier for start-up based systems as their customer base can initially be small. But I do not think it is only targeted towards them. Lets look at Google Chrome or Firefox as an example of this philosophy in practice. Changes to Chrome and Firefox are happening on a regular basis now. This means the companies can create a new piece of functionality, release it to users and collect feedback and know that feedback is targeted towards the last small release. This means they are letting the user feedback help drive the system. Firefox takes a lot of grief about how resource hungry it is. Releasing smaller code changes more often will help them see if they are addressing the issue.

Releasing a solution early can also bring problems of it’s own. There are some companies out there that are of the opinion – if it has shipped and it works then why should we spend any more money on code improvements. This falls into the argument about Technical Debt which I will not cover in this post.

In summary, I believe software should be delivered in small, continual chunks. This helps create an efficient delivery mechanism that will give us a chance to collect useful feedback in a much more structured and continual way. We can use this feedback to deliver software that is better suited for its purpose and become better at what we are paid to do!

Comments (6) -

Nathan Gloyn
Nathan Gloyn
11/10/2011 1:18:27 PM #

Two things: Environment/Product & a note on architecture

The environment the developers work in can have a big impact.

It may be very possible to implement CD in a business/enterprise but that enterprise has processes outside/above the dev team the may have to be satisfied before the business is happy to release the code.


You also have to take into account that for a lot of enterprises constantly evolving software (even when seamless executed and delivered) may be counter productive if it effects how people do their job, want training etc. Its human nature but a lot of the users of enterprise software may *expect* to be trained on how to use the new functionality.

Please understand I'm not arguing for these processes just perhaps some understanding that it will depend on what environment you are in and the software you are producing, it isn't always down to the devs to determine how rapidly the product gets in front of the end user.

In regards to architecture you seem to be linking the choice of framework, tool, etc to the architecture of the product. Uncle Bob did a series of tweets not so long ago pointing out that choice or framework (or even using a framework) isn't architecture.  Architecture is, IMHO, related to how the application is designed for the functionality/logic/processes to interact as well as the other non-functional requirements like performance, maintenance, etc.

But what do I know? Smile

stack72
stack72
11/10/2011 1:22:57 PM #

Agreed - but delivering software doesnt always have to be to an end customer - it can be delivered to staging, testing etc regularly this gives our internal customers a chance to give feedback much earlier as agile should be. You are focusing here too much on the fact I used an example of Chrome or Firefox

Dan Woodward
Dan Woodward
11/10/2011 1:35:40 PM #

Great post Paul,

I think that CD is key to a lean mentality. It's more important to test the concept of your product than ensure that it's the most perfectly architected piece of work ever.

Release something good now, than perfect later. Once you have proven the viability of your product, you can then work to refine its design and architecture to reduce your technical debt.

We all need to remember that we are creating something for a purpose, and we also have to test that purpose as well as it's implementation. In this was fail fast is still the important concept.

CD lets us do this effectively.

Nathan Gloyn
Nathan Gloyn
11/10/2011 1:58:43 PM #

Completely agree about delivery to test/stage/UAT as you know its what I do.

Not focusing on chrome/ff per say, more the difference between creating a product that's on the web and available vs one that has to perhaps be packaged, distributed and installed on a machine.

From past experience it is often the business that drag its feet on feedback rather than anything the devs could/have done hence the comment about processes outside of dev.

Andrew Metcalfe
Andrew Metcalfe
11/11/2011 7:58:55 PM #

Hi Paul,

Good post, I think Continuous Delivery is a good thing for success. I wouldn't say it is the "key" to success but if you do enough things well you are always going to be in with a shout of succeeding.

I think the timing of when to bring CD in is the next point. A brand new web start-up should first get a home page up on a server, in order to get out of the Google Sandbox faster or for many other reasons. This doesn't have to be through any fancy release process. Then you could argue that you should get the first alpha (or whatever) version of your site up. If at this stage you are delayed in getting the next version up, because of permissions on the server, only one person can do it etc. it is time to get this in place if possible. However cost is a factor.

I think CD is definitely a sensible thing to do but there are many things to do sensibly as well. If you can deliver fast you will get your money back faster, know your faults faster and also please clients and partners more.

A good idea comes first with success but Continuous Delivery helps you get it to market and use much faster.

I am trying to use it for my site www.restaurantsforsale.co.uk and as this is built on SOA a lot of the principles of needing an automated code deployment stands. But I have to be honest and say we are retrospectively adding automation tests, which is not ideal!! The reason was I couldn't get developers at the right price with the right experience at first. Now I have had time to train them I can put more of the CD stuff in place. Getting a working V1 of the site was most important.

You asked me to reply, hope this wasn't too long!!

Tomek Kaczanowski
Tomek Kaczanowski
8/2/2012 10:10:23 PM #

Hi,

thank you for this interesting post.

I agree with Nathan that (unfortunately!) various business obstacles can make CD very hard (if possible at all).
Similarly, when developing a software which is 90% integration with various 3rd party systems, then it is almost impossible to perform CD. Imagine that a test environment of X is open only during a 2  "happy testing" days a month or so.

Which does not change the fact that CD is what I want, and what I fight for. Smile

Pingbacks and trackbacks (3)+

Add comment

  Country flag

biuquote
  • Comment
  • Preview
Loading

About Me

 

Web Developer. My most used framework is C# with MVC but use Webforms on occasion. Im an advocate of clean, maintainable code and am very passionate for what I do. Absolutely obsessed with Continuous Integration and how it should be used in every day development scenarios. Trying to move towards a system of Continuous Deployment
Follow Me on Twitter

Jetbrains Academy Member

 

MVB Blogger

 

Friends Of Redgate

Month List