Dismiss Notice
Join Physics Forums Today!
The friendliest, high quality science and math community on the planet! Everyone who loves science is here!

How do I become a 'Software Developer' from scratch?

  1. Mar 21, 2010 #1
    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 realise, 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 knowledgable 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++ Language >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.
     
  2. jcsd
  3. Mar 21, 2010 #2
    You've gotta teach yourself enough so that you can make valuable contributions to some open source project. Have a solid body of commits and you've got yourself some real experience. Use that to volunteer at some charity being their programmer and do some good work there. Yes, the non-school path will probably require a lot of free and/or very low paid work, but that's usually how most people get experience. C/C++ is the standard language in the open source world, but you've gotta be good to join in. Start off with the exercises in the K&R book, work on some project euler problems, and just get yourself coding.

    There's also the business app route: teach yourself enough Java to get certified and try to find a starter job and take it from there.
     
    Last edited: Mar 21, 2010
  4. Mar 21, 2010 #3
    Hi, thats for your 'extremely fast' reply. I appriciate it.

    You say that C++ is the standard language out there.
    So, in the idea that i go from learning this myself and doing basically 'free' programming work to start off with, which is fine because i know it will help me in the long run, what would you suggest to study after that? Long way away i know, i am just trying to get some kind of learning path for obvious reasons.

    Thanks again..
     
  5. Mar 21, 2010 #4
    Last edited: Mar 21, 2010
  6. Mar 21, 2010 #5
    After you've learned enough to usefully contribute (which will take a very long time), you've learned enough to do some entry level work. Then it's mostly about experience: the more projects you work on, the better you get at figuring out what separates a good program from a bad one. Basically, free work is near the end of your path, and you're still at the beginning.

    There's all sorts of industry buzz/catch phrases revolving around programming frameworks and architectures and stuff, but that's stuff you mostly pick up by doing (even if you have taken the software engineering/software architecture courses offered by most colleges.) Basically, by that stage of the game you should know what comes next.

    It seems slightly outdated, at least in regards to languages. Python's got a strong following in the teaching/academic community for being a good workhorse/jack of all trades languages, and it's pretty easy to learn. I code in it and am always advocating it as a good way to take some baby steps into serious coding.
     
  7. Mar 22, 2010 #6

    chiro

    User Avatar
    Science Advisor

    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.
     
  8. Mar 23, 2010 #7
    It's worth noting, that while you are learning from courses, it's a good idea to have your own little side projects too.

    I've found that, personally, I just can't learn from "teach yourself xxx" courses, and I learn by trial and error. My latest adventure was into programming for Android (which is in Java, with which I wasn't that familiar with - I came from VB6/.NET like you) I just thought things up, made them. They were stupid little crappy projects, but it got me learning how to do things quicker. Researching problems as I came across them usually led onto discovering things that I wasn't even looking for.

    After a month of making little random crap, I decided to work on a larger project - there are plenty of open source projects out there you can learn from, don't just assume that because it's not in a book it isn't well crafted.

    After a summer vacation of learning from websites and open source projects, I had built an OpenGL game engine, and had a successful commercial game released, bringing in enough money to the years rent.

    If you don't want to go to school or university, and get a degree in this stuff, you should think about releasing a few things yourself, building up a portfolio. That'll help you get a foot in the door - certainly did me.
     
  9. Mar 23, 2010 #8
    (Also, screw assembly code, for now, just focus on learning a more powerful language)
     
Know someone interested in this topic? Share this thread via Reddit, Google+, Twitter, or Facebook