On 7/18/2012 4:04 PM, Miles Fidelman wrote:
Tomasz Rola wrote:
On Sun, 15 Jul 2012, Ivan Zhao wrote:

By "Victorian plumbing", I meant the standardization of the plumbing and hardware components at the end of the 19th century. It greatly liberated plumbers from fixing each broken toilet from scratch, to simply picking and
assembling off the shelf pieces.


There was (or even still is) a proposition to make software from
prefabricated components. Not much different to another proposition about using prefabricated libraries/dlls etc. Anyway, seems like there is a lot
of component schools nowadays, and I guess they are unable to work with
each other - unless you use a lot of chewing gum and duct tape.


It's really funny, isn't it - how badly "software components" have failed. The world is littered with "component libraries" of various sorts, that are unmitigated disasters.

Except..... when it actually works.  Consider:
- all the various c libraries
- all the various java libraries
- all the various SDKs floating around
- cpan (perl)

Whenever we use an include statement, or run a make, we're really assembling from huge libraries of components. But we don't quite think of it that way for some reason.


yeah.

a few factors I think:
how much is built on top of the language;
how much is "mandatory" when interacting with the system (basically, in what ways does it impose itself on the way the program is structured or works, what sorts of special treatment does it need when being used, ...).

libraries which tend to be more successful are those which operate at a level much closer to that of the base language, and which avoid placing too many special requirements on the code using the library (must always use memory-allocator X, object system Y, must register global roots with the GC, ...).

say, a person building a component library for C is like:
"ok, I will build a GC and some OO facilities";
"now I am going to build some generic containers on top of said OO library";
"now I am going to write a special preprocessor to make it easier to use";
...

while ignoring issues like:
"what if the programmer still wants or needs to use something like malloc or mmap?"; "how casual may the programmer be regarding the treatment of object references?"; "what if the programmer wants to use the containers without using the OO facilities?"; "what if for some reason the programmer wants to write code which does not use the preprocessor, and call into code which does?";
...

potentially, the library can build a large collection of components, but they "don't play well with others" (say, due to large amounts of internal dependencies and assumptions in the design). this means that, potentially, interfacing a codebase built on the library with another codebase may require an inordinate amount of additional pain.


in my case I have tried to, where possible, avoid these sorts of issues in my own designs, partly by placing explicit restrictions on what sorts of internal dependencies and assumptions are allowed when writing various pieces of code, and trying to keep things, for the most part, "fairly close to the metal".


or such...

_______________________________________________
fonc mailing list
fonc@vpri.org
http://vpri.org/mailman/listinfo/fonc

Reply via email to