views:

1097

answers:

17

The idea here is to get better programmers right out of college.

I think I would have to go with Algorithms, it's not exactly something you can pick up on your own very easily and I think it enables you to look at efficiency and correctness of software on a deeper level.

I also believe that teaching actual programming can be helpful, but I learned most of what I learned about programming at work, which makes me think some of those programming course blocks (not all) could have gone to better use.

These results will be part of a letter I want to write to the CS dept at my old school, I think there are tons of classes I took that didn't help at all, and others that I think would have been invaluable.

+3  A: 

Computer Science != Programming.

If you're looking for better programmers, look for people with education from a 2-year college program that focuses specifically on that.

Andy Mikula
I agree Andy, I think too much emphasis is put on teaching programming, and not enough on the more formal topics (Algorithms, Automata Theory, even OS). I'm just glad i'm not the only one that feels this way.
Robert Greiner
I don't know if I would say that the != is true. The reality is that its 1/3 to 1/2 maybe 1/4...
RSolberg
@robbotic, I think you and @Andy are diametrically opposed on this. I take this answer to mean that CS topics aren't particularly useful to programming. I would disagree with this over the long term, though perhaps a person with a 2-year degree has more practical knowledge at the beginning. The person with a CS background ought to be able to learn, adapt, and apply priniciples in new situations faster, though.
tvanfosson
@tvanfosson I don't necessarily agree with the second statement, but I do agree that CS should not be completely centered around programming. I think programming should play a huge role, but the students would be better served (in my mind) to not take courses in programming per se, but incorporate it in all courses. I hope i'm making sense, I am just trying to sort through my thoughts on the subject, I just don't think the way we do it now is good enough.Thanks for your input.
Robert Greiner
I would agree that CS != Programming, but CS still makes a healthy contribution. CS alone doesn't make a good programmer, but no CS makes a really crappy programmer. Shlemiel the painter is a classic example of practical CS.
Steve S
Clarification: I'm not saying they're not useful - but programming is not the intended end result.
Andy Mikula
A: 

Database Design

Functional programming

Object oriented programming

x Driven Design

rball
+3  A: 
  • Business 101
  • Office Politics 200
  • Nothing is ever academic in the real world

In reality, walking into a programming job you are not expected to be a senior developer from day 1. Learning some coding fundamentals certainly takes you a long way, but on the uptick, I see quite a few computer science students struggle in the real world because they don't really know what they are getting themselves into on day 1. They struggle with business domains and understanding why they do what they do. They don't know who to communicate with other business folks.

RSolberg
Another good point, very few courses are geared towards creating professionals. Who cares how smart you are if you can't get along with your team?
Robert Greiner
+1 It's never as simple as the academics might lead you to believe anyway.
jlembke
You'll learn how to become a professional gradually through experience in a professional environment. However, it's clear that nine out of ten programmers don't learn how to write and reason about code through experience alone.
mquander
@mquander - Getting prepared for the workplace is far different than gradually building yourself up through years of heartburn, headaches, and bumps in the road.
RSolberg
Likewise, becoming skilled at your trade (programming) is different than struggling to become half-competent through experimentation and remaining a poor developer throughout your career for reasons you don't understand. Ask anyone with a clue who is interviewing candidates for programming positions about how well the majority of CS graduates get trained. Would you rather have a developer who is new to the industry but a great programmer, or a good communicator who can't write a line of code to save his life?
mquander
@mquander - you are completely missing the point. This question is about day 1 in the office. Real World Day 1. If you are talking about 6,000 days from now, having the fundamental understanding will take you very far and probably lead to success. But not being able to work effectively with others on Day 1 could lead to many failures.
RSolberg
Look, my first job was a programming job, and I didn't lack some "secret communication education" that made me unable to get things done with my coworkers, despite not taking Office Politics 200 in college. You learn to cooperate in kindergarten. Being new and awkward on day 1 might lead to some failures, but not being able to program on day 1 means complete failure.
mquander
To be clear, I'm not talking about "fundamental understanding" that's going to pay off 6,000 days from now. I'm talking about a world in which many CS graduates can't do this: http://www.codinghorror.com/blog/archives/000781.html and in which these same graduates are expected to move to a workplace and contribute to big, existing codebases in a productive manner.
mquander
+2  A: 

