I can totally follow this train and see where this can lead to Bad Things. That said, however, I must say that I’ve found tools like Cucumber, Aruba, and Geb very useful in my university classes.
In the simple case, tools like Cucumber and Aruba often great for writing executable specifications for class projects. This is somewhat similar to the goal of having the business team write the tests, but obviously I’m in the fortunate position of being a developer as well as the person writing the specs. It’s very nice for teaching, though, because I can specify what I want them to do without over-specifying how they do it. Unit tests will typically need to reflect all sorts of design decisions, and part of the point is often for them to work through the design, so it’s nice to have tests that both they and I can use to sanity check their solutions without tying us all down to a particular set of design choices.
In the more complex case, our students have often found these tools to be extremely useful for their own tests, especially when they’re struggling with a new problem domain and/or a new set of languages, tools, libraries, etc. In many ways a unit test requires the ability to envisions at least some of the structure of the solution; you have to be able to see where a unit will be. If they’re writing their first web app from scratch, using languages and libraries they’re just learning, it can be really hard to know what the first test might look like. So they tend not to write it, instead doing “spikes” to try to understand how the pieces work. These “spikes” go on and on, get bigger and bigger, and often become the project instead of being thrown away, and none of that development was supported by any sort of tests.
While it can be really difficult to envision units in a totally new space, hopefully they can understand use cases and user behavior. Tools like Geb allow them to specify what the tool should do without (yet) understanding what the insides will look like.
In many ways the two cases are quite similar: A.T./BDD lets us write tests without committing to design decisions yet. In the first I don’t want to dictate those decisions, and in the second they simply don’t yet know what those will look like yet, but either way we get to specify what is hopefully some useful and significant behavior right away without getting bogged down in those issues.
In a perfect world, they’d start writing unit tests for key pieces of internal logic as the design develops, especially for units whose behavior is complex enough that it’s hard to catch all the combinations through the user interface. That doesn’t always happen, but eventually the instability of the UI often drives teams to bring some of the testing from the UI into more stable areas of the code.
So, do I think every project should start with Cucumber tests? No, definitely not. But I do think they’re damn useful in certain circumstances and I’m quite glad to have them.
]]>StackSort connects to StackOverflow, searches for 'sort a list', and downloads and runs code snippets until the list is sorted.
Internet nerdom being fairly OCD, someone (Gregory Koberger) of course went and implemented this, and it works!
As Gregory says, this is potentially a security nightmare waiting to happen, so it’s not clear that you should actually run his code. Being a brave and foolish (and somewhat careful) soul, however, I’ve fallen on this sword so that you don’t have to, and I can confirm that it works. After trying several dozen StackOverflow pages (most of which yielded either “Could not extract a function to run” or “Contained potentially bad code”), it stumbled across a working version of Quicksort in JavaScript.
Ta Da!
The success of this approach, however, does suggest interesting things about how people approach certain kinds of problem solving these days. Where “old people” like me would have bought a book to learn something new, my students are much more prone to assemble a patchwork understanding from tons of Googling. While I think this often leads to a quite fragile and incomplete understanding of the topic at hand, it is often sufficient to get them through what is assigned. In other words, they’re very skilled at answering the question that was posed, which was itself often somewhat shallow because that’s what we all have time for. So while faculty would like to think that we’re creating experts (whatever that means) in certain topics, we rarely have the time to give them assignments and tasks that require a deep level of expertise.
In the land and time of books, we might have believed that everyone read and understood the 8 assigned chapters, but the assignments almost certainly didn’t strictly require that. In fact I’m willing to bet a whole lot skimming actually went on that was not so different from the Googling that happens now. The difference is that when I skimmed a book, there was a reasonably coherent thread connecting the dots that were touched on. “Skimming” the Internet, however, is a much less coherent experience. The authors, examples, and assumptions aren’t the same from search result to search result. Worse (in computing) the versions aren’t necessarily the same, so we often end up with inconsistent and downright contradictory results! A few years ago I taught a class that used Python 3, and it turned out that almost all Googling pointed us at Python 2 examples and answers, which lead to all manner of confusion amongst my students.
So call me old-fashioned, but I still like a book, even if it’s an e-book, when I’m learning something conceptually new, as I do really appreciate a coherent voice and structure. If I need to remind myself of a library function or piece of syntax, it’s to the Googles. If I’m learning something that’s very similar to something I already know, then I’m happy with on-line docs if they’re well written. If, however, I’m expanding my horizons in more significant ways, a book is still the thing.
]]>While our son was growing up, though, the idea of spending a summer away from my family really didn’t appeal. He’s now graduated from high school and is off in the world, so this has become a fairly realistic option. Consequently I’m talking to various friends, alums, and industry types in an effort to identify plausible opportunities.
I’m pretty flexible on this, but I’m definitely interested in doing development rather than R&D (the activity that my degrees and experience would tend to suggest). I’d probably prefer to be a member of an agile team rather than working primarily solo on a task. It would also be important that the job really just be a summer gig; my job here is more than enough to keep me busy, so I’m not looking for something that will bleed into the school year.
Anyone out there know of any opportunities that might make sense? Feel free to leave a comment or contact me directly (mcphee AT morris DOT umn DOT edu).
Many thanks!
P.S. In case you stumble here and have no idea who I am, a very brief synopsis: I’ve been programming since the late 70’s, and teaching computer science here at the University of Minnesota, Morris, since 1991. I have lots of experience with Java, also quite a lot of Ruby, Python, and Groovy. I’m useful with JavaScript and Grails, and have experience with Rails but it’s a little rusty. I was once quite competent at C and then C++, but haven’t used either in years. Most of my dissertation work (mid- to late- 80’s) was in Common LISP; more recently I’ve been teaching Scheme and Racket a lot, and also have some experience with Clojure, Erlang, and Haskell. I learn new languages, tools, and systems pretty quickly, as that is often required in my job. My primary research area has been evolutionary computation (EC), and I’ve led or assisted in the design and implementation of numerous EC systems over the years. I’m experienced in experimental design, data collection, and statistical analysis and data visualization. I’m an experienced writer and public speaker; my research is heavily cited and has won several best paper awards.
]]>It’s a true joy, and I’m really looking forward to being able to read the “finished” work. It’s a project oriented book, though, which means that to really learn from it we’re going to have to play along at home, programming, and experimenting, and analyzing. We’re all going to have to set aside some time for this when it does come out. But it’ll be worth it. And while the claim is that we’ll be learning about Generative Projects or Genetic Programming or whatever Bill decides to have GP stand for when he wraps this thing, we’re also going to learn a lot about software development and problem solving along the way, from someone who’s got a lot of great things to say on those important subjects. So we’d best buckle our seatbelts!
I do, however, have to take issue with a claim Bill makes in the introductory “About this book” section:
This is not a textbook. If your instructors try to use it as one, complain. If they argue, send them to me.
To be honest, it’s turning out a lot more like an anti-textbook. It will not improve your performance on tests. We’ll use “advanced” techniques before we discuss “basic” ones, ignore common practices to focus on more appropriate contingent solutions for specific problems, and may not even touch on techniques your instructors think you ought to know.
Remember, my goal is to support and extend your existing skills so you can productively explore further. Seek comprehensive knowledge and historical grounding in other books. They are full of it.
I can’t help but think he had me in mind when he wrote these lines, and I doubt he’ll be surprised to learn that I’m certainly seriously considering using it in my Evolutionary Computation and Artificial Intelligence course in the Spring. <snigger>
The issue, I suspect, is what one considers a “textbook” and what the point of such a thing is. Traditionally textbooks are big, fat things that provide a “coherent” overview of “everything you need to know about subject X”. I’ve got a bunch of these on my shelves with nice overviews of things like calculus and physics and chemistry. Old things, with a clear sense of what matters and what order it should be presented in.
In teaching computer science, however, things are typically much less clear. What’s “vital” in our field? What’s the “natural” or most pedagogically sensible order to present that material? There are lots of ideas out there, but hardly consensus. And that’s on the introductory material; my upper division electives usually focus on material where there’s even less agreement.
Starting in the late 90’s I started moving away from “traditional” textbooks when I could. I found that the most important part of most of my courses was process rather then content. Most computing textbooks I’ve seen are, unfortunately, much stronger on content than process. There are piles of books full of catalogues of algorithms, but they’re mostly presented like magic tricks, things Very Smart People dreamt up in some strange opium vision, inaccessible to the rest of us. The challenge in my experience is coming up with these visions, the process and the problem solving. So a book like Fowler’s wondrous Refactoring is far more educational in the long run, giving us skills for life instead of a box full of baubles.
The contrast between process and content has been made far more pronounced by the web and its many tools and collections. Young folks (and even this old guy) almost never reach for a book when they want to look something up; that’s what Google is for. The reference value of big encyclopedias of “facts” is greatly diminished when we can so easily find things on-line, but a well-written description of an important process is still a treasure.
Which brings us back to Bill’s book.
He claims it’s not a textbook because he doesn’t plan to cover “every” technique or concept or approach. He’s going to doing things in the “wrong” order. Foolishly, he’s not going to help improve our performance on tests, choosing to instead helping us develop skills that will help us for years to come.
Silly, silly man.
So, yeah, I do want to use Bill’s book in my class, and my students are more than welcome to complain to me or take it up with Bill. I doubt, however, that they will. The writing is opinionated and ornery and humble in all the right ways, and the emphasis on projects and problem solving are the sort of thing our students just eat up. I’m guessing that they’d happily line up behind something like this vs. a more traditional text.
As will I.
P.S. You should check out the book’s LeanPub site (https://leanpub.com/pragmaticGP) and sign up for notification. It’s a great way for people to help delude Bill into thinking that he’s not actually wasting his time.
Or something like that.
]]>It’s been interesting as we’ve visited a zillion colleges this summer, which schools are helping students learn to navigate the unknown, and which are turning out editors for textbook companies :)
]]>]]>Since President Obama’s announcement of the Educate to Innovate program in November 2009, an encouraging number of technology and media companies, non-profit organizations and government agencies have been working in concert to strengthen the nation’s approach to science education. But the reality is that the lion’s share of transformation must come from within: from school systems, in the case of K-12 education, and from the academy, in the case of higher education.
A position paper recently issued by the Nature Publishing Group illustrates this point in the context of higher education. A significant majority, 77 percent, of the 450 faculty surveyed for the paper consider their educational responsibilities to be equally as important as research responsibilities. Only 6 percent consider research more important than education. Yet when asked to appoint a hypothetical candidate to an open tenure position in their department, the majority chose a star researcher with poor teaching skills over both a star teacher with little research background and a candidate equally skilled, though not notable, in both teaching and research.
The ripple effects of this mindset in the academy are damaging to the goals of universities.

