6 ms·
Programming is a unique field: if you're doing it right, it should never be dull. Frustrating? Draining? Rage-inducing? Sometimes. But not mind-numbing. Why? Be
by quotemstr 10y ago
Programming is a unique field: if you're doing it right, it should never be dull. Frustrating? Draining? Rage-inducing? Sometimes. But not mind-numbing. Why? Because we can build our own tools. If we find ourselves doing repetitive work, we can build a tool to automate that work. This automation is itself likely at least somewhat interesting. What isn't repetitive and that can't be automated should be interesting as well.
If you find yourself bottlenecked on typing while programming, it's a signal that you should stop what you're doing and write some automation or abstraction. Sometimes you can just structure a program so that it requires less typing --- almost always a good thing.
In the rare cases where you need to be verbose in source code, you can use build-time source code generation, or failing that, an editor snippet library. I like yasnippet for that purpose.
Back at Microsoft, NT kernel style requires a big doc-comment before each major function. (These comments are extremely helpful --- but that's beside the point.) The doc comment's style is a bit more complex than Javadoc; there are multiple sections (e.g., description, arguments) and specific indentation requirements within each section.
I found it very annoying to write and format these comments. Instead of just cursing doc comment writing all day, I took a week and solved the problem. I taught Emacs to highlight and indent these comments. I taught M-q to reformat paragraphs exactly as needed. I added code to automatically generate a skeleton description from the function prototype. And after all that, I was never bothered by the doc comment stuff again.
(Incidentally, in a big monolithic IDE, I think the barrier to this kind of extension would have too high to bother with, and I'd have been left cursing this code.)
- z1mm32m4n 10y agoI see where you're coming from, but this tool is still valuable in a number of cases that I don't think you're considering. I recently got a new mechanical keyboard, which had special "layers" for punctuation. "Common" punctuation like periods and commas are still there, but other punctuation like curly braces, brackets, etc. require new key combos. [1] I agree with you that a lot of the time programming requires modifying rather than composing, but not all the time. In particular, I blog in Markdown, which requires a certain amount of extra symbols that I wouldn't normally be typing. (Goes hand in hand with the previous point). [1] You might be wondering, "Why get a new keyboard, if you're typing slower with it?" The new one is easier on my hands, wrists, and fingers, as well as being an actual pleasure to use.
- mgcross 10y agoI built a Planck, and as much as I appreciate the ortholinear layout, I'm having a hard time finding/configuring a keymap that has the necessary symbols somewhere that feels intuitive. I'll spend a couple hours acclimating to a keymap on typing.io, but if I need to an ANSI staggered KB, even for a couple hours, it seems to wipe my muscle memory. Guess I need to buy another Planck!
- mharrison 10y agoKeep practicing. I've used an ergodox for about 4 years with the Norman layout. I am still proficient at qwerty on laptop style keyboards. Though I'm not a musician I assume it is similar to playing two different instruments.
- gedy 10y agoThis is why I went with an Atomic instead of the Planck. Ortholinear, but very close to a "normal" keyboard in the layout.
- widforss 10y agoI use a special dialect of Dvorak, called Svorak A5 [1]. I think it is somewhat similar to what you describe. It is really liberating to have special characters on the home row. [1]: https://i.imgur.com/YKojP7B.png https://i.imgur.com/YKojP7B.png
- chjohasbrouck 10y agoThis is why no matter how much sense it makes to use something like vim or emacs as your primary development editor, I could never justify the amount of time it would take me to actually be totally comfortable and start seeing benefits (beyond just using it for small quick edits at the command line). Typing speed is never the bottleneck. You could double most developers' typing speed when they code and it'd probably have a negligible impact on their overall productivity. There are benefits, but do they really outweigh the benefits of those same hours spent studying a data structure or design pattern or trying new tech?
- dman 10y agoI agree this things like typing speed and a good editor should not matter but in reality I think it does. I think the state of programming flow is very hard to get into, and very easy to fall out of. In fact the easiest way I find myself getting out of state of flow is if I find myself doing something mundane. Anything that allows you to do more while you are in the flow, or lessens the chance of breaking out of it is valuable in my opinion. Will share an anecdote here - before I started using clang-format for formatting my code, I expected that adopting it would merely save me the time I spent formatting. On the contrary what happened was that it has almost completely changed the way I write code when I am in flow since I now no longer have to worry about having to make it look good. In retrospect I now find that in the past I would often spend crucial parts of my programming flow doing mechanical indentation of code and doing such a mechanical activity was often a ripe target for me to fall out of flow. My typing speed and accuracy are both pretty low, when and if I correct that, I hope to have a similar efficiency gain as I did when I adopted clang-format since I won't be falling out of flow for mundane things like typos. Not every moment spent programming is equal, and in my humble opinion it really helps to invest in making your "special moments" more productive.
- dasil003 10y agoIf you don't think vim or emacs is worth it then fine, but you're setting up a strange false equivalency between learning new concepts and learning new tools. The fact is, you can't program without tools, and practice will make you better with the ones you choose. If you only ever learn new patterns and algorithms and just type your code into Notepad then you will be handicapped as a working developer. Personally I choose vim for the exact reason you choose not to: that is I want the ability to edit files in any language on any system I touch with maximum efficiency. This accelerates my ability to try new languages because I don't need to rely on language-specific tooling. Also, vim has more longevity than many design patterns which are susceptible to obsolescence by new language features, and new languages themselves which have a half-life proportional to their age.
- dxhdr 10y agoBeing able to type quickly and accurately is enjoyable. It lets my brain stay focused on what I'm writing rather than how I'm writing it. No context switches necessary, no mistake every 10th key; typing should be fluid and easy. I highly recommend improving your keyboard skills if you struggle with touch typing. That said I agree that "Typing Practice for Programmers" on "SpeedCoder.net" is a little silly. Just learn to use a keyboard (and learn to spell, that helps too).
- jacoblambda 10y agoHonestly I believe that a programming specific typing practice program such as this one does serve a purpose as even though I can type well in a normal setting, I am much slower with many of the special characters as they just aren't used as much outside of the programming environment.
- manojlds 10y agoActually, this doesn't seem helpful at all. Rarely am I typing the entire program without any autocompletion and intellisense based assists.
- simias 10y agoThose generally complete identifiers, not the various symbols like "->" "*" "&" "{" etc... So I think the parent's point is still valid. If anything autocompletion increases the symbol-to-letter typing ratio.
- manojlds 10y agoI use snippets, expanders, zen mode etc. Lots of people do too. Typing has never been the issue for programming really.
- paulddraper 10y agoI'm awful at typing. My friends make fun of my rapid chicken-pecking. I shrug and say I don't type enough to mind.
- vacri 10y agoI encourage you to drink heavily. A friend of mine learned to touch-type because he came in to work hung over too many times, and felt queasy switching between looking at keyboard and screen... so it made him learn to touch-type...
- junke 10y agoYour advice is "drink heavily"? Is this a kind of joke?
- dualogy 10y agoSure but the more you do this, the more tools/commands/libraries/modules have to ideally both document and remember, realistically neither.. Cognitive overload. Shell commands with their args ... core syntaxes for half a dozen languages ... a couple base class libraries and 0-2 frameworks for each ... plus all your own abstraction/automation stuff on top? Admittedly this all used to be quite a bit simpler back in a sole "Win32-app world": VisualStudio+MSDN=done, no shell to speak of, no web layer / stack, One GUI Way, etc. But 15-20-years-ago ain't coming back for at least another decade.
- tacon 10y agoFrom the preface of The Productive Programmer[0] by Neal Ford: "Many years ago, I taught training classes for experienced developers who were learning new technologies (like Java). The disparity between the productivity of the students always struck me: some were orders of magnitude more effective. And I don’t mean in the tool they were using: I mean in their general interaction with the computer. I used to make a joke to a few of my colleagues that some of the people in the class weren’t running their computers, they were walking them. Following a logical conclusion, that made me question my own productivity. Am I getting the most efficient use out of the computer I’m running (or walking)?" [0] https://www.amazon.com/Productive-Programmer-Theory-Practice-OReilly/dp/0596519788/ https://www.amazon.com/Productive-Programmer-Theory-Practice...
- trentnelson 10y agoCutler Normal Form! I love it, use it exclusively now on all my projects. _Use_decl_annotations_ PVOID TraceStoreAllocateRecordsWithTimestamp( PTRACE_CONTEXT TraceContext, PTRACE_STORE TraceStore, ULONG_PTR NumberOfRecords, ULONG_PTR RecordSize, PLARGE_INTEGER TimestampPointer ) /*++ Routine Description: This routine allocates records from a trace store. It can be considered the TraceStore-equivalent of a calloc()-type interface, in that the record size and number of records are specified rather than the total size. The memory to satisfy the total size is sourced from the trace store's active memory map. If sufficient space is available, allocation is simply a matter of adjusting the relevant pointers and returning. If the required size can't be satisfied by the remaining memory in the map, this routine consumes the "next" memory map that has been prepared asynchronously in a threadpool if one is available. If the prepared map is not yet available, the allocation fails and NULL is returned. N.B. This routine should be called indirectly through the TraceStore's AllocationRoutine function pointer. The total size that can be allocated is limited to the maximum size of the memory map. The allocator is geared more toward lots of small allocations versus larger ones. Arguments: TraceContext - Supplies a pointer to a TRACE_CONTEXT structure. TraceStore - Supplies a pointer to a TRACE_STORE structure that the memory is to be allocated from. NumberOfRecords - Supplies the number of records to allocate. The total size is derived by multiplying RecordSize with NumberOfRecords. RecordSize - Supplies the size of the record to allocate. TimestampPointer - Optionally supplies a pointer to a timestamp value to associate with the allocation. When non-NULL, the 64-bit integer pointed to by the variable will be written to the allocation timestamp metadata store. This should be NULL if the trace store is a metadata store, or if the trace store's traits indicates that it is a linked store (implying that allocation timestamp information will be provided elsewhere). Return Value: A pointer to the base memory address satisfying the total requested size if the memory could be obtained successfully, NULL otherwise. --*/
- quotemstr 10y ago