Professor Questions Sink-Or-Swim Intro To CS Courses
theodp writes "After having taught introductory programming (CS 1) for the past six years,' writes GVSU's Zack Kurmas, 'and having watched many students struggle through this course and the subsequent course (CS 2), I have come to the conclusion that it is absurd to expect students who don't have any prior programming experience to be well prepared to study Computer Science after a single 15-week course (i.e., CS 1). I believe that expecting a student to learn to program well enough to study Computer Science in a single 15-week course is almost as absurd as expecting a student with no instrumental musical experience to be ready to join the university orchestra after 15 weeks.' Kurmas' frustrations are not unlike those voiced by Physics professor Dr. Yung Tae Kim, who argues the up-or-out, one-size-fits-all rigid pace approach to learning set by teachers and administrators is as absurd as telling a toddler, 'You have ten weeks to walk, and if you can't, you get an F and you're not allowed to try to walk anymore."
If you didnt already begin in a high school class, or at the very least on hobby projects?
I can speak only for Germany but during my studies I noticed quite a number of students which had no background (beside having played computer games all day in earlier days), had absolutely no talent (everyone can learn how to program, but most people won't become good at it), no clue and struggled a lot. Yet most of them made it through the finals, have now a B.Sc. and compete with people who really know the shit on the job market, negatively influencing hourly rates and reputation of IT. In my professional life so far I had to work with many many idiots who nethertheless had a degree.
So I believe I disagree with this professor. Yes, not everyone might be willing to achieve the results in that time frame. But I honestly believe that most people who don't deserve to be there in the first place. Either you have what it takes or you don't. As said: You can train nearly everything, but training does not make you good. Programming is very often a task which included creativity (figuring out how to solve a problem in the best way) and if you don't have that ability, you will produce bad results. It's as simple as that.
Don't make IT/CS easier. Make it harder, please.
What next, CS students get slack for not knowing how to read and write, addition and multiplication, and all the other skills you're expected to have when entering a high-level field of study?
Computer science isn't a vocation education... You're there to learn the theory and techniques of programming, amongst other things. If you haven't taught yourself the basics of programming by the time you enroll then you deserve that F.
- These characters were randomly selected.
It's a useful way of separating the people who are motivated an interested enough to do it from those who aren't.
Those with a genuine and deep interest will find a way. They always have. Why is this some new issue? Are people dumber now than they were in the past, or what?
There's a difference between somebody flunking out of a potential major in a computer related area because they don't know how to work a computer and flunking out because they haven't been adequately prepared by the intro course.
Sorry to sound elitist and all, but if you have no prior exposure to programming and computers, then perhaps you should not be studying it in the first place?
Analogy, who can become a building architect? Anyone, through training? No. Suppose a person who has never drawn stuff, doesn't like it, has not done any sculptures out of e.g. clay or whatnot - do you think that person will become an architect? Maybe someone will, but generally the answer would be: no.
It's the same with computers! You gotta start early.
So parents, when your kid is playing all day, encourage him to start programming. Get him to go outside sometimes, but don't nag "now you sit at the computer again blah blah". Let him sit there, but encourage creative pursuits instead.
Why not? We don't seem to have a problem with "Dumbing Down" the requirements for every other job field in the U.S. Just look at the number of cities that have been forced to lower their testing standards for law enforcement officers as one example.
I can understand his concern, but really, the university level should not be your first exposure to your area of study. And if you can't cut the mustard in a particular discipline, would you rather find out during the first semester, or after pissing away several years, and all the tuition and other expenses along with them? So, my opinion is that hitting the ground running - or at least at a brisk jog - is definitely the proper approach for a university level science/math discipline.
(GVSU alumnus myself. They had a pretty solid CS program when I was there a few years back.)
Most of those intro courses are deliberately designed to be filters. They aren't supposed to teach the students, the are supposed to filter out the ones who haven't put the time and effort in already. At our school they had even lower level courses for students to take if they weren't ready for the weedout class; of course those lower level prep classes didn't count towards credits for graduation. So it was really a way for the University to say, "you didn't put in the time in high school, but if you're willing to do it now, here's your opportunity, but now it's going to cost you an extra semester of tuition."
I agree -- it is quite ridiculous to expect that. My first CS course, my professor told me to look at each person on either side of you, and realize that they will not be here when you graduate. And I think thats obviously because the material is difficult, but also because the way they taught the entire major was most definitely sink or swim. Quality people who may be more creative may get left behind because they don't come up to speed as quickly, and so the industry as a whole may miss out on good people.
~Hergio
We had a particular course module at uni, which after 3 weeks expected us to be experts enough in C (and in *NIX type systems) such that we could properly start the actual course which was about Systems Programming in *NIX.
I think it's expected especially in this vocational line that you have to pick up the pace and learn stuff quickly enough. If you're starting a new job and they use a technology which you never heard of - you need to pick it up.
So I disagree. The faster they get to the idea that you're going to be thrown into the deep end - the better they'll be in the end.
The problem isn't the program, the problem is the students. Essentially, they come to University ill prepared and pay the price (i.e. high-schools are no longer doing their job).
However, when it comes to CS, there is a specific issue that must be brought up. Namely, that students think that Computer Science equals computer programming. Anyone that has studied both can say that they aren't even remotely the same. So, it's no wonder the students fail. They think they'll be learning to be programmers, and then get nailed with an Applied Math.
The solution here isn't to change the curriculum. But, rather to inform students what they will learn at a University (Academia) v.s. Applied Colleges (they're called Colleges in Canada, not sure what they are called in the US) v.s. trade schools, etc. Then send them in their desired direction.
In other words, University professors, stop becoming part of the education problem, think and become part of the solution.
The less competent everyone around you becomes. Are you sure you're not just getting too smart to teach CS 1?
"The Most Fun Possible on 4 wheels" is at SunBuggy in Las Vegas
I went to MIT in the early 80's, when interest in CS was exploding and the CS department was heavily oversubscribed. The introductory class taught LISP and Algol and was used to weed the applicants for a CS major down to something the department might have some hope of coping with. Additionally, if you switched majors, this was the only department that didn't allow you to switch back.
Towards the end of my stay there other departments started operating their own basic CS class so that one could learn the rudiments needed to function in other engineering disciplines without having to devote one's life to CS arcana. This helped to take the pressure off the CS school.
In the UK we had a Java exam module that you had to pass to continue to the next stage. Apparently a third failed.
I doubt these people actually practiced programming, after lectures and at home. In many subjects you don't have to practice a skill constantly, you cram facts. Computer science is not one of those subjects, it takes practice. That's why it was quite easy if you have coded as a hobby. I still think it's unfair to undergraduates to be expected to code well in 15 weeks. You go to university to learn, without expecting to know it already...
Slashdot needs Geekcode | Can anyone recommend any good SCIFI? My tastes: Foundation, Startide Rising, CITY, Ringworld,
it could be the other way around? at least it's good that they were prepared? more inclimate climate expected?
Kind of surprised by how many comments there are about people not cutting it.. Are you comments directed at people who go to school for 4ish years, get a computer science degree and believe they are adequately prepared to be programming, or are they directed at the system pumping graduates out that are making them think they are adequately prepared?
Computer Science is no different than any other field where you need experience and exposure to higher levels than college offers in order to be useful in a work place setting, but I don't think it is right to make people think that if you haven't been studying for years before you enter college, you have no chance at it. People just need to that they are at a SEVERE disadvantage, and your earlier life (after college) getting into programming jobs is going to be REALLY rough as you hit literally EVERY single wall out there in your struggle for direction and skill. If you want to succeed in it, it is really a necessity to keep reading, learning, refining your skill and trying new projects with a variety of people. And you are definitely correct, kju, creativity is a HUGE plus.. actually, I think computer science actually helped me to work my creativity muscle, so don't think just because you are not labelled "creative" that you can't do it. Know that, just like every other profession out there, you are going to have to bust tail to even be able to utter the phrase "I can program, but I am bad at it". That is why resumes aren't about how good you are at programming, they are about what kind of experience you have.
I'm not sure that I really agree with the Professor's foundational analogy between studying programming and playing orchestral music. I'll explain why.
The students who played in the university orchestra back when I was at university were phenomenally good. Many of them played professionally or intended to. That is where the analogy with computer programming becomes strained. There is no room, in professional music, for someone who is not very good, or just learning, or who lacks experience. The musicians who play in orchestras at anything approaching a high level have a degree of musical ability that I find absolutely astounding; the difference between a very good hobbyist musician and a professional or semi-professional is like night and day. That ability is normally the result of spending 30 hours or more a week, every week, practising or learning under the tuition of an excellent player for 15 or more years. And the competition is such that that is effectively the minimum level of ability required to play in a good orchestra. Many of the musicians will be far better and far more experienced than that.
In contrast, programming is a career in which a person can grow on-the-job not only from "excellent" to "phenomenal" but from "not particularly good, but promising", to "good", and then on to "excellent" and "phenomenal" after another 10 or 20 years. There are plenty of roles for people who can code slowly but proficiently, especially if they have the potential to get better. Comparing those students to others in a far more competitive area just is not helpful - one could equally compare computer science students with lawyers being sponsored through college by White-Shoe firms. Of course the computer scientists will, on average, be less developed, less well-rounded, even less competent. But it's not a useful comparison.
I don't know what approach the Professor's university takes but I did not, when I was studying, encounter a sink-or-swim approach to computer science coding. That approach, it seems to me, crops up when the expectation is that computer scientists, on completing the course, will have a level of competence beyond what is reasonable - an expectation that is encouraged by making unreasonable comparisons. On the other hand there were, as the Professor notes, a good number of people dropping out or changing course. I would ascribe that, rather than to a course that makes unreasonable demands, to a factor that he notes - computer science is not taught at schools. It is one of a number of courses that students choose without really knowing what it will involve. I suspect that in all those subjects there is a high initial drop-out rate as students realise that the course is not what they had expected, or is not for them, or simply that a particular aspect is more interesting and that they would prefer to specialise in, for example, mathematics.
CS students don't need to know that a stack is implemented differently in C++, Pascal or Java. They do need to know that a stack is a first-in last-out structure, that most stacks don't allow random access, that a stack is a linear structure, and that it's how procedural languages track the calls.
Programming languages come and go, but what a CS major learns should enable them to make the right choices when learning/using languages.
A recursive sig
Can impart wisdom and truth
Call proc signature()
there are standards?
Programming is easy for people who will be good at programming. It requires being able to take a solution to a problem and arrange it into a set of instructions. If you can't do that by the time you get to college, and especially if you can't do that after 15 weeks of intro, you're not going to learn it in college, because the problem isn't that the student doesn't have CS experience; the problem is the student doesn't know how to solve problems and write down the solution.
That's not something that a HS grad who doesn't know it already is going to learn.
paintball
If you didnt already begin in a high school class, or at the very least on hobby projects?
I think this is the wrong way to approach a defense of these practices. Computer Science (CS) gets made fun of a lot ... or at least it did when I was in it. "What's the matter, couldn't you handle an actual engineering major like Computer Engineering or Electrical Engineering?" And, you know, those course paths are tighter in the electives area (I should mention I went to school at the U of MN in case it's different elsewhere). Anyway, CS has many dimensions to it. The foundation is mathematics, statistics, algorithms and logic to name a few without getting into theory like automata. After all that, you have what I'll call the "cosmetics" (for lack of a better word) which are what the flavor of the year is for most popular language. Now it's either Java or Ruby but when I was in undergrad, it was C++ and Java. And there was PHP for web, MySQL for Databases, etc. And I think the reason we need to keep the weed-out course structure is that it was fun for me to learn Ruby on Rails on my own. It was an adventure I enjoyed (albeit a ridiculously easy adventure). And if you're going to be in CS, you need to have the attitude that the cosmetic stuff either comes naturally to you or is something you do in your free time. When I took my Java course, I had already worked through java.sun.com's tutorial "pathways" online and knew what all the keywords were in the language and why we use them ahead of the course. To learn recursion with this background was fairly trivial. Honestly, I don't remember learning much else in that course. And I think that's why it's important to keep that minor level of entry. Because people who have a passion don't want to have to go through course after course of learning a language or basic programming so that they can get to the good stuff.
... and I have no clue if that developer learned C in college and thinks they'll never need to know another language. A lot of my free time is spent experimenting with new languages that I'll often never use professionally and I think it makes me a better programmer. To try to identify an unwillingness to do this in 15 weeks might be saving a lot of people a lot of time and money. And maybe even protecting them from unemployment later in life.
And those languages are a dime a dozen and they could change at the drop of a hat. As time goes on, there's only more implementations to choose from. When I went through college, functional languages were almost dead. And now Ruby is more functional than object oriented and I use it daily. So I'm glad I got to the theory instead of ever being forced to take a course on how to code PHP or how to set up JDBC connectors. But in my later courses, they demanded that implicitly in order to fulfill understanding the functionality of a transactional RDBMS.
I think it's actually a very kind thing to say after 15 weeks: "Hey, if you don't play around with this stuff in your free time, what are you going to do when we teach you Java and five years later you need to sink-or-swim learn Ruby?" Because that's exactly what happened to me and sometimes I come across much older developers that say "Pshaw, Ruby, who the hell would want to code that? I can write the same thing in C and it's fifty times faster." And they're right but they fail to see that my manager doesn't care about speed, they care about maintainability (it's often running on top of a VM anyway)
When you're a CS major, your learning should never stop or you will be quickly unemployed. That might be true with other majors but I've heard people brag they haven't picked up a book since college. Did I find it wrong or unfair for my university to engage in these practices? Maybe when I was in college or maybe if I had only ever been in academia but now it doesn't seem so harsh.
When people tell me they want to code as a hobby I usually say: "T
My work here is dung.
I nominate the above post to the "Two Bit Opinion of the Year' award.
For a lot of people the answer is because no other course will take them - or the entry requirements for the course they DO want is too high. Most universities don't have a great deal of competition for CS places, so they're willing to take pretty much anyone who can spell compooter. It's no longer the calling or aspiration it was 20 or 30 years ago. These days, for most (not all. most. Not you: most. Most CS types haven't even heard of slashdot. You are not the norm) graduates, a CS qualification is merely an entry into a lowish level support job.
politicians are like babies' nappies: they should both be changed regularly and for the same reasons
What next, CS students get slack for not knowing how to read and write, addition and multiplication, and all the other skills you're expected to have when entering a high-level field of study?
Good example. If someone came to university without being able to read or write, then they'd fail quickly. There would then be two questions asked:
The second question is more relevant. You wouldn't expect someone to undergo 13 years of education and not be able to read or write. It is, however, entirely possible for pupils to avoid ever being taught to program in this time. So easy, in fact, that most do it without trying. I was lucky - my school had introduction to programming lessons when I was 7, and enough books in the library for me to teach at least most of the rest to myself. I got to university having been programming for a decade, and already familiar with about a dozen programming languages, yet many of the people arriving at the same time had either never programmed before, or had only started within the last two years at school (and most of these had been taught spectacularly badly - imagine being taught English by someone who never read books outside of class time).
The headmaster at a school where my mother taught said (about 15 years ago), that we were headed for a two-tier society, comprised of people who used computers and people who programmed computers. Frank Herbert wrote about this even earlier, saying that the people who allowed computers to do their thinking for them ended up controlled by the people who programmed the computers[1]. Programming, at least at some level, is a fundamental life skill. Even a secretarial job requires writing macros to be done efficiently. A school that fails to teach programming to children shortly after they learn to read and write is doing them a massive disservice.
[1] His son somehow interpreted this as 'evil robots took over the world'
I am TheRaven on Soylent News
In high school, the only physics class I had was taught by a guy who failed the test required to teach the class twice. They didn't offer AP Physics or Physics Honors at my school. He was the only teacher for that course, though he was originally a chemistry teacher and a bad one at that--apparently my school is laying him off in a couple weeks, because he can't teach chemistry either.
So, I wasn't prepared at all when I went to UC Berkeley and tried to do the first physics course in the major series. I had fallen so far behind in trying to learn the basics, that when it came down to the first midterm, I completely funked it.
Mind you, I graduated high school with a 4.2 GPA overall and the lowest grade I got during my four years of study was a B+ in AP Calculus.
I can't honestly blame all of my failure on the school (I could've studied a physics course in a nearby community college), but I feel like in someways I've been let down by both my high school and university.
At the same time, however fucked up my situation was, I knew that it wouldn't simply fix itself no matter how much I bitched about it--failing made me push myself harder than I've ever been pushed in my life. That's why I changed the class to a P/NP grade and I'm doing it again over the summer.
Moral of the story? Yea, I could've been better prepared and it would've helped if my high school or university had a program to prepare me, but just because I flunked once, doesn't mean I'm never going to walk again. Maybe there's something larger to be learned from a system that is bound to fail some kids, like learning to not pussy out when the going gets rough.
This is not about "No student left behind". This is not about "People must be able to get the degree". This is about setting a standard and if you get that standard, you pass and if not, you fail.
Sure it is almost impossible for people without the proper knowledge to pass. That is the whole point of it all. To see who is ready and who is not. Some will pass and some will fail.
People who are better prepared will have it a lot easier then those who are not. News at 11.
Don't fight for your country, if your country does not fight for you.
Maybe it is absurd to be a music performance major if you are coming out of high school not knowing how to play an instrument. See where I am going with this?
"[...] who argues the up-or-out, one-size-fits-all rigid pace approach to learning set by teachers and administrators is as absurd as telling a toddler, 'You have ten weeks to walk'" " I believe that expecting a student to learn to program well enough to study Computer Science in a single 15-week course is almost as absurd as expecting a student with no instrumental musical experience to be ready to join the university orchestra after 15 weeks" Jesus Christ, how long did it take them to make up those analogies?!?! They seriously suck! Yes of course. Lets give every CS student as much attention as a toddler, that sounds practical. We can have individual courses for every single student. And yes, joining the university orchestra is entirely on par with being expected to program well, WTF? 15 weeks is a _lot_ of time to learn the basics in programming. Come on, they are not expected to be able to design they most beautiful architectures or code extremely efficient. This sounds like a lot of exaggeration. Oh and he mentions BlueJ. Why the hell are they not using that already? I mean, *duh, of course BlueJ/Greenfoot is the best way to learn OO, you cannot teach a CS introductory course without a tool like that.
Yeah, used to be you had to know how to plant evidence and beat people. Now if you know one or the other, you're hired, and you can learn the other on the job.
The way university curriculum is set up, at least in the hard sciences and engineering paths, expects that those who enroll in those programs have done some legwork on their own and are actually interested in the material. I don't think anything needs to change. As it is, college is already becoming a forum to teach kids what they should have learned in High School but didn't. Less reliance on college for kids who really don't need it is the answer, not dumbing down the curriculum. I dare say much of the folks who enroll in college would be better off at a trade school or two-year tech school.
Government's view of the economy: If it moves, tax it. If it keeps moving,regulate it. If it stops moving, subsidize it.
I believe that expecting a student to learn to program well enough to study Computer Science in a single 15-week course is almost as absurd as expecting a student with no instrumental musical experience to be ready to join the university orchestra after 15 weeks.'
I believe that expecting a student to learn to program well enough to study Computer Science in a single 15-week course is almost as absurd as expecting a student with no arithmetic experience to be ready to earn a Fields Medal after 15 weeks.
All the guy is really saying is the intro work MUST be done before university. Just like you cannot expect to graduate on-time with a degree in math if you enter uni not knowing how to count to 5 (athletic scholarship, have enough money, etc) then you cannot expect to graduate with a CS degree on time if you have never touched a keyboard before your first freshman class.
"Science flies us to the moon. Religion flies us into buildings." - Victor Stenger
anyway ? if you delve into specifics, you will see that current higher education is not too changed from its roots in spirit back from its start in 13th century.
Read radical news here
The intro courses are designed that way to weed out students who can't cut it. If you can't pick up intro programming in 15 weeks, then there's no way you'll make it through operating systems, data mining, statistical machine learning, etc. What is truly absurd is that this professor thinks that someone who requires more than 15 weeks to learn basic programming would suddenly be able to learn the more advanced concepts in under 15 weeks.
They can take the course again.
But as others have pointed out, a significant part of the problem is poor preparation in school *before* university. I struggle every year with the choice between lowering standards and trying to teach students basic high-school math. It's frustrating. Why should I be teaching students trigonometry, for example? It's not that I can't teach it. It's not that I'm unwilling to help. Goodness knows I have spent time with students to help them with that basic stuff after class time. But it's not what I'm supposed to be doing at university level in class. They're supposed to already know it. And so on: composing basic English sentences and paragraphs, solving simple algebraic expressions, basic scientific principles. I can't fix all that in a single course, let alone one on a completely different subject. The best I can do is recommend they take remedial courses.
Fact is, the students facing the most serious challenges in these introductory courses have difficulties because they have been crippled by poor teaching earlier in their career. And in the case of computer programming, they often haven't been exposed to the subject at all. They may know about computers, but nothing about programming. The author of the article dances around the issue of pre-university education, but he's right: it takes a longer-term commitment to do programming well, and the implication is obvious. Students should be told that if they are interested in computer science in university they should be doing it in high school, and public school programs should think about "university preparation"-style course programs like there are for math and other sciences. The problem he's describing is real, but the solution isn't in the university unless you propose a "pre-intro" course that isn't a requirement, but will give students another term or two of "remedial programming" practice before jumping into the big pool. Call it "CS0". Many universities have "pre-calculus" courses for students who didn't get enough math in high school to face calculus with a decent chance of success. Why not for computer programming?
Are they starting with easy stuff visual basic? or are they teaching more of a theory of codeing at the start?
Ken Silverman's made the build engine but sucked at school when he started it so he dropped out and did codeing / game makeing work for some time before going back to school.
the simple solution is:
create a clear set of acceptance criteria for students, which reflects the required background knowledge to complete the courses
don't let students with no required prior knowledge enter the CS course. and then you don't have dropouts.
for these students, organize preparation courses, etc.
with all the complaining in the article - is there a viable solution suggested? like, "let them pass, even if they don't know enough" doesn't sound like an idea that would solve anything...
Thisthisthisthis!
I tutored programming when I was an undergrad. They call those "weed out courses" for a reason. Some folks are just not capable of CS. I had to tutor one kid who could not understand arguments and function calls. I spent over an hour trying to explain it to him with five different analogies and sketches on a chalk board and lots of emphatic hand-gestures, and yet he had absolutely no clue how to read
int multiply(int x, int y)
{
return x * y;
}
Some people just don't cut it, even as code monkeys. And universities shouldn't be flooding the job market by giving idiots a degree.
:(){
Schools and Universities have several roles. Partly you go there to learn stuff and be sorted, partly they are holding pens where you are stored while your parents work and partly they hide unemployment by getting the least powerful group in society to pay money to do unwanted work that other people are paid to consume. Do we badly need CS graduates? Giving someone an F and telling them not to come back teaches them a very important lesson.
Coming out of high school I was a computer geek with all the street cred but knowledge of programming. I thought computer science would be interesting. I took it. I passed it. I changed majors to it (from chemistry). I don't know about everywhere, but they did a good job of teaching us things in the first few semesters of computer science at Clemson. A lot of the 400 level courses were more along the lines of, "Here's an assignment. Figure it out." I'm pretty sure that's what documentation is for, though.
Alice (www.alice.org) is being used at Carnegie Mellon for some time to teach basic programming skills to non-majors in Computer Science, with very good results. Alice was initially developed by late Randy Pausch. It is a 3D virtual world where students have the chance to visualize basic computer science concepts. It provides a very smooth, seemless transition from a blocks-based, drag-and-drop syntax-free kind of programing into a fully fledged Java environment (integration with NetBeans). I had the chance to follow one of these courses in this last semester at CMU, and I was really impressed with the progress of students throughout the semester.
My wife is a non-traditional CS major (she has a Masters degree already, has real-world experience, children, and in her 40s). She is a CS major and had never typed one character of code before this past semester. She was the best student in the class. Sink or Swim is an efficient way to weed out those who don't have the discipline to come to class, or the capacity to grasp computer logic (I'm in that group).
as almost as absurd as expecting a student with no instrumental musical experience to be ready to join the university orchestra after 15 weeks.
There is no such expectations at the University of Texas from its CS majors. My wife was expected to go to class, learn the material, and then move on to the next class. She'll be ready for the "orchestra" in a couple of years, not after one semester, and nobody expects her to. What they did expect, however, was that the students in the class grasp the concepts of basic computer logic and the structure of coding in Java. Doesn't seem very unrealistic to me.
Berklee School of Music is one of the most renowned institutes on the planet, and many of their applicants come to the school with no music experience. A clean slate and no bad habits are sometimes more preferable than trying to teach somebody with expectations and habits that will slow them down.
Cramming 150 kids into a lecture hall with a "mathematician" who wasn't smart enough for the math department, who has never written software for a living and doesn't natively speak the language of most of his student body, and who disappears at the end of the class, shoving his students towards some grad students when they have questions... Where the "teaching" involves reading pages from a badly written $300 book, and then having exactly two interactions with the class: "Midterm" and "Final..." And where in many schools the dirty little secret is that the curve takes the average "D" or "F" up to a "C..."
Aside from a few top schools (who do their best filtering with the SAT, or heaven forbid, other parts of the application), this is the reality of undergrad CS (and these in particular are all true stories). I don't see why you'd waste time on the finer points.
The entire academy in the U.S. is collapsing. Yes, the pipelines for the few moneymaking careers left in society are still somewhat functional (finance, law... medicine, somewhat), but in many other places, the tornado of American societal collapse has passed through. More and more of the marginal schools and departments have essentially opted to become high-gloss degree mills rather than go gently into that good night. The scam is the educational equivalent of shitting where you sleep - only one generation of undergrads is going to get themselves bilked for $200k of student debt for the experience described above, let alone when most of their degrees "prepare" them for a future career lacking any hope of paying it back.
Computer science is still a white collar job in the West for a little longer, but it lacks a professional trade group giving licenses and setting educational benchmarks. And that leads us to the punch line. The C.S. degree isn't even needed for finding work. Anyone with good code to show from their own efforts, especially success in the open source world, will get a job today, and with a few resume lines no one is looking further down. And that, by the way, is because (aside from those top schools, and often even then), they know a degree is worthless as a predictor of quality.
I guess you can ignore all this and still decide philosophically whether you think CompSci is like medicine or even like plumbing, where there is some effort to make it difficult and filter out the riff-raff... or it'll stay just another joke degree.
Tired of Political Trolls? Opt Out!
I simply do not have a good answer. I really don’t see what we can do (practically) at the college level to make Computer Science more accessible to the majority of students who don’t already have either programming experience or a strong aptitude.
To Prof. Kurmas: The problem is that most universities only have CS1 and CS2 before sending students down to Analysis of Algorithms and the like. From personal experience, my first two years were not in a 4-year college, but in a community college (Miami-Dade College in 1991 to be precise.) This is what I went through:
100x-level courses: Introduction to Micro-Computers, BASIC (that included a discussion to Bohn-Jacopini's Structured Program Theory right of the bat), Introduction to Turbo Pascal (with discussion on pass-by-value and pass-by-reference, pointers, differences between the stack and the heap and addressing modes) , Introduction to C (pointers up to the wazoo);
200x-level courses: Intermediate Turbo Pascal (first run into Object-Orientation), Intermediate C, A full 15-week course in x86-Assembly, C++, Delphi Programming, Introduction to Expert Systems.
This was the common way of doing things among us CS students at that community college at the time. To be honest, we were just required to take half of those courses, but the fact was that we had a variety to choose from (which we did to our everlasting benefit.)
When I transfered to a 4-year college, I was shocked to see students having just two meager programming courses when going their first junior-year programming course. I mean, you gotta be kidding me. There is no sufficient practice to ensure the student will focus on the actual subject matter (instead of still struggling with basic control structures and problem analysis.)
It doesn't help that universities now don't even teach a full-assembly language course (see here for exhibit A). We have universities that are teaching C++ and Java within the same course!
Yes, indeed CS1 and CS2 are not sufficient, but then again, what else does your university (and universities in general) provide? Do they provide 1000-level courses in 3 different programming languages? Does your university provide a full 15-course in Assembly language? Do they still teach C? And do they teach Python/Ruby and/or Lisp once a year, or at least, say every other year? I mean, do you provide variety for your students to sink their teeth and flex their programming knuckles before moving on to harder subjects?
Or is your school a predominantly Java workshop? Using BlueJ to top it off? Speaking of BlueJ, no other language requires an ed-taylored platform for teaching it. Do you see one in Python? Do you see on in C? I've been working in Java for 12 years now. It is an excellent tool for doing work.
It is also an atrocious language for teaching programming. It is a great language to introduce at the junior and senior level, in particular if used in the context of teaching enterprise computing (an excellent 4000-level topic.)
But for introductory/intermediate programming? It is stupid. Plain and simple. Yes, there are people out there teaching it like that and writing books on it since it came out Gosling's mind. It is still stupid. It does not make it the right tool. It is a disservice to use it in Academia like that.
And it is even a greater disservice when schools are predominantly mono-lingual at 1000/2000 course level. If a student is not exposed to a multitude of programming languages - both Algol and non-Algol like, and within the Algol family, both C-like and non-C like (.ie. Pascal or Ada), that student is not being served right.
That is the root of the problem, and anything short of fixing that is simply fidgeting around. Like trying to cure cancer with ibuprofen.
I don't agree with this. First, anyone interested in CS has probably at least had some rudimentary exposure to programming. Either they taught themselves, or had high school courses that touched on it. The weed-out course serves as a first-pass filter to make sure those who really don't belong in CS don't waste their time on more courses and switch to something more suited for them. It's also a "last-chance" for those who didn't have any prior experience but may be talented to try this field out.
I'm on the IT side of things, and given both my exposure to new IT hires and freshly-minted CS grads, I wish there was a stronger weed-out system for both sides of the house. From the IT side, we have technical certifications (Cisco, Microsoft, Sun, etc.) instead of degrees in most cases. There is a huge difference between someone who is truly suited for IT work and the person who just barely passed a certification course and can't figure things out once they go "off-manual."
I ended up studying chemistry in school, and our weed-out class was organic chem. Same for the medical and pharmacy students...if you couldn't pass that class easily, it was pretty much a given that you wouldn't be successful. Engineering students had a combination of the higher-level math courses and (in our school) thermodynamics. Business majors had accounting. In the chemistry case, the 101-level course gave enough background for all the non-chemistry majors who needed a grounding in chem for the rest of their studies. Soon as you hit the next course though, the expectations ramped up. Especially in a subject like CS where you have millions of people trying to get in on the action because they're "good with computers," there needs to be a filter to drop out everyone who can't understand basic logic, how a loop or conditional works in a program, etc. Otherwise you get more grads that write stuff that ends up on thedailywtf.com.
Here in the U.S., any child under the age of 15 who signs up for a sports team (a) is allowed on the team, (b) is given some playing time every game, and (c) is given a trophy at the end of the season, whether they won or not. Education in this country has just become an extension of that mentality/philosophy.
You have to understand, "Higher Education" is a business. The primary goal of any business is to make money. "Put asses in the classes." Public primary education began as a way to train people to work in factories - sit in rows, perform repetitive tasks, and wait for a bell to tell you when to eat. Today, education doesn't even do that much. Today, if you fail a class, it's because the teacher didn't cater to YOUR "learning style." Schools are now all about babysitting and raising your self-esteem. Any yahoo with enough money (yours or the government's) can find his or her way into a college of some sort. Sure, they have to throw some of the most egregious slackers out to maintain an air of elitism, but you really have to work hard to get yourself thrown out of college. Then everyone graduates and the sh*t hits the fan.
Believe me, I don't like any of this, but that's the way it is. I have a master's degree from a "respectable" institution, graduated summa cum laude & I haven't been able to get a job for 2 1/2 years!! ANY job. Time was (long ago) when you could walk into any building, slap down your college degree, and be given a chance at just about any job you wanted, regardless of what your major was. OK, that may be a slight exaggeration, but I feel like my "education" is useless. No one I ever interviewed with cared the slightest about my success at school. And the funny thing is, I heard a report not too long ago that only 39% of adults in the U.S. have an Associates degree or higher.
So to that professor and those who side with him, I say (with great sarcasm), "Go ahead - dumb it down some more. It doesn't really matter because China will own us all soon enough."
I teach undergrad comp sci courses as an adjunct professor, and I'm also an app dev system architect "in real life".
I recently went through a round of interviews at my real job (15 in 2 days, which I can tell you is pretty exhausting). One of the questions we ask every recent college grad is: "How did you get into programming?" The reason we ask this is that it's been a fairly good predictor of success for entry level programmers. Those who tell us they got into it in high school, or as a hobby, prior to going to college are often gifted programmers when they get out on the floor. Those who switched majors while at college to get into comp sci seem to be less able to make the transition from college course work to real-world problem solving. That's not to say of course that there aren't exceptions to this general rule, but it's definitely one of the indicators we look at. Certainly we'd consider someone with a high grade point whose eyes light up when they describe changing majors and finally finding what they love, but if we get sort of a "ho-hum, I changed majors because math or physics was too hard" and they've got a 2.0 GPA, we'll probably look elsewhere.
So, all that said, I disagree with the professor to some extent. Difficult CS classes at the beginning can weed out the folks who aren't already committed to making CS a career. There's value to that for me as an employer.
From the opposite perspective, I can put my mortarboard, and understand fully what the good professor is saying. Since every student comes to us with a different background, it's probably not fair to weed out the ones who are just learning basic concepts due to some factor beyond their control.
I would say that perhaps each CS program ought to have 2 tracks. One for those with more high-school / hobbyist experience, and another for those who did not have that experience. I guess, in a way, that distinction already exists: CS degrees and MIS degrees, but I don't think most people look at it from that perspective.
If you look at the process that starts with a freshman's first CS class in college and ends with that individual starting a paying job at a company, there is another kink in the process: the HR department. Companies need to stop saying they want to see a CS degree for jobs that focus on networking, information systems engineering, computer hardware help desk support, systems administration, CTO / CIO positions, etc. The two just don't match up.
One other comment mentioned that CS is not a "vocational" degree. I agree. I dropped my CS degree and went with an IT-oriented business degree instead. The CS professors weren't teaching me anything I did not already know and use regularly at work. From what I see, just about everything you need to learn regarding programming and math can be learned for free off of the Internet. Teach people to learn and educate themselves.
When I interview programmers, I approach CS degree holders with an abundance of caution. We had a handful work for us in the past, and only one proved to be worth the money we were paying them. The rest had no idea how to take an idea and turn it into a working software product. I would rather hire a self-taught programmer any day of the week (and have on many occasions).
-- Stu
/. ID under 2,000. I feel old now.
I went into CS "way back" in 2000, hadn't ever touched a compiler, never written a line of code, but knew I'd enjoy it. First programming class was C, I worked my ass off to learn and figure it out. Before the 1st semester was over, I had picked up a book on OOP (Java) and taught myself OOP and Java over winter break. Came back for CS2 already prepared and ready to go.
You either have the aptitude to learn it or you can go off and get your "Business Information Technology" degree. Do the work or leave, which is what it boils down to.
Peter Norvig questions "Why is everyone in such a rush?" and he suggests "Teach Yourself Programming in Ten Years" here http://norvig.com/21-days.html
I was involved in teaching introductory mathematics to the newly arrived students. Some time into the course, the professor in charge scratched his large, grey beard, stared into the distance and told me that "There are still too many students [having not dropped out]. We'll have to scare a few more of them away.". :-)
I suspect he was only half joking and planning on increasing the pace on the next lecture. It seems they count on a significant fraction of the admitted students to carefully assess the situation and come to the conclusion that "AAARGH! I'M STUDYING NIGHT AND DAY AND STILL HAVE NO CHANCE OF KEEPING UP. ABANDON SHIP!".
Swedish plasma phys. PhD student; MSc EE; knows maths, programming, electronics; finance interest; seeks opportunities
Bunch of whiners. I never did any real programming before hitting the university. I learned the theory from class and taught myself the programming side of it while working on homework. I often would assign rules to myself that made the assignment more difficult because I wanted to learn something in particular; e.g., I required of myself that all of my Artificial Intelligence assignments had to be a GUI program, not just a console program. I also chose classes that would require me to actually program; e.g., choosing Compilers over Software Engineering (It puzzles me that Compilers is an optional course, but I digress. That is a different rant.). So the real answer is work ethic. Your instructors are required to teach you certain topics. It is your job at the college level to fill in the gaps yourself and to choose the courses that will get you what you want. In summary, buck up, quit whining and if you get weeded out then you don't belong. Now get off my lawn.
That the good of the many outweighs the good of the few? And how will we define the good of the many?
I went from picking faults in High School, to finding flaws in my post secondary education. Then I went on to teach at the high school level, and then on to teach post secondary. I haven't yet grown a white beard, and I can remember what it's like on both sides.
Education systems (at least in north america) don't work exactly as most students think. They don't work as most parents think. And they don't work as most politicians or administrators think. For all the rules and regulations and tweaks you put in place to try and make the system as clean as your code, you're still dealing with human beings at the end of the day. All you really need are *eager* teachers and *eager* pupils. Such a situation would produce fantastic results.
But alas, that is rarely the case (for innumerable reasons), so we have to decide where we'll focus our energy:
A) on the individual; leave no one behind because everyone deserves to succeed
B) on society; apply a particular standard to admissions and certification that assures a certain quality of graduate. You will get good programmers, engineers, etc. But not everyone will succeed.
But, you say: "Can't we do both?"
Yes, if you want to disenfranchise those students with intrinsic motivation as well as prospective employers. Everyone pays (financially) for option A, while our inevitable failures pay for option B. So decide where you want to lay the liability.
Ask yourself:
Should education better society? Pass everyone, no matter the cost!
Should education better society? Pass only the best, no matter the cost!
Computer science isn't a vocation education
CS is most definitely a vocational course. Most people use it only as an entry into a programming job and realise from looking at ALL the job adverts that it is the only thing that will get them a position.
If you haven't taught yourself
So far as "self-taught" programmers go they're the worst sort. They learn the syntax and the hacks and they think they're professionals. They can (sadly) get past interviews but have no discipline or clue that 75% of the job of a programmer is NOT programming. It's testing, documenting, retesting, standards compliance and more documentation and testing. Just look at the difference between an amateur/hobbyist piece of open-source stuff and professional quality work.
if anything, people who have taught themselves programming should be excluded from CS courses. All professionals have heard (and some believe) the old saying: ""It is practically impossible to teach good programming style to students that have had prior exposure to BASIC; as potential programmers they are mentally mutilated beyond hope of regeneration." Except now, yo can replace BASIC with pretty much any language.
politicians are like babies' nappies: they should both be changed regularly and for the same reasons
No, nobody can be expected to learn how to program in a 15 week course. But I don't see this as a flaw of the CS course. Just as studying mathematics doesn't start with learning how to add and to subtract, studying CS needn't start with basic programming. I'd expect that from someone who wants to study CS.
We expect medicine students to know latin, we expect students in some foreign language to have a basic knowledge of it, we expect history students to have a basic knowledge of history and that human history didn't start with Columbus crossing the ocean. Why can't we expect CS students to know how to program?
We used to have a Bill of Rights. Now, with the rights gone, all we have left is the bill.
How did their school manage to fail to teach them these skills?
It is a modern myth that we can teach most anybody any skill. We can do it, but only to a very rudimentary level. Programming takes specialised brain processing that many people (most) will never have. I saw a paper a few years ago that looked at predicted whether someone could /learn/ programming from how well they did on a psychological metric that tested specific types of reasoning.
Every human brain is different, and that is not the schools responsibility, although mushy feel-good progressives want to make us think it is so. Students require high expectations, or alternatively, they must have an attitude that they will get out of their education what they put in. That so many students explore so little of their potential points to the key pedagogical problem. The solution isn't making class more entertaining, or coming up with new gimmicks.
At a certain point, students must know that these are the expectations, and if you cannot or will not do it, then go do something else. You cannot make a cat interested in watching TV (the brain doesn't function that way), and you can lead a horse to water but you cannot make it drink (cannot force a student to work appropriately).
Like all pain, suffering is a signal that something isn't right
Students have to learn to program and model and describe problems in formal notations or even come up with suitable formal notations themselves. To do so it is not sufficient to train them in one or two languages in a short course or over a semester or year. It has to be an integral part of the studies itself.
In the first or second semester students should be introduced to a language which is then used extensively in all other courses. The same applies to UML or other modeling techniques. And as conclusion this results in a project based study. Classes are therefor only supplementary to give students new input. We have seen in certain universities here in Germany that this results in students which are better prepared for CS-jobs even when they drop out with a bachelor.
At the university I went to, it felt like a lot of the students who didn't know what degree they wanted, would pick CS because it "had to do with computers" and they had no clue what it would actually entail. Hence large amounts of them failing CS 1. And as for some pre-CS1 course. I went straight into CS1 without any previous experience programming. I managed an A in it with ease. If you are dedicated, read the silly book, do the homework, it doesn't matter if you knew nothing coming into the class.
"One can not truly appreciate Shakespeare until you have heard it in it's original Klingon" -Star Trek
Why do people have to pass the class the first time through? If they failed to understand the concepts then take it again! That's the whole purpose of an education. But is the problem that the diploma mills that our colleges and universities have become only care about getting the cattle through as quickly and with the least cost possible to themselves? Fail, try again, and again and again! If you don't want it, then you will not try. Some may never get it no matter how hard they try, but one semester or even one year is not reason to give up.
But, am I the only one that noticed that University technical and engineering curriculum are designed more around breaking intelligent people and teaching them their place in preparation for entering the workforce? Seriously, 3AM projects, professors that change assignments whenever they feel like it to make sure they have your undivided attention, double standards, ambiguous rules, incoherent professors and TAs, political axe-grinders of all stripes, it's not what you know, but who you know and how much you can bullshit, etc...
Don't get me wrong: It's not all like that. But, the cut classes are. Cram all the in majors into the same class sessions, curve the grades, then fail anyone that makes less than a C. Partying? Girlfriends? Networking? What are those? When you get a 39 on the mid-term, get curved to a C, and the "perfect score" kids are having emotional breakdowns in the corners of the lecture halls, you know something is up.
Oh, and do I really need to take 4 semesters of writing asinine "Hello World!" command line, ASCII text file based databases? ...nine lines of comments per line of code in addition to the function diagram, really? God forbid they actually instruct us to do it in a industry standard format that we can use later on, or at least give us some theory so we can apply it to those standards.
Eventually got fed up with the grind, educated myself, got a two year and jumped into the workforce for my "how to deal with bullshit" training. I plan on going back to finish up. But, I won't be suffering under the delusion that it will be for any sort of intellectual gratification this time around. It will merely be so I can get my "Well adjusted for the corporate environment." certification. It helps to have a baseline to fill in the gaps as well. It is too bad that appears to be more of a secondary objective.
Any sufficiently advanced influence is indistinguishable from control.
Like my title says, I wonder what percentage take these courses to fill some stupid requirement.(I know, I'll probably lose some karma points for stating this.) I mean I look at how it was when I went to university. We had a 4 semester foreign language requirement. So a great many of the students in those courses weren't taking these courses because of some "love of language" but because some nitwit just had to shove his pet area of study down our figurative throats regardless of any real results. (Yes, I'm very bitter about the undergrad torture requirement. Before anybody chimes in it completely screwed up my education and has brought no benefit to me which you'd think it would have by now, I graduated almost 20 years ago.) Anyway my point is that I wouldn't be surprised if quite a few of the students in CS101 and CS102 are there to fill a requirement my yet another pencil pushing faculty member who had a stupid idea of "Wouldn't be great if all our students were interested in modern technology, lets shove it down their throats."(Since this amounted to a 2 semester math/science requirement if you weren't a math/science major. I be some of the students in my CS courses were there because they didn't want to do a lab or a math class. Of course this screwed me over as a math/science guy because I ended up having to do 6 semester of humanties and social science which I were also worthless. I just didn't hate them as much as the undergrad torture requirement.) They might take the first one because "Maybe it could be cool." and then figure "I might as well do the second semester and get this claptrap out of the way." Basically creating their own problem and then turn around and complain about the problem they caused in the first place. (But hey, I'm cynical.)
Did you know 80 to 90% of the moderators on slashdot wouldn't recognize a troll even if one dragged them under a bridge.
Learned to program within a few weeks when I was 12. Learned to play an instrument in a few months when I was 10. I am no prodigy and had to practice like most. Coddling people is not the answer. Sink or swim is.
Coding is just an application of CS. The two disciplines just need better separation. CS can be taught classically using pen and paper, or tablets and stylus' if you prefer.
Everybody who can do math with variables can learn programming. It's one and the same, just with different notations. Programming is also a fundamental human skill. It's formalized planning, no more, no less. Finding the structure of a problem to be able to approach it systematically is something we do every day, even when we're not in front of a computer. Computer science just takes this aspect to the extreme. Nobody is expected to become an excellent programmer in 15 weeks, but if you can't read and write simple programs after that course, then you're not really trying.
Yeah I had zero experience going into comp sci and I got a ~96 avg after my first two algorithm development classes... ...the people who struggled seemed to me people I wouldn't trust programming something important.
Sink or swim = good!
and completely omit things like graph theory that are absolutely fundamental. ... Some will have taught themselves stuff (and probably picked up some bad habits along the way), some will not. The ones who are self taught will be bored for at least some of the first year, since everyone else will be catching up.
Right on. Why not start CS classes at the sophomore level? To a large extent Engineering does this already.
Freshmen can take the relevant maths, logic, etc.. Those who want to be CS majors can place out of the freshmen programming classes (or maths even) or take that year to learn how to program well enough to get into the meat of the coursework. Sure, they can't finish their major by Junior Spring, but neither do engineers.
A five-year program for those with no prior experience is also a possibility.
My God, it's Full of Source!
OUTSIDE_IP=$(dig +short my.ip @outsideip.net)
I'd say that was perfectly put. I can add nothing.
Tired of Political Trolls? Opt Out!
Frankly, if you can't handle CS1 without hand-holding, maybe you're just not cut out for Computer Science. I've found that professors are much happier to take extra time on concepts once you get into the later undergrad material and grad school research-oriented topic - the hard stuff - but have little patience for introductory courses.
After all, why should a professor dumb down a relatively easy course for 200 students when he or she could accelerate it for 100 students? Prove your ability on the easy stuff and the professor will spend more time on you when you get to the difficult stuff.
I have to disagree with both your reply as well as the original question by the professor. Previous programming should not be a prereq for a CS1 class. Afterall, that is why it is a CS1 class and it may well be required for non-CS majors as well (though some schools have intro CS classess for engineering majors only.)
I think what the professor is seeing is a two part problem. The first is a general problem. Students appear to be (in general) less well prepared for college, less motivated and more distracted than ever. For instance, when I was a freshman we just had drugs, booze, sex and incredibly basic cable as distractions. Now in addition you have hundreds of tv channels, the web, social media, gaming. I'm not going to search for the reference but recently I read that the time students spend on things like homework is at an all time low. Hmmm...In addition, there were times when learning to program before college was not an option - no home pc's, none or very limited number at school. Yet people still got through those initial courses ok.
Second, is Java really the best language for very basic introduction to programming? Perhaps it would be better to start with a simple procedural language which still teaches much of the basics without getting bogged down in a lot of concepts from object oriented programming. Java could the be tought in CS2 where students would be better able to understand why using an object oriented language such as Java is preferrred.
treat CS as a job, NOT as a religion or way of life. Actually, many talented people are scared away from CS because of the piss poor (for normal people) life-style connected with CS.
I took first semester CS without any previous programming experience.
I knew immediately that I had a talent for it.
Went on to finish my degree with straight As.
Maybe it's good to weed out the untalented.
I taught a CS101 BASIC class as an adjunct professor at a school with no CS department. It was a requirement for HS teachers and our school was great at churning out teachers. Some other people took it just to "find out about computers".
So I am teaching people QBASIC to avoid $500 for the students. I had a guy who didn't know how to type and had never touched a computer before. I gave hard assignments, too, programs that actually did things like a menu system to launch all the standard programs on the lab machines, solving 8 queens, etc. Most of my students got As and nobody failed. (I was using a strict points system and showed everyone weekly where their letter grade was.)
The shocking part? Almost all of them went into computer-related fields. The teachers became the programming teacher at the HS, even though they "didn't think they were good at it" (they were). You CAN teach people CS, even if they don't know programming, have little interest (at the beginning), have never touched a computer, etc.
Now, one of the school cheerleaders was taking the class and asked me whether I thought she should drop it. I told her yes, because we both saw that there was no way she would do well. It just wasn't her thing.
Peter predicted that you would "deliberately forget" creation 2000 years ago...
That is moronic. You deserve an F for not learning what the course aims to teach you in advance of taking the course? FUCK THAT. Why take the course then?
These posts express my own personal views, not those of my employer
No it's like giving them ten weeks to walk and if they can't then they can try for ten weeks again. We don't stop them from trying to walk anymore, we stop them from trying to run until they get that walking thing down.
Or does he seriosuly not let people who fail a course try it again next semester?
If CS is anything like engineering, the administration doesn't want everyone to swim. They count on 1/2 of each undergrad year to drop out so the tuition of the unsuccessful can be used to subsidize the university's other programs.
Equine Mammals Are Considerably Smaller
I find this perfectly acceptable. Using the professor's own analogy of music students, do you think any of those music students who being college with no musical background graduate with a degree in piano performance? Such disciplines require an outside drive, desire, and experience that you won't pick up in a scant 4 years.
There is no reason at all why students can't learn the fundamentals of a programming language (this is how to edit a text file, this is a string/float/integer variable, this is a function, this is the "main" function, this is "Hello World", this is how to read from a file, this is how to write to a file), some practical knowledge (this is a compiler, this is a linker, this is what they do), and how to use an elementary build system in high school (this command runs the compiler, this command runs the linker, here is your executable, here is how to run it, here is how to use tar to submit your work).
The above could literally be a syllabus for a high school class which if taught, would dramatically increase college into to CS pass rates.
I am not talking about "science" here at all, simply how to program using a programming language which frees up the professors for the more advanced topics. Preferably a language that:
1) is vaguely relevant
2) is taught in the intro to CS courses at that states university (which sadly could very well conflict with 1)
3) is free both in beer (not all kids are rich) and speech (the talented ones may want to look at the compilers code or some geeky thing)
And... professors reading this: with regard to Number 2.....your Intro to LISP/Smalltalk/ALGOL class is stupid. Here is a hint: C. Java. C++ if you are sadistic (I love C++ BTW but teach them C first). While other languages are relevant, the above 3 encompass 90% of what the student will encounter after college.
I am very small, utmostly microscopic.
I was one of the first crop of students to start the CS program at a school which had changed the entrance requirements in an effort to recruit more women. Instead of looking at CS experience in high school, or emphasizing grades and SATs, they looked a lot more at extra-curriculars.
I almost flunked out of first year CS. The first part of it didn't click until after my first year. I didn't get really comfortable with programming until the last semester of my senior year. Of course my grades sucked, but the grades have been completely irrelevant; I've managed to do rather well since then. I'm rather sympathetic to the argument that it shouldn't be sink or swim.
-kevin
Incidentally, I'm one of those that went into the field not because I really knew what I was getting into or that I had a calling, but rather that I wasn't going to major in music (which is where my actual talent is).
Are you kidding me? CS1 was the most boring and easy course I've ever seen in my life. Anybody who gives even the tiniest shit about their CS major could pass it without ever attending a single lecture. This is a variable. This is an if statement. This is a for loop. Oh look, a function. Fuck me.
Having been a music major, a film/television major, and someone who hangs around with computer-oriented people most of his life, I think a better comparison would be film and television students. Some of them come into programs with experience in photography and video, some have even done some work that has been on the air, but most have never been near a video camera and can barely press record. The first television production course I took had 50 kids. It was all about hardware and a lot of people were totally lost. It was designed to weed out. The next had 20, and the last had 15. Since I had been taking stills for years, I had a basic understanding of exposure and composition. I also had a fairly strong background in electronics so that helped too. But there were other kids who had no background in either who were able to tough it out and get through it, one I remember was an excellent videographer even though he'd never done it before. Some of us would hang out in the studio and work on each other's projects. Some would attend class and disappear. But I'd say we all were competent enough to get an internship when we graduated (or some other entry level job).
Music, on the other hand, is much more about honing your skills. The system just isn't at all about teaching the basics of your instrument. You have to audition to even be accepted. But there's already an infrastructure in place to accommodate that. I'd been playing since the 4th grade, all though high school I'd been in various bands, orchestras, chorus and choirs, and small ensembles. I'd also been in private lessons all through high school. How many comp-sci majors can say they have similar training?
I'm sure this professor would like to see more students like Linus Torvalds and WOZ (who designed computers over summer vacation), but it isn't going to happen. I'm sure the instructors in the film department would like to see more Steven Spielbergs too (he had been making films since he was 10 before attending USC). The fact is, the field isn't set up that way.
I'm really fascinated by what has happened to video in the past 5 years or so. Now that high quality cameras are cheap, desktop video editors are free, and anyone can publish short pieces easily, we should see a general improvement in the craft. It is going to take time, after all the first round of high school filmmakers is just now entering film school, but I would think we will see some amazing stuff on the horizon. The only thing that I see missing is the one-on-one instruction at the high school level.
The same thing could be happening in comp-sci. If you subscribe to the idea that it take 10,000 hours (sort of the point of this post), the highschoolers today need to have programing tutors. There are a few, but not nearly enough to get kids beyond the "hey that's cool, I'd like to try that" through the tough stuff where most will give up.
"Well, good luck finding a judge that doesn't run a bestiality site."
... and having helped hundreds of students as they struggled through the assignments for both introductory and later computing classes, I long ago came to the conclusion that weed out classes are there for a reason.
Once you've accumulated a large enough sample set, and watched different people progress through a curriculum (or not), you start to be able to tell who's going to "get it" eventually, and who won't. In my experience, admittedly 25 years ago ("get off my lawn, 7-digit /.ers!" ;-), it's fairly rare for someone who doesn't "get it" at all during the intro class, to "get it" later. If they're determined enough, and diligent enough, to bang their head against a difficult concept until they get it in the first semester, and ask intelligent questions beyond "what do I need to change in my program to get it to run?", they're probably going to be able to cut it later in the curriculum and out in the workplace. If all they express interest in is WHAT to do to make some code produce correct output, and not WHY it's done that way, it doesn't bode well for future comprehension of CS studies like discrete math, simulation, OS, changes in programming patterns as hardware and networks evolve (multi-threading, map/reduce, etc.), all of which involve comprehending they why's of new problem domains.
Making the intro class simpler may be a kind gen-y "everyone's a winner, got to be mindful of the students' self esteem and give them every chance not to fail" way to go, and might help schools with the falling numbers of CS graduates, but too many universities already graduate BS degree and even MS degree students who have neither academic research or practical workplace skills in CS. I'm all for giving those who are working toward understanding and who show improvement over time as much help as possible, but draw a line at handholding everyone. Students without the appropriate aptitude and personality (and passion) for CS are best off finding that out so that they can try something else while still early in their studies.
The overarching mandate of universities is, as someone else has already stated, to advance the state of human knowledge (I'll add: "through research"). But at the first year and indeed arguably the entire undergraduate level, the mandate is to teach. I don't think it's as simple as "well if you're not already a programmer, don't bother showing up". Of course, we can't reward no effort. But effort + desire to learn should earn a complete neophyte a B, in my opinion. After that, the ones whose interest was piqued will go on, and the ones who just wanted to check this CS shiz out or needed a science elective will move on.
It's ok for the Orchestra to do it, but not the CS program?
I don't understand what I'm supposed to be getting from his analogy. "Music programs do X all the time, it's well-established and there's no debate about it. Which is why CS programs should under no circumstances do X." Huh?
Comment of the year
The sciences and engineering programs tend to have intro classes that weed out the weaker students. This is at odds with one of the primary goals of teaching. However, I think these weed out classes are ultimately a good thing because society pays a cost when poor students get science and engineering degrees.
Bad science creates a burden on society by undermining our efforts to advance knowledge. Every poorly conducted experiment and incorrect published paper creates extra work for everybody. The erroneous results must be refuted or else the misinformation spreads. In addition, peer reviews don't come free. A poor scientist cannot contribute useful reviews but they can submit papers which need review (moreso than better scientists). They are a constant burden on the community.
Bad engineering also creates extra work for everybody. Engineered systems are susceptible to the weakest link paradigm. A broken part cannot be ignored; it could bring down the whole system. Good engineering teams quickly identify poor engineers and remove them. Engineering teams made up of poor engineers dump broken products on end users which causes problems for everyone. Even if the engineers are held accountable, the problems don't go away naturally. Society has to waste time and effort cleaning up their messes.
It is always saddening to fail a student. However, in my experience, students are not expelled from school for failing a weed out class. They are simply encouraged to change majors. Universities have enough departments of varying difficulty that any student can graduate with a degree. It is up to the student to make the effort to get their preferred degree.
First of all, CS 1 is not hard. Hello World. Some if and switch stuff. Some for and while loops. Basic functions. None of CS 1 is designed to make you a good programmer. It is designed to find out if you have the mental capability to be a programmer.
CS1 is about your ability to design very basic algorithms. Case in point: The Calendar. Printing a calendar for an arbitrary month and year is not hard. The algorithm for deciding when the leap years occur is not hard. Almost anyone can come up with some kind of algorithm to print a calendar. What the assignment reveals is whether you're going to sit down and think about it first, draw some charts, think some more, and understand what is going on before you code; or if you're just going to sit there and mindlessly churn out 4000 iterations of trial and error code.
The students who do the latter will not finish the assignments on time, not learn anything, and flunk out of the class. That's a good thing.
The difference between CS and most other degrees is that being a good programmer requires being able to think a certain way logically. This thought process is a skill which can neither be taught nor learned, it has to be realized by the student. Some people get it right away, some take a while, and others will never understand it. The classes can only take you so far, and then it's sink or swim. If the student doesn't come to this understanding, he can only learn by rote memorization, which we all know doesn't work for anything but passing tests.
Most of them nowadays don't have adequate high education. So they end up "catching up" in college. But certain subjects can be studied at a young age much more effectively than at a later age. The idea that someone can master high school curriculum and college curriculum while in college after not being able to adequately master high school while in high school usually doesn't work out so well. There are, of course, exceptions which prove the rule, but they don't tell much about how to improve the education system. Those exceptions would do well with or without the system.
Any guest worker system is indistinguishable from indentured servitude.
But it's the fact kids are brought up on game consoles and social-networking phones now instead of raw computers which is part of the problem. These intentionally-sealed entertainment devices don't encourage you to get under the hood and program. Thus, you gain no appreciation for things you don't know - no thirst for knowledge about things like pointers, interrupts and computer architecture.
Back in the 70s and 80s the only "tech toys" you could play with were things like the Timex Sinclairs, Amigas, Heathkits and KIM-1s. That stuff was all new and exciting, and a lot of people got into that and started programming on their own. Many of these computers had BASIC hard-wired into the machine, and decent instruction manuals. You could learn enough to be dangerous, but not much more.
It doesn't take that much time using BASIC on a Timex-Sinclair to develop a sense of appreciation for classical problems you'll encounter in programming. Running code in 1.5k of memory on an 8 MHz machine serves as an adequate introduction to runtime efficiency issues. And when all you've got is a floppy disk or tape to write to, trees and sorting techniques have relevance when you learn about them later. When you play with slow and incapable hardware enough, you begin to become acquainted with the names of techniques and principles you don't know, which could speed up your programs.
So going into a CS program with curiosity about pointers and data structures will motivate you to grasp these concepts more eagerly. A lot of students typically have problems understanding the purpose and mechanics of pointers in CS 101. "Getting" pointers (not only their mechanics, but their purpose and utility) is a very important step in moving through a typical first CS class. Understanding pointers leads to "getting" the idea of passing data by reference, creating data structures, and lays the groundwork for talking to peripherals.
I kind of think that the advent of game boxes like the Xbox have led to an overall sense of computer illiteracy. People have to have their appetites whetted for things like sorting and data structures because it's so damn boring otherwise...
FYI, I just discovered that paper a few weeks ago.
http://www.cs.mdx.ac.uk/research/PhDArea/saeed/paper1.pdf
As for the GP's claim that:
we were headed for a two-tier society, comprised of people who used computers and people who programmed computers
I can only say, it's really a three-tier society. The people who *programs other people*, the people who programs computers, and the rest.
I write software for a living, but these days I'm actually much more interested in "programming people".
Don't quote me on this.
In fairness to TFA, there is a difference between allowing for the idea that some students will need more/different education, and the idea that we should make it easier to pass a CS course.
Some people are smarter than others, some learn faster, some grasp CS concepts easier, some will learn differently. Just as not everyone is a genius, not everyone is a clod. Perhaps someone could still be a perfectly good -- not outstanding, but perfectly good -- programmer or sysadmin if they studied longer or had more intensive coursework. At the same time, I breezed through my CS classes, so it isn't fair to me to make me sit through hours of classes I could just as easily skip.
We both should have to pass the same exams, though. We should have to demonstrate knowledge and understanding of the subject, even if we took different routes to get there.
As others have suggested, this discussion may really indicate that lower schools are not doing a good job. Or rather, that some (significant number of) high schools are doing a poor job. Maybe my high school did a better job prep'ing me for CS than that other guy.
dragonhawk@iname.microsoft.com
I do not like Microsoft. Remove them from my email address.
"Students who don't have any prior programming experience" study computer science? Why on earth would they? How would they know it's what they want to do if they haven't even tried it? There's no excuse. They should go back to Mama.
I had plenty of programming experience when I started studying CS, and so had everybody else I studied with. And that was back in 1986 when not every teenager owned several general-purpose computers.
Maybe the problem is that there are very few or no HS prerequisites for CS? I can't imagine university Physics not having HS Physics as a prereq, or Chemical Engineering not having HS Chem as a prereq. Why shouldn't CS have a basic programming knowledge (any language, knowledge of loops, conditionals, etc.) as a required foundation?
I have taught our CS 2 class (in Java) and our third programming course (C and Linux/UNIX system programming). While it is reasonable to think that perhaps "the problem" is that some people just need more than 15 weeks to pick up basic programming, I have seen absolutely no evidence that this is true. For example, I have never become aware of even a single student at our school that has gotten a C in the CS1 class, but then by the CS3 class ended up with even a B let alone an A. What typically happens is that those that make it through CS1 with a C, will fail the CS3 class (two semesters later). The requirements to pass the CS1 class are frankly extremely minimal these days (due to enrollment issues). If you cannot end up with even a C in that class after 15 weeks, I believe there is effectively no hope that you can ever be taught how to program well enough to make it through a CS program. Even if it might be possible for some such people to gain these skills, it would probably require a level of intense, personal instruction that universities do not pay faculty for (and students do not pay universities for).
I find it absurd to believe that someone who can't pick-up basic programming concepts and write half decent applications, at the end of 15 weeks, is going to make it a programmer out in the field. Maybe there exists nice plush programming jobs were you never have to learn new languages, hardware, or concepts, but I've never met one. As a professional programmer, my language, environment, hardware, and software constantly must change and evolve. I must constantly be learning new things to keep a competitive edge. If you can't hack that, you shouldn't be a programmer. This professor fits right in with a nice long line of academia who seems intent on giving students another excuse to fail at life.
Saying you should have a programming background to even take the first CS class is completely backwards. It is not unlike saying you can't major in Russian if your high school didn't have Russian as an option or you don't already speak it. People enter universities from all kinds of backgrounds and other schools and until programming is a requirement of entry into the school in general it is unfair to penalize those that didn't have that chance. American universities should only assume students have the minimums they impose on entry, usually good English skills, math at the trig/geometry/pre-calc level, some level of analytical skill and most of the time a foreign language.
A sink or swim intro to programming course is not a bad thing but it should be just that, a programming course. The basics, much like Calc 1, something that people that have the basics can skip but those that don't can take.
If you haven't heard of Grand Valley State or don't know what state it is in, you are excused. It is a regional "university" and Google's autocomplete comes up with Grand Valley State: university/football/athletics/baseball even though their football team is not remotely competitive. Students there are not well prepared for material requiring critical thinking (such as programming) and you can't make up for weak background and/or weak ability in 15 weeks. It's in Michigan and students who are better prepared and more capable have much better options:
Grand Valley State profile:
Test Scores -- 25th / 75th Percentile
SAT Critical Reading: 490 / 610
SAT Math: 520 / 640
University of Michigan profile:
Test Scores -- 25th / 75th Percentile
SAT Critical Reading: 590 / 690
SAT Math: 640 / 740
I just finished my first year as a Software Engineering major, and was somewhat shocked at how many people were unable to understand the core of CS and SE after a slew of relevant classes. A few observations:
- Many students are in these majors because they felt they were "good with computers" in high school. This really just means they were spending more time than is healthy on the internet (ha, don't we all?) and playing video games, and probably being third-hand distributors of memes. Playing lots of video games != being good with computers != being smart != being a good programmer.
Okay, a good percentage of students aiming for a CS degree are misguided in their abilities coming out of high school. How can that be fixed?
- Students need to crawl before they walk. Given that most students going into computing degrees have no or negligible experience programming or solve logic and reasoning problems, they need to taught to truly think before they're allowed to write a single line of code. In this regard, courses such as Precalculus (rotation of axes) Multivariable Calculus (change of order of integration and coordinate systems), Linear Algebra (abstract thinking in many dimensions), and Discrete Math (algorithm-oriented thinking) are not only extremely valuable, but - I argue - ought to be required before even marginally complex code.
- Grade schools (and parents) need to push math at a more accelerated rate, and earlier (I'm talking about the US now). The human brain develops most significantly between four and six years old (preschool to first grade). Why, then, is it standard practice to not teach the absolute basics of multiplication and division until the end of second grade at the earliest? Not only would the students have greater mental capacity once fully developed, but they'd also have the necessary practice using their brains to solve significantly-complex logical and mathematical problems by the time they reach college age to program by thinking algorithmically. Students are severely limited on the upper end in what courses they can take in high school. Most high schools don't offer anything past Calculus (many don't even have BC, the latter half of Calculus, at their school), or more than a single entry-level programming course. These students are only marginally better-prepared for a CS degree than the rest.
- I don't think the issue is that the courses are designed to weed out students who aren't going to be capable of the material. "Weeding out" is necessary for any field - sometimes, people aren't good at what they enjoy - but way too many students are unprepared for their college majors because their high school curricula weren't focused in their favor. In my hometown's school district, a typical 7th-12th grade year consists of one science, one math, one English, one social studies, one language, and two electives. Somewhat balanced at first glance, but then you realize that the only elective courses available are more rote- and literature based courses. I am not "poo-poo"ing liberal arts - they are important in understanding the evolution of cultures - but so few of them are actionary and forward-looking.
TL;DR:
- "Plays lots of video games" does not equate to "will make a good programmer"
- Colleges are trying to teach programming before teaching the ability to critically think through a problem.
- Grade-school-aged students aren't getting the necessary background in technology or logical reasoning at either school or home.
- Having a degree in something ought to mean that you're completely competent (not just in a base-line capacity) and ready for anything the workplace can throw at you, not that you struggled through four years of classes in an area, and mastered only 75% of the material.
We hear all the time that "any trade school code monkey could write that software" or "my nephew could program that" or "it's a small matter of programming". Yet here we have a prime example that it's not that easy, is it? I think people (both individually and in aggregate) *still* don't really understand software. It's understandable, because it really is different. Name another product where the design /is/ the product.
As for "dumbing down" courses, or not expecting people to learn to program in X weeks, maybe we should just admit that most people cannot learn to program, no matter how long you take trying to teach them. Maybe sometimes some children *should* be left behind, or better yet, directed to things they can actually learn to do.
Nathan's blog
I am currently studying at Lancaster University in the UK and I see that there are a lot of people in this thread saying that CS should not be about the programming and that this should be left to other courses. The truth is that without being an at least competent (by first year Uni standards) programmer you WILL NOT pass a course here.
Out of the 17 modules that are taken as the base modules for the year a total of 7 of these are based on the ability to program (Java and C, Web Technologies and Assembly Language). If a person coming to University with no experience does not pick up the essential skills to pass these unit's they will almost certainly not pass the course. Personally, when I came to university I had a basic knowledge in PHP and Web Tech but nothing of any full programming languages and I did struggle for the first while, luckily the Uni was very helpful in assisting students who were new to field and I can now happily say that I am confident with the basics of Java from a start of not knowing even the most basic of syntax.
As too whether sink or swim methods should be enforced or not I suppose I am not in a position to say. But I know a good few people on my course that I will not be seeing next year despite that they fully grasp the mathematics behind the course and are almost certainly going to do well in exams...
If you are a CS student, gain a certificate and/or get involved in some open source programming project. This shows prospective employers that you have initiative besides completing your curriculum with X.XX GPA. A certificate also shows you know something well. Participation in an OS project gives you programming experience to combat the Chicken-or-the-Egg problem ("I need a job to gain experience but I can't get a job without first having experience") when searching for your first job after graduation.
If you haven't taught yourself the basics of programming by the time you enroll then you deserve that F.
Odd. I had zero programming experience when arrived at college, yet I excelled and now have a full computer science degree (and a math minor, too). Several students who DID have prior programming experience failed that first class. Maybe it's not all black and white?
Different skills take differing amounts of time and experience to master. In general, professional musicians start playing in or even before high school. No one shows up at a university with no experience and expects to become a concert pianist or cellist. The expectation is that it takes at least 5-10 years of experience to become a top-notch musician. The counterexample offered of a surgeon having been expected to operate on his pets in high school is also silly; while the expectation is that experience with musical instruments is gained starting in the early teens, that same ten years of experience for surgeons begins in college and extends well beyond, into medical school, internship, and then residency. So it's incorrect to compare the three fields.
Part of the difficulty these academics are having is that "computer science" encompasses many different fields. Some academics are really borderline mathematicians. Some students really belong in a vocational school, because the general knowledge of computer science most university programs teach is not needed nor useful if your plan is to go write business logic in Java for some megacorporation. Those students would be much better served by a 1- or 2-year program that focuses on the specific technologies they'll be using. And there are other students who plan to make programming a career in any of several different fields, each involving its own specialised tools, terminology, and mixture of theory and practical knowledge. All of this lives under one roof in most universities. Complicating matters further, students show up with many different levels of experience; some may have grown up with little access to computers, while others may already be accomplished programmers in the open source community looking for a degree and the opportunity to gain advanced knowledge of theory. It will never be possible to come up with a plan for the first two semesters that works for all of these cases. In that sense, the one-size-fits-all approach is indeed broken. But that is completely different from insisting that "up-or-out" is wrong, or that the basics need to be introduced even more slowly or in even more courses.
Students in most programs get 2 semesters of extremely basic instruction. This covers things like what variables, expressions, and functions are, the concepts of sequence, decision, and iteration, the basics of syntax in one or two languages, what memory is, and maybe some simple data structures like arrays and structures. Anyone who comes in with any programming experience at all, in any language or context, already knows at least 90% of everything taught in these courses. Forcing everyone to take them constitutes a tax. Value is given in the form of tuition and time spent but none is received in the form of increased knowledge. Students with no experience may well benefit from these courses, however. To suggest that they're "too fast" is ridiculous, however. In those two semesters, students will receive about 80 hours of lecture instruction, 2 300-page textbooks, usually at least 1 textbook with practical exercises in it, at least 15 hours of structured practical instruction from teaching assistants, generally unlimited access to computers, compilers, interpreters, and other tools as needed, unlimited access to a library with thousands of relevant documents ranging from trivial to cutting-edge research, access to a peer group, and dozens of office hours with the instructor and teaching assistants. It's silly to suggest that in 8 months a committed student with access to all those resources cannot pick up the basics of computer use and programming in at least one high-level language. And that's really all that's expected; there are separate courses for computer architecture, advanced data structures, operating systems, compilers, graphics, linear algebra, logic, calculus, programming language theory and features, algorithms, networking, databases, and so on. No one is expecting a student completing those two courses to be a maste
I don't know what analogies you used and what your tutoring abilities are, but I knew a number of people, who excessively used analogies in every day lives, always trying to describe the most mundane things with these analogies, which most of the time were terrible, and by using analogies they made things worse, not better.
--
Anyway, if somebody asked me to explain that piece of code (a function takes in 2 parameters, returns a value equal to the multiple of the two, has no effect on scope of global variables, has no side effects on the values of the parameters to the function), I would not use any analogies beyond this: a = 1 * 2, and everything else has to be explained precisely, without any analogies.
The concepts are many: there is the 'int', so data structure must be explained, there is the '*', so the operator must be explained, there are the '{' and '}', so the scope must be explained, there is the 'return', so this has to be explained (it's equivalent to the '=' in math.)
int - an integer between lower and upper bound
* - a multiplication operator, this should be understood from math and use of calculators (if nothing else)
{} - are scope, which is equivalent to () in math
return - equivalent of '=' in math.
--
If the student was struggling with different notations, that's one thing, if he was struggling with understanding of math, that's another problem altogether.
You can't handle the truth.
The gripe is that some students are less prepared than others, making it difficult to design courses? You're always going to have that problem. In the third-semester CS course I just finished teaching, there were 25% CS majors that took the prereq in Java, 60% or so CPEG or EE that took it in C++ two semesters ago, and the rest took prereqs at community colleges or abroad. Depending on what they took and their background, they were unprepared or overprepared. You can't teach to the least common denominator; you end up balancing the curriculum so that it's sub-optimal for almost everyone, but equally sub-optimal for many students.
The music analogy is awful - it's reasonable to expect prior music experience for a music major and unreasonable to expect them to place well in the orchestra right away. The "CS is not programming" comments aside, maybe they don't have any background due to their highschool (although that shouldn't stop a hobbyist). So you solve the problem by having an "intro to programming" first semester and placing many students out of this course (that's what happened to me in undergrad and it was fine). Or you have them take remedial courses first because they're behind.
Getting back to CS1 - passing the course doesn't mean you can program anything. Depending on the school, it means you can write toy programs, typically with awful readability/performance and typically it doesn't indicate that you understand recursion, pointers, complex data structures, etc.
The most important thing is that every school is different and struggles with different problems. Some schools prepare you for a PhD in CS, some schools prepare you for the workforce, some schools prepare you for nothing at all, some prepare you just to learn and deal with strict requirements, and some mix a little of it all. It's absurd to try and make a general claim about computer science in general.
You know, the one's growing up without 8-core machines in their bedrooms and broadband pipes. I guess someone has to wash the dishes at the country club.
I swear to God...I swear to God! That is NOT how you treat your human!
Yeah, why not just download gcc?
The sciences and engineering programs tend to have intro classes that weed out the weaker students.
That's a property of low-end schools. If you can get into MIT, you have over a 90% chance of graduating. (Cal Poly engineering, 45% - 50%)
I just took a list at Craigslist, and a number of adds said "BSCS required" and the like, go look yourself. What does that mean? It means when if things get shaky at your company and the economy gets shaky and you're applying for jobs, that's a job you can't apply for. Well you can apply, but they've said up front they don't want you.
You're right that there are bad schools and bad professors and bad textbooks - so go to a good school. Find out which professors are good via ratemyprofessors, internal school rankings and the grapevine.
I also think there is an inherent worth to four (or more) years study of computer science that four years of reading books on C++ is not going to get you. You lay the foundation with a study of discrete and continuous mathematics, then you study computation and complexity, as well as other topics. By the time you get to practical applications, you have a full, rich understanding of everything going on, are familiar with algorithms, data structures, machines etc. in a more complete way and so forth. You can do this study independently, but why not go to a good local public school - some of your professors will know a lot, and working with other students is helpful and you'll get a degree out of it to boot.
[1] His son somehow interpreted this as 'evil robots took over the world'
Wow, never thought of it that way before.. suddenly I understand the entire original series.
It should be easy to test, verbal and written, each student and fail those, requireing a retake of the course, that don't measure up for continuation.
Facts take all of the premium out of arm waving - T. Reynolds
I agree. Most of the CS programs, I have seen, advertise that they will get you a job as a computer programmer. But then they teach all math and theory while expecting you to pick up the actual languages on your own. At no point do they ever get to things like how to really read an API or how to find the info you need to make an application work properly on a particular platform or even how to build a complete application that can be installed and used by non-programmers. It is all theory and just enough code to show you understand the theory, regardless of how crappy the code itself is. The universities aren't preparing you for a job as a professional developer; they are preparing you for a job as a computer science researcher.
I feel this is a massive case of false advertising. Universities are essentially tricking students into massively expensive CS majors when what the student actually asked for - and was told he/she would get - is training to be a developer.
And then the industry wonders why there are so few qualified developers around.
If the number of people who now have mortgages worth more than their homes, that they can't easily pay, won't convince you that not everyone can "plan" propertly, nothing will.
I have to say that I cannot agree with his comments. I am a very lazy person and I have even dropped out of GVSU for an extended period of time. I didn't do any real programming on my own out side of class either. I STILL go to my cs classes every day wondering when it is going to get hard, and when I will finally start doing something that feels like college level work. I felt wholly unprepared for my internship. I don't blame the school entirely though, as I said, I am a lazy person.
I do not know about other schools, but GVSU CS classes are hardly 'sink or swim'. If anything, the people attending the college are not the quality of students that should be there, and the standards have fallen because of it. I can't tell you how many people in my freshman CS course came off as typical college freshman who thought that, since they played a lot of X-box and knew how to use Napster, they were prepared to be programmers.
I will say though that the professors try very hard to help in every way. They aren't always the best teachers but it is clear they all care a great deal and probably know their stuff a lot better than the class allows them to teach it.
For music students, there's a test before admission to the school/university.
For CS students, such a test beforehand would be very impractical.
So, you just filter the bad students out in the first 15 weeks. You have plenty of students left after that, and hopefully the good ones.
Software development is similar to professional sports in that it requires both "talent" and "education". A student with "talent" should be able to program after 15 weeks IMHO; he/she may lack the "education" (as in algorithms, diverse languages etc). But the ability to walk through a program and determine the outcome requires talent. It has to feel natural to think about multiple execution threads, state machines (i.e. event-driven programing), or recursion. Also, those with the "talent" tend to enjoy software development and are motivated to become more educated about it. They are the people who move the ball forward.
As a science educator/researcher with 20+ years experience teaching chemistry at all levels, I have seen the following: If you let more people through an introductory course they will just wash-out at some later point. This is true no matter what type of teaching methodology you use to teach your science (lecture, lab, cool projects, fancy inquiry-based stuff). I have seen students that have only marginally passed CHEM1 course fail miserably in organic chemistry or physical chemistry because I or competent people in my department have made an effort to (pick one: make our subject more accessible, provide alternative assessments, have peer-led sessions, etc.), Do your students a favor. Show them what the reality of their chosen area of study is going to be like. If they rise to the challenge, great. If they quickly change their major to business, that will be best for everybody involved. It took me about 10 years to realize this - and it required teaching many upper-division courses (highly recommended for you). Not everyone is cut out for the sciences and you can correct their chosen path early on. I agree with many of the other posters here, by the way. If a student is not doing science (or computer science) in their spare time and before they get to college/university they are not going to make it in these areas. This is an excellent indicator for success. (Goes to interest, see below) Success in the sciences depends equally on innate ability, interest, preparation, and hard work. If you are deficient in any you will struggle until you either correct yourself or change your major.
At the end of the day the question is this: how likely is it that someone who can't hack it in an introductory computer science course has the capacity to eventually become a "net positive" in industry or academia. If you answer that question "not likely" then the status quo is optimal. If your answer is "quite likely" then you should agree with the two professors cited in the original article. Having been a teaching assistant for such a course, I probably fall into the "not likely" camp.
Thus it isn't a core subject offered by High Schools routinely. The job of secondary education is to generate well-rounded, educated, individuals. It is not their job to churn out trade school kids. Thus things like CS, Shop, automotive repair, are all additional subjects that may not be covered. Arguing CS should be added before the other two is arguable in larger school districts but as it stands CS is a highly skilled trade that requires a college degree so offering it as a basic skill in secondary schools is difficult. That being said, why are professors assuming kids know anything when they enter CS 101 or really any 101. I grate my teeth when I teach US History 101 and 102 because they largely walk in knowing a rough outline and I have to start over from scratch but that is how they work. 101/102 are introductory classes, asking people to really excel ahead is difficult.
I've advocated across the board aptitude tests for colleges, drop the SAT/ACT all together and replace them with a more realistic aptitude tests based on their chosen path. Math and Reading clearly are required but a third and fourth section would aid in defining if certain kids need a 101/102 setup or can move up to 110/120 or similar premise. Offering a two-tiered opening year is more effort (and I know more cost on the universities) but I would gladly teach my three specialties and two lower level classes each semester if it would help balance the incoming student body.
It's a broad statement, but it's been my experience at least. The two-quarter into to programming class at the University of Washington expected a ton of hours spent in the computer labs doing coursework. One specific benefit was that it weeded out the people who came in starry-eyed during the dot com bubble and thought they could earn zillions with no real effort. I'm not in favor of crushing students with work just because of tradition or whatever, but showing people that hey, coders in general, tend to work a lot of hours.
As a CS major at GVSU, I have to say that Professor Kurmas is one of the better professors there. However, I have to disagree with him on this issue. The courses he talks about (CS 162 and 163) are, as he says, very much sink-or-swim. I disagree with how they're taught in a number of ways (for starters, I think teaching an intro to CS course entirely in Java is a poor idea). However, in terms of preparing someone for either the CS or the CIS (a more business-oriented degree with less focus on programing) curriculum offered at GVSU, they do a fantastic job. There's certainly more to either of these degrees than programming, but as an introduction to the remainder of the degree, I think they work fine. For most of the CS courses, an understanding of programming is the only thing required going in, the rest is taught in the class itself.
As a side note, Professor Kurmas also sometimes teaches Computer Architecture (CIS 451). This is one of the few courses in the CS degree where having a good understanding of programming (and especially Java programming) isn't really going to be helpful. There's a reason that course has Computer Organization (a course primarily about assembly) as a prerequisite. It doesn't really surprise me that he sees CIS 162 and 163 as not particularly helpful, but they're much more useful in other courses.
Having taught CS at a British University, a Real one, for 25 years I make these points:
- You can not teach people how to program, to misquote Yoda, They can, or they can NOT, there is NO TEACH.
- 2 to 5 % can program, they teach themselves and it takes 6 monthe to 2 years elapsed, that is because ideas, experience and knowledge take time to mature and set, same in all the creative arts.
- Computer Science is not about programming, it is Applied Mathematics.
- Computer Engineering is, and hardware + software, it is properly a PG engineering discipline.
So do you mean genetic engineering or politics?
It is absurd to expect this generation's crowd of entitled morons, who have never been "wrong" at anything, to put in the work to learn to be a Computer Scientist. The solution, of course, is to just hand everything to them on a silver platter like they've had done for them for the first 18 years of their lives.
But let me say that based on years of hiring experience, Computer Science faculties have lost their way. Sure you get some guy who can whip up a really fancy structured program using indecipherable container thingies. But the code you get is unreadable. The design you get is unmaintainable. The person you get can't communicate with other team members. I'm tired of arguments about what object factories have to have what member functions. It's garbage. The results of Computer Science grads tend to be crap.
I'll always hire an engineer (software, electrical, whatever...) to design computer code. Sometimes physicists do a fine job too. The result you get you can live with. Often it even has documentation. And you get a team member who sometimes can actually get along.
Maybe my luck has just been bad, but this has been my experience in two decades of hiring talent.
I believe that professors should deeply consider recording their lectures for students. That way, struggling but willing students can actually refer back to key points rather than referring back to their own sketchy and potentially erroneous notes. Additionally, it would allow for evaluation of the teachers themselves by people other than the students. There is no sense in hurting people's confidence as a result of poor teaching.
Make teaching and learning more effective through the use of video lectures and the systematic evaluation of exercises. For example, the Khan Academy has a model for teaching that is very applicable towards teaching programming or anything, really.
http://www.khanacademy.org/
(i am not affiliated)
"We were headed for a two-tier society, comprised of people who used computers and people who programmed computers."
Use your empirical observational skills. Which tier is on top?
"Frank Herbert wrote about this even earlier, saying that the people who allowed computers to do their thinking for them ended up controlled by the people who programmed the computers[1]."
DelusionalRevengeOftheNerdsFanatasyX1000!
The ones who are doing the controlling are computer users who use people who program computers.
If you are somebody who programs computers you are NOT in the top of the 2 tiers---you just have delusions because you aren't in the bottom of the bottom tier.
You want universities to not accept CS students because they didn't take a programming course in high school?
Well id be fucked because my high school didn't offer any programming besides "Web Programming".
So if a student comes from a school that cant afford a real programming course then they just aren't good enough for you? Fuck you. Prick.
Other programs, like Electrical Engineering, start at a level that not everyone is ready for. If you aren't ready for calculus, then you will have to take remedial classes to bring you up to speed on algebra, geometry, and trigonometry. The majority of students, who *are* ready, don't need to waste time being taught what they already know.
I don't see why a Computer Science program could not start assuming that students already know the basics of operating computers and have rudimentary experience writing programs. Those who are not ready can take remedial classes outside the degree program or even outside the school. Why should the students who are ready have their time wasted?
I have long thought that "sink or swim" classes were the only classes worth attending. The possibly to "sink" comes from the classes actually trying to teach something hard. They cover material that requires time and practice to learn. This is a great thing. Algebra is one such class. CS 101 is another. This isn't to say you need to just smite everyone who can't understand what a function is right away, but the reason these classes seem so hard is because they actually ARE hard. How awesome.
University professor just now realizes some very basic things about education. What this means for your weekend at 11.
When the axe came to the forest, the trees said, "Look out - the handle was once one of us."
If they've had no exposure to programming beforehand, and they fail, there's nothing wrong with that. I took an intro to economics at school. I didn't fail; but I hated it and was glad we only had to take one semester. I took intro psych. It was fun, but I didn't major in psych. A lot of people dropped out of E-school. Maybe it was intro CS that weeded them out. Maybe it was calculus. Who knows.
The point is, if they are taking an introductory course and can't hack it or don't like it, they can and SHOULD just drop it.
After all, you get introduced to a lot of people in college too. You don't like all of them. You don't sleep with all the hotties. You still have to get introduced to them.
I don't think it's unreasonable to expect a student to be able to pass an entry level class. I am about to graduate with a MS in Computer Science and when I took my first CS class, I had absolutely NO programming experience. I wasn't a complete computer idiot, but I had never written a single line of code (except maybe on my TI-85). The entry level courses are (should) be designed exactly for people who have no or little programming experience. We had 3 basic programming classes that were specifically designed to get everyone on the same page. I didn't feel at all like the course expectations were overkill.
Except for all the stupid general required courses, it's up to you to choose the courses you want to take. If you aren't interested in CS, then you shouldn't be taking the classes. Someone mentioned earlier that there are the introductory courses for the purpose of weeding out the people who can't hack it. If you are interested and apt enough, you can pass the classes easily. If you cannot pass a class or just can't get a grip on the concepts, it's probably because 1) You're lazy and aren't putting forth the effort you should be, or 2) you simply are not capable of the logical thinking required for computer science. Yes there are bad teachers. Yes there are poorly designed courses. Guess what. In the real world, there are bad bosses and bad jobs, and you're probably going to have one or both and you're going to have to deal with it.
The analogy of a person never playing an instrument and expecting them to perform in the university orchestra is ridiculous. It's not like that at all. It's more like, giving someone and instrument at the beginning of the course and expecting them to be able to tell you what the parts of the instrument are, maybe know a scale or two, play twinkle twinkle little star on it by the end of the quarter. Unless, of course, your university's orchestra only plays elementary school music. If your intro CS courses are set up in such a way that you expect a student to come in with no prior knowledge and then, after 2 15-week classes, expect them to be able to write an entire operating system, then there is something very very wrong with your course design. Also, I would certainly hope my doctor wasn't operating on his pets at 15. I would, however, have maybe expected him to be interested in medicine and maybe have read an anatomy book. You guys are making some completely insane analogies.
Not everyone has the ability or even opportunity to pick this up in highschool where you usually have to be self taught. Being able to teach yourself is a great skill but it should not be a prerequisite for basic intro classes.
You fall into one of these areas
Programmer
You write code based on ideas or designs of someone else while using learned skills and methods to make the most out of the code, the hardware it is based to run on and the functions it will perform.
Program Designer
You design the over all structure of a program based on the requirements given to you. You know the limitations of the code based on the infrastructure that the code will run or opporiate on. You structure the design in a way to maximize the overall work the program will do and layout the application in a way that programmers can understand.
Program Architect
You design infrastructure, processes, practices and methodologies that are used by program designers and programmers based on the needs of the work that needs to be done. You interact with all areas that have a impact with the program and design, use or change methods of practice in accomplishing the required work.
Program Engineer
You design the tools and systems required for the program to function at the highest result. This can also including working with other engineers in areas of hardware and systems to design, use or change current resources used to accomplish the task. You take input from all levels in creating perfect work enviroment for the program to be created and run.
Program Manager
You are the bridge between all levels of the programs life. You keep track of all elemetnts related to the programs creation and life.
How is CS, true CS, any less of a science than Biology, Chemistry, Anthropology, or any other "ogy" you want to throw out there? Yes, there are many who end up working in the private sector, working for financial services firms developing apps, but how is that any different from the chemist working on drug manufacturing?
Much ground-breaking research has come out of the CS community. What IS science by your definition? Do not be so dismissive of the "science" in CS.
Opinion:=TMyOpinion.Create(Me);
I'm one of the folks that didn't get a CS degree but had lots of programming experience and ended up in the field regardless. My degree is IS and programming was a definite requirement. But I also had to learn Java and ADO.NET, C#, LabVIEW and how data acquisition systems over real-time systems work. I was an engineering technician that finished a degree part-time over the course of a career. My employers paid for my degree and I could not see leaving that tuition money on the table along with a pretty decent promotion at the end of the process. My parents tapped themselves out to send me to a local community college for an A.A. in electronics that I never finished. I finished the BS at the behest of my employer. I've worked in the defense industry since 1981. The difference amounted to a pretty decent pay raise along with more interesting work.
Do I think I had it easy? Up to a point. I was curious, had the hardware around to play with (using automated test equipment for 1984 onward may have helped) and wanted to spend more time programming than fixing hardware after a time. I still use the hardware skills making sure that our lab industrial sensors work and that everything is hooked up OK which is hard when the local union won't let me use a screwdriver. I'm not in the union since I'm engineering staff.
C programming took a while to make sense of. If not for the incredible amount of time and effort to actually understand how this stuff worked on my own I would not have figured any if it out. C++ was the '90s version of OOP and for the most part didn't use for the first two semesters of practice - data structures and algorithms. I ended up taking a specific course in OOP later on and the time was right but it required practice. Lots and lots of practice. Programming is not a natural way of thinking in some ways. It takes a long time to understand the the use of the tools and it takes longer to be good with them. Unless the student is a genius, as I am certainly not, the student really has to want to know how this stuff works. Without being driven to learn this a student of CS, Informations Systems or anything else requiring programing is very likely to fail. Should it be easy for everyone? Or should only it be easy for those with the advantages or need that I had?
bob@Osprey:~>
I took an 'Intro to piano' course in college. It taught me the basics of reading music, and making that happen on a piano. At the end of the semester, we could play 'the entertainer'. There was no way in hell we were going to become great musicians.
Several of you have taken this as an opportunity to comment on how people who can't complete a degree shouldn't pass CS101 anyway. But most students (at American Universities at least) have electives, and requirements that they take courses outside of their field. In theory this makes them more 'well-rounded'. I would much prefer a CS101 class that puts out people who at least have a basic understanding of what real CS people do, than a class that weeds out all but the most competent. If even one help desk person is saved from banging their head against a wall, the change will have been worth it. Given how much damage can be done by people opening every attachment that comes their way, society at large would probably benefit from a class of this nature.
Don't get me wrong - I'm not actually talking about remedial computer classes. But having a bird's eye level view of what the hell all of the various parts and processes that make up 'CS' would be useful for a lot of people who will never write another line of code once the class is done. We don't expect every person who takes a history class to become a historian - we just hope that at the end of the day they think a little more about history (before they repeat it).
That's probably enough.
Simple programming was taught right across all levels of maths classes in the 1980s in a lot of schools even if they only had a single computer for the school. My brother did it in the 1970s when the high school had no computers and the cards were sent to the local university. There is no excuse now.
Introductory CS used to be the bludge subject for easy credit that engineering students would take. Looking at the books now it still appears to be the case for the first semester subjects.
From the earlier post :
" a. you were worried about getting a job after college, which implies a lack of self confidence in the first place, which is an indicator (though not a perfect indicator) that you were substandard in the first place."
And then the parent post:
"I was at a job where we routinely threw Masters and PhD CS resumes in the trash. The candidates are completely worthless at real-world tasks and are so arrogant as to believe that they don't need to know about CSV files or FTP, regardless of what the other side of the transaction wants."
So being lack of self-confidence or being over-confident will not land you a job. This is why the USA is going down.
The only way to save this mess is tax credits and even affirmative action for those that have advanced degrees. Mandate that companies who do contract work to have at least x% of their workforce to have advanced degrees. Also ban H1-B program while we are on topic.
New Economic Perspectives
>>But then they teach all math and theory while expecting you to pick up the actual languages on your own
"All" math and theory? I doubt it, unless your CS program was radically different from mine (at UC San Diego), which offers intro classes and labs on actual programming. All theory isn't much use if you can't code your theory into an executable. Generally speaking, while most intro classes aren't marketed as "programming" classes, but rather "intro to data structures" or something like that, in practice they're going to be teaching their students the language of choice, and proper coding techniques.
I think the issue is that they're trying to teach a language instead of how to communicate. When I took my first programming class, half the semester was spent just doing pseudocode. And even after that, the teacher would not let us enter anything in to the compiler till we had the pseudocode done. Thanks to that I can practically program in any language. Once you learn the basics, everything else is just syntax. And for that I keep a desk reference of whatever language I'm working with to find out if I need a //, /*, #, or -- to make a comment. The other great thing about pseudocode is that all you need to know is how to read and write any language. So if you fail at pseudocode, then CS is definitely not for you.
The problem with weed-out courses is the way they serve two diametrically-opposed functions. On the one hand, they need to "weed out" the students who simply lack aptitude for a given major and/or career-path. On the other hand, they need to take the students who do have the aptitude and teach them enough to make them functional beginners in the field.
if you couldn't pass that class easily, it was pretty much a given that you wouldn't be successful.
My girlfriend aced her organic chemistry class, but it was still bloody difficult and one of the most intensive courses she ever took. Coming from her, that means it probably violated several of the major anti-torture statutes.
There really ought to be a difference between a course and an exam.
There was a time where IT was basically CS. You had to actually understand how a computer worked in order to fix minor problems with it. While I'd love to say this was in the good old days of mainframes, in reality, it was much more recent than that. A guy fixing a 486 generally would just swap out parts until the reported problem went away or reinstall DOS and Windows 3.1 to start from scratch. A much better IT guy would instead track down a motherboard which was put together by a legitimate electronics organization that understood wave reflection (the #1 problem with boards of the generation) and dump the run of the mill organizations which sold cheap hardware during a time which PCs were being commoditized. At that time, all you needed to design a motherboard was a CAD program and a general understanding of how to connect pins together into the bus. To develop something good required an engineer who understood the important of trace length tolerances.
These days, the IT group at a company can be made up of teir 1 (high school flunkies who like installing windows and complaining about the members of their organization who know even less than they do), teir 2 (people who might have studies computers at some point but lacked the talent for anything much more complex than basic network design) and teir 3 (guys who may or may not have a real education, but their certifications are more important than their degrees anyway, they install servers, configure routers etc... they might even be able to use WireShark or Network Monitor to solve problems).
CS on the other hand, was really watered down during the era where IT and CS were really the same thing. CS stood alone and no longer required an understanding of electronics engineering. A guy who would configure a router and a guy who would design a router took the same courses, but the problem is, the world needed A LOT more guys who could configure a router than design one, so the programs really dulled down towards the IT level. As a result, the CS program now spews out people with learned skills instead of problem solving abilities.
Now that the programs are separated, I see IT as a purely vocational skill. IT grunts should be educated either by vocational schools or even certification courses (like those from Global Knowledge Network) and CS should remain what the name implies, computer science. Database and Web developers should be somewhere in-between. They're just grunt coders who structure databases and link fields on the screen to field in the tables. Electronic engineering should be reintroduced as a requirement to CS students. It's important to understand HOW the hardware works. a CSEE grad should be able to bridge the gap between hardware and software development. A CS grad, while not necessarily an guaranteed to be an expert in assembly language programming should understand machine level programming well enough to just pick it up and handle it effectively. They should be able to understand the system call architecture of the operating system.
MOST IMPORTANTLY!!! A CS GRAD SHOULD BE AN EXPERT ON ALGORITHMS (DATA STRUCTURES).
I am furious that in most companies where I have worked, I am the only one who implements data structures more complex than linked lists. People show up at my desk and ask me to implement a new node based storage/recall system because they managed to get a masters degree in computer science without understanding this MOST IMPORTANT TOPIC well enough to implement it. Data structures is the absolute minimum requirement for anyone who wants to be called a computer scientist. ALL OTHER TOPICS of computer science stem from data structures. Sure, there are algorithms which act on a single type, but in reality, the logic involved in algorithms will allow the developer to produce an optimal implementation of it. For a beautiful example of the difference between a real computer scientist and a hackish one, look up CRC32 and see the difference between the brute force methods of arithmetic(as well as logical) implementat
There is a profit motive to be careful of here. Large lecture hall classes, otherwise managed by graduate student slaves who live in continuous fear of their doctoral adviser, herding clueless freshman, are comparatively cheap to operate compared to higher level classes. So there is the desire to weed out the weak early, balanced against the desire to fund the higher level facilities and research.
A similar situation occurred during the mid 90's at the Georgia Institute of Technology. There was a lecturer whose name started with a G who was notorious for running the freshman level weed-out class, and he had a cadre of sadist teaching assistants who gleefully assisted. There is an old story of one TA in particular who was so notorious that when 18 students of his 20 student section discovered he was their TA, they dropped the course immediately. He failed the remaining 2. Unfortunately, the university began to get a bad reputation due to "killing the dreams of bright and hopeful Georgia students", so the compromise was to shift the weed-out course to the sophomore year, and milk the weak students of money while they attended easier general lecture courses during their freshman year. Eventually the school forced the lecturer out by not renewing his contract, as an oblique PR move.
Unfortunately, there are no easy fixes, short of requiring entering freshman who have not taken a programming course in high school to take a remedial concentrated/focused short course during the summer after high school before entering the university proper, slotting it in perhaps before most of the "orientation week" sessions that occur at the end of summer. A way of implementing this would be a timed online test that is functionally open book/notes, which requires making a system that shows comparatively unique tests to every test taker. Failing the test means summer school.
Low-end schools, yes. Lazy schools that don't want to really put in the pedagogical effort, yes. But also state schools, whose CS departments may be required to take in, and subsequently turn away, students whose primary virtue was being born in the right place. Examples: University of California (all of it, including Berkeley, which has the best-ranked CS department on Earth), University of Maryland at College Park, University of Massachusetts Amherst. None of these universities' admissions offices will turn down a B+ student from their own state whose destiny, as written in the Book of Life and their AP Comp Sci score, is to wash out of computer science at the late 100s or early 200s and go become an IT or English composition major.
Back around 1980 you had to be lucky to have ONE computer in your school. You had to be lucky to know there was one. You had to be lucky they let you use it. You had to be lucky it had a programming language installed, and documentation was available.
Today a computer costs less than 50 hours of work in a McDonald. You can install Eclipse on it for free and access any programming language you like. You have access to lots of on-line resources, including on line manuals and Wikipedia. You have forums to ask questions when you don't have a clue.
Bottom line, is (at least in rich countries), kids get no excuse if they fail at computer programming, wether their teacher is good or not! you may get bad grades at school, but if you can't program before you're out of school, then programming is not for you.
The University where I studied, and later briefly taught, had an excellent policy by the early 21st century.
They stream CS undergraduates for programming class. Nothing else, just what was at the time called "Programming Principles" or "Progprinc". Students self-select into streams after the introductory lecture. By default they get the lectures, weekly programming problems and a small group discussion of the problems and their solutions with enough time for a little 1-on-1.
Those who feel they're struggling get additional "Strugglers" lecture slots in a Q&A format which rehearse the content of the lectures but concentrating on ensuring that the basics are understood by as many students as possible. If you wonder what a variable is in week three, you can go to that slot and ask and not be laughed at.
Those who feel this is all too easy can attend "Space Cadet" lectures, simultaneous with the struggler lectures. These can go off and explore aspects of the current topic that the main class won't cover. They're intended to challenge those who already think they know how to program.
Students can switch streams as they feel necessary. If recursion comes naturally to you but a data structures lecture leaves you bewildered you can attend Space Cadet lectures one week and the struggler lectures the next, but that probably won't happen to many students.
One thing that's really important, all the early exercises are suitable to be assessed for correctness by machine. So they do that. BUT they're also all read by (postgrad of course) small group leaders. Maybe six years of self-taught Perl means you can solve problems well enough, but it's made your style into an unreadable tangle. You'll get full marks but a red pen admonition to look at the style in the textbook or online examples and copy that until you develop a personal style that doesn't make people want to tear their eyes out. In the final exams your code snippets will be hand written, if your style is still unreadable then you will probably lose marks for it.
The above strategy is also really good for those rare students who you have to kick out. Usually, when kicking out a student who either never attends class or doesn't hand in any work, they will protest that it's too hard and the university ought to have come round, dragged them out of their drunken stupor and explained all the technical stuff more slowly. They take a register for Strugglers. Were you there? No? Then apparently you weren't struggling, just lazy. Bye.
Use your empirical observational skills. Which tier is on top?
Well, let's see, which tier caused the economic crash? Hint: those same companies keep trying to headhunt me, at an insane salary (plus bonuses), to program computers...
I am TheRaven on Soylent News
> Training is exactly the process of making someone good at something!
Well, this is a typical manager attitude - this does not make it any more true, though: Training is the process of systematically (as opposed to implicitly as e.g. by learning on the job) turning talent into skill.
If the talent is there, then training will indeed make you good or better at something. If it lacks, no amount of training will make you "good" in any reasonable sense; basically, you will be reduced to "faking it" with huge effort but very little to show for it. In some rare cases, this is worth it (mobility training for the blind comes to mind), most of the time it is not.
In IT/CS it is even worse, as without enough talent, in a professional environment, you will often end up with not just low but negative productivity i.e. causing more problems than you actually solve (and often make your life miserable in the process).
“In the sea there are crocodiles” by Geda Fabio is the story of the orphan who fought all his difficulties against all the odds. Just a kid of 10 years age, he had every reason to follow the wrong pathway, yet maintained his dignity, for the sanctity of his survival. Geda Fabio has scripted his hear warming story, and a click at www.rightbooks.in/product_details.asp?pid=9780857560087 will let you have that.
I teach at a second-tier state university in GA; our tuition is about 3K/term (so raking 200K in debt is going to be really hard :), our intro CS classes have about 40 students, with mandatory closed labs, 20 students in each lab (the prof and a lab assistant are usually available for the lab); and, although we'll have occasional problems, none of our profs flunked math and most (if not all) have written software for a living. (And we still have 30%+ failure rates in 1301/1302 :(
I am really proud of my school (spsu.edu), but I don't think we're that much better than other mid-tier state universities; of course, our uni doesn't rank very high; our profs don't do much research (since we teach, and don't have a PhD program), but our students get well prepared, and the vast majority of them get employed immediately after graduation (or earlier :)
I think there's many more of us than flagship universities, so we may be a more representative path for CS (OTOH, there are probably many more junior and technical colleges :)
Sorry, but I have to disagree with this. If you have the capacity to think logically, you don't need to have experience with computers to succeed in intro level programming courses. If you had your way, I would not have been able to take CS 100, or would have had to waste a semester in a boring and unneccessary class. As it was, I took the intro C++ course without ever having seen a line of code in my life, and I excelled in it. It's not about experience, but more about the way you think.
OK, nitpick if you will, but "all x and y" is a common English idiom, generally understood to mean "almost all" or "a very significant portion."
At my university, I had two classes that were actually about how to write the code to get what you wanted done (AKA "programming"). All the rest were pure theory. Yes, they were called "Data Structures" et cetera, but the only thing that was discussed in lecture was the structures themselves and the general psuedocode for implementing them. Lab time was spent grilling the GTA about how to actually get the programming done. Most of the time he ended up simply writing all the code on the board, leaving to the student not much more than getting the syntax right.
Not that I really expected a CS degree at a research university to be "all" (there're those idioms again) programming techniques with little theory. But I didn't expect to be entirely on my own when it came to learning all the "real" stuff about writing good code. Even when I went in to office hours the answers I would get were "all" variations on, "I don't know. I haven't written any actual C++ code in years." So I started asking professors who I hadn't even had any classes with ... same answer.
So it slowly dawned on me: If I wanted to really learn how to do professional development, I would have to get my degree, get a job, and throw myself at the feet of real programmers, begging them to tell me what I really wanted to know ... how to write good code that really did something useful for real users.
If this is a weed-out course in computer science, why is there programming involved? Yes, as a prospective computer engineer or scientist, you do need to learn to program a computer at some practical level. But that's also true for any other engineering or science degree -- at least as true today as when I was in college in the early 80s. And at least at CMU back then, every Freshman in engineering, the sciences, probably even fields like psychology, took a computer programming course. But these were specifically not weed-out courses.
The actual weed out course (and one could rightly ask why, in a school as hard to get into as CMU, did they need additional weed-out courses, but that was 15-211 in 1980 in the CS department) had exactly one real programming assignment, and that was the last one of the course. The emphasis in the course was, as you might expect, computer science: finite state machines, turing machines, lamba calculus, various bits about the design of high level languages, etc. They eventually split the same material into two courses, and made it weed-outy.
And no, this was not a course designed to be of much practical use in a job... on the surface, anyway. But it was the gateway course to every other CS course, many of which were going to cover more practical topics, like the computer engineering or CAD course, both of which worked on large projects, with every class member contributing components, or Compiler Design (well, practical for me anyway, since I had a job writing a compiler for a few years back in the 1990s).
Note, also, that none of these are really "programming" course. If you think you need college to teach you a computer language, you have no business studying computer science or computer engineering -- go to a trade school and become a computer programmer. A computer language is something you can learn on your own in a couple of evenings, if you don't already know it. And unless you're only planning to code for a couple of years, you WILL need to do this at some point in your career. When I was in college, the big languages used at CMU, at least for undergrad projects, were Pascal (with CMU extensions) and LISP. One summer job at Bell Labs, and I had picked up two more (C and PL/M). The point of a college education should be to get you to the point where a new language is just that simple exercise of a day or two. And to teach things general concepts applicable to any programming task in any language.
-Dave Haynie
Saying 'You have ten weeks to walk, and if you can't, you get an F and you're not allowed to try to walk anymore." is a terrible analogy. Who says that if you fail your CS1 class you can't ever take it again?
At my university, I had the privilege of studying with a young "refugee" from a Hassidic Jewish community. He came into the program not knowing how to multiply fractions. He graduated magna cum laude with a double major in chemistry and mathematics, and won the award for outstanding senior in the mathematics program. Early exposure doesn't necessarily correlate with your skill: a great violinist will have a better developed gift if they start at 8, but they won't necessarily be BETTER than someone who starts at 20.
Though really, failing the intro course is a pretty good indication you aren't cut out for it. I had to pass comp sci II (without I) for my minor, and managed to ace the course with only a semester of Visual Basic from high school under my belt. Same story with a lot of other people in my class: all this arguing about needing prior experience is moot if people aren't failing these courses because of inexperience.
Intro courses in pretty much every STEM subject are widely acknowledged to be more about hazing than about instruction. My intro chemistry, physics, and mathematics courses had an attendance component (while no other STEM course I have taken since does). The programming problems in comp sci I and II are easy, and you don't really need to design very elegant pieces of code: just ones that work. The course is an opportunity to prove you're serious, not necessarily that you're GOOD, and it's quite possible for a poor student, but a good coder, to fail the course. In that case, the student should get a second chance.
Which brings me to the biggest issue with this article: "not allowed to walk again?" Just repeat the course. I know that after failing the course a bunch of times, you might get some words from instructors about how maybe this isn't the major for you, but if repeat the intro course a bunch, and then ace everything after that, I don't think any school has specific administrative hurdles that bar you from continuing. If you have to repeat EVERY course, then it's not sink or swim, you just suck.
What college did you go to, out of curiosity?
All my professors (except one) in the CS department wrote their own code, and were, generally speaking, elite hacker ninjas. People like Bennet Yee (bsy) and Stephen Savage (http://en.wikipedia.org/wiki/Stefan_Savage) were younger, brilliant professors when I was there, but even the older chaps kept their hand in the game. The only one I knew that hadn't written code in a decade went on to become a high level administrator.
The professors (and the TAs) rigorously enforced good coding practices throughout the undergraduate curriculum, so you did learn about "writing good code" in the program. Very much so - when I became a TA myself, I'd slap down people for writing sloppy code. We'd do code audits with the undergraduates as part of the grading process, and I'd skim their code and be able to tell them three different ways their code would break before I even compiled it. (Good experience for me, too, come to think of it.) It's a shame you didn't get this experience as part of your college career - it was amazingly useful for me.
I agree somewhat with your sympathy that colleges should spend a bit more time on practical stuff (cough, databases) which you can teach general/theoretical concepts about (3rd normal form, etc.) which will increase your usefulness in the real world. At UCSD, it was an elective, whereas compilers was a mandatory class. While learning how to write a compiler (and all the related concepts) was in retrospect much more useful than I thought it'd be at the time, it still wasn't as applicable as databases.
Well, the university, about which I was speaking (writing), was the University of Kansas (KU) in Lawrence, KS. As a research university, their focus was, naturally, on research. However that isn't what they tell the undergraduates. I had heard, many times, that the undergraduates were just cash-cows to support the graduate program and the professors' research.
I do have to say that I transferred to a smaller college called Washburn University in Topeka, KS (yes, temporarily called Google, KS). There, the focus was less on theory and more on how to write code. In their data-structures class, we worked through all the code necessary to accomplish the goal at hand. In fact the teacher would first work out the logical problem as if we were inventing it for the first time, prompting the class to come up with ideas, then he would do the same thing to implement it in code. I think it really helped develop a gut feel for how the data-structures worked. They had a course or two on software engineering, some on database design and some on game development. However, as my plans had changed slightly when I went there, and I had already done plenty of database design as a network manager, I did not take any of those advanced courses. Therefore, I don't know exactly what was taught in them. That said, based on my overhearing of many discussions, I think the software engineering course was primarily about metrics, which are important but are still not what one needs to know to construct a complete, deploy-able, use-able application.
In the end, what I wish I had been taught - and couldn't get any professors at either university to explain or teach me - is how to design, build, and deploy a real application just like you can pick up off the shelf and install. How to design and build a real user interface rather than just putting some standard buttons and other widgets in a window. How to integrate the data access with the user interface so it all works smoothly and transparently to the user. How to design an entirely new user interface object, complete with event detection and graphical manipulation. How to load user preferences and make use of them within the program. And how to do all this within each of the various major platforms. The whole kit-and-kaboodle. Instead, I got a lot of pieces and parts that are mostly just enough to say we did them, but not quite enough to put the whole thing together into a complete application.
I don't hold anything against the second university, Washburn. As a small college, they were doing the best they could with the time and resources they had. But KU had no excuse. I guess I wish that there was a separate track that really did focus on building a whole application; perhaps coordinating all the courses so that a student would build on the same large-scale project over the entire course of his or her CS degree, similar to the way the Deitel &Deitel books build on the same program throughout the course of the book, but going much farther than Deitel &Deitel.
I don't know, maybe there are programs out there like that. But how does one tell such things before one has invested a couple of years in a college? Certainly not by reading the advertising on a university's web site. Perhaps we need a classification and rating system to indicate what each university really teaches. Maybe someone could set up a web-site to make this information available to everyone. Naturally, we would need to put our heads together and figure out the list of all the important skills that need to be taught - and learned - in order for students to be ready to hit the ground running in their new jobs. A curriculum, if you will. Does one already exist? It seems to me that some industry groups must have done this already.
If you can't grasp the basics of variables, decisions, loops, functions and classes in 15 weeks then you are not ready for what comes next. I've had students who truly could not, and it would be cruel to let them continue on, only to get mired ever deeper and rack up more debt. If prerequisites, declared or implied, are not fulfilled then one is in no position to go farther. Those who take it again and struggle thru may pass (rare), but they have already shown that - aside from special cases and remarkable effort - they are just not equipped to compete in the complexity and speed of the subject.
If you can't grasp
class C { public: void d(int n){ for(int i=0;in;++i) cout”Hi! "; } };
void main() { C c; if (true) c.d(); }
in four months, you're not cut out for the career.
I get students who don't grasp the concept of variables. I mean they truly do not grasp the concept of x=3.
Maybe they can get it at some point, but they don't keep up.
If you can't play standard scales in 4 months, you're not up to compete against talented musicians.
If you can't dissect a frog in 4 months, you're not cut out to do surgery.
If you can't write a poem in 4 months, you won't be teaching college English.
Sure we can hypothesize special cases, or give contrary anecdotes. Building policy on that is like not driving to work because you might be killed in a crash. I know Einstein failed math; he overcame, and so can any special cases - it's not like one is forbidden from the subject everywhere for life.
If you can't grasp a bare minimum level of competency in four months of six hours a week lecture time plus up to all waking hours for assignments, take the hint - go find your talent, which isn't this.
Can we get a "-1 Wrong" moderation option?
Sorry, /. ate the insertion operator in my example.
Heck, that improves the example: if you can't fix the bug in that after 15 weeks of study, reconsider whether you're willing to work as hard as you'll need to for the certification.
Can we get a "-1 Wrong" moderation option?