Take the 2-minute tour ×
Programmers Stack Exchange is a question and answer site for professional programmers interested in conceptual questions about software development. It's 100% free, no registration required.

I have been programming for 5 years since middle school. I have learnt pretty much all the basics of programming and went through C/C++ and Java language. However, the college in my country is not really offering me the knowledge that will help me improve on in my programming career. Therefore, I have to self-educate myself. Lately, I have been picking up native windows api and give it a try on making window application according to what I have in mind. However, I failed constantly and found myself lacking knowledge in all directions: Low-level machine (system, arch, asm, etc.), Windows internals (kernel, system, etc.), Networking (TCP/IP etc.), Designing skills, Graphics programming, and many more of those advance topics. Therefore, right now I'm at the edge of deciding whether to continue with windows development, or to dig deep into low-level machine structure, or to dropout all of that and go for internet-oriented programming, or to do any other available options.

Ideally, I would want to know all of them (I really love all of the topics in programming) and would want to deeply understand every one of them. However, I don't know where to start.

So any guideline from professional programmer of how should I continue my learning path? And what would be the best resources?

share|improve this question
    
"the college in my country is not really offering me the knowledge that will help me improve" is a really easy thing to say. I think though that after the thought you probably will realize just how much it did help you. What sorts of classes do they offer? Where are they lacking? –  Mike Jul 12 '11 at 15:55
    
They are very high level oriented, and not offering deep understand (mostly intended for non-programmer to become a programmer). However, I've been doing all of that for 5 years now, and another year of that would hold me in the same spot. I really need to find a way to improve and break this stalemate –  biloon Jul 12 '11 at 15:58
    
@biloon: I think there is a good underlying question here, I've retitled to try and get what you are after but please check the faq programmers.stackexchange.com/faq and see if you can reword to make this a little less personal and a little more general... also good luck :-) –  DKnight Jul 12 '11 at 15:59
    
"found myself lacking knowledge in all directions: Low-level machine (system, arch, asm, etc.), Windows internals (kernel, system, etc.), Networking (TCP/IP etc.), Designing Skills, Graphics Programming, and many more of those advance topics." These are all very different directions, why do you think you need to know them all? You can go very far and never deal with any of the things you listed. –  unholysampler Jul 12 '11 at 16:00
4  
while (!satisfied) { read(); code(); think(); } –  Steven A. Lowe Jul 12 '11 at 19:28
show 5 more comments

closed as too localized by Yannis Rizos Feb 9 '12 at 5:33

This question is unlikely to help any future visitors; it is only relevant to a small geographic area, a specific moment in time, or an extraordinarily narrow situation that is not generally applicable to the worldwide audience of the internet. For help making this question more broadly applicable, visit the help center.If this question can be reworded to fit the rules in the help center, please edit the question.

7 Answers

You are basically saying "I've been coding for a few years, how do I learn all of computer science now?" and there is no simple answer. There are many books and resources that can teach you those things, but there's much more material than you can possibly read and apply in a reasonable amount of time.

So first of all, figure out what your goal is. Do you want the equivalent of a computer science education? Any good school will teach you fundamentals of system architecture, but that doesn't make you an experienced architect. Do you want to understand how all those different areas work or do you want to focus on one area, master it, and then apply what you've learned to design something new.

I think you should first read about the topics in computer science, and then focus on something for there. The IDEAL resource is MIT OCW: http://ocw.mit.edu/courses/electrical-engineering-and-computer-science/.

They've basically put up notes and assignments for all their courses online. Look around the curriculum and see the different tracks, and follow through and get a real education.

share|improve this answer
    
