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.
P.S.: My company is looking for experienced Deno developer, min 5 years of production experience. Unpaid internship position.
The "engine" is very core, broadly useful things you learn (or in this case do) that will help you not only now but over the long term. In terms of learning this would be things like mathematics, a foreign language, sales, writing, interpersonal skills, CS, etc, which will still be valuable in 50 years. In terms of your tech stack choices, this would mean technologies that will be easier to maintain, require fewer updates in the future and have a sufficient level of performance.
In contrast, "power-ups" are extremely useful right now, but not so broadly applicable or evergreen. In terms of learning, this means things like the knowledge of the hottest social media growth channel of the moment, frequently changing JavaScript frameworks, popular 3rd-party tools and platforms (i.e. Firebase APIs, Auth0, various "back-end as a service" offerings, etc).
Keep in mind, the "engine" vs "power-up" concept is more of a spectrum than a dichotomy. Learning a programming language, an OS or an open source protocol is somewhere in the middle. The knowledge is probably good for 5 years, but maybe not 30.
The strategy I try to use is to spend most of my time working on the engine, but at key times when there's an opportunity, I go all-in on power-ups.
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/
> 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?
To the last 2 questions: I don't really.
But to the first question: I read widely, but I also add an accelerant to the process -- Pluralsight. (or, insert your favorite screencast/tech pedagogy site here)
Pluralsight has videos that are of high pedagogical quality -- low or variable quality sites are a waste of time -- because instructors are curated (and I hear, auditioned). Sometimes I just want to see how something is done by an expert. I hate to admit it but I'm partial to learning by mimicry (at least at first).
Docs are good as a reference, but it's tedious and slow to mentally parse step-by-step instructions and scaffolding code in docs -- there's just too much context switching for my liking. Much easier to watch a video at 1.5x speed, where someone is doing it and explaining at the same time.
For instance, I tried learning K8S by reading blogs and docs but didn't really see how everything fit together until I watched some videos of an expert actually explaining and assembling stuff starting from zilch all the way to a working setup.
Downside: these sites only cover established technologies. If you're learning cutting edge stuff, then they're no help.
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.
You 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.
I review my now-very-long doc every few quarters and it's an easy way to reinforce core concepts that I'll want to share later via writing, mentoring, advising, etc. This question seems more technically focused, but this has been a great way to learn and internalize experiences. Granted, it's probably a better system for gaining "wisdom" as opposed to hard technical knowledge.
If you are able to land a job, it is means that you know enough as a software engineer.
If you want to learn new things, because they will help you build things for yourself, or are necessary to apply to a new position. Then think about a side project that would use those knowledge and build it, you will learn all what you need along the way.
For example I'm creating a jobboard now, I learnt how to build an efficient crawler, how to scale a db, regex performance, NLP PoS, NLP classification ... tons of topics I didn't know anything about before
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.
https://www.coursera.org/learn/learning-how-to-learn
Personally, I usually try to get a job where they use the thing I want to learn.
Two years ago I landed a job in a company that was using Vue.js and Vuetify.
Recently just started in a company that's doing Elixir and Phoenix. I've been trying to get into this tech stack for a long time.
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.
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.
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.
Also the comment about learning fundamentals is invaluable advice. I’m going to learn more about b-trees now
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.
Now, think of something more complicated - say connecting to a API and displaying the results in a table, just look into axios, copy paste whatever you can and get it running. Don't be bogged down by styling (CSS) or performance or anything. Just get it running.
Now, go through the official docs some more. You will be able to breeze through the whole docs in a couple of days. Always do the read->implement->learn->read cycle.
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.
Maybe take a step back and consider that one of the useful outcomes of learning is maintaining neuro-plasticity, which may allow you to continue to learn with easy. This is why you may benefit more from learning some skill further from your existing set.
In terms of the learning useful skills, I wouldn't lean to heavily on job description, they are more like a companies wishlist. Occasionally, you can tick all the boxes, but that is not indicative of job performance or productivity.
Happy learning
It is a sign of open-mindedness to be interested in many things. It is a sign of maturity to narrow that list down to pursue them a bit more deeply, then discard what turned out to be not so interesting and pick new ones. The idea is to remember nothing is a waste of time - worst-case, you learn something about yourself while you were pursuing what turned out to be uninteresting for you.
I think of knowledge in terms of concentric circles, rings on a tree if you will. You start from the core and every month or Again, many things are a matter of time and if you try to rush them and try to be an amazing engineer in a very short time, it might lead to exhaustion. Reading Hacker News might make you feel people are doing amazing things - but remember at some point in time, those amazing people chose something, one thing, and pursued it. And for every person that's doing an amazing thing, there are ten who are in the process of slowly making progress.
But long-term, I have ideas for a generalized system of maturity models and known best practices, where a community can make interlinked lists of things to learn, that tracks prerequisites, and the best order to learn them in, with suggestions on what comes ~"next" at any given time, toward a specific learning goal. So, someone doesn't ever feel a need to stay up with everything, because knowledge is growing so fast anyway, just what comes "next" at any given time. With anki-like features built in. Something like wikipedia plus low-level computability of all the info stored. I haven't been getting as much done lately on it, (though I use it daily as a personal organizer), but I hope to in the future sometime. More on it at http://onemodel.org .
For example, last year I started using python more at work. I've known python in the sense that I could write scripts in it and generally understand it, but my knowledge was mainly based on having seen python scripts, intuition, and Google searches - and mostly python2.
Putting my first principle into play, I looked at the python documentation and read it end to end. I tried to read one section a day, though some sections are more or less dense so that was very flexible. As I read I had a Jupyter Notebook open and played around with every concept the documentation described. When I was done reading I would spend a few minutes writing my notes as described above.
This took maybe 30 minutes a day, most days, for a little less than a month. On top of this I would randomly do leetcode problems in python and write python scripts at work, but at the end I felt I understood what I was writing and why in python much better.
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.
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.
Everything I've learned came from trying to figure out how to implement something and then how to improve that implementation.
Rinse and repeat for a few years and you naturally improve.
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/
> I'm afraid to fall behind the industry.
Do you mean you are worried about not being able to pickup another job if you lose your current one?
I got what all I mentioned above.
You brain is the most sophisticated information processor in the known universe but it doesn't come with a manual. Some manuals have been developed and published.
(At one point I was using RSVP (Rapid Serial Visual Presentation) to read 800-1000 words-per-minute (reading faster than my internal voice can speak/think) with comprehension and retention.)
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 new things should be your privilege and bring you joy.
It's completely reactive but it forces me to learn by doing.
(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.
Something I wish I had realized 10 years ago is the importance of figuring out how to learn in such a way that I enjoy the learning process itself. If you don't like PG's novelist example, consider bodybuilders. They don't see going to the gym as some necessary evil that stands in way of looking good. They like going to gym. In fact, they love it, and they would probably continue to do so, even if it they ceased to care about looking good.
Once you set a non-trivial target ("I'm going to learn French", "I'm going to become a competent C programmer", "I'm going to work through the exercises in TAOCP") you need to establish a path that is intrinsically enjoyable. Your end goal is years out. If it's the only thing that's keeping you going, you're going to quit in favour of more immediately rewarding activities.
My first second-language-learning experience - French classes at a community college - was unsuccessful, for a rather simple reason: I didn't give a fuck. In the course, myself and a bunch of aspiring bureaucrats (I was living in Canada at the time, where French accreditation opens up advancement opportunities for government employees) met twice a week and did as little work as possible to get a passing grade. We did the usual second language learning things: memorizing the names of animals (as if we were all preparing for a career in agriculture), watching low budget educational films, and filling out verb conjugation worksheets. Our instructor was good - she could explain concepts clearly and managed to stimulate a fair deal of discussion. But she was bound to a curriculum that heavily emphasized grammar and a particular vocabulary, and neither could motivate me.
Last year I decided to learn Swedish. Instead of signing up for community college courses, I started taking private lessons over Skype. I found a tutor with whom I share similar interests. We discuss things we've read, our favourite tv shows, and philosophy. I also started reading American mystery novels in translation. It turns out this is a highly effective learning mechanism, because you have a lot of context. It works especially well if there is a series you like, for the same reason.
Once I started asking "what is most enjoyable way to make this happen," and stopped worrying about what learning methodologies are efficient, scientific, or conventional, I saw a lot more progress. I only reach for Google translate a couple times per page when I'm reading a mystery, and I have about half my 1on1s in Swedish.
I do broad learning constantly, several hours a week, and it's mostly fun.
Deep- occasionally I'll do a deep dive into a new technology that I learn about I'm doing my broad learning. This happens because I've identified it as a broad industry trend that I simply need to understand (containers and kubernetes a few years back), something that I sense might be applicable to a current or upcoming project (most recently React), or just because I'm interested (augmented reality.) I use a mixture of training courses (pluralsight and o reilly because work gives me a subscription, or vendor provided learning material from the likes of Apple or Microsoft) and some hobbyists level effort capstone project. This takes about 40-80h and I often do the project as part of a hackathon. I rarely do this level of learning more than once a year and sometimes less than that. The goal isn't too become an expert, but just to be able to accomplish work in the new technology.
Immediate- learning as part of my day to day job. This is learning I get from having to figure out tasks (deeply reading the docs of our current tech stack to figure an obscure error), to evaluate a technology or technique against our current needs, or to learn a new technology that is part part of the job /a new project or team I've joined. Most of this is one the job learning or learning from others on my team, but sometimes there are relevant trainings. There is no real time metric here- it just happens.
As for your concern about being up to date on every single technology that might be listed on a job description, don't be. Most job descriptions are "aspirational." Few hiring managers expect to be able to get the "perfect" candidate. What they are really looking for is high potential and a short ramp time. Sure, I might occasionally get a resume with experience in all 8 technologies I listed on a description, but it's rare. If you understand what my tech stack is and how it relates to what you know I'll forgive a lot if specifics.
On last thing on the job search and learning aspects of your career - keep your network up. You are 5 years in. Most likely there have been people you genuinely like that have moved on to different teams, roles, or companies. Reach out to them, find out how they are doing, what they are working on, chat about whatever you used to chat about. Trust me, people are happy you thought about them enough to reach out to them and are generally happy to talk. What your friends are working on should give you a good idea of what's actually important to know. On top of that, when you are ready to transition it's a pretty easy to ask "hey, I'd love to work with you /work with you again, is your team hiring?"
the last 'perfect' resume I got ended up being a legendarily bad interview, something my interview team jokes about imternally. Poor dude couldn't answer a single question correctly and we are pretty sure he just fabricated large parts of his resume.
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.