The Dyslexic Programmer

I am dyslexic, and these are my experiences.  They certainly won’t be universal, especially as there isn’t just one form of dyslexia [0].  To identify my strain of dyslexia, I read quite quickly (though only somewhat accurately) through pure pattern-recognition. I can look at, say, "word" and identify that the second letter is an ‘o’, but if I want to understand it as a concept I ignore the letters involved all together [1].  Essentially, I’ve memorized how each word in the English language looks as a complete entity. (I also, thankfully, have an excellent conceptual memory.) This approach, of knowing something is made up of individual parts but not needing to worry about what specifically those parts are unless absolutely necessary, extends to how I approach math, history, social sciences and fantasy world-building as well. 

I believe that this tendency to generalization is why I am able to jump between levels of abstraction quite easily.  The concept of emergence, and the specific cases of recursion and polymorphism, are obvious to me.  Everything in the universe is made up of component parts, interacting in ways that give rise to the meta-phenomenon we observe, like “matter” and “consciousness”, and I can keep that in mind without worrying particularly about what those components are.  It is odd to me when people consider things to be discrete, isolated wholes; it can be useful to talk about them that way, but I usually don’t actually believe it.

Programming at any scale beyond scripting involves building systems of components that interact to produce the desired outcome, so this conceptualization is handy.  Even more applicably, debugging issues is the skill of diving into only those component parts that might possibly be causing the observed undesirable behavior.  I’ll see a problem and know that somewhere there is an errant IF-statement, and can accurately guess the path or two it might be down.  (The exceptions are when people break my assumptions, like yesterday’s bug caused by an untyped, string-identified property in the global context, but since people shouldn’t do those things anyway it’s usually not a problem.)

So what are the problems?

My dyslexia means that the most important thing for me about a language is the tool support, which often rules out new, hip languages.  It took me a while to figure out that my dyslexia was the reason I and the command-line centric programmers would never agree.  I've face prejudice against non-text-editor programmers, but often only until the first time they watch me debug something in my head.  We all have our strengths ;-)

IDEs mean I don’t have to worry about misspellings or obvious syntactic errors and syntax-highlighting is invaluable.  It’s even better when books use it too: the easiest textbooks for me to read were the computer science books with syntax-highlighting.  Unfortunately, this was not most of them.  Code can also often be represented visually: I highly recommend the HeadFirst series in particular [2].  This means that learning independently from books isn’t based on the ability to parse large blocks of prose [3], like it is in many other fields.  For obvious reasons, I strongly prefer the object-oriented paradigm for large programs, though I've also gotten into aspect-oriented JavaScript, supported by Chrome's developer tools.

The hardest thing has been learning to communicate my understandings to other people.  Things that work for me, like sitting down and reading a book of design patterns from front to back, simply don’t have the same effect for others.  Most people remember less of the code base than I do, and lack my multi-dimensional mental model of our class hierarchy.  My visual diagrams frequently contain information encoded in ways that are easy for me to understand and far less useful to others.  It is hard to explain my intuitive, aesthetic sense of good code, such as when polymorphism would simplify a method.  The heuristics I can substitute are incomplete, flawed reflections of the generative principles that motivate them and people who like rules tend to reject them when they can think of counter-examples.  I rely on metaphor and examples a lot, because they have proven more effective at translating my thoughts into something other people can understand.

On the other hand, because I could never take communication for granted I believe I have become better at code switching and figuring out why I am failing to communicate.  When feedback is available, I can debug conversations by spotting mis-matched assumptions or misunderstood statements and correcting them.  This works less well in writing, obviously [4].  I have also found that programming talks lend themselves exceptionally well to visual communicators.  I enjoy crafting a talk that grows a concept and bringing an audience along through the story.  This has led me to interesting conferences, where I can refine my ideas and meet all sorts of people.  Software development is an exceptionally social discipline and programmers have more resources to gather together and share our craft.

And the advantages?

Obviously, it is entirely possible to be a good programmer and be dyslexic. I would go further, though: I believe that in some ways dyslexia makes me a better programmer.

The greatest strength of the dyslexic programmer is that if it is possible for syntax to be confusing, I will almost certainly confuse it.  This is useful because so would almost everyone else, eventually.  Most people have used > when they meant < at least once.  Language constructs like meaningful whitespace or a lack of parentheses to delineate scope have caused major bugs, including the recent SSL vulnerability in OSX; they also make it almost impossible for me to comprehend code.  I can never ever rely on numbers (they all mostly look the same), so I use readable constants instead.  When I write Java Comparators, for example, I’ll have them return FIRST_GREATER, BOTH_EQUAL or SECOND_GREATER.  Ordering is nearly useless and flag arguments incomprehensible.  If I call the method twice it’s likely going to be faster to create a new object than do the extra work to ensure two arguments of the same type aren't flipped.

