How to become a software developer?

I’ve avoided being specific here for a couple reasons.

The main one is that, if you’ve properly selected your learning source material then it will provide good examples at your level (if it doesn’t, find more suitable learning material). That book comes with examples in it, and you can try them and try variations on them. It’s targeted at beginners and starts from the ground up.

The other reason is that you said that your goal was to learn C which is fairly low level. Sometimes, it can feel like you’re trying to build a skyscrapers with tweezers even when you know what you’re doing. Deciding whether C is the best tool for a particular job is a whole separate discussion. For the purposes of learning a particular language its less important if it would have been simpler in a different one (say Java, or Python). In this case, you need to additionally learn how to prune/stub out bits that are secondary to the task at hand.

With many of the suggestions you could get stuck before you even start. For example, even to sort a list of strings begs many difficult questions for beginners. Where did they come from? Did you read them from a file (standard input, fopen, std::cin, etc)? Where did you put them (array, vector, list, etc)? What even were they (char*, std::string, etc)? How do you even sort, (implement a sort, use a library, etc)? Then what do you do when you get a compile error that you don’t understand? Pretty soon someone tells you that you should be breaking your code into multiple files and using a build tool like “make” to put it together incrementally. None of those are challenging problems later but in the beginning you could find yourself off in the weeds with no sense of how to get back to what you understand. This is way you would want to favor using the examples from the learning source as they are designed to use what has been explained so far and avoid features that have yet to be explained. This is what I meant by it being a bit of an art.

Obviously, you’ll want to take the training wheels off at some point (just with C you might wan’t to leave them on a bit longer than other languages). When you do get enough of the basics down, here are some practical ways you can cut corners while learning to simplify the process.

  1. Favor adding your program inputs as static data
  • your program will do the same thing every time, but who cares
  • no need to understand files or streams, you can defer this
  • no need to parse text, your data can be data structures ready to go in memory
  1. Favor console applications
  • don’t bother with gui or any graphics until you have a solid grasp of the basics
  1. Avoid using std::cin std::cout
  • just use C style calls like printf()
  • they’re conceptually simpler and cin/cout are terribly designed and often avoided in practice.
  1. Put all your code in one file
  • build and link your entire program with a single command
  • its very simple (and fast)
  • no build tool required (and no troubleshooting incomplete incremental build mechanism)
  • even if you really want to break things up, just make a “bulk.cpp” files that includes all your loose cpp files and build that
  1. Don’t use an IDE (just text editor and command line)
  • no need to learn how to set up a project
  • better to understand exactly what is going on for now
  • using tip #4 makes this a cinch
    fase
  1. Avoid containers
  • containers are great, don’t write your own without a good reason
  • you have a good reason, learn to build them, learn how they work/perform
  • one of the main points of using C is to get direct access to memory, learn how to deal with memory and pointers

Here are couple ideas to get you started

  1. create a static array of ints and print them out to the console
  2. create a function to reverse all elements in a the list, print the list before and after calling the reverse function

I was referring to the functionality of programs you will write (not the topics I listed). Programs useful for learning to program are typically fairly trivial. Conversely, programs which are themselves useful are rarely trivial.

As for the list of topics I gave, I thinks its all useful depending on what you need to do. So it could be considered both fairly extensive or horribly incomplete depending on your viewpoint. For example, I didn’t even mention design patterns as was pointed out. But you’ll be able to write useful programs long before getting through all those topics above.

Also, a lot of people have given some really great sources for learning. I didn’t spend any time on this because I was trying to get an idea of how high you were aiming with this first. A lot of people on the internet are quick to point out that you can learn all this stuff online for free without going to school. While this is true (and fantastic) that doesn’t imply that doing it on your own is a good idea if your plan is to go pro. Even if you did want to go to school, all the online stuff is still available to help enhance your experience and accelerate you.

For example, here is a talk by Scott Young who completed the MiT CompSci degree curriculum on his own in one year:

There is a actually a huge movement out there with players like MiT OCW, EDx, Khan Academy, and many many more once you start digging.

I tried to post sooner, but alas.

As always, I would say, look at what you’re trying to accomplish?

You mentioned in one of your posts that you lack the software skills for DevOps, in that case, look at your “destination”:

What type of environments are you trying to get into?

While quite a few environments run on PHP or Java, some run on Node, Ruby or Rails.

