Tuesday, November 6, 2012

Applying Scrum to legacy code and maintenance tasks

There are some problems with Scrum that mainly occur when dealing with third party components or legacy systems:
  • wrong estimations (time, impact, risk, complexity)
  • bad requirements (inconsistent, incomplete, testable, conflicting, faulty)
  • development involved in operations (bug analysis, data correction, deployment, hot-fixes)
  • delays in development (bugs in legacy system, missing documentation)
  • testing (quality/quantity of test cases, un-mockable interfaces, long running offline processes, performance issues, live and test system differ)

General problems with Scrum:
  • development (gold plating, rework, misunderstandings and bugs from collective code ownership)
  • estimations (missing experience, excessive estimations for unpleasant stories)
  • technical debt vs. velocity (architecture violations save deadlines)
  • performance (stories are functional requirements, performance is normally no acceptance criteria, often only specified as "system should be fast and responsive")
  • testing (time, cost, hidden bugs, product owner focused on functionality and business value, not code quality)
  • absence, outstanding feedback (illness, vacation, conflicts, laziness)

This gives some questions:
  • Are all these problems exceptions or daily business in software development?
  • Does Scrum deal with these problems efficiently or solve them?
  • Does Scrum only work in an ideal world?

Some discussions on these topics can be found here:
From the theoretical point of view, the main issue is synchronizing all stories and developers at the end of the sprint. Stopping a sprint for a hot-fix is quite uncommon, instead management just overloads developers. Developers are forced to hold deadlines, even if estimations tend to be wrong. This can lead to more bugs, less tests/documentation, incomplete stories, more hot-fixes, more delays, developers being idle and others being overloaded. Some people skip estimations and testing to make scheduling of deadlines easier, but quality is not for free!
Doing things like "insert at least one task to each sprint to improve the process" or "insert at least one task to each sprint to avoid the code becoming legacy code" is the way to go. Same for evaluating new technologies or tools. Other adaptions for quality in Scrum are "insert a testing sprint before the rollout" or setting up teams cross-functional, which means they should not include only developers, but also testers, configuration and requirements managers.

Feature-driven development defines features without a sprint scope and therefore has less dependencies. A feature/developer can be paused to do a hot-fix without any impact on other features. But having 2 features that depend on each other still requires completeness for both.


performance (23) benchmark (6) MySQL (5) architecture (5) coding style (5) memory usage (5) HHVM (4) C++ (3) Java (3) Javascript (3) MVC (3) SQL (3) abstraction layer (3) framework (3) maintenance (3) Go (2) Golang (2) HTML5 (2) ORM (2) PDF (2) Slim (2) Symfony (2) Zend Framework (2) Zephir (2) firewall (2) log files (2) loops (2) quality (2) real-time (2) scrum (2) streaming (2) AOP (1) Apache (1) Arrays (1) C (1) DDoS (1) Deployment (1) DoS (1) Dropbox (1) HTML to PDF (1) HipHop (1) OCR (1) OOP (1) Objects (1) PDO (1) PHP extension (1) PhantomJS (1) SPL (1) SQLite (1) Server-Sent Events (1) Silex (1) Smarty (1) SplFixedArray (1) Unicode (1) V8 (1) analytics (1) annotations (1) apc (1) archiving (1) autoloading (1) awk (1) caching (1) code quality (1) column store (1) common mistakes (1) configuration (1) controller (1) decisions (1) design patterns (1) disk space (1) dynamic routing (1) file cache (1) garbage collector (1) good developer (1) html2pdf (1) internationalization (1) invoice (1) just-in-time compiler (1) kiss (1) knockd (1) legacy code (1) legacy systems (1) logtop (1) memcache (1) memcached (1) micro framework (1) ncat (1) node.js (1) openssh (1) pfff (1) php7 (1) phpng (1) procedure models (1) ramdisk (1) recursion (1) refactoring (1) references (1) regular expressions (1) search (1) security (1) sgrep (1) shm (1) sorting (1) spatch (1) ssh (1) strange behavior (1) swig (1) template engine (1) threads (1) translation (1) ubuntu (1) ufw (1) web server (1) whois (1)