Hey! I would like to give an opinion as a Self taught programmer, to help others to solve the issues and struggles I had.
The cause of all my struggles are the "foundation"
you see, as a self taught programmer you may skip what may look unnecessarily concepts and focus more on what important and what makes you make apps quickly.
Unlike CS student we tend more to start jumping on building projects and learning by doing to make a portfolio that we can show and get a job, the problem with that is recruiters don't care of what your program do
they care more about how you built it, and another problem is even when you get the job you will be faced with a giant code base and struggle to even touch it.
My solution to that and it may work for you is to stop making projects and stop using libraries(for now) and change your learning plan,
I can recommend a learning path that I'm doing which is:
1-Learn OOP and Design patterns using java:
Don't follow the trend of hating Java, you should learn it and you don't even have to use it, Java is great for learning OOP, watch Derek Banas's Youtube channel for Java design patterns they are very helpful.
2-Read the first 100 page of learn you a Haskell for a great good:
Again you don't have to use Haskell, just use it to learn FP and this book is free for online read,you may ask why I should learn FP, well the answer for that is because most modern languages use some sort of
FP concepts, and you don't wanna stuck because you face some simple concepts in a code base, all you need is the first 60 to 100 first pages on that book and you will have enough knowledge.
3-Learn pointers and virtual memory with C:
Learn what is Stack and what is Heap, learn what's the deference between passing by value or reference, learn why C is fast and how to deal with memory.
4-Learn algorithms and data structures:
learn what is the big O notation and how different sorting algorithms work and why and when you should use any of them, you should know how to implement different data structures like Linked lists, Hashmaps and Trees...etc.
5-Learn concurrency and parallel programming:
Learn what's the different between an OS thread and a green thread, what Mutexes is, and know the difference between different concurrency models and paradigms.
6-Learn unit testing:
Learn to use different unit tests frameworks and tools and learn what TDD(Test Driven Development) is.
7-Focus on clean code:
Learn best practices and how to write clean code on different languages.
8-Practise by making simple libraries for your favorite language:
You can rewrite a library you like, making libraries will help you making a good code, because you want to make it easier and well abstracted for the user.
I know that's not enough for a rock solid foundation but that will make your life as a programmer easier and more fun with less struggle, and when you make a portfolio your code will be much better.
Make better choices about your code and your career.