It's really about incentives: I’m less likely to tolerate ambiguities because I will mess them up constantly, instead of once in a blue moon when it may really matter and is less likely to be caught.  I support coding styles, static analysis and languages choices that don’t allow anyone to make careless mistakes, reducing overall bugs [5].  They may catch errors in some near-perfect programmer’s code once every 100,000 lines instead of once every 1,000, but those are still bugs that have been prevented and were completely unnecessary.

I am also forced to design.  I don’t get to write 500 line methods, because I get lost the first time a method swaps abstraction levels.  I think secretly many people do: they just have a higher tolerance, whereas I’ll get knocked off-task and forget what I was trying to do in the first place until I extract a method or object.  In order to write the fast, hacky approach I will often get halfway to a well-designed solution just in figuring out the problem: I may then go with the hacky quick-fix, but I’ll also remember how the code should look the next time I come back.

What has programming done for me?

Programming has been great for me, and would have been useful even if I didn’t pursue a career in software development.

Thanks to our tools, programming is a training ground with instant feedback.  The easiest example isn’t programming-specific: spellcheck taught me to spell.  First, it means as I write I don’t worry about whether I’m spelling something creatively.  I can always fix it later, which keeps my cognitive load down and lets me focus on getting things done.  Second, when I misspell a word it is immediately underlined in red.  Over time I’ve even learned the pattern of keystrokes that keep the little red squiggle from appearing, much the same way I know Kilik's leg sweep in Soul Caliber.  Now I can type many words correctly most of the time, without even once having to think about letters at all. 

Similar dynamics work with programming languages in a good IDE.  I am told instantly if I left off a semicolon or mismatched brackets or misspelled a function name.  All I need to have at my fingertips are the concepts, metaphors and design: the fiddly symbols come from my tools.  Even without an IDE, compilers and unit tests both helpfully tell me when I’m wrong.  The more often I can make mistakes the more likely I am to learn not to.  It is okay to be wrong about the things I am often wrong about when I program, because I have automated mitigation strategies.

Finally, programming provides positive, incremental feedback for writing and engaging with creative language.  This was especially useful when I was starting out and is why I think programming may be great for dyslexic kids.  “I want to make this box red” is a clear, direction, actionable goal in a way that “write in your journal for five minutes” isn’t. It also didn’t matter if it took me five tries to get it right, because each time I would get useful responses that got me closer to success.  Each time I wrote something that didn’t work, I was still writing.  Compare this to composing a paper, where there is no feedback at all and editing cycles tend to be much longer.  Even with an outline, if a sentence didn’t make sense I’d just get lost in the paragraph.  In a program, you can always hit “run” and see what happens, or write it the obviously wrong way and improve from there.

Conclusion

I will probably never be as fast a programmer as I would be if I were not dyslexic, but the other great thing about programming is that a wide variety of coders are plenty good enough to be employable and speed is only one small component of our productivity.  I have been able to build on my strengths and mitigate my weaknesses to develop a successful and rewarding career.  When I tell people what I build, I get to hear “I love that site!”

And the greatest challenge?  The biggest issues [6] all involve dealing with arrogant procedurally-minded programmers who continually over-generalize their experience [7].  Also, a word to the wise: you really never want me setting up the build system.

[0]  There is not consensus that I know of on this point among experts, but I am pretty certain that there are.  I have met other dyslexic folks who are very similar to me and other’s whose challenges are completely different.

[1]  The neuropsychological test for this is something like “name as many animals as you can in 30 seconds who live in a jungle” and then “name as many animals as you can in 30 seconds that start with the letter C” and comparing how many are recalled in each condition.

[2] Of course, this does not mean all visual representations serve this purpose. For example, UML lacks the artsy visual features that make such diagrams super-useful to me: standardization is a great way to defeat the usefulness of drawings.  I recommend getting at least three people involved in creating any visual representation that is expected to communicate to other people.

[3] The Cartoon Guide To Design Patterns is on my list of books to write someday.

[4] Especially when writing partially to figure things out myself; I don’t think in language that effectively communicates on the page.  Which is why I use footnotes in almost everything I write: they are a way to express things I want to include, but most people would find distracting from the linear-ish narrative.  Jokes serve a similar purpose during my talks.

[5] Many programmers are deeply invested in a privileged insistence on a freedom to be stupid, destructive or terrible coders, but who wants to work with them anyway?  When faced with pushback, I now point people to The Checklist Manifesto and it’s discussion of different types of complexity.

[6] At least, the biggest issue specific to being dyslexic.  The profession has other serious problems, including prevalent racism, sexism, poor management, harassment, exploitation of passion and distain for work-life balance that affect people regardless of neurodiversity.

