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."
Here you go (Score:2, Insightful)
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.
Re:Here you go (Score:2)
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)
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.
Re:Here you go (Score:1)
I hope you really didn't call a female high school student "girl"...
Re:Here you go (Score:1)
Re:Here you go (Score:1)
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."
Come over here right now, young man. (Score:1)
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
--JoeRe:Here you go (Score:1, Interesting)
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.
Re:Here you go (Score:2, Troll)
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
Re:Here you go (Score:1)
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)
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:1)
How else is he going to prove how 1337 he is? Be happy he isn't writing self modifying code in his recursive functions.
Re:Here you go (Score:4, Insightful)
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.
Re:Here you go (Score:1, Interesting)
If you're going to use your +1 to troll, learn to do it properly [searchlores.org]. Sheesh. Reminds me of the days I spent on Usenet, listening to those morons in alt.flame. I mean, you could have at least picked an analogy that had some semblance of working. Even if you had said something about on the job training, it might have worked.
Re:Here you go (Score:2)
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)
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.
Re:Well... (Score:2)
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.
Re:Well... (Score:1)
Suggestions (Score:3, Informative)
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... (Score:1)
Weed out (Score:2, Insightful)
Should you? (Score:2)
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)
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.
Re:Should you? (Score:2)
BTW, your understanding of the term 'economic constraints' is apparantly (sp) flawed. All countries are under economic constraints. The difference is what is the shortage: money, physical capital, food, etc. At the very least, there is a shortage of time for all people. And when dealing with an ignoramus who is slowing down my education, I have to deal with insufficient patience.
(Dear Lord, I think I might be turning into an objectivist)
Re:Should you? (Score:1, Flamebait)
crushed into the dust my metamods.
As regards "economic constraints", it's pretty
hard to maintain a university seat per child
in a society where 10% of the population could
be wiped out by a bad rice crop (as happened
in China, under Mao's brilliant leadership).
*You* *just* *can't* *pay* *for* *it*.
In the U.S. there is *no* reason why college
couldn't be compulsory.
You might find it inconvenient to sit in a
classroom with someone who asks absurdly simple
questions from time to time. But just wait until
the same neanderthal is carjacking you or
raping you instead. I think it's worth spending
a little patience now.
Yes, because... (Score:3, Insightful)
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.
Re:Yes, because... (Score:2)
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.
Re:Yes, because... (Score:2)
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)
* 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
The cyncical (and elitist) point of view (Score:5, Insightful)
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...
The optimistic (and helpful) point of view (Score:1)
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.
And then when you want to be a real programmer... (Score:2)
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.
Re:And then when you want to be a real programmer. (Score:1)
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.
Re:And then when you want to be a real programmer. (Score:2)
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
Re:The cyncical (and elitist) point of view (Score:4, Insightful)
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
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
Re:The cyncical (and elitist) point of view (Score:2)
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.
Same thing here (Score:2)
The attrition rate I believe is higher than 3/5, too.
Don't bad programmers realize this? (Score:2)
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.
Re:Don't bad programmers realize this? (Score:2)
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
CS is supposed to be hard (Score:1)
Re:CS is supposed to be hard (Score:2)
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.
Debugging (Score:2)
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 on debugging (Score:2)
Kernighan (the 'g' is silent) is the K in K&R C. He wrote,
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.
Re:Debugging (Score:2)
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)
Something other than let them struggle (Score:1)
TIJ (Score:1)
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.
Maybe they need even more basic courses (Score:1)
My two bits (oh GAWD, no pun intended) (Score:3, Interesting)
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! :)
Don't skip the basics! (Score:2)
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...
Re:Don't skip the basics! (Score:2)
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... (Score:2)
-Restil
No, CS should *not* be sink or swim... (Score:1)
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!
Go to lectures (Score:2, Insightful)
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... (Score:2)
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
Re:Be very careful answering this... (Score:2)
OK: if not careful, then at least be honest... (Score:2)
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
struggling plus books (Score:1)
CS is Counter-Strike, stop making these subjects! (Score:1)
Re:CS is Counter-Strike, stop making these subject (Score:2)
Re:CS is Counter-Strike, stop making these subject (Score:1)
http://www.mp3.com/fluor.
The guy's from Norway and the music is pretty cool.
Language is all about communicating. As long as you didn't misunderstand anything, he's on the target if not in the bullseye.
Hey, I struggled at CS (Score:2)
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?
Open Book Project - Java Version (Score:2)
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].
The way my college did it... (Score:3, Interesting)
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 - but the right person can help (Score:2)
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
Re:I don't know - but the right person can help (Score:1)
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.
Hmmm. (Score:1)
And the alternative to taking the final yourself is
Re:Hmmm. (Score:2)
My experience (Score:3, Informative)
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.
Re:My experience (Score:1)
Re:My experience (Score:2)
Re:My experience (Score:1)
Don't make a booklet, lobby to change the courses. (Score:3, Insightful)
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.
All Hail Bruce Eckel! (Score:2)
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).
Re:All Hail Bruce Eckel! (Score:1)
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. :)
Documented code == unclear code (Score:1)
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:
would be better written as:
Some ideas (Score:1)
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.
Teach debugging (Score:2)
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.)
Ever hear of Darwinism? (Score:1)
Abelson and Sussman (Score:2)
Thanks, and clarification on some questions (Score:1)
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.
Advice: (Score:2)