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 */
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.
--- I would prefer a prehensile tail....
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...
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 :-)
...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.
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
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).
There's no sig like SIGSEG
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.
There aint no pancake so thin it doesn't have two sides.
...does eating meat have to do with programming?
...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!
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.
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 agree with this troll!
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...
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.
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
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. Teach the basics -- 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 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.
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
I struggled in the non-intro classes at MIT while I studied CS. The intro class- 6.001 (also called structures and interpretations of computer programs (itself a great book 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 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 by Steve McConnell is excellent at teaching one how to code, and for Java I liked Java: How to Program . 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 - 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!
Check out the link under his name:
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.
"The area of penetration will no doubt be sensitive." ~ Spock
I was a TA for a crushing COBOL(!) course at the university I attended in the late 70's. The course was used to weed out prospective CSci students early in the program so they didn't waste their, or other people's time. This was when I had a big 'Ah Ha' experience. The light came on when I noticed that the same people were standing in line for help in the lab over and over. The revelation was: people are different! That's right. I thought all along that ANYONE could be a programmer. It just takes a little hard work. This is wrong. There is a certain percentage of people who are NEVER EVER going to programmers no matter how much they want it, or how hard they try. Their brains are just not wired the right way. I have two kids, ages 9 and 11. My son (11) writes code in Java, C, perl, VB and hacks Linux to death (and life). He runs our 'computer lab', handling all the networking, OS installs, ect. If I have a tough Linux or coding problem at work, I ask him for help. My daughter, who gets the same encouragement and computer access, just wants to play Zoo Tycoon and mess with GIMP all day. The best thing you can do for these people who are trying to be programmers, but whom do not have the requisite DNA,is to ask them to honestly reevaluate their futures. BTW, it is my honest hope that my son will burn out on computer crap before he gets to college, and will select a career in a field that utimately more rewarding and less cutthroat.
and was able to get an A on the final (I took it by myself).
... what?
And the alternative to taking the final yourself is
Glonoinha the MebiByte Slayer
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 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
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:
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.
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.
...the web collapses (no more web kiddies shouting "html is a real language!"), and Microsoft dies (remember Visual J++? even worse, "MSCE" degrees)
Let 'em go. More money for YOU when YOU graduate.
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
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.
Contrary to the popular belief, there indeed is no God.
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
--JoeProgram Intellivision!
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