Ask HN: How should a programming language accommodate disabled programmers?

173 points by evincarofautumn ↗ HN
I work on programming languages (as a career & hobby) and I’d like to make sure that my main language project is designed with accessibility in mind. I need some guidance & opinions from people with disabilities (e.g., blind or visually impaired people, or people with mobility issues) about your pain points with existing tools.

This doesn’t need to be just about the language itself, but the whole experience of developing with it, e.g., tooling, error messages, documentation, editor integration, &c.; as simple as “Avoid making me press Shift” or as involved as specific problems with existing tools and what you wish they did better. I’d also welcome examples of tools that do things particularly well!

So far I’ve had/implemented a few general ideas:

1. Making whitespace-sensitive syntax, like in Python & Haskell, optional syntactic sugar for explicit brackets & separators. It can also be turned off entirely, if e.g. you work with a screenreader and prefer it not need to speak all the indentation.

2. Striking a balance between concision and avoiding excessive punctuation-based syntax. I’ve also tried to make sure that visually similar characters have clearly distinct functions, so it’s less likely to mix them up—or if they are typo’d, at least the compiler should reliably detect this and produce a useful diagnostic.

3. Working on integration with existing editors (through the Language Server Protocol, an Emacs mode, &c.), so ideally you can continue to use the editor you’re comfortable with that supports your setup.

4. Allowing the interactive mode (sort of a souped-up REPL) to be customised to support screenreaders, colour settings for colourblind people, adapting gracefully to large fonts, and so on.

I’m certain there are plenty of things I’m still missing, though! So I’d really appreciate any help, personal stories, or links to the work of similar initiatives (like Accessible Scala) that you can offer. Thank you!

121 comments

[ 3.9 ms ] story [ 177 ms ] thread
> Making whitespace-sensitive syntax, like in Python & Haskell, optional syntactic sugar for explicit brackets & separators.

Interesting question. A few years ago, I worked with a blind mathematician. I was an undergraduate T.A. and he was the main T.A. of the course. He used the screen reader a lot. In particular, he has the list of exercise in LaTeX. We read aloud the grades of the students and he wrote them in the Excel form.

I don't remember him using a programming language (excluding LaTeX). The indentation looks like a difficult problem, even if the language has explicit brackets. Does the screen reader say "Tab Tab print ten semicolon"? Does it ignore the indentation? Spaces vs tabs? ...

Do you have some group of blind programmers that you can ask about their current setup?

I wonder if it would be helpful to describe the indentation level you are on:

e.g:

  def method_here(value): # Indentation level 0
    x = 10 # Level 1
    y = 5  # Level 1
    if x == value # Level 1
      print 'x!' # Level 2
    elif y == value # Level 1
      print 'y!' # Level 2
You could maybe even throw in a block number so it's clearer.
Not knowledgable about screen readers, but maybe having the increase in indentation result in an increase in pitch of the screen reader voice could be an interesting approach for this.
You beat me to this idea by five minutes!

Another bonus to this approach is that it enforces a style guide. Overly complicated and nested programs become more difficult to understand, and excessive nesting becomes literally incomprehensible as it spirals out of the human hearing range.

I wonder if you could also use different voices for different things. Code could be read in a masculine tone, code blocks in a feminine tone, inline strings with an Australian accent.

Have you looked into projectional-editing? The basic idea is that your code is stored not as text, but as data. The data is then projected into a textual format for editing.

That seems like the best way to support disabled programmers, as it gives them the flexibility to make whatever syntax works for them, as long as your core AST is simple enough.

I can attest to this: Paredit is as easy to use with eyes as it is without.
I'll be honest, I don't have any answers for you—but this is a really interesting question, and I'm looking forward to reading what other HN readers suggest.
Blind people already do programming. I know a blind guy who can code really fast, much faster than my colleagues, no idea how though.

Shouldn't you be researching how they code now and then work from there? I actually feel like current way of coding using text works very well for blind people.

This is a good point, but note blindness is just one of many disabilities.
I have arthritis and my hands had been affected a lot, I actually like it when the languages are more verbose. Because I can use "Procedural memory" and can be more automatic. My hands already know how to type those words. Symbols or short words force me into more conscious typing and/or move my fingers in a not familiar way.
I do rough accessibility testing with JAWS on my company website, before we get people in to give it a thorough going over.

