People often ask me: "Mosh, how do you learn new programming languages/frameworks so fast?" The answer is: "I know the fundamentals well! Really well!".
I cannot emphasize the importance of having a strong foundation. Without a strong foundation, you'll constantly face obstacles in your programming journey.
If you're a self-taught developer and never attended a software engineering program at a university, you have to dedicate the first 3 to 6 months in mastering the fundamentals.
- In-depth knowledge of one programming language
- Data structures & algorithms
- Design patterns
Many of these languages are multi-purpose, meaning you can use them for a variety of purposes. You can use them to build web apps, mobile apps, games, etc. But each language shines in a certain area of software development.
These languages are all tools. You can use different tools to solve the same problem. Some people have a preference for certain tools. As you go from one company to another, you'll get exposed to different languages and tools, and you should be able to learn them quickly.
The language that I recommend to my students is Java because it's one of the most popular languages in the world and can give you a lot of job opportunities. With Java, you can build web, mobile and desktop apps. Even if you don't want to be a Java developer, you can quickly pick up other languages.
That's why I've used Java in all my fundamental courses.
Data Structures and Algorithms
Data Structures and Algorithms is one of the useful subjects taught to computer science students. Unfortunately, a lot of self-taught developers skip this very important subject and fast-forward to building a web or a mobile app. It's like doing power-lifting without building strong muscles first.
Studying the essential data structures and algorithms teaches you problem-solving skills. It teaches you how to think like a programmer and how to design and implement fast and scalable algorithms.
That is why top companies like Google, Microsoft and Amazon always test your knowledge of data structures and algorithms in their coding interviews. They care less about how many programming languages you know (or you don't know!). They want to see if you think like an engineer and design a fast and scalable algorithm.
In fact, more and more companies are asking data structure and algorithm questions in their interviews these days. So, if you want to stand out amongst the others, dedicate a month to studying this very important topic.
Here are a few applications of data structures and algorithms in the real world:
- Your GPS telling you the fastest route to get from A to B
- Your browser quickly suggesting search phrases as you type
- Being able to undo changes in Photoshop
My Ultimate Data Structures and Algorithms series teaches you how to do cool things like these.
Design patterns are general solutions to problems that commonly occur in software design. There are about 20 classic design patterns that every software engineer must study. Studying and understanding these patterns can help you design extensible, maintainable and testable software. Plus, knowing design patterns adds to your vocabulary when you communicate with other developers. For example, if someone in the team mentions the Factory Pattern, you should know what it is and how to implement it in code.
I don't currently have a course on this topic, but I'm planning on creating one next year.
Git is the most popular version control system (VCS) in the world. With Git, you can version your code. You can keep track of changes, and see who has made what changes and when those changes were made. Instead of copying your code into different folders and versioning them manually, you let Git take care of all of that for you.
There are many version control systems out there like Subversion, TFS, etc. Git is the fastest and the most popular of those. These days, a lot of developers also use GitHub for collaboration. Git and GitHub are two different technologies that complement each other.
I don't currently have a course on this topic, but I'm planning on creating one soon.