Beyond The Basics: Software
It is easy to learn the basics of a new framework because the entire documentation is designed around getting you started in order to get you to that moment of “See how productive you are with our framework, that’s why we are the best!”
There is also a lot of people “writing” guides about X & Y technology who are mainly rephrasing the official documentation so it easy to keep searching for the golden example instead of taking the time to actually understand the concepts explained in the official documentation to learn the fundamentals.
I have found two ways to move beyond the basics and learn the more advanced patterns of a new technology that I’m getting familiar with.
The first one is to set up a new project that includes the minimal required tech stack and try to solve an isolated problem without dealing with everything else that goes on in a production app. Solving a problem that you actually have keeps you focused so you don’t wander aimlessly through the seemingly endless possibilities of “tweaking this and that”. After developing an understanding of the concepts you are exploring, then you can move on to your production codebase and start tweaking there to integrate it. The downside of this approach is that it has a slow start until you start absorbing the new knowledge.
The second one is to explore popular and well maintained open source codebases built on top of the technology you are using and see the solutions that they have come up to and to dig deep to find why they have choose the that solution. Although the solutions implemented in open source projects are very often the most generic ones, once you understand what they are attempting to achieve, you can reduce the amount of unnecessary code for your use case. The downside of this approach is that it takes time until you understand the decisions and the reasons behind the decisions the team behind the project has made.
At any time when doing this kind of exploration work is important to keep in mind that we either are searching for a solution to a problem we understand or we try to use an existing proven solution to a new problem. But we never want to do both at the same time because there is too much uncertainty going on and it is very hard to pin point the reason why we are stuck.