I’ve mentioned earlier that I work for Provo Labs, and one of our main goals is be able to take an idea from concept to product as fast as possible. I’ve been thinking a lot about the best way to do this, and yesterday I came up with this thought.
Historically, when I have wanted a site with certain functionality, I would go out and find an opensource solution that most closely matched what I was trying to do. However, digging through an entire application to tweak the code can be cumbersome, and take a very long time. Sometimes, I only want one piece of functionality offered by the application.
As I was thinking about this, it came to me that software development is a lot like building a custom car, here’s why. Most cars are built up of standard components such as an engine, transmission, drive shaft, tires, frame, etc. A website also has standard components, headers, footers, navigation and content blocks. My tweak the opensource package model fits an analogy of taking a fully-built VW Bug and figuring out how its built, take it apart, and try to rebuild it into what I want. But, what if the only thing I really needed from the Bug was the frame and tires? That’s a lot of extra work tearing the beast apart and then building on top of it.
So, I was thinking, what if we created a garage full of components or modules that would be much like car components. With the car, you would have the engine, the transmission, etc. With web, you would have a navigation module, header modules, footer modules, and lots of different content box modules. You would then have multiple page frames that these modules could fit into. The modules would all have standard interfaces for displaying and you could just plug in new modules into your site. The important thing is that you would be able to use these same modules on any site that you create.
An example, say that you wanted to build a page that had displayed a standard navigation block, 2 article blocks, and an RSS aggregator block. You pick a frame that would support the layout of the blocks, take from your garage of modules a navigation module, an article module, and an RSS aggregator module, and plug those into the page. Upon initializing these modules, you would have to point them to where they will actually get the content, which leads me to my next thought.
Each of these modules would be made up of two parts (there will probably be more parts as I think this through more thoroughly). The display object, which actually plugs into the site’s view, and the data access object, which could grab the information from a database, xml file, access it from some web service, who cares, it would just have a standard interface that works with the display object to get the information needed for that object.
Lets look at the navigation module. The navigation module will most likely display some sort of hierarchical tree of hyperlinks. So, you get your navigation module from the garage, and you plug it into your frame. You then (or upon initialization) give it the data access object which will give it the data needed to display the links. Because all of the display objects have the same interface with the frame, you can plug them in anywhere on your page, shuffle them around, etc.
CSS 2.0 has provided the ability to do all of your positioning and design with a stylesheet. The html should be data placed incontainers so that which makes the site more flexible and not stuck in one particular design.
So, what is the difference between these modules and PEAR and some of the libraries that we already have? I think the main difference is that it seems that PEAR offers great raw materials for web development, but not so much complete components. It can save you time from having to actually harvest or create from scratch these raw materials.
Anyways, maybe this is already being done somewhere, but it seems that we could get a lot of re-use out of our components, and use this model to speed up future applications that don’t fit already built full opensource applications.
Any thoughts? It is possible that my model has flaws, so if you see any, please post a comment. I’m just trying to come up with a better way of doing things. Thanks.