
Leveraging A Poor Memory In Engineering - jeffshek
https://senrigan.io/blog/chasing-10x-leveraging-a-poor-memory-in-software-engineering
======
matt2000
I'm about 20 years into my programming career, and have been programming
around 30 years total. I am very fast at lots of tasks now, but it has
happened in a way that would be totally surprising to my younger self: I don't
waste time doing stuff that doesn't matter.

I used to assume that the "10x engineer" was 10x faster at the
programming/typing part, but it turns out it's more like identifying the
1/10th of the work that actually matters and just do that efficiently. It is
also true that there's a lot of experience in both the identification of that
10%, and the efficient execution of it though.

Side note: I have also met a few flat out amazing, natural programmers. These
people can also be 10x as productive, but it's in a pretty specific way that
should probably just be considered an outlier. My feeling is that the main way
for the rest of us to achieve that level of productivity is gain experience,
do things simply and efficiently, and learning how to focus on the things that
matter.

~~~
lifeisstillgood
I believe you and would be interested in your list of things that matter?

~~~
zarkov99
Not the OP, but my experience matches his and for me the following are
particularly important:

\- Getting the requirements right. This by far has the most impact on
effectiveness

\- Reducing friction. Simple things like proficiency with high quality tools,
smooth and fast builds, clean logs, easy ways to generate and analyze core
dumps, accumulate to produce an outsize effect on productivity.

\- Uninterrupted, substantial blocks of focused time. It is staggering how
easily chat, email and meetings can destroy productivity.

~~~
matt2000
I was attempting to answer this elsewhere in the thread, but I totally forgot
about uninterrupted time. This is a huge one, it really matters.

Quick tip: For people who work in a company where they don't necessarily have
control over their own time: schedule the living ____out of your calendar.
Book endless meetings with other programmers, then just sit there and do work.
"Q2 Backend Architecture Review: 4 hrs" can just be a few people sitting in
the meeting room programming. It's crazy the power of blocked out time on your
calendar to a manager who otherwise sees an empty day.

~~~
jeffshek
This is a hilarious and amazing tip.

Another way I've tried to tackle this is on day 1 of a job - I've blocked out
a huge chunk (4 hours) of my daily calendar of "Coding Time - No Meetings, No
Slack, No Email" before anyone could tell me no.

------
swfisher
To be honest, it sounds like the author’s primary productivity issue is not a
poor memory for syntax, but a stack of time wasting habits attached to the cue
of looking up syntax. This has everything to do with our relationship to
attention and focus.

The way the author managed to reduce the impact of this habit was to remove
the cue for wasting time by memorizing syntax. Congrats on that! This seems
like a pretty demanding solution, though.

Perhaps a very simple way forward would be to employ a site blocker on
distracting sites during work hours.

Beyond that the author might regulate their work hours so that they have
limited time to get things done and avoid burnout from long days.

They also might consider using a pomodoro technique, so that their brain can
alternate between focused and relaxed attention. Setting boundaries around
when it’s time to focus and introducing a purposeful schedule of relaxing
breaks helps keep one from falling victim to bad habits when your brain needs
a moment to relax.

~~~
mck-
Just what I thought. Sounds like author has awareness of the problem, but
decided on a rather difficult solution.

You can still get into flow while looking up syntax you haven't committed to
memory, but know how to find in 2 min.

I have a habit not to commit anything to memory that I could Google in 2 min,
saving on RAM.

~~~
randallsquared
Two minutes? If I'm in flow (a very rare occurrence these days, sadly), five
_seconds_ is on the cusp of too long. In my editor, spending time looking
through the list of autocomplete suggestions is often enough to lose track of
some of the things I had mentally stacked up to write. Switching to a browser
to find docs risks the whole stack.

One way I've found to mitigate this is to not try to write things that that
would definitely work on the first draft. Instead, whenever I need something I
don't remember, I just write enough of it to note what I'm trying to do and
keep going. The details of whether it would be more convenient to use slice or
substring here aren't important when I'm trying to write things down before I
forget them.

------
Felz
Memorizing APIs is... not how I'd approach productivity, but if it works for
you, great.

