InfoQ

InfoQ

News

My Bookmarks

Login or Register to enable bookmarks for unlimited time.

The content has been bookmarked!

There was an error bookmarking this content! Please retry.

Enabling the Last Responsible Moment in Deployment

Posted by Amr Elssamadisy on Aug 12, 2009

Sections
Process & Practices,
Architecture & Design
Topics
Design ,
Architecture ,
Agile Techniques ,
Agile
Tags
Patterns

Chris Matts started a conversation with the following question:

One of the most powerful techniques I have used over the last three years is latent code patterns(lcp). The project I just left made every feature configurable. This meant that we never had the situation where a fix / feature had to wait for another feature in testing. We focused on fast and effective regression testing. Despite frequent diva releases we only ever had a single branch and had no code merging issues as a result.

Is anyone else using latent code patterns? I would like to hear how others do it as the best innovation comes from practitioners with a problem.

The other issue that lcp raise is the wip (work in progress) limit around testing. Thoughts?

Basically, what Chris was reporting is his team's ability to be able to turn on and turn off features at will. Therefore, even if a feature is in-progress, it does not block the team's ability to release at-will because the feature can be turned off.  Chris later stated the thinking behind this approach by sharing a question behind every design decision:

Does this (design) approach create a commitment?

 

David Roussel, also on the same team as Chris, clarified the technical details of exactly how their team implemented this approach. Later in the discussion, he  summarized the different ways others have implemented similar solutions:

I think there at lots of ways it can be done. But just realizing that we needed to be able to re-prioritize releases at the last minute, and that we could do it simply without branching was the big step. The rest is details, but interesting details.

How else have people solved this? So far we've had people mention:

  • dependency injection, with dependencies changed at build time
  • dependency injection, with dependencies overriden based on config
  • plain old config and if statement
  • branch per feature
  • command document, command pattern,
  • and database based command configuration (need a better name for this).

And Joshua Kerievsky added the following solution to the list:

David - we sometimes ship Commands to production that are still WIP, so no User will see them, yet we can execute them via a URL. Latent Commands?

I'm not sure if your list above includes the simple technique of just making a menu option invisible.

This design technique (or architecture if you prefer) is not new. In fact it pre-dates Agile software development and has many roots in the object oriented and patterns communities. The requirement it is fullfilling, i.e. Chris' question:

Does this (design) approach create a commitment?

is new, however.

 

How about run-time permission-based controls? by Cornelius Perkins Posted
hard to implement by Andreas Kleffel Posted
Learn from the game developing community by Zhu Jia Cheng Posted
  1. Back to top

    How about run-time permission-based controls?

    by Cornelius Perkins

    One approach I've seen used is to exploit the permission system to turn features on and off.

    Once you've got a system which lets you determine, for example, which set of users are allowed to do which kinds of actions on which kinds of trades for which counterparties, you've got the ability to decide who gets access to new feature X.

    No rebuild, no config files.

  2. Back to top

    hard to implement

    by Andreas Kleffel

    3 simple flags would be sufficent:
    - Mock
    - Beta
    - Production

    C# Code

    [Beta]//will not be deployed
    public void NewFeature() { ... }

    BUT: what about features, that require a database schema update? I don't want to deploy volatile schemas!

  3. Back to top

    Learn from the game developing community

    by Zhu Jia Cheng

    My little experience in the game industry tells me that every functions would(should) be programmed configurably for a large project, as programmers' work get feedback from/cooperate with art/design team instantly, and get new features and requirement during very short time. Before that I only had ideas of IOC from Spring.

    So I wish to hear/see from game developers.

Educational Content

10 tips on how to prevent business value risk

One category of risk that project teams need to ensure they address is business value failure – delivering a product that fails to provide value for the business investor.

Interview: Software Systems Architecture: Working With Stakeholders Using Viewpoints and Perspectives

InfoQ spoke to the authors of Software Systems Architecture on a couple of new topics, the System Context viewpoint and Agile, which have been added to the second edition.

Beauty Is in the Eye of the Beholder

Alex Papadimoulis discusses ugly code, where it comes from, how to avoid it, and how to get rid of it.

Architecting Visa for Massive Scale and Continuous Innovation

John Davies examines Visa’s architecture and shows how enterprises have architected complex integrations incorporating Hadoop, memcached, Ruby on Rails, and others to deliver innovative solutions.

Max Protect: Scalability and Caching at ESPN.com

Sean Comerford unveils ESPN.com’s architecture, what components are used and why, and the current changes the website goes through.

The Seven Deadly Sins of Enterprise Agile Adoption

Are there repeated patterns of failure on Enterprise Agile Enablement efforts? Sanjiv and Arlen discuss Seven Deadly Sins to avoid when adopting Agile in an enterprise.

Questions for an Enterprise Architect

Erik Dörnenburg answers: What is Enterprise and Evolutionary Architecture?, discussing 4 issues: Turning strategy into execution, Ensuring conformance, Where do the architects sit? Buying or building?

Wrap Your SQL Head Around Riak MapReduce

Sean Cribbs explains what Map-Reduce and Riak are, why and how to use Map-Reduce with Riak, and how to convert SQL queries into their Map-Reduce equivalents.