Ask HN: What is your learning strategy?
I am a software developer and I have been a part of the software industry for almost 5 years. I have trouble developing a learning strategy.
In the beginning, it was easy. I needed to learn the basics of things. How to write object-oriented code in Java, how to build a docker image, how https works, basic Unix commands, etc.
However, now, I feel that I need to know a lot of things. When I check my current skills, future goals, and job descriptions, the list of stuff I must learn is extremely long. AWS, advanced stuff in Go, distributed system theory, databases, queue systems, Istio, other fancy CNCF tools, networking in Linux, k8s controller patterns, oncall stuff, gRPC, authentication/authorization mechanisms, managing a REST API, scaling something with zero downtime, observability etc. I am already using some of these tools/techniques in my full-time job but it is impossible to experience all of them in a position. On the other hand, as far as I see, I am supposed to know many of them.
I am aware that my choices are going to deeply affect my path/opportunities in the future. For example, k8s controllers are a very niche field whereas being a skillful Go developer comes with more and more opportunities. To learn the theory of fundamentals is a relatively long-term investment.
Additionally, my time is limited. I am already spending some part of my weekends and nights to learn something new but it is very exhausting. I literally love developing software but it doesn't seem sustainable to me in the long run if I cannot develop an efficient/focused learning strategy. I'm afraid to fall behind the industry.
So, what is your learning strategy? How do you plan your time to learn something new? How do you pick a subject or tool to learn?
p.s. I am aware that having a full-time job that teaches you a lot is the most critical part of this strategy.
104 comments
[ 3.0 ms ] story [ 188 ms ] threadYou should rather focus on what you NEED to learn, don't get caught in imposter syndrome. Because you mentioned you have a full-time job already, You only have a limited time. Juggling and switching into lot of things will affect your productivity.
For me, I evaluate first what I want to do and then search the technology available around it. Then, I make a list of what I need to learn and I start with one, gradually.
One other thing that I realized after being in the field for 8 years is that it is becoming more difficult for me to learn in general. When I first started, I could repeat almost all key pieces of information from a meeting verbatim.
Often, a basic, naive solution will give you the understanding and domain knowledge you need to be able to read what others have said about the same problem.
It also allows you to more easily dive into the solution as implemented by popular open source projects. Even if they don't write about it, you can often learn a lot from the code -- even more if the rationale is written in comments in the code.
For example, let's say you're contemplating how to implement an audit log for your product. You've never done this before, but you're experienced enough to know that you might hit unexpected hurdles (such as features that are difficult to implement) well into development, or maybe after deployment. Something you might do is research commercial open source products which have an audit log, and read their code to understand how they did it and perhaps why. Another way you can figure out the rationale is by looking at their full set of features and asking yourself how might each feature be implemented in an alternative implementation. If alternative implementations don't work well with this feature, this could provide an answer for why they chose this implementation over the other. And then finally, you can ask yourself if you need these features, which brings you answers to the original question of what are your objectives.
Or the short version: there are indirect ways to learn from the experience of others. Looking at a battle-tested implementation of a feature you want to add is one -- and it's perhaps even better (= more enlightening) than reading some blog posts you might find.
In reality you need to compromise, but by keeping the scope of learning projects artificially small you learn a lot about that one aspect and the trade offs involved.
For example when I wanted to learn more about testing for front end applications in Angular, I wrote all types of different tests for a small sample project. By doing that and reflecting on how I could incorporate all those tests at work, I learned a lot about structuring my code to be more testable, when and how to use mocks, Angulars built-in testing utilities and much more.
By going very narrow it's easier to go deep. You won't learn about all the side effects and interactions with decisions in other areas, but at least you know more options and can try to find a better optimum.
"I have no special talents. I am only passionately curious."
For my personal projects - I set up the Linux server, I set up the MySQL/MariaDB instance, I design the database schema which follows first normal form, second normal form. I design the REST API in Python, then I get to my normal job of coding an app for one platform. Plus I do the graphics, which normally the design group does. I also do the advertisement on Google Ads etc., I pay the bills and do the accounting and so on. So it goes beyond even tech skills.
Thomas Huxley said a good liberal education is to know something about everything and everything about something. I am not an expert in creating ads on Google, Twitter etc., but I have done it and know something of it. Same with sizing or dropping graphical icons. Or designing a database schema. Or figuring out my side project cash flow, profit and loss, having my accountant help me set up an S corporation. This is all the knowing a little something about everything.
In my day job I primarily use one programming language to target one platform. In this subject I go deep and really try to learn as much as I can. This is what my main focus is on, learning the language well, and learning the platform well.
I should also point out, the smaller a company is, the more hats you will wear. I worked at a small company where I wore not only a programmer hat but a devops hat. I set up Google Cloud, Firebase Firestone, Apache web server, and wrote and modified Python scripts. At a larger company (where I am now), 99% of the time I do none of these things (actually they like I have these skills and can interact with our devops team). It doesn't take long for specialization to kick in either, by the time of the second tech hire you're already dividing up work. It is important to know your main focus well on job interviews though.
In short, if you produce more, you will automatically learn more.
Now, what to learn depends entirely on your choice, also for me, I am Ok to quitting if I don't like any course.
To pull this type of advice off consciously though seems to be quite tough, but it might serve as some guideline.
Why do you think of that? were you hired as the person that knows all of them?
Remember that as software engineers, our job is to solve problems. It doesn't matter what technology, language, or framework as long as you bring value on the table.
The question is what is it that you want to learn? based on that you will figure out what you need to learn and how you will be providing value to future employers.
Personally, I'm heading for a senior position. As a senior (in my current company, may vary from company to company) is to enable others, unblock from potential issues and mentor them on best practices and core values. Based on that, I choose where to focus my learning and what to read/research next.
Of course, I am still a software engineer and still need to learn new technologies maybe or refresh my current knowledge. I do that by reading newsletters, blogs and spending time outside my working hours to those. I will choose to go deeper into a particular technology if I think that it will bring value to our current stack. That's not required though and you can demand from your employee to provide that time for you. I'm doing it because it's my choice to do so.
Mastering the black art of literally repeating what people say back to them is worth a bit more than any single technical skill.
As someone with 35 years of experience, this is the voice of wisdom.
2. Give them an opportunity to clarify if you didn't quite understand.
> Remember that as software engineers, our job is to solve problems. It doesn't matter what technology, language, or framework as long as you bring value on the table.
What I observe in the industry is different. The market is so fierce and competitive and many companies (especially non-enterprise, medium-sized startups) are looking for people who perfectly fit their positions. Tools, domain, methodologies, etc.
But it's exactly what you said: because the market is so competitive you are far likely to get a job even by just focusing on the technology you are really interested in.
I find that programming at work and home all the time is a recipe for burnout, but if you use leisure time for reading docs, blogs, watching videos etc (and a perhaps a little programming) this can be refreshing, particularly if it gives you broader knowledge for your current role - use your k8 experience to read up on docker and other systems. What are the alternatives to AWS you are using and other AWS Systems that may be appropriate for your work Etc.
Concentrating on the interesting things around your current role will be good for your career now.
1: https://youtube.com/watch?v=EtJy69cEOtQ
Maybe that, or I am simply naive.
As my distributed systems teacher used to say: don't be scared by new terms of concepts in computer science. When you think fundamentally about what things are, you will realize that, most of the time, it's a concept that is similar to something you have learned before, if not entirely the same.
To be quite honest, those are generally nice-to-haves instead of must-haves.
Yet, if within a pool of 20 candidates there are 2 or 3 which fulfill the nice-to-haves, obviously they are going to stand out among their competitors.
If you need to fill in positions and you stumble on a candidate that meets all your requirements, are you going to pass him over to pick the inexperienced candidate who has zero experience with your tech stack?
Understanding b-trees and log based data systems helps with most database systems - I look up the SQL syntax, Postgres and MySQL functions just in time, and I understand why Aurora is worth it.
Understanding how some container or faas systems work (instead of their API) is h enough to understand most of them.
Understanding how some distributed noSQL systems work is enough to understand whats capabilities most of them will have, and their limitations.
Basically, if I understand the fundamentals of why and how something is built, it’s easy to guess the APIs abc capabilities of it and any comparable system, so you’re learning compressed patterns instead of lots of transient details.
(1) Projects as the top-level structure. [Lookup: Ultralearning - a book/website (get the book). It covers designing learning projects.] This is the backbone of how to learn anything technical - you have to build using it.
(2) An Injest Feed - When you read something, put together a process to preserve and organize what you take in: (a) Organize the information against some current or future learning project. Direct your learning with intention. (b) Capture the interesting parts for later study. One direct output of reading should be notes and review cards.
(3) A Review Process - I use a combination of Anki and Readwise. To review them later.
(4) Personal Tooling - I do not try to keep it all in my brain. The review process is to keep things fairly fresh, but I'm only keeping the big points and indices in-core. The rest is out in my tools. Evernote, readwise, and anki are basic elements.
Then I set up software for specific tasks. I don't have to do much: just organize what I can get off-the-shelf and then organize it, with little bits of glue to do what I need. E.g., org-mode for writing and planning (I'm currently experimenting with integrating taskjuggler), calibre for book management, polar for injesting papers, etc.
--
For your list of topics, it sounds like you need to build a small go app to run on AWS, perhaps on minikube. That's all fine. Now put it together with a subproblem you want to actually solve. Say a prototype of something you think you should build at work, or just a toy you want to make for fun, or a startup idea.
I've focused on a process for learning instead of strategy because I've done this stuff for decades. You have to be efficient, strategic, and retain what you've learned. You need to have enough of it out of your head -- into text you can review and think about -- that you can continue to update your strategy as you go into the project. It's too easy to get flooded with technical minutiae if you don't keep the top-level objectives in front of your face. Keeping notes will prevent you from dumbly reading forum posts late at night, because you know there's no useful notes to be made from them.
Doing a few of these projects and not retaining their output is demoralizing. In absence of an intentional retainment plan, you'll remember whatever obstacles you hit more than the things you wanted to learn. Those will be muscle memory and feel good for a little while, but that memory will whither 2 projects later, and you've lost the point.
The feeling of heavy work and little work can burn you out. This is a marathon, not a race. Get your form right, take each step easy, and keep your eyes forward.
Inspiring words! Thanks...
Apart from that the skill is in knowing what you need to know about something. For example I don't need to know the details of the latest .NET syntax to know that .NET Core runs on Linux, which was a pretty big shift in that world. But to a certain extent there's no alternative to putting in the hours. Reading different sources, practice, repetition, flash-card software are the keys for me.
Also the comment about learning fundamentals is invaluable advice. I’m going to learn more about b-trees now
When I decide to learn something new, I look for the best articles, books, videos on the topic. Google helps me out here. I devour them as quickly as I can.
Consuming gives you the illusion of understanding. I make those concepts my own by producing something. A blog post, a slide deck, an illustration helps me to contextualize what I learned.
Consuming and producing is like four blind men trying to grasp what an elephant is. Each has his model of the elephant, which is not a comprehensive picture. I share whatever I produced with others and seek their feedback. I triangulate my opinion. With the comments given by others, I can make a complete picture, at least closer to it.
I go deeper into this in a series of articles here: https://jjude.com/sdl/
1. How do you learn: My learning strategy might seem a little weird but I'll explain it anyway. For me the first part about learning is about familiarity. If your brain sees to many words it does not know it subconsciously shuts down and you get frustrated/demotivated (at least for me). So you have to iterate over a topic in order to feel familiar with it's vocabulary. Just think of those Wikipedia rampages where you go deeper and deeper down certain words until you don't know where you originated from: that's because you are not familiar with the vocabulary of the field. So my first step is to learn the vocabulary of the topic by 1: reading a short book about the basics (or the first 100 pages or something) and 2: I find a place (online) where people working in this field hang out (e.g Reddit, HN etc.) and just read what kind of problems they have, which kind of words and tools they are using which kind of projects they work on. I do this daily, multiple times, and follow on things that really spark my interest and try to understand as much as possible. My brain works very interest based. I try to answer simple questions in forums, and try to get involved but only in simple stuff (since obviously I am just learning). At this point I try to apply the very basic things i've learned and iterate myself further by asking basic questions about stuff I don't understand etc. After having reached a certain familiarity with vocabulary and basics I try to explain why does tool X exist, what problem does it solve, what pros and cons exist. I think about how I would explain the necessity of X to someone who is not in the field. After that in the second phase I learn mostly like everybody else from books, online resources and just doing what I learn. But now I can read books a lot faster and with much fewer frustration because my brain is familiar with it, knows why X exists and which cool projects X is applied to. Thinking about it, my strategy is mostly tricking my brain into not being bored or overwhelmed.
2. How do you decide what to learn: I learn because my job requires me to be familiar with Y. That's one part, can't really change much about that. The second part, for me personally is purely interest based. I always try to learn concepts/methods instead of tools. Don't care if it is useful or you will ever really apply it, BUT: if I learned a useful concept instead of a tool, I will always be ready to apply it somewhere else. We humans are masters in generalizing things and applying concepts we have seen somewhere else.
Since you asked about HYPE-TECH-A vs something that truly interests you: I always in my life picked my interests not the hype, and it always worked out. If you are motivated to learn something you can gain knowledge several times faster compared to force feeding yourself something that you might apply maybe somewhere in the future.
4. How do you handle the pressure of that huge mountain of stuff you don't know:
Just have a good mental health. Be aware that staring to long into the abyss of stuff you don't know will never lead to anything good. You have to be aware of the things that you don't know, but let it give you a joyful humbleness instead of fear. Just think about it this way: you will never run out of interesting things to learn. The joy of learning will always be available. Your mind is not a commodity of your future employer, instead learning n...
Simply, I think the hardest part of learning is knowing how to pick it back up next time than it is about actually acquiring a new concept. Creating continuity in learning means more if you intend to actually embrace continuous learning as a mindset
If it's something theoretical, I write down notes with it in a Q&A format, and then test myself by answering those questions using spaced repetition (at the time I wrote them, a few days later, a week or two later, and a month or two later).
> How do you pick a subject or tool to learn?
I have a list of tools I'd like to learn and then I tackle whichever one seems most relevant to me from the list. Currently on top of it is tmux, which I have a practical use case for. AWS is somewhere at the bottom of such list, because I can't think of a project that would benefit from knowing it.
If learning is so important to you, for whatever reason, you should get a job that will let you use new technology to gain experience.
I just don't think it's possible to get to know everything in your spare time. Spend that time on something you actually enjoy or you will burn out sooner or later.
That's what I struggle with.
That's why I suggested to find a company that will help you get an experience. Chance is that you're gonna work with people more experienced or smarter than you and they will support you.
So like I said, nothing wrong with tech debt, it's a byproduct in our industry that we just have to accept and deal with.
But a lot of it is just trying to solve problems around me without asking permission. A lot of people seem to start by asking for help. That is not how you get deep and broad learning.
My learning strategy is continually ask questions and never be satisfied with the status quo. Surely there is tech at your job that you could learn better. If you’ve mastered everything than it’s time for a chat with your manager or time to look for other opportunities. Nothing forces learning like being dunked in the deep end at a new job!
Mark: Quick overview of the landscape marking key ideas/sub-topics.
Drill: Map task at hand to a sub-topic, drill as deep as needed to finish that task.
Sweep: If needed, systematically study the subject.
It is rare that I get to do sweep. It is "eventually" achieved through a lot of need based drilling.
Currently, I need to learn HTML, JavaScript and Node.js. I've come up with project that uses a little computer (ESP32) to serve up a web page that controls a mechanical finger.
2. Fundamentals: Parallelly, I take MOOC course every once in a while to learn fundamental concepts from first principles
3. Implementation: I either use the ideas I learned from (1) and (2) in a work project or write a blog post to make it concrete on my personal blog: https://amitness.com/
It's completely reactive but it forces me to learn by doing.