I'd say it's a tie between Database Systems and a Software Engineering Project course. Neither course is required for an undergraduate degree at my school, but can be taken by undergraduates. Having some knowledge of databases is probably more necessary than algorithms for most programmers. Working on a project team, even on a course project, can help you understand team dynamics and how to work in a team environment.

On the other hand, I firmly believe that a good understanding of fundamental computer science topics, including data structures, algorithms, operating systems, etc. are critical to preparing one to grow as a programmer.

tvanfosson
yeah, I like the project course idea. Luckily, most universities require it. Do you think it should span more than one semester though? Maybe have a year long course, or even an internship?
Robert Greiner
I believe that the senior capstone course ought to be a 2-semester project. I can't imagine that you can tackle any realistic group project in a single semester with only 3-6 hours of classwork a week.
tvanfosson
+3  A: 

Nothing beats the knowledge gained by building projects, it does not really matter which course is it, if you are taking relational databases course build a library system project, if you are taking Assembly language build some thing like PC tools with 32/64 bit assembly.

You can only become better programmer by doing "Programming" not by just taking courses and getting a high GPA.

AppDeveloper
+2  A: 

That's a hard question to answer, but one thing that I think hinders programmers in a lot of CS programs is lack of hands-on coding. It's important to know the theory of computer science, but I think a lot of highly theoretical CS programs fall down by not requiring programming exercises in their classes. For example, I've seen a lot of AI classes that require research and papers, but no code. In my opinion, it's extremely important to understand the theory of computer science, but it's equally important to be able to apply it.

MattK
+14  A: 

I've yet to find a good CompSci course that adequately prepares software engineers for the workplace. If you find one that has the following [although whether it could be called CompSci I'm doubtful, it's more like Real-World Software Design which is a very different beast].

Computer science is a more theoretical subject that has very real world implications, but is more useful in an academic light. Algorithm design for instance is fantastically helpful to software engineers, but isn't really directly helpful to the consumer. For instance, knowing how to build a quicksort algorithm, or understanding linked list traversal is not really so useful in today's software engineering environment - of course, understanding the theory is helpful for choosing the right tools for the job, don't get me wrong. As developers, many of us rely on the output of the computer science world to further our development tools, in fact, without them many developers would be left floundering, but put a computer science graduate in front of a user and get them to design a meaningful piece of software for them and the academic intellect is going to fall to pieces because the two speak completely different languages.