I'm doing a lot of Kotlin right now, where simple, useful extension functions
are an autocomplete away. I don't need to memorize how to get a slice of an
array; I know it's going to be named something like .slice(), and I can jump
right to the documentation from my IDE.

When I run into something not in the standard library, I write a little
extension function of my own. And then I remember it the next time I run into
that problem, and get to reuse it, just like it were part of the language.

~~~
xtracto
I am a generalist. After programming in A LOT of languages through my 20+ year
career, I have given up in memorising any language specific features (APIs,
syntax, etc)

Every time I need to write something in a new language, I grok it and write on
it with a handy syntax /API/SDK reference.

For me, The things worth remembering are the patterns used to solve stuff, not
how the patterns are implemented in a specific language

~~~
JustSomeNobody
I mostly program in C#, python and JavaScript. By mostly I mean slightly more
than half the time. The rest is old C++, old Java, old Perl, BASH, etc. I gave
up a long time ago trying to remember the APIs/Libraries for all of those.
Most programming is doing something slightly different to some other thing you
have done before. I make it a point to remember how I do things, so that no
matter the language, I can get it done. This also helps tremendously with
estimates.

------
knight17
Similar to this post, Jack Kinsella has written how he used Spaced Repetition
Software to learn and keep programming knowledge in the following articles:

