Software development is hard. You will bang your head against the keyboard. You will struggle with concepts that aren't immediately clear to you. And you will need to do a lot of learning on your own. Now, with this reality check, please do keep reading.
In the beginning, it can be really hard to assess when you should move to learn the next topic. Not taking enough time to build fundamentals before moving to the more advanced topic can lead you to spend more with the simplest problems, and it will be really hard for you to follow or create programs that deal with those advanced topics. I mean it could be as simple as not getting comfortable boolean expressions (true or false statements) before moving to loops and if statements (conditional logic), which will get you into trouble of figuring out bugs (your program doesn't behave the way you want it to), resulting in banging your head against the keyboard.
Software development is all about problem-solving, especially modern-day development, you don't spend your days solving math problems, but building products that your clients want with other people. The hard part will be for you to communicate well and understand what your stakeholders want.
The hard part is forcing yourself to take a step back, and stop yourself from diving headfirst in trying to find solutions. It can get really hard when you are alone. When you don't utilize your peers and community, it can get hard to process, learn, and grow. You will reinvent the wheel without learning from your community or taking benefit of their experiences.
A lot of software developers have impersonation syndrome. It is really hard to sit between people who talk smart all day, and feeling like you are behind or you need to catch up. It can be hard to tell people what you don't know and use your team to grow yourself. Software development is really hard when all you see is new blog posts about this new XYZ technology, and now there is another thing on your bucket list or worst, you have now switched your focus.
It can be hard to prioritize your bucket list of things to learn. If you follow blogs, Twitter, and other great resources, you will learn about a lot of cool innovations that people are working on, resulting in a never-ending list of things you don't know about. The hard part is stopping yourself from jumping into each one of these new topics right away.
If you are just getting started, and maybe already tried out 5 tutorials and "still don't get it". Most likely your problem is that you need to first build fundamentals of problem-solving. People who usually succeed in boot camps are already natural problem solvers or have built the experience in some other form. Problem-solving is a mindset, you too can have one. One simple way to start improving it is by reading "Problem solving 101" by Ken Watnabe. I started reading this book after I started working on my programming boot camp, Learnly, and realized how many similarities we have for building a framework for problem-solving. There are a lot of other resources for learning problem-solving. If you have tried programming and are struggling with coming up with solutions, it's probably just your approach to problem-solving that needs to be improved. Lucky you, that's doable.
Build a structure and schedule, if you want to accomplish anything, all you need is a structured and consistent approach. The structure will help you stay focused, it will help you by not letting you jump to the next new thing without being done with the first one. Structure helps you learn concept A before concept B, as in don't be random. Consistency will make sure you can do it regularly, and complete it! A lot of people start a lot of things but never complete them. It's a doers world, people who do it are the ones successful. They can only do it because they are consistent. Doesn't matter if you are trying to improve your basketball shot, or learning this software development thing, you need to consistently work on it. Figure out what that consistency is for you, 5 hours/week, 10 hours/week, or 2 hours every morning. Apply this to anything you want to learn or build, and thank me later.
Learn to communicate well. It means writing and speaking in a clear and efficient manner, you also need to listen well. Engineering is not all about building solutions, you build solutions for people and with people. With good communication, not only will you and your team be more efficient, but you will all be happier. Isn't that what everyone wants anyway? Always always always state your assumptions, this will help you deliver the right solution with less back and forth, end result => every one is happy faster. You must be patient and understanding; stakeholders frequently ask for things that do not make sense since they may not even realize what is already available or possible.
When you encounter a new problem, could be programming-related or not, don't just start by solving it. Verify and validate that you understand the problem. Understanding the problem has multiple steps, it can be breaking it down into multiple small problems first, and THEN figuring out solutions to each individual subproblems (divide and conquer!). Especially as you progress in your career, it will become less important on how quickly you can spit out code, but more about how well you understand the problem and break it down.
One of the worst mistakes I did early on was not being a part of communities. They help you in so many different ways, keeping up to date, motivation, guidance, and so much more! That community could be online, in person, or just sharing ideas between your peers/friends. Basically, don't do it alone, there are almost 8 billion people in this world, I'm sure you can find people that are in the same boat as you or have been.
Impersonation syndrome can be a good thing. Fake it till you make it right? Not necessarily! There is no harm in claiming you don't know something. Use it instead as positive energy to keep going and learning, if people around you are pulling you down for not knowing something, maybe you need to change the people around you.
Don't jump to every new shining technology or new idea. Again, structure your learning goals and checklist. Prioritize everything in your bucket list, I mean really write it all down. If you see something interesting and want to know more or try it out, throw it on your bucket list with prioritization.
You need to learn the fundamentals of software development before you learn that popular React tutorial that is for beginners. Fundamentals before specific technology. Learning fundamentals will help you become technology agnostic. Technologies change all the time.
Learn about databases. They are a lot of different ways to store data these days, learn to pick which way works best when.
Now build that website or app that you wanted to build. It doesn't have to be a website, it could be your augmented reality app that you wanted to work on. But now is the time, once you are really comfortable with expressing solutions in code.
Learn enterprise software development practices. Doesn't matter if you are building your own project. You need to build software with good practices. It will pay off when your startup takes off, or the company you are working for. I was writing code when I was 15. 12 years later, my solutions are very different. Building algorithms is one thing, building scalable software with a team is a whole different ball game.
Deep dive into algorithms. In today’s world, people don't care about computer resources because most computers are so stacked, by taking this deep dive, you will learn to be frugal with your resources. It will be a humbling experience when you realize the kinds of solutions people have.
Prepare for interviews. Doing well in interviews is an art. There are lots of resources like "cracking the coding interview" that help you get good at this art. Practice. Practice. Practice.
There are lots of resources available online, to help you with the checklist above. There are some listed on my website. I'm in the process of building an online program that helps with all of the above. If you are interested in joining the pilot phase, sign up.
You can also reach out to me on my Twitter for any help with any of the above.
Thanks for reading.