views:

468

answers:

8

I teach a one semester University course in systems analysis and design. Topics include design patterns, UML, OOP, software development lifecycles, and the history, benefits and drawbacks of various methodologies (such as Agile/SCRUM/BDUF/Waterfall.)

Students who enter the course should have some exposure to programming, but in reality I've seen everything from people who are highly fluent in one or two modern languages to those who can barely pass the FizzBuzz test.

My question is two-fold: how much programming experience do you think students need before exposure to these topics (or do you think they should learn them before they learn to code), and second, what do you feel would be fair and appropriate ways to pre-test them at the start of the class, knowing that there is no consistent language or platform in their background?

+4  A: 

I think students learn best when they can put into practice the material that they are learning. To that end, I think the best course would include some project (or mini-projects) that would involve coding. Typically, I would expect this to be taught to upper-level undergraduates and graduate students. By this time, students should have had some programming classes, some discrete math, and a basic data structures course. While not technically pre-requisites (except for the programming class) if you could require these others you have a better chance of getting students with the proper background.

As far as a pre-test, I would suggest having some simple programming projects to illustrate design patterns/OOP early in the course. I'd be stricter, perhaps, with these projects than you might be tempted to be for assignments early in the class. Be up front that programming skill is required for the course and grade that way. Let people know, through your grading, that the requirement is serious.

This may sound harsh, but I've seen too many students make it through courses leaning on their project partners because they aren't able to keep up with the coding required. I don't think they've really gotten much out of the course because they didn't have a chance to internalize the knowledge through experience.

tvanfosson
A: 

when i was a student about 2 years ago. this kind of topics where better understood in the last courses. in order to grasp all this topics i think students must have at least 3 Programming courses (Structure Programming,OOP 1,OOP 2) a software engineering course will be great too and also some DB Background. try to encourage students to start a project from scratch (requirements gathering - Release) there is nothing better than practice-practice-practice

Oscar Cabrero
+1  A: 

I've been in the same position, and I'm convinced that students ought to have significant programming experience, and some mathematical sophistication as well. At least a good, serious programming course, a data structures course, and maybe a computer organization or systems programming course.

Charlie Martin
+3  A: 

You can't teach students the solution to a problem they've never had. If you want students to be able to do something with this material, they have to have substantial programming experience, so that they have some inkling of the problems all these ideas are intended to solve.

Ask yourself why are you teaching this material and how do you want your students to have changed by the end of the term. If all you want is for them to be able to explain the concepts at the whiteboard, the amount of programming experience is less important. But the real goals depend on you: the more carefully you articulate your goals for the class, the more likely you are to achieve them. What do you hope to accomplish?

Norman Ramsey
Agree. It doesn't seem to me new programmers would know why they're even taking the course... Scrum? Patterns? How are these things useful? They'd probably think it's more ivory tower crap to learn, regurgitate, and forget.
Robert C. Barth
A: 

I haven't had a formal computer science education, so I can't speak from that perspective, but I do feel that it takes a significant amount of programming experience to appreciate concepts such as design patterns.

Having gone through the hobby programming phases to taking programming seriously, I've found through experience that proper design makes highly maintainable code. I've experienced going from the spaghetti code of GOTOs in BASIC to utilizing design patterns and MVC methodologies and come to seriously appreciate coding based on good design.

Without the appropriate level of experience, the students will only see the course as "oh, so there are things like design patterns, that's nice" but it won't really strike home.

I also second post by tvanfosson and feel that having projects be an integral part of the course would really demonstrate how object-oriented programming and design patterns can be utilized to write well-designed, well-maintainable, reusable code.

coobird
A: 

Coobird and Tvan are absolutely correct about needing a lot of time at programming. I will add that in a learning environment it is important to have both immediate feedback (other than getting the code to run) and a variety of situation to handle.

Nothing like eating your own dog food and being forced to clean up your own mess to get the point across.

RS Conley
+1  A: 

I would say that it depends on your goals/purpose for the course, the target audience, and the outcomes.