A much more useful course for software engineers would include as many [and possibly more] of the following components that I can think of off the top of my head:

  • Programming Language - basic program flow, paradigms, syntax etc. This is mostly taught pretty well, so I won't stick on this one too much. Although it would be helpful if a few completely different classes of programming languages were taught - for instance, I learned C, Pascal and VB 3(? I don't remember the exact version). It would be way more helpful if programmers learned at least one functional language, one imperative language, one declarative language.
  • Debugging - When writing nTier applications [which many/most real world applications are], it would be useful to be able to figure out where something is going wrong, right down to the protocol level if necessary. Analysis tools such as WireShark are useful for this.
  • Communication Devices - XML, XQuery, XPath, XSL, XSD [as these seem to be used so extensively].
  • Relational Database Design - This is taught reasonably well already.
  • Relational Database Performance Tuning - Just designing the tables isn't enough, knowing when it's appropriate to index certain fields and when it's not is also important and doesn't seem to be covered in a lot of courses.
  • Data Normalization This also seems to be taught reasonably well in a lot of cases. Although most students seem to come out into the real world spewing the theories they were taught - "thou shalt always use Boyce-Codd Normal Form" etc, without actually thinking about the implications of those theories. Sometimes in the real world we have very good reasons break the rules.
  • Query Optimization - Writing basic queries often seems to be at the outer limits of graduates comfort zones, optimization should be taught. Also, tools like query profilers should be taught to help students debug performance issues with applications.
  • Stored Procedures/Triggers - I've yet to come across a student that could write a stored procedure or trigger or use either one effectively. Selects/Joins/nested Selects seems to be the limit of what is taught when it comes to query design.
  • Basic Algorithms - This is taught farely well in my experience, but a lot of students don't appear to have any idea how to decide which algorithms apply to which situations without being told "using such and such an algorithm, solve this problem". It would be useful if you could say, "solve this problem", and they're like, okay, I've got a fleet of algorithms that would be useful in this situation, this is the best because of x, y or z reason and here is how it can be applied to provide a solution.
  • Recursion - I've yet to find an approach that can teach recursion, it seems that either you get it or you don't. One of these days I'll find a good metaphor that will make this understood by even the most basic programmer.
  • Abstraction - This seems to be something that a lot of courses gloss over despite being one of the core tenets of OOP.
  • Code Refactoring - Knowing when to refactor and almost as importantly, when not to.
  • Code Reuse - It seems that a lot of courses are spitting out cut/paste monkeys - this is not what code reuse is supposed to mean!
  • Source Control - I didn't learn about source control until my 3rd or 4th programming job, and I don't know a single software engineer personally that learned source control as part of their course... why is that?
  • Backup and Restore - I've not heard of any courses that teaches this. How many beginner programmers have lost all their work because they just didn't think about backing it up? I know I have in the past - not recently though. It's not that I was ignorant of backing up but as the saying goes "it'll never happen to me". It will happen to you, and guaranteed it'll be right before you have to demo everything you just lost!
  • File System Maintenance - Okay, some of the courses gloss over this briefly, but a lot do not.
  • Writing good quality design specifications - This always seems to be provided as a brief of coursework, but the student is rarely asked to design this themselves. Writing a scope of work and understanding document templates seems to be far outside the scope of most software courses.
  • User Documentation - Users don't think like you, handing them software that is "self explanatory" or "so simple an idiot can use it" will blow up in your face. There's a famous saying that "Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the Universe trying to produce bigger and better idiots. So far, the universe is winning". Write user documentation that an 8 year old can follow - it might seem painful to write it, but once it's done, and forever more, you will thank yourself.
  • Technical Documentation - i.e. It would be useful if students could use Sandcastle, nDoc or any documentation tools.
  • Test Planning - designing the tests and software that allows for testing. nUnit or similar would be a great tool to teach on software development courses. In fact, teaching any testing framework would be better than not teaching any... as seems to be the case.
  • FAT/SAT/UAT Testing - It would be helpful to understand various testing scenarios in the real world such as sanity checks, factory acceptance tests and user acceptance testing. Sign off for your software is as critical as developing it. If you don't deliver what the client thought they were getting, you're not getting paid - no matter how brilliant your solution is on a technical front.
  • Software Architecture - understanding the different components of real-world n-tier applications, advantages and drawbacks of using them.
  • Interaction with users - Maybe this isn't really computer science, but learning how to talk to people that aren't often on your wavelength and don't think the same way you do, this goes with communication, but is really something developers need to be aware of.
  • Common Sense - Ding, ding, ding, ding - there are a lot of programmers out there without an ounce of this! The courses are designed to prove that you can think for yourself, I don't understand why so many graduates come into the real world thinking that all they need to do is apply the rules they were taught blindly without thinking about reasons and implications. I'll repeat what I said earlier - in the real world we sometimes find very good reasons for breaking the rules. We don't follow them blindly, and we don't break them blindly either. Software development is an art, and like all arts we must know when we can and can't and as importantly when we should and should not break the rules. As a graduate, you've learned the rules, you've proven that. Now you need to do what the course was really trying to teach you - apply what you've learned to think for yourself.
  • Listening - You'd be surprised how many times I see code written because the developer "thought they knew what the customer wanted" instead of actually listening to what the user is saying and understanding their actual needs.
  • Understanding - Goes hand in hand with listening.
  • Communication skills
  • Talking to the technically inept - i.e. a large part of your user base
  • Project Mediation - selling your ideas to those writing the cheques
  • Prioritization - how to decide which features are more important than others.
  • Budgeting - time estimation
  • Time Management - how to get things done on time when everyone around you is impeding on your time and has no care for your deadlines. Just like when all your friends are wanting you to go to the pub for a pint or ten when you've got a piece of course work you haven't started yet due in by the end of the day tomorrow.
  • Scope creep - when to say, no, that's not in the spec/budget.

