<p>I am a student studying software development, and I feel programming, in general, is too broad of a subject to try to know everything. To be proficient, you have to decide which areas to focus your learning and understanding. Certain skill sets synergize with each other, like data-driven web development and SQL experience. However, all the win32 API experience in the world may not directly apply to linux development. This leads me to believe, as a beginning programmer, I should start deciding where I want to specialize after I have general understanding of the basic principles of software development. </p>

<p>This is a multi-part question really: </p>

<ol>
<li>What are the common specializations within computer programming and software development?  </li>
<li>Which of these specializations have more long-term value, both as a foundation for other specializations and/or as marketable skills? </li>
<li>Which skill sets complement each other? </li>
<li>Are there any areas of specialization that hinder your ability of developing other areas of specialization.</li>
</ol>

[{'answer_id': 17336, 'author': 'N8g', 'author_id': 1104, 'author_profile': 'https://Stackoverflow.com/users/1104', 'pm_score': 3, 'selected': False, 'text': '<p>Not to directly reject your premise but I actually think being a generalist is a good position in programming. You will certainly develop expertise in specific areas but it is likely to be a product of either personal interest or work necessity. Over time the stuff you are able to transfer across languages and problem domains is at the heart of what makes good programmers.</p>\n'}, {'answer_id': 17339, 'author': 'TT.', 'author_id': 868, 'author_profile': 'https://Stackoverflow.com/users/868', 'pm_score': 2, 'selected': False, 'text': '<p>I think the more important question is: What areas of specialization are you most interested in?</p>\n\n<p>Once you know, begin learning in that area!</p>\n'}, {'answer_id': 17345, 'author': 'rptony', 'author_id': 1781, 'author_profile': 'https://Stackoverflow.com/users/1781', 'pm_score': 5, 'selected': True, 'text': "<p>Ben, Almost all seasoned programmers are still students in programming. You never stops learning anything when you are a developer. But if you are really starting off on your career then you should be least worried about the specialization thing. All APIs, frameworks and skills that you expect that gives you a long term existence in the field is not going to happen. Technology seems changing a lot and you should be versatile and flexible enough to learn anything. The knowledge you acquire on one platform/api/framework doesn't die off. You can apply the skills to the next greatest platform/api/framework. </p>\n\n<p>That being said you should just stop worrying about the future and concentrate on the basics. DataStructures, Algorithm Analysis and Design, Compiler Design, Operating system design are the bare minimum stuff you need.  And further you should be willing to go back and read tho books in those field any time in your career. Thats all is required. Good luck. </p>\n\n<p>Sorry if I sounded like a big ass advisor; but thats what I think. :-)</p>\n"}, {'answer_id': 17346, 'author': 'Mark Glorie', 'author_id': 952, 'author_profile': 'https://Stackoverflow.com/users/952', 'pm_score': 2, 'selected': False, 'text': "<p>I would think the greatest skill of all would be to adapt with the times, because if your employer can see this potential in you then they would be wise to hold on tightly.  </p>\n\n<p>That said, I would advise you dive into the area YOU would enjoy. <em>Learning is driven by enthusiasm</em>.  </p>\n\n<p>Since my current employ is with an internet provider, I've found networking knowledge particularly helpful. But someday I'd like to play with 3D graphics (not necessarily games).</p>\n"}, {'answer_id': 17593, 'author': 'Brian Leahy', 'author_id': 580, 'author_profile': 'https://Stackoverflow.com/users/580', 'pm_score': 1, 'selected': False, 'text': '<p>Go as deep as you can starting off in one environment, win32, .net, Java, Objective C... whatever.  </p>\n\n<p>It is important to build the deep understanding of how X works... so that you can translate the same concepts into other languages or platforms/environments, if you so desire.  </p>\n\n<p>"Are there any areas of specialization that hinder your ability of developing other areas of specialization."  Sort of, but nothing permanent i think.</p>\n\n<p>Since I am relatively green myself (less than 4 years) I come from a really OOP mindset.  I\'ve rarely jumped out of .NET, so I had a hard time on one job when coming into contact with embedded code.  With embedded programmers fearing object creation and the performance loss of inheritance.  I had to learn the environment, seriously low memory and slow clock times, they were coming from.  Those are times to grow, I had a better time at it because i understood my area pretty well.</p>\n\n<p>I will say if you pick something to specialize in for marketability and money, you will probably burn out fast.  If you do start to specialize pick something you enjoy.  I love GUI programing and hate server side stuff, my buddy is the opposite, but we both love our jobs.  If he had to do my job, and I his, we would both go insane out of boredom.</p>\n'}, {'answer_id': 17971, 'author': 'Chris B-C', 'author_id': 1517, 'author_profile': 'https://Stackoverflow.com/users/1517', 'pm_score': 1, 'selected': False, 'text': '<p>As a student I\'d recommend forgetting about what you\'re programming and focusing on the software process itself. Understand how to analyse a problem and ask the right questions; learn every design pattern you can and actually <strong>apply them all</strong> to gain a real understanding and appreciation of object-oriented design; write tests and then code only as much as you need to in order to make the tests pass. I think the best way to really learn is to just code as much as you can - the language and the domain aren\'t important, browse <a href="http://www.sourceforge.net" rel="nofollow noreferrer">sourceforge</a> and <a href="http://www.freshmeat.net" rel="nofollow noreferrer">freshmeat</a> for any interesting-sounding projects and get involved. What\'s important is understanding the fundamentals of software engineering.</p>\n\n<p>And yes, this includes C. Or Assembler. This is the easiest way to get a good understanding of how your computer works and what your high-level code is actually doing.</p>\n\n<p>Finally, never stop learning - Service-oriented architecture, inversion of control, domain-specific languages, business process management are all showing huge benefits so they\'re important to be aware of - But by the time you finish studying and join the workforce who knows what the next big thing will be?</p>\n'}]
['https://Stackoverflow.com/questions/17320', 'https://Stackoverflow.com', 'https://Stackoverflow.com/users/1880/']