Working with Programmers to Create Context-Sensitive Help

My main job, which I consider “real” technical writing, is creating the help that is installed with an application. Context-sensitive help (CSH) provides a better user experience than always opening an intro topic. That is, a user is trying to modify a site and isn’t sure what to type in a particular field, so he clicks Help. A help topic appears that describes exactly how to modify a site. That’s CSH; the topic appears based on the context in which the user clicked Help.

The developer/programmer can add “help hooks” and “help IDs” (code) into the code for the Help button. (He also has to add code to call the help—tell it which file to use for the help, what to display, blah, blah, blah, but I’m not a programmer.) So if the developer is creating a dialog box named New Site and adding a Help button, he might add a help hook named HIDD_NEW_SITE with an ID of 0x204FF*. When the developer is done coding, ready for QA to test the application, or the technical writer nags him that she needs the help hooks, he can export a file from his coding application with a .H, .HH, or .HM extension**. And with that, the developer’s contribution to the Help is complete–unless he made mistakes or forgot to add some help hooks. (Alternatively, the technical writer can define help hooks for each topic, create the .H, .HH, or .HM file, and send it to the developer to add to the code.)

When I’m writing new help topics or editing existing help topics, I install the latest build (in development) of the application on a virtual machine (VM) so I can write more intelligently about what it actually does when I click, right-click, and so on. In some ways, I’m doing “QA” on it and writing up bugs that I find, but I don’t do a formal QA. (We have smarter people than I to do that.) One of the things I do test for, however, is whether the help appears at all and, if so, if the topic is relevant (context-sensitive). I can tweak the CSH files to link a specific help hook to a different topic, if needed.

Often the name used for the help hook is not very intuitive (HIDD_AFTER_INSTALL7) , so I need to ask the developer which ID is assigned to which dialog box. First, I create a spreadsheet that lists the dialog box, the help hook, and the topic that I think should appear for that dialog box. (Remember, that the developer may not have ever seen the interface, just code and COM API interactions.) I then email the spreadsheet to the developer and ask him to fill in the blanks. Seems simple, right?

Sometimes a developer has no clue what I’m talking about, either because he’s never worked with CSH before, he didn’t read the email, or English is not his first language, and so he responds that the error is on my end. If this happens to you, use your “detail oriented” technical writing skills to verify that the following is true:

  • You have the correct help hooks file (.H, .HH, or .HM). On one project, we had 5 different HM files and I had no idea which one I was supposed to use, and neither did anyone else. (The most recent one? Not necessarily.) The fix for that is ask them to export a new one. If you already reference it in the help authoring tool, ask if they can name it the same, to make your life easier.
  • Each hook in the .H, .HH, or .HM file has “#define” and a space in front of it. Sometimes they don’t.
  • Your map file or alias file (the .ALI file) is formatted correctly and ALL of the correct hooks linked to relevant topics. (You don’t have to link every ID in the .H, .HH, or .HM file, just the ones that are assigned to Help buttons.)
  • The ALI and .H, .HH, or .HM file are properly referenced in the HHP file.

If you don’t edit the ALI file directly, but prefer to do it in RoboHelp, make sure RoboHelp still “sees” the hooks. When I copy and paste an updated version of the file into the project (overwriting the existing, same-named file), RoboHelp sometimes forgets it. I don’t know why. Of course, if this a new file, you have to import it–RoboHelp doesn’t know the file exists if you just paste it into the project. You must import it to add it to the project files.

After you’ve fixed your mistakes (or you’re positive you haven’t made any mistakes), generate the CHM again and paste into your VM with the latest build installed. (When you generate the help, you can view the log file to see if there are any errors that you can fix.) Test every Help button, using your spreadsheet as a reminder of which dialog boxes have Help buttons. You should test every button every time, because sometimes you break things unintentionally when you’re fixing other things! If you’ve decided everything is working on your end, ask/email the developer again, ask him to review your worksheet, and point out the exact help hook(s) that you believe are broken. (Developers are busy people and usually get paid a lot more than you do, so make it easy for him to scan the email to see what you’re asking him to do.)

