Monolithic Spaghetti

Great quote from Rick Jelliffe on the xml-dev listserv (found via a pointer from Tim Bray – thanks, Tim!):

Any sufficiently monolithic technology is indistinguishable from spaghetti.

Once a large technology is made from sufficiently intertwined parts, there is no way to order an exposition of it such that strongly-connected ideas are always close together.

Spaghetti doesn’t want to be free.

The current version of the-software-that-runs-CAREO has suffered pretty severely from this spaghetti syndrome. We’re planning the next version, which is a complete rewrite, to be much more modular. Using smaller bits of functionality, hopefully nothing reaches the spaghetti critical mass.

Of course, parallels could be drawn along the lines of Linux (monolithic macrokernel) vs. Darwin (microkernel), but I’m not going to go there at the moment…

UPDATE: I just re-read the excerpted quote, and this quasi-random thought popped into my skull…. Spaghetti wants to be written. Just like the One Ring wants to be found. Only vigilance can prevent it.

Great quote from Rick Jelliffe on the xml-dev listserv (found via a pointer from Tim Bray – thanks, Tim!):

Any sufficiently monolithic technology is indistinguishable from spaghetti.

Once a large technology is made from sufficiently intertwined parts, there is no way to order an exposition of it such that strongly-connected ideas are always close together.

Spaghetti doesn’t want to be free.

The current version of the-software-that-runs-CAREO has suffered pretty severely from this spaghetti syndrome. We’re planning the next version, which is a complete rewrite, to be much more modular. Using smaller bits of functionality, hopefully nothing reaches the spaghetti critical mass.

Of course, parallels could be drawn along the lines of Linux (monolithic macrokernel) vs. Darwin (microkernel), but I’m not going to go there at the moment…

UPDATE: I just re-read the excerpted quote, and this quasi-random thought popped into my skull…. Spaghetti wants to be written. Just like the One Ring wants to be found. Only vigilance can prevent it.

Open Source vs. Open Standards

Interesting piece on OSOpinons.com on the difference between Open Source and open standards. People often get caught up with the promise of open standards, and confuse that with the purpose of Open Source.

To me, the real goal isn’t Open Source. That’s a means to an end, often enabling and facilitating adoption of open standards. The real goal is the creation, adoption, and implementation of open standards, which don’t tie anyone to any particular piece of software or data.

The example cited in the article pretty much blows my mind. In order to file for a patent in the US, you have to do it in MS Word .doc format. Which means you have to own Word. Which means, by extension, that you have to pay MS in order to file for a patent. Holy crap! Open standards for document format would prevent this silliness, where Open Source has apparently failed.

Interesting piece on OSOpinons.com on the difference between Open Source and open standards. People often get caught up with the promise of open standards, and confuse that with the purpose of Open Source.

To me, the real goal isn’t Open Source. That’s a means to an end, often enabling and facilitating adoption of open standards. The real goal is the creation, adoption, and implementation of open standards, which don’t tie anyone to any particular piece of software or data.

The example cited in the article pretty much blows my mind. In order to file for a patent in the US, you have to do it in MS Word .doc format. Which means you have to own Word. Which means, by extension, that you have to pay MS in order to file for a patent. Holy crap! Open standards for document format would prevent this silliness, where Open Source has apparently failed.

PHP vs. Java Commentary from Raible

Here’s a quick link to a discussion of PHP vs. Java. Sure, that’s much like a discussion of Coke vs. Pepsi, or Mr. T vs. Hulk Hogan, but some interesting points are raised. Note, though, that Raible is a hard-core Java guy, but many of the comments come from hard-core PHP folks.

Here’s a quick link to a discussion of PHP vs. Java. Sure, that’s much like a discussion of Coke vs. Pepsi, or Mr. T vs. Hulk Hogan, but some interesting points are raised. Note, though, that Raible is a hard-core Java guy, but many of the comments come from hard-core PHP folks.

Gathering Requirements: The Crux of the Matter

From the Intranet Journal: a handy tip list for how/who to best generate and manage a requirements specification for a project.

Perhaps the most important piece of any application development project is requirements gathering. After all, if you’re not clear on where you’re going, how will you know when you get there? So why do most intranet teams spend so little time focusing on developing the skills necessary to do this piece well?

From the Intranet Journal: a handy tip list for how/who to best generate and manage a requirements specification for a project.

Perhaps the most important piece of any application development project is requirements gathering. After all, if you’re not clear on where you’re going, how will you know when you get there? So why do most intranet teams spend so little time focusing on developing the skills necessary to do this piece well?

Inter-Application Communication Options?

