Becoming a Good Programmer
Written by: @FaithHF & Released under the Creative Commons Attribution/NonCommercial/ShareAlike license ( )
Intro:
So, despite the majority of this site being made up of leechers and those who have no intention of ever doing anything meaningful with their time, whether it be learning, creating, sharing or teaching, there are a few people on here who legitimately do. Some people like to just make a simple post like 'lol im learning python how long til i get good' and never return again. I'm not talking about those. I'm talking about those who ask questions, or those who have been slowly making progress towards their own projects. I'm talking about those who blaze through a book on programming and then have nowhere to go. These sorts of questions pop up all the time in the respective programming section based on the language, or will often end up in the misused reverse engineering discussion sections, but the point still stands that most of those questions either go unanswered or just clutter up the sections the the same responses.
This guide will aim to answer most of the Frequently Asked Questions once someone starts programming, ranging from projects, competency, time, and language. This is by no means a complete guide, and I encourage other users to contribute what they found helpful as well. This guide will not focus on a particular language, rather, I'll consider making threads for specific languages if the demand arises.
The license for this thread will not actively be enforced with legal action, since I really can't be fucked for time. That being said, quote large enough sections without attribution (using a quote BBCode tag with my name FaithHF counts enough as attribution) and you'll get reported wherever I see it.
I've added hide tags in most questions that explicitly have links. There are no direct downloads for books and courses, but I do mention places where I like to get things from for free. Use those sites at will and at your own risk.
So enough about that, and let's dig into it.
Starting Questions:
Before anyone starts programming, they need to run themselves through a few questions first.
Q: What language should I choose?
A (short): Any of them.
A (long): It really depends on what you're trying to make. Are you going to make a website? Maybe you're planning on making a game cheat. Perhaps you're just looking for something to make your life a little easier doing mundane tasks all day. Or you're planning on making some kind of malware and you really want to understand everything that a computer can do. That being said, all of the above tasks have some degree of a learning curve on top of a respective language. Since all programming languages tend to follow the same set of rules logically, learning one language will make it a hundred times easier to learn another language later on down the road, and switching around like that will take maybe a few hours, since you're just learning the syntax.
Q: So where can I learn about languages and their uses?
A: Google for how to choose a language. There are tons of flowcharts available, and there are even more blog posts and articles from your favourite developers online about different languages and why they love them. But don't take someone's word for it. Go a little deeper: search for why certain languages are used over others in specific cases. If you don't understand the explanations, google the words you don't understand. Learn as much as you can, and eventually, once you found something cool, keep it in mind as your starting language.
Q: Where can I learn a programming language?
A (short): Anywhere you please.
A (long): You already know about books. You see them recommended to you on Amazon, or facebook ads, or anywhere else. You've probably scoured through YouTube tutorials, only to realize that 95% of them are 'taught' by Indians whom you can't understand, and that you can smell the curry through your screen. You've looked at Udemy and thought 'Wow! Cool, a full course that teaches me everything!' and then realized that you needed to pay at least 10-15$ to get access, and realizing you're broke, you ditched the idea. To put it simply, all the above mentioned places to learn will be teaching more or less the same thing. There's no 'best' option, it depends on how you learn. I personally can't understand thick Indian accents, and I don't like paying, so finding PDFs of programming books is the way for me to go. But maybe you're fluent in Hindi and hear the accent all day every day, so a YouTube tutorial will be fine. Who knows?
Q: Where do YOU find books?
A: That's a little personal, I don't claim to be some God-Gifted programmer like Terry Davis. That being said, I do have a few favourites:
If I can't find something for free, I generally just try to find something similar to learn from. LibGen has pretty much everything though, at least in older editions if not the absolute latest and greatest.
Q: What else do I need to start?
A: Your brain. In most beginner books (ie. beginner to pro, learn X in Y days, etc.) the book will walk you through any additional setup you need. All you need now is the dedication to the task.
Staying On Task:
I feel the need to include this section in paragraph form because IMO it's the one thing that always holds people back from actually getting anything done while learning to program, or what to do once they learn to program.
The easiest way to stay on task when learning is to have a goal in mind.
I don't mean 'My goal is to learn C# in 21 days, just like the title of this book!'
Think beyond that. Why are you learning to program? What are you trying to accomplish? Why are your choices thus far going to help with your goal?
While considering your language above, I mentioned that you should choose a language based on what you want to do. I hope you didn't answer with 'for the sake of learning programming, so I shall choose an easy language.' If you did, you've already failed and you'll never be a good programmer with that kind of mentality. I suggest you close this browser window and contemplate your life, and what made you this fucking stupid.
Maybe you answered with 'making a website!' That's cool. Now, we're going to break it down a lot more than that. What kind of website do you want to make? A social networking site? Maybe a dashboard for everything happening in your life? Maybe you have a revolutionary business idea and don't want to pay a programmer, so you're going to write it yourself. That's all fine too.
Take it another step further. What exactly is your site going to do? Generally, programs automate tasks that you can already do by hand, but would just be too lengthy, too repetitive, or just too boring for you to do yourself. So whatever you're planning on making, come up with a rough idea on how it'll work. If you're going to make a social network, then you'll need some basic functionality, like registration, logging in, maybe messages, or a way for people to post stuff. You're not just making a home page here.
Now that you have something in mind, keep it in mind while you're working on something. Maybe during your book chapters, youtube tutorials, or Udemy lessons, you'll realize that you're learning something that might be helpful. After each one of those lessons, take the time to think about where you can apply what you learned to your project. Maybe you learned about databases in your lesson, and you realize that you could store your user data for your social network in a database.
Each time you find something useful, write it down, along with where it can be used. Soon enough, those lines will be filling up, and you'll not only be motivated by the fact you're learning things, but also by the fact that you're getting closer to knowing what you need to know to accomplish your goal.
Now What?:
Congratulations! You made it through your course/book/tutorial series! And now that you've actually sat down to try and work on your project, you think that you don't know anything, or that nothing that you learned could be applied anywhere.
Take the sheet you've been writing on out. You have been taking notes already about how you can apply things. Surely, at the end of your big course/book there was some sort of final project that was decently sized. You already sort of know how to organize things. Don't sweat functionality too much, just focus on making trivial things work. Set up that database, and make some code that stores data in that database. Once you get that working, add something else to it, like the ability to take in user input like a username and password. Work your way up from the absolute basic parts of the program.
Q: All the tutorials teach the same thing! Where do I learn useful stuff?
A: Even now you're realizing that what I said about all materials being the same. The only way to go from here is to practice things on your own. That project helped with your motivation, so now try to put things together and make it happen, even if it is really basic.
Q: Where do I find more problems to practice with?
A: I have a few favourites:
If all else fails, just read more books and once those books give you an exercise, solve it before reading onwards for the solution.
Q: Project Euler is too hard and I can't figure out how to do Fibonacci sequences! Where can I learn?
A: Like I said, Euler is very math heavy. That means lots of logic and algorithms to get you the right output. So, start learning about algorithms and math. My favourites are
Q: Wow, those are some cool books! But I still can't come up with solutions to the problems they pose without looking at the solutions pages. Now what?
A: Your mindset is wrong. Especially the Udemy course, it's not particularly difficult as long as you have competency in the language. Most of the problems in the course can be solved in 50 lines of code or less (in C++ at that, including whitespace between functions, methods, structures, etc.) At this rate, the best book I can recommend is It doesn't just go over problems, but it also covers how to tackle problems, break them down, and come up with new ways to think about the problems in order to solve them. Get through this book and you'll be sure to start being able to work through something. Take another whack at Euler.
Q: Algorithms are cool and all, but I still don't know what a fibonacci sequence is?
A: You need math now. Sorry, can't help you here. The easiest way is to just take a few math courses in uni, or do pre-calc in summer school or something. You can get textbooks online at the above mentioned sites, though, if you want to try learning it on your own. Also be sure to check your library's science section; there will usually be a few books on highschool/first-year uni level math/calc/linear algebra there.
Doing More:
So you're able to solve lots of different problems now. You can come up with solutions to do cool computations and are actually gaining some competence. But now, you're stuck on doing some other task which is a little more abstract. Maybe you're trying to write an actual user-interface for a program, instead of your black/white terminal. Or perhaps you're trying to make one program interact with another. This is where libraries and APIs come handy.
Q: I'm trying to make some web requests and do stuff with the internet. How?
A: Have a look at networking. You'll learn about packets, protocols, routing and more. Once you understand it theoretically, you can start working with it with some tutorials. Search for a library that does something like sending a web request for you, and learn how you can get the data. Then apply your algorithm knowledge above to make your program do something with the data.
Q: How can I make cool interfaces for my C/C++ programs?
A: Again, search for frameworks or libraries that do just this. You'll probably need to do a lot more learning, though, even as far as another language, like XML, QML, or even just simple HTML for web applications (the Electron Javascript Framework does this.) Practice makes perfect.
Q: I'm trying to do X! How?
A: You already see the pattern here. Google for a framework that does it. Maybe search stackoverflow for solutions on how people have done it. Eventually, you'll come across something and you'll be able to take it and use it for your projects.
Eventually, you'll have a nice toolbox that you can use to get most tasks done. Take it another step further, though. Have a look at the code for those libraries and frameworks, and understand how they work. It might be daunting, especially with something as big as Qt or something that's closed source, or uses some other low-level commands. You might need to really use all of your brain power just to understand what's going on, especially when they use other low-level libraries like the WinAPI/Linux API to draw things on the screen. It's tough, but understanding will make you much better, since you'll understand why things break and how you can stop them from breaking.
Once you understand the functions, try to rewrite them yourself. It'll be basic and it's unlikely you'll ever actually use your own code for other projects here, but again, your understanding will deepen and you'll get even better as a programmer.
Conclusion:
As mentioned in the intro, this is by no means a complete guide or list on things to do to make you an amazing programmer. There are way too many fields in programming and development to write a be-all/end-all guide, but this should be enough of a launchpad for you to bounce off of and finally make use of your time, switch around your mindset, and gain enough competence programming to actually come up with some great programs. Have a look at GitHub and other open-source projects in your spare time, and understand how they work.
If there is demand for other guides of this style, I'll try to write something up. No guarantees, since they're pretty time-consuming and I'm not particularly fluent in all fields of development, but I can certainly apply these subjects more specifically to other languages and fields.