<p>So I'm a high school senior now, and I'm taking AP Computer Science, where Java is the main focus. But it just seems so tedious...so many minor details to remember. I really don't like this class at all. But I really want to major in Comp Sci because I like the applications, such as augmented reality, robotics, artificial intelligence, etc. </p>
<p>So...I guess my question is this: Is Java (or AP CS) a good indicator of whether I will like Comp Sci? What is CS really like? </p>
<p>Thanks in advance!</p>
<p>P.S. In 9th grade, I took a course called Intro to Computer languages. It was mainly concerned with Karel and logic. I loved that course.</p>
<p>Introductory programming - like AP CS - is a very poor indicator of whether you will like CS or not. If you enjoyed logic and are good at math, that is a much better indicator. The only thing a CS major should use programming for is as a tool to conduct computational experiments… that is, once you think you’ve solved a problem well, you can program it onto a computer and see it in action. Nobody says you have to enjoy the instrumentation just like physicists won’t unanimously enjoy setting up equipment for experiments. It’s error-prone and not the point of what’s trying to be done.</p>
<p>Logic is the single biggest indicator of whether you like CS. Not just intuitive, simple logic, but formal, symbolic logic as well. The next most important thing I would say is an appreciation and aptitude for puzzles, both graphical and textual. Formal languages, one of the hardest courses for most CS students, is really just a course on word puzzles, at the end of the day. Also, if you like proofs - like from geometry, but not exactly - that’s a must too for courses like algorithms.</p>
<p>It’s a lot of fun and it’s always been my opinion that programming is neither necessary nor sufficient for CS. AP CS is programming, really. There you go.</p>
<p>I loved Intro CS so much that I considered to double-major in CS along with math. Turns out I just like programming. I can put up with theory, but the “systems” topics (computer organization, operating systems, programming languages, compilers, etc) are boring me to tears.</p>
<p>No double-major for me after all, and probably not even a minor.</p>
<p>I’m not a huge fan of the systems courses myself. I can see how useful they are, and can sometimes even trick myself into liking a topic or two by forcing myself to see the mathematics behind it, but usually it leaves a bad taste in my mouth.</p>
<p>I’m surprised you say you can “put up with” the theory courses in CS. Those are some of my favorite classes… more math than computers, really. Speaking of which, I’d probably be a minor in math, but they require you take analysis for a minor… and I just can’t muster up enough interest to waste an entire semester studying it, especially when they’re offering all these fun discrete math electives.</p>
<p>I think I would have really enjoyed the CS theory classes in my freshman year, before I started taking graduate-level math classes. Now the theory classes feel so… watered down. </p>
<p>I feel like I would be wasting a course if I took a class that was not challenging and in which I was already familiar with half of the material. I have no idea where I picked up on formal languages and finite-state automatons and Turing machines. But I remember looking through a Theory of Computation textbook and feeling disappointed because so much of the material looked familiar. And Algorithms, the other theory class at my college, overlaps too much with Data Structures. There are too many other interesting classes I want to take. I think I am in the same boat as you with analysis!</p>
<p>But you are not the first one who is teasing me about not finishing my CS minor. “You are a math major and you are not minoring in CS because of the theory classes?!?”</p>
<p>^ That is fair, the CS theory classes are pretty watered down. The reason, of course, is that 9/10 of the CS majors are in it for the systems classes, and no department wants to fail 9/10 of the students. C’est la vie. I wish it was different but apparently CS is still marketable enough that it gets unworthy people clogging it up.</p>
<p>I wanted to be CS at first, but then I switched over to math. I realized I didn’t like theory in CS, even though I don’t like applied in math. I’m doing a minor in CS now cause I can’t stand the theory classes. But I do like systems, and I also liked my algorithms class, probably mostly 'cause my professor was basically a math professor.</p>
<p>Isn’t APCS only about Java now? That’s pretty much a huge bore; you’re just learning minute details about a programming language that you don’t even really have to know to do CS. </p>
<p>The APCS I took in high school concentrated on data structures and that was pretty indicative of the data structures course I took in college, except for maybe some slightly less rigorous definitions. It definitely opened my eyes to the possibilities of CS and its similarity to math.</p>
<p>All programming classes are boring. If you want a fun class, take algorithms, programming languages & compilers, or something sexy like AI or computer security.</p>
<p>I can’t believe there’s so much disgust with programming… from CS majors! I tend to consider programming to be the computer scientist’s equivalent of an artist’s brush; it is used to express ideas in a meaningful way that others can better appreciate and understand. I love programming, and I do not see how my specialty (computer graphics) could evolve without it. Theory is interesting, sure, but a mountain of research would disappear if nobody bothered looking at the technical challenges in implementing it. </p>
<p>Furthermore, the balance between theory and application is essential in distinguishing computer science from mathematics. The practical considerations of computation should not be considered “impurities” that dilute the curriculum or help students graduate, they are integral to the field’s development. You cannot fully appreciate time constraints and algorithms until you see the effects in practice. You would expect a geologist to actually go out on field expeditions and examine effects of erosion and plate-tectonics in person, wouldn’t you? Comparing algorithms’ runtimes on paper is nifty if you like solving crossword puzzles; seeing your space partitioning algorithm divide hundreds of thousands of triangles into a tree structure in 1/100th of the time it used to take is far more rewarding.</p>
<p>^ It’s fair to say that the computer is the computer scientist’s testing apparatus par excellence, but it’s not really fair to say that programming is the computer scientist’s paintbrush. Programming is just the way computational experiments are instrumented. Sure, it’s good to study instrumentation, but I don’t think anybody can seriously claim that it is as interesting an academic endeavour as, say, actually solving problems.</p>
<p>All the subtlety should be overcome and the creativity spent before implementation begins, or in intermediate steps outside of implementation as the need arises. When you’re doing a physics problem, you solve for the variable you want first before plugging numbers in. That’s physics 101. It’s really not so different in CS… you need to solve the computational program, in words, with proof, before you begin implementation. Pseudocode is an intermediate step.</p>
<p>I don’t mean to diminish the importance of experimental CS, although it’s not my primary interest. It’s certainly important, just like experimental physics is important too. However, I do believe that it’s accident and not essence that CS is an experimental science, because at the end of the day it is a kind of mathematics that happens to be useful for using certain machines, not the other way around. Of all the sciences, in my mind, CS is the least empirical… in fact, computers - modern digital electronic computers - are not necessary to the study of CS. I think it’s important to study them and their uses because of there hegemony on computing, but it would be well not to forget that true understanding of the nature of things doesn’t depend on the details of how technology turned out. Formal languages, complexity, algorithms, data structures, etc. - these things would be unchanged if computers didn’t exist, or at least would be close. Well, maybe that’s not entirely fair, since computer details may influence implementation somewhat, but still.</p>
<p>Good to hear I’m not the only one bored with my programming classes. Are there many programming classes once you get into the upper division work?</p>
<p>Depending on your schools requirements, you may have programming in some of your upper-division courses like…</p>
<p>Compiler Design - usually a compiler design project is part of this with a lot of programming.</p>
<p>Database Systems - If the professor decides to use SQL Server or Oracle, you will create stored procedures with has many programming constructs (if-then, case, loops, classes, object-oriented, etc)</p>
<p>Operating Systems - Programming of UNIX shell scripts may be done</p>
<p>Numerical Analysis - Course is sometimes part of CS programs which include programming of differential equations and matrices</p>
<p>Artificial Intelligence - Programming with the most current AI languages</p>
<p>There will usually be some programming in all your courses, save for the most theory-heavy ones like algorithms, formal languages, complexity, etc. And you might even have programming in these.</p>
<p>However, the emphasis will be refreshingly shifted from programming huge, overarching systems to programming small, specific programs to test one new concept at a time. Well, there are a few exceptions. Some courses - compilers, some computer architecture courses, etc. - can require big programming projects. For the most part, though, I’d say not so much. I would recommend talking to somebody in CS - a professor, maybe - and seeing what it’s like at your institution. It varies.</p>