It’s an interesting study, and likely to spur a whole new slew of interest in on-line courses, but it’s really not clear what it means. I’m sure there are a zillion ways I could pull together data showing an education advantage of X over Y, for a zillion Xs and Ys, but one would have to be very careful in the interpretation. I’m willing to bet that most of my colleagues here at UMM would teach better in English than Chinese, and most faculty in China would teach more effectively in Chinese than English, but that hardly means one is a better teaching language than the other. Context is everything, and it’s not clear (at least in the survey study) what the contexts are.
A few possible issues:
Etc., etc., etc.
I think the question isn’t, and can’t ever be, whether on-line is better than the classroom. In the end it’s about finding a way for a particular instructor and a particular student (or group of students) to work well together, and that’s going to depend on an awful lot of things and almost certainly change over time as teachers, students, and the world changes. On-line education and classroom education augmented with on-line components are clearly going to be an important (and probably increasing) part of that, but there will probably always be circumstances where a group of people are better served by some face time than by an on-line experience.
This study also looks at courses as isolated experiences. At a residential university like ours, the courses are crucial, but hardly the whole picture. Students learn a ton from simply living together, eating, doing laundry, volunteering, going to the movies, dating, being in clubs, and generally making all sorts of vital transitions as they move from 18 to 22 (give or take). Look at the important differences between someone’s who’s 16 and someone who’s 26, and an awful lot of that has nothing do to with courses. A good university experience can play a critical role both in and beyond the classroom, and a heck of a lot of that is tied up in physical presence.
]]>
I’ve taught Refactoring several times and have a pretty good handle on that. Fuzzy Logic I’ve taught once before and am pretty comfortable with. The Systems course, however, is one I’ve never taught before and am still struggling with on a number of levels, including the textbook.
Any suggestions and ideas on any of these would most certainly be appreciated. I’ll say a little more about each course below the fold for those who want all the gory details.
Models of Computing Systems This is one of our three core courses (the others being Algorithms and Computability, and Software Design and Development), is a 5 credit course (4 hours of lecture and a 2 hour lab each week), and is intended to expose students to computing systems using a layer model that includes as major topics
I’m planning to use x86 assembly for the first item, and the sysadmin work will happen on Linux boxes. I’m planning (still in a vague way at the moment) to try to use computer security issues to motivate/illustrate a number of key concepts in this course. Things like file system and disk structure can be pretty abstract, for example, but I’m thinking that doing a lab where we see how those decisions lead to lots of “erased” data being recoverable might make it seem more “real” and significant.
I realize that no book is going to cover all these things, and on-line resources plus lecture can provide the necessary background for several of these. This course has typically using a “standard” OS book like Silberschatz, et al, but this is large and expensive and really only addresses one of the four topics. If anyone knows of a good book that would touch meaningfully on more than one of these areas, though, that would be really helpful.
Fuzzy logic This is a 2 credit elective course, and should provide a reasonable background in the theoretical definitions and concepts in fuzzy logic, as well as giving the students a chance to apply those ideas. (My current plan is to write robot race car drivers using fuzzy notions of concepts like fast, slow, near, and straight.)
I’m probably more interested in solid coverage of the theoretical material than the applications side. The students will benefit from a good introduction and reference on the mathematical material, and I can probably handle the motivation and application side in class pretty well.
When I last taught this (Spring, 2006) I used An Introduction to Fuzzy Logic for Practical Applications by Kazuo Tanaka, translated by T. Niimura. That book actually worked quite decently. There were some predictable translation issues, but nothing that we couldn’t manage.
Refactoring This is also a 2 credit elective course. I’ve taught this course several times, and I’m likely to again use a combination of Fowler’s Refactoring and Kerievsky’s Refactoring to Patterns. Fowler is the “standard” in the field; the first five chapters of his book are absolutely classic material on the realities of software development and should be read by pretty much anyone who aspires to write good software. Kerievsky’s book builds on Fowler and does a really nice job of demystifying design patterns, converting them from magical insights codified by geniuses into things you could discover on your own through careful refactoring. When I last taught it I think I had Kerievsky as the required text and Fowler as the optional book. Given that together they still add up to less than $100, I’m tempted to require them both. We have lots of copies of Fowler in the lab, though, so I might just require Kerievsky again. Ideas/thoughts on this would definitely be appreciated.
One of the problems we’ve run into in this course in the past has been attempting refactorings on code with limited automated testing. Without good tests you lose your courage to refactor mercilessly, or you have false courage and end up breaking things without realizing it until (sometimes much) later. With only 2 credits to work with, however, you don’t want to spend two weeks writing unit tests for a system before you can start refactoring it, especially when you don’t really understand what the units are and what they’re supposed to be doing. This time I’m planning to use BDD tools like Cucumber, RSpec, and JBehave this time to more cheaply write high level acceptance/functional tests that exercise the key parts of the system in meaningful ways without getting bogged down in a bunch of poorly understood unit tests. We’ll see how that goes.
Wrap-up
So, there they be. Any thoughts, ideas, or suggestions would be greatly appreciated, especially on the Models of Computing Systems course.
]]>
Timna Wyckoff (one of our biologists and mother of a kindergartener) arranged to have all the local kindergarten kids comes to the science building for 90 minutes to learn a little bit about science. They were divided up into groups of about twelve, and each group spent about 30 minutes at three of the six stations we’d set up.
I talked with them about their experience using computers at school (mostly “playing games”) and how the computer did things like draw pictures on the screen. (We determined that it wasn’t elves or fairies or tiny mice with little glasses and hats that took coffee breaks when you turned the computer off.) We then talked about how computers are machines, like their fridge or a car, and let them look inside a couple of old boxes destined for the scrap heap. This led to a bit on how computers are general purpose machines instead of single purpose machines (“Can you drive your fridge to the store?”), and how what the do is determined by the program they run. It turns out that computers are in fact machines specifically designed to follow lists of instructions, and programs are lists of instructions created by computer scientists that tell the computer how to do certain things (like draw dinosaurs on the screen). We then headed into a semi-tangential (but concrete for 5 and 6 year olds) discussion of recipes as a instructions, and people as machines for following those instructions. Finally, if and as time allowed (and it varied quite a bit across my three groups), they all got numbers, stood in a line, and pretended they were a computer running through the bubble sort algorithm. (Yeah, bubble sort. Don’t shoot me – it’s easy to run through with little kids.)
I spent a total of 90 minutes doing this three times, plus some setup at the beginning and tear down at the end, and I’m exhausted. If nothing else, this reinforced my belief that a good teacher of young kids is a real treasure. These are bright, enthusiastic kids, but they don’t always focus real well, and my short morning is enough to send me scurrying back to teaching adults. (To be honest, my students don’t always focus well, but they’re much less likely to distract everyone around them in the process.)
This was my first time doing this, and my little script was an amalgam of lots of ideas from KK, Timna, and WeatherGrrrl, and various students and alum responding to my request for ideas on Twitter. Many thanks to all of them for their ideas and feedback!
]]>
All OK? You’ve been soooooo quiet.
Many, many thanks for asking. It’s nice to be missed :-).
And yes, all the big things are OK, even if some of the details are a little stressful at the moment.
My wife and son are still amazing people, UMM is still home to some incredibly cool folks at all levels, and institutional corn dogs at the Student Activities Fair remain one of my favorite start-of-the-school-year rituals.
On the other hand, I’m still scrambling with some school stuff like syllabi and planning — I’m seriously crap at almost all of the mechanics of teaching, which makes my career choice unfortunate at times. (At least I like my job, though, which puts me way ahead of lots of folks.)
Computer Science at UMM is also really swamped because a search failed and we’ve got 3 faculty doing what 5 faculty (actually 6 people, two of which were half time) were doing four months ago. We canceled a couple of things, and moved a few other things around, so I think it will all work out fine, but it’s a challenge.
And on top of that, it turns out that I have arthritis in my neck that is causing my vertebrae to poke at my spinal cord in ways that express themselves annoyingly in my left arm. I got a steroid shot in my neck last week up in Fergus Falls that was (I think) helping. Unfortunately I pulled an almost-all-nighter night before last doing course prep, and may have undone much of that progress. Damn. It would be useful if I remembered that I’m no longer 18 at key moments… On the neat side, though, I’ve got the MRI images, so I have lots of cool pictures of my spine which I can give to Len Keeler‘s physics course on medical imaging. So there will be a bunch of physics students marveling at what a complete mess my back is, and getting college credit for their trouble!
So in short, everything big is all still fine. Some of the details are a pain, however, and that tends to draw energy from all the “optional” pieces of my life (blogging, Flickr, people who aren’t standing in my office door looking confused or unhappy or just glad to see me again). Hence a fair amount of Twitter, but very little that moves any closer to the paragraph form.
Sorry, and thanks for asking. Hopefully things will settle down in the next week or two. If you can’t find me in my office, I might be taking a nap on the couch in the computer science lounge.
]]>