CS Students Want Advice on Helping Strugglers?
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 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.
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.
social sciences can never use experience to verify their statemen
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.
/* TODO: Spawn child process, interest child in technology, have child write a new sig */
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.
Jesus was all right but his disciples were thick and ordinary. -John Lennon
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
I write a blog now, you should be afraid.
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...
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 ;)
Sinepaw.org: Grape Winos
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.
Sinepaw.org: Grape Winos
...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.
Please mod this post only if you think others should/n't read this. I have enough ego^H^H^Hkarma. Thanks!
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.
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! :)
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.
You cannot apply a technological solution to a sociological problem. (Edwards' Law)
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...
Don't forget to include a section on how to properly solicit help from others without getting accused of cheating.
-Restil
Play with my webcams and lights here
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.
If you read a speed reading book, does it take you less time to read the second half?
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
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 - Java Version a.k.a. "How to Think Like a Computer Scientist".
Co-founder and designer at Music Nearby: http://musicnearby.com
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
...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.
Can You Say Linux? I Knew That You Could.
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
-- 73 de KG2V For the Children - RKBA! "You are what you do when it counts" - the Masso
Not to mention "dudes" that need a couple of English classes ASAP.
_sig_ is away
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. (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.
Lasers Controlled Games!
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.
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)
-- 73 de KG2V For the Children - RKBA! "You are what you do when it counts" - the Masso
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 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).
Good quote, too many chars. Seriously, the slashdot 120 char limit sucks!
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
rage, rage against the dying of the light
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.)
~~~LXT~~~
Life is like a computer program: anything that can't happen, will.
Smart students should read Structure and Interpretation of Computer Programs, 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.
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'm the stranger...posting to
Never use OOP language as the first programming language that the student learns.
Contrary to the popular belief, there indeed is no God.
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.
..don't panic