We’re working on a new architecture for the next version of the software that drives CAREO et al. One thing we want to do is rip some of the core data functionality into a separate framework (actually a set of frameworks) and have a server host application manage communication between core data and client apps (i.e., CAREO, ALOHA, etc…).

It would be nice if, in addition to web services (SOAP, XML-RPC), if we could use a higher performance messaging system for client applications residing on the same box (or at least on the LAN) than SOAP can provide (latency, marshalling, etc…)

Ideally, it would not be java-specific (so we could write funky C or Objective C apps that can communicate with Core Data), and at least be compatible with the SOAP implementation (so we don’t have to duplicate everything underneath the communication layer).

The options I’ve come across are (with big thanks to Steve Zellers’ WWDC2003 presentation):

  • Mach Messaging
  • POSIX pipes/sockets
  • AppleEvents
  • WebServices (SOAP/XML-RPC)
  • JMS

Some of those are platform-specific (AppleEvents, Mach) or language-specific (JMS), others aren’t exactly capable of running at native application speeds (WebServices).

I’ll keep digging around looking for options. Any glaring omissions?

We’re working on a new architecture for the next version of the software that drives CAREO et al. One thing we want to do is rip some of the core data functionality into a separate framework (actually a set of frameworks) and have a server host application manage communication between core data and client apps (i.e., CAREO, ALOHA, etc…).

It would be nice if, in addition to web services (SOAP, XML-RPC), if we could use a higher performance messaging system for client applications residing on the same box (or at least on the LAN) than SOAP can provide (latency, marshalling, etc…)

Ideally, it would not be java-specific (so we could write funky C or Objective C apps that can communicate with Core Data), and at least be compatible with the SOAP implementation (so we don’t have to duplicate everything underneath the communication layer).

The options I’ve come across are (with big thanks to Steve Zellers’ WWDC2003 presentation):

  • Mach Messaging
  • POSIX pipes/sockets
  • AppleEvents
  • WebServices (SOAP/XML-RPC)
  • JMS

Some of those are platform-specific (AppleEvents, Mach) or language-specific (JMS), others aren’t exactly capable of running at native application speeds (WebServices).

I’ll keep digging around looking for options. Any glaring omissions?

Embryology Slide Viewer

I’m working on a prototype application for viewing embryology slides (and having HUGE flashbacks from when I took the course back when the earth was young).

As a result, I get to play around in DirectorMX again, and am rather amazed at how quickly my Mad Lingo Skillz are coming back. Imaging Lingo rocks. 3D Lingo rocks.

I’m building 2 versions of the app. The first used Imaging Lingo to do a zoom/pan over a high resolution image. That worked well, but took a good chunk of CPU power to do the manipulations. The second version is using 3D Lingo to power an OpenGL image viewer, with a high resolution bitmap used as a texture on a plane, which is then moved in front of a camera to generate smooth panning and zooming (ala MacOSX Quartz). Very cool. Now, to play around with controlling the movement of the plane.

There are 2 challenges remaining: How to keep the images of various sections of an embryo registered appropriately to prevent pixel shifting as the student moves from slide to slide (they are all slightly different image sizes, and they are not perfectly centered on each slide…) Then, I get to figure out how to overlay text and graphic labels on top of the plane. That should be fun…

UPDATE: Here’s a screenshot of the current prototype (UI is very rough, but almost functional):
Embryology Slide Image Viewer prototype

I’ve got it working quite well for panning/zooming and moving through slices of a sample, using a 3D plane with the slide scanned in as a bitmap texture. Perfomance absolutely ROCKS on my TiBook (and, as an aside, I just tried it on a Dell laptop, where performance sucked complete ass. It’s so nice finally being on the right side of the performance curve…) I’m using the camera’s Z position in the 3D world to work the zoom function, and the plane can be physically dragged around to work the panning function. Dragging the image pans it, moving the slider zooms in and out. Very cool.

The next big challenge is keying the registration points of each slide image so moving between slides isn’t jumpy (i.e., if you’re zoomed way in on the notochord, you should stay on the same structure as you move to the next/previous slide).

I’m working on a prototype application for viewing embryology slides (and having HUGE flashbacks from when I took the course back when the earth was young).

As a result, I get to play around in DirectorMX again, and am rather amazed at how quickly my Mad Lingo Skillz are coming back. Imaging Lingo rocks. 3D Lingo rocks.

I’m building 2 versions of the app. The first used Imaging Lingo to do a zoom/pan over a high resolution image. That worked well, but took a good chunk of CPU power to do the manipulations. The second version is using 3D Lingo to power an OpenGL image viewer, with a high resolution bitmap used as a texture on a plane, which is then moved in front of a camera to generate smooth panning and zooming (ala MacOSX Quartz). Very cool. Now, to play around with controlling the movement of the plane.

