AndyGlosta said:
I've recently made a final decision that 'Programming' is the career path i wish to take.
I've been playing around with Visual Basic for about a 6 months now and i wish to take it to a higher level. I've been reading online courses for C++ and watching video tutorials.
This, i realize, is nowhere near enough!
I continue to read through as much of this material as possible as I would like to become, shall we say 'fluent' in the language.
My question to the world is:
How can i get from where i am now to a qualified programmer by avoiding any schools or universities?
I am aware and prepared for the long, possibly frustrating, years to become fully knowledgeable in the subject, but i am in a position where i can only teach myself.
What sort of path should i take? e.g:
C++ Langauge >moving to> Computer Science Course >moving to> Software Developer Course.
I will be attempting to take the 'Courses' as home-study courses but would really like to know what kind of route i will need to take.
Thank you for your time.
I used to be a programmer so I'll see if I can give you advice I wish I knew when I started out.
When you are developing you will end up knowing a lot of different perspectives about general development. There is a spectrum of perspective that on one end focuses on the platform to the other end that focuses on the application. To understand these issues you should learn some assembly for 32 and 64 bit platforms as well as a higher level language like C++. The assembler will help you understand the architecture of a particular platform and help you understand the relationship between the high level code you write in C++ and how that translates to instructions that are executed by the CPU.
After learning these two things you will learn how to think of software as a hierarchy of libraries, APIs, data structures, flow control, and other mechanisms that focus on how to "decompose" software in a logical way so that you can write software that is reusable, component and/or service based, and in other ways that more or less let others use it a
tool in a toolbox.
Once you've done this, you then have to learn specific things about the domain of what you are trying to program. Databases use SQL. Video games use a lot of math, custom compilers, computer graphics, AI, physics, numerical libraries, and a hell of a lot of other things.
Personally apart from domain specific knowledge, I think that you should focus on flow control in a variety of languages and platforms. Most is procedural meaning that you have your code in memory and basically the code goes from one instruction to the next unless its a) interrupted b) the code uses a software jump (conditional or unconditional) or a call statement. There are other models of computing but for your purpose I would become familiar with this.
Also knowing about flow control will help you debug. Once you get a feel for flow control and tracking the "state" of the machine you will be able to debug a lot more quickly and with ease.
Things like data structures are important but you should be comfortable with knowing about flow control and tracking a machines "state" before you do these. If you know what the state of the machine will look like then you are going to be a good programmer.
There is a lot of things that C++ will teach you. Templates is a great paradigm to learn as well as the object oriented stuff. A lot of good design will build on these but again going back to flow control and tracking of state, you will want to do a few things:
1) Recognize that for a piece of code, you will want to identify what "machine states" will be available to the rest of the machine and what will not be available.
You will need to do a course in operating systems to know the boundaries for things stored in memory. (For example processes can share information but its not setup the same way that threads in a process are setup where threads can access other thread information a lot more easier than in the case of a process)
2) Recognize the flow control of the entire system including details about external libraries and their associated context data, other threads, and the flow control of data in every device that uses it that is associated with your application.
If you're writing code that deals with sending data across networks you will more or less end up designing protocols in your application to deal with all the possible circumstances that your application needs to handle. This comes back to again knowing your state and flow control and handling and tracking everything relevant to your application.
I recommend you learn about networking when you learn about Operating Systems (it may be a part of it as it often is).
There is a lot of things to learn but that kind of thing is contextual to what you're doing and like any other subject you will build up this contextual knowledge with experience. If you are able to eventually look at large bodies of code and decompose them in a way that you can visualize what should happen and relate to what will or is happening then you are doing well.
Best of luck.