I would recommend a combination of seeking out resources like books, youtube videos, or guides and practicing/experimenting with projects and reading lots of code!
There has never been a better time to learn more about programming and computer science online for free than now. Online resources are everywhere and generally easy to search for, especially for a given language like C++. I'm an almost entirely self taught developer and I really got my start by learning on my own using free online resources.
Beyond online resources, try working on projects to expand your skills and solve new problems. This could be creating your own version of some simple software, hacking on an open source project, or just building something that sounds fun to you. One way to get ideas and explore different code styles and design patterns is to read code from projects or tools that you like.
Jared recommends the following next steps:
It reminds me of how I got so deeply involved in programming. I have been in customer experience and delivery for networking products offered by Cisco and during my experience of support, I started to realize how easy it was to automate different tasks through programming. I did not possess a majors from Computer Science but rather from Telecommunication Engineering. When it came down to work and automating the redundant tasks, that's how I picked up the interest, the time and the effort that can help you get there. I started off with simple scripts from the products built off from the help of Google, your best friend. When you have a task to automate, write down the problem statement and the resolution that you can build on and the logic required to implement it. Once done, programming is basically using a syntax based, machine driven language to implement your core logic.
As a new programmer, I always found opportunities to automate and I never stopped learning from my mistakes. Programmers typically say that "Get your program / code to fail more than once, that's when you learn from the mistakes".
I would start with some books on the basics of programming, identify opportunities to automate redundant tasks in your life (yes, I have seen a programmer who happened to automate his replies to his friends on Facebook for their birthday wishes :)) and lastly, have fun and start writing!
Learn 1 basic programming language like C programming perfectly. Understand the principles. It will take you a long way with all other programming languages.
I learnt C programming as part of my BTech. The logic applies to any coding applocation in later years of study, work.
C++ is a great development language but, as a beginner, I would recommend you switching to a more modern language for several reasons:
1- C++ is mostly used on low level layer like electronics but not for commercial applications for the simple reason that modern languages make a lot of work for you like managing memory (you no longer need to allocate or free data structures after use)
2- Modern languages are more human friendly, easy to read.
3- Even C++ is widely used you'll find way more offers with languages like Java, Scala, NodeJS...
Also, if you are starting to develop software don't worry now about smoothness and performance, focus on learning good practices like development patterns, clean code and understand what happens during the execution.
To answer your title, the one thing I will suggest is to pursue a project that interests you to help you learn your way through code. That way when you encounter issues, you'll be motivated to push through them.
To answer the optimization question. I would look into software design patterns and practice solving problems on websites like leetcode. They have answers to each of their code challenges that will show how some of these patterns are applied so you can see where and how they may be employed.
Best of luck!
Below are few suggestions for new programer:
- Get command on basic OOO concepts; work on small projects focusing one business use-case at a time
- Contribute to tech forums; as you will help you with some real-time challenges, multiple alternative solutions for same problem and feedback from different people.
- Continue read books, technical blogs and try keeping yourself upto latest industry trends
- Prepare yourself for Certification; this gives an opportunity to learn in-depth knowledge on topics, increase the confidence and help achieving to next level.
As a new programmer you need to get experience with the common problems and errors you can find while programming. That experience can only be achieved by practising, so my recommendation is to start your own projects and spend some days trying to solve them.
I also find more interesting to get knowledge about best practices and patterns instead of focus in learning on specific programming language in deep. If you are only coding in one language, try to use something else. Java, Python, Node or Go are some of the more popular languages used in companies.
Javier recommends the following next steps:
Always think optimization, this will help you write effective codes. If you start developing this mindset in your daily life then when it comes to coding it will become natural way of thinking. Also, think about how much emphasis is on Artificial Intelligence (AI), so think of ways to code that are best understood by AI algorithms,.
Wanting to make your programs run more smoothly is a great goal! I think one of the best ways to think about this general problem of optimization is to recognize that software development is iterative. Your first solution isn't necessarily the best, and there's always room for improvement.
I love this quote because it emphasizes that writing software is a multi-stage process: "Make it work. Make it right. Make it fast."
Once you've "made it work", take some time to improve your solution. Try some of the suggestions in the next steps.
Tom recommends the following next steps:
2. Learn one Data Structure or algorithm book.
3. Practice, Practice, Practice. I started mine by doing home work sections in my Data Structure book. There are a lot of online programming website now you can use for practices.
Fundamentals are a great start, but keep going! Find some challenging problems and create code to tackle it, things that push the limits of your knowledge. As you find solutions for these problems, you will gain better experience on how to optimise for common problems that come up again and again as you solve more complex problems. Some of these are optimising on threading, memory management, how you are reading inputs etc...
One example I had was a parsing tool that took 30 minutes to run, I was not happy with the time it took. So I looked into to what was causing it my first approach was to try to optimise by parallelising the task, this did not improve the time at all. Looking further into the code I found that the way I was opening and reading files was very inefficient adding a lot of wasted time to the code. This lead to a better understanding for myself of the way I should be looking for problems in the first place. The challenge is what drives me to learn and improve! Don't forget to research along the way, the programming world is very community driven!
James recommends the following next steps:
It's a good start, I suggest you to take more online courses (like coursera, edx) about programming 101, then find out some real stuff to work on, practicing makes perfect.
Whatever language you're using, it's always worth it to get familiar with the debugging and profiling tools. For example, Python comes with pdb, which allows you to set breakpoints and inspect the state of your program at a specific spot. Profilers allow you to see where your program is spending the most time - is it waiting on database queries? is it spending a bunch of time in a specific loop? are you looping through more elements than you need to? Improving a slow codepath that only gets hit once an hour is much less valuable than improving something that gets hit every second, and a profiler will help you spend your time wisely.
Mikhail recommends the following next steps:
One thing that I've found helpful is to always think about the long term, not just what is required to get the project "done enough". With alot of the tools and projects that I work on we are constantly under pressure it get it finished and available as soon as possible, but it's important to not sacrifice the quality and doing it the correct way. So you have to make sure you aren't shipping a hacky workaround for just to save a bit of time, because the odds of you (or anyone else) coming back and replacing that code are slim to none. So you have to remember that, and take the time to only commit it when it's what you would want to be in production, with your name attached to it, for years.