Just to counter everyone who says "learn another language like Haskell", I completely disagree.<p>You're at the point where you know some language and OOP at a decent level. You now need to invest time learning things like data structures and algorithms that are APPLICABLE to your work.<p>Keep adding incremental knowledge, but make sure it is having a direct benefit to your work at all times.<p>The "learning paradox" of having to master languages repeatedly is a waste of time at a junior level. You'll continuously invest in a new language without ever finding it applicable (eg. "learn java, learn JS, learn CSS/HTML, learn python, learn ruby, learn haskell, learn rust, then learn x-framework for each language, learn y-framework cause someone on the internet said x-framework is too bloated, learn this, learn that ...").<p>As your questions on line 3 asks, I say invest in the higher-level concepts that work across languages. Focus on a domain (some language, 1 or 2 frameworks, a DB) and stick with it.<p>And, as others have said, find a mentor. If you want to keep freelancing, you'll find a mentor at a meetup. You will definitely gain a lot from experience over a book/tutorial in certain situations.