MIT OCW is great, but sometime I feel like wanting to get close to real process. I think I still lack what it takes to be a good programmer---- able to work cooperatively, get organized, and be clean and simple (I have been working alone for 5 years, so I haven't develop much keen sense to real developing environment) –  biloon Jul 12 '11 at 16:31
    
@biloon I don't know how old you are but I assume you're very young. Some things come with age and experience. Work habits (cooperating, organization, and so on) comes mostly from work experience itself than college and formal education, in my humble experience. If you're in college, look for a research assistentship or an internship. It might help you. –  Vitor Jul 12 '11 at 16:46
    
@Vitor Braga I am still a 1st year undergraduate. I am just feeling that the gap between real programming works and my skill are too wide, so I want to find a way to close that gap –  biloon Jul 13 '11 at 2:31
    
@biloon Where I went to study (Federal University of Rio de Janeiro), you could get an internship or a RA after the third semester. I don't know if this is an option to you, but I really advise you to. IMHO, you want a lot to learn and, without guidance, all this energy just ends up bouncing from knowledge area to knowledge area, without focus. I had the same problem. A boss and deadlines are the best thing to give one focus. Don't you have a faculty member that you like most? You can talk to he or she for guidance. Most professors will be really glad to meet a motivated student. –  Vitor Jul 13 '11 at 2:44
add comment

If you want a very thorough insight into all aspects of computers and programming then you can look at the courses on: http://ocw.mit.edu/courses/electrical-engineering-and-computer-science/

This is a challenging path but if you can go through some of the courses on there it would be really beneficial (Some key courses: Introduction to Algorithms, Programming in C, Artificial Intelligence) in gaining an in depth knowledge of computers and programming.

share|improve this answer
    
+1 for the open course at MIT. There are also plenty of other open course on the net that can be checked out! –  tehnyit Jul 12 '11 at 20:07
add comment

It's not possible to deeply understand everything. Instead you should pick what you like and make that your specialization.

And for the best resource to learn, you should know it already. It's the internet. Just pick a usergroup (For example Java Usergroup) or follow a technical blog. To be honest, almost everything that I learned in the college are not really being used.

Other advice. Select the best software vendor in your country and work there. It will helps you understand the software development live cycle and widen your perspective. If you can't find it, it's time to go to other country.

share|improve this answer
    
"To be honest, almost everything that I learned in the college are not really being used." truly agree with it (I'm not anti-college or any kind) I feel that college employ too much systematic approach in learning programming and dropping details. "If it is not important, then don't teach it" sort of thing I think. As for me, programming is like an art to me. It is about deep understanding and little details that make programming feels great. –  biloon Jul 12 '11 at 16:35
1  
+1 for "use the Internet". It's kind of ironic to ask a question about where to find answers about programming questions on this site ;-) –  Jörg W Mittag Jul 12 '11 at 16:42
    
Hi Biloon, I think you misunderstand it. There is no such thing as "not important then don't teach it". College only give you the generalization of the knowledge. You should be proactively continue from what being taught to you. There is a quote "Give a man a fish and you feed him for a day. Teach a man to fish and you feed him for a lifetime". –  Rudy Jul 13 '11 at 2:51
add comment

I would start with learning about computer architecture and low level languages. This has helped me in several scenarios and is a good thing for any programmer to know. I became an electrical engineer in school and learned a lot of this before becoming a full time developer and it has paid off in spades.

Computer architecture lecture set http://www.youtube.com/watch?v=4TzMyXmzL8M

However, If you need to learn things from the ground up in a structured fashion pay for the service of pluralsight.com. This has helped me greatly in many topics and gives a good starting point to get your feet wet. They post only video screencasts and there are new videos each week. Our campany just bought a year's license but I think there is a free trial.

Hope that helps you out.

share|improve this answer
add comment

You cannot learn everything at once, and in trying to do so you may end up not learn enough about anything to be effective. Pick some topic, say machine architecture, that you want to learn in your spare time. Stick to it for a year or so. During the course of that year you will inevitably become frustrated and tempted to start dabbling in some other area, say web programming. Do not give in! All too often this is just your inner child saying "This is hard and boring, show me something easy and shiny!". Once the year is done, you can move on to a different topic and repeat the process.

It may be that school and your self-education efforts have saturated your appetite for abstractions. In that case, pick an open source project that interests you. Take a look at their bug list. Find a bug that you'd like to tackle. Fix it, test it, and offer them the fix. Repeat.

I'd emphasize I'm talking about what you do with your spare time. The real world places obligations on us, and you probably shouldn't use your self-education as an excuse to ignore school or work. Some folks do get away with that, but it's a high risk bet.

share|improve this answer
add comment

Let's start with some basics:

  1. Do you know what learning style works best for you? For example, does a generic example without specific details give you enough detail to grasp a concept or do you need a handful of examples to see the pattern? Are you better with hands-on figuring out something completely on your own or do you do better as part of a group? How well can you read something and get it versus hearing it?

  2. Have you checked all the different kinds of options the college in you country offers? How certain are you that taking such courses wouldn't give you opportunities to teach others that may show you something that does improve your programming career by giving you options to help guide someone more junior than you? How do you that what you know is all the basics?

These are just some of my suggestions for a starting point.


Based on the comment: My revised suggestion would be to find mentors for your next big hurdle as it seems you have done most of your work alone which means it may not have been peer reviewed.

share|improve this answer
    
My learning style is both active and passive. Usually I look up for either examples first, then search for explanation behind it later, or briefly overview all the topic and gain deeper through examples and experimentation. For college, I should say that I am not westerners, so basically I don't have much freedom to choose my own college. It is locked: I could choose anything but must be from this college. –  biloon Jul 12 '11 at 16:27
add comment

Therefore, I have to self-educate myself

This is what college and Computer Science really is about. Instructors are the only to monitor and critique, and explain things that are not very clear.

I learned one thing the hard way, no one is going to hold your hand and explain an API, advanced programming techniques, graphics programming and anything else you wish to learn to you. You have to go find it yourself.

share|improve this answer
add comment

Not the answer you're looking for? Browse other questions tagged or ask your own question.