Become a fan of Slashdot on Facebook

 



Forgot your password?
typodupeerror
×
News

CS Students Want Advice on Helping Strugglers? 99

geekgirl21 asks: "My university's Computer Science Society (a student organization) wants to create a booklet about helping students get through the major's introductory courses (3 semesters of Java). The focus of this booklet is toward the people who work hard but still struggle with the courses. Specifically, we'd would like some advice about where to get the following: clearly written books/articles about the concepts of Java and OOP, how to prepare for tests, how to take notes in class, how to productively complete a coding assignment, and how to write good, documented code. Also, organization is not our group's strong point. So how do you recommend splitting up the work to complete this seemingly intimidating task? Thanks in advance about any advice you can provide."
This discussion has been archived. No new comments can be posted.

CS Students Want Advice on Helping Strugglers?

Comments Filter:
  • Here you go (Score:2, Insightful)

    Here is the advice to give a struggler:
    Have you considered a major in psychology?

    Now stop trolling about the honor systems CS departments put in place to reduce cheating. It's not like there is anything you actually learn in four years of CS education that you can't learn in 3 months with a pile of books.
    • It's not like there is anything you actually learn in four years of CS education that you can't learn in 3 months with a pile of books.

      Here's a clue for everyone who thinks that teachers are useless, some people simply cannot learn from a book!!!!

      There is a reason why teachers exist, and that is because the vast majority of people have a hard time learning material on their own with only a dry text book to guide them.

      • Re:Here you go (Score:5, Interesting)

        by Henry V .009 ( 518000 ) on Monday August 19, 2002 @11:23PM (#4101889) Journal
        I have tutored any number of impressionable young girls in High School algebra and calculus--and I've come to some conclusions.

        1) Choosing the right textbook isn't just important, it's damn important.
        2) I could have been replaced by a tape recoder with these phrases in a loop: Well, what do you think the answer is? I know that you don't think that will work--but you can't know until you try. See, you are a very smart girl when it comes to mathematics, I hope you consider it as your college major.
        3) A dry textbook is worse than a lively teacher and a lively textbook is better than a dry teacher. It's about motivation, not intelligence. In my experience, confidence in your ability to tackle problems (not necessarily confidence in your solutions, though) is the surest mark of genius. And motivation, unlike intelligence, is under your control.
        • See, you are a very smart girl when it comes to mathematics, I hope you consider it as your college major.

          I hope you really didn't call a female high school student "girl"...

          • I hope you really didn't call a female high school student "girl"...
            Are they older now than they used to be? When I was in HS, it was certainly the "girls' swim team," the "boys' track team," and so forth. Likewise we used the restroom marked "BOYS" and the male teachers used the one marked "MEN."
            • 'Girl' is an infantilizing term for women. If these students were over the age of 11, they should be called "young women" or "young ladies." Or better yet, don't single out their gender. Refer to them as a "very smart student" or "very smart person."

              I also wouldn't refer to a male student of the same age as a "boy" either. That is also demeaning.

              I don't know about other schools, but our high school sports teams were refered to as "mens' hockey' or "womens' swim team". Our bathrooms were also labeled "women" and "men."

              • Personally, I find the terms "young man" and "young lady" much more demeaning, because they're usually used in the same context where your folks would call you by your full given name: When you're in trouble and are getting a talking to by your superiors.

                I'd rather be called "just one of the boys" than "just one of the young men." Ick. :-P

                --Joe
      • Re:Here you go (Score:1, Interesting)

        by Graelin ( 309958 )
        Here's a clue for people who think college makes you a better employee.

        College (and High School even) prove nothing more than your ability to put up with 4 - 6 years of crap. Most of which you will never need to know. Of course, a Java monkey is fine and good but a programmer who brings not only ability but experience and knowledge about my business is worth so much more to me.

        College is important. Books are, IMO, only useful for reference material. Experience is most crucial to your success.
      • ... some people simply cannot learn from a book!!!! ... the vast majority of people have a hard time learning material on their own with only a dry text book to guide them.

        Tough. Being unable to learn from a book is like being unable to write on paper with a pen. It's a basic and required literacy skill and if you don't have it, you need to get it.

        Your statement is the learning equivalent of saying "some people simply cannot drive with a gas pedal... they need someone to ride with them and operate the gas". Wrong. You can't drive a car without knowing how to use the gas pedal, and you can't learn without being able to pull information from a book.

        It may not be the student's fault. Some secondary schools are tax-funded day care centers, and issue diplomas for attendance. I feel for those who've been short-changed this way, but that doesn't help the students. The driver's licence doesn't enable you to drive, it just certifies that you can. You still can't actually drive a car if you don't understand the basic operation of the gas pedal. You can sit down and wait to be magically transported to your destination, but you're not going anywhere if you don't know how to use the pedal.

        Likewise, you can't learn if you don't know how to absorb the accumulated knowledge of those who came before you. The job of the person at the front of the classroom is not to digest knowledge for students, because it can't be done. The learning process involves exactly one person, the student. The only one who can teach you is you.

        If a teacher is able to make the learning process easier, that's a nice bonus. In the end, though, the student must be responsible for learning, or never learn. That includes the responsibility of picking up the basic tools of the trade, and one of them is learning by reading a book.

        Ellen
        • Tough. Being unable to learn from a book is like being unable to write on paper with a pen. It's a basic and required literacy skill and if you don't have it, you need to get it.

          Actually, not tough. There are in fact schools, so people who don't learn well from reading books on their own aren't out of luck. Luckily not everyone is as narrow-minded as the above viewpoint.

          Yes, learning is something the student has to be motivated to do, whether it is through hands-on experience, books, teachers, or (hopefully) a solid combination of all three.

          Don't tell me someone who learns how a computer works by taking it apart and putting it back together and hacking the hell out of it is somehow learning less than Johnny Bookworm who buys "An Introduction to UNIX" and "Digital Systems" books. Maybe if you go to an awful school you don't get to program and mess with hardware... but at any decent school you do, and you have a professor guiding you and giving you feedback along the way.

          I don't think your gas pedal analogy really makes a whole lot of sense in this situation. We're talking about learning styles, from which there are many to choose. As far as I know, there are no cars available without gas pedals, which is why you have to be able to use it. What if you move the analogy to manual vs. automatic (which is still too constrained because there are only two black-and-white choices)?

          Why should there be one "right" solution to learning? That sounds absurd.
        • Re:Here you go (Score:3, Insightful)

          by GMontag451 ( 230904 )
          Your statement is the learning equivalent of saying "some people simply cannot drive with a gas pedal... they need someone to ride with them and operate the gas". Wrong. You can't drive a car without knowing how to use the gas pedal, and you can't learn without being able to pull information from a book.

          No, its the equivalent of saying "some people simply cannot learn to drive without someone showing them how and riding along with them at first" which if you ask me if perfectly reasonable.

          I wasn't suggesting that it should be alright for people to not be able to learn from a book at all, but rather that there are quite a few people that cannot learn from only a book. The value of a good teacher cannot be underestimated.

          The job of the person at the front of the classroom is not to digest knowledge for students, because it can't be done.

          No, their job is to figure out how a student best learns, and translate the material to be learned into a form digestable by the student. Whether or not the student actually digests the material is a function of how much he/she wants to learn it.

          The learning process involves exactly one person, the student. The only one who can teach you is you.

          The learning process invovles two people, the student and the teacher. You need both a motivated student, and a good teacher in order to learn.

    • Re:Here you go (Score:4, Insightful)

      by Jose ( 15075 ) on Monday August 19, 2002 @11:15PM (#4101836) Homepage
      It's not like there is anything you actually learn in four years of CS education that you can't learn in 3 months with a pile of books.

      I'd disagree. Going through those x years of higher education teaches you quite a bit. You may not remember half the stuff that prof tells you, but it is the other things that you learn that are _way_ more important.

      Like how to teach others. You may be really strong in some aspect of a course that you are taking, so some of the other students ask you how it works/how to do it. The easiest way is to just give them the answer. The problem with that is that those people keep coming back looking for the easy answer, but if you spend 5-10 minutes initially explaining how/why something works, that student will (hopefully) understand how to do it, and won't come back. When you first start doing things like, you'll probably stumble a bit, and it'll take a while to explain things, but once you get the hang of it, then your teaching becomes much quicker, and much more effective. (a very strong asset for you to have)

      Another thing that you will learn is how to ask questions, as above, you may just start out asking for the answer directly, then you start asking why, then (hopefully) after a while, you will be able to succinctly be able to describe a situation, the problem you are having, and what you have tried in a short order of time. (again a very good asset for you)

      You learn how to deal with prick collegues, superiors, and aquaintances.

      A lot of people will think that these are things that you can pick up in high school, or that you already know these things (they are pretty obvious), and yes that is true. But the concentration of these factors, coupled with the pressures of higher education really drive home these qualities, and it should be just second nature to you. So that it is just a reflex, not really something you have to think about.

      yea, you could probably learn some or even all of the technical details in 3 months with a stack of books, 2 pencils (37 erasers!), and a couple computers...but you'd miss the whole point of University.

    • It's not like there is anything you actually learn in four years of CS education that you can't learn in 3 months with a pile of books.

      I don't disagree with you, per se, but I don't agree either. There's a certain amount of appreciation for the subject you have to have coming in and, if you don't have that, CS will not be a good career (lifestyle?) choice for you. However, there's a great deal of theory and a definite style that you pick up from some of the really talented professors.

      My favorite course in my undergrad CS courses (I was a CpE so please, don't flame me too much) was my operating systems class. That one class taught me more about system dataflow than any book ever has. True, I could probably have gone out and bought a "Theory of Operating Systems" and learned why deadlock occurs, how to resolve it, how to order processes by priority and handle them, but my professor gave her own unique theories that were much more impressive then reading something out of a book.

      That being said, let me take the other route and say that I really didn't learn too terribly much in my classes that I didn't already know. The 2-3 semesters of data objects was a bit much but definitely helped to raise my GPA and weed out the incompetent students who would NEVER make it in CS. I thought it was kind of a shame that my curriculum was so filled with mandatory engineering classes I didn't get the time to take a nice graphics or advanced OS class, but that's the tradeoff I made for my microprocessor design classes (which were excellent, btw...I advise any CS student to find a few good hardware classes at their university and learn lots from them...understanding hardware and how assembly code interfaces with it will give you a greater appreciation of systems as a whole, IMHO)

      --trb
  • Well... (Score:4, Insightful)

    by dh003i ( 203189 ) <dh003i@gmail. c o m> on Monday August 19, 2002 @10:55PM (#4101729) Homepage Journal
    You can always take the approach that has a very strong heritage in the Linux community, and has recently been catching on in some certain colleges: RTFM! READ THE FUCKING MANUAL!

    Seriously, that is what some colleges are doing. You can be expelled for helping a struggling student; it falls under the same class as cheating or plaguarism. The idea is that they want to weed out all those who can't hack it on their own, so as to save them from wasting years of work. After all, programmers need to be able to get stuff done on their own, without asking for help every 5 minutes, right?

    Well, I can understand this approach: programmers need to have some degree of independence. But everyone struggles with some things, and maybe this person has really great ideas for programs/algorithms, but just has problems putting them into computer language. It'd be a shame to waste such a person because (s)he couldn't get it right by rtfm'ing.

    Also, in the real programming world, though much is done independently, no programmer is an island unto himself. No one can do everything, and the wise programmer seeks the advice of specialists in particular areas.

    Personally, I think that you can only help other people understand something/solve something if you know how you do. You might solve a problem lickety-split. How? If you don't know how, you can't really help anyone. But if you can analyze your thought process and come up with exactly how you solved that problem, you can help other people think in the way you do about the problems (which is obviously a good way to think, since you solved it quickly). It might be a rigorous logical thought process, or a highly innovative one. Even if you are really good, you can benefit from this type of thing by understanding the thought processes of others who are really good, thus adding to your own thought processes.
    • Aye! The relationship between industry practice
      and academic instruction is sooooo tenuous that
      many a 4.0 CSci grad has opted to fall back to his
      garage band, and many a high-school drop-out has
      taken up dreamweaver only to gradually slide into
      EJB. I qualified to graduate Summa Cum Laude with
      High Distinction from the upper-tier college of my
      university, and I feel confident in saying, despite
      my later success in science and industry, that the
      work I undertook at each stage in my career was so
      radically different from that undertaken in previous
      stages that I can easily understand how a substantial
      percentage of persons who were wildly successful
      in one of those domains might be a total failure
      in another.

      Grades suck. They are a disincentive to learning,
      training the student to earn grades instead of
      learning. While there is a strong positive
      correlation with success in business, industry,
      professional life, and grade performance, it is
      foolhardy, as any HR person will confirm, to
      over-interpret that correlation as a
      correspondence. I could have learned 2-3x as
      much at university if no grades were issued.
      But I wouldn't have gotten the plum jobs after.

    • Why would they want to do that, modern universities have one goal, making money. The bad students have to pay full tuition, or the US gov't covers them with loans. The truly gifted students can be given full ride scholarships, but the kicker is, the Uni maintains the patents on any good ideas a good or bad student develops, but the good students have a greater chance of devloping a patentable concept, so they are competed for, since a patent that generates $100,000 year can fund 2 or more students, with profit skimmed off of the top. So why would thaey want to boot students that might have the foundations for a money generating idea?
  • Suggestions (Score:3, Informative)

    by Lando ( 9348 ) <lando2+slashNO@SPAMgmail.com> on Monday August 19, 2002 @11:04PM (#4101774) Homepage Journal
    First most colleges offer courses in how to organize and prepare for tests. Most students should take this course or class if they can... No reason for your organization to bear the brunt of teaching someone how to study.

    Second, the students will need an idea on how mathmatics and logic work, consider sending them to the math and physic tutors for the basics.

    Third, how much of Java is about the fundamentals of OOP, more than likely if this is a basic programming class, the people learning it don't need to try to learn programming to start with, indeed they just need to get java to print and they need basic flow control... Trying to teach the oop and what it means at this stage of the game is a little premature... As long as they know how to get a basic program working, that's what they need to focus on at the moment... once they get the basics down, then they can move into thoery...

    Fourth, where are your senior classmen, tutoring is one of the jobs of the senior classmen. So get with the tutoring department and get some of your senior classmen paid for tutoring students. A one-on-one education with someone that has been through this will help you to tailor your training in the future... Just make sure the tutors are giving feedback as to what they find students need the most help in.

  • At the end of the first school year the department should have a brutal class or two, convince the herbivores to switch to something else.
  • Weed out (Score:2, Insightful)

    by lexarius ( 560925 )
    If they can't get through a semester of Java and understand the basic concepts of OOP, they aren't likely to go far in the world of CS. Instead of giving them a crutch and producing more undertalented individuals, ask them if they want to try the course again or switch majors. Same goes for any major. There once was a time when a CS degree meant something.
  • If someone can't get through three intro courses, have they picked the correct major? If they have no study or note-taking skills, should they be in college?

    Traditionally, these intro type classes in various majors were meant to weed out folks that the admissions testing missed.
    • Re:Should you? (Score:2, Insightful)

      by jeffy124 ( 453342 )
      I agree. At some point there are individuals who simply are not compenent to handle the world of programming, or college in general.

      Hearing heard stories from grad students who have TA'd the first year courses at my school, there tend to be four types of students: Those who get it, and those that dont; those that work, and those that dont. Treat as a 2x2 table, every student will fall into one of the four cells, maybe not distinctly, but they will. It should be clear what students in each cell should do, whether it be continue deeper into CS, change majors/tranfer, or drop out right away, drop out a year later.
    • Yes, because... (Score:3, Insightful)

      by Tom7 ( 102298 )
      First of all, it's not clear that these are necessarily computer science majors. Many majors in my school, for instance, require their students to take the intro CS courses but nothing further.

      Second, you should probably learn some patience -- though this stuff may seem easy to you and me, just because someone doesn't "get it" immediately doesn't mean that they won't, eventually, and go on to be successful. I'm reminded of one of the hardest classes I've ever taken, an undergraduate course on functional programming and advanced programming techniques... I hated that class at the time, but now I do that kind of thing for my research, and it's totally comfortable for me. Sometimes it's just a matter of getting over that hump, and sometimes the inability to do that may be more a problem with the teaching method than the student.
      • helping students get through the major's introductory courses

        To me, that certainly sounds like it is for people who are/will be CS majors. If not, the writer needs to take some time off from saving the world to take an English class.

        I have plenty of patience. For people who deserve it. I decided about halfway through college that I was tired of sitting around people who just didn't get it, and who were slowing me down. At that point, I decided that I would do whatever was in my power to make my professors my personal tutors. Everybody should have read the book and gotten something from it. If you can't do that much, there are several trade schools I can recommend. Funny, most professors agreed. So they indulged my tangents, my questions that touched on other disciplines, and questions that would be answered 'next semester'. My grades went up, and I became known throughout the department.

        This is college (or university). Not everyone belongs in college. Society is better served when each performs to their ability. Not when everyone is pulled to some average level, be they underachievers who will typically struggle, or overachievers who will be bored senseless.

        I'm glad things worked out for you. In my experience, you are the exception.

        FWIW (if you don't at this point think I'm a total halfwit) I'm glad that this is being done by a club of potential peers. If this must be done (and it's clear that we aren't of a singular opinion on that) this is the proper arena. If it works out well, students who are like you were can get through it and eventually propser. But they do nobody a favor by not telling some people 'you just aren't cut out for this'.

        Ehhh. I think I'm just being especially hardnosed about this for some reason. Not sure why. Let me try this:

        If it is done by peers, and if the students being helped are truly doing their best, and if the peers are willing to accept that not everyone is capable of this, it's a good thing. Some people will always need a helping hand. And I think that in some cases, that hand should guide them to something they are better suited to. Take my mother. You could do your best to get her to understand this stuff. But her lack of mathematical ability (well demonstrated for over 50 years:) would kill her later. She would be better served by being directed to the history department.

        Let me also add one more caveat: since you are in research, I assume you are at least 25 or so. Even as recently as 7 years ago, there were far fewer people going into CS. People going in were largely self-selected. Today, it is chock full of those who just saw the dot-com dollar signs.

        I'll end on this note: if you are correct that they are trying to help out people who are stuck in some BS class that is required for all students, I'm in total agreement with you. A Java class and intro to OOP techniques is total overkill for most college students. In that case, the CS club should get major help and funding from the University.
        • I have been a teaching assistant (with teaching assignment) for 7 computer science classes over the last few years, so I am intimately familiar with the intro course scene. In fact, what you say about 7 years ago vs today is totally true: students arrive with less programming experience (but usually a strong background in something like math). This is all the more reason to be patient in the intro courses, because for many people programming is totally new. (And while programming is an important skill for computer science, one can also be a computer scientist without doing much programming at all. It's not as if being a mediocre programmer damns you to fail the rest of your upper-level classes, where you hardly touch computers!)

          I can tell you that many people you would apparently have given up on have gone on to become really good. Maybe this depends on the quality of the students, but it's definitely true at my school.
  • It's hard. Sorry. (Score:3, Insightful)

    by WasterDave ( 20047 ) <davep AT zedkep DOT com> on Monday August 19, 2002 @11:09PM (#4101812)
    I recently read the first few pages of an introductory Java course taught at a University (too much wind, couldn't go snowboarding). It appeared to be the best introductory coding course ever written. It said, basically:

    * Coding is hard. We don't expect everyone to be able to do it.
    * You will only learn to code if you practice. It's like learning a musical instrument, there are no short cuts.
    * You will still be able to work in IT if you can't code.
    * Did we mention hard? Good.

    Dave
  • by Dr. Bent ( 533421 ) <ben&int,com> on Monday August 19, 2002 @11:10PM (#4101818) Homepage
    Don't help these people. Let them fail. Seriously.

    1) There are already way, way too many bad programmers out there. Every profession has the standard bell curve of skilled vs. lame, but software is 10 times more skewed toward the lame end due to too many people dropping out of school to go work at a dotcom. Don't add fuel to the fire.

    2) Every good programmer I know learned 90% of his skills on his own. Yes, you can learn things at school that are difficult to learn on your own, but quite frankly, these things shouldn't require special help to pick up (outside of normal coursework). If you can't figure them out on your own, your chances of applying them correctly are pretty damn low.

    3) [and most important] Too many people go into Computer Science because the money's good, or because it seems like a better idea than the alternatives, or because they like playing Quake and they think that's what C.S. is all about. Then they get into their 3rd year and decide that they hate programming and switch majors. The sooner these people figure out what it is they REALLY want to do, the better, for them and us. It takes a special kind of person to actually ENJOY (not just tolerate) programming, and if you don't enjoy it you're going to regret making it your life's work.

    On the other hand...
    • ...maybe I'm being to harsh. Here's a few tips and resources:

      1) The one thing that MUST be taught in Undergrad C.S. classes (that really isn't, it seems) is design patterns. Whether you use them or not, if you don't at least understand what they are, you're a step behind everyone else.

      2) I'm sure lots of people will mention Bruce Eckel's "Thinking in Java"...but just in case they don't: Get Bruce Eckel's "Thinking in Java"!

      3) Use JavaDoc. Know what the tags mean. Know how to use the tools to generate the documentation. When working in teams, it can save you hours and hours of stepping through code to see how things work. This is especially important when group members need to be able to work alone for logistical reasons

      4) Know how use set up and use source control (www.cvshome.org). This will also save you hours and hours when working on group projects.
      • ...go learn something else besides Java too. I mean, there's nothing wrong with Java, but if students leave school thinking "Java is it" and "nothing but Java", then I hope they can make a mean cappuccino; because there's no hope for them in the market.

        The same goes for OO think. Why stop there? Why not learn stuctured programming, etc? Students will certainly encounter plenty of both in today's market. Some functional background will help a lot too. Granted, there's only so much you can do with an undergrad, but one has to learn what the market needs, and the market needs all of the above.

        Anyone can be trained. Real education takes motivation. I can work with a motivated idiot; slacker geniuses are useless.
        • Well if you want to get snippy about it, a real _Computer Scientist_ shouldn't care one way or the other what language he's using. I like Java, I like C++, I'm even starting to like C#, but if I don't know how to use a stack, I'm not going to be able to do jack shit with any of them.

          This is what school is for: Learning the language-independent computer science theory that is the foundation of good software engineering. The ins and outs of a particular language is best learned in your free time by people who are motivated to do so. What language/tool/platform you choose to learn is really irrelevant, as long as you learn something and enjoy working with it.

          However,

          Since the orginal poster was putting together a booklet for Java and OOP courses, it's probably best to give them tips on how best to use those tools and techniques. Anyway, if any of these programmers are worth their salt, eventually they'll diversify on their own.
          • Well if you want to get snippy about it, a real _Computer Scientist_ shouldn't care one way or the other what language he's using. I like Java, I like C++, I'm even starting to like C#, but if I don't know how to use a stack, I'm not going to be able to do jack shit with any of them.

            True, though there is something to be said for exposure to several classes of programming languages. Especially strongly typed functional language (ML, Haskell, etc) makes demonstrating code proof and other important CS concepts easier, a pointer-driven language (C) is fairly fundamental, something hardware level, and a dynamic language with functional techniques (Lisp, Scheme, smalltalk, python).

            But yeah, it's more important to get exposure to algorithms and structures; at CMU, they did control structures and data structures up through linked lists and stacks first semester, fundamental structures and algorithms (memoizing, hashing, graphs, etc) second semester, and more advances algorithms and structures 3rd semester. That left you ready for all the advanced courses after 3 semesters, and ready for some of them after 2.

            First semester was offered in Pascal, C, C++, and Java at various points in my career; the others were in ML, Lisp, and a handful of other languages. Choice of language impacted the course contents very little.

            Sumner
    • by (trb001) ( 224998 ) on Tuesday August 20, 2002 @08:35AM (#4103488) Homepage
      Yes, yes, double YES!

      I got out of college pretty much at the height of the dotcom saga (May, 2000). I was/am no slouch when it comes to programming...I went to Virginia Tech and was on the school's ACM computer team (unfortunately, I graduated before they won 3rd place in the international finals, but I cheered for them :). When it came time for interviewing, I knew I wouldn't have a problem finding a job but I thought some of my peers might since many of the people I knew from class could barely write C code for their projects. I remember practically writing their code for them while I was in school and figured eventually this would catch up with them when it came time for the real world.

      Yeah, I was wrong.

      These people still managed to get 50k+ starting salaries with signing bonuses that were just sick. They weren't GOOD at what they did, they just knew what a computer was and how to program a little, but that was enough for most companies. And we wonder why those companies didn't do well...

      Anyways, back to the point. I was a computer engineer in college and I still remember the first day of orientation. All the engineers in our orientation group (you were a 'general engineer' until your sophmore year) were gathered in an auditorium to listen to the dean speak. One of the first things he said was "Take a look around...3 of the 5 people sitting near you won't be here when you graduate". I was PROUD of that fact, knowing that I would be one of the few engineers to make it through my 4 years at school.

      I wish CS were the same way. I wish people had a rough time and were forced to drop/fail out of of the major, then maybe we wouldn't have the glut of horrible programmers passing resumes around and making it very, very difficult to find a job these days even if you are an excellent developer. Please, don't help these people more than they deserve, it's doing them and the rest of us a great disservice.

      --trb
      • All the engineers in our orientation group ... were gathered in an auditorium to listen to the dean speak. One of the first things he said was "Take a look around...3 of the 5 people sitting near you won't be here when you graduate"

        Heh. I have an Engineering degree from a university in Canada, and they did the exact same thing. I wonder if it is a universal Engineering thing?

        I got the impression that they were trying to make a point - don't assume that becuase you got good grades in high school that you can graduate from Engineering.

        And you know what - I was proud when I graduated too, knowing that I had made it through those odds.

        • UNB does the same thing, or did in 1994 when I started. It was hell, but I got through. I'm so glad I didn't do CS now - and that's one of the reasons, I feel all those all nighters and stress (my hair started turning white) was worth it in the end.

          The attrition rate I believe is higher than 3/5, too.

      • For a couple years in high school, I really thought I might want to go into programming for a profession. I wasn't the best, but I did well in the intro-level class and part of the advanced class, but I hit a wall in the second semester, and as pink floyd would put it "The wall was too high/he could not break free". No worms ate into my brain, but I did decide that programming was not for me, and so I've decided on a major I've always known I'd be good at. (I'm a political science major, and I've always been a politics geek.)

        My point is, might most truly bad programmers be like me, and realize they shouldn't even be programmers? And if that's true, might not the "bad" programmers in college benefit from some extra help? If you're a senior and you can't code, that's one thing, but to automatically dismiss a freshman/sophomore with problems seems not entirely justified. Programming is hard, sometimes it takes a while for something to click. And sometimes *sigh* it never does click.
        • I admit, not helping students because you want them to "sink or swim" is kinda harsh, but I wouldn't advocate that. There's a certain level of help that I would suggest giving someone, but they really have to understand the basic concepts for themselves. I knew loads of people in my 3rd/4th year classes that weren't too sure how to write a queue/stack/linked list implementation. And please, don't ask them to write one and then inherit it to other classes...the whole OOP approach was beyond them, and functional programming wasn't always good either.

          Absolutely you should help people, but do it in the form of answering questions, not providing them with a large amount of "here's how you do it" material. I had one professor (digital design, part II) who refused to answer questions in his office hours, citing the fact that "[He] went over this in class...if you didn't understand it then, too bad". That killed me, I couldn't stand it. But the opposite was just as bad, when someone would take a problem to a teacher and instead of answering questions they would draw out the headers for the classes and give them some actual code. The two extremes are equally bad.

          --trb
  • I hate to say it, but not everyone has the sort of mind that is well suited to CS, and it's not the sort of discipline that will let effort replace genuine smarts and understanding. I've been a tutor for CompSci 3 at my university for a number of semesters and the major problems I see are: a) people not having a clue how to use the environtment (which, in our case is csh + gcc on a DEC VAX/Tru64 cluster), b) people who don't have sufficient discipline to be effective, c) too many people who are in CS for the money. a) is fairly easy to correct --- I have a set of tutorials that I've put together on getting an editor up, basic commands, subduing g++ and make, etc. b) is harder --- CS3 is usually where the wunderkinds come to realize that they too are mortal, some of them wake up after the first project and end up doing well, many end up failing because they aren't willing to put in the time. c) heh... good luck, my experience with many of the people that fall into this group is that they switch to MIS (which is an option at GMU). There are a lot of people for whom CS is too counter-intuitive for them to ever really develop their understanding beyond a certain depth. Such is life -- not everyone has the sort of mind that predisposes them to be a good musician or physicist, there's no point in getting bent out of shape over it. The people who should be in CS will survive, regardless. The rest will eventually make their way out. Let the intro sequence decide who sinks and who swims. I think your effort would be best spent on putting together a set of workshops or brief online tutorials showing how to use the environment. Then suggest that they read Code Complete and Programming Pearls :-)
    • Very true. You definitely see the numbers drop off in the sophomore-level classes. As they say, those intro classes help "separate the men from the boys".

      A lot of programming and Computer Science in general is not something you can learn easily. Certain skills like debugging and optimization can be a pain to pick up if you don't have the knack for them. I've known a bunch of intelligent people who could read the books and pass the tests, but application of ideas to those real-world scenarios that didn't always fit ever-so-neatly was their achilles' heel.

  • I think the hardest thing I ever had to show someone was debugging their own code. Sometimes those logic errors and typos don't stand out to the original coder, since s/he is "bridging the gap" in their mind (ie: they see what they thought they wrote).

    For people who hate/can't do debugging, the best advice I ever gave was to take a break. Sometimes, like solving a puzzle, the best move is to take your mind off the puzzle and come back later. Of course, tracing variables through the code and setting breakpoints in a debugger doesn't hurt either, but it was never as well-received ;)


    • Kernighan (the 'g' is silent) is the K in K&R C. He wrote,

      Debugging is twice as hard as writing the code in the first place. Therefore, if you write the code as cleverly as possible, you are, by definition, not smart enough to debug it.

      We would do well to remind students at every opportunity that "clever" may be a complement in back-room business deals, but it's usually spoken with heavy irony in programming.

    • It seems debugging is not taught very much... other than the 'cout school of debugging' (or printf, or whatever, i'm rather attached to c++ cause thats our primary language at my school :)

      for instance, using the built in debugger in visual studio amazes most of my classmates, and all i do is stepping watches and breakpoints. (granted, thats all i know how to do, but hey :)

      at my previous school (a community college), they also didn't teach debugging using the debugger, but i didn't go through the full curriculum (i took the first two courses, which was then pascal, and c, the next course was c++, then there was data structures and after that i don't know, they've changed their curriculum though)

      using the debugger can help a whole lot, i'd say i find 50% of my stupid bugs with that, and 90% of my more difficult bugs (i'm not sure weather to call them stupider or harder... but the ones that are more difficult to detect and find at any rate)

  • I can understand where the people who post "let them struggle" are coming from. However, this doesn't do any good for those who are struggling. Sometimes, people just need a little help, then they can grasp a concept and take off with it. All of the CS classes at my university have a newsgroup associated with them. Students post questions and things they are struggling with to the newsgroup, and other students, TAs, and the professor try to answer the questions to the best of their ability. Sometimes, it points out to the professor something he/she inadequately covered. Also, those students who try to answer the questions (myself included) reinforce the material for themselves. I believe this was definetely one of the factors that helped me to be one of the top students in my CS class (and I'm not even a CS major).
  • I don't know what you're using for textbooks, but the free book Thinking in Java [mindview.net] is a great primer in OO that happens to use Java an its language. I have noticed that folks who don't speak english as a first language seem to have trouble with the book, but I would think that any college-level student should be able to digest it. by the way, make sure that they actually type the code into their editor.

    regarding "how to prepare for tests, how to take notes in class, how to productively complete a coding assignment": I don't see how these skills are any different just because the course content happens to be CS.

    "how to write good, documented code": do it a lot. work on big projects that have modules that rot and need to be updated. have anal colleagues that give you a really hard time because you added whitespace, misspelled comments, etc.

  • I was in a Windows 2000 Professional class in which there was a student to which the "dir" command parameters were more of a mystery than they should have been, had trouble realizing that "regedit" stood for registry editor, and other simple stuff... sometimes you have to be more basic than basic...and that college teaches pre-algebra classes too.
  • by dlek ( 324832 ) on Tuesday August 20, 2002 @12:16AM (#4102136)

    First, I don't agree with those who said "sink or swim", but I don't completely disagree either. I'd say the same about any discipline. I sucked at biology (I am really bad at memorizing stuff) so I got out of that. I have seen many people really struggle, and some of them made it, some of them didn't. Some of those who didn't might have if they'd had help. It's up to them to ask, it's up to you to offer, but frankly if they are willing to put in the effort, nobody loses from helping them out.

    I can't really help with the OOP stuff, because when I took CSc our introductory stuff was on procedural programming using Pascal (I started a four-year CSc program in 1992). I would say anybody who hasn't spent their teenagerhood dicking around with computers and teaching themselves rudimentary programming will have some difficulties in any case, but there's nothing like a first-year course to get you up to speed! There are plenty of online tutorials, some of them might even be useful, and I have heard good things about the Eckels book mentioned by others here.

    To prepare for tests: same as any other course! Do your assignments, ask questions in class, and stay on top of things. In a well-structured course the labs will follow the lectures fairly closely but there's generally no hope of the lab giving you first-hand experience at all of the theory you will be studying. The best thing to do with unpracticed theory is to ask questions. It's the only way I remember theory I don't use immediately--think of questions and ask them. If you can think of an intelligent question, and it's answered well, I personally have a much better chance at remembering the context.

    Also, when you're actually taking the test, do everything they say: read it over first, check the number of pages, have a bottle of water or something, take a handkerchief if you have a cold (heh), do the stuff you're confident with first to build momentum and just do it, double-check, but don't double-think, your answers.

    Taking notes is something I never mastered. But if you read the text in advance, if there is one, you only need to note the differences. But I found most profs handed out overheads or printouts or whatever. And in first-year CSc, I don't think you'll need much note-taking anyway--you need to do the lab work more than anything else.

    How to productively complete a programming assignment? Do the absolute requirements and unless it's a multimedia course don't bother with fancies. It'll be marked by senior undergrads or grad students who will be bored with 100 assignments demonstrating recursion to solve a Fibonacci sequence. By the time you get to larger projects, hopefully you'll have a good idea of how to productively complete assignments, but at first it'll be your first skate on a frozen pond.

    To write good, documented code, I would think any first-year program at a half-decent university would teach this. But, if they don't, I'd recommend starting by commenting every single line of code you write. It's better to start with too much than too little--you're less likely to get dinged for it and that way you'll get used to commenting code as part of the process. You might want to use tools like JavaDoc or Doxygen, but never EVER forget to document the code itself, because if somebody wants you to update legacy code later on, that might be all that's left.

    Good luck with your booklet! :)

  • I wasn't a CS major in college, but I did take a couple of programming courses. At the time, we're talking turbo pascal and borland C... nothing mind bending here. The school wasn't known for having a particularly strong CS department, but it was popular for "returning" students who were getting reimbursed by their employers for taking classes. So it had a number of both young and older students.

    Something which struck me as odd was the number of students in the class who could pick up the concepts of programming (we're not talking about OO here, or really anything above for..next/if..then/whatever), but at the same time couldn't figure out how to save the source to floppy. I thought that this was perhaps a problem only experienced by inexperienced undergrads or newbies, until I noticed that even CS and IS graduate students were not comfortable doing some of the most basic computer operations.

    I vivdly remember having a conversation where a number of the grad students were trying to convince me that the bitrate of our LAN was only slightly faster than a modem. This clearly wasn't MIT.

    Over the years since school, I've encountered many people like this. A friend's mom is a cobol programmer, and has been for years and years -- but she barely has any idea how to use a Windows PC.

    I'm about to pass out, so I'll make this quick: SOOOO many students don't make a connection between what they're coding and how the computer behind the code works. We should teach with things like 68000 CPU trainers and assembly; logic chips and homebrew circuits. I firmly believe that given this type of background, many of these strugglers will be able to better process the information they're receiving and make a connection between their code and how the CPU executes it.

    I know this isn't quite the answer you were looking for... but perhaps if it influences even one teaching plan somewhere...
    • I took a computer Engineering degree in school, and I would have to agree with this sentiment. We learned the whole gambit: transististors -> digital logic -> computer architecture -> operating systems -> assembly progarmming -> C programming -> C++ programming.

      That kind of knowledge isn't in all of the "Learn [Foo] in 21 Days" books combined, and I really do think it makes you a better programmer.

  • Don't forget to include a section on how to properly solicit help from others without getting accused of cheating.

    -Restil
  • I love to be elitist.

    I love to flaunt my l33t sk3llz in front of the unwashed masses, but I know that it is the time I put into the craft and not any innate talent that separates "us and them."

    I was lucky enough to grow up in a middle-class family and be exposed to the computer from the age of 3. I was lucky that my father, who dropped out of engineering in college, and I sat down through my childhood and went through basic programming skills. I'm lucky that I was enrolled in a preschool where I learned logo.

    I look at my cousins, and I see that many of them never saw a computer except the few times they could use a dilapidated Apple IIe at their under funded school. I saw them taught by elementary teachers who still cringe at the word algebra.

    Of course people are entering college with less than ideal study skills! Many have never needed to learn how to learn in an academic setting.

    The good news is that we all can learn how to learn more effectively. The bad news is that many are already 10 to 15 years behind those in luckier positions.

    Now, on how to bridge the gap... I'm partial to the Core Java series, especially the Fundamentals book. It's quite readable for a language book, and doesn't require any experience.

    The best way to prepare for a test in CS is to First, take every programming assignment and code pieces on paper with a time limit. Then type in the results and see the mistakes. Finally, after solving the problem, try to code it on paper again with the same time limit.

    The key to CS tests is often rote memorization. I remember seeing many people fail to answer a question because they didn't remember a command in class that made part of the problem trivial. Again, the solution is to write on paper first, then approach the computer.

    How to take notes in class? Teach Mind mapping. [jcu.edu.au] Teach the basics [wmich.edu] -- Between mind mapping and rewriting notes, I had a 15% advantage on every test I took in school.

    People seem to have coding tips here already, so I'll skip to organization. How big is the group? If you have more than 5-7 people, split them into groups of 5-7, as this has been empirically shown to produce the best results (I know Bormann was involved with research on this topic...) Randomly assign the groups, then let people trade. That, or divvy up topics after groups are decided, and then people can trade as necessary. Let them choose one person to be accountable to a director. That way, groups are being managed rather than hordes of people.

    Finally, let rewards be having their name put on part of the work. It looks great on resumes and grad school applications. This may just be sufficient motivation for high-powered individuals to take ownerships of writing parts of the project. Bring in some English or Journalism majors and offer them editor credits. The goal should be writing well enough that the English major can understand the topic well enough to correct it. This insures that the writing will be accessable to your target Audience.

    Good luck! And don't forget to open source [gnu.org] the license for the world to use! :)
  • My Advice is to go to as many lectures as possible. It reduces the amount of work you have to do by 50%. I say this because you then know where to seek help when you have problems, you know what train of thought has been employed to arrive at a decision and you get to see your mates.

    I would say that seeing you mates is more important that people might think, these are guys and gals who have the same work as you, if you have a problem with some coursework then I doubt very much that you are alone, or the nobody from your course can offer a solution

    I have been employing these ideas for the past 2 years of my CS course at Newcaslte,UK. It has resulted in high marks for comparitivly little effort compared to some of my colegues who think I'm lazy because I don't work past 6 in the evining as I would rather spent the time with my girlfriend. They don't understant that if you start working at 9am, go to all lectures and do most of your work in the lab where there is an inexaustable source of help and experince that there is no need to work for more than about 7 hours a day.

  • Be very careful answering this. The people who pass and obtain their degrees are the same people you will end up relying upon doing their jobs, correctly and well, in the future.

    If you would not want to work with this person based on the help you are required to give them, it's likely that they are just there for their "union card", and you would be doing yourself and any potential future coworkers a service if you convinced them that the real money was in some other field.

    -- Terry
    • I believe the idea is to make these people understans programming and other issues involved. The idea is not to "let them slide through". The idea is to make them understand programming.
      • If you're not willing to be careful, then at least be honest.

        Not everyone has what it takes to be a software engineer, or even just a programmer, any more than everyone has what it takes to be an architect, CEO, fashion model, an Olympic swimmer, Pope, or president of the United States.

        People are different, and some are seriously lacking in the departments necessary -- though (to be politically correct), perhaps they are gifted in other areas, like the ability to interact easily in social situations.

        No matter how you slice it, there are a lot of people who have entered the CS field recently, and not because of any native ability, but because of some misguided notion that the Internet bubble never burst.

        These people would have been OK to work with, as long as they were never given really demanding assignments, or could be a junior member of a team led by someone with more natural ability. But not any more: the rewards necessary to make them tolerable to their coworkers just aren't there any more (money will make you put up with a lot, and it's amazing how uncivilized people get without its lubrication).

        Look no futher than the last "flamewar" on a volunteer project mailing list to see what I mean: the flames are how the people would act normally in a work situation, if they weren't being paid to be polite.

        -- Terry
  • I struggled in the non-intro classes at MIT while I studied CS. The intro class- 6.001 [mit.edu] (also called structures and interpretations of computer programs (itself a great book [amazon.com] on how to program)) was wonderful and lead me through iterative programming without my realizing it. The next class, Computer Programming Lab, only had 6.001 as a prereq and I struggled. I did not have enough experience (even though I did well in the sole prerequisite). Anyway, Mythical Man Month [amazon.com] by Fred Brooks is a wonderful book. It describes how to estimate the time needed to complete software projects (longer than you think), and how to go about (and think about) coding up a system. Code Complete [amazon.com] by Steve McConnell is excellent at teaching one how to code, and for Java I liked Java: How to Program [amazon.com]. Good luck--programming is fun. Just DOCUMENT IT. Then you won't have to spend the next n years of your life maintaining it; you can write new code instead :)
  • When I clicked this slashdot article, I instantly thought this was about students that play Counter-Strike. I instantly thinked that I should press the "back" button, but then I was thinking of posting this small article to notify you people that there exist dudes who actually feel attached to games.
  • But my problems weren't a difficulty learning the course material; quite the opposite, the problem was the fact that in the 2 years I was there there was maybe 3 months of actual work.

    The problem was that the course was filled mainly with total newbies who truely didn't know anything, so the course was targeted at them. Never mind that I'd just got an A in my A-level Computing, I had to start from scratch, "learning to program in visual basic" (woo, event based programming with minimal looks at flow control and subroutines), learning C (three hours spent going over "Hello World", I shit you not, and that's without even breaking it down to assm, then two semesters of groups writing near-identical tsv readers and making 10 minute presentations (this was for 33% of the marks, 16% doing a presentation, and 16% marking a presentation out of A..D)), and so on.

    This, believe it or not, is supposed to be one of the better Uni's for computing in the region. And I dare say for the majority of students it was just right (seeing as half of them still didn't know what a variable was after the third semester). In the end I left in disgust. Boring students, boring course, and £3500 debt p.a. did not make for a happy time.

    Er, yeah, anyway, you can talk about how to help the lower end strugglers which presumably happen quite a lot in good Uni's, but what about all the crappy Uni's where the strugglers tend to be the bored to death top end ones?


  • For "clearly written books/articles about the concepts of Java and OOP"

    Check out the Open Book Project [ibiblio.org] - Java Version a.k.a. "How to Think Like a Computer Scientist" [ibiblio.org].

  • by macemoneta ( 154740 ) on Tuesday August 20, 2002 @08:04AM (#4103361) Homepage
    ...Was to have a mandatory 1 credit course for the seniors in the Computer Science degreee program, that required students to provide tutoring to others. Twice a week for two hours I sat with people that were having problems. Everything from teaching them to debug their coding assignments (not doing them for them), to explaining concepts covered in class.

    Frequently, the problem was just a small missing piece in their understanding. It was great to see the light come on in their expressions when they got it.

    I enjoyed the experience a great deal, and now 25 years later, I still find it very rewarding and mutually educational.
  • I don't know the answer to this - I'm serious. You can teach people the syntax of the languages, you can teach them the basics, but how to SEE the algorithm? No Idea

    Now a confession - 20 years ago, when I was in college, I had NO problems with my general programming courses, but I could NOT figure out boolean algebra to save my life - I flunked it - not once, but twice (1st time doesn't really count, and isn't on my transcript - out of 500 students, 498 flunked that term). I just could NOT get it.

    Then that summer I was taking an electronics course that had about 2 classes in logic. I don't know what the teacher said, but whatever it was, boolean algebra just "clicked", I actually went home that night, and was able to get an A on the final (I took it by myself). Since that time, I usually have co-workers come to me for logic problems

    So sometimes, the right person, saying the right thing, at the right time, can make all the difference
    • So sometimes, the right person, saying the right thing, at the right time, can make all the difference

      This is so true. My Calculus prof in high school had taught there for almost 50 years. He had even helped out building ENIAC [upenn.edu].
      Anyway, he made Calc seem like a walk in the park. Started with a straight line, moved to a curve, parabolas, 3D, etc.
      Made it so easy, I could never understand why anyone would have trouble with Calc.
    • and was able to get an A on the final (I took it by myself).

      And the alternative to taking the final yourself is ... what?
      • OK, poorly phrased - I went home, pulled out the old final (on my own) and took it (for myself, NOT for the class - I wasn't taking the course at that time)
  • My experience (Score:3, Informative)

    by John Harrison ( 223649 ) <johnharrison@[ ]il.com ['gma' in gap]> on Tuesday August 20, 2002 @10:07AM (#4104103) Homepage Journal
    CS is a very popular major where I went to school. [stanford.edu] Now the reason for that isn't entirely that a bunch of people that go there knowing that it has a great program. The reason is that nearly all the undergrads hear that the intro course ( CS106a [stanford.edu]) is good by word of mouth and so lots of them take it. Since it really is a good course lots of people get turned on to CS by it. Seriously, there were people who had never used a computer before ending up as CS majors.

    Why is this course so popular? First of all they choose the best professors and lecturers to teach it. They are able to explain things clearly and they are very personable/funny/approachable.

    Second, the programming assignments are well designed. I always knew WHY I was doing a particular assignment. I have since helped people from other universities with their CS assignments and I can say that assignment design is a big deal. Some profs just throw some random problem at the kids without thinking about the purpose of it. They don't provide clear goals. They don't provide any libraries to use. The documentation provided with assignment needs to be clear and complete.

    The most important reason that these classes were both popular and productive was the section leaders. These were CS students in their senior or junior year that taught section once a week. The position was prestigious and it paid well. They got some of the best CS students that way. It is describe briefly in this article. [business2.com] (Search for CS198 if you don't want to read the whole thing.) The sections were very productive. You would write code to do some particular task and the section leader would help/critique. There was almost always a section leader "on call" in a cube in the lab that you could go to for help on an assignment. More than one near the due dates. They could find a bug in 2 seconds flat. But they would just show it to you, they would "help" you see it yourself. But the most important thing they did was "interactive grading". They would go through a printout of your code line by line and write comments both good and bad while grading your program. Then they would have a 20 minute one one one session with the student and explain what was good and what was bad about thier coding. Whether the program actually functioned or not was of secondary importance, especially early in the quarter. They made sure that your code made sense, was well documented, that you had variable names that made sense, etc.

    Many schools just give grades based on functionality and never even look at the code produced. This sink or swim attitude might bring to light a few naturally good coders. The mentoring aspects of the program at I just described produce a lot of great coders.

    In summary:
    1. Choose good instructors.
    2. Give assingments with a purpose. Document them.
    3. Give the students detailed feedback and lots of support early on whether they think they need it or not.

    • Thanks. My professor likes the idea of student teachers a lot. We may be able to do something like this at my school.
      • By the way, it has already been mentioned, but deserves repeating: Bruce Eckel's Thinking in Java is a great book. And it is FREE! You can download it from his website. At one time I carried around a CD that had a copy of that plus the current JavaDocs from Sun. Anytime somebody had a question we would copy the entire CD over to their machine, show them the resources, and see if they could find the answer to their problem. This was at work and not in school. The temptation in school is to be too helpful too quickly. That majically goes away once you start working.
  • by ivan256 ( 17499 ) on Tuesday August 20, 2002 @10:59AM (#4104645)
    Java is not an appropriate introductory language. There are basic concepts you should learn before you start to use java. You should learn to use simple data structures, and learn procedural programming and design before you get confused by the syntax of object orientation. You should be learning how the computer works at a low level before you are expected to understand high level concepts and where it is apropriate to use them. If you start the students out with java, which may seem simple to people who already know how to design programs, the students won't understand why and why not to do certain things. They will be forced to learn through trial and error what they should have been taught to begin with.

    Instead of putting your effort into helping people who have never programmed before to use java, spend your time convincing the school that the first two semesters should be basic programming with some C and some assembler (not as classes that teach the languages, but using the languages as necissary tools to demonstrate the concepts. In early courses, syntax should only be taught when it is necissary to implement a concept), and a data structures class where C pointers and structures should be introduced moving on to java towards the end. Guaranteed, after the students learn basic concepts well, they'll have no trouble picking up java. They'll also write better code for their entire career.
  • Want to learn Java through OOP concepts in easy to understand writing (not like reading a math book or reference guide)? On a budget?
    All hail Bruce Eckel's [bruceeckel.com] Book, Thinking In Java. This book teachs OOP and Java, and is written VERY VERY well. My wife (total non-techie) understands the book and finds it captivating. Best of all? It costs like $30 in a bookstore, but you can also D/L it for free from his website. Yeah, by free I mean as in beer. Perfect for the college kid to study for free (and pick himself up a paperback copy after he gets money and a job, cause its also a decent reference).
    • Damn right, T.I.J is a gem. I owe my Degree & Award [susx.ac.uk] to Bruce Eckel!

      This thread is so old that it's probably only FortKnox who's going to read this reply, but even to just one person I would recommend Thinking in C++ . It's great for Java programmers who want to have a better knowledge about what's actually happening in an OO program.

      I read T.I.C++ about 18 months before I wrote my first C++ program, but it really helped me understand features of any OO program. That's right, I learned a lot about Java from a C++ book.

      I'm coding C++ now (and pretty C-ish code at that), and I miss reading T.I.J. I still flick through it every now and then for inspiration. :)

  • ...and how to write good, documented code

    Teach them this: if you have to document the code, then you haven't written it clearly enough.

    People look at me strangely when I say this, but I'm not the only person who thinks this. When the code changes, the comments don't always change. Out-of-sync comments are bad comments. Bad comments are worse than no comments at all.

    Example:

    float amount = base * rate;
    if ( hardware.cpuID == 80586 ) amount *= 1.0012; // correct for P3 Bug

    would be better written as:

    float amount = base * rate;
    amount = correctForP3BugIfNecessary( amount );
  • 1. They need good tools. Maybe have an afternoon or weekend where you demonstrate some tools and then let them play with them. I've seen many students trying to write software with only Notepad and javac. Show them Eclipse and JUnit. Don't show them vi or emacs, because it takes too long to figure out how to do useful things with those tools. Let them learn those tools when they need to edit config files or email.

    2. They need to know how to use the debugger. I've seen many programmers who are afraid of the debugger because they have no idea how to use it. A good debugger is easy to use. (Perhaps there's one in Eclipse.)

    3. Show them how to write code test-first. This will save them tons of time. When I first started programming, I spent a lot of time tracking down stupid little problems. Writing code test-first would have eliminated those problems (but you have to write all of it test-first, not just parts of it).

    4. Get a bunch of them together in a room without computers and teach them OO skills. Draw some classes on the board (in English, not code). Somebody should be the VM and turn students into objects by constructing them out of classes on the board. Students could then send messages to each other. Some students won't be able to send certain messages because those messages are private or protected. Tell one student that his name is now Bob. Ask another student who is the same class what her name is. If she doesn't answer "Bob", she's probably on her way to understanding.

    • Don't procrastinate. Asking someone to debug an hour before the project's due won't help you on the job. Have time to learn how to do it.
    • Do the design on paper, and test a few cases on paper. Compilers can only check syntax.
    • Do sanity checking, especially for types and loop bounds.
    • Use the compiler's warning lights (-Wall, 'use warnings'...) Sometimes, they'll show that what you did is not what you meant.
    • Use print statements. They'll show what you did, not what you meant.
    • Use the debugger. It shows what you did, not what you meant.


    It's easy to write code that "should" work. It's much harder to make it really work. (One of my worst days was when I told someone I could "probably" write something so trivial with no bugs. We went through ~10 test&fix cycles on a program with about as many lines.)
  • Let 'em go. More money for YOU when YOU graduate.
  • Smart students should read Structure and Interpretation of Computer Programs [mit.edu], used in the introductory programming course at MIT. Some students will see the elegance of that approach, and some won't. Those that don't get it should be directed to Visual Basic class without penalty.
  • Hi, I submitted this story and I wanted to thank all of you for the feedback. I expected the "sink or swim" reaction by those who have never struggled in a class. I personally struggled my first couple of semesters. If it wasn't for the emotional support I got, I would have quit. Everything eventually clicked, and now I'm doing well.

    The CS dept at my university has its reasons for teaching Java for the first 3 semesters, so it's unlikely that will change any time soon.

    Someone asked if this booklet was for CS majors or just anyone taking introductory courses. It's for anyone who finds it useful.

    I found some good resources and tips in those pages and submitted them to my professor. I think the booklet will start out as a page, perhaps attached to intro course syllabi, and would progress from there.
  • Never use OOP language as the first programming language that the student learns.

I have hardly ever known a mathematician who was capable of reasoning. -- Plato

Working...