I would suggest you try it yourself, and download JAWS and write out some simple Hello World and figure out the challenges you face and then get in touch with disabled programmers and advocates.

>Making whitespace-sensitive syntax, like in Python & Haskell, optional syntactic sugar for explicit brackets & separators.

That shouldn't matter with an IDE or plugin. If static analysis can identify the blocks -- and it has to! -- the screen reader can just read it as if it had your preferred block notation rather than noting the whitespace.

That's usually true but a lot of code in the middle of being edited isn't syntactically valid (a common special case is a file in the middle of a merge conflict). So you need some way of being able to accept any input and represent it usefully, even if you couldn't execute it.
Does that mean you need a screen reader that knows about whatever programming language you use?
You also need to read coding books, documentation examples and webpages, so having to use an IDE is not the best solution.
Seems like the real problem is the lack of interoperability between a special coding parser and arbitrary snippets of online code.
Just want to note that in Haskell, whitespace syntax _is_ syntactic sugar for brackets etc. I don't recall that being the case for python. Interesting tidbit, some of the big names in the Haskell community have very idiosyncratic coding styles that use the bracket look.
Can you point out an example or two the bracket style that I could take a look at? Thanks.
Simon Peyton-Jones is (was?) known for writing blocks in “aligned” instead of “hanging” style, with separators in prefix:

    someFunction =
      do { foo
         ; mx <- bar
         ; y <- case mx of { Just x -> do { baz
                                          ; pure (quux x)
                                          }
                           ; Nothing -> do { fnord
                                           ; blurch
                                           }
                           }
         ; xyzz y
         }
I find it nice enough to read, particularly because it leads to rapidly increasing indentation and consequently discourages deeply nested code, but it’s a bit of a pain to edit & diff. I would write the above like this:

    someFunction = do
      foo
      mx <- bar
      y <- case mx of
        Just x -> do
          baz
          pure (quux x)
        Nothing -> do
          fnord
          blurch
      xyzz y
This prefix delimiter style is actually fairly standard in Haskell not for “do” notation, but for records and lists, since Haskell doesn’t allow a final trailing comma in these structures:

    list :: [Text]
    list =
      [ "this"
      , "that"
      , "the other thing"
      ]

    data Numbers = Numbers
      { numI :: Int
      , numF :: Double
      , numS :: Text
      }

    record = Numbers
      { numI = 1
      , numF = 1.0
      , numS = "one"
      }
Right—that was a source of inspiration for this aspect of my language. The original stated motivation in Haskell’s case was to make it easier to generate Haskell source code without needing to worry about indentation, but I wondered if it could also be helpful for accessibility. (Sadly there’s no way to turn off layout-based syntax in Haskell, and not much interest in such an option last I asked on /r/haskell.)

Explicit delimiters also have an advantage for keyboard navigation, enabling some degree of structural (by-block) movement. I prefer not to use a mouse/trackpad if possible—my main editor is Emacs in a terminal—and I know some people who have trouble using pointing devices or just don’t like switching between keyboard & pointer.

Slightly off-topic: how do blind programmers read code? Does the screen reader recite it aloud and just say "int main left-paren void right-paren open-brace int i equals zero...", or does it use some other kind of auditory vocabulary to make it more meaningful to the listener?

I've been thinking about this alot lately because I've been wondering how I could get better at programming while driving on my daily commute.

> I've been wondering how I could get better at programming while driving on my daily commute.

Please don't do this. The last thing the world needs is another distracted driver.

How about a podcast about programming subjects? Would probably be more beneficial and less distracting than trying to write code while driving.
Tangentially related, I've been listening to The Blind Side, a podcast about technology made by a blind person. It's interesting to learn tricks that don't require vision to interact with tech.
The blind people I have known use a Braille display to work with a computer

https://en.wikipedia.org/wiki/Refreshable_braille_display