On the face of it, you don't need ANY programming background to get a great deal out of such a course. After all, the methodologies and techniques are really about COMMUNICATION, not programming specifically. In fact, properly done, design can eliminate a whole lot of needless programming - even using Agile methodologies (that's why they are told to communicate with the client FIRST and FREQUENTLY).

Besides, properly targeted, this course could be a cross-over for many other programs, faculties and certifications; such as the various business degrees, management courses, etc. Wouldn't it be nice to have someone in "management" who had taken such a course and actually understood the need for proper client communication, instead of just focusing on what marketing wanted this week combined with the ususal too-short deadlines?

So I encourage you to think beyond "programmers" as the target audience for such a course. Think of this as a COMMUNICATION course first, and go from there.

Best wishes.

Cheers,

-Richard

Huntrods
This is close to the model I have used in previous semesters, and while the students seemed to dramatically improve their communication skills, not many seem to know how to actually be able to apply these concepts in software development.
Robby Slaughter
A: 

I think there may be a basic computer programming course that could be given before such a course that introduces various basic ideas of modern programming, e.g. what is an IDE, what is an algorithm, what are basic ways to measure complexities, etc. where there are 2 choices given to the student: Use what the course suggests for a language, or pick your own from this list that TA's and others would know enough about to determine if the solution is acceptable or not. One issue to consider is whether or not various exotic languages like Logo, Lisp, Modula-3 or Fortran would be OK or not. The idea of understanding how to use various tools would be the focus more so than using a specific programming language that may not be used outside of academia.

In some respects the final exam for such a course would act as a way to determine whether or not one would be able to skip such a course. The main idea is to have some basics within a specific realm pinned down, not unlike how in elementary school an Arabic number system in base 10 with the operations of add, subtract, multiply and divide and place value, like tens, hundreds, etc. is the basics of Mathematics as opposed to having learned any of these as one's introduction to Mathematics, which are all possible starting points:

  1. Trigonometry using a hexadecimal number base defining functions such as sine, secant, tangent as well as the co- of each and the inverse of all of those and the graphs of such functions.

  2. Graph theory consisting of paths, breadth first search, depth first search, and minimum weight spanning trees.

  3. Derivatives, integrals, and partial differential equations over the Complex Number system or some higher dimensional spaces like N x N matrices of real numbers.

  4. Probability and Statistical theory including arithmetic and geometric mean, median, mode as well as the idea of least squares and linear regression with just enough Algebra so it all makes sense.

  5. Finite Mathematics such as permutations, combinations, enumeration and asymptotes.

  6. Modular arithmetic and floating point number systems.

  7. Geometry of various shapes examining types of angles and parallel sides as ways to categorize various shapes. Also in here are the formulas for perimeter, area, surface area and volume for various shapes.

  8. Sequences and series with the idea of limits and infinity as something special to bring to the class along with capital sigma for sums and pi for products.

  9. Boolean algebra involving various logic gates such as AND, OR, XOR, and NOT in the form of truth tables.

  10. Linear Algebra using only Matrices and linear transformations.

  11. Logic problems similar to the board game Clue.

  12. Pure Mathematics involving proofs of various Theorems and using a syntax full of abbreviations including the following: <=> as if and only if, => implies, backwards E for existence, backwards E followed by an exclamation point for there exists and is unique, upside down A as a "For all" or "For each" qualifier, three dots in one arrangement for "Therefore" and another for "Since," as well as ideas of necessary conditions compared to sufficient conditions as well as proof by Induction.

  13. Algebraic concepts like groups, rings and fields. Here would also have the notion of inverses, associative and commutative operations.

Picture if one had a classroom of 30 students, 10 of which have a basic North American education and the other 20 each learned one of the 12 above parts of Mathematics but not necessarily the others. Could terms like "graph" be cases where more than one branch use the term with a very different meaning, e.g. graph of a function in the (x,y) plane versus a set of vertices and edges as a graph or net as in the 2-D representation of how to build various 3-D shapes? That would be a similar situation I believe.

JB King