I’m Old, Part XXXVII: The Rise of SteveApp

When I was in college in the mid 80’s, graphic work stations were on the rise but the CS department, with its limited budget, really only had a set of terminals running at 2400 baud. 2400 baud is barely fast enough to run a crappy visual text editor driven by keys only.

In my junior year, I had a (borrowed) Mac Plus in my room and routinely wrote fun little graphics programs for it. Also that year, the CS department got a set of color Sun workstations that they set up in the lab for a graphics course. They were also used by students who were not in the graphics class with the understanding that students in graphics got priority. I wanted to take the class, but it was the first offering and very popular. I had a talk with the professor and he was pretty sure that I would be bored to tears, so instead I signed up with him for a private study where I wrote a paint program for the Suns which I called StevePaint. The was the start of entirely egodriven nomenclature that carried over into my professional life.

When I was working on Acrobat Search, I created an anti-class library (it was straight C) that allowed the creation of UIs in a way that allowed me to do very rapid prototyping. It was based around the Macintosh Dialog Item List, which was referenced in a Macintosh application as a DITL, so I called it SteveDITL.

In the process of building that, I learned a lot about how applications were intended to be built on MacOS, but the existing application frameworks were fairly heavyweight. So I built my own application framework called SteveApp, which I used for my own code projects. For example, I wrote a GIF viewer that did nice dithering for 1-bit displays.

At the time at Adobe, there was a fair amount of platform cliques and I was always irritated that in the Search team, there was much more support for Windows tooling. For example, the indexer was a Windows only application written by Kevin Binkley and Eswar Priyadarshan. They routinely let the application loose on file servers on Adobe’s LAN to index whatever PDFs could be found. At that time, networked servers and network support were pretty flakey and could cause all kinds of issues in the indexer, some of which might not be found for hours and were hell to reproduce. Eswar used to kick off an index and come in many hours later to find out if it had crashed.

I decided that there should be parity in the Search product line, so I took it upon myself to port the Windows tool and I decided to use SteveApp to do it. I got about 80% through the port before I showed it to my boss and also to John Warnock, figuring that forgiveness was going to be easier to get than permission. It was, and now my work was on a road map.

In thinking about the work and the hours that Eswar kept, I realized that he was engaging in a polling model for his code and this was something that I could do better. So I wrote a separate app that could maintain a list of other Macintoshes with apps running on them on your LAN and would listen for pings from them. Pings came with brief messages to indicate what was going on along with a couple of standard identifiers (Idle, Working, Starting, Quiting). It had a configurable set of actions to take if pings didn’t arrive, and because I rolled that way, the actions came from plug-ins, so the app could be extended later.

So essentially, I built a separate app to watch the indexer and if it crashed or hung, I could make the app notify me. My boss witnessed me working on this and in spite of my reasoning of wanting to avoid the suffering of late night polling, he forbade me to work on it.


Life got worse because if you did network indexing on the current release of the MacOS (8.1, IIRC), the TCP/IP code in the OS had a nice, built-in bug that would shotgun memory. If your app was memory hungry, like the indexer, it was only a matter of time before it crashed out of your control.

Eventually, I wrote an app called “bloat-o” which when it started up, would allocate the largest block that it could, wipe it to 0’s then repeatedly loop over the memory looking for anything non-zero. I used this to definitively prove that this bug was in 8.1 and only happened with apps that used TCP/IP.

The product was eventually released, but between department politics and attitudes towards engineering, debugging the heap smasher and being forbidden to write a tool to make my life easier, I decided that I had enough of this group.

And that was the last Macintosh application ever written with SteveApp.

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.