And even if you did manage to learn all that in your course, I daresay you'd still learn more in three or four of months internship at a software development consultancy of a decent callibre than on the whole course. I learned more in my first 6 months after my bachelors degree than I did in my whole 3 year course. Admittedly I'd have fallen flat out my face without many of the things I learned on that course, but there was so much that was taught needlessly that could've been replaced with far more useful content.

BenAlabaster
That's an awefully big list for one class :P Although I like where you are headed with this. There are alot of topics here that would serve new programmers well (especially the source control and interaction with users).
Robert Greiner
A lot of this kind of stuff is covered in the newer "Computer and Information Science" type majors that are more software engineering oriented than theory oriented.
MattK
Quite a few bits of this *are* covered, but quite a few are also *not* covered and *should* be to truly prep graduates for the real world.
BenAlabaster
And to be fair, most of these bullet points can really be taught in very short time. It doesn't take long to learn things like documentation, source control, backup. A lot of the other things such as database design are taught but are cut so far short that the material is just a taster and never really becomes useful without a *lot* more work.
BenAlabaster
And to be honest - I don't think CompSci majors really make fantastic software developers, and the courses aren't really targeted at that. CompSci is a theoretical subject that is best kept for the purpose it serves - and that is largely academic. Don't get me wrong, we software engineers benefit vastly from their work, but their target audience is not the average consumer.
BenAlabaster
Managing Software Development: http://www.ccs.neu.edu/home/kenb/csg110/Algorithm Design:http://www.ccs.neu.edu/home/vip/teach/Algorithms/schedulen.htmlProgramming Pradigm:http://www.ccs.neu.edu/home/matthias/107-f08/index.htmlwill cover most of your bullet points.
kunjaan
@ balabaster. Computer science teaches you the fundamentals that are pertinent in designing softwares.
kunjaan
@kunjaan - That's just it, computer science *doesn't* teach you the fundamentals of designing "softwares", it teaches you the theory of the fundamental building blocks. Software design is a different animal that admittedly greatly benefits from CS but really is a completely different discipline.
BenAlabaster
@kunjaan And your links are CS links that typify most CS programs. None of them cover any real world needs - for instance, nUnit, nDoc, nANT, Sandcastle, Source Control, Writing Software Design Specifications, Writing Technical Specifications, Writing User Documentation, SAT/FAT/UAT testing etc...
BenAlabaster
I am not saying those things are not important(personally i wouldnt go to a class to learn nUnit). But I think your original statement that compsci is a theoritical course detached from reality is false.
kunjaan
I think we're talking at cross purposes, I'm not trying to suggest it's "detached" from reality per se. What I'm pointing out is that software design is a completely different discipline than computer science albeit reliant on CS. It's akin to the metaphor that learning to read and write doesn't really teach you about life. It gives you a solid foundation upon which to learn, but isn't really that useful in the real world without other tools. CS majors provide software engineers reading/writing tools but isn't really helpful to us without the other tools.
BenAlabaster
"newer "Computer and Information Science" type majors"? I graduated in 1991 with such a degree. Was my degree cutting edge all those years ago? Well, most of that bullet list I learned in the wild, not in college.
jmucchiello
@jmucchiello - and I'm sure you'd agree that if you'd at least touched on many of those bullet points in college, the transition from academia to business would've been much less intimidating.
BenAlabaster
Again, if this is what you're looking for, why not take Software Engineering instead? The difference is much the same as the difference between Physics and Civil Engineering, though software design isn't a regulated profession in the same way that engineering is. This whole argument has been done to death on this site and it always seems like people just completely miss the point.
Andy Mikula
@Andy I agree. A lot of people start Computer Science courses with the expectation that they'll come out as software engineers and that's not what Computer Science is about. It's a completely different discipline - a fascinating and fulfilling discipline it may be, but it's not software engineering.
BenAlabaster
+13  A: 