The important thing to know is that you don’t need knowledge in those fields to perform the role.

Does it help? Absolutely! There’s nothing more awesome than being a unicorn! But it’s far from a requirement to be proficient in that language.

While the webfarm might be running Glassfish or Tomcat for the Application layer, the front-end might be running a combination of Node and NGINX, with an Oracle, MySQL or even Hadoop backend. For deployment, it may use an in-house set of scripts or Python. There might even be some legacy PERL scripts in there, or some smart donkey might have used PERL one-liners in the scripts.

Point being? Unless you’re focused on becoming a full-time software dev in embedded systems, it might be completely pointless to learn C/C++. Nowadays there’s the ECMA script standard, which is sort of the next-gen brain child of a lot of the languages I mentioned before. It’s like PHP, C/C++, Java, PERL, ActionScript, and Javascript; actually, it IS ActionScript, but that’s completely beside the point.

The real point is that it’s all about the programming paradigm; you need to understand how loops work, how to execute functions/methods, how to iterate, how to pass variables, how memory works for referencing or passing.

Imho, the best way to learn is a steep learning curve.

I would challenge you to make the new “Marvin”, but first take a Python book and learn the first steps. Python is great to learn to basic principles and then get you on your way to a more “free” language and before you know it, you’ll be programming most of the languages/environments above!

@toma: This might sound redundant, but you’re not stupid. You can do this, the only mistake you can make is to underestimate yourself.

You know where to find me if/when you have questions!

If you want to be employed, learn web technologies, especially with your background.

I’m a 15 yr veteran in C/C++, and find my job prospects are somewhat limited, unless you want to work for large companies.

The vast majority of the jobs I see are for various web technologies, Java, Javascript, php, WAMP. LAMP, and whatever other web language is cool today etc.

C# is the language I would learn if I was interested in a more traditional programming language, C/C++ are becoming harder and harder to find.

C# is a much better language for writing clean readable code, and you can do some cool stuff like program in Unity for games etc.

As for where to start? find something you like (if you like games, do a unity tutorial, you’ll learn the easy programming concepts in C# or Boo or whatever) then grow from there.

I keep trying to teach myself web technologies, because I find it is a part of my arsenal that I lack, but have trouble getting started, finding something of interest, and learning to make that is the best way to get around this imho.

1 Like

Find the work you want to do and do it. Find something interesting and do
it. Learn the tools and methods.

The Language is less important than programming patterns. If you focus on
the Language rather than programming patterns, your opportunities will
always be more limited.

So what work do you want to do?

The two books I return to again and again are “Computer Graphics: Principles & Practice” and (more importantly) “Design Patterns”.

Thanks a bunch everyone. I think this has to be one of our best threads yet!

1 Like

I don’t want to sound a sour note, but just to point out that if you program in a functional style (not necessarily pure) it really does reduce the relevance of design patterns. I’m happy to talk about it at length if you’re interested. :smile:

1 Like

Would you be up for doing a workshop/talk on that?

What is your functional programming language of choice?
Or are you programming C with a functional style

Intercal in a functional* style.

*dysfunctional is a functional style…

friends don’t even joke about Intercal, assembler is easier.

I’m a big proponent of Scala and I’d be happy to do a talk on it. Maybe next Tuesday night?

In fact I’m doing a workshop next month already as part of the Polyglot Unconference, but that one’s not free.

Just don’t do this and you’ll be fine.

Would be happy to help you personally. Got lazy and didnt read the other posts so might repeat some ideas. Start out with python then move onto C++. You might wanna consider C instead though as Aruinos are written in C. But if you learn C, after it learn C++ as they are pretty close. You might want somebody to explain object oriented programming in person to you i.e. me. After that transfer over PHP. Learning that, some basic SQL, and Javascript wouldn’t hurt. HTMLisn’t a programming language exactly, so learning that takes 1 hour to 2 hours for a reasonable amount of understanding.

First step: Stop doin’ wrong

1 Like

@toma My advice is to start writing as much code as you can. Build things. What you build doesn’t matter as much as gaining experience trying to solve problems with code. It’s only after you’ve written a good amount of code that you can start figuring out what approaches were good and which lead to dragons.

Find some open source code you already know as a user, look if they have bugs you could try fixing. Or extend it somehow.

2 Likes

@toma you a sw dev now?

1 Like