330 comments

[ 4.4 ms ] story [ 297 ms ] thread
Also the most surprising part of doing this was seeing that abbreviating super short words like "the" -> "t" actually saves far more characters overall than abbreviating long words and phrases that are less common, like "what do you think" -> "wdytk".
It would be interesting to see how much time you save.

I guess average typists will type "the" much faster than a complex word. Through muscle memory. I think it will be less noticeable for fast typists, who get their speed by being consistently fast.

I thought a bit about this... I feel like for me most of my slowdown comes from needing to get timing correct between my right and left hand. When I go too fast I start to get the letters in the wrong order, which isn't as much of a risk for letters all coming from the same hand (for me at least shrug)

I might go look for some research on typing times for different kinds of words beyond letter count!

Cool, thinking how can use it in programming, or other conditions?
(comment deleted)
Text expanders are good for this. You can have it as basic as "ty > thank you" up to templates which will ask for input, optional sections in templates, templates in templates, running scripts, and so on.

Very useful in eg. customer service when you want to reply to someone with links and whatnot. Giving instructions, etc.

For programming you can build up a library of common things, think ";;p -> print("\($place_cursor_here)"). Or whole classes, anything you can think of, really.

This is neat!

I've thought about doing something similar with my shell history to help me figure out which shell aliases I should create.

> I've thought about doing something similar with my shell history to help me figure out which shell aliases I should create.

Same here, I end up doing `h | grep "(something about the command)` a lot to get commands with specific options, etc. and think "damn i should really make an alias for this" every single time, but never get around to it

You might like Atuin*! It fuzzy searches your shell history + optionally syncs it between machines

https://github.com/atuinsh/atuin

*: shameless plug, I’m one of the maintainers

Yeah wow, I do like that, I'll definitely use it a lot, the full-screen thing on "up" keeps taking me by surprise though

Ps. one of the links in the docs is dead, "see the supported shells" on the page https://atuin.sh/docs/commands/shell-completions

Glad to hear it! You can disable the arrow key binding if you want, and/or make it only use part of the screen :D

Fixed it - thanks for the catch!

ooh love it! I also have a HUGE bash aliases file, but that's all manually constructed, not automatic. some favs:

cm = git commit -m st = git status inst = sudo apt get install -y fucking = sudo

>figure out which shell aliases

I use shell functions for this type stuff, and I have it spit out the command line it's going to run with all the args (to stderr) and then running the command, and other sorts of programmatic touchup (tell me if i'm in the wrong directory, or whatever)

spitting out the command line it's going to run with all the args (to stderr) is a function too. shell functions can also do nice things like change the directory in my outside shell, set environment variables, etc.

Pretty cool and very useful, as long as you can remember all of the shortcuts (I guess it comes with time!)

It kind of reminds me of stenography in a way

Have you checked how much faster this makes your typing? I can imagine it speeds it up quite a bit
[flagged]
This account is just cloning comments...
This is cool but I see so many posts in HN about “hacks” that increase productivity/save time that it makes me anxious.

I don’t know if it’s our field or just life these days but I would really love a more relaxed approach to work (or life in general?). It feels like I’m in a race and struggling to keep up with the pack.

It's not healthy to always be running around like a headless chicken. I want well-paced work to become normal.
Hopefully, this is most often just an excuse for someone with the hacker spirit to figure out how to automate something because it's fun. If you're really spending that much time replying to Slack and e-mail that making yourself an arbitrarily fast typist puts a meaningful dent in what would otherwise be work blockages, I think there are organizational problems there that you can't solve by being a faster typist.
(comment deleted)
I have found that I am spending more and more time thinking about my solution before implementing. Life is definitely more enjoyable and probably about equally as productive. You just have to carve out that time. Go for a walk and take intentional breaks from the keyboard.
You can relax more by spending less time doing tedious repetitive work like typing
I did this sort of thing quite a lot early in my career, but stopped quite a long time ago. The problem is that I started using multiple machines running different OSes, and not all of those machines are "mine", so I couldn't have these sorts of specializations everywhere.

That turned a positive into a negative when using machines that didn't have these optimizations.

I haven’t done what you or the author have, but one workaround this is using something like QMK or ZMK. Especially the Leader key on QMK.

Thanks for the post though, I need to do some analysis of my own typing habits to automate them

This is exactly what i do. Pressing the leader key and another key to let it type sentences and boiler plate code.

Creating a layer for this sort of typing would also be really cool and not having to use that leader key the entire time.