The class in which you spend your summer at an actual company writing software.

Seriously - CS classes aren't meant to produce good programmers. They're meant to produce computer scientists who, as a side effect, can also write software.

Sarah Mei
great idea, I like the concept of internship classes.
Robert Greiner
Some universities will actually give you credit for an internship or a co-op. At my university it was only a 1 credit hour class, but it might be better.
Jesse Dearing
A: 

My take (as an english it director) is that a day in an office is worth a week at school and as such if you can fidn a way to get some experience it will be worth it.

Other than that just be confident in your abilty, play to your strengths and be prepared to google anything you dont know!

If you wish to stand out from the usual IT crowd then ensure that you are able to communicate properly as it is amazing how many 'top' grads cannot.

Desiny
+1  A: 

The most important and relevant are not CS courses. You will need to communicate well. Whatever courses you can get to be a better listener/reader and a better writer/speaker.

Tim
Yeah, upvote for that. When I went to university folk didn't study computers then become a programmer, they became computer scientists. Everyone else became a programmer.
Chris Needham
+1  A: 

The two most relevant to the workplace from my Software Engineering degree at the University of Sheffield were the Software Hut module in the 2nd Year, which involved over the course of a term in teams producing a software product for a real world client. There were three different clients I think, and teams competed against each other to produce the best system for them.

Then in the fourth year a third of the years marks came from running a software company, again for real world clients. Whilst not wholly like running an actual business, due to the IP restrictions on any products we did produce (as we were still students at the University, they owned the work), we did get involved in most aspects of running the company - bar any accounting/contract writing.

Sliff
+1  A: 

It all depends on what you want to program and what kinds of problems are you interested in.

Obviously the general combo of

  • Discrete Maths (your Logic, Graph theory, some number theory and recurrence)

  • Algorithm Design (learning various problem solving models, design paradigms, thinking about computer resources)

  • Software Engineering (managing software projects, working with existing components, working with pairs or in a group,version controls, patterns and so on) like this

  • Programming intensive courses(i took this course) that teach you general ideas on approaching a problem, gathering your thought before writing a single line of code, exposure to different programming paradigms

    will prepare you for most of the programming challenges.

After that it all depends on what domain you want to work on. Ask your advisor, seniors at your college and professors and talk to them about your goals and interests. They will advise you better than anybody here can.

However do not ignore critical thinking, writing classes. Take classes that let you present your ideas and prepare you for public speaking.

kunjaan
A: 

Better programmers right out of college? Until schools start teaching concepts like cohesion, coupling, good programming practices, version control, configuration management, modern development models - I don't think so. What I commonly see is self learners wanting to do the right thing learning on their own or if they are lucky get hired into an organization that preaches and practices good things.

Otávio Décio
+2  A: 

I think the void of academics should be filled by student organizations or independent student projects.

At my university we had the Association of Computing Machinery student chapter specifically for CS students and we also had a student organization dedicated to video game development. These orgs helped to teach the students about the "real world" by bringing in speakers from the industry and forced students to work with each other.

I would also recommend that students majoring in Computer Science minor in Business if they are interested in leading software groups or if students want become more technically adept they minor in Liberal Arts. I know it seems weird, but I did this and I've found that it actually teaches you how to think outside of a purely technical and mathematical perspective and how to apply human thinking to software development.

Jesse Dearing
A: 

I think the course I've taken I got the most out of is Data Structures and Algorithms. The knowledge is independent of the progress of technology, and it provides the basic tools used by programmers of every kind.

Lucas Lindström
A: 

A class we had required for us to build something as a community service project of sorts. This required us to use and learn the whole Software Engineering gambit.

None the less unless the teacher decides to put a few screwballs in the class whose goal is to try to make things as difficult as possible, a course like this will be greatly lacking...

SeanDowney
A: 

Data Structures and Algorithm course, during my undergrad, helps me alot at my work place

Rachel