Reusable dreams: worse before better
Wednesday, April 29th, 2009If you develop a lot of projects and are a bit like us, you will recognize this: the reusability dream. It starts of with a little itch that you are not taking advantage of the knowledge and work in the previous project. You start with some simple database handling and utility functions and all is fine. For a while…
The next stage is actually creating reusable functionality…. The reason is that you know it will haunt you do the same thing in multiple projects using copy/paste as it will need to be fixed some time.
This is also the point where your library turns into a framework: Everything needs to be done in a particular way to fit in your nice reusable scheme of things. Your project no longer just uses a few nice functions, it completely depends on it.
As I’ve written before the reason I like plain PHP is what I call the notion of proportional time. The time you spend is proportional to the complexity of the feature you are building.
The problem with frameworks is that they have smart things built in. The framework makes it easy to do stuff that usually takes much more time. However, it’s almost never smart enough. At this time your framework has evolved so much that every time you will have to pick your poison: either go through a painful adaptation to your framework OR recreate it without your framework and go through the painful tinkering an bugfixing that’s all built into the framework… how frustrating.
In our case this stage expresses itself in SLOW development. Every small step forward becomes way more complex than the actual feature that you need to built. It’s completely against the principle of proportional time. You are locked in your own Framework.
Now is the time that you need to consider whether or not: worse before better applies or that it’s just going downhill. Two years ago we had a framework where the latter was clearly the case and we just had to drop it. The problem with it was that it was really an all-or-nothing approach. In our new framework we can easily take just a step back and use only part of the framework until we have clear ideas about the next level. We still experience the locked-in situation from time to time, but it’s much easier to get past it.
Our path to Framework enlightenment has the following steps:
- No collisions: make sure that the library/framework does not collide with other code, this will mean that you can drop it into an existing project without the need to rewrite it first
- Layers: create layers of tools, functions and abstractions. If one layer is to restrictive, you can at least use all tools from the other layers below it
- the framework needs to be out of the way: You must always be able to do things outside the framework and still access it’s data.
- Everything needs configuration and even more important: defaults
- Override everything: be able to replace small parts of functionality without the need to recreate it completely.
- Constants do not exist: at some point you will want to be able to manipulate it with code
- Move everything to the framework: if you want to reuse it, don’t create it inside your project directory
- Have a (documented) process (including best practices) to create new things for and using the framework.
We are not there yet, but are confident that this time that the benefits outweigh the extra effort.