<p>Ok, I know this is a little early to think about, since I'm an incoming freshman, but I like to plan things out. I was looking on my uni's web site and it seems there are a few concentrations for a CS major and I was wondering which one would be the most beneficial (for both grad school and career).</p>
<ol>
<li><p>General CS - a bit of everything - theory, applied, EE, etc.</p></li>
<li><p>Computer security - application security, secure networks, crypto, secure software development</p></li>
<li><p>Computational intelligence - AI, data mining, biologically inspired computing, computer vision</p></li>
<li><p>Software engineering - software testing, software project management, software design methods, etc.</p></li>
</ol>
<p>Theory - compiler theory, algebraic data structures, computational complexity, etc.</p>
<p>Any answers are appreciated.</p>
<p>For general applicability to industry software jobs, consider including the following courses in your plan, in addition to whatever area interests you the most:</p>
<p>algorithms and complexity
operating systems
networks
databases
security and cryptography
software engineering (one overview course)</p>
<p>If you want to go on to a PhD program, you may want to add courses in compilers and computer architecture / hardware design to get good breadth.</p>
<p>It is definitely a good thing if your CS courses give you experience using various different programming languages.</p>
<p>For the networks course, my uni has two courses - “Computer Networks” and “Network Programming”. The former seems to be very math based, as it requires Calc 2 and Stats as a prerequisite, while the latter is more programming based. Which would you recommend?</p>
<p>Perhaps both? One can help you understand design issues in terms of bandwidth, latency, congestion, etc., while the other can help you write networking software.</p>
<p>Theoretical CS would be the best for grad school as well as in general, I believe. The reason is that it’s theoretical (i.e. not necessarily concerned with applied practices or ideas) and will offer a more fundamental view on what computation is, almost regardless of what tools are used to do it (and tools can always be designed). Supply by adequate math and you’re building yourself a fundamental understanding of the field, which should make applied areas more approachable. Theoretical CS would for example offer you an understanding of programming language theory as well a compilers, which enables you to make informed choices regarding what is “good” and what’s “bad” and why is it so, rather than being handed Java or something popular and told that “this is the industry standard”, which doesn’t really tell anything about WHY it’s an industry standard or why it maybe shouldn’t be (I think it definitely shouldn’t be from a programming language theory perspective). You need the theory to understand why there are certain things in computer science and to be able to draw a distinction between “good things” and “bad things”.</p>
<p>The list that UCBAlumnus posted would be the best route as that prepares you best for entry-level software engineering work in the most widely used areas in CS. Graduate CS programs are “all over the place” as far as curriculum structure. Some schools will let you pick 10 CS courses that interest you while others will make you take “grad versions” of the CS core first then make you take school-defined focus areas. Plus, you may decide to attend grad school later, so might as well be job-ready just in case.</p>
<p>It is very hard to answer that question now. When you get to your junior year, you will have a good idea which specialization is better for you</p>
<p>They all sound interesting. Your early classes should help you decide what best fits your talents and interests. </p>
<p>I’ve long been an advocate of students at least considering a tech writing class. (I had a technical communications concentration. The “know thy audience” themes have been helpful inside and outside of work.) A user-centered design kind of elective might be useful, if not already part of the required courses.</p>
<p>^ Due to dual enrollment credits, I have a one less class than I should second semester. Hopefully I can take human centered design then, if it doesn’t require prerequisite engineering courses.</p>
<p>If you’re unsure at all, stick to the general CS option, and make sure you take a suitable core curriculum. ucbalumnus’s recommendations are good, although I’d suggest taking theory and architecture courses before database and security courses. You can specialize in extracurriculars, research or graduate school; use undergraduate coursework to get as much breadth as possible.</p>