How to learn complex software topics

Todd's photoTodd

published a story

7 months ago

Over the years, I've become proficient at various technical skills. From writing code to reverse-engineering code, to writing clean, well organized code, etc...

However, I've also become proficient at learning complex software topics and I want to share my methodology. It all starts from these core concepts:

  1. Multiple information source types (books, video, blog, labs, exercises, podcasts)

  2. Immersion

I've found that with complex subjects, the more sources and the more source types, the better. Take for example learning the binary analysis framework, Frida.re . I would consider this complex because it requires foundational knowledge in JavaScript, Python, and some operating system concepts involving hooking APIs.

Read the Docs - The starting point

Typically, I start by reading the documentation introduction/tutorials for a given subject. However, no matter how good people say the docs are, I've found that docs typically only cover a tiny percentage of the possibilities that the subject can be used for. Meaning, while they may technically cover close to 100% of a language, API, or tool, they do not provide much overall context of what types of problems a subject can/should be used to solve and the thought patterns required to take a problem to a solution using that particular tool/service/framework, etc...

Typically, this is where blogs, tutorials, and youtube videos come in. Once I'm past the boilerplate/setup process, I will typically start performing youtube searches such as "Frida.re tutorial", "Frida.re binary analysis", "hooking with Frida.re" etc...

I will then try and find the most concise, clear video which demonstrates the tool used to solve an actual problem. This of course is not limited to videos - blogs and write-ups found via a search engine can be just as useful.

Experimentation

Along the journey, my mind will begin to conduct thought experiments "Hmmm... John did X with method Y in Frida... What if I switch argument B to C instead?" "What if I use method T instead of U?" Etc.... I then start to run the program and modify it, experimenting to learn how the system works and how it can be utilized.

Often during this experimental phase I run into errors or other problems which I do not know how to solve.. Then I may search for solutions to those problems, further exposing more learning content surrounded on using the specific subject tool to solve the specific or a similar problem. In cases where I cannot find an answer after searching for some time, I will locate a place to ask. This could be Hashnode, StackOverflow, StackExchange, a web forum such as a vBulletin or phpBB about the subject matter, a Slack channel, IRC channel, Discord channel, etc...

For more well-known tools/libraries, I will even search for podcasts and when I go on my daily walk, in the car, or in the gym, I will listen to podcasts of people discussing the tool and/or solving problems with it.

Read the docs - The downside

I do sometimes believe in "read the docs," however, I find it often to be too shallow of an answer because many questions are about thought processes required to be followed in order to solve a specific problem with a tool or library, rather than definitions of the parts of the tool or library itself. Docs mostly do a poor job of addressing this and that is not their purpose in the first place. A structural engineer does not go to a structural engineering dictionary to help solve a specific structural engineering problem unless that problem is simply not knowing what a term means. Likewise, docs are only so helpful and the examples are often very narrow in scope. For this reason, I find that learning sources which have real-world problem solving involved help me to absorb content much more effectively than just technical documentation does.

Modeled after school

I modeled this method of learning after school. One day I thought to myself: "What is school?" Define it. Let's think about what school provides or is at least expected to provide (doesn't always provide):

A) A learning environment

B) A work written by subject matter experts (textbook)

C) Access to a subject matter expert (instructor)

D) Verbal explanations and walkthroughs (lectures)

E) Exercises/Labs (homework)

F) Other people working with and learning the subject (peers)

I discovered that the entire school environment can effectively be replaced, for very cheap. A laptop hooked up to wifi in an appropriate setting covers A. Purchasing books on Amazon or another web store covers B (backup option: library). Email addresses from blogs, attending meet ups and staying after, chat channels, and web forums cover C (requires the ability to determine who a SME is of course... But say you email a book author or find a forum he/she is on). D is covered by YouTube videos or videos on other content sites like Pluralsight or Udemy. E is covered by exercises in B, blogs or Googled content, or even you can recreate E. I used to write my own labs for books I read which didn't provide labs. This helped me learn just as good as or better than labs provided to me.

Lastly, peers can easily be found via searching for relevant Discord, Slack, forum, IRC channels, or local Meetup groups.

Vetting Content Quality

By covering all of these basis, I've found learning complex subjects to be approachable in a systematic, effective way. Again, some of these items do require that the learner do his/her due diligence in verifying content quality. In my experience, this too can be learned. For example, I know that when I purchase a book published by Manning, the content quality and author credibility tends to be high. I also know that if I go to the profile of someone who answered my question and I find out he works with the technology at Microsoft, has his own blog about it, and has written a helper tool, and has a YouTube channel about the subject, chances are, he's knowledgable about the subject.

By the same token, I know that while there are some excellent Udemy courses out there, the bar to publish a Udemy course and the cost of the course is significantly lower than publishing a book with Manning, or teaching a course at MIT. Using this information, combined with intuition and review-reading, I'm fairly good at verifying the quality of course content.

Last but not least, you can always look up a professional paid course, such as one delivered by a university that you trust, and purchase the associated textbook, look at the curriculum, etc... And develop your own personal learning plan from this.

Writing and Teaching

The last two items I want to cover include writing and teaching. For me, having a notepad handy on complex subjects is paramount. I absorb info far more thoroughly when I physically write it onto a notepad than if I just hear it or type it. Even though the writing process can be slow and arduous, it's worth the thorough absorption to me.

Finally, creating my own YouTube video or tech talk helps me solidify knowledge. I often find myself happy to learn a new subject and giddy to teach others - however, when I begin to make a tutorial, I stumble over and over because I didn't thoroughly know the subject well enough yet. This process forces me to attain a more thorough knowledge and work out all the kinks to where I feel comfortable teaching others without misleading them.

I hope this has helped spark some new ideas when it comes to learning complex technical subjects. Thanks for reading.

Comments (2)

Add a comment
Richard Uie's photo

"Live and learn" should have been "LEARN or DIE."

"...I physically write it onto a notepad..."

This is one aspect of a well-known phenomenon in Psychology. The more physical modalities on which you can exercise ideas, the more firmly you will grasp, reinforce, and retain them. Reading, hearing, reciting, viewing images and moving streams, writing, typing, teaching (requires reformulation for others) - all improve recall and understanding. Repeating any/all of these things, redoing them in different locales - contributes new, valuable reinforcements for the ideas.

Congrats on discovering and sharing the writing mode of reinforcement.

Vijay Thirugnanam's photo

Professional Freelance Developer (React | React Native | Node | Firebase)

I like Udemy courses. I try out some of the exercises the Udemy instructor suggests. It is somewhat ok. But not quite useful because in real-life (actual projects), the complexity is much higher. And I will spend probably weeks doing a single feature. Which in an Udemy course is done within a few hours.

Also, in JavaScript, there are too many packages. So going through documentation is not very helpful. There is just lot of documentation out there. And it is not feasible to go through each one of them. And invariably, all packages have a downside. So, I use my intuition to pick the right package: popularity, ability to customise, etc. And most of the time, I write my own code.

If we write our own code, it is more rewarding. No need to read up docs. Rather be more creative in coding up stuff.

What I am looking for, especially for the UI, is not documentation on how to use a package. But rather guidelines on how to write good code. For eg, what is expected of a generic Button component? a) styling b) loading indicator c) animation etc. These things are not discussed in any course or found in any documentation. But something that we discover by writing our own code for stuff.