Forgot your password?
typodupeerror
Programming

Getting the Most Out of a CS Curriculum? 124

Posted by Cliff
from the it's-not-just-about-code dept.
Henry asks: "In September I start on a CS-type degree course. I am probably a fairly typical newbie programmer, in that most of my knowledge centers around scripting and high to very high level programming. There's much to choose from: languages, concepts, mathematics, and so on. From previous stories, I know that many readers have strong opinions on the failings and weaknesses of university courses and students. Apart from all of the coding that I will do, what can I do in the coming months to maximize what I get out of this? "
This discussion has been archived. No new comments can be posted.

Getting the Most Out of a CS Curriculum?

Comments Filter:
  • by bheer (633842) <<moc.liamg> <ta> <reehbr>> on Saturday March 31, 2007 @08:27AM (#18554803)
    Get as much math as you can. The analytical skills you pick up will stand you in good stead throughout your career. If math isn't your thing, try to get as many courses that are important to businesses, like systems analysis, the practice of software engineering, control systems -- it'll help you work effectively in the wider world beyond programmers. And if you actually like CS, do look at (my biases) distributed virtual worlds, robotics and pattern recognition ... lots and lots to do in those areas. However (as I mentioned) a basic grounding in math, logic and the usual basic engineering subjects will stand you in good stead in all these areas.

    • Re: (Score:3, Insightful)

      Nah, transfer to law ASAP.
  • by vivaoporto (1064484) on Saturday March 31, 2007 @08:35AM (#18554829)
    What's that? There is no such thing as "Computer Science alike". Either it is Computer Science, a degree that originally has nothing to do with using (or even programming) computers, but with the theoretical science involved in computation processes (disciplines like automata theory, Computability theory, Analysis of algorithms, Artificial intelligence, Formal language, etc., or in the math realm, linear algebra, Graph theory, etc.), or it is not. If studying the inner theories of computation processes is not for you, but you want to become a ready to market programmer, I advise you to choose a Technology Information degree or something more related. It is all up to what you are really aiming to.

    Back in the day I was getting my CS degree in Brazil, where you are required to choose your major *before* you are admitted to the university, the dropout rate in the first 2 semesters was something like 20% (8 out of 40), because students choose CS thinking they would learn programming and advanced hackeries, and game programming when the truth was that they would have to go deep in calculus, algebra, data structures and everything "boring" first, in order to have the scientific basis to progress in the course. People just didn't understand that CS goal is not to produce developers to the market but researchers that have the necessary skill to learn everything they will eventually need to use. IT is a fast moving field, but the foundations of it are mostly static. Learn the foundations once, and keep in pace with the zeitgeist and you will be successful.

    • by linvir (970218)
    • Sounds like the poster is going to Devry or some other non-University "Tech school."
    • Re: (Score:3, Insightful)

      by tomstdenis (446163)
      I disagree with the notion that a CS degree should have no programming aspects to it.

      Yes, I agree the fundamentals (algorithms, data structures, numerical analysis, compiler theory, graph theory, calculus, etc) are more important than say a class on C... But at the end of the day, if you can't develop software you're not a very useful computer scientist (aside from working at the uni).

      I do agree, however, that many CS degrees tend to focus too much on programming languages/tools (things that competent deve
      • by pyite (140350)
        But at the end of the day, if you can't develop software you're not a very useful computer scientist (aside from working at the uni).

        Why? Computer Science does not need to have anything to do with software development. That's what Software Engineering is. I'll leave you with a quote.

        Computer science is no more about computers than astronomy is about telescopes. --Edsger Dijkstra

        • I leave you with a quote:

          Snobby academics are not in high demand. If you want to get a job out of college you need both academics and practical experience. -- Me, right now.

          That is, unless you want to work for the uni. I get that on a whole that CS isn't about programming, but I disagree that you shouldn't have it there. I mean you take English writing and other courses during a CS degree. What does English grammar have to do with sorting or searching or ? If you think you can get a job related to the
          • by pyite (140350)
            Snobby academics are not in high demand. If you want to get a job out of college you need both academics and practical experience.

            I'm not one. I'm an engineer (and not even a software engineer). But I hate that people in the field don't know the difference between Computer Science and Software Engineering.

            Even if your degree sounds multi-purpose, it's likely you focused in one area.

            • I think the solution then is to not offer what you types call a "pure" comp.sci degree. Because no other science is purely book work.

              Computer science is a tool that allows you to sensibly design software. Just like architecture allows you to make sensible home renovation decisions. Or how a medical degree allows you to know how to physically treat a patient. If you just want a book education, save yourself the trouble. Get a membership at a library and read the books. Save yourself the expense.

              At anyr
              • Re: (Score:3, Interesting)

                by honkycat (249849)

                I think the solution then is to not offer what you types call a "pure" comp.sci degree. Because no other science is purely book work.

                Almost any science program focuses on the science itself, not the huge variety of practical engineering-type yak-shaving techniques that you may end up spending most of your time actually doing. There's so much actual science to be learned that you just can't fit in specific classes to cover all the practical details you may need experience in. I don't see that computer scie

                • Hahaha cute.

                  My brothers wife is doing a masters in biology and she spends considerable time in the lab doing non book related work. My friends wife did a masters in geology (underground water studies) and spent considerable time in the field doing survey work.

                  etc.

                  Many sciences have a practical observation/doing side to them. Even physics. It's just plain foolishness to think you're above getting your hands dirty because you're in university. While, yes I agree that CS degrees tend to stray towards the p
                  • by honkycat (249849)
                    Cute? Come on, Tom, don't be a dick.

                    First of all, as someone with both EECS and physics undergrad degrees, who's worked professionally as a hardware/software engineer, and is currently in a physics PhD program, I think I have some idea of how the world works as it pertains to my post.

                    Second, I never argued that a science (computer, physical, medical, whatever) should not have a practical component at all -- I don't have any idea where you got that. My point was that at the undergrad level, the amount of t
          • Re: (Score:2, Insightful)

            I mean you take English writing and other courses during a CS degree. What does English grammar have to do with sorting or searching or ?

            English grammar doesn't necessarily have anything to do with sorting or searching or the like. However, when you're working on a specification for a program you're writing, or when you're trying to explain how your program works or will work to someone else (in QA, documentation, technical support, upper management, etc.) being able to write well comes in handy.

            • And having practical knowledge to know whether your design pays off or not is probably a good idea too n'est pas?

              Sure you may know how to implement, say an efficient matrix reduction algorithm. But the devil is in the details. Try implementing that on say an 8051 or FPU less machine, etc...

              Having practical experience allows you to make *rational* design decisions that are likely to be lower risk than someone who has no experience writing software.

              Tom
        • Re: (Score:3, Interesting)

          by TheRaven64 (641858)

          Computer science is no more about computers than astronomy is about telescopes. --Edsger Dijkstra

          I think you are reading this quote the wrong way. How many of the famous astronomers from history didn't build their own telescopes? Very few. Even these days, astronomers have to know a lot about telescopes; how they work, how they are built, how to effectively use them. I learned most of the optics I know via astronomy.

          Computers are not the be-all and end-all of computer science, but they are the basic, fundamental tool. If you can't write software, then you are as much use as a computer scientist

          • by timelorde (7880)
            ... If you can't write software, then you are as much use as a computer scientist as an astronomer who couldn't build their own telescope. Even if you don't actually end up writing software (or building telescopes), the ability to is still important.

            I thought that's what grad students are for...

      • by dkf (304284)

        But at the end of the day, if you can't develop software you're not a very useful computer scientist (aside from working at the uni).

        Psst! Here's a big hint! You're not very much use at a uni either if you've got a CS degree and can't program. Without programming, all you can do is draw pretty flowcharts on a whiteboard, constructing castles in the air out of little more than hot air and dry-wipe markers. For all that to mean anything (including enough to be worth publishing!) it had better be programmed in

  • by linvir (970218) on Saturday March 31, 2007 @08:39AM (#18554849)

    Before the usual spelling bitchslap about the editing, I want to get this in: Cliff actually did a decent bit of editing on my submission here. He's moved around some of what I typed and tweaked the wording slightly to improve the style. He also changed "CS degree" to "CS Cirriculum", which is unfortunately a bit of an own goal.

  • by EveryNickIsTaken (1054794) on Saturday March 31, 2007 @08:41AM (#18554863)
    Learn Chinese and Hindi. That way, you'll be able to understand the professors.
    • by scruffy (29773)

      Learn Chinese and Hindi. That way, you'll be able to understand the professors.
      Even more importantly, you'll be able to understand the TAs.
    • by lawpoop (604919)
      Yeah, and then you can get a job in India or China after the dollar collapses, also :)
  • by mysidia (191772) on Saturday March 31, 2007 @08:43AM (#18554875)

    In that most of my knowledge centers around scripting and high to very high level programming.

    That's not the mark of a newbie programmer, there are many expert Java programmers out there; just because some of them haven't touched the assembly, doesn't mean they are newbie. Having most knowledge center around high-level language is smart, and it is the mark of a programmer that's realistic, as in actual practice high-level language is used the most (and most sophisticated and desirable to know).

    Probably if you have any prior knowledge at all of the language that will be used for the curriculum, you will be an "expert". Figure out which language will be used and read up on it in advance, look at examples, and bookmark useful URLs.

    You can be a master of x86 assembly and still be considered somewhat of a newbie in a Java programming curriculum. But in case you already know Java, you will start ahead, and have a better chance at mastering the much more important higher-level, language-neutral concepts such as proper design, understanding of algorithms, data structures, etc.

    I suspect many CS programs nowadays may cover low-level language details barely if at all, that may be up to you to study independently.

    Many students start with knowing no language at all. Knowing a little of just one language is what I consider the mark of a newbie. Advanced programmers know multiple languages, usually of different types -- not necessarily a lot of the low-level details, unless they choose to be low-level programmers, or they need some assembly code to solve a performance or to be able to understand their debugger's assembly dump.

    A non-newbie should be able to find good reference material and read from the platform manual and learn parts of the language on the fly, as needed for the problem at hand, and that's about enough. :)

    • Having most knowledge center around high-level language is smart, and it is the mark of a programmer that's realistic, as in actual practice high-level language is used the most (and most sophisticated and desirable to know).

      Most is fine. All is not. A good programmer has to be able to think at multiple levels of abstraction simultaneously. At the end of the day, a high level language is a tool for quickly generating large amounts of assembly (well, machine code, but you get the point). If you don't understand assembly, and you don't understand compiler design, then you won't know what assembly your compiler is likely to generate.

      A good programmer will usually not write assembly, because writing it by hand is not the most

    • by Glonoinha (587375)
      ... there are many expert Java programmers out there; just because some of them haven't touched the assembly, doesn't mean they are newbie.

      I'm going to have to respectfully disagree with you. The majority of 'expert' Java programmers I have met that don't also have a strong background that runs all the way to the bare metal (ie, assembly programming) are not expert programmers, they are generally self taught Java programmers that are either very familiar with a large variety of libraries in Java, or have f
      • by xero314 (722674)

        ...[they] are not expert programmers, they are generally self taught Java programmers...

        I have to take issue with the connotation that self taught programmers are not expert programmers. You do realize the only reason there are Educated programmers is because some where along the way self taught programmers decided to teach. I also don't like that you assume self taught java programmers have no knowledge of lower level development such as C, Assembly and Machine Code. It may be the fact that I learned how to programmer before there were CS degrees available, but I can tell you from experi

      • I think you'll find that most attentive students these days are pretty aware of assembly & JAVA. Most CS courses at degree level will run modules on architecture along with modules on OOP. Mine certainly does. Besides, I don't really understand how someone could be considered an 'expert' JAVA programmer without knowledge of whats happening at the lower levels, even if teh JVM does take that responsibility away from the programmer. The process is a hollistic one if its to be considered an 'expert' one. A
        • OOD, OOP and Java... currently it's the way things are going. (Someone will correct me if I am wrong)

          Let me place some emphasis on the OOD... learn the theory... learn the design patterns...

          When you first encounter OOD try to forget about programming all together. You must begin to visualise objects and their interaction with the world around them.

          If you can get a good understanding of OOD then OOP flows along with ease. ...and for the original question...

          Don't forget to run linux as a platform for all
        • by xero314 (722674)

          Also, you make JAVA sound like some easy language to learn which to my mind does'nt make sense. JAVA is after all a fully Object-Oriented language...

          No wonder the idea of Java (It's not an acronym) as an easy language is incomprehensible too you since you can't even comprehend that Java is not a fully Object-Oriented language. Try using a fully Object Oriented language, such as small talk, and then try and say that Java is fully Object Oriented. I know you going to try and say that event though the language is not fully OO it can be code in a way to be fully OO, but by that definition so can C.

          I don't really understand how someone could be considered an 'expert' JAVA programmer without knowledge of whats happening at the lower levels.

          So to be an expert in modern english (the language not t

      • a strong background that runs all the way to the bare metal (ie, assembly programming)

        I agree with the general thrust of your post, but this is a pet peeve of mine. (Or maybe I'm just showing off my favority new bit of knowledge. Is there a difference?) Assembly programming doesn't take you anywhere near the metal on many modern processors, especially superscalar workstation and server processors. True, with some kinds of processors, the ISA gives you an idea of the how the processor is structured and

    • You can be a master of x86 assembly and still be considered somewhat of a newbie in a Java programming curriculum. But in case you already know Java, you will start ahead, and have a better chance at mastering the much more important higher-level, language-neutral concepts such as proper design, understanding of algorithms, data structures, etc.

      Thanks to its JVM, you have enough layers of abstraction that what you're saying is probably right for Java. But if you're working in any language that compiles to n
  • Start an OSS project (Score:3, Interesting)

    by tomstdenis (446163) <tomstdenis@REDHATgmail.com minus distro> on Saturday March 31, 2007 @08:48AM (#18554899) Homepage
    Find a problem that isn't adequately solved and do it. Nothing says serious developer more than someone who can develop, maintain, document, and support a useful OSS project. Bonus points: Your future employer may be a user (worked out for me :-)).

    People who coast through uni without really taking the initiative are a dime a dozen. If you want to stand out you have to get yourself organized and build a portfolio of public projects that demonstrate you're a competent fellow.

    Tom
    • Re: (Score:3, Informative)

      by kestasjk (933987) *
      Or, if you're good enough, do some freelance coding. Places like rentacoder are good because people hire you based on your skills and price, and not your qualifications.

      The obvious added bonus is that if you're prolific enough you can actually earn your uni fees as you go; it's working well for me so far. It's also a fairly good place to apply all the stuff you learn in your software engineering units.
      • perhaps. The benefit of an OSS project is it's a very public thing and easy to control all the aspects of it (e.g. design something that really shows off your smarts).

        In my case I stuck my name in my project name ... LibTomCrypt. So it's very handy as both advertising and as a catchy name :-)

        Tom
        • by kestasjk (933987) *
          I also run an OSS project phpDiplomacy [phpdiplomacy.net], so I appreciate that coding your own stuff is more fun and interesting, but working for real people that require you meet a deadline may be more attractive on your CV.
          • Who says you can't treat your project properly? For the most part in my projects, I'd fix bugs in a timely fashion [usually under 24 hours] and would announce in advance release dates [and hit them].

            My users appreciated that they not only have a say on how the projects advance [through suggestions, fixes, and submissions], but also that they can depend on things progress smoothly. It also helps if you do the whole 9 yards. In my case, I have a 300 page user manual, tons of examples, very commented code,
  • Dudes (Score:5, Funny)

    by matt me (850665) on Saturday March 31, 2007 @09:10AM (#18555013)
    I hate to tell you guys, there is no such thing as a Counter-Strike curriculum. Some of you take that game *way* too seriously.
  • Make sure you have the development lifecycle and procedures down, and learn as much science as you can other than computer science. You may get paid to develop software but that software has to do things - and usually that has a lot to do with maths, science, research, data processing, and all of that needs testing.

    If you train yourself to be a project manager, study the development PROCESS rather than the menial low-level grunt work, the project will come out better for it. You needn't be a great coder - a
    • by gbjbaanb (229885)
      lol. he says how do I becoem a better coder, and you tell him not to bother. Project management requires a lot more business analysis than you think, so its lousy advice to give someone starting out in CS.

      I suggest he learns the very basics, what does it mean when the language says 'start a thread', or 'allocate memory'. Unless you know this kind of stuff you'll end up being a very inefficient coder and end up as just another ok coder who knows 1 trick. Learn the basics (even if you think they have nothing
    • by OSXCPA (805476)
      Just a note on project management - I have found that PM classes were only useful to me at the grad level after I had some work experience. YMMV, but I liken it to all the undergrad business majors I went to school with (I'm BS in Finance) who went straight into an MBA program after getting their undergrad - they got little out of it except the letters after their name. I found it critical to my learning 'Management' to have some context. Depending on your school, you may be taught by professors who have ne
      • by mdfst13 (664665)

        Just a note on project management - I have found that PM classes were only useful to me at the grad level after I had some work experience.

        Most MBA programs only allow people have been in the workforce for the same reason. You need the work experience to provide context for the class. Without that context, you'll never be able to connect the theory to practice.

        In terms of becoming a better programmer, the most important classes are the ones dealing with software engineering. Writing unit tests; coding defensively; writing maintainable code; gathering requirements. Those are the fundamentals of good programming.

        The algorithm and programmin

        • by hazem (472289)
          Most MBA programs only allow people have been in the workforce for the same reason. You need the work experience to provide context for the class. Without that context, you'll never be able to connect the theory to practice.

          I would disagree with that. Most of the MBA programs I looked at did not have any kind of work requirement. They wanted people with high GMAT scores and GPAs because that raises the average GMAT and GPA of their enrollees.

          The goal of most schools is to increase enrollment and increase
        • by OSXCPA (805476)
          Regarding MBA admission 'requirements' - I have yet to see a program that required experience. I worked for a program (Univ. of Illinois Champaign-Urbana) and they had no such requirement, and there were several peers of mine who went straight into programs at Northwestern (Kellogg), Stanford and University of Chicago. Maybe Harvard, Yale and other top tier schools have such requirements, or maybe lower down the scale, but while they may *prefer* such students, I've never seen evidence of a 'requirement'.

          Th
  • *sigh* (Score:3, Funny)

    by Rocketship Underpant (804162) on Saturday March 31, 2007 @09:27AM (#18555083)
    Well, at least the article isn't about getting the most out of an English "cirriculum".

  • Most programming problems that have been worth while to attack for me have been extremely vague. These vague problems require you to look at numerous different solutions that you won't be covered by in class material. Most CS students fear these kind of assignments and hesitate to attack them. I would urge you to instead train yourself to enjoy learning new things. Once you get good at that you will be a more fearless programmer who doesn't fear: learning a new programming language, getting handed someo
    • Mod parent up. A couple of the best programmers I know make a point of starting each personal project they write in a new language. Even if they never touch the language again once they've finished, they are then able to apply the concepts from that language to their existing tools.
  • by Anonymous Coward on Saturday March 31, 2007 @09:57AM (#18555245)
    1. Remember you are not at school. Really. If we could get this into the heads of our student son day one it would be so much easier. Many still act like they're in school when they're in their 3rd year. You are doing the degree for you and what you will gain will be proportional to the amount of effort you put in.

    2. Ask questions of your TAs and lecturers (when appropriate of course). Getting students to ask questions is difficult; especially when they don't understand. If you don't get what's going on, chances are that lots of other people don't, and they will be greatful when you ask the question they were to timid to ask. If you don't understand the answer say so and get the person to walk you through it. See point 1, it's your degree and it's for you, asking questions might make you look silly (in fact, having been on both sides of this, it doesn't; students just think it makes them look silly - see not being at school, in general asking questions makes you look smart) but which is more important you learning or what people who think they are still at school think of you? See the ESR guide on how to ask smart questions. You may not agree with the writing style but the points are valid.

    3. Program. Lots. Anything and everything. In a variety of languages on a variety of topics. The *only* way to become a really good programmer is be experience and hard graft. Not only will this make your coursework easier and faster to do and help you pass your programming courses, it will improve your CV, but most important of all - it will help you understand what you are doing. Learn to use a variety of languages and tools like version control, symbolic debugging, static analysis, etc. Think of each language as a tool; the more tools you have the more likely you are to have the one you need. This applies to special purpose tools as well - SAT solvers, linear programming systems, machine learning, GAs, etc. A tap wrench can easily dismissed as 'useless' because you can't hammer things in or pry thing like you can with a claw hammer; but if the problem you are facing is removing a tap - they are invaluable.

    4. The right attitude is vitally important. Classic wrong attitudes:

    Spoilt - "It doesn't compile"
    (Tempting flippant response - "That must really suck", Actual response - "Have you read what the error messages say?")

    Defeatist - "I can't do this"
    (Tempting flippant response - "and I can't be bothered to help you", Actual response - "What seems to be the problem")

    Bigot - "Why do we have to do this with technology X, technology Y is so much better"
    (Tempting flippant response - *sigh*, Actual response - "We're trying to teach ideas, not technologies")

    World-owes-me-a-degree - "It's too hard"
    (Tempting flippant response - "Well as the course is supposed to be obvious I guess we should drop this part", Actual response - "What seems to be the problem")

    Too-busy-socialising - "I don't have time"
    (Tempting flippant response - "That's too bad then isn't it", Actual response - "How long have you spent on it so far")

    Right attitudes:

    "Can you help me find why I'm getting a segmentation fault on line ... when I ..."
    "I'm not getting on well with this course; where is a good place to start?"
    "I've done all of the exercises but I still don't feel confident with technology X. Can you recommend any good books."
    "I've re-read my notes and gone through the examples; could you help explain why Z is needed when ..."
    "I've spent 10 hours practising this since last week's tutorial; could you check I'm going in the right direction?"

    5. Work. Actually do the recommended reading (it's their for a reason) and the exercises. To get most of of your degree you should be doing at least 40 hours a week (including lectures, labs, etc.), less than 20 is poor and you will find the later years harder beacuse of it. Time invested in getting the foundations solid is never wasted.
    • by superwiz (655733)
      Wow! This is the most useful slashdot post I ever read. Period. I am going to print it out and distribute to my CS 101 class. Absolutely brilliant. Thank you.
    • Very good points. Someone mod the parent post up.

      The student matters more than the teacher. If the student doesn't do the work, the teacher can't help. If the teacher is incomprehensible, the student can still RTFM. Alas, I didn't get that point through my head as an undergrad.

      The one thing I'd like to add: learn how to do testing. Learn how to write testable code. Perhaps start at the JUnit [junit.org] website? Add unit tests, for starters, to your homework projects when it makes sense to you to do that. See i
    • Well done, dude. One of the best posts I've ever seen on Slashdot. S/B required reading.

      When is your book coming out?

    • 8. once you have finished a project, rewrite it in a better way.

      9. repeat 8 until you can't figure out a better design

      10. remove *all* cruft in you final solution

      goto 8

      Seriously the best thing you can do is to try to make your code better. It doesn't help much to just keep programming more and more stuff. Once you get more experience you'll also understand that 'smallest' or 'fastest' isn't always best, for instance when you need to add changes or when somebody else needs to take over or when a solution i
      • Re: (Score:2, Funny)

        by Anonymous Coward
        I suggest you try replacing the goto statement with something more maintainable in next revision of your comment.
    • I agree with everyone else above. That was the best post on slashdot I've read in quite a long time. It was so good, I took a couple of minutes and made a prettified version, and uploaded it here. If you feel that's inappropriate, please, message me and I'll take it down. But thank you very much.

      The prettified version lives Here. [ualberta.ca]
      • by hazem (472289)
        Thanks! As someone who aspires to get a PhD and someday become a professor, this set of guidelines is great.

        I can't help but think they can't be generalized to apply to more courses of curricula. I'll have to work on that...

        Thanks for the pretty version!
    • by scruffy (29773)

      5. Work. Actually do the recommended reading (it's their for a reason) and the exercises. To get most of of your degree you should be doing at least 40 hours a week (including lectures, labs, etc.), less than 20 is poor and you will find the later years harder beacuse of it. Time invested in getting the foundations solid is never wasted.
      Yes, if you actually do the reading, you'll already be ahead of 90% of the other students.
      • by kalidasa (577403)
        There's a reason so few students do the reading. In general, CS books are very poorly written. It's much easier to read a book in clear, concise prose with some stylistic interest and which proffers easily understood explanations than it is to read a book written in turgid prose with unnecessarily dense explanations. Some of the concepts that CS text books explain in a chapter of verbal cruft could be better explained in three paragraphs of transparent analogy.
        • by dkf (304284)

          Some of the concepts that CS text books explain in a chapter of verbal cruft could be better explained in three paragraphs of transparent analogy.

          Alas, it's more often the case that you can use three paragraphs of transparent analogy to explain a concept and manage to completely miss the point and so totally mislead someone reading the text. Let's face it, some things are hard and must be experienced to be really understood. (See the Twelve Networking Truths [ietf.org] for a good example.)

    • by Geno Z Heinlein (659438) on Saturday March 31, 2007 @02:16PM (#18557183)
      5. Work. Actually do the recommended reading... and the exercises.

      I went from being a C student to getting 98 out of 100 on calculus exams from this approach to things. It sounds like someone's old man saying stuff like "In my day..." but the fact is, you just have to cowboy up and then it's easy.

      And once you've done this for a hard course like calculus, everything else is downhill. I discovered that the first half of lots of teachers' lectures was a paraphrase of the chapter you were assigned to read. When I went into class having read it already, I found that (1) I understood it much better because of multiple sensory methods (a trite but true method), (2) I was able to ask intelligent and useful questions about things that were vague on first reading, and (3) teachers noticed this.

      The benefits of (3) are both gross and subtle. One semester, I had 60 migraine headaches in about two months (I didn't know about aspartame then), and scored 55 out of 100 on a calculus exam. The teacher had known me for 2-and-a-half semesters though, and threw that exam out, because he knew it was not due to me screwing around. He knew I wanted to do well.

      The real benefit, though, was better instruction. The teachers would talk to me. They'd say things it would never occur to them to say to more passive students. I converesed with them, instead of being just lectured to. There was a richness to my education that I got because I was involved. In short -- cliche alert -- you get out of life what you put into it.

    • Amen! One addition that may be of particular importance for the original poster:
      Another wrong attitude: "I already know this stuff."

      When I teach CS1, I usually have some students who know some Java and are totally bored while I teach "this is a variable, this is a loop", and decide the class has nothing to teach them. So when I get to recursion or linked lists or whatever they are not paying attention (despite my warnings) and fall behind.
       
  • In September I start on a CS-type degree course.

    CS-type or CS? There is a difference (see below).

    Apart from all of the coding that I will do, what can I do in the coming months to maximize what I get out of this?

    If it is a CS course, you probably will do some "coding" but not alot. Computer Science is about much more than writing code. In the majority of my classes we wrote no code at all, because its about learning the ideas and concepts and not the specific implementations (it is assumed you can figure out how to write code). So my advice to you is to dig deeper than just simply learning how to write code.

  • Not sure of the environment you are going to be taught in but make the most of what tools are at your disposal, also try to get experience in things that interest you.

    Since it is a school situation team up with people and build relationshios and swap skills.

    Keep in mind once you are out of school, working becomes the #1 priority for most of your day time and learning new stuff is crammed in somewhere below that. Learn what you can now without the pressure of bosses, deadlines and family keeping you from it
  • Discrete mathematics is very similar to computer science in many ways as it deals with logic, sets, Boolean algebras in general, algorithms, graphs (also featured in a data structures course), and many other interesting topics that can usually be applied to computer science. If you want to get a good grasp on the theory of computer science such that you can pick up on any programming language in any paradigm, it would be very useful to work on math courses on the side such as discrete mathematics or Boolea
  • Its hard to say not knowing your program, but I can speak from mine. I'm at the other end of the table from you; a senior in an undergraduate liberal arts program who has just finished his BA in Computer Science.

    I found that my program was way too theory-oriented. Way too early on there was an emphasis on intense algorithm efficiency that lasted for the first two years, and then disappeared from the coursework entirely. Similarly, for the first two years all classes were taught using Java, and then afterwar
    • Really? Mazl tov! Who're you working for?

      I'm curious because I'm wondering who still does OS design nowadays outside of M$ and Apple.
  • Enjoy It (Score:5, Insightful)

    by ggKimmieGal (982958) on Saturday March 31, 2007 @11:30AM (#18555889)
    I used to respond to these questions with a whole course list, but you know what, just enjoy college. Play Dungeons and Dragons, go to LAN parties, eat pizza at 2 am. You have the rest of your adult life to become an amazing programmer. You don't have to walk off with your degree saying, "I'm the next Bill Gates. My programming skillza are similar to those of a ninja." You should be good at what you do. Doing a few side projects won't hurt. Finding a summer internship won't hurt. But most importantly, enjoy these four years because they go by fast.
    • ...and that's why many, many employers are reluctant to hire fresh CS graduates.
      • by Knara (9377)

        As well any employer should be wary of hiring anyone.

        Thing is, I know people who have great paying jobs who didn't go to college, and I know people who have mediocre paying jobs who went to college. The difference that always sticks out in my mind is that the people who didn't do the "live at college after high school" really wish they had, for the experience and the social aspects of it. It's not all about getting the best job and being obsessive about your future career. There's plenty of time for tha

  • by rockmuelle (575982) on Saturday March 31, 2007 @11:32AM (#18555901)
    As much as /.'ers like to advocate spending your CS undergrad time learning math and not computing, I think its equally, if not more important, to spend your time understanding how computers work. In addition to the standard math track (calculus, discrete math, numerical analysis, probability), a well rounded CS curriculm should expose the computer science student to the inner workings of computers and software.

    Do an architecture track that covers logic design and computer architecture. This will give you a solid understand of what is possible on modern hardwarend and teach you how to apply what you learned in discrete math.

    Next, take an operating systems course. This will show you how software interfaces with the hardware.

    Along the way, make sure to take at least two programming language courses, ideally one imperative/procedural and one functional. This will teach you there are multiple ways to solve the same problem. Once you're comfortable with languages, take a real algorithms course with a focus on analysis (not just design). If you have time, a compiler course will fill in the final gap between hardware-os-language-program.

    Fill out your electives with things that interest you - graphics, HCI, databases, AI, languages, etc. Be sure to have fun in these courses and apply what you're learning in the other courses.

    In the end, a good understanding of the whole stack - hardware, software, and theory - will give you the foundations to build a solid career in computer science, in industry or academia. If you want to specialize more, consider a Masters or Ph.D.

    I've learned from experience in both industry and academia that a solid foundation gives you an advantge over people who specalized too early in their careers. A strong theory focus as an undergrad makes it difficult to understand what's practical, too much focus on the hardware side makes it difficult to understand what's possible, and only learning the latest trends makes it impossible to design an debug real systems. Strive for balance and breadth early, specialize later.

    -Chris
  • In most courses, there are several ways for you to learn the material (assignments, readings, lectures, study groups). Figure out which one works best for you (sooner rather than later). A study skills [ldpride.net] evaluation might be worthwhile to start. A lot of people don't figure these things out quickly enough and end up banging their heads against ineffective study habits.

    Your school likely has some course like "comparative programming languages" where you're exposed to functional and logic programming. Take i
  • Some general advice (Score:3, Interesting)

    by Anonymous Brave Guy (457657) on Saturday March 31, 2007 @11:50AM (#18556025)

    I wrote a post in a recent Slashdot discussion on computer science [slashdot.org] that might be of interest. Short version: read around your subject, try to gain a breadth of experience using the resources available at your university, and never stop learning. The linked post is the long version with specific examples. HTH...

  • A normal CS curriculum is 8 or 9 full-time semesters.

    If you can swing it financially, take 1 or 2 extra full-time semesters.

    Take 5-10 courses in:
    • Liberal arts, to make you a more well-rounded person
    • Some non-tech elective you like, to keep you from going insane. If you swim and like crafts, go for Underwater Basketweaving.
    • A business or business-law class or two. You want to learn how managers think and you want to be able to start your own business without making fatal business-side mistakes. Intellectual
  • I'd say read, and read a lot. Read about some problems in computer science, read about the various sub-disciplines of computer science and consider attaching yourself to one or two (for instance, I prefer network programming to AI). Don't be afraid to ask your future profs what languages you're going to study during your college career, and then pick up a book or two on them. Barnes and Noble has an excellent series that gives a brief overview of various languages. It's the "In Easy Steps" series. Each boo
    • by BASICman (799037)
      In that case, I've got some book recommendations.

      I always, always, always recommend "Practical C Programming" by Steve Oualline (O'Reilly, $34.95). In addition to being an awesome introduction to C, it has all sorts of goodness for practical code desin in the first few chapters. What do I mean by "practical"? Well, readable, reusable and well documented. After reading that, I applied it to all of my projects. Sometimes it got me extra credit; once it actually helped land me an internship.

      Other books...

      "Lear
  • No, seriously - have a program somewhere on your computer, which finds a random system file and deletes it! Then try and find out what went missing, how to replace it, etc...

    OK, maybe that's a little excessive, but learn to play with your computer, break it, fix it, install linux on it, install a different linux on it, download random shit from the internet and run it - work out what it does, how to use it, how it works. Compile stuff, add a feature to it, break it, write shell scripts that do stuff you don
    • >OK, maybe that's a little excessive, but learn to play with your computer, break it, fix it, install linux on it, install a different linux on it, download random shit from the internet and run it - work out what it does, how to use it, how it works. Compile stuff, add a feature to it, break it, write shell scripts that do stuff you don't actually need to do. Setup some server applications.

      That's a good skill to have, to be sure -- my experience tinkering with 'nix has been consistently useful to me

      • but I really wouldn't call it C.S.; it's more like what I'd call "I.T." It's like what "learning to weld" is to "mechanical engineering:" It's awesome to know, and immensely practical, but by itself it prepares you neither for academic work nor for a particularly impressive job in the corporate world.

        I wasn't saying that's what he should STUDY, I'm saying that's what he should practice doing. I think you're welding example is quite apt here - if you're studying Mech Eng, you should probably know how to weld, how to put shit together. At the same time, if you're studying a CS degree - you should probably know how your computer is put together (and all the rest of the stuff I mentioned).

        Interestingly enough, an arguement occasionally comes up where I go to uni, about whether CS is a Science or an Enginee

      • by dsoltesz (563978) *

        When hiring students for our computer programming team, one of the lines of interview questions we have for computer science interns is whether they've built or repaired their own computers, installed O/S's (particularly Linux), etc. They will not be doing these tasks on the job - they will be programming in one more languages and probably using every math class they've taken and a few they haven't. What we're trying to find out is whether computer science is just a major or if it's a calling, if they have

    • I think you mean do all this on a >spare computer am I right? I don't know about you but I don't like having to spend a day re-installing OSs & tools that I need to complete a graded assignment for teh next day. HIs computer will be teh most important asset he will have to get him through his course of study- he does'nt need to go messing it up, especially not intentionally. You can pick up little cheap machines anywhere - I got 1 for a tenner at the skip.
      • Yes, if you have more than one machine, then you just keep one "safe" the entire time. If you only have the one machine, then you should be a little more careful - or go and work in the labs.

        There's nothing to prevent you, if you rely on the computer to hand in work, playing with your computer during holidays...
  • If you know C++ you can pretty much figure out any language that you might encounter. It's much easier to go from C++ to Java and etc. than it is to go the other way. The two most useful classes that I had were an operating systems course and algorithms. Good luck in your studies. Graham
  • There's not much you can typically do in the first 2 years, since those are mostly for fulling general requirements anyway. Just try to get all of them out of the way ASAP so you're last years can be spent not only on CS course requirements but also on you can load up on any CS electives that spike your interest, or are pre-reqs for CS courses that spike your interest. And like what some of the other posters said, a double major in math, or even just a minor will help because those courses will teach you
  • Everybody is different. Some of us are really different. To generate useful advice we need to know more about your background, goals, talents, fears, and weaknesses. Tell us more about you. Otherwise everybody gets the same advice -- and you know that can't be right...

    Ye Olde Coder

  • I'm a 2nd year undergraduate, also in CS. Its really important that you discipline yourself. Honestly, the amount of people I've seen dropping out because they did'nt understand this is frightening. Basically, what happens is you get a load of people who think they know computers coming into the degree and they take it easy. Before they know it theres 5-6 hefty assignments sitting on them + exams. You'll have a pretty easy life for teh first few monthes but trust me things can get hairy pretty quick. I had
  • let the course lead you to your destiny. I started my course (now 3rd year undergrad) and my career goal was to be in IT security, but now I see more than that. I'm more interested in AI or Distributed Systems. You will have to make decisions during your course so just take the road and see where it takes you. If you really like what you are doing you will make the right choices.
  • Fundamentals (Score:1, Insightful)

    by Anonymous Coward
    Get your fundamentals down. Any theory. Database normalization, database design, algorithms, language design, and data structures. Because you're only going to need to struggle for the rest of your career to keep yourself sharp and it's all the harder when you're starting with nothing.

    You are not going to learn how to be a good programmer in college. You might think you're a great programmer and you'd be wrong. Dead wrong. The sooner you are prepared to deal with that realization the sooner you can get star
  • I always learn the most with programming when i push the functionality of a program into an area i am blind to; blind for lack of inexperience, exposure, knowledge...

    an example might have a programmer who writes some gui spreadsheet program from the ground up, then - deciding his brat would benefit, coding features for graphing, imaging and drawing.

    take a lab project that does some menial task and extend it to execute on another platform, rewrite it in a language you don't know, make some command line progr
  • Minor in CS. Major in math or English or industrial psychology or something. Most CS degrees are crap - either devoted to theory as prep for graduate work (and you are expected to learn programming on your own in these programs) or dedicated to developing programmers for a specific local corporation, in which case they teach primarily what the local companies are looking for and not something useful industry wide.

    Learn C/C++, learn database administration (the whole, not just hacking SQL), learn Unix adm
  • by myzz (690332)
    Go through SICP [mit.edu] book. DrScheme [plt-scheme.org] is a nice scheme implementation for trying examples in the book. You'll learn to understand some deeper programming concepts, that you problably would not pick up in a few years of random programming practice.
  • use the textbook "Computer Organization and Design" by Patterson and Hennessy, just kill yourself and save yourself the pain and eyestrain. Seriously.
  • Peek your head into some more traditional "engineering" courses. A shortcoming of the CS field is that it ignores classical engineering lessons, which are needed when you write large programs. For example, I took "Technology of Alpine Skiing" my senior year because I needed it as a credit to graduate. It was the only class that I took that described "requirements based engineering," a concept that any CS major needs to understand, even if (s)he isn't going to work as a corporate drone.

Man is the best computer we can put aboard a spacecraft ... and the only one that can be mass produced with unskilled labor. -- Wernher von Braun

Working...