State Machines and Tango
State Machines part two
My life as a network administrator ended and life as a professional software developer started in 1997 when I moved back to Colorado and got a job with VisionLink . At the time, VisionLink used Tango and FileMaker Pro on PowerMac G3's for their web application (there was only one at the time). Tango has changed hands a number of times and now goes by the name WiTango .
Since leaving VisionLink I've worked with many other web application tools. PHP, Zope, the ArsDigita Community Server, perl and python cgis, Turbine, Velocity, Struts, JSP. Tango had one thing that all of those other technologies lack. The development tools encouraged you to think in terms of what the whole application was going to be doing rather than thinking one page at a time. I miss that way of thinking about web applications. It was like having an outline of the application up front. You still had to put the individual pages together but every page was inherently created in the context of the rest of the application. It was easy to see the relationship of the forrest and the trees.
Few people have even heard of Tango, much less developed an application of any complexity with it. It's hard to explain why it's a better way to think about the apps. Perhaps it's similar to making the leap from simple functional programming to recursive programming, or from procedural to object programming. Or the leap to using patterns. (I'm sure that aspect oriented programming will open up still more options if I can ever make the time for it.) It's all programming, but different modes of thinking about problems open up different solutions. For a given problem some modes of thinking are more effective than others. I think Tango had a better fit for thinking about web applications.
I have just recently learned to think of that "outline" as an application-level state machine.
Looks like the WiTango Development Studio hasn't changed radically since my Tango days. There's a picture of the outline I've been talking about on that page. It's a tree widget with if...else branches and such. Those branches are at the application level, not the page level. If the user isn't logged in ... if action=save ... and so on. As opposed to if user has x permission then show y widget or other page logic.