Note: This file has moved to notablog.


A friend asked me:
> Interesting. I am at a similar crossroads in my career in that
> programming is becoming more and more attractive as my job duties
> become more and more technical. How did the transition go for you?
 
     It's certainly a possible career option.  I know far more
failed-tech-writer-turned-programmer than vice versa, including
myself.  There are a lot of "ifs" to the situation, however, including
your character, drives, needs, the kinds of languages you're thinking
about getting into, what kind of foundation you already have, etc.
  
     There are a few general things I can say.  This is all, of
course, based on my limited knowledge of and exposure to the field.
First, go read my map of the
career field.  I'm going to make broad, sweeping generalizations
and strong, declarative statements, because otherwise I'll be here all
night and this document will be four times longer and much less fun to
read.  Take it all with a grain of salt.

     First, before you get discouraged, not too long ago I came across
a statistic saying that only 1 in 5 working programmers actually has a
degree in a programming discipline.  The programming field needs all
kinds of knowledge and all kinds of individuals.  So take heart.

Systematic Knowledge vs. Idiosyncratic Knowledge

     Something I've noticed is that there seems to be two kinds of
expertise, and people seem to tend to have a mind that works for
either one or the other.  I'll call the two type systematic and
idiosyncratic.

     Systematic knowledge is knowledge about a topic that has an
underlying structure, knowledge that follows a pattern.  Not only does
a given topic area have its own pattern, but the patterns themselves
have similarities between topic areas.  System programming languages,
for example, often have such structural similarities.  If your mind
clicks with systematic knowledge, then as you recognize the structure
of the topic you're studying, like pieces of a puzzle coming together,
you'll start to "get" the topic and find learning more and more about
it becomes faster and easier.  

     Also, as you go from one topic to another, common structures will
help you acquire a new topic faster.  A really good programmer can
learn much, if not most, of a structurally similar programming
language in an amazingly short time.  It's going to be in tackling
radically different languages (like a procedural language vs. an
object-oriented language vs. a functional language) that you'll hit
the major speed bumps.  Consequently, really good programmers tend to
like to seek out such new experiences, to broaden their arsenal.

     Idiosyncratic knowledge, on the other hand, has lots of special
cases and exceptions.  It doesn't follow a pattern as much.  There is
structure, but it's nowhere near clear or elegant.  The real world
isn't often clean or elegant.  The original name I was using for this
type of knowledge was automobile-repair type knowledge.  Car repair
and car parts are a good example of this sort of thing.  The topic is
loaded with little "gotchas" and tidbits of important knowledge.  If
you have a mind that likes to master this sort of thing, then you may
find there are several lucrative specialty areas of the technology
industry that you'll be well-suited to.

     Personally, I consider personal computers and Microsoft Windows
products to be a prime example of idiosyncratic knowledge.  Why this
is, I won't speculate here :-).  I also consider many 4GLs ("4th
Generation Language", a phrase usually only used by people who work
with them a lot and by marketing droids) to be extremely
idiosyncratic, usually because they weren't so much designed as
accreted, influenced by marketing and sales imperatives to add this
feature or that buzzword, or often by the need to support a wide
variety of legacy systems.

     However, I suspect you could also make a strong case that a lot
of Unix system adminstration details qualify as idiosyncratic
knowledge.


Domain Knowledge vs. Discipline Knowledge

     Programming is pretty much always about trying to build a
working, electronic model of something.  The model is usually of
something that exists at least partially in the real world (though
often that real world existence is mostly a political or economic
fiction).

     Discipline knowledge is the knowledge of programming, system
design, etc, I've been referring to all along.  Most working
programmers also need to have (or over the course of a specific
project acquire) some degree of domain knowledge as well.  Domain
knowledge is knowledge of a particular subject or topic related to the
model.  As an example, consider a programmer working on an accounting
package.  He or she has to understand bookkeeping and other standard
accounting practices in order to implement a proper model of them.

     Domain knowledge also comes in more than one flavor: technology
domain and business domain.  The technology domain knowledge is
knowledge about a specific domain (for example, java technology as
opposed to object-oriented programming knowledge).  The business
domain is knowledge about a specific business, industry, profession,
etc.

     In general, I feel a programmer's discipline knowledge is (or
should be) much more important to his or her career than their domain
knowledge, but then again there are a great many people out there who
aren't looking for the same things I'm looking for in a career.
They're quite happy in taking advantage of their domain knowledge and
leveraging it to enhance their career.  Certainly it's a quite useful
tactic if you're just getting into programming.  However, just as a
technical writer is more than a glorified typist, a programmer is not
the sum of the programming languages and development environments he
or she has worked with.  Programmers deal with many of the same issues
that technical writers deal with, in this regard (being typecast due
to previous experience).