Braille’s somewhat dying off as screenreaders become more integrated into computer systems - a system reading to you (usually at 3x speed as well) has massively more information density than a Braille display, to the point that it’s becoming less usual to learn Braille in the first place.
Last I knew, Braille displays are also pretty expensive, slow, and prone to breakage. Cool idea, but doesn’t work as well as a screenreader in practice for most people.
The most extreme sport: programming the car you're in to self-drive, without being able to touch the steering wheel, next to the grand canyon.
Maybe we should train to code without screen: just a keyboard and a headset.
I think this is a very good idea. Several years ago, I learned how to browse the web with a keyboard and screen reader. Honestly, picking up that skill made me a noticeably better software developer. Prior to that experience, I had a vague idea about accessibility, but for the most part, it was just about checking a box when I was going for certain types of contracts. But, once I got into the screen reader flow, all of my formerly vague ideas became really solid concepts. I build much more accessible applications now because of this knowledge.
It is interesting that you're getting a lot of suggestions from people that don't claim to have disabilities. Perhaps few of them read hacker news?

It seems that their needs would vary. One thing you could do is try to an interface to test it yourself.

I tried to write and edit a document once using just voice commands. (Let's say someone has carpal tunnel and needs to use voice commands). It was eye opening. I realized how much more frustrating it is to go back and try to delete or fix something than anything else. And if the software didn't recognize an unusual word, it was really hard.

Dragon dictate -- the software I used -- had already learned a lot of this over the years, and there were many commands for changing that, or deleting up to a point. The hard part was moving the cursor to exactly one spot and then talking in a new word.

Anyway, if you tried something like that you would learn a lot.

Imagine if you are blind folded, and have to hear the program and then have to keep it all in memory. Well, that is a lot to keep in your working memory. I would want some kind of canonical "view" to always get to in order to find my way around.

I am glad you are working on this.

> I tried to write and edit a document once using just voice commands. (Let's say someone has carpal tunnel and needs to use voice commands). It was eye opening. I realized how much more frustrating it is to go back and try to delete or fix something than anything else. And if the software didn't recognize an unusual word, it was really hard.

I've tried that as well. It was very frustrating. I used the Windows speech-to-text features.

Programming code is made to be typed and read. If you can't do either of those reliably, you'll be simulating that you can, which sort of by definition can't work well, because if you could simulate being able to write well, then you wouldn't even call that a disability, you'd just be different.

What I'm getting at is that the problem is simulation. Ideally, there would be a way to program by voice (or with a mouse, etc). Not program by typing code with voice, but find a way to describe a program (i.e. program) via voice. A voice-centric toolkit. I hope I'm not being too vague.

What we have now is such a typing-centric development world that we don't even think about all the other possiblities. Isn't the modern laptop just a really fancy version of a 100 year old typewriter?

I think Bret Victor would have a lot to say about this [0].

[0] http://worrydream.com/#!/TheFutureOfProgramming

Programming is probably still annoying with even the best possible software support if you can't type but I'd imagine that dictating text could be comparably smooth if you had vi like voice commands.

"Go back 3 words and delete this word". "Replace the current word with 'foo'". "Select the current paragraph and move it down 1 paragraph".

Changing modes would likely be an issue. A safe word might not be the best solution. I guess a hardware button would be the best option.

Lisp:

- Avoids the use of gratuituous special characters: (a b c)

- use-dashes-in-symbol-names-instead-of-underline-so-its-easier-to-type (you can still use underlines or most any special character, but we like to keep it simple and easy).

- has a simple prefix syntax, that makes it easier to read and understand complex expressions: (loop (print (read (eval))) So no risk of confusing special characters or syntax: the meaning is clearly labelled by the first symbol of each expression!

- is not whitespace-sensitive, how can you see the size of whitespaces when you're blind?

- includes a reader and a pretty printer, so the code can be processed and formated automatically easily for either sighted or blind programmers.

- time-sharing was invented for the lisp REPL by the authors of lisp!

- as a good integration with emacs, which itself has a good integration with various tools such as screen readers, vocal commands, etc, and it's fully customizable.

http://cliki.net/ http://common-lisp.net/ https://en.wikipedia.org/wiki/Common_Lisp

> is not whitespace-sensitive, how can you see the size of whitespaces when you're blind?

Can't indentation be handled by the IDE as having a meaning like "root class declaration", "function declaration", "nested block 1", "nested block 2"? Indentation has meaning and meaning can be converted. Even Xcode seems to be context aware as I can choose where certain code block shortcuts can or can't be executed. "This is a function", "This is a class", "This is a function in a class", "This is the root level", "This is a block one deep inside a function inside a class".

If you are willing to restrict a programmer to only look at accessible renderings of the AST, then there is probably nothing to consider, but a programmer's job is also handling what happens when a program does not parse.
This. Very few language designers understand the usefulness of being able to parse the code while it is incomplete/being typed out.

You end up with “hacks” to color your code vs a real parser to compile the code.

My compiler is error-recovering for this reason: you can still get correct syntax-highlighting data even if there are lexical errors, type information even if there are type errors, and so on.
I think the places where it does use punctuation are a lot more friendly to people with low vision than most languages: you never use awkward combinations like '),' where it's easy for the comma to blend in with the bracket (the comma in ',(' stands out a lot more), you don't write things like 'if (!pred)' where the bang similarly blends in, etc. The general preference for descriptive names over punctuation for operators is really helpful, too, as it lets you rely much more on the basic shape of the word.
I love Lisp but every experienced lisper will tell you they don't see the parentheses, they look directly at the AST. Seeing the AST is, for me, highly visual (proper indentation is a must) and I wonder how a blind programmer could see that.
Blind people still have spatial reasoning.
They do, but their interface to the computer does not. Screen readers are inherently linear while a screen show two dimensions at once. Indentation is the primary way this happens in practice.

(I suppose it would not be impossible for a programming language to have 3d layout projected onto the 2d screen, but I'm not aware of any mainstream languages that do this. Significant whitespace is fairly common of course and nonsignificant indentation is more common still)

Good point. I imagine something like vim's "folding" feature could be used to interactively navigate source code with a screen reader by successively opening the folds of interest.
By using something like Paredit to navigate the source by list structure. Reading and navigating are kind of mixed together.
Well it seems that OP needn’t bother as this problem is already solved. You wrote (loop (print (eval (read)))). How does that go with a screen reader? Like:

Bracket loop bracket print bracket eval bracket read bracket bracket bracket bracket?

The key thing I think is balancing and shifting parens.

  (loop (print (eval)) (read))
Is quite hard to sound different from

  (loop (print (eval (read))))
And more crucially what about the difference between these two:

  (let ((x (f))) (g x) (g x))
  (let ((x (f)) (g x)) (g x))
(I think writing these on a single line makes them written more like they might be spoken)

On the other hand I think being able to modify the syntax structurally is a big advantage.

Going back to the topic of the OP I think a useful thing is putting functions after their arguments, and optimising to have single arguments or most non-main arguments being typically small. For example something more like

  read
  | eval
  | print
  | loop
And maybe some way to do arguments like

  read stdin 
  | eval some-environment 
  | print :pretty
  | loop
The language in question already has a dataflow/pipeline style by default, so expressions are generally read from left to right like this, except for some standard syntactic sugar like infix operators and flow control blocks like “if” and “match”:

    read eval print loop

    stdin read
    some_environment eval
    pretty print
    loop

    [1, 2, 3] [4, 5, 6] \(+) zip_with
    do (each_index) -> i, x {
      if (x = 7) {
        "Lucky seven!" say
      } else {
        ["Value at index ", i show, " is ", x show]
          concat say
      }
    }
”Bracket loop bracket print bracket…”

A screen reader need not literally read what’s on screen. It typically doesn’t with prose, where punctuation isn’t spoken, but affects timing and intonation, and abbreviations often are expanded (iOS speaks “Dr. John St.” as “Doctor John Street”, for example, but “St. John Dr.” as “Saint John dee-ar”. MacinTalk used to know that ‘Dr’ means ‘Drive’)

So, it need not do that here, and could say

“call read, eval it, print the result, and call loop on print’s output”

, using intonation or voice to indicate the difference between content read from the screen and text describing it.

Farfetched? Maybe, but take a look at what screen readers do with html.

A screen reader that knows lisp semantics could go even further, and replace loop by repeat forever or something like it.

Requiring a sufficiently smart screen reader seems a bad way to go. 30 years on from CLtL we still don’t have a sufficiently smart compiler and I would argue that that problem is easier. One thing is that this works “better” with one-argument functions. Consider:

  (with-open-file (*standard-output* foo)
    (print x))
  (print y)
Vs

  (with-open-file (*standard-output* foo)
    (print x)
    (print y))
How do you read the first? As “print x, now with-the-file foo-open-as-standard-output it; then print y”? Or maybe “with foo opened as standard output, print x; now print y”?

This seems more reasonable but how do you write the second example? Like “with foo opened as standard output, print x; also print y”?

There are reasonably large semantic differences in such cases and many programming languages, including lisp, express them with subtle hard-to-pronounce differences in indentation or parenthising of expressions.

> Bracket loop bracket print bracket eval bracket read bracket bracket bracket bracket?

It would say "left paren" and "right paren." It's not terribly hard to keep a stack in your head of how many close parens you're expecting in some context. Manually managing brackets in long or deeply nested forms (in any language) is a pain whether you can see or not. As you said, pseudo-structural editing is a big advantage.

> (I think writing these on a single line makes them written more like they might be spoken)

Screen readers can announce indentation levels.

Using dashes in symbol names is problematic. It becomes impossible to differentiate

    my-var & my - var
As variable declaration or assignment looks very similar to the subtract expression... But if you enforce whitespace, then it's clearer I suppose...
The subtract expression in Lisp looks like

    (- my var)
because Lisp uses prefix notation. You would never run into ambiguities since there are no infix operators in Lisp at all.
There is a quite a lot of experience with dashes in names in FOSS because they are used in shell and Makefile programming, not only in Lisps.

Git commands have dashes: git cherry-pick.

Lots of hits with this: echo /usr/bin/-

One of the software engineers where I work is completely blind. I've never had a chance to interact with him as he's in a remote office unfortunately. He mainly writes in Python, bash, and C.

From what I understand, every project he works on has strict formatting requirements (can't commit until the linter passes, etc.) and his screen reader is programming language aware.

Although, to be honest, I feel that the thing he relies on most is his rather amazing ability to remember most of the exact contents of whatever file he's working on.

I would find it very interesting to read your coworker's account of what programming is like. Or anyone's account who has to approach programming differently compared to the average person. I'd love it if more people blogged in general.
Just wanted to chime in to say thank you for your consideration of visually-impaired programmers with suggestion 1.
Sure this problem can be addressed at the language layer, but as you've alluded to, I think it would be more applicable to address this issue at the text-editor / IDE layer or even the build tools.

There's tons of IDEs that make developers better at coding, with things like automatic syntax checking, refactoring, inline debugging, autocomplete, etc. Would it make more sense to develop a developing environment that makes disabled developers better at coding, with whatever features would make their experience better?

It would probably be easier to get a disabled developer to use your editor than to get a disabled developer to use your language. From what I can gather, it's hard enough to get employment as it is for them (maybe they can only work remote, or maybe they can be physically in the office but they're blind). I'm not sure if they have the luxury of being able to choose what language they get to use. But I'm sure their employers would allow them to use the IDE & tooling that works for them so long as they output code that fits the company stack.

My struggle is typing. I use an onscreen keyboard (https://www.blakewatson.com/journal/writing-and-coding-with-...), which I have heavily customized for web development.

I would appreciate terseness. For example, I love how in JS, I can do this:

``` var cat = whichCat(); var catPosts = posts.filter(post => post.cat === cat); ```

Whereas in PHP, I have to do this:

``` $cat = whichCat(); $catPosts = array_filter($posts, function($post) use ($cat) { return $post->cat === $cat; }); ```

So much extra typing.

DISCLAIMER: didn’t test this code so chance of typo is 99%.

It didn’t capture my line breaks but hopefully you get it.
Out of curiosity, how long did it take you to type this comment?
I've seen some programmers code using voice. This is really handy for people without functiong hands or fingers. They tend to use voice recognition software like Dragon and various plugins.

I'd say from a programming language point of view, having keywords that are short (single word would be ideal) and phonetically distinct is really important.

One python programmer I watched on Youtube made his own vocabulary of strange sounds that he trained his software to recognise and translate to real keywords.

I'm so glad voice recognition is a thing. I have a weird tendon disorder and suffer from some pain/discomfort daily. So far I have been using my hands but I'm always worried about not being able to type in the future. I'm glad I won't have to rely on disability because career/work is so important to me.
Hey, kudos to you for thinking about this! Background: I'm totally blind, have programmed for nearly 3 decades, kind of do the in and out of half a dozen languages thing these days. Today's favorites are Rust anywhere I can get away with it, Python because it runs in places where I need it (Home Assistant, Mycroft, etc.) and JavaScript because if I hold my nose and don't think too much about the atrocities I'm committing, I can run the same or similar code in various form factors. I'll try to give a few pointers. Note that these are specific to blindness, and specific to me. I don't claim to speak for the disabled population as a whole, as we're kind of a grab bag.

1. Indentation: Pretty much a solved problem at this point. If I were reading Python code line-by-line, my editor might speak something like (not sure if my newlines will make it, but imagine them where they should be): def hello(world): 4 spaces print("Hello, world.") 4 spaces 1 tab 4 spaces print("What was I thinking when I indented this line?")

So I wouldn't worry too much about that. I've never had issues with an indentation-based language, and anyone blind who does likely just needs to change their tooling a bit. This is usually just a checkbox in the screen reader settings, so doesn't even usually require an editor/IDE change.

2. Avoid crazy symbols. Scala gave me some grief with this, with every library author having method names like %^&@^$# because I assume that set of symbols looks like performHttpRequest(...) in some visual way. I exaggerate a bit. Only a bit. Note that operator overloading is fine, at least from an accessibility perspective. It's when people decide that a series of connected punctuation symbols evokes the idea of making an HTTP request or opening an Option that I start to get annoyed.

3. Create good command line tooling. Rust has this nailed. I like how Rust's own installer just uses rustup under the hood, or at least I think it does, and every blog post advertising a new component also includes the rustup incantations to grab it. I assume the editor interfaces are as nice or nearly so. I guess the takeaway is, package your language installation tooling in a library so you can invoke it from the CLI, editor plugins, etc.

4. Put error messages at the bottom of stacktraces rather than the top. Python does this right, and everyone else gets it wrong[1]. Say you're running a compiler from your command line. You get an error, and your cursor lands on the input area, ready for a new command. As a screen reader user, you discover that error by entering your window's review mode and moving up. With JavaScript, Rust, and just about everything else, I have to arrow through the callstack in reverse as I move up the screen to the line containing the error. Python puts this error last, near the input cursor, so all you're doing is arrowing up a couple lines. It's a few seconds per error, but can add up immensely over the course of a day. NPM, infuriatingly, shows the error, followed by disclaimer text that the error isn't in NPM, then barfs up an NPM error just to confuse things. So any JS package I use that uses NPM for its scripting requires arrowing back through 2 stacktraces to find the original error. It's enough to drive me to drink.

I can probably come up with more, but I haven't finished my coffee yet. Perhaps that's a good thing...

1. Right and wrong are of course subjective. This is just one blind dude's opinion, take it for what it's worth.

Do you use a Python auto-formatter called black, or if not, do you think consistency helps (e.g. shorter lines, same constructs/indentation) or hinders (e.g. shoter lines means more lines means more noise)?
Haven't thought much about line length. I tend to write longer lines just because I don't see the point on the screen where they'd logically break, and when I'm arrowing through code, I generally prefer to hear as much of a construct as possible without having to arrow 4-5 times through a single statement. If I'm calling something on a long list or string then I might break the list out over several lines, but if I'm dealing with a single long function call then I just let it go long. Formatters are certainly fine, it's just annoying to find and configure them for each language I use.
Are Unicode characters a problem for the tools you use?

For example, some languages will let you use λ instead of lambda. Or when trying to define the logistic function, I sometimes find myself writing

  σ(x) = 1.0 / (1.0 * exp(-x))
Or the Julia language has ≈, which tests if two floating point numbers are approximately equal. Visually, this is a reasonable symbol, it's not like one of the weird functional programming spaceship operators. But I have no idea what a screen reader would read.

Sometimes this sort of thing lets code correspond almost exactly to the notation in papers. It is a minor aesthetic improvement, but if it breaks screen readers and other tools I'd rather just write out "sigma" or "lambda".

My screen reader, Orca under Linux, read those as "sigma" and "almost equal to." So I suppose those work, though I'd have to hit Google to find out how to type them. :)
In Julia editors these are written by e.g. typing `\sigma` with a backslash and using tab completion.
Thanks for the response, that is pleasantly surprising default behavior.
The NVDA screen reader for Windows also reads these symbols. So it looks like they're not a problem.
Thanks so much for your response! #4 in particular is something I hadn’t considered, except in the context of how to display error messages in an editor, but now it seems obvious that the most relevant information should be closest to your focus.

As for #3, my compiler is intended to be all-in-one: there’s a single executable that acts as a front-end for an internal library, which handles everything: compilation, syntax highlighting, dependency management, documentation generation, you name it. So all the language tooling should just work in a consistent way.

Blind programmer checking-in, here are a few thoughts sparked by the comments that I’ve read…

Disclaimer: these are my thoughts, and should not be generalized to all blind programmers.

First, let’s start with the supporting technologies, mainly screen readers. The most popular screen reader is Jaws for Windows (expensive product), followed by Non Visual Desktop Access (opensource product), distantly followed by VoiceOver (your only choice for Apple products). My main day-to-day driver is NVDA, but I also use Jaws for my job. I do not use a braille display. The IDEs that I use are Visual Studio (C# development) and Visual Studio Code (Python and Javascript development).

Indentation-sensitive languages such as Python really aren’t that difficult to use, once you figure out how to get your screen reader to announce indentation levels. Typically, the screen reader only announces indentation changes when there is a difference from the line that you are coming from. A sample Python function would read as follows as I press the down-arrow to read line-by-line (note that I’m purposely not putting in line breaks, since an audio-based screen reader is inherently serial):

“def foo left paren right paren colon, four spaces number say hello world, print left paren quote hello world quote right paren, zero spaces blank”

Interestingly, I find lisp one of the most difficult languages, since there are so many parentheses, and it’s difficult to keep track of what nesting you are in.

Screen readers are not programming language aware. It’s all text to them.

Using pitch to communicate information is more distracting than anything. Imagine that you were having a conversation with someone, and every few words, their voice completely changed. It makes understanding the meaning of what they are saying more difficult, since your brain is too busy going “hey, something changed!”

Some additional reading that I recommend is “An Exploratory Study of Blind Software Developers”, which can be found at https://ciigar.csc.ncsu.edu/files/bib//Mealin2012-BlindDevel.... That identifies some programming challenges that participants face, as well as some of the areas that blind programmers self-report as excelling in. Full disclosure, I was the primary researcher on that study.

Finally, a mini soapbox rant: something that I see quite often is people doing blindness “simulations” for a short period of time. They then write up their experience, which isn’t a bad thing, but then present their work as “I found this hard, so all blind people must find this hard.” Identifying when a task has a large learning curve is important, but also do keep in mind that people who are blind have significant experience in identifying ways to overcome potential accessibility problems.

Avoid Perl 6 and its horrifying Unicode keywords and operators.
FUD. Unicode keywords and operators in Perl 6 are optional. For each unicode version, an ASCII alternative is also available.
i recently broke my two fingers on my right hand and could only code with the left hand (i am right handed) would have loved intellegint auto complete. And speach to text interface. That would be cool
Another blind developer here with his two pens. I like python because it has no braces. Sometimes the screen reader does not read them or if it does, it takes time to process the info and you still could be confused about the level of nesting. That's why in university I reformated all of my lisp code to follow the indentation rules of python as it helped me keep track. Generally, if the language has no too much strange symbols with important meaning, they are all just text to be read. So, the language is not an issue for me, but the tools to read/write/compile/debug. In that line of thought, if it works on the command line, it is good. Make it readable, make it verbose and avoid fancy syntax so that there is no ambiguity when reading.
I never thought about the concept of programming in symbols that you've never before seen. That's rather fascinating. The human brain is incredible.
I’m not sure, but based on what statistics I can find, it seems most blind people aren’t congenitally blind, so they probably have some familiarity with the symbols, maybe depending on how old they were when their visual impairment manifested. And of course you could always learn the shape of an unfamiliar symbol by feeling a physical representation of it—like on embossed paper, or those letter-shaped fridge magnets—but I dunno how common it is to do that.

If you don’t know the symbol at all, though, that could definitely make things more challenging to learn, since then the notation is (even more) arbitrary. A lot of programming languages’ symbol choices are visually mnemonic: Perl has “$” for scalars, “@” for arrays, and “%” for hashes because dollar-sign looks like S for scalar, at-sign looks like A for array, and percent-sign looks like a pair of things (a key and a value), but there’s nothing about these symbols semantically or in their pronunciation that suggests their Perl meanings.

It is not about if I've seen the symbol or not. { for example is read as "left brace". It takes the screen reader the time to pronounce two words with ambiguity left. What about ${variable}? You have 3 extra symbols totaling five words to surround a single variable. Redundant and abhorrent.