There are 2 challenges remaining: How to keep the images of various sections of an embryo registered appropriately to prevent pixel shifting as the student moves from slide to slide (they are all slightly different image sizes, and they are not perfectly centered on each slide…) Then, I get to figure out how to overlay text and graphic labels on top of the plane. That should be fun…

UPDATE: Here’s a screenshot of the current prototype (UI is very rough, but almost functional):
Embryology Slide Image Viewer prototype

I’ve got it working quite well for panning/zooming and moving through slices of a sample, using a 3D plane with the slide scanned in as a bitmap texture. Perfomance absolutely ROCKS on my TiBook (and, as an aside, I just tried it on a Dell laptop, where performance sucked complete ass. It’s so nice finally being on the right side of the performance curve…) I’m using the camera’s Z position in the 3D world to work the zoom function, and the plane can be physically dragged around to work the panning function. Dragging the image pans it, moving the slider zooms in and out. Very cool.

The next big challenge is keying the registration points of each slide image so moving between slides isn’t jumpy (i.e., if you’re zoomed way in on the notochord, you should stay on the same structure as you move to the next/previous slide).

Mud Slinging vs. Cutting Diamonds

James Gosling recently described 2 types of development tasks. I like the description. I couldn’t see any way to link directly to the post, so I’ll drop it in here as an excerpt.

I’ve had conversations with several folks in the last couple of days about the craft of software engineering. There are all sorts of ways to slice it up, but one that I find useful in some situations is to divide programming tasks rather crudely into two categories: mud slinging and diamond cutting.

Mud slinging is where what to do is pretty clear. You just wade in and start shoveling. You don’t have to think to hard and you get to feel real productive because lots of motion is happening. I often feel like most of what I do is in this category. It’s not too hard, it needs to get done, Just Do It. I find that it has a personally satisfying rhythm. Relaxing, low stress, regular progress. Lots of lines of code cranked out.

Then there’s diamond cutting. This is where you stare and stare at a problem, and then whack! it breaks open. Not much coding gets done. I find it really frustrating. Why can’t I figure it out? Why? What? How? Sorting socks would be more fun. High stress. But then, it hits me. A dozen quick lines of code and poof, hard problem solved. It’s a real rush. High dynamic range in emotional state.

Of course, it’s impossible to tell the difference between true diamond cutting and generic cluelessness.

James Gosling recently described 2 types of development tasks. I like the description. I couldn’t see any way to link directly to the post, so I’ll drop it in here as an excerpt.

I’ve had conversations with several folks in the last couple of days about the craft of software engineering. There are all sorts of ways to slice it up, but one that I find useful in some situations is to divide programming tasks rather crudely into two categories: mud slinging and diamond cutting.

Mud slinging is where what to do is pretty clear. You just wade in and start shoveling. You don’t have to think to hard and you get to feel real productive because lots of motion is happening. I often feel like most of what I do is in this category. It’s not too hard, it needs to get done, Just Do It. I find that it has a personally satisfying rhythm. Relaxing, low stress, regular progress. Lots of lines of code cranked out.

Then there’s diamond cutting. This is where you stare and stare at a problem, and then whack! it breaks open. Not much coding gets done. I find it really frustrating. Why can’t I figure it out? Why? What? How? Sorting socks would be more fun. High stress. But then, it hits me. A dozen quick lines of code and poof, hard problem solved. It’s a real rush. High dynamic range in emotional state.

Of course, it’s impossible to tell the difference between true diamond cutting and generic cluelessness.

SQLException Error on Solaris

When CAREO is launched, it does some stuff to modify its connection to a database, in order to allow me to point it to different databases at runtime without touching code or recompiling. In UCApplication.java, I modify the connection dictionary for the EOModel’s EOAdaptor, feeding it URLs for databases, usernames, passwords, etc…

This has worked like a charm on MacOSX and MacOSX Server (of course), but now, on Solaris, when I set the connection dictionary, and do a test connection to make sure it worked, I get this weird, cryptic SQLException error via WebObjects’ JDBCAdaptor class:

2 >= 2

Of COURSE! It’s self explanatory! Well, maybe not… I’m totally stumped on this one. I’ve tried connecting to a local database on the Solaris box, as well as to remote databases (the live CAREO database). No joy. Yikes. I’ve got a request out to the FrontBase developer’s list, and will post any responses…

UPDATE: It’s still not working on Solaris, but I’m getting a (slightly) less cryptic error message:

