Felix Memory Serves

The power of automatic saving

I’m working on the next version of Memory Serves now, so I’m doing a lot of dogfooding with it. I’ve thus been using Memory Serves pretty much exclusively over the past month for my own translation work.

Over the course of using Memory Serves intensively, I’ve uncovered quite a few areas needing improvement; which is good, because knowing about the problems makes it possible to fix them. 🙂

One feature that really saved my bacon, however, was the fact that Memory Serves keeps the database up-to-date at all times. I had been working on a fairly large translation, and went out with my family for dinner. Okinawa was experiencing some intense electrical storms, and when we got back, I found that my neighborhood had had a blackout, and my computers had all shut down.

Since Memory Serves uses the SQLite database to store the translation memories, all changes to the TMs are saved to disk immediately. So none of my work was lost, and I was able to carry on translating.

With Felix, your TMs aren’t saved automatically; you have to save them much as you would a Word document. Although it will prompt you to save if you exit the program with unsaved changes, if your computer (or Felix) crashed, then you’d lose all the translation entries you’d made since your last save.

This happened to a Felix user a few months back: she had been working on a translation for about six hours when her computer crashed, and she hadn’t saved her TM even once. She asked me if there was some way to recover her translations, but the only way was to use Align Assist to recreate her translation memory — the original TM was lost.

I added a ticket to my Felix issue tracker to add automatic background saving of TMs, but until now I’ve given higher priority to other development. Seeing first hand how this feature saved my own bacon with Memory Serves, however, I’ve decided to give it higher priority for Felix as well. I hope to have it included in Felix by the next release (version 1.5), or at the latest by the version after that (1.5.1).

The next version of Memory Serves will be released over the next few days, and it’ll have a lot of improvements as well. In particular, it’s much faster, fixes some issues with correcting/editing translations, and will have a new search and replace feature. The new search and replace will serve as a prototype of the improved search and replace I’m adding to Felix.


Some of my favorite user-inspired new features in Felix

I’m a professional translator, and I use Felix in my work. Actually using the software you make is called “eating one’s own dog food” (or “dogfooding”), and it’s a great way to improve the quality and usability of software (you might also be surprised to find out how rare it is — or not surprised, depending on your cynical bent).

While dogfooding does help make software a lot better, it also has two main weaknesses/blind spots:

  1. You get used to doing things certain ways, so tend not to notice other ways of doing things that are buggy or inconvenient
  2. You get so used to doing things one way that you don’t think of better ways of doing them

This is why user feedback is so important. I actually love it when users tell me things that they don’t like about Felix, or things that need improving. Firstly, I know that if one person takes the trouble to send me feedback, there are at least 10 other users feeling the same pain. Secondly, getting a new perspective on my “baby” can help me see new opportunities for improvement.

I just got finished doing a fairly large (200-page) translation, and I noticed that three new Felix features inspired by users were really convenient and made my work easier. I’ll list them below.

F6 to toggle between match and concordance views
Inspired by: Charles Aschmann
This is such a simple feature, that I’m amazed at how much time it saves me. When a translation match is displayed in the Felix window, you can select some arbitrary text in the query or translation, and press ALT + C (for source) or CTRL + ALT + C (for translation) to get the concordance for it — basically, find out how that string is used in context in other translation memory entries. That’s easy, but before it was cumbersome to get back to the match view. Being able to press F6 to quickly toggle between the match and concordance views made this feature a lot easier to use — and thus I find myself using it more and more often.
Saving profiles
Inspired by: Sako Eaton
This is great when I’m working on two jobs in parallel. I can save all my currently loaded TMs, glossaries, and settings in a profile, and then when I switch jobs, I can load the profile for that job to close all my current TMs/glossaries, and open the ones for that profile.
CTRL + Up to correct translations
Inspired by: Charles Aschmann
This feature also saved me some time. Before, when working in Word and I needed to correct a translation in the TM, I would have to either do it directly in the Felix window, or switch to Review mode in Word. Now, I can just correct the translation, and press CTRL + Up Arrow to correct the translation in the TM.

To Felix users: keep that feedback coming, it’s very much appreciated!


New development roadmap for Felix

As I noted in my first published roadmap for Felix, my plan was to make some minor improvements, then implement networking support for Felix in July, and a translation history feature in August.

I completed the first part of the roadmap with the release of version 1.1, and the second part (network support) with the release of version 1.2. My original plan for this month was to implement translation history support in August, then do minor improvements for a month or two after that.

My queue of “minor improvements,” however, has grown pretty large: there are now 37 enhancements/fixes queued in my issue-tracking system (some of them requested/reported by users). While most of these are fairly minor and won’t even warrant mention in the list of improvements, taken together I think dealing with them has to take priority over a major new feature (translation history).

