They say that necessity is the mother of invention… personally, I think annoyance is just as likely a candidate. Sometimes when I’m at work I realize that what I’m doing could be done a lot more efficiently if the programs I was using worked just a little bit differently. Of course I don’t have the programming skill or time to actually implement these ideas, but maybe someone out there actually does. In fact, maybe somebody actually has… if so, pointing me in the right direction would be much appreciated.
Parallel word processors: Let’s say I’m editing a draft version of a document. To keep things simple, let’s say it just has three parts: an introduction (I), a body (B), and a conclusion (C). Instead of just correcting the text inline, I get an idea for an entirely different introduction (I’) and an entirely different conclusion (C’). However, I’m not sure whether I like my new ideas or not. There are now four possible documents here:
- I – B -C (the original)
- I’ – B – C (new introduction, everything else is the same)
- I – B – C’ (new conclusion, everything else is the same)
- I’ – B – C’ (new introduction AND new conclusion)
I want to compare these four to see which one sounds the best. There are a few ways to do this using typical word processors, but none of them are very convenient:
- Type all the text in one document (I – I’ – B – C – C’) and copy-and-paste each of the combinations together.
- Save document (1). Then change the introduction and save this under a different name (say, Document2). Then for each of these, I’ll paste in the new conclusion and save these under different names (Document3 and Document4)
- Use ‘Track Changes’ in Word and play around with different combinations of accepting and rejecting text.
While these methods work, at best they’re not-too-clever hacks of functions that weren’t meant for this purpose and have obvious shortcomings (with ‘Track Changes,’ once you accept a change there’s no going back so you can’t compare all four options) and at worst they’re incredibly inefficient (saving multiple copies). In all cases it gets really ugly really fast when documents become longer and versions start to multiply. It should be clear that we’re fumbling around a much more fundamental issue here: there is no easy way to handle multiple versions of certain parts of the text and toggle back and forth between them.
So, I propose a “parallel” word processor that easily allows one to incorporate multiple versions of the text. This could be done in a couple of different ways. For a markup-based language (think LaTeX), one might define an appropriate control sequence. Taking after Lilypond, I could type my document as <<I\\I’>> B <<C\\C’>>, where the angle brackets enclose several versions of text, only one of which will actually be used; the \\ sequence delimits these parallel versions, and perhaps a command-line or labeling feature lets me choose which versions to use when generating the document.
A more user-friendly GUI/WYSIWYG interpretation might allow me to assign labels to each version of the text, and manage which version is currently visible through a toolbar or dialog box. The latter would be particularly useful: I could cycle through different versions of the document quickly and easily, in an intuitive manner that matches the task — exactly the opposite of the workarounds we have to deal with now.
Of course, there’s no reason not to support nesting of this feature either. As a side bonus, parallel word processing might help to encourage stronger document organization… something that WYSIWYG editors tend to make people very lazy about. (But that’s another rant for another day.)
3D (or higher) spreadsheets: Spreadsheets are incredibly useful tools for organizing and manipulating data. If I want to make a table listing sales by region and product type, it’s incredibly easy to do. But spreadsheets are inherently two-dimensional entities, and sometimes a particular project demands something more. Let’s say I also want to break sales down by month. Conceptually, the easiest way to store this data is as a three-dimensional table (with axes representing region, product type, and month). But in a spreadsheet, I have to force this into a two-dimensional representation (for instance, as a separate table for each month).
Since printed media are two-dimensional, in the end I’m going to have to find a way to express the data this way (and it’s always good to think about final layout when doing data manipulation). But the process of data manipulation gets cumbersome if I’m forced to work in 2D the entire time.
For instance, let’s say I want to sum up the amount of Product X sold in Region Y this year. Since each month is stored in a separate table, I have to add up twelve different values to get this figure. What’s more, since they aren’t stored adjacently in my spreadsheet, I have to type the specific locations of all twelve cells, a time-consuming and error-prone process. But what if I want to find the total amount of Product X sold in Month Z? That’s easy. Since everything in Month Z is in one table, I just add up one row or column in that one table. Voila.
You see, there’s an asymmetry here. With spreadsheets it’s much easier to sum up a horizontal or vertical block of cells than it is to sum up a set of nonadjacent cells. Since I am forcing my data into a 2D structure, data which should be adjacent no longer are, and that’s annoying.
Easiest workaround? Instead of restricting me to entering a single values in a cell, allow me to store a vector of multiple values, which could then be referenced in a straightforward way (for instance, A1_2:A1_4 would reference the 2nd, 3rd, and 4th components of the vector stored in A1). The default entry mode wouldn’t require the user to do anything different to make a typical spreadsheet, but a particular control sequence (square brackets come to mind) would permit vector entry. Naturally these could be nested to create higher-dimension tables as well.
Viewing a higher dimensional table might be more difficult, but it’s not impossible (say, users could choose to view a certain 2D subset of the table). Snazzier options include translucency and rotation options (sort of like Aero but actually useful).
Any thoughts?