Microsoft HTML Help Workshop (HHW.exe) is a utility to test that you have valid files. It’s an old app that Microsoft no longer updates, but it still does the job. In HHW, specify the CHM you want to test, then click Tools > HTMLHelp API. In the dialog box that appears, select HH_HELP_CONTEXT and then type in a map ID (decimal or hex works).  When you click OK, the topic that you want to appear for that map ID should appear. If the wrong one opens or nothing opens, you need to fix the .ALI file. If a message appears that says something like “HH_HELP_CONTEXT called without a [MAP] section” that means something is broken. (Duh.) You can decompile the CHM (in HTML Help Workshop) and see that there is, indeed, a [MAP] section, yet it doesn’t “see” it. Why not??

If you get that message, ensure that the .ALI and .H, .HH, or .HM are properly referenced in the .HHP file. Computers aren’t very smart—you make one mistake and they get confused! (One time I had to generate WebHelp, before the HHP file would update. I wasn’t about to manually add a bunch of files! I do merged helpsets, so I need a valid HHP for that.)

This is important to understand: if your CHM works in HTML Help Workshop, that does NOT mean that it works in the application! All it means is that the .ALI file and CHM are properly formatted and a topic opens when you provide the hook. Period. For example, you could have two of the help hooks reversed or wrong topics referenced, but the CHM will still “work” in HHW. The only way to be sure your CHM works in the application is to paste it into the installation folder (or wherever the existing CHM is stored), and then try it in the application. Your application will have to be closed to do this; otherwise, you’re trying to overwrite a file that is in use.  In my last experience with “broken” CSH, the developer had forgotten to add hooks to the dialog boxes that didn’t open the correct help. He kept insisting that the CHM worked for him. After three emails asking him to please test it in the application, not in HHW, he finally accepted that it was broken in his code.

Usually the application is coded such that if a user clicks a Help button and there is no help ID assigned to it, the default help topic (e.g., Intro) will appear. So when that happens in my testing, that’s a pretty good clue that either there is no help hook or I didn’t add it to the ALI file. Don’t let the developer intimidate you. You might be doing something wrong, but if all he tells you is that the problem isn’t in his code (rather then telling you specifically what is wrong with yours), ask for more information. He should be able to tell you, “When I click the Help button on the New Site dialog box, this ID is triggered, but the CHM is opening the Intro topic.” You can then verify that the ID is in your ALI file and linked to the topic that you want to open. (If he had looked at your spreadsheet, he would have seen which IDs you were using for each Help button.) Of course, if release is happening soon, opening the Intro topic is better than having no help at all!

*Help hooks in the app are in hexadecimal (0x204FF). Help authoring apps like RoboHelp list them in decimal. If you want to convert the hex number to decimal, open Windows Calculator (click Start, then type calc.exe), click View >Programmer, type the hex number, then click Decimal. The number is converted to decimal.

**In this article, I’m talking about Microsoft HTML Help (CHM). The basic process is similar, but in JavaHelp (JH), the map file is simply called a “map file”–imagine that!–and it’s formatted slightly differently. This is how I learned how to write JH: http://shop.oreilly.com/product/9781565927193.do. I highly recommend buying the book (because knowing how JH works will help you fix it when it doesn’t work!), but this page  gives you the general idea if you just need a refresher: http://oreilly.com/catalog/creatingjavahelp/chapter/ch05.html

How a Technical Writer is Different than a “Normal” Writer

How is a technical writer different from a “regular” writer or an administrative assistant? I’m rarely asked this question, but I know people think it by how they act toward what I do and how they treat non-technical writers and assistants, whom they assume can also do what I do. So I thought an explanation might be necessary. “Technical Writer” is not in the career path of an administrative assistant. They are two completely different careers. (However, I did work briefly as a “Technical Assistant” while in college. I taught a professor how to upload and maintain her online journal. She paid me with her grant money.)

There are numerous resources on the web that explain what a technical writer does. This one will give you a general idea of what I do: http://en.wikipedia.org/wiki/Technical_writer. The Bureau of Labor Statistics Occupational Outlook Handbook also has a detailed description of what technical writers do, but doesn’t really explain the “technical” part of the job title very well. The general description is “technical writers must be able to understand complex information and communicate the information to people with diverse professional backgrounds.” If that was all you read or knew about technical writing, you might think that anyone who can write can be a technical writer. You would be wrong. If you are talking about “secretaries” documenting complex software and hardware equipment, you would be very wrong.

I’ve worked in many different technical industries as both a technical writer and as an electronic technician. Therefore, I take offense when a company hires someone as a technical writer who, while perfectly capable of writing well, has no skill whatsoever that could be considered technical. I’ve worked with many a “technical writer” who was not at all technical—and some who could barely write. Fortunately, most people who actually want to be writers have a desire to learn the rules of writing formal documentation. However, many of them learned to write academic papers, and that is often a very different audience than those who read technical papers.