[http://www.jackkinsella.ie/articles/janki-
method](http://www.jackkinsella.ie/articles/janki-method)

[https://www.jackkinsella.ie/articles/janki-method-
refined](https://www.jackkinsella.ie/articles/janki-method-refined)

[https://drive.google.com/file/d/1JCHkqVoX598Ob_111khrGoJ5cpe...](https://drive.google.com/file/d/1JCHkqVoX598Ob_111khrGoJ5cpeh_ahU/view?usp=sharing)

Derek Sivers also has written on memorising a programming language using SRS
software: [https://sivers.org/srs](https://sivers.org/srs)

One important thing in the original article is about flow, or the feeling of
being in the state of flow if you don't need to remove yourself from the task
for looking up documentation. I think that is a worthy goal to aim for but I
am amazed at the amount of cards he has created, nearly 10,000 over a period
of three years. He has put in lot of effort and reaped the reward.

------
dorkwood
I used to think memorising facts was a waste of time.

I'd say things like "why would I spend time memorising facts when computers
can do that for me?" I thought there was a stark difference between
"memorisation" and "understanding how things work". The former was for people
who wanted to pass tests, and the latter was what smart people dedicated their
time to.

What using spaced-repetition software has taught me, however, is that
memorisation and understanding are tightly coupled. Storing facts in my brain
increases the amount of connections I can make, which greatly improves my
ability to think.

~~~
doctorcroc
This hit upon a larger issue within the programming community - the idea that
the brain's abilities can be reduced into discrete parts (see the comment
about how a programmer's CPU is the bottleneck, not I/O). While computers may
work this way, humans are a lot messier, and an improvement in I/O may
actually lead to better compute, as you allude to. Any form of mental
enhancement can improve all functions of the brain - it's a beautiful organ.

------
DanielBMarkham
Wow. This sounds a lot more like grinding than programming. Memorizing APIs?
Seriously? What happens when it changes next year?

Echoing another commenter, every line of code you _don 't_ code is coded
infinitely-faster, doesn't need testing, and you'll never have to review or
maintain it. Programming should be the art of surgically using just the right
amount of code in just the right spot to provide lasting value, not filling
out forms, wiring interfaces together, or thrashing around online searching
for other lost souls. Yes, we all end up doing that kind of work -- but that's
a fail, not a win. The more we horse around with our tools, the less we're
helping people.

Video games took over the world. That is, everything became a video game, with
a sexy UI, enthusiastic community, cheat videos (and classes), and outward
signs that you've leveled up.

This makes sense, I guess, if you're goal is to play the game. And whatever
you're doing with computers should definitely be fun. But when interacting
with the computer is a tool you're using to provide something to somebody
else, the longer you spend with the computer providing that value the less
efficient you are. The best code is no code.

Somehow this author seems to think that being a great programmer is due to
mechanically-interacting with the programming environment. The 10x types
faster, remembers more, and has mad skills at the IDE. This would be utterly
silly if we were talking about great novelists -- how many words they type per
minute, for instance -- but somehow it seems to make sense for coders.

------
inertiatic
If what was holding you back from being a 10x engineer was not remembering
syntax, then you're already there.

Myself I wish to not remember things of this nature. My IDE can autocomplete
my code with API references. My terminal history is set to infinite so I can
grep for whatever command I found useful in the past.

I instead want to spend my time and memory on deepening my understanding of
certain topics, or on brushing up on concepts and techniques I've known in the
past but have come close to forgetting.

~~~
heavenlyblue
The truth is that if you’re familiar with a few families of languages - you’ll
reinvent the syntax on the go: “if I myself wanted to implement a feature I am
about to use - which syntax would I converge upon?”.

If you’re working in an IDE you’ll also have a realtime hint on whether your
guess was the correct one.

------
andrew_wc_brown
Yes! Space Repetition Learning is amazing.

For me its wasn't about becoming a 10X developer but proving that I was
already 10X because I was facing a salary cap of 120K CAD where I saw friends
working as long as me 180K+ CAD and some 250K+ CAD. The last job I attempted
we had a 55 year old developer being paid the same as me doing the same rot
work and I said thats not going to happen to me.

I've always been a person that gets things done but when you asked me how I
did it I could never regurgitate the factoids.

Interviewers or other developers thought I was stupid/faking because their
probing of my knowledge came down to superficial factoids and not evaluating
the past work as a whole where I literally have 30+ projects. Hiring is broken
and instead of getting upset about it you just have to meet the checklist.

I have Cracking the Coding Interview and I've been through that book 3x and I
can not remember the contents of it because that book has been more more
useful to me to prompt up my monitor than in my in the day to day work.

I feel when you're a developer 10 years in you'll be forgetting things as
quick as you learn them but proving you have in-memory knowledge is super
important.

I use Anki and Mnemosyne but found their UIs clunky and so I built my own
Space Repetition Learning flash card system. I was studying for AWS
Certifications and I wanted a way to tied practice exam questions I wrote to
flashcards so when I got questions wrong it would reload my deck, and one I
memorized all the factoids via space repetition learning I could go back and
attempt a practice exam.

Now when people ask me whats the different between RAID 0 vs RAID 1 I know
which is stripping or mirroring.

I got so carried away building my study system it because my own startup
called ExamPro: [https://exampro.co](https://exampro.co)

Its really nice to have something you can build where you actually have domain
knowledge and its the first time independently where I was successful building
a startup that has generated revenue.

I could build anything but without domain knowledge I could never sell what I
could build and now I can and its wonderful.

Space Repetition Learning changed my life. Who knew?

~~~
gridlockd
Is hiring really _that_ broken? Not everyone hires like that and if they do,
maybe they're no good to begin with.

I keep hearing how the interviews at Google are really tough, but then a lot
of the people who actually get through quit in the first weeks. It can't be
_that_ great of a job.

~~~
rabidrat
Yes, hiring really is that broken. Everyone who is a player who is openly
"hiring" is playing that same game. "if they do maybe they're no good to begin
with" is sour grapes, and while it may be true, it's also true that almost no
company is good. But they have the money and I need the money, so.

Speaking of which, "it can't be that great of a job"...no, of course not, it's
a job. But a job is a job (roughly speaking), and a $300k/year job is to
many/most people twice as good as a $150k/year job.

------
jplayer01
I've actually recently tried Anki when I was forced to learn Javascript and
knew I would be using it so rarely that I knew I'd end up regoogling, re-
researching, relearn Ing the same facts/solutions over and over and over
again. It was a revelation. Suddenly I could, in a systematic way, codify
whatever new thing(s) I learned in a way that I knew I wouldn't forget it
again. It was incredibly freeing and I noticed the difference it made day-to-
day when I did have to use JS.

The important thing is that these cards aren't static. As your knowledge
improves, as you gain practice, you'll notice the cards that aren't written in
a way that are conducive to flash card learning and (ideally) you end up
pruning and refining the process until it works. This requires a non-
insignificant amount of dedication though.

~~~
canaus
I don't understand. Did you have to create the card deck in Anki or was there
someone else who created one, which you used?

I just can't imagine using flash cards, or a similar product, to learn
anything in-depth about a language. Maybe API specific problems, but nothing
more.

~~~
jplayer01
I made my own. Every time I googled something or learned something new, I
added a flash card. It could be anything. I added a _lot_ while reading a book
about learning Javascript. It's just something I had to figure out once I
decided I wanted to use Anki.

I have cards like asking what a closure is or how to use one, or what an IIFE
is or how to use one. Or what IIFE stands for. How to deconstruct an array or
an object. What's the scope of a variable defined with "var"? How does it
differ from "let"? How do I list all the properties of an object? How do you
access the properties of an object? When should you use bracket notation to
access a property of an object? I have a bunch of syntax ones or basic ones
ones like what's the equivalent of a Python forEach.

Somebody else might decide to have completely different questions. I tried to
codify every little thing I learned while using Javascript, where others would
consider it overkill. I've already deleted plenty of cards where I I felt I'd
internalized the knowledge in a way that I don't need a flash card for it.

------
mannykannot
Doing one's daily work includes a certain amount of repetition, and this can
be leveraged into a learning program. When you learn something surprising, or
have to look something up, you have a candidate for a flash card. Also, when
you fix a bug in your own work or find you have to rewrite some of it, don't
just brush it off as an inevitable part of development, or call it
refactoring, but ask yourself if there was something that, if you had known or
considered it in advance, would have helped getting it right the first time.
If there is, it might include something that could be put on a flash card, and
even if not, the analysis will help you develop good judgement (10x people do
not generally spend a lot of time fixing or reworking their own stuff, because
their first passes are often good.)

Another source of flash cards from any books or articles you are reading: any
key point that is new to you, or you had forgotten, might go on a flash card.
It's more effective than bookmarking or highlighting (when starting on a topic
that is completely new, you might want to limit your notes to those points
where you had to pause to think about what you just read.)

------
emerongi
The key with documentation is knowing where to look. If you are Googling for
documentation every time you need something, I think you're doing it wrong. I
always go straight to the source documentation and often I go to the source
code itself if the documentation is ambigous. JS is probably the only language
where I don't know a "true source", so I just go to MDN.

~~~
jplayer01
I'm not sure this is helpful. I know exactly where to look. I still end up
having to break my train of thought and the mental model that I'm in by
opening the browser and navigating to the precise location where I know the
information I need is. Then I need to refocus on the task I was doing before.
Multiply this by hundreds of times throughout the day and it seems to me like
a huge productivity loss. I used to be against rote learning of any kind, but
nowadays I'm not sure. There's too much meaningless minutia that we need to
learn or use while programming.

------
gridlockd
It's nice for "Kyle" that he has a photographic memory to remember all the API
names and incantations. Spaced repetition will not give you that.

If I have to google "how do i amend my git commit" five times every month,
that's actually the best use of my time. If I only need it five times a month,
spending ten seconds to look it up is more efficient than making it part of
some sort of spaced repetition learning scheme.

I would say the same is true for virtually all of programming. If you really
need it all the time, you automatically learn it by looking it up all the
time. No flashcards required. If not, just look it up. The guy with the
photographic memory will always win, he'll remember it the first time. Again,
no flash cards required.

~~~
Noumenon72
Actually you just convinced me that the first thing I should try this with is
git. I _do_ look up that stuff all the time because none of it makes any
sense. Since I will never intuit it, I might as well memorize it. Never had
this problem with Mercurial.

------
swfisher
To be honest, it sounds like the author’s issue was not really forgetting
syntax but the stack of procrastination-related habits that were attached to
looking up syntax. It sounds, at face value, like what folks describe as ADHD.

------
maxme2
I use Anki for improving my memory on different topics; philosophy, geography,
etc. I'm currently using it to prepare for the french motorcycle exam and
that's the first time I had to write my own cards.

I'm a software engineer and I feel like I'm forgetting a lot of things that I
learned during university and during my carreer (algorithms, architecture
models, design patterns, etc.). This feeling is very frustrating. I never
thought about using Anki professionally and I'm gonna start to add some algo-
related cards to Anki right now.

Note: I also recommend "learning how to learn",
[https://www.coursera.org/learn/learning-how-to-
learn/](https://www.coursera.org/learn/learning-how-to-learn/) \- give some
simple techniques and tips to be better at learning (spaced repetitions is one
of them, learn by chunks, force yourself to recall, etc.).

~~~
vitaminCPP
While I can see why you would use flash cards for learning geography (more
factual), I'm not sure how you could design a card to explain a data
structure. Any idea ?

~~~
maxme2
One example I had in mind when I said I was forgetting algorithms and data
structures was about Skip List -
[https://en.wikipedia.org/wiki/Skip_list](https://en.wikipedia.org/wiki/Skip_list)

I did an implementation of a skip list a long time ago (and I found the
algorithms to insert, search, etc. quite simple and elegant). Recently I had a
chat with someone and I was struggling to explain them.

I could design a few cards for skip lists:

\- Question "ELI5 skip list" Answer "the actual ELI5"

\- Question "What sort of problems are solved by skip lists?"

\- Question "How to make a skip list indexable"

\- Question "How to insert the element 123 in a 3 levels skip lists [1, 4 - 4
- 4, 43, 120, 210 - 210, 302]" <\- make a better ASCII scheme. etc...

Answers can be quite long. For the french motorcycle license, some answers can
be very long (2 or 3 pages) and it works pretty well for me (see
[https://ankiweb.net/shared/info/1156061502](https://ankiweb.net/shared/info/1156061502)).

When you train: after reading the question try to recall the answer in your
head and then read the answer. Then you evaluate how good you were recalling
and you pick the Anki "score" (bad, hard, good, too easy).

------
mfranzs
Spaced Repetition has also transformed how I learn. It lets me be decisive
with how I understand concepts and lets me focus much more on long-term
learning.

However, I agree that it's more useful to memorize/internalize concepts than
syntax. One of the limitations with anki/supermemo's flashcard-based design is
that it's hard to break down complex ideas because you're limited to the
flashcard format. I've built a new tool that lets you generate flashcards
right from your notes to make it easier to break down new ideas. It's called
RemNote: [https://www.remnote.io/](https://www.remnote.io/).

My memory was pretty terrible before I started using this and that problem is
now largely solved :)

------
jasonkester
I'm a good programmer with a bad memory, but I went a completely different
route to the guy in the article:

Better Tools

He talks about having to google things all the time, and memorize how to do
things in his language. But that's the IDE's job.

Good tooling knows everything about the language you're using, and everything
about your codebase and everything about every library you've ever used. If
you want to do something with a File, you shouldn't ever need to remember
anything more than the word "File". Type that, then ctrl+space, and the IDE
will get you to the point where muscle memory can take over.

For other things, I just cheat. I have "\r\n" written in felt marker in the
corner of my keyboard, because (since I'm also a bit dyslexic) I can never get
the slashes in the right direction first try. This isn't my dev laptop, so I
just got them wrong typing them out above, and had to google to verify.
Despite having used them on a daily basis for 20 years.

But anyway, back to the point: Tools can and should replace nearly all the
memorization that most people in this gig seem so proud to have done. So long
as you're good at the problem solving bit, a bad memory won't hold you back.

------
lifeisstillgood
A little equation for you

P = ( U * O / F * C ) + S

P Productivity

U Understanding of the codebase

O Ownership - degree to which you feel you can make significant changes to
code with minimal approval

F Fear - degree to which you are concerned about mistakes costing you your job

C Complexity of codebase

S Your actual skill set

Yes I think Skill is not a multiplier in almost all cases

I suspect ownership and fear are actually exponents as well.

------
EndXA
Anki really is a great tool.

Tip for people looking to use it: you can find premade decks (collections of
flashcards) on various topics on the Anki website. For example, here are decks
that are available under the 'Programming' topic:
[https://ankiweb.net/shared/decks/Programming](https://ankiweb.net/shared/decks/Programming)

Not all of these decks are great, but there's a rating system, and this can
sometimes be a helpful starting point for your own decks.

------
ebiester
Before heading to management, I chased this as well. I found that people who
keep a personal wiki and documentation get the same benefit. It’s a great way
to organize your knowledge, and keep Anki to things like syntax.

However, the next gap is learning to reason about these things from first
principles. It’s the “10x” commonality and I believe it can be learned, but it
takes a different set of tools.

(My book will come out one day. ;)

~~~
jiaweihli
What does reasoning about things from first principles mean?

~~~
mypalmike
I once worked with someone who didn't understand the program stack whatsoever,
leading to code that was (slowly but surely) infinitely recursive. Using
flashcards to remember to use .put() versus .append() in some API is not
really that person's path to 10x engineer.

------
Ziinc
If you're planning to go down this route to use Anki to sequence your SRS
revisions, I recommend checking out this plugin that I created a few years
back:

[https://github.com/Ziinc/gsheets_importer](https://github.com/Ziinc/gsheets_importer)

It basically scrapes a published Google sheet that has a list of links. Each
link needs to be a Web page with a html table. The plugin then scrapes each
link, using the left side of the table as the front of the card, and the right
side as the back of the card. All formatting is converted into inline css, so
you can write code formatting as well. Though if you were writing actual code,
I suggest writing it in markdown and then publishing it then adding it to the
sheet, instead of using a published Google doc.

I use it for university and it reduces the time spent formatting each card
individually into Anki.

So far it's the most efficient workflow to creating Anki cards that I know of.

------
typon
I really need to do something like this for Rust. Ive been coding it for the
past few months and still couldn't tell you off the top of my head what the
subtle differences between Rc, Refcell, Cell, Box, RwLock and Mutex are. Now
there's another one called Pin and I can't figure out where exactly it applies
either.

------
FearNotDaniel
Leveraging doesn't mean what you think it means. You apply some force (e.g.
poor memory) to one end of a lever, with the effect that the force is
multiplied and turned to an even greater advantage than it was without the
leverage effect. This is an article about _overcoming_ poor memory, which is
the exact opposite.

------
gerryeng2
My more productive 10x days has little to do with programming syntax. These
are days when I focus on gaining clarity on the problem/objective and writing
the least amount of code to solve the problem.

Writing less code requires extensive knowledge of frameworks, patterns and
best practices. Memorizing programming syntaxes and paradigm makes getting in
the flow easier because of reduced context switching, makes work more fun and
hence greater productivity (10x days). But at the heart of it, being
productive requires understanding of the problem domain in depth, knowing what
matters and what doesn't (YAGNI and pareto-ing mercilessly).

------
sowbug
To those questioning the benefit of rote memorization of API signatures and
other factoids that are always just a click or hover away: would you say the
same about vocabulary words when learning a new human language?

~~~
anjellow
I always thought those "factoids" were silly. There's a massive bandwidth
difference between a few clicks and instant recollection.

------
hobofan
> Yes, I tried Dash

I'd be interested to hear what your problems with Dash were.

I also have the problem of an extremely bad memory (and I feel the more time
I've spent thinking about abstract concepts the last years, the worse it got),
but I've never really felt that this held me back. Looking up API
documentation makes up a negligible portion of my time working, and especially
with Dash, that has been reduced to a non-issue.

------
hartator
Whatever works for you. Reading books in a relaxed environment works best for
me.

------
reddit_clone
Add ADD related working memory issues to this, life gets really interesting :(

~~~
83457
If by interesting you mean eternally frustrating... agreed

------
fma
I also have terrible memory. If I'm coding something and forget some pattern
(not sybtax, because the IDE handles that...) I just do a quick search of my
code within my IDE.

I have a One Note for frequent queries.

------
lewantmontreal
But how can you write small snippets of code into Anki flashcards, and be able
to use it on mobile (no plugins)? Every time i try you need to either write in
HTML or lose formatting completely.

------
kissgyorgy
I used Anki for years when I started programming 6 years ago. Here are my tech
related decks:
[https://walkman.cloud/s/58jBymwC6fDmFAC](https://walkman.cloud/s/58jBymwC6fDmFAC)

It helped me a lot! Lot of my co-workers said that I learned faster than
others in the same timespan, and I think it was partly because of Anki.

------
cronin101
Not sure how much you care, but your example for .slice() is wrong.

.slice(1,3) will give you elements two and three. You're looking for
.slice(0,3)

~~~
0815test
It gives elements one and two. That's one _to_ three, non-inclusive. If we
wanted elements one _thru_ three, that's a different matter.

~~~
cronin101

        [1,2,3].slice(1, 3)
        > [2, 3]