Your Challenges

     I started writing this to answer a question from a technical
writer I know (since I used to be a technical writer and now I'm paid
to program).  

Computer Theory 

     Depending on where you want to go in your programming career, I
suspect you're going to find lack of computer theory knowledge to be a
constant issue.  Most Computer Science graduates have long forgotten
most of their theory, but there are still fundamental concepts that
they had drilled into them, things they take for granted, that I need
to learn.  This becomes particularly evident because of one of my
strengths as a technical writer - the fact that I'm good at
researching new areas.  I tend to dive in head first, and sometimes
that flat out just doesn't work, because I'm not just tackling new
details, but fundmentally new (to me) concepts and theory.

Right-Brain Thinking

     I am firmly convinced that certain kinds of programming languages
and certain kinds of programming activity are extremely right-brain.
I'm thinking mostly and particularly about system programming
languages and object-oriented languages.  

     This is not to say that the programmers who specialize in them
are all creative, artistic souls.  Indeed, hand in hand with that
right-brain, geometric-problem-solving type of activity comes a need
for excruciating attention to detail and constant analysis.  This,
needless to say, is not easy, particularly if, like most writers, you
have strong left-brain analytical and language skills.  It can be very
difficult to develop and sustain that "hack mode" focus.

     I have to emphasize that this is not the same as concentration,
although concentration helps.  A friend once described it as an almost
autistic state of mind.  Certainly, everybody has moments of this
state of mind, but certain kinds of programmers have to spend solid
hours every day, most of the day, in this state of mind.  I find it
very enervating.

     I also find it quite annoying, in that it destroys my ability to
be coherent and detail-focused.  When I'm interrupted in this state of
mind, I find it difficult to form coherent sentences.  After a day of
being in this state of mind, I have trouble focusing on the mundane
details of my life, figuring the various things that need done and how
to go about doing them.  While I find the mind state itself somewhat
thrilling, I quite dislike the resulting effects on me.  I like being
who I am, and I like being able to be coherent and competent in
everyday situations.
     

Your Advantages

     As a technical writer, much of what you do on a daily basis is
not about writing, per se, but about the things you do to support your
writing.  Surprise, surprise, that's true for programming as well.
It's especially true in certain niches in the programming career
field.  Some of your "tech writer" skills will give you strong
advantages, particularly when you're using them in jobs that have a
strong focus on programming to solve business problems.