[7] Even though a bunch of them will choke up the moment you ask them to handle CSS, unit test or employ polymorphism.  But of course, anything that isn’t easy for them is obviously stupid, badly designed or not worth doing; we should be using Haskell instead.  Anyway, don’t mind me, I’m only extremely bitter ;-)

25 responses
My fiancé is dyslexic and dropped out of his computer science degree a decade ago. Frustrations with C syntax (oh boy, do I know those...if it goes in a * does it come out a &?) and "well there are lots of ways to write that" are things he cited as issues. I told him he'd hate Perl, but maybe a more opinionated language would work for him. I need to show him this post. He hates command line stuff too, even with tab complete as an option, and has also got correct spellings into typing muscle memory.
I love the metaphor of debugging a failed communication. That's an important skill a lot of people don't realize is a skill.
Dyslexia is the remaining disability you are allowed to make fun of and discriminate against. I once applied for a job at a company called Rentrak. On the application they actually had a link to my website and said they use it as their process definition! My initial response to their programming test was well recieved, but then I had to write code in front of them using a shared terminal. As soon as they noticed I was dyslexic the session was stopped and I was told I would not get the job. It is still okay to not hire someone with dyslexia.
Hi Beth-Thanks for sharing this. Have 12 year old dyslexic daughter who spends most of her time on the computer doing this and that... a lot of minecraft. She is a natural at complex math but struggles to remember simple math facts...so mind boggling. I had to fight to get her out of a low level math class. Now she kicks everyone's butt in the advanced class. Your method of reading is really interesting. Nice for her to have role models like you out there willing to post experiences. I worry a lot abut her future but I do think dyslexia in many ways is a gift.
Kytt, I was exactly that way. I was barely able to pass grades 1-7. At grade 3 my teacher pinned a note to my coat saying I was a moron and should be kept at home. But when I got to 8 I brought home a report card with all As. Back then up to grade 8 was all about rembering things, then everything becomes abstract thinking. For me organiztion was so important. I just couldn't be sloppy like everyone else. I needed to write down everything I learned and organize the whole into something I could search. Now I use www.evernote.com and it is fabulous. Another thing I found useful was doing all the homework twice. Once slowly to look up things I had forgotten, then again fast to help me rember the important things.
Just wait until you start having difficulties with sleep....I have a sneaking suspicion you are going to learn exactly how you brain functions as it learns...think of sleep and dreams as the process of assigning new information into the appropriate filing cabinet in your brain...I find when something just doesn't hang together at a very detailed and intimate level, my brain continually cycles through the process of attempting to classify and resolve the disconnect...other than I'm not a coder, but a solution designer...I could have written what you wrote...and thank you for helping me with the my number epiphany...I used to be an accountant, until the numbers ate me alive...I needed to work in the world of relationships and problem solving...
As a non-dyslexic person, I'd love to read The Cartoon Guide To Design Patterns. Please write it for me!
I don't believe I am Dyslexic, but I found myself identifying with many of the things you described in this post. You've made me think. Thank you for that.
Another dyslexic here :) One thing I found amazing about having this is, some algorithms are almost impossible for me to understand while everyone else seems to get them at first try, on the other hand a lot of times stuff that seems extremely complex to everyone seems very clear to me. And Kytt, best trick I learnt as a kid was using a ruler while reading. I always select the line while I am reading something in the computer, it is life changing! Great article, will read it again later :)
Excellent post. What is your favorite IDE (most suitable for dyslexic programmer)?
Loved your article and your writing style. I think it's really cool how dyslexia has made you a better programmer. I am wondering about your reference to Haskell in [7]. Do you program in Haskell? Do you like it? I am guessing that Haskell would be less useful for you because, to my knowledge, there are not many good IDE's for Haskell. On the other hand, maybe it fits your abstract style of thinking.
Great read, knew I was not alone, although not the same my process is similar in many respects. I absolutely love tools like Visual Studio and PyCharm, intellisense (code completion) was a game changer for me. I believe I have a little atttention deficit sprinkled in which always makes it fun when I have to do show and tell or train people. Duarte the ruler trick is a great tip. When I was younger I had a laminated piece of construction paper with a slim rectangular hole cut in it (just enough to show a single line in a book), I had a tendancy to jump back up in addtion to skipping lines althogether.
thank you for this. I have an 8 year old son that has dyslexia and based on what I now know, I think I have some form too. the part of being able to debug conversations I recognise and is a great insight in myself. Thank you
Hi beth having been able to spoof my way through life and getting qualifications in telecommunications up to CCNP and other such education levels. i can't program as syntax issues stop me writting a program. being dyslexic has been the problem, i don't read fast and have no problem understanding the ideas. how ever syntax time after time seems to be the issue. can find no explanation about the space between statements and intergers etc.
11 visitors upvoted this post.