People who have resorted to reading the “help” available with the software or hardware product that they’re using are already frustrated with the product, have a specific task or question in mind, and want to “get in and get out” of the help and move on. They don’t want to read your flowery prose full of descriptive adjectives and they don’t want to parse your 20-word sentences full of multisyllabic words to figure out what the heck you’re trying to say. (Your professor isn’t reading your essays anymore, so there is no need to impress her.) All the user wants to know is “click here to do that,” and sometimes, “why should I click there?”

When I document a software product, in addition to reading the requirements and the functional description (written by a product manager or engineer), I have to actually use the product the way a user would. That means I have to install it. I also have to install, update, and maintain virtual images—sort of an operating system within an operating system. For example, before I install my company’s software that is being developed, I need to install an “image” of Windows 2008 on my desktop, and it has to be updated, patched, configured, and so on. That way, if the software product I’m installing messes something up, I can reset the image rather than rebuild my whole computer. If I had to ask an engineer to install the software for me every time they released a new build, I wouldn’t have the job for long. If I were documenting how to install a piece of hardware, how to align a circuit board, how to cable up a bunch of cabinets, and so on, it’s much easier to write about it—and more accurate—if I’ve actually done it.

The software that I document at my current job is used to transfer files all around the world, so I also need to know about networking, LANs, WANs, TCP/IP, SFTP, which ports are the defaults, what is “localhost,” etc. I’ve taken classes in Windows administration and network administration, and I have an A+ Certification for both hardware and software. I didn’t “need” that to do my job, but it certainly makes it easier and lowers the learning curve when new features come out. Technical aptitude, if not the specific knowledge, is one of the important traits a technical writer must have.

One thing I love about my job is that I’m always learning new things. As new features are added to the product (e.g., support of IPv6, CAC cards, AS2), I have to read what the product manager has documented, and do my own research so that I can understand it. You *can* try to edit what the subject matter experts (SME) give you by identifying the nouns, verbs, and so on, but unless you really understand the subject, you could make it more confusing to the user. You can always send it back to the SME for review after your edits, but you can save yourself and the SME time if you make an effort to research and understand the subject matter.

When I worked at a bank, my job was to provide procedures to the telephone bankers for how to use their software—software to which the writers were not provided access! So based on the reckoning of my fellow technical writers who used to be telephone bankers (not writers, technical or otherwise) or current telephone bankers, or managers (who may or may not have used the product at some time in the past), I was supposed to write procedures for the telephone bankers to use when on the phone with customers. Does that make sense? The telephone bankers for whom we were writing the procedures were supposed to be my SMEs! It would have been super easy for the IT folks to install a virtual image on our computers or in a networked location, install Siebel and other banker tools on it with dummy data, and let us click and double-click our brains out so we could understand what we were writing about. But that was considered 1) a security risk (even with dummy data) and 2) over our heads. So they considered us too stupid to understand the software that we were supposed to document!

Why would they think that? Not only because they didn’t understand how technical writing works, but also because most of the people they hired as technical writers were neither technical nor writers—they got a job at the bank in high school, had worked there ever since, and got the technical writing job because they had banking experience and seniority. A few of them could write, but none were tested in any way to determine if they could write before they got the job. One of the managers told me that these former bankers had “tribal knowledge” that was important to understanding the procedures. I can teach you proper banking procedures, which are pretty black and white. I can teach you rules of grammar, sentence structure, and how to write a proper procedure. I can’t teach you all of the little nuances of applying those rules that become instinctive after writing in your job for a long time. I can’t teach you how to think critically, how to troubleshoot software issues, and all of the little nuances of technical work that I’ve learned by doing it over and over again in my career.

Some people have a technical mindset and some just don’t, just as some people are good at customer service, which I’m not. Before hiring a technical writer, give them a basic writing/grammar test AND a test of their technical skills. There are many, many writing and grammar tests available online for free. If you already have a technical writer in house, I’m sure she’d love to write a test for you! The technical skills test doesn’t have to be complex. There are many resources online, both free and not so free. I’ve taken tests that are directly related to what I would need to know on the job for which I was applying. Any of your engineers can come up with one—but please let your technical writer edit it!