Communicating Complicated Technology

     As a technical writer (emphasize the word "technical" here") a
big part of your job is to communicate complicated technology
knowledge to non-technical people.  As a programmer in a business
context, you can put these talents to good use going in the opposite
direction.  Your job will be to take a business situation and
translate that into a technology context, and come up with ways to use
technology to improve the situation.  Unless you happen to be a master
of the business context at hand (the domain knowledge), this process
is going to be more of a dialog with the non-technical business users.

     You'll also have a strong need to communicate the technological
issues back to the business users.  There's a balancing act that goes
on here.  On the one hand, most of the time, the business users don't
even know where the ballpark is, let along where they are in it.  You
need to provide them with enough orientation that they can make
business strategy decisions based on your investigation of technical
issues.  You have to do it concisely, and you have to do it as
non-technically as possible.

     However, on the flip side, far too often, the technologist
responds to a question of "what should we do?" with a description of
the pros and cons and the alternative strategies that can be used...
and the business users' eyes glaze over because they don't really need
more details to worry about, they just want this problem to go away
(either because they lack the brainpower to deal with it, or much more
likely, they have plenty of details to deal with already - see my comments
about right-brain thinking, above).

     The business users will want the response to address the
situation in a language they can understand, and they'll want any
decisions that they need to make to be phrased in a business context.
For example, "there are a couple of alternatives.  To decide which one
is best, I need to ask you to set some priorities..."

Document Production

     On a more cynical note, in quite a few business situations, your
ability to churn out written documents will come in handy.  Since much
of the work you'll be doing as a technologist will be skull work,
written documents, overviews, system diagrams and plans of attack can
often be extremely useful in a political sense.  Since a lot of time
goes by while you investigate, research, and contemplate, it can be
quite difficult for the business user to get a sense that anything is
going on.  By producing written works that summarize your skull work to
date, you both inform the business user (in the rare event that they
read it) and you reassure them that you are, indeed, making progress.

     In rare situations, your ability to write clearly and to
communicate will actually be a boon.  As writers we often forget just
how poorly written most documents are.  One thing not to underestimate
is the power of a diagram to illuminate a complicated technical point
to a business user.  Obviously there's a balancing act, but diagrams
can help make the abstract seem quite concrete.

     In situations where you're working with a team of programmers,
written documents can also be crucial in creating a common context,
making sure everyone is on the same page.  There are some classic
quotes in Fred Brooks' _The Mythical Man Month_ about written
documents having two crucial effects.  First, they require you to make
many little decisions that you've been putting off until now.  Not
that they're necessarily important decisions, but it's important that
they be made, and that they be made consistently.  Second, they
communicate explicitly the many things that various members of the
team assume are common knowledge.

Research 

     As a writer, and as a technical writer, some of our strongest
skills are in research.  We tackle new topic areas and absorb them
quickly.  We know how to learn, we know how to ask the right questions
and we know how to record and remember the answers.  This has positive
implications both in career development, and on specific jobs.

     In career development, you'll probably find an endless wealth of
information about your new career.  You'll never want for something
new to learn.  This is really one of the most daunting things about
programming, particularly if you choose a career path that takes you
into the more general programming fields.  Programming is used for
damn near everything these days, which means there's a ton of special
knowledge for any given technology domain, as well as any given
business domain.  

     Java is one of the better examples for this, I think, probably
due to the fact that Sun is trying to jumpstart the java industry by
tackling the many different sub-industries that have evolved to suport
various technology domains in C/C++ (and to some degree Smalltalk)
over the past twenty or more years.  As a result, java has many, many
different class library API reference implementations - areas where
Sun has laid out the foundation for further work by other people in
the industry, and provided both a standard for interfacing with tools
to support those areas, and a "reference implementation" as a good
working example of how to build those tools.

     In addition, most programmers have to do some amount of business
domain research, frequently, to inform and shape their software
projects.  As a technical writer, you'll probably be more effective at
walking into completely new situations and getting a grip on it.

     Finally, in many very large business contexts, the "journalistic"
side of your technical writing experience will come in quite handy.
Many very large corporations have very muddled organizations and
little to know formal investigation and tracking of their knowledge
assets - they don't know who knows what, and they've often forgotten
how to figure it out.  

Two anecdotal examples:

     At one organization, the question came up of how to get some data
from a mainframe system out into a Unix system.  I was probably the
only guy in the room who did NOT have significant mainframe
experience.  However, the other folks in the room just kind of shrugged. 

     So I asked, "Well, who knows about ?"

     "Bob does." 

     "Okay, I'll follow up on this with Bob."

     After the meeting, I track down Bob and ask him how to get the
data out.  He says, "Well, I think Linda knows about that data."

     I track down Linda and ask her about it, she keys in a few
commands in the mainframe application she uses and shows me a listing
on screen.  "Do you want me to print this?"

     Since it's several thousand rows of a database table, I don't
really want it printed, I want it on disk, so I don't have to type it
in.  

     Linda says, "I don't know how I'd do that."

     "Well, who would know?"

     "Maybe Ed."

     So I track down Ed, and I ask him how to do it.  

     Ed says, "Well, the first step would be to get it out of the
table and (tech tech tech tech)."

     "Okay, how do we do that?" 

     "What region is it in?"  

     I run back to Linda and get her to write that down, and bring it
back to Ed.  Ed checks and says yeah, he could dump that out for me.

     "And how would I get this onto a floppy disk?"

     "Alan might know that."

     So I track down Alan and ask him, show him the identifying
information, and ask him if he could get it out to disk.  Success!  He
can indeed put it on a disk for me, if I'll ask Ed to dump it out
first.  I do so, Ed does so, Alan does so, and I go back to my boss
with the data safely in the Unix system where we need it.  All at the
cost of 30 minutes of walking around and talking to people, and asking
the obvious questions.

Second Example:

     At another organization we put together a set of web pages, forms
and scripts to allow potential customers to apply for a service.  One
problem - what do we do with the application?  How do we get it into
the system so it can be processed?  Well, of course the system the web
site was running on was a Sun Solaris (a flavor of unix) server.  The
system the appliction processing was done on was a mainframe with
3270-style terminals.

     So three of us are standing there, talking about this, and the
question comes up: how do we get the applications into the system?

     Blank stares from the other two (highly intelligent, generally
skilled and not technically incompetent) people.  

     Finally, I hesitantly ask: "Well... how do we get the
applications in now?"

     "I think the call center ships a magnetic tape out every week."

     "Okay, then let's see if we can do the same."

     A quick phone call later we learn that in fact, all of the calls
are routed to the call center in another state, which is located in
the same building as the mainframe.  The call center employees then
manually key the data in on terminals connected directly to the
mainframe.

     Again, blank stares.

     "Well... do we take over-the-counter applications?"

     "Yes."

     "And those are written on paper?"

     "Yes."

     "How do those get into the system?"

     A quick phone call later, "We fax them to the call center."

     Well, it's painful, but I have to admit that we eventually set up
a system that took the application data from the web page forms and
generated a fax to the call center, as a short-term solution while we
set up a more complicated system.

And the moral of the story...

     The point of these stories is that technical writers get used to
having to find a way to what we need.  We get used to assuming that
there is an answer, but we just don't know it, and we get used to
asking questions until we have an answer.  The people I was working
with were smart and competent, but they weren't used to having to go
around problems instead of through them.


Project Management

     Technical writers are usually used to bearing the primary
responsibility for managing their own projects, and they're used to
usually being the sole writer on a team (or sometimes in a
department!).  As a result, tech writers tend to develop good project
management skills.  These skills can often be further developed to
general project management.  There are many gotchas to worry about
here - software projects are the very personification of the
difficult-to-manage project.  But in general, technical writers will
have an edge in the project management area, and should develop and
extend this edge as much as possible.

     Much of JoAnn Hackos' _Managing Your Documentation Process_ is
based on or informed by project management research done by the
Software Engineering Institute (SEI).  If you've read her book, that's
a good start.  I'd also generally recommend getting and reading other
documents on the topic, both from the SEI website and by subscribing
to the _Communications of the ACM_ and _IEE Software Development_.
You should also check out Steve McConnell's books, _Code Complete_ and
_Rapid Development_ (McConnell's personal web page is at
http://www.construx.com/stevemcc/).

     Having said all of the above, I must again caution the technical
writer against being too confident in your project estimating
abilities.  As I mention above, programming is about building a model
of something in the real world.  The problem is, the real world is
vast and complex, ever-changing on both the micro and macro levels, at
varying rates.  Equally our understanding of the real world is
ever-changing.  By the time a software project is complete it's
usually inaccurate, or irrelevant, or both.  Most often the project's
outcome is some traffic pile-up combination of good and bad, with
something eventually going out the door but not necessarily what the
end-user needs.  

     So what to do?  My best advice is to avoid having to be
responsible for the bottom-line committment, at least until you have
more experience under your belt.  Ideally you should use your skills to
help facilitate a more experienced project leader's project planning,
and learn from him or her in the process.  Very often, where novice
programmers get into trouble with schedules it's because their initial
assumptions were incorrect, or because their superiors (often
non-technical superiors) change the base assumptions on them.  Often
the novice gets pressured into making tenative committments based on
tenative assessments of problems and risks, and as soon as they're
made, the non-technical superior nails them down and assumes they're
set in concrete.  

     One thing I've noticed is that nobody ever remembers the
qualifications, everybody always remembers the due date.  One tactic,
nice when it's feasible, is to do an initial functioning prototype
before giving a schedule committment.  By that point, ideally, all of
the unknowns are explored and what remains is mostly tactical work,
things that are extremely predictable.  But be careful, prototyping
quite often leads to the business superior deciding to deploy the
prototype instead of waiting for the finished product.

     If you have to take the point on the project plan, my advice is
to avoid big committments to a bottom line.  Instead provide a very
well-fleshed out project plan and schedule.  Keep it constantly up to
date, on a daily basis, and reissue it, pointing out where changes
have changed the projected project completion date.  Use that as a
basis for discussing whether the date should be changed or some
element of the project should be put off.  Be extremely careful about
letting the business user lead you into situations where they demand
you re-estimate some of your estimates downward to allow you to keep
the original due date.

     There are a ton of software project methodologies to deal with
this problem.  One of the approaches I like best is Extreme
Programming, a lightweight approach to the problem.  You can get
the basics on it at: 

     http://www.c2.com/cgi/wiki?ExtremeProgrammingRoadmap

     By the way, the rest of the c2.com/wiki site is excellent
reading, although a lot of the stuff they discuss is extremely deep
and easier to find relevant to Object-Oriented development situations.
I've been reading it off and on for the past two or three years.  I
was only lukewarm to it at first, but as time has gone by and I've
learned more about the general topic and internalized more of what's
discussed on the site, I've become more impressed with what the folks
at c2.com/wiki have to say.

--------------------------------------------------