java.lang.NumberFormatException: multiple points
at java.lang.FloatingDecimal.readJavaFormatString(FloatingDecimal.java:1073)
at java.lang.Double.parseDouble(Double.java:202)
at jdbc.FrontBase.FBJConnection.checkVersion(FBJConnection.java:295)
at jdbc.FrontBase.FBJConnection.createConnection(FBJConnection.java:209)
at jdbc.FrontBase.FBJConnection.(FBJConnection.java:98)
at jdbc.FrontBase.FBJDriver.connect(FBJDriver.java:43)
at java.sql.DriverManager.getConnection(DriverManager.java:512)
at java.sql.DriverManager.getConnection(DriverManager.java:193)

When CAREO is launched, it does some stuff to modify its connection to a database, in order to allow me to point it to different databases at runtime without touching code or recompiling. In UCApplication.java, I modify the connection dictionary for the EOModel’s EOAdaptor, feeding it URLs for databases, usernames, passwords, etc…

This has worked like a charm on MacOSX and MacOSX Server (of course), but now, on Solaris, when I set the connection dictionary, and do a test connection to make sure it worked, I get this weird, cryptic SQLException error via WebObjects’ JDBCAdaptor class:

2 >= 2

Of COURSE! It’s self explanatory! Well, maybe not… I’m totally stumped on this one. I’ve tried connecting to a local database on the Solaris box, as well as to remote databases (the live CAREO database). No joy. Yikes. I’ve got a request out to the FrontBase developer’s list, and will post any responses…

UPDATE: It’s still not working on Solaris, but I’m getting a (slightly) less cryptic error message:

java.lang.NumberFormatException: multiple points
at java.lang.FloatingDecimal.readJavaFormatString(FloatingDecimal.java:1073)
at java.lang.Double.parseDouble(Double.java:202)
at jdbc.FrontBase.FBJConnection.checkVersion(FBJConnection.java:295)
at jdbc.FrontBase.FBJConnection.createConnection(FBJConnection.java:209)
at jdbc.FrontBase.FBJConnection.(FBJConnection.java:98)
at jdbc.FrontBase.FBJDriver.connect(FBJDriver.java:43)
at java.sql.DriverManager.getConnection(DriverManager.java:512)
at java.sql.DriverManager.getConnection(DriverManager.java:193)

How to display an RSS feed on a web page?

OK… I’m feeling like a bit of an inept bonehead for not being able to figure this one out, and I’m hoping someone out there in blogland has done something similar…

I was hoping to create a simple HTML web page that included several RSS feeds, including several from CAREO. I was sure someone would have done something similar, but haven’t found anything that works. Reliably.

Is there anything I can use to embed live RSS feeds in an otherwise-static web page? I don’t want to be pre-processing anything, or cacheing XML or anything. I want a live display of a live RSS feed in a static HTML page. I don’t care if it’s a PHP or PERL or whatever-based CGI that does the heavy lifting, as long as it’s relatively portable (i.e., don’t have to recompile PERL on MacOSX like rss2html.pl seems to want to do). Oh, and it has to be able to run on my server. I don’t want to have a cross-the-pond round trip like what is required to use the feed processor at curry.com

OK… I’m feeling like a bit of an inept bonehead for not being able to figure this one out, and I’m hoping someone out there in blogland has done something similar…

I was hoping to create a simple HTML web page that included several RSS feeds, including several from CAREO. I was sure someone would have done something similar, but haven’t found anything that works. Reliably.

Is there anything I can use to embed live RSS feeds in an otherwise-static web page? I don’t want to be pre-processing anything, or cacheing XML or anything. I want a live display of a live RSS feed in a static HTML page. I don’t care if it’s a PHP or PERL or whatever-based CGI that does the heavy lifting, as long as it’s relatively portable (i.e., don’t have to recompile PERL on MacOSX like rss2html.pl seems to want to do). Oh, and it has to be able to run on my server. I don’t want to have a cross-the-pond round trip like what is required to use the feed processor at curry.com

Shipping the Prototype

Interesting article online at http://www.infoworld.com/article/03/02/06/06stratdev_1.html.

It basically says that prototyping is a Good Thing, and that solid prototypes lead to a better understanding of the problem, which leads to better software in the end.

This is something I’ve always done, just because that’s the logical way to go (in my opinion)… Start by analyzing the problem, then enhance your understanding of it, then solve it.

It’s waaay too easy to get it wrong if you go the other way around…

Interesting article online at http://www.infoworld.com/article/03/02/06/06stratdev_1.html.

It basically says that prototyping is a Good Thing, and that solid prototypes lead to a better understanding of the problem, which leads to better software in the end.

This is something I’ve always done, just because that’s the logical way to go (in my opinion)… Start by analyzing the problem, then enhance your understanding of it, then solve it.

It’s waaay too easy to get it wrong if you go the other way around…