Blog Archives
Workshops on effective writing – technical writers adding value
Our team at Atlassian has just started presenting a series of workshops for other Atlassians, on how to write effectively. People are very appreciative of the knowledge they gain in the workshops. In turn, we technical writers learn a lot from the participants. We see how much other people value our own skills. And we get a fresh look at writing and documentation, from another viewpoint. What’s more, the workshops are fun and invigorating. Added value all round!
I’m sharing the idea and content of the workshops in this post, because we’re finding them so valuable. It’s very rewarding as a technical writer, to see how much people value our knowledge and skill. It’s also interesting to see how much they appreciate a guiding hand in what we consider the very basics of writing a technical document.
Sometimes we forget just how much we know.
The format of the workshops
Each workshop takes the form of a one-hour session:
- Introductions.
- Lecture – see the material below. Questions are welcome at any time.
- Questions and wrapping up.
- Assignment of pages and posts for the workshop participants to work on at their leisure.
Before the session, the technical writer liaises with the manager of the team about to attend the workshop. We discuss the primary focus, and find out whether the team has any current plans to write documents or blog posts. Just recently in our organisation, a number of teams have put strategic initiatives in place to write and blog more. So our workshops come at a good time.
We also ask the participants and team leads to think of documents that need writing, so that their post-workshop assignments can be real documents.
After the session, the participants complete their assignments and choose one of the available technical writers to do a review. The review is a half-hour one-on-one chat, focusing on the document and any further questions the participant may have.
Kicking off the workshop
[The next few sections in this post contain the content of the workshops. The content is on a page on our internal wiki, which the technical writers use as a basis for the workshop. Participants can also use the page as a reference after the session.]
In this session you’ll learn how to write documents that people will find, read, and get what they need from. The aim is to provide a practical guide to help you get started quickly, and to put you in touch with the technical writers who can assist with reviewing your work.
We cover two types of document:
- A “how to” guide on the corporate intranet.
- A blog post on the corporate external blog.
Getting started on a document
How do you write a document?
One word at a time… not!
The big picture is the important thing.
- Sit back, think, and plan the document before you start.
- While writing, if the words don’t come, make a note and continue writing. Preserve the big picture. Come back later to fill in the gaps.
Talking to your audience
![]()
Who do you want to read the document? Who are the people you’re writing for, and what do they already know?
- Think about those people carefully. Make a mental picture of a person who has the characteristics of your target audience.
- Use that imagined person to make all decisions about your document.
- When in doubt about wording, speak to the imagined person out loud. Write down what you said. Write it down immediately, while it’s fresh. [I usually tell an anecdote here, about how some writers stick a picture of a person on their computer monitor, and talk to that picture.]
- If there’s more than one audience, consider writing a separate document for each audience. For example, consider separate documents for administrators and ordinary users.
The structure of a page
[The aim of this diagram is to illustrate that a page should have a number of headings, with short bits of text between them. After a quick look at the diagram, we discuss the sections in more detail below.]
State the purpose and audience at the top
Tell people who the document is for, and what it will help them do. This will let them know if it’s the right document for them.
Separate the concepts (“what” and “why”) from the task (“how”)
Some people already know the concepts. They’ll skip past that bit and go straight to the “how”. Other people know how to do something – they’ve found the right spot in the user interface, or found the right form on the intranet. But they want to know why they should do it, or what it means.
Use “chunking”
Split the content into easily-digestible chunks. Keep them short.
Use plenty of headings, so people can find the chunk they need. Research shows people’s eyes jump from heading to heading as they skim a page.
Lead your reader by the hand
Give clear, numbered steps. Don’t skip any steps.
People have come here because they’re stuck. Don’t worry, they’ll go away again as soon as they’ve got the idea.
Add related topics and/or next steps
Send the readers away immediately if they’re in the wrong place. After that, don’t send them away until you’re sure they’ve got what they need. So, keep links to a minimum in the main portion of the page.
- At the top: In the section about purpose, add links to documents the reader may need instead of this one. For example, if you have separate documents for administrators and users, link from the one to the other.
- At the end: Put related topics and next steps at the end, when you’ve finished with your reader.
Examples from our product documentation
[At this point, the workshop participants have already absorbed a lot of theory. It's a good time to show them some examples of good and bad design. Use these examples as a discussion point. Ask the participants what is good or bad about each page.]
Good structure
https://confluence.atlassian.com/display/DOC/Deleting+or+Deactivating+Users
Comments:
- Our current style is to put the related topics at the top on the right, instead of at the bottom. We’re discussing a change, because the design doesn’t work too well on mobile devices.
- Instead of a warning macro, we’ve used a panel (uncoloured) with an exclamation icon. There’s some discussion about coloured panels, and whether people skip over them when reading a page. See the references to “banner blindness” in the resources section below.
- [This is a good place to break for a quick chat about banner blindness. Find out what the workshop participants think about it, and how they themselves read a document.]
Not-so-good structure
[This is a page that has grown organically, with contributions from many people over a long period of time. It's had a revamp in the latest version of our documentation. The link points to an earlier version.]
https://confluence.atlassian.com/display/CONF50/Database+Setup+for+Oracle
Comments:
- No clear step-by-step flow.
- No indication of what each section is for, and whether you need to do them all.
- Other comments? [This is a good place for discussion amongst the workshop participants.]
Language and style
[This section contains a few key tips on language and style - the bread and butter of technical writers, but not necessarily well known by other people.]
Keep it short and simple
Use simple words and short sentences.
Use active voice rather than passive
[Explain the difference between active and passive. Hold a bit of a discussion here. This is a difficult concept for many people.]
Examples:
- Passive: The chocolate was eaten by the technical writer.
- Active: The technical writer ate the chocolate.
Why use active voice? It’s shorter. And passive voice can be confusing, because sometimes it doesn’t say who must do what. Imperative (command) is even better, when appropriate.
Bad:
“Your browser must be configured to xxx.”
Reader thinks: OK, so I’ll assume someone has already done that for me when setting up my machine.
Good:
“Configure your browser to xxx.”
Reader thinks: OK, I’ll do that now.
Clarify technical terms and abbreviations
Explain important concepts at the top of the page.
Spell out each abbreviation the first time you use it on a page. For example:
If you’re using IE (Internet Explorer), ….
…with regard to Workplace, Health and Safety (WHS).
Titles
The title is your most important tool for helping people find your document. This is especially true on a Confluence wiki, where people use the quick search a lot. The quick search is based entirely on the page title.
- Put the key information at the beginning of the title.
- Make the title describe the purpose of the document.
How to go about writing a page
[After quite a bit of conceptual and theoretical information, the workshop participants welcome a practical guide at this point.]
Step by step:
- Decide on your audience.
- Write the purpose.
First write it for yourself, then refine it for the audience. This helps to form the content of the page. - Write the title.
- Outline the document by creating the headings.
- Fill in the details.
Keep each section short. - If unsure, or struggling to find the right words, make a “TO DO” note and continue. Come back later.
Hint: I use “xxxxxxxxxxxxxx” instead of “TO DO”. It’s quick to type, strangely satisfying, easy to search for, and stands out when I’m reviewing the page. [This bit often leads to some animated discussion amongst workshop participants. Some of them already do something similar. Others love the idea, and smile with delight.] - Review the content yourself:
- Have you included everything you intended to include?
- Can you cut anything out?
- Should you split the document?
- Is your language and tone right for the audience?
- Ask someone else to review the page.
As any writer will tell you, it’s impossible to review your own work. Your brain knows what you wanted to say, and that’s what your brain will see even if that’s not what’s written. - If possible, do some user testing.
Grab a colleague from a different department. Get a different perspective! - Watch the page, and update it based on comments.
More about structure, at space level (specifically for Confluence wiki)
[It's time for more theory.]
We’ve already talked about the structure of page. The structure of your space also important. People often need to browse to see what’s available. Perhaps they don’t know what to search for, but they do know the general area they’re in.
Scenario: Jack searches for “proxy” and finds a page. But it’s not the one he wants. So he looks at the nearby pages.
How:
- Group related topics under a common parent.
- Use the Documentation theme to show the space structure.
Making sure people find your page
Already discussed:
- Structure of a wiki space
- Page titles
- Links to related topics
In addition to the above, let’s look at SEO (search engine optimisation) both internal (on the intranet, for the Confluence search engine) and external (on the corporate blog, for Google etc).
These are the key points for making sure people find your page or post:
- Make the title meaningful, with important words near the beginning.
- Make sure the URL contains real words.
If you are blogging on Confluence, don’t use special characters like “?” in a page title, because the resulting URL will not contain words. - Decide the key words for your post. These are the key concepts, and the ones the people are likely to look for when searching.
- Put your key words at the top of the post, in the introductory paragraph.
This ties in well with our structure, where the first section contains a introduction and a summary of the story. - Put your key words in the headings in your post.
Tools
- Templates and blueprints – make some of your own.
- Use the spell checker in the browser.
- Gliffy is great for simple diagrams.
Other hints
- Writing is a creative process, and it keeps happening even when you think you’ve stopped!
You’ll find yourself thinking of stuff to add to your document at odd times. While walking in the bush. Or in the middle of the night. Make a note. Email yourself. Put it on Remember The Milk. Whatever works. Such ideas are gems. Don’t lose them. - Optimise your page for people using mobile.
No section and column macros (on Confluence wiki).
Short sections with lots of headings. - Limit the number of note- and warning-boxes to a maximum of two per page. Using more than this can indicate an organisational problem in the text.
Writing blog posts
[This is just a summary. We have another workshop that focuses on blog posts.]
Your blog post is likely to be technical, so the process of writing it has much in common with writing a technical document.
Here are some quick pointers:
- Maintain a character in your blog, so that people can start seeing it as a friend. Blogging is a social activity. Be yourself! Otherwise it’s difficult to maintain a consistent persona and people will soon pick it up if you don’t sound real.
- If you’re writing on the corporate blog, ask for guidelines about the tone and style to use.
- Write each post around a story or a ‘hook’. This will give the post a theme, making it easier for you to write and easier for people to read.
- Make sure the title reflects the main story. This will attract readers and give you a good position in search results such as Google or Bing.
- Add structure to the content. Yes, even in a blog post. Put headings in the post itself. Split the information into easily-readable chunks.
- Give plenty of factual information, preferably hard-won. That’s what people value. Code samples and screenshots are great.
- Link to other people’s blogs. If your idea is an expansion of something someone else has written, include a mention of where you got the idea. If you’ve seen someone’s post about a related topic, link to it. The other bloggers appreciate this and will start linking back to you in return.
- Be nice, positive and sincere. If you disagree with something, say so but be constructive. Some bloggers are successful by being horrid, but to make that work you have to be really good and have a curl on your forehead. I don’t like nastiness, manipulation or one-upmanship, so I wouldn’t recommend it.
Resources
- Kurt Vonnegut:
Here’s my all-time favourite: Kurt Vonnegut’s How to Write With Style.
The best thing about Kurt’s guide is that it illustrates his principles so perfectly. This excerpt is from the section called “Sound like yourself”:
…lucky indeed is the writer who has grown up in Ireland, for the English spoken there is so amusing and musical. I myself grew up in Indianapolis, where common speech sounds like a band saw cutting galvanized tin, and employs a vocabulary as unornamental as a monkey wrench.
This bit is pretty cool too:
Pity the readers
- Avoiding framed and decorated text boxes:
- [Link to your corporate style guide here.]
That’s the end
In designing the content of the workshop, my aim was to give the participants as much practical guidance as possible in a short space of time. I picked the top things we technical writers know, about how to make a document work.
To add variety to the one-hour session, I chose a mix of theory and discussion sections. The sessions to date have been lively and interactive. We ask participants to complete a feedback form a week or so after each session.
The actual writing happens after the session, in the participants’ own time. They can then request a one-on-one review with a technical writer, before publishing their document either internally or for the whole wide world. Participants have expressed their thanks and said the content is useful, and have indicated a wish to attend a follow-up session.
What do you think of this type of workshop, and its potential as a way technical writers can add even more value to our organisations that we already do? I’d love to hear if you have run something similar within your own organisation too.
Python as a useful tool for technical writers
Every now and then, and perhaps particularly so when working on a wiki, we technical writers need to manipulate our content in some way that’s not provided by our content management system. A few times recently, I’ve dabbled with Python to solve some problems. Do you often find the need to wrangle your content outside your CMS, and do you use Python or another scripting tool?
Python is a scripting language. It’s easy to learn, especially if you’ve done some programming in other languages. It’s just the ticket for data manipulation. It also offers a number of useful libraries. For example:
- There are various libraries that you can use to access a web application via a SOAP or an XML-RPC remote API. I use the “xmlrpc.client” library in a few scripts, to get access to Confluence data.
- The “os” library is useful for creating directories on the local file system of the computer you’re running on. For example, I use it to create a directory for the script’s output file.
- The “re” library offers regular expression functions.
A script to find duplicate page names across Confluence spaces
This was the first Python script that I wrote to wrangle Confluence data. I started with a specific problem: I had five text files, each containing a list of page names. These were the pages in five Confluence spaces, that we needed to copy into another, single space. The problem is that Confluence does not allow duplicate page names within a space. So I needed to check my lists for matching page names.
I hacked together a Python script that checked for duplicate page names. The script reads a text file containing Confluence space keys and page names, and reports on duplicate page names. My first script used nested lists to store and compare the page names. A kind Atlassian developer reviewed the script and suggested I use a dictionary instead. So I did. A dictionary stores data in key-value pairs. Much neater!
Then I thought: Some people may not have their page names in a handy text file. They may want to get a list of all pages in a Confluence space. So I wrote a script to get the names of all pages in a given set of Confluence spaces.
The details of the scripts are in this post: How to find duplicate page names across Confluence spaces.
A script to get the source code of all pages in a Confluence space, for a full-text search
The search functionality in the Confluence web interface will return results from the visible content of the page, but it cannot get inside the XML-like elements that make up the Confluence storage format. For example, it’s not possible to find all pages that reference a certain image. And you can’t search for macro parameter values. This means, for example, you can’t search for all pages that include content from a given page.
Just recently I wrote a script that gets the XML storage format of all pages in a given Confluence space, and puts the code into text files on your local machine. Then you can use a powerful full-text search like grep, to find what you need. The details are in this post: Confluence full-text search using Python and grep
More on the way
I’m currently writing a couple more Python scripts to solve another problem. I’ll blog about it when I’ve finished.
Resources
If you’re interesting in Python, here are some links you many find useful:
A chuckle, courtesy of the Python technical writers
From the Python documentation:
By the way, the language is named after the BBC show “Monty Python’s Flying Circus” and has nothing to do with reptiles. Making references to Monty Python skits in documentation is not only allowed, it is encouraged!
Probably not a python
Last week I was lucky enough to be in New Orleans in the USA. I went on a tour of the Honey Island swamp, and saw this snake coiled comfortably on a tree trunk. I’m not sure what type of snake it is. Maybe a Copperhead:
What do you use?
Do you often use Python or some other scripting tool to automate those pesky tasks your CMS can’t handle?
Confluence full-text search using Python and grep
The standard search in Confluence wiki searches the visible content of the page. It also offers keywords for some specific searches, such as macro names and page titles. But sometimes we need to find things that the search cannot find, because the content of the relevant XML elements is not indexed. This post offers a solution of sorts: Copy the XML storage format of your pages into text files on your local machine, then use a powerful search like grep to do the work.
Here are some examples of the problem:
- We may want to find all pages that reference a certain image, or other attachment. It’s easy enough to find the page(s) where the image is attached. But it’s not possible to find all pages that display a given image which is attached to another page.
- It’s possible to search for all occurrences of a macro name, using the
macroName:keyword in the search. But it’s not possible to search for parameter values. This means, for example, you can’t search for all pages that include content from a given page.
I’ve written a script to solve the problem, by downloading the storage format from Confluence onto your local machine, where you can use all sorts of powerful text searches. You’re welcome to use the script, with the proviso that it’s not perfect.
Python script: getConfluencePageContent
The script is in a repository on Bitbucket: https://bitbucket.org/sarahmaddox/confluence-full-text-search.
Note: To run the script successfully, you need access to Confluence, and the Confluence remote API must be enabled.
Installing Python
To run the script, you need to install Python. The scripts are designed for Python 3, not Python 2. There were fairly significant changes in Python 3.
- Download Python 3.2.3 or later: http://www.python.org/getit/
(I downloadedpython-3.2.3.amd64.msi, because I’m working on a 64-bit Windows machine.) - Run the installer to install Python on your computer.
(I left all the options at their default values.) - Add the location of your Python installation to your path variable in Windows:
- Go to ‘Start’ > ‘Control Panel’ > ‘System’ > ‘Advanced system settings’
- Click ‘Environment Variables’.
- In the ‘System variables’ section, select ‘Path’.
- Click ‘Edit’.
- Add the following to the end of the path, assuming that you installed Python in the default location:
;C:\Python32
- Click ‘OK’ three times.
- Open a command window and type ‘python’ to see if all is OK. You should see something like this:
Getting the script
Go to the Bitbucket repository and choose ‘Downloads’ > ‘Branches’, then download the zip file and unzip it into a directory on your computer.
Running the script to get the content of your pages
To use the getConfluencePageContent script:
- Enable the remote API (XML-RPC & SOAP) on your Confluence site.
- Open the
getConfluencePageContentscript in Python’s ‘IDLE’ GUI. (Right-click on the script and choose ‘Edit with IDLE’.) - Run the script from within IDLE. (Press F5.)
- The Python shell will open and prompt you for some information:
- Confluence URL – The base URL of your Confluence site. If the site uses SSL, enter ‘HTTPS’ instead of ‘HTTP’. For example:
https://my.confluence.com - Username – Confluence will use this username to access the pages. This username must have ‘view’ access to all the spaces and pages that you want to check.
- Password – The password for the above username.
- Space key – A Confluence space key. Case is not important – the match is not case-sensitive.
- Output directory name – The directory where the script should put its results. The script will create this directory. Make sure it does not yet exist.
- Confluence URL – The base URL of your Confluence site. If the site uses SSL, enter ‘HTTPS’ instead of ‘HTTP’. For example:
- Look for the output directory as a sibling of the directory that contains the
getConfluencePageContentscript. In other words, the output directory will appear in your file system at the same level as the script’s directory.
Output of the script
The Bitbucket repository contains an example of the output, based on the Demonstration space shipped with Confluence. See the outputexample directory in the repository. For example, this file contains the content of the page titled ‘Welcome to Confluence’.
The script gets the content of all pages in the given Confluence space. It puts the content of each page into a separate text file, in a given directory.
The script creates the output directory as a sibling of the directory that contains the getConfluencePageContent script. In other words, the output directory will appear in your file system at the same level as the script’s directory.
The file name is a combination of the page name and page ID. To prevent problems when creating the files, the script removes all non-alphanumeric characters from the file name. To ensure uniqueness, it appends the page ID to the page name when creating the file name.
The content is in the form of the Confluence storage format, which is a type of XML consisting of HTML with Confluence-specific elements. (Docs.)
The script also writes a line at the top of each file, containing the URL of the page, and marked with asterisks for easy grepping.
Notes:
- The script will show an error if the output directory already exists.
- If you see the following error message, you need to enable the remote API (XML-RPC & SOAP) on your Confluence site: xmlrpc.client.ProtocolError: <ProtocolError for localhost:8090/rpc/xmlrpc: 403 Forbidden>
Grep and winGrep
Now that you have the page content in text form, the world’s your oyster.
You can use the full power of text search tools. If you’re on UNIX, you’ll already know about grep.
If you’re on Windows, let me introduce grepWin. It’s a free, powerful search tool that you can install on Windows. It offers regular expression (regexp) searches as well as standard searches, and it has a very nice UI (user interface).
This screenshot shows a search for an image called ‘step-2-image-1-confluence-demo-space.png’. The image is attached to one page, and referenced in two pages. QED.
Comments welcome!
I’d love to know if you think you’ll find the script useful, and if you have any ideas for improving it.