So I’m going to work on clearing my task list during the month of August, release the improvements in version 1.3 at the end of the month, and then get back to the translation-history feature in September.


Development roadmap for Felix

The Felix CAT tool

Now that my translation memory system has a new start as Felix, I’ve got a lot of plans for its development. In this post I want to lay out my development roadmap for the next three months. In June, I’m going to be working on a minor release with several minor enhancements. After that, I’m going to be working on two new features in July and August: translation history and network support (described below). I haven’t decided which order to implement them, so if you have a preference please let me know!

Translation history

This feature will be somewhat analogous to the Trados “bilingual file” concept, except that the information will be stored in a separate file. For example, if you’re translating a file called “MyFile.doc”, the translation history file would be “MyFile.doc.fth”.

This will make reviewing translations a lot easier. It will also make it possible to get rid of the “translation” and “review” modes (which I think introduce too much complexity) — instead Fellix will automatically know whether the current segment is a source or a translation, and behave accordingly.

Another benefit of the translation history feature is that it will allow integration with Trados-based workflows. I’ve long anguished over what to do about “bilingual” Trados files. There is demand to support these in Felix, but I absolutely didn’t want to do it the same way in Felix. I think embedding hidden text in your translation that later needs to be “cleaned up” is a horrible, horrible idea and one of the main reasons why I developed Felix. With a translation history feature, however, I could create a filter that translated between “bilingual” files and translation history files.

Network support

This feature will allow multiple translators to use the same memory simultaneously over a network, or over the Internet using a VPN. This eliminates the coordination problem, when two or more translators work on the same project simultaneously, and translator A translates sentence X or term Y one way, and translator B another way because they haven’t seen each other’s translations yet.

Further out

I don’t have anything concrete planned beyond August, but there are a number of things coming down the pipe. One is a new and improved Align Assist program (for “aligning” legacy translations to create translation memories). Alignment tools generally don’t work very well and are a hard problem, but there’s demand for them so I plan to brush up Align Assist when I hit a good spot with Felix.

I also want to have a better tool for translating XML files, and maybe some other formats like .NET resource files (for localization).

As always, if you have specific preferences for development, please let me know.


Defining a vision

Software needs to have a vision. A software program can’t be everything to everyone; you’ve got to decide who your users are and what you want to do for them.

I had a very clear vision for Felix (then TransAssist, then “Translation Assistant”): it would be powerful, simple, and get out of your way when you weren’t using it. It wouldn’t force its users to adapt to it; it would adapt to its users.

After all, that’s why I created Felix in the first place. I had been working with a couple of the major translation memory systems out there, and I was appalled at how hard to use and buggy they were, but most of all at how arrogant they were. They treated the translator like some trained monkey who had to jump through their hoops, rather than a professional knowledge worker who had just shelled out $1,000+ to use their crappy program.

Going Astray

Somewhere along the way, however, that vision started to get clouded. It was my fault for not stepping up and handling the marketing of Felix myself. Instead I left that to a company that understood the art of selling, but not of making software. In sales meetings where I wasn’t present, they were promising this feature or that feature; then they’d come back to me and say we had to hold up the next release yet again in order to implement feature X that Big Company Y said they absolutely required. Not quite coincidentally, that feature was usually on some checklist put out by one of the big players in the market.

Fire and Motion

Joel Spolsky describes this kind of feature war very aptly as Fire and Motion. Your competitors put out a slew of features that are useless for 99% of users, much like how an octopus sprays out an ink cloud. By the time you catch up the octopus is long gone, far ahead of you.

Implicit in my desire to finally take over the marketing of Felix was a determination to get back to my vision: simple, easy-to-use software. When you talk to users of translation memory, a lot of them will tell you that they bought their translation-memory program in order to get more work, or because their clients told them to. The classic captive user base. A captive user base is why most enterprise software sucks.

Select and Concentrate

I don’t want Felix to suck. I don’t want people to use Felix because somebody makes them. I want people to use Felix because it helps them work better, faster, and smarter. Sure, not implementing the feature smorgasbord will lose me some users, for whom feature X is a deal maker and deal breaker. On the other hand, keeping a well defined vision should make the software better for my target users.

That’s not to say that I’m not going to add features. In fact I have a big list of features that I’m working on right now. However, my focus is on features that reduce complexity from the user’s point of view, ideally making the program more powerful in the bargain.

Japanese has a handy expression, 選択と集中 – select and concentrate. The idea is that you pick your spots, and focus your efforts there. Rather than trying to be everything to everyone, you become indispensable to a niche that you select. That’s the direction I plan to take Felix.