Interestingly enough, I have a macro keyboard I built myself that I use at home. It never occurred to me to use it professionally until you brought it up. Hmmm. Thank you!
(comment deleted)
For a similar reason, I did my best to get comfortable with default vim rather than purtying it up with a long .vimrc.
Neat! Reminds me of stenography keyboards
Idea for extending this: keylogger (yeah, that's a downside...) that'll watch what you type, learn common phrases, identify common ones, then come up with shortcuts, then each time you type the full phrase it gently reminds you of the shortcut.

Then anyone can install it, no friction, and over time it'll slowly start making you gently more productive.

Its not a keylogger in itself, its a tool to configure your keylogger.
I guess you are half right, the tool this repo configures is a shortcut engine (autokey). It has access to the key presses, but afaik does not log them.
of course, I was just using the same terminology as the OP
I wonder how that's work?

Something like auto export slack history each week, get a word frequency. Then mantually assign a bunch of expansions based on what you see?

I'm imagining it would be a native desktop app, so that it goes across all apps.
Would it be better to have some standardized abbreviation? It could gravitate towards those. That should help consistency between different computers (also helps if you have multiple computers..)
I once built a typing tutor that did something like this - it monitored all the mistakes I'd make, and would surface the most typo-ed words for practice.
I thought about using a keylogger as a data source, but then I'd have to wait another 6 months to have 6 months worth of data :)
I wanted to build a keyboard with a keylogger built-in that autocompletes for you with the press of a special key. My idea was to keep the data in a secure vault on device, so that it could not become a security risk.
The Warp CLI kiiiind of does this, but only in the context of interacting with the shell.
PhraseExpress does this.
You could do some of this with an input method editor (IME). It's pretty much an authorized keylogger that can edit your inputs, and is mainly needed for Chinese/Japanese typing. An IME that provides English autocomplete on the desktop (like phones) or shortcuts using an IME framework (like fcitx5) would be an interesting concept.
I went down the rabbithole trying to prototype something like this.

Bluetooth Keyboard -> ESP32 as a keyboard host -> Send keystrokes to USB & File

If you have cash there is a USB/PS2 keyboard logger that will capture data to disk.

If you're going to use models, why not models all the way through?

In other words, rather than using them merely to identify words to abbreviate and suggested abbreviations, why not use an LLM that can take a bunch of abbreviated text and infer what you're trying to abbreviate?

Tht wy, u dn't hv 2 mem lsts f abbrs ahd f tm.

ChatGPT was able to successfully guess that last sentence in abbreviated form:

That way, you don't have to memorize lists of abbreviations ahead of time.

(comment deleted)
ChatGPT is much slower and much more expensive. You don't have to use LLMs for everything.
Ah yes, I'd love to wait about five seconds every time I type some text for ChatGPT to return some output, worrying about boilerplate text around the actual answer, and to introduce unpredictability into the mix.
I'd probably try using ChatGPT to suggest the specific abbreviations for the most common phrases.
"That way, you don't have to remember lists of abbreviations" and... I can't seem to guess the last few words. Would you mine typing it out in full?

Edit: Oh, "That way, you don't have to remember lists of abbreviations ahead of time". ChatGPT must be something impressive if it can beat me at some linguistic games.

So many abbreviations being obvious was really key to me being able to memorize them. I just think "how would I abbreviate this" and that's almost always what my abbreviation actually is
I wish there was a way to just repurpose existing operating system support for CJK language IME for English.
Could you elaborate?

I'm aware of CJK input methods, but it's not immediately clear how/why you could repurpose them for English. Not to mention there are several types.

Using a standard input method editor (IME) was my first thought, too.

You can create a custom user dictionary in any IME, mapping the abbreviations to one or more full words or phrases, either in bulk beforehand, or one by one while you use the system.

During typing, pressing the space bar brings up a list with the substitutes corresponding to the preceding string. You can select with the up/down arrows and insert by pressing space again.

In practice, most of the time you can convert by pressing space twice in quick succession, because either you have a single candidate, or because the default selection, the top candidate is automatically set to your last, or most frequent selection.

If there's no match, you can add a new abbreviation to your dictionary.

You can turn on/off the system by pressing CTRL-space, or some other key combo.

Having to scroll through a list with the arrow keys sounds slower and more flow-breaking than just typing the word.
That's only necessary when you have more than one word abbreviated the same (e.g. "db" could be either "debug" or "database"). Someone here commented that this is a missing feature in OP's solution.
This is a very clever idea.

However, I realize that I would never want to use something like this that would change over time. E.g. if I ran it every 6 months and last year "db" produced "debug", while this year it produces "database". Because talk about messing up my muscle memory and habits. And the language I write changes very much over time.

So I'd actually be much more interested in a "universal" version of this -- if you ran it across books and e-mails and text messages from thousands of authors covering diverse backgrounds and contexts, then what would most reliably help everyone?

E.g. expanding "t" to "the" seems like a no-brainer, just like "st" to "something". Is there a minimal set of, say, 200-500 of these that could simply be turned into a "standard keyboard" that everyone could learn?

You could make it append only by default. Only ever add new shortcuts - if db was debug for you before then database would have to take on a new shortcut (e.g. dtb)
That would lead to pointless verbosity over time because the older shortcuts would squat on useful shorter shortcuts for words that are no longer used. It would lead to the "horseless carriage" effect for shortcuts.
Just delete things manually.
A simple ngram index can address your concern
Is the universal version of this stenotype?
More or less, yeah.

There are different stenography systems, each with their own shortcuts and abbreviations, but at core they're all about producing large volumes of text with minimal physical effort at very high speeds.

Those interested should check out http://www.openstenoproject.org/.

A good mechanical keyboard (e.g. the ErgoDox EZ) and Plover mean the only thing standing between you and >200 WPM typing is the time and effort to learn it.

I hit this invisible wall at about 165 WPM that I can't just get beyond, and it kills me. I wonder how fast I could get with stenography... I see dem 400 WPM videos and they look awesome.
Curious what kind of work you are doing where WPM is a limiting factor. I’m in software, like a lot of people here, so being able to type in speed is rarely the limiting factor. Besides stenographers, the only other line of work off the top of my head that needs this kind of speed are people who are paid to write subtitles for TV shows and movies in another language. Which I guess is just another form of stenography, when you unwrap it.

Or is it not for work and it’s just purely to see how fast you can type?

Typing fast is one of the greatest strengths for programming for me personally, especially when compared with Vim. It's that that it's a limiting factor, but rather I max out typing quite often, and also I have always wanted to hit 200 just for fun, but it currently feels not attainable.

Some people say they spend more time than they do typing, but I definitely don't find that to be the case very often.

I am a bit jealous (maybe?) that typing speed is a factor for you. I am the kind of person that will think for minutes at a time before writing a single line of code
All depends on what you’re doing… sometimes people have to write, like, css.
It's definitely situation dependent. When writing a lot of frontend code (vue, typescript, css, tailwind, html) I know what I'm typing several mental steps before I actually type it, so speed gains there are most pronounced.

Sitting somewhere in the middle are dynamic languages where there might be certain implementations (say... some random api integration) where it's simply a lot of code I've typed thousands of times before. This still benefits from fast typing, especially when needing to operate surgically with vim, it's one of the moments I love the most (basically getting 20x combos with perfect typing at high speed when moving/modifying/transforming blocks of text etc etc)

What benefits least of the 3 is writing things like Golang where it still definitely helps typing fast, don't get me wrong, but I usually have to think more there. Pace is slower, and symbols can become a pain in the ass.

At the end of the day... you're still typing thousands of lines of code regardless of whether you're thinking or not. I never understood the argument "I spend more time thinking than coding". You are still going to write the same amount of code whether you're thinking or not. My ideal world (why I love typing fast) is that that time of me coding gets brought down by 50-200% over someone who types slow. I use that time for accelerating ahead. Ie... prototyping and deleting tons of code before refining/cementing in a design is painless.

for me philosophically code is a liability. Every line of code I write is a liability for me and future generations. So I try as hard as I can to not write code at all so it takes me quite a long time to decide to write code. I see it like that in the places I work too, I get paid to decide when it makes sense to write code eg introduce liability to the business
Interesting perspective. I am a solo developer for all my own companies, and I basically work alone managing a number of high volume businesses. I look at code as "art" oddly enough, and not a liability. I look for elegant solutions that wrap complexity up in the most elegant way possible, and I think a lot of "liability" comes from people not knowing what they want, and not refining features, as opposed to code (at least in the business I work on, it sounds different for you in your case)

Edit: Not that "high volume" means anything but I put that there to illustrate there's millions of dollars of liability on the line, not just pet projects or something. It just sounds like a different kind of business I'd guess. Working on a team is definitely something a lot different, that I don't really deal with, nor have much experience with.

This perspective makes total sense if you never have to write code that is maintained by someone else or deal with code that some else has written.

All of our abstractions make sense to us. We wouldn’t have written them otherwise. But unless we are gods at documentation passing that context off to someone else is hard. It’s very easy to casually dismiss a bunch of code as over engineered by also casually dismissing requirements. By being extremely diligent about what you introduce in terms of code you will save yourself and other engineers hundred of hours down the line (if not thousands)

That being said, if you’re a startup who won’t survive without working code and your end users don’t ever see the code you write, who the fuck cares about the 10,000 lines of code you write that would take some other engineer half a month to understand? 10,000 lines of code that make money are worth infinitely more than 10 elegant ones that don’t

That makes complete sense. The team aspect is probably where our experiences differ the most.
I agree. Code is a liability, and you should think as hard as possible so that you can write the smallest amount to produce value.

But at the end of the day, you are often going to be writing something, and once you figure out what that is, it should transmit from your brain to the editor as fast as possible.

I’ve come to that realization consciously not long ago after two decades in software, but felt this tingling for a while.

Code not written is code not using up resources of your colleagues… and future you. It might be an asset if you sell code, otherwise it’s strictly a liability if you sell a service which the code provides.

> I never understood the argument "I spend more time thinking than coding". You are still going to write the same amount of code whether you're thinking or not.

The argument is that time spent typing is insignificant compared to time spent thinking, so optimizing for WPM seems like a less relevant endeavor.

So if you spend (say) 1 day thinking about the problem and 1 hour typing, it matters little if you can speed up your typing by 50% or whatever: you still spend the bulk of your day thinking, and optimizing typing speed is not going to change your deadlines.

It sometimes seems people fetishize typing speed because that's easier to get better at (and measure), while there are no shortcuts for thinking "better".

I spend over 10+ hours a day typing at the computer, across slack, writing specs, writing code, etc. So really I suppose in my mind I don't live in a vaccuum.

I don't fetishize it at all, in my mind it is a simple objective fact that I actually experience myself. Fast typing is up there with Vim as one of the literal most productive things I have ever done, with the 3rd being memorizing hundreds if not thousands of OS/app hotkeys.

Writing specs is a key bit here that I'd generalize as: I think by typing. The hardest problems I troubleshoot are worked through with best quality if I am typing up a worklog of stuff tried, rather than taking no notes at all. And like mentioned in other comments, the effort of typing these notes is a limiting factor on the quality of my notes (too much time spent typing slows the troubleshooting iteration loop).
It goes without saying that typing notes, transcribing documents, and generally "stream of consciousness typing" is helped by a fast WPM rate.

But for coders, that's seldom the task we're doing. Hence the assertion "I spend more time thinking than typing".

It is either an objective fact, or something you experience, but it cannot be both. Having said it, have you actually measured how much time you spend typing, to claim a huge boost in productivity? Developers very often overstate the amount they type p.d.

I can imagine, that going from pecking on keyboard to 10 fingers is actually huge - it is just a bump disappearing. But going from 80 wpm to 160 should have diminishing returns, even more so going from 160 to 320 - here, the Pareto principle should kick in.

I was saying an "objective fact" for me, not globally. I was responding to the idea of "fetishizing" WPM when I'm saying, no, with 100% certainty, WPM is extremely beneficial to me with no grey area.

Also I did say in another comment 80 WPM would be where I'd put the barrier of not having to constantly break mental focus. BUT ALSO.. I'll take this a step further...

Have you ever gone from a 60hz monitor to 120?

Have you gone from non retina iphone to retina or remember that?

Have you gone from 32gb to 96gb in your computer and noticed things open THAT much faster?

Have you ever optimized something like the load speed of your terminal and removed 200ms from its boot time?

Now could you imagine ever going back after doing any of those things?

To me, thats what its like beyond 80. I can't imagine having to go back to 80 after I've felt 160. It's just THAT much more freeing when I'm really really deep in thought. quite literally I can type as fast as I can think, and it becomes truly seemless, like "programming in lisp" when the language gets out of the way (I dont program in lisp regularly, just seems like a good analogy)

Counterpoint: the best engineers I've worked with had beat up, old crappy laptops with low res screens.

I'm thinking of 2-3 guys I really admire, and they had this in common: when asked "but don't you need the latest Mac with a retina screen!?" they looked puzzled. Like, the common answer was, give or take: "yeah, I guess, if there's one to spare, but don't other people need it more? I do most of my thinking away from the screen anyway, and I run my stuff on a server".

The fetishization of hardware is yet another thing that puzzles me. Yeah, better hardware makes our lives easier and nobody will deny that, but (barring some obvious stuff like "this will take 1 hour to run vs 1 week") does it really impact how effective you are at completing tasks in your job? To some degree it does, but programmers tend to overemphasize it because it's easier to obsess about getting better hardware than about solving harder problems ;)

For me? Yes it does, and I'm not fetishizing hardware, etc. In my mind, it's very "this is the way it is"

I'm a single developer/entrepreneur who as put dozens of products to market single handedly, and a number of them have done really well (some getting over 10M/yr another getting much higher than that). Right now I'm managing 3 full time... and Some days I code upwards of 15+ hours a day when building.

So basically efficiency is important to me. I literally am doing the job of like 3-4 developers at once (I do all design, frontend, backend, data analysis, reporting, infrastructure, etc).

"yeah, I guess, if there's one to spare, but don't other people need it more? I do most of my thinking away from the screen anyway, and I run my stuff on a server"

This just sounds like a mopey slow answer, sorry. I'm not hating on what they're saying but I'm not going to intentionally make my life slower/worse because of some disjointed idea that doesn't make sense. "Someone else needs it" sounds like fake ... modesty or something. MOST of my time is spent thinking in the shower, in my sleep, or with a physical pencial/notebook in my hand where I architect things. That doesnt mean the hours upon hours .... 30,000+ hours at this point in my life, that I've been on the computer actually building that I'm not going to use the very best tools at my disposal.

When people constantly call nice things "fetishizing" it sounds to me they're just different kinds of thinkers, more like scientists or objective experience-driven, domain-knowledge heavy type programmers. I'm not like that, I'm more about pattern recognition when information is missing, and filling in the gaps and moving quickly/efficiently/elegantly, and design and aesthetics are extremely critical to me. Elegantly designed/efficient code is extremely important to me, just as much as an efficient workflow.

You could call it "being creative" or whatever you want, but those things are very important to me as they all feed into my mind as fuel... into this giant arc reactor of mental substrate, and I look through this kaleidescope connections and I refine refine refine go go go.

> This just sounds like a mopey slow answer, sorry. I'm not hating on what they're saying but I'm not going to intentionally make my life slower/worse because of some disjointed idea that doesn't make sense. "Someone else needs it" sounds like fake ... modesty or something.

Well, you'll have to take my word for it: these people I'm describing are brilliant and accomplished engineers who advanced lots of projects in their jobs, and taught me a lot. I saw what they did. I saw them troubleshoot hard engineering problems, and solve them. This is not hearsay, I saw them at work.

So I guess I'll follow the evidence.

I'm not questioning their skill or your observation, I believe you fully.

I also know just because someone is smart doesn't mean that all their ideas make sense in terms of efficiency. The smartest people I know are also generally the sloppiest, or have the most rigid unbending ideas that are not adaptable.

I'm not saying that's what you've seen of course, just wanted to explain that what I'm saying doesn't necessarily contradict what you're saying.

Typing is bursty. You don’t type much usually, but sometimes there’s a lot of it. Effortless typing minimizes interruptions and allows to stay in the zone for longer. It isn’t just about the time spent typing, it’s about typing at the speed of thought so you don’t switch contexts from thinking to typing.
Typing is bursty, agreed. I'm not saying someone who is an extremely slow hunt-and-pecker is ideal.

What I'm saying is that, past an average typing speed, obsessing over WPM gets you diminishing returns, because that's not where the bottleneck is. You should rather spend time improving other aspects of your process, but of course, "thinking better/smarter" is harder to improve.

For the record, I never measured WPM but I'm mostly a fast 2-fingers typist. All keys are typed with my index fingers, and the spacebar with the thumb and some of the special (shift, CTRL, etc) keys with some other finger.

I will lose every competition with a WPM-focused typist, but I can guarantee you my effective tasks -- the actual job we're meant to complete -- will not take me longer, unless said job is transcribing a document (which is never my job).

If you are a 2 finger typist and also think people are "obsessing over WPM" because they're wanting to utilize their own tools to the fullest advantage, that sounds like some mental block kind of thing.

If you can type at least 80 consistently then thats probably would I imagine the dividing line is between "flow/concentration not breaking" and "breaks constantly"

Try a 50 word monkeytype https://monkeytype.com/

> If you are a 2 finger typist and also think people are "obsessing over WPM" because they're wanting to utilize their own tools to the fullest advantage, that sounds like some mental block kind of thing.

I get frustrated by this kind of replies on HN.

Please don't try to "fix" me. I'm telling you my WPM are not limiting, because -- like almost ALL coders and engineers -- I spend most of my time elsewhere, and that 2-fingers is fast enough. I will not solve a Data Engineering problem by typing fast.

I probably type faster with 2 fingers than you. Maybe not, but I've seen me "win" over people who type with all fingers, and that's good enough for me.

So thanks, but no thanks?

I'm not trying to fix it, just engaging in a dialog, and I said it "sounds like", because your first thought when reading about people using their tools effectively is that they're "obsessing" about it. A lot of people care greatly about efficiency (me), and having someone who can't actually type fast or seem to care about efficiency then tells you you're obsessing about it seems like the hallmark "I cant do X thing so I will criticize it instead"

Are you at least over 60 WPM? I think I said in another comment that I think 60 WPM is probably the lowest I can imagine not constantly breaking your focus while trying to hold ideas in your mind, especially if you do data engineering and youre going multiple layers deep.

I can guarantee you it's not a case of "I can't do this, so I'll criticize it". I'm actually a decent 2-finger typist, and this has never limited me when troubleshooting a problem or designing a solution. Engineering problems are seldom solved by typing really fast.

I'm fine with you improving your WPM, I just don't think it's a worthwhile endeavor -- it's not making you more efficient where it matters. Likewise, I could improve my WPM, this is not rocket science and anyone can do it with training. It's not even hard training.

But why? I could also train to run faster, but would it help me do my job better?

edit: out of curiosity, and this proves nothing either way, I tried your monkeytype link and got 90 WPM with 97% ACC.

Are you sure about that? I trust you if you are truly, TRULY sure...

Imagine you had a tool similar to those ChatGPT IDE auto-complete plugins, except instead of doing chat GPT it typed what was in your mind.

Imagine you start work in the morning, and there is a 0ms response time from what you think, and huge blocks of code would appear instantly.

Is your work such that you TRULY only type 300 words per day? Or, do you also... write tests, write boilerplate, write for loops you've written thousands of times, write and read files, call/build APIs, write command line tools.

If you can imagine some kind of "instant feedback" typing thing quite literally not improving your quality of life whatsoever, then I guess you are just in a rare boat. I can't visualize any circumstance where 80WPM typing would not benefit them, but I suppose there might be a world of developers out there who truly live in a vaccuum like one of my other comments said... they just come in to work, dont communicate with anyone, dont write anything other than a 50 line file with a few hundred words in it, and leave after 8 hours)

> Are you sure about that? I trust you if you are truly, TRULY sure...

Yes, I'm sure. Isn't this what I'm saying?

Are you sure running faster wouldn't improve your engineering job?

> Imagine you had a tool similar to those ChatGPT IDE auto-complete plugins, except instead of doing chat GPT it typed what was in your mind.

I use ChatGPT on occasion. I spend way more time trying to frame the question and understanding whether what ChatGPT spewed out makes sense than actually typing the question.

> Is your work such that you TRULY only type 300 words per day? Or, do you also... write tests, write boilerplate, write for loops you've written thousands of times, write and read files, call/build APIs, write command line tools.

I've spent more time typing words in this thread with you than I'll write the rest of the day for my job.

(If you find yourself writing lots of boilerplate, may I suggest that may be a real place to focus on improving, rather than on how fast you can type boilerplate?)

The only other place where I'll spend time typing is in chat. Let me assure you my typing speed is more than enough there too, and I really don't want stream of consciousness typing in my job chat -- that would get me fired fast. And for social typing, how much speed do you truly need to type "hey, what's for lunch?" or "hey, did you read this news? <link>".

Yes I don't mean literally chatGPT, thats why I said "except it would type from your mind" to eliminate the focus on chatGPT being wrong.

Alright I concede if that's really your use case. I wrote in another comment but I manage 3 separate companies that I started, and I'm the single developer on all of them, and I do everything on them (frontend, backend, infrastructure, data architecture/analysis, etc). So it's definitely not true for me. I have enough experience with my friends working at companies though to know they STILL would benefit, but it sounds like you escape this characterization somehow, so I believe you.

> I never understood the argument "I spend more time thinking than coding". You are still going to write the same amount of code whether you're thinking or not. My ideal world (why I love typing fast) is that that time of me coding gets brought down by 50-200% over someone who types slow.

My perspective on this (I'm not a fast typist, but don't feel it's a big limitation) is that I can think while typing, so if I can type at least as fast as I can plan the next bit of code, there isn't any benefit to typing faster.

Of course, that isn't the complete picture, and I wouldn't be surprised if typing out less concrete thoughts (which might mean the same as when you say "prototyping and deleting tons of code") might improve my code or speed me up in plenty of situations. It's also possible there are things I avoid more than I should (such as writing short programs to see how some interface behaves) because I'm too slow at typing.

I don't know how it is working on large teams, but for my daily work working alone I usually write maybe 10-15 emails, I issue a dozen or more commits, I outline specs (a vague word I'm using which could mean writing documentation, writing technical explanations to clients, writing comments, commits, boilerplate, talking about technical things to my peers via chat).

The entire technical burden of all things fall on me, so I suspect I'm editing code a good 6-8 hours of the day, and the other 3-4 hours at the computer are spent communicating of some form. I wish I knew how many words I typed per day but it must be seriously 10's of thousands. Maybe 5000-15,000 depending on the day. Now I imagine doing that.......... 3 times slower. That gives me excrutiating physical pain.

If I sat in a vaccum, with no outside communication, and nothing else dependent on me whatsoever, and I was basically given a single task to produce a 50 line file by the end of the day, and the other 7 hours was spent deep in thought, then i could see typing not being important.

My point was intended to be with regard to code specifically, I don't dispute that typing speed is beneficial for other communication. My recent coding experiences have been much closer to your last paragraph than your first (talking to peers about technical things has often been via audio).
If you want my unsolicited 2 cents to help speed up (if you care!)

1. put your fingers on home row keys with pointer fingers feeling the bumps on F and J

2. DONT move your wrists all around, try to keep them still and let your fingers do all the work. try to keep your entire palms as still as possible, they really shouldnt move. I rest mine on my laptop surface.

3. dont look at the keys. use https://www.typing.com to help you if you cant do that

4. relax your hands as much as possible

Typing.com is better IMO if you don't know how to type fast, and monkeytype.com is way more fun when you do (the interface is just way more fun)

Thanks for the advice - I do 1 & 3 and I think I do 2 & 4 although that's less true when writing things with symbols (such as code), or when navigating text (I don't use vim). According to monkeytype.com, my typing speed is ~40wpm, which is apparently around average (not average for monkeytype users).

