Rebecca Bettencourt on xCards
Current Occupation: Software Engineer
What occupation did you have when you last worked on your HyperCard clone?
When I was working on Project 11, I was still in middle school I believe.
OpenXION began as my senior project during my last year as a college undergrad. That summer I started working as a software engineer at Experts Exchange. I'm now a software engineer at Google and I still work on OpenXION occasionally.
How did you get into this job?
I've been programming in some capacity ever since I was in fourth grade. That was when I discovered HTML, BASIC, and of course, HyperCard. I instantly fell in love with programming. I love the freedom it gives you to tell the computer what you want it to do rather than do what the computer wants you to do. So when I went off to college, my choice of major was fairly obvious.
I had been programming in both HyperCard and RealBasic for quite a while when Tyler Vano's idea to build a new HyperCard IDE came about on the HCML. That is how I became one of the project leads on Project 11.
As part of my undergrad program, one of the graduation requirements was a senior project, and I chose that opportunity to attempt to bring HyperCard back to life yet again. That was when I started OpenXION.
Did you have a HyperCard (clone) related job before you started work on OpenXION?
I have never worked on anything HyperCard-related as part of my actual job.
Did you work with HyperCard before you started working on OpenXION?
I had been using HyperCard for a few years before I started working on Project 11.
Did you work with any of your clones before you started working on them?
No, in both cases (Project 11 and OpenXION) I was in on the ground floor.
How is/was working on Project 11/OpenXION
I'm trying to remember what working on Project 11 was like. I just thought it was so cool what we were going to do: we were going to bring HyperCard to the modern world and it was going to be awesome. We did produce a lot of interesting demos, but unfortunately we didn't really know what we were doing and all of our code didn't really fit together. So it was a bit of carefree fun even if we got very little out of it.
Working on OpenXION was very exciting. I was taking a class on programming languages at the time, so I was learning how to write a parser and an interpreter and a compiler. I now knew the correct way to do things! There was some frustration in the beginning, as I discovered that the tools I was trying to use (ANTLR and JavaCC) were not well-suited to what I was trying to do. HyperTalk really is a bitch to parse, if you'll pardon my language. It is full of very parser-unfriendly features: case-insensitivity, keywords used as variable names, and unquoted literals chief among them. I quickly determined that if I were to get this project off the ground, I'd have to write this parser by hand. A lot of professional programmers would grumble at such a prospect, but I relished in it. It was a lot of fun, but it was also a ton of work. OpenXION took up just about every minute of my free time, and even then my senior project was released with some features missing (file I/O being a major one). I still work on OpenXION, but now I get to take my time.
What was your first job, ever?
I had to get an internship as part of my high school's graduation requirements. I was supposed to work with the IT person at my middle school to set up their new server, but that fell through and I ended up helping the director of an adult special education program learn how to use her computer.
My first paid job was just after my first year of college. I got a job at the community college library where my mom worked and helped re-shelve books, move books around, enter new books into the catalog, and do lots of other things related to books.
Who was your hero/idol at that time?
At that time I didn't really have a developed sense of, anything really, so everything from favorite music to heroes to religion was really up in the air for me.
Who is your hero/idol now?
Walt Disney, Stephen Wozniak, Bill Atkinson, Sylvia Rivera, Harvey Milk, and most recently Lauren Faust.
What is the most important thing in life for you?
To live well, and create something with a profound positive impact on the world.
What clones did you work on?
I've worked on two: Project 11, which never got off the ground, and OpenXION, which I've actively maintained for the past couple of years.
When, how and by whom did you get introduced to these projects?
Project 11 started when Tyler Vano and I met on the HyperCard Mailing List. It was sometime around the year 2000. I was in middle school, or possibly early high school, at the time. Tyler and I had this great idea to combine all the cool stuff the community was creating in HyperCard, and we were going to build a modern IDE. We called this project Sphere Project for want of a better name. I eventually came up with the name WildFire, and it stuck. But we realized when Mac OS X started taking off that HyperCard's life was nearing its end, and we decided to start writing our own complete clone of HyperCard. This was called Project 11, and to this day we haven't thought of a better name.
OpenXION started as my senior project at Cal Poly SLO. In the few years since I had last worked on Project 11, I never let the dream of an open-source HyperCard die. I chose this opportunity to attempt to make that dream a reality once again.
What impressed you the most about your clones?
With Project 11, what impressed me most was how much we were able to make it look like we were actually doing anything. I say that jokingly, of course; we were doing plenty of things, they just never fit together coherently.
What impresses me most about OpenXION is that I actually pulled off parsing HyperTalk's grammar!
What do you consider your main contribution to Project 11/OpenXION?
I had a bunch of APIs and libraries that were going to be part of Project 11. But my most significant contribution by far to that project was the reverse engineering of HyperCard's file format.
OpenXION has been completely my own creation so far, so my main contribution to that project would be, well, all of it.
Please describe Project 11/OpenXION in one sentence
Project 11: The IDE looks like RealBasic, but the language looks like HyperTalk.
OpenXION: It's a scripting language that enables ordinary people to do extraordinary things.
Is there any particularly clever solution you applied to OpenXION you'd like to describe in excruciating detail?
One thing about OpenXION that I just love telling in excruciating detail is the syntax of a factor and how I figured it all out. The HyperCard Script Language Guide likes to describe a factor as "a single source of value," and quite frankly that's better than anything I'd come up with. A factor is as simple as '2', or as complex as 'char 3 of the sqrt of cd fld id 16'. An expression such as '2 * 3' is not a factor; it is two factors, '2' and '3', joined with a binary operator to form an expression. The concept of a factor is an important part of HyperTalk's grammar, whether you're parsing HyperTalk or just writing in it.
When I was building the parser for OpenXION, I couldn't keep all the different grammar rules for all the different kinds of factors in my head at once. So I took over an entire whiteboard in the software engineering lab at Cal Poly SLO and drew a humongous graph of the syntax of a factor. As I messed around with the parser, trying out different code fragments, I tweaked the graph. The graph stayed on that whiteboard for several weeks, catching the curiosity of several other software engineers, who had no idea what it was for. I remember there was one part of the graph that I had circled and labeled "(potentially) difficult point." One software engineer had extended the graph to include "zombies" and circled and labeled that part "(potentially) amazing points."
If you're curious as to the syntax of a factor in OpenXION, it looks something like this:
Factor:
UnaryOperator Factor -> UnaryExpression
| if ListExpression then ListExpression else ListExpression -> ConditionalExpression
| ( [ListExpression] ) -> Expression
| QuotedLiteral -> StringExpression
| NumericLiteral -> NumberExpression
| me -> MeExpression
| super -> SuperExpression
| Constant -> ConstantExpression
| all the MassDataType [of|in Factor] -> VariantMassDescriptor
| all MassDataType [of|in Factor] -> VariantMassDescriptor
| all -> VariableExpression
| the Modifier Identifier [of|in Factor] -> FunctionCallOrPropertyDescriptor
| the Ordinal to|thru|through Ordinal OrdinalRangeDataType [of|in Factor] -> VariantOrdinalDescriptor
| the Ordinal OrdinalDataType [of|in Factor] -> VariantOrdinalDescriptor
| the MassDataType [of|in Factor] -> VariantMassDescriptor
| the SingletonDataType [of|in Factor] -> VariantSingletonDescriptor
| the Identifier [of|in Factor] -> FunctionCallOrPropertyDescriptor
| the -> VariableExpression
| Modifier Identifier [of|in Factor] -> FunctionCallOrPropertyDescriptor
| Modifier Identifier ( [ListExpression] ) -> FunctionCallOrPropertyDescriptor
| Ordinal to|thru|through Ordinal OrdinalRangeDataType [of|in Factor] -> VariantOrdinalDescriptor
| Ordinal OrdinalDataType [of|in Factor] -> VariantOrdinalDescriptor
| MassDataType [of|in Factor] -> VariantMassDescriptor
| SingletonDataType [of|in Factor] -> VariantSingletonDescriptor
| IdDataType id SingleExpression [of|in Factor] -> VariantIdDescriptor
| IndexRangeDataType SingleExpression to|thru|through SingleExpression [of|in Factor] -> VariantIndexOrNameDescriptor
| IndexOrNameDataType SingleExpression [of|in Factor] -> VariantIndexOrNameDescriptor
| Identifier [of|in Factor] -> FunctionCallOrPropertyDescriptor
| Identifier ( [ListExpression] ) -> FunctionCallOrPropertyDescriptor
| MassDataType -> VariantMassDescriptor
| SingletonDataType -> VariantSingletonDescriptor
| Identifier -> VariableExpression
If you could add one more feature to OpenXION, what would it be?
A compiler.
When, how and by whom did you get introduced to HyperCard?
I was playing around on my sister's computer, and I found a bunch of HyperCard stacks. After getting bored with the existing ones, I discovered I could create a new stack and start drawing on it with the painting tools. (It was a copy of HyperCard 2.1 that had been unlocked with the 'magic' command.) I copied the HyperCard program and some of the stacks onto a floppy disk and took it back home to play with. Then I started to dig around the existing stacks, seeing how all the different buttons worked. I started collecting examples of HyperTalk code, and hacking together my own stacks.
What impressed you the most about HyperCard?
The fact that I, a mere mortal, could get the computer to do anything I wanted it to do!
Please describe HyperCard in one sentence
HyperCard is a solution looking for a problem.
If you could have added one feature to HyperCard, what would it have been?
Native widgets, transient data, reusable windows - everything needed to make an actual desktop application with it.
Do you think there is a new HyperCard today? What is it?
I think SuperCard and Revolution (whatever it may be called now) are the closest things we've got.
Do you think there is still a need for a new HyperCard?
I still believe there is a need for an open-source HyperCard clone. SuperCard and Revolution are all well and good, but in my opinion they have two major problems: they're expensive, and they're proprietary.
What made HyperCard the ubiquitous product it was in the early 90's as opposed to the niche product SuperCard and Revolution are today was the fact that it was included free with every Macintosh sold. So anybody could use it to create something, then share their creation with somebody else with the confidence that the other person would be able to run it. That isn't true of HyperCard clones today, and outside of our own little clique, barely anyone even knows of their existence.
The other problem is what led to HyperCard's downfall after Apple steved it: without any way to run the application itself, there is no way to run the stacks created with it. So all those years of creative output are now locked away in a proprietary format.
An open-source HyperCard project would solve both of these problems.
What do you think the competing products did better than you?
Unlike Project 11, they actually have a product. Unlike OpenXION, they have a complete HyperCard clone rather than just an interpreter. Also, they have developers working full-time on their products.
What single thing did your application do better than the competitors?
I think the single thing OpenXION got better than any of its competitors was its compatibility with existing HyperTalk code.
Did you ever get to meet any of the competing clone developers?
I've never met any in real life, but I once had a discussion through the HyperCard Mailing List with one of the developers of TileStack. We talked about HyperTalk's grammar and how crazy HyperTalk code can get and still be valid. I did drop a few hints for the rest of the list that I might be secretly working on something (this was before OpenXION was released publicly) but nobody ever picked up on them.
Why did you start writing a HyperCard clone?
I saw something missing in today's modern technology: low barriers to entry. In the late 70's and early 80's, all computers came with BASIC. In the late 80's and early 90's, every Macintosh came with HyperCard. Anybody with a computer had everything they needed to make the computer do what they wanted, using an environment with a rather flat learning curve. There just isn't anything like that today. Computer programming is now a skill that has to be pursued rather than discovered, and I find that kinda sad.
Do you think HyperCard clones are/were a good thing?
Yes, because if it weren't for HyperCard clones, we wouldn't have anything like HyperCard at all today. And someday, it will be a HyperCard clone that lowers the barriers to entry once again.
Is there anything else you'd like to say?
I will not rest until there is a complete open-source HyperCard out there.
Oh, and Fluttershy is best pony.
Thank you, for your insightful answers and for your amazing work in publicly documenting HyperCard's file and image format.