<p>@Sejine: It’s usually kind of a mix between the practical and the theoretical side of CS, however syntax/grammar is superficial at best, the majority of the material you’ll be dealing with at the practical level will revolve around writing code in a variety of manners, from digital logic to designing a graphical interface for your introductory programming course. Here’s a brief odyssey of what you should expect from the practical side of computer science.</p>
<p>For your first few semesters, you’ll be tied down to one or two languages that your university deems appropriate for introducing you to programming, be it Java, Python, Scheme, C, or what have you. Here’s a brief outline</p>
<ol>
<li>Intro to language X (you’ll learn how to read code and filling in blanks to complete nearly finished programs written by your TA)</li>
<li>Data Structures in language X (you are thrown in the deep end, figuratively; you start writing stuff and are introduced to the concept of “things are better now” applied to computer programming)</li>
<li>Intro to function programming (think of this as geometry; it’s kind of interesting and makes algebra seem a little bit funner, but you have no idea why they teach it or what you would ever do with it when you grow up as a super hero. Super heros are a metaphor for startup “hackers”, I can’t count how many interns I’ve ran across telling me how they’ll write everything as monads (this is essentially the hippest thing on the compsci block right now) and proceed to describe why it’s a good thing to model the computation x + 1 as a monad all the time (It’s Modular!))) Don’t get me wrong, geometry is used everywhere, especially in places where you don’t expect it, and as you’ll find with functional programming, that ***** is used everywhere in the academic world. </li>
</ol>
<p>Don’t get distracted by what these courses are introducing you to, they all have one thing in common and that’s all that counts: they teach you how to program, and they give you a chance to discipline yourself into a good programmer. After the first semester, you’ll gradually realize that programming isn’t about Java/Python/Scheme/C, that even the practical side of CS abhors being tied down to any language in general. Almost all programs written in language X can be elegantly translated into language Y with almost zero thought associated with the process. What matters is that you understand why you do so-and-so given circumstances so-and-so. Given the advent of google, it doesn’t even matter whether you can figure out how to implement that so-and-so on your own, if you just know when to use that so-and-so and can give a half-assed description of what you want so-and-so to do, you’re already a good programmer.</p>
<p>Following this, there’s two more semesters of practical computer science that have little to do with programming except to use it to see how the computer behaves. Note the change in the goal here, we’re no longer computing things, we’re now looking for quirks and traps in the computer and how to avoid its short commings. The first of these two courses, computer architecture, is usually taken immediately after data structrues or functional, and the latter is usually not taken until towards the end of your degree.</p>
<ol>
<li><p>Intro to computer architecture (you’ll learn what makes your computer tick, sometimes even literally. You may be exposed to digital logic in this course and may be asked to implement your own processor. Don’t worry, at the level of detail expected, it’s much easier than it sounds)</p></li>
<li><p>Operating Systems (unlike the name of the course, you don’t write an operating system, or if you do, most of the hard part has already been filled out for you (see Nachos). What you do learn is how to play God and manage your children so that even if they can’t learn to share on their own, you cram the table manners down their throat in the form of a despotic theocracy with very strict one-strike tablemanner laws. And then you learn a lot about networking, and a little about file systems and process security)</p></li>
</ol>
<p>Again, you’ll still do a lot of programming in 4 and 5, but it’s no longer about what gets outputed.</p>
<p>The practical side of CS is tiny when compared to the theory side (I completed all of these within my first four semesters, each in conjunction with one or more theory course as well, of course I didn’t take anything else besides math and physics either so it’s definitely manageable). Nevertheless, in terms of your future job aspects, these few courses are by far the most important on how well you do at your job, and it’s not because of what they teach you. You don’t suddenly grow out of your habit of forgetting everything taught within a class the moment you step out of the final when you graduate from high school. These courses give you a lot of programming problems, and in order to finish, you’re going to have to write code. Doesn’t even matter if you did well or not. Opimally, at the end of these courses, you should achieve both programming competency and confidence.</p>
<p>Once you achieve programming competency, you can break most problems down into smaller pieces. Not only that, you also know to break down those smaller pieces and the even smaller pieces until at some point, you know your language of choice can handle the tiniest pieces on its own without your guidance. This is what trips most people up at first, but it’s the simplest part. You just need to write a few programs. I know it’s cliche, but practice makes perfect, and if you get to a point where you don’t know how to proceed, just ask google.</p>
<p>Once you have confidence, you’re no longer scared of starting up a project or writing the first line in your program. You just don’t give a crap if what you’re thinking is bullcrap because you have a magical friend, the backspace key. This is usually harder to overcome, the best way is to work on a few really difficult problems that you believe are barely within your grasp, and then keep at it until you succeed. Every time you succeed, you become more confident.</p>
<p>Of course, these two only makes you a competent programmer (competency usually includes confidence as well), it doesn’t give you programming maturity. And by that, I mean experience. Here’s the secret, there’s only one thing that an experienced programmer has that any other competent programmers don’t, well two if you count the carpel tunnel:</p>
<p>Experienced programmers have a sense of job security, so they purposely write bad code, overestimate the amount of time they believe it takes to finish a project, so on. If while you’re consulting, you ever come across a job with a large sum attached to fix a seemingly trivial bug in some code that looks like spaghetti, you’re looking at the aftermath of an experienced programmer moving on.</p>
<p>The theoretical side is much more complicated, but also way more interesting in the practical side, but if anyone wants, I can write a guide of what to expect from theoretical CS too.</p>