Thinking time definitely dominates, I'm hesitant to write something unless I'm confident in it, which I feel serves me well when writing code, but less well in other contexts (except perhaps HN, which has an unusually high fondness for accurate rebuttals of minor technical points). I spent ~20 minutes writing each of my 3 replies to you (longer on this one now that I've finished it). Perhaps being able to type at the speed I could talk would deny me the chance to think about it while waiting to finish typing, speeding me up indirectly.

You definitely hit the nail on something you said, which is when I'm forced to type on my phone, my replies are always MUCH more succinct, clear, as I can only type like 30 WPM probably on my phone.
I think it matters a great deal too, and not just for typing code but for reading it too, and this goes beyond simply typing fast but also writing short concise code, especially for parts of the code that are closer to defining program architect than implementing the details: it's better to have everything fit in one page of code rather than being dispersed throughout multiple files.

The reason for that is that a codebase will condition the complexity and thus time it takes to add features to it, in a way that is similar to algorithmic complexity and big o notation, except we as human can't even afford polynomial complexity and constant factors matter a lot.

Imagine you're developing an API, both server and client. You can cut your time in half by automatically deriving the client code from the server side specs. Of course you may have to develop that tool yourself and it takes time. The point is that the time invested developing it will be repaid each time you implement a new endpoint in your API, cutting development time in half:

n * (t(s) + t(c)) versus n * (t(s))

It’s not just writing code though. So much of my time is spent typing, whether in slack, notes, shared documents, or code, that typing speed is a quality of life improvement across the board.

When coding, I prefer to spend my thinking time thinking and my typing time typing, so typing fast gives me more time for thinking, makes playing around with little ideas feel easier, and again provides what I feel like is a significant quality of life improvement.

> It's that that

Made me laugh, given the topic!

Yes that's hilarious, I noticed that.
What keyboard are you using? If you have a good, ergonomic desk (required prerequisite), then try the Matias Ergo Pro. It is the most comfortable keyboard I've ever typed on, and I've owned literally dozens of mechanical, ergonomic, split, and specialty keyboards. Just be aware that the build quality is terrible. I had two Matias keyboards, neither lasted a year... And I type lightly, preferring 35 gram keys. At $250 each it is quite the investment. But, honestly, they are worth the price. They are _that_ comfortable.

Yes, I am a heavy VIM and bash user. I'm sure that some days I do not touch the mouse at all.

I'm using the latest MBP keyboard which is an insane upgrade over the previous. For some reason I think working on a 16" laptop is much better for speed and efficiency than huge desktops, it's like the keyboard and screen is a direct extension of my mind rather than the feeling of writing while holding a pen with gloves on.
> I’m in software, like a lot of people here, so being able to type in speed is rarely the limiting factor

I think of typing speed in coding the same way I think of cardio in boxing – it won’t win you the round, but the lack of it can easily lose you the round.

You want topping to feel seamless and reliable. Whatever you think should come out on the keyboard reliably and without friction. Any time you have to stop and think about typing or go back to check for typos, is time you’re losing focus and flow.

Take an extreme example – search-and-peck typing where every character takes 2 seconds. Can you really hold a complex programming context sharp in your mind while it takes a minute to type a few instructions? I sure couldn’t.

But you probably also can’t think fast enough to fill a 200wpm typing buffer.

Somewhere in between those extremes lies the sweet spot where your typing speed and your thinking speed match.

Interesting perspective. I have a decent wpm (like 120 if we are doing mavis beacon shit) but otherwise I usually go at like 70. I cannot think of a single time in my 10 year software engineer career where I have been like “damn, I wish I could have typed that faster and my typing speed was a limiting factor in my job”
That’s the fun part! You don’t notice it’s a problem until you pair with someone who can’t type fast or makes a lot of typing errors and you want to bang your face through the screen because it’s so frustrating to watch them struggle.

They don’t even realize they’re being held back by this. It’s an invisible friction until you notice it.

Easiest way to notice the effect is by switching to a new IDE where you don’t have the keyboard shortcuts in muscle memory yet. Or a language that’s easy but you have to think about the syntax because it’s new.

Indeed, being able to type quickly is invaluable in minimizing the time your mind is blocked from continuing onwards.

Or, in general, being able to use keyboard quickly. I've seen a lot of people who, when troubleshooting some issue in a SSH session, are v e r y s l o w in shell (quick sequence of little tasks like: type a command, find a particular command in your recent shell history, bring it back up, change something in it, navigate to a different directory, grep some log output).

If even the simplest of those tasks takes you a few seconds, you risk losing the train of thought.

It might not be a limiting factor as much as an enabling factor.

Sometimes being able to type fast can also mean thinking broad or deep quickly.

Coding at WPM is very different than communicating at WPM. The latter might be valuable.

If you can type faster you can help teammates a bit more easily.

WPM isn’t a high score for me, but there’s probably a floor.

Virtual assistants for example is one area where the average of 3 typeracers can be interesting.

In fairness to your comment, the ability to speak to text accurately can be faster than typing too, and maybe it’s a combination of clarity meeting WPM.

People conflate two things when discussing speed. Throughput is rarely the limiting factor, but latency can get in the way.

Being able to type out a line of code or comment very quickly and then move on to thinking about the next one without breaking flow is useful.

One thing I would check out is short key travel distance.

I love my Bloody B975, but I know I type faster on both my Apple keyboard and especially the Magic Keyboard Folio just because of the super short travel. I can hit 80-90sh on the gaming keyboard, but I'm probably at least tickling 120 the iPad.

The newest macbook pro is 10/10 for me on typing speed. By far the best keyboard ive ever used.
good to know! I have a newish one, but I use a bluetooth apple keyboard and a 4K gaming-grade monitor for work. I need to check it out
tldr: plover turns your keyboard into emacs

I always see wpm come up for steno stuff and while it can be faster, that's more of a professional thing. There are three cool things about plover for me. One you get to type pressing more than one or two keys at a time. Two the inputs are sent on key up or release, so can take your time pressing all the letters down, and then release them. Three, you have almost no hand movement at all, so its really, really, really comfortable to type on.

once you get that, you have the steno theories to expand all the words. plover comes with a stened dictionary, but thats just for the words. you can also do phrases, symbols, emoji, macros, and more. once you start adding dictionaries, using a computer becomes a lot more fun. plover is like really crazy layers.

Now for the other dictionaries, you can do things like: https://steno.sammdot.ca/plover-basics.png https://steno.sammdot.ca/ted-navigation.png https://steno.sammdot.ca/emily-symbols.png

for these, where it says starter, you just press all those keys down, and then on the other side you press the keys listed for what you want. so for example, I can enter like ~104 symbols without moving my hands. the average sybmol layer has like 20. the crossplatform movement dict lets me move around much easier in any text field. (note that you don't really even need to know what the key names you are pressing are as its all a pattern) I currently have six other dictionaries that I use some of the time. you can see more here: https://www.openstenoproject.org/stenodict/.

any cli program would be very easy to add most of the commands to a dictionary if you wanted. for example, a basic git dictionary: https://github.com/didoesdigital/steno-dictionaries/blob/mas...

plover has made using a computer much more fun. its a bit of a hard sell for a lot of people, but I recommend trying out some of the other dictionaries to see what you can do besides type words fast. its seriously really crazy that we are only pressing one key at a time using a keyboard.

It would be nice to be able to find a keyboard that was comfortable to learn how to steno type with that didn't cost $100-$300. $50 would be a sweet spot. It doesn't need to be a premium kit with expensive switches and LEDs and whatnot. It just needs to be the right form factor. It feels like the people selling kits are taking advantage of its niche nature. (Though, it really shouldn't be niche; being able to type at the speed of speech/thought is more of a "bicycle for the mind" than any AI.)
Doesn't stenotype also have chording though?
> However, I realize that I would never want to use something like this that would change over time. E.g. if I ran it every 6 months and last year "db" produced "debug", while this year it produces "database". Because talk about messing up my muscle memory and habits. And the language I write changes very much over time.

> However, I realize that I would never want to use something like this that would change over time.

> And the language I write changes very much over time.

Sounds like exactly you want something that evolves after time, since how you write changes over time.

An universal version would maximize the amount of helpfulness on an average for everyone, but a tool that learns from your individual actions, can be much better improvement for you. And by making the tool available to everyone, more people could get bigger benefits from it, rather than just "average" benefits.

> Sounds like exactly you want something that evolves after time, since how you write changes over time.

No, because I don't want the shortcuts to be changing on me. That would drive me nuts. The whole point for me would be to establish new habits and then keep them. To turn into muscle memory, not something to be thinking about.

It's like toolbars that "learn" which actions you're currently using the most, but the buttons are constantly moving around and are never where they were last week. It's an exercise in frustration.

I think it's built and fixed until you decide to extend or modify it.
Yup, it doesn't run automatically for exactly this reason. It outputs "suggested_shortcuts.yaml" and I can copy and paste from that into "shortcuts.yaml" so I have manual control over which shortcuts are live :)
This is good I can imagine all of the embarrassing auto typing. It is the reason I hate Android phones. I will be typing and it will try to predict what I am writing. Some of it not sure what data it is built on came out hilarious or down right inappropriate. Not like swears or vulgar just the punch of the expressions.
You can turn that feature off on Android phones.
Even then, universal doesn't mean time-independent.

A universal set of shortcuts trained on a giant corpus in 2018 wouldn't have a shortcut for "covid" or "pandemic" but in 2020, it would be really handy.

I think the phrase "changes over time" should be one of your shortcuts.
> E.g. expanding "t" to "the" seems like a no-brainer, just like "st" to "something". Is there a minimal set of, say, 200-500 of these that could simply be turned into a "standard keyboard" that everyone could learn?

Take a look at Evans Basic English Code, a shorthand system based off of Phillips Code (for telegraphs). It's a little dated, but the most common words are quite useful for writing or typing.

https://archive.org/details/evansbasicenglis00evan

(use the pdf, the txt file is a bad OCR and practically useless)

Also useful:

https://en.m.wikipedia.org/wiki/Most_common_words_in_English

I appreciate the fact that it contains shortcuts for such words as "endeavour" (EDV), "ecclesiastic" (EC), "notwithstanding" (NWG) or "vehemence" (VMC) being a dictionary of the "basic and most frequently used words". Also, the suggested abbreviation for "sex" is "SEX".
> expanding "t" to "the" seems like a no-brainer, just like "st" to "something"

I have jk mapped to escape in vim, and for a key combo that seems like it should never occur naturally, I’m often surprised how often it misfires when I actually need to type “jk”.

Globally remapping hundreds of things like “t” and “st” would actually be quite frustrating I think.

Like imagine you’re emailing your friend about a trip to st petersburg, or about some code containing the variable t, etc.

Try mapping both jk and kj to Escape, then set 'timeout' really low in insert mode so you have to press the keys simultaneously.
>I have jk mapped to escape in vim, and for a key combo that seems like it should never occur naturally, I’m often surprised how often it misfires when I actually need to type “jk”.

I saw that great recommendation somewhere so immediately set that up in vim. But those are my initials, and usually the beginning of my username... So took that out real quick.

-jk

There are a few natural ones that stand out, for example: w/ = with.
> E.g. expanding "t" to "the" seems like a no-brainer, just like "st" to "something". Is there a minimal set of, say, 200-500 of these that could simply be turned into a "standard keyboard" that everyone could learn?

Is it a "no-brainer"?

I would map "st" to "start".

Something is quite a bit more common than start. Probably if you write any long form English, st == something is better.
I would map "Something" to "sth" because that is way waaay more memorable and recognizable.

"Start" is something you use a lot more as a dev.

That's the true no-brainer. Memorable, good mapping.

looks like we have a choice, to see the Cardinals game, would you rather go to Something Louis or Start Louis? Or we could wait till they play the Twins and visit Start Paul at the same time.
A general solution would just be lukewarm for a lot of people.

A chemist might type "dropper" often, 'dp' while a bureaucrat might prefer "department"

> a "universal" version of this -- if you ran it across books and e-mails and text messages from thousands of authors covering diverse backgrounds and contexts, then what would most reliably help everyone

Isn't this approaching llm territory?

No, this is simple statistics. Just list all the words in your corpus in order by how frequently they're used, then use a dedicated software solution like the one given here to make shorthand from it and expand as you type. Machine learning is massive overkill for this, like nuking a fly-- it's a massive waste of resources (time, energy, energy over time, every metric I can think of), and you're going to have targeting issues at that scale (how exactly do you propose to ensure a LLM stays on target and doesn't duplicate answers, make up words, skip words, etc? Are you sure your LLM actually knows what the correct distribution is? If you know it does because you checked, doesn't that mean you already have a word list you can use?)
> No, this is simple statistics.

How exactly is an llm different? I'm not sure it is, just more layers.

I was thinking the exact same thing. That sounds like a small ByT5 LLM model. Upon space you auto-complete the past word based on a moving context window of the past 32 characters or so.
Yes, LLMs and text compression are the same problem: guessing what comes next.
No. Unlike LLMs, it's a simple deterministic algorithm.
I _love_ to see projects like this.

I was working on a similar problem this weekend, but with whole words instead of abbreviations I had made in a dictionary, and in the general case, fine-tuned on any given corpus of text.

I wanted to know: could I write an autocorrect that is "fine-tuned" on a given corpus of text? Use case: I write a lot of docs with long phrases (i.e. "data augmentation"). Could I automate them?

I arrived at:

    1. Calculate "surprisal" of unigrams and bigrams (entropy) from a general dataset (an NYT corpus), give a boost to words in the "fine-tuned" index;
    2. Create a trie data structure that is weighed by surprisals. The more surprising a word, the more weight it gets.
    3. Use that as advanced autocomplete.
I got a working solution here: https://github.com/capjamesg/autowrite/blob/main/autocomplet...

(No docs yet -- coming in the next few days. Leave a GitHub Issue if you want to chat about it!)

This sounds very similar to: https://github.com/wolfgarbe/SymSpell

Or maybe I am confused what you're saying. Are you trying to find more creative ways of saying the same phrase?

I definitely need to write more docs on this project! I will share them when I'm done. It looks like SymSpell is doing spelling correction, which is part of what my code does.

The "surprisal" (information theory: Shannon information) component is doing statistical next word prediction. For example, given a corpus of data in which "data augmentation" is a common phrase, "da" could complete to "data augmentation".

"data augmentation" starts with "da", and would be determined as a likely candidate for the next word because it was common in the dataset on which the statistical model was "fine-tuned".

This Wikipedia page covers the concept in more depth: https://en.wikipedia.org/wiki/Information_content

By the way, this project is _awesome_! My programming language [1] does OCR correction via heuristics (possible because there is a restricted grammar) but this project looks like it could help _a lot_ with improving the accuracy of the OCR output. Thank you!

[1] https://visionscript.dev/paper/

I feel like typing is never really the bottleneck for me except maybe in some chat interactions would have benefited from the extra bandwidth of video or audio. Do you actually save time on task with these kinds of shortcuts?
My main motivation was very fast slack conversations (Can you post a screenshot?) and a bunch of email responses that are pretty formulaic (sending my calendly link, etc).

For longer writing I'm often frustrated that I can think faster than I can type, so it does help with that too!

For longer writing, why not write anchor words on the scratch notes and then flesh out details? Or do you think, that in the flow of ideas, all sentence details need to be jotted down too? Because you feel they come out perfect the first time?
I certainly write outlines first, but when I do sit down to write a full draft I really like to get to something that's "complete" even if it's really bad. Then I can switch into "editing" mode mentally.
Some people write in a "white-heat" fashion.

[0] "The Last Question" ranks with "Nightfall" (1941) as one of Asimov's best-known and most acclaimed short stories. He wrote in 1973:[3]

Why is it my favorite? For one thing I got the idea all at once and didn't have to fiddle with it; and I wrote it in white-heat and scarcely had to change a word. This sort of thing endears any story to any writer. Then, too, it has had the strangest effect on my readers. Frequently someone writes to ask me if I can give them the name of a story, which they think I may have written, and tell them where to find it. They don't remember the title but when they describe the story it is invariably 'The Last Question'. This has reached the point where I recently received a long-distance phone call from a desperate man who began, "Dr. Asimov, there's a story I think you wrote, whose title I can't remember—" at which point I interrupted to tell him it was 'The Last Question' and when I described the plot it proved to be indeed the story he was after. I left him convinced I could read minds at a distance of a thousand miles.

[0] https://en.wikipedia.org/wiki/The_Last_Question

Very interesting. It sounds like you do a lot more repetitive communication than I do. Thanks for explaining.
i wonder if touch typing figures in?
Saving time may be one aspect of it but I can also see it being useful for people suffering from repetitive strain injury / carpal tunnel syndrome.
For me, faster typing isn't about saving time in total, it's about reducing the time between thoughts. Typing is a manual process that hinders my thinking, so the faster I can dip into and out of typing, the faster I can get back to typing.
Very interesting. I once recorded all my vim keypresses to do something similar for vim, but never actually did anything with the data. Seems like it should be easily doable with this project now.
This seems like a really good way to make it so you have a hard time typing on anyone's computer but your own.
I use a trackball and find it makes me more productive and causes less strain

Most other people use a normal mouse

Since I also have a lot of muscle memory using normal mice, I am able to quickly adjust to working on a new PC

Others struggle when they have to take over my PC and show me something by navigating with my trackball

I am guessing this might be similar -- since OP does have years or muscle memory with normal keyboards anyway to back them up

Its fun watching mouse users try to use a trackball. I don't like pair programming but when people ask me to I say sure just so I can see them flail with a trackball and Kinesis keyboard.
I wish decent trackballs were more common. At this point, a good one would run me 100+ euros where I am.

I use a 50 euro Razer Naga X mice at the moment which is nice (with the extra buttons).

If that's something you do then obviously this isn't for you. I personally haven't typed on someone else's computer in at least 13 years. Since whenever I got my first laptop.
You've never had to help someone do something on their own computer that required typing something in?
Ha, nope! I mean, probably, but nothing meaningful. I did the other say and just told the person what to type. But like, I’m not writing code or composing emails or anything.
I use Colemak keyboard layout with blank keyboard keys. If I'm helping someone else on their own computer, I hunt and peck on their keyboard with the handy letters printed on the keys.
guilty as charged. People trying to type on my computer is even worse though haha
It's reasonable to expect everyone is able to use a lowest common denominator.

But, it's unreasonable that you stick to the lowest common denominator if you're going to be using your own setup 99% of the time.

I'd say a bigger disadvantage to non-traditional setups (trackballs, non-qwerty, small keyboards, etc.) is "others won't be able to use your stuff".

It's not a problem for phone keyboards. It's also not a problem for me changing between different regions' keyboard layouts.
That's like saying you shouldn't use a second monitor because then you have a hard time to use anyone's computer that doesn't have a second monitor.

Also don't use any editor other than Notepad.

All of us Dvorak users quietly shed a tear.
I use the native feature for this in macOS and iOS a lot!
That feature is a bit of a joke though, isn't it? It seems to only work for apps that have specific integration with it.

Specifically, * not in terminal * not in Chrome URL bar (but yes in text areas) * not in emacs * not in vim

I'd like a native version very much, but only when it works in most places. As it is now, I'd have to configure many things individually, which is a bit of a maintenance nightmare.

I guess a viable answer would be to use an external keyboard with a firmware under your control. All DIY mechanical keyboards and lots of commercial ones fall under that category. But that won't work for laptops on the go...

https://kapeli.com/dash

Somewhat similar tool to Autokey for MacOS that I use as a text expander.

Allows for great customization - appending ; to a phrase ensures you don't accidentally expand a keystroke into a phrase/URL/etc

";url" expands into "whatever string you configure"

(comment deleted)
yep, came here to comment this, I use backtick wrapping for tons of shortcuts, probably have 50+
Try Text Blaze (blaze.today). It's a Chrome extension, but desktop apps are also available for Mac and Windows.