Refactoring

One of my laments on teaching computer science is that students are rarely taught and given the chance to develop good programming practices. There's usually not enough time. Beginners work on small "toys" which don't lend themselves to good software development practices and later on, there's so much other material like algorithms, data structures etc. to teach and learn that programming practices usually amount to lines like:

"Make sure to comment your code.."

"Indent properly…"

"Use functions…"

"It's important to test your code…"

so when I see an opportunity to use a simple example to drive home a good practice, I try to jump on it.

Drawing shapes with text is a typical early project. I've seen it in text books and online and have been doing it for years. I recall doing it back in the 80s in Fortran IV when the programs we wrote were on punch cards, run overnight on an IBM 1130, and printouts picked up the next day.

It's a nice use of nested loops. The students will write functions to create assorted shapes out of asterisks like rectangles and triangles. Typical solutions look like this:

#include <iostream>


std::string box(int h, int w){
std::string r = "";
  for (int i = 0; i < h; ++i) {
    for (int j = 0; j < w; j++) {
      r = r + "*";
    }
    r = r + "\n";
  }
  return r;
}


std::string tri(int h){
std::string r = "";
  for (int i = 0; i < h; ++i) {
    for (int j = 0; j < i; j++) {
      r = r + "*";
    }
    r = r + "\n";
  }
  return r;
}

Which results in shapes like these:


| ****            |    | *               |
| ****            |    | **              |
| ****            |    | ***             |
| ****            |    | ****            |
| ****            |    |                 |
|                 |    |                 |
|                 |    |                 |
| *************** |    | *               |
| *************** |    | **              |
| *************** |    | ***             |
| *************** |    | ****            |
| *************** |    | *****           |
| *************** |    | ******          |
| *************** |    | *******         |

Then there will be more interesting shapes including things like:


   *       *            *****
  **      ***           *   *            and more
 ***     *****          *   *
****      ***           *****
           *   

This is a great time to talk about refactoring. All of the shape drawing functions follow the same pattern - there's an outer loop for the height and then one or more inner loops to draw each line. We can factor out the inner loops in to a separate line() function.

#include <iostream>


std::string box(int h, int w){
  std::string r = "";
  for (int i = 0; i < h; ++i) {
    for (int j = 0; j < w; j++) {     //
      r = r + "*";                    // <----- This can be factored out
    }                                 //
    r = r + "\n";
  }
  return r;
}


std::string tri(int h){
  std::string r = "";
  for (int i = 0; i < h; ++i) {
    for (int j = 0; j < i; j++) {    //
      r = r + "*";                   // <---------------- along with this
    }                               //
    r = r + "\n";
  }
  return r;
}

It's just like factoring in algebra:

(RectangleOuterLoop × Line) + (TriangleOuterLoop × Line) ⇒ Line (Rectangleouterloop × TriangleOuterloop)

We end up with:

#include <iostream>

std::string line(int w, std::string c){
  std::string r = "";
  for (int i = 0; i < w; ++i) {
    r = r + c;
  }
  return r;
}

std::string box(int h, int w){
  std::string r = "";
  for (int i = 0; i < h; ++i) {
    r = r + line(w,"*") + "\n";
  }
  return r;
}


std::string tri(int h){
  std::string r = "";
  for (int i = 0; i < h; ++i) {
    r = r + line(i,"*") + "\n";
  }
  return r;
}

It's simpler, cleaner, and also can lead us to thinking about the "harder" shapes in an interesting way. Instead of looking at the right justified triangle as a triangle, we can think of each level as two lines - one of spaces (shown here as dashes) followed by a line of stars:

----*       *
---**      **
--***     ***
-****    ****
*****   *****

Noticing that for a height of 5, the dashed lines count down in length 4,3,2,1,0 and the star lines count up 1,2,3,4,5, we get:

std::string tri2(int h){
  std::string r = "";
  for (int i = 0; i < h; ++i) {
    r = r + line(h-i-1,"-") + line(i+1,"*") + "\n";
  }
  return r;
}

int main()
{
  std::string r = tri2(5);
  std::cout << r << std::endl;
  return 0;
}

Here we have typical early CS assignment that really lends itself to talking about structuring programs and refactoring. Where else can we inject good programming practices in ways that make sense early on?

Testing Part 2

A few weeks ago I wrote about introducing testing in CS classes, specifically using a testing framework. In that post I talked about the plan but now I can talk about the results.

My class interleaves with Hunter's CSCI 13500 - Software Analysis and Design I class. One day each week, my students have complete a hands on lab focusing on whatever is being covered in the 13500 class. I decided to use one of those labs as a first foray into testing.

I had each student use a classmates lab solution. They were to examine their solution and write a test suite for the lab using the doctest C++ testing framework.

I think this proved to be a valuable exercise.

Partway into the exercise, a few students independently had an issue - they couldn't even build the tests.

The code looked right. Something like this:

TEST_CASE("Lab 4 Tests"){
  CHECK(getValue("3/12/2016")==54.3);
}

It looked like at textbook example of a test case but it wouldn't even compile.

In all cases, the original student code compiled and ran and gave the correct result. All the students had code similar to this:

std::cout << "Testing getValue for 3/12/2016: " << getValue("3/12/2016") << std::endl;

This stumped everyone for a while - why wouldn't the test even compile.

The answer was "data types." The lab specification required that getValue was supposed to return a double but in all the problem cases, the student returned a std::string. The lab appeared to work since std::cout handles strings as well as numeric data types but once they put it in to a test case that actually checked types the problem was apparent and easy to fix.

As it turns out, I was pretty excited about this – even before finishign the tests, the act of writing tests revealed a problem. This is a good thing.

From there, it was pretty easy for students to finish writing the tests for their classmates labs.

Fast forward a week. This was the first lab where I required the students to submit their own test suite as part of their lab. This didn't seem to slow anyone down by an appreciable and time will tell if this leads to better development practices but it certainly made my life easier. I was able to quickly move from repo to repo and type:

make tests
./tests -s
... watch the tests run
make
./main
--- watch the program run

Easy peasy.

Not only did it make it faster for me, it also gave me insights into their programs by seeing their decisions in terms of test writing.

Is it a win?

At the very worst, they're learning an industry practice and at best, it's going to help them improve as software engineers. Add on the fact that it's making my life as a teacher easier both in terms of understanding the students work and in terms of speed of evaluation. Sounds like a win to me.

On Prestigious Competitons And High Schools

The ACM recently announced this year's winners of the Cutler-Bell Prize in High School Computing. Over on his blog, Alfred Thompson noted that the winners were either from independent or magnet public schools. Alfred also noted that most of the winners of prestigious science competitions like the Regeneron Science Talent Search (nee Intel, nee Westinghouse) were from public magnet schools. In his post, Alfred ruminates on this and wonders "how to we add the flexibility and support to more students at more schools?"

As someone who spent over 25 years at Stuyvesant, arguably the granddaddy of these public magnet schools, I wanted to share some thoughts. I can only share my experiences from Stuy along with what I know from a few other schools but I still hope this is worth a read.

The Regeneron competitions under it's various names is the oldest and most established of these competition so it's pretty easy to get some data. Stuy is at or near the top of the list in terms of Regeneron finalists and semi finalists. The Wikipediapage lists Stuy as second to Montgomery Blair with 22 finalists to 40 but the data only goes back to 1999. I personally know of at least 7 more finalists from my early years at Stuy, 4 more from the early 90s, 8 more listed under the page's "notable" entries and who kows how many from the 80s and earlier.

Stuy had a strong run of finalists in the early 90's and the early 2000's but there has been a fall off in recent years.

Let's look at what makes Stuy "special" and then at the fall off.

In terms of money, Stuy gets a basic budget similar to other NYC public schools plus some extra due to the extra graduation requirements (other schools get extra money for an assortment of reasons). I seem to recall that the Parents Association raises somewhere in the low to mid six figures and the Alumni Association has been historically dysfunctional as a fundraising body.

So, it's not money.

Flexible scheduling? That's something that Alfred mentioned. Stuy kids have super packed programs. Some kids take 10 classes a day with no lunch so that's not it either.

Teachers? Stuy gets its teachers the same way as other public schools and just like other public schools they have some terrific teachers and some absolute disasters. Stuy also gets a slice of a particular class of teacher that starts their career at Stuy, never learns to teach because the kids figure it out but thinks they're gods gift to teaching.

So, no, it's not the teachers, at least not on the whole.

So, what does Stuy do?

It collects talent and this is the same thing that the other magnet schools and the elite private schools do as well. Get a bunch of bright, hard working, motivated kids together and good things happen. It gets high achieving students from a combination of entrance exam, reputation, and location 1.

I'm not arguing against this – I think there is a need for public magnet schools like Stuy but I think it's important to recognize that this is a major contributor to competition results and doesn't necessarily say anything about the school in terms of leadership or instruction.

It's similar to a college coach who gets the best recruits. Are they really a great coach? Can they develop talent or are they just getting the best talent and getting out of the way. Who's the better coach? The one who gets all the 5 star recruits every years and frequently wins it all or the coach who gets 3 star recruits, doesn't win as much but develops those 3 stars to a point where they can compete against the 5 star programs.

That's the starting point but then there's the targeting of the top prospects. Stuy had a run of finalists during the early 2000s. At the time, a friend of mine ran the math research program. His strategy? He would scour the school for the kids most likely to win the competition, get those kids into his class, and hook them up with professors with the most promising project potential. It worked more often than not. Contrast that to what I did when I ran our CS research program. I didn't take the program seriously for a variety of reasons but my job was to give EVERY kid in my class the opportunity to explore some aspect of CS. I had a few semi-finalists which is neither here nor there but never the stream of winners that my friend had.

Looking back to Stuy's earlier success, we had a Bio Chair who ran a similar program. I knew people in that program from when I was a student. The top talent was recruited and nurtured, the rest, pretty much ignored. Makes a school look good but not really the hallmark of a great school

Other schools had a similar strategy. Back in the '80s Cardozo - a neighborhood high school in Bayside Queens had a great run of Westinghouse results but that's because the science chair at the time had a similar program - rope in the top talent early (sophomore year) and nurture them. After a while the school got a reputation and would then attract more "science talent."

Stuy's had a falloff in finalists in recent years and I believe that's due to not having anyone focusing on recruiting kids specifically for results. Personally, I think this is a good thing but others disagree. A school with one finalist is perceived to be better than a school that gives a great research experience to every student but produces no finalists. In recent years, there's been talk of "what can we do to get more winners again." I think that's a shame, the conversation should always be "what can we do to improve the educational experience we offer all of our students."

None of this is to take away from any of the winners of any of these competitions. All the finalists and winners I've known have been exceptional intellects and top people in their fields. This is just a commentary on what role a school does, should, and shouldn't play.

In my early years at Stuy, I worked with our top kids on CS competitions, The kids would place very well in the USACO competitions throughout the year. One year we entered the ACSL and I realized that I had a choice - focus on the top handful of kids to make a winning team that could compete for the title or focus on all the kids but not expect that great single result. I realized that the top kids would probably be alright without that extra attention.

I still think I did right by those kids but that realization also led me to design my intro class, hack required CS into Stuy and probably end up positively affecting far more students than if I just focused on the top percent of a percent.

Footnotes:

1
That said, students have also been drawn to Stuy for the CS program which is fairly unique and also for a couple of specific math teachers.

Using Emacs 46 Auto Yasnippets

The other day I discovered auto-yasnippet, another great package by Oleh Krehel or abo-abo.

It looks like it's going to be a great way to solve a particular problem that come up now and again.

There are plenty of times when I want to create a number of similar but slightly different blocks of text. The example on the project site is:

count_of_red = get_total("red");
count_of_blue = get_total("blue");
count_of_green = get_total("green");

You could use multiple cursors, a macro, or other methods to put in the common text but you still have to deal with the parts of each line that are unique, the red, green, and blue.

You could use a yasnippet but it's unlikely that you'll have a snippet for every occasion. This is where auto-yasnippet comes in. You would write the first line but add a tilda as a placeholder:

count_of~red = get_total("~red")

and then invoke aya-create. This will get rid of the tildas and create the auto-snippet. Then when you run aya-expand it will put in the snippet with the tilda locations as placeholders.

Very cool.

Check out the video:

Sigcse2018 Making theory more acccesible

Next up from SIGCSE 2018 is John MacCormick's session on Strategies for Baing the CS Theory Course on Non-decision Problems

MacCormicks's stance is that CS theory is tough the first time around and using non-decision problems is a viable approach to make theory more accessible to beginners. As MacCormick said in his paper:

… a decision problem may ask the yes/no question, "Does this graph have a Hamilton cycle?" The corresponding non-decision problem is, "Please give me a Hamilton cycle of this graph if it has one."

This leads to writing programs to explore concepts in CS theory rather than just living in the world of proof.

MacCormick goes on to say that:

For this audience, the key advantage of non-decision problems is that they are more realistic: they match the previous programming and algorithms experience of undergraduates more closely.

I love the idea. Writing a program can make an abstract problem more concrete and can lead to better understanding for those of us who are less math inclined.

My next thought was that this shouldn't just be a change implemented in theory courses. Some of these ideas should move down to more introductory CS classes. Not the hardcore stuff but light introductions to the topics so that we can layer the learning. If we introduce some of these concepts in CS 1 classes then when they get to the theory class it won't be the students first rodeo.

I've had success with this when teaching recursion early. I've also done it with other concepts. When we teach the Towers of Hanoi, yes, it's a nice recursion problem but really it's to get the students thinking about run time and a bit of proof. likewise, when we do a maze solver in NetLogo we're alluding to dynamic programming, search, and path finding.

I don't have too much more to say on this topic right now. I'm not enough of a theory guy to sensibly design these experiences. The good news is that MacCormick has written an soon to be released book on the subject. I signed up for a reviewer copy at SIGCSE and look forward to receiving a copy. Once I do I hope to be able to find some gems that I can work into CS 1 experiences.

Using Emacs 45 - Company or Autocomplete

This is a good time to be an Emacs user. In addition to all of the great packages and tools being developed there seem to be more people regularly blogging and making videos about Emacs than ever before.

Planet Emacsen aggregates a ton of Emcas blogs and Emacs Legend Sacha Chua posts what's going on in emacs every week on her blog.

on the video front, uncle dave has recently joined the ranks of emacs video producers. sometimes we'll cover the same topic. dave made a video on swiper the other week and i made one a year ago. the other week we both made videos on mpd almost on the same day but dave focussed on emms and i focussed on simple-mpc. i think this is great because it gives different perspectives.

today, i watched dave's video on company mode for auto completion. I've always used autocomplete mode. I thought it would be a good time for me to see how the other half lived.

You can find my configurations up on GitHub (https://github.com/zamansky/using-emacs). The master branch is using autocomplete and the company-test branch for company. I've also pulled out the relevant code and am placing it down under the video.

Here's what I've found so far:

Company config (so far):

(use-package company
:ensure t
:config
(setq company-idle-delay 0)
(setq company-minimum-prefix-length 3)
(global-company-mode t))

(use-package company-irony
:ensure t
:config 
(add-to-list 'company-backends 'company-irony))

(use-package irony
:ensure t
:config
(add-hook 'c++-mode-hook 'irony-mode)
(add-hook 'c-mode-hook 'irony-mode)
(add-hook 'irony-mode-hook 'irony-cdb-autosetup-compile-options))

(use-package irony-eldoc
:ensure t
:config
(add-hook 'irony-mode-hook #'irony-eldoc))

(use-package company-jedi
    :ensure t
    :config
    (add-hook 'python-mode-hook 'jedi:setup))

(defun my/python-mode-hook ()
  (add-to-list 'company-backends 'company-jedi))

(add-hook 'python-mode-hook 'my/python-mode-hook)

Autocomplete config

(use-package auto-complete
:ensure t
:init
(progn
  (ac-config-default)
  (global-auto-complete-mode t)
  ))

(setq py-python-command "python3")
(setq python-shell-interpreter "python3")

  (use-package jedi
    :ensure t
    :init
    (add-hook 'python-mode-hook 'jedi:setup)
    (add-hook 'python-mode-hook 'jedi:ac-setup))

How my views on education research were shaped

After reading a couple of comments on my last post where I talked a bit about practitioners vs researchers I thought I'd expand and expound a bit.

While there are education researchers that I very much respect, overall, I'm skeptical of education research. Note that I'm not talking specifically about CS Ed research but rather education research in general.

Let's go back to the beginning. I entered teaching from industry. Goldman Sachs to be specific. I started in a shortage area - math and barely had the credentials to do so. The transcript evaluator at the DOE counted my Algorithms and Numerical Methods courses as Math courses to get me over the credit hump.

I had zero ed courses under my belt and was thrown into the fire. Fortunately, I landed in a school, Seward Park High School, with a very supportive faculty. I wouldn't have survived my first year without Mike G, Bruce B, Jonathan G, and many others.

Then, I had to start taking education credits to make my license permanent. Some classes were taught by professors some by adjuncts. The adjuncts were invariably experienced teachers and the professors were research faculty. In many classes, I had to read the latest research.

I found that what "the research" told us to do was contrary to what some of the best teachers did in practice. I kept hearing about the "right" way to teach but it frequently didn't jive with reality. When the true way worked, circumstances were right and the technique aligned with the teacher's natural tendencies. When it didn't, why not? Many reasons.

  • lack of prep time.
  • too many students (per class, per day, per term)
  • different populations than the one researched
  • factors the researcher didn't include (and there are tons of them)
  • teachers with different personalities and skill sets

and each of the above points opens up to scores of specifics.

This theme continued throughout my career. I'd ask teachers in other subject areas about the current state of the art research. What was the current trends in their fields. Generally the best teachers would summarize what was going on and then either say that it didn't work for them or that if it did, they didn't take it seriously because in five or ten years "the research" would tell them to do something different and then they would all of a sudden be bad teachers.

This was another point. The right way to do it has changed over and over during my career.

Then there's the reproducibility problem. Apparently it's pretty bad in education research. I mentioned in my earlier post that when a researched does it once on a small group it's research but when a teacher did it over and over it's an anecdote.

When I was young I would listen to a master teacher tell me about how he set up some experience - the one I'm remembering now is an experiential / discovery lesson on triangle geometry. He'd talk about all the hard work that went into prepping his class for this type of lesson as well as the prep time for the lesson itself. He told me how he did it four years ago and it was great but then the year after it fell flat and how he changed it for the next year. How it worked in third period but not seventh and why he thought it played out the way it did. That's a lot more reproduction than most 'research' actually gets and this is what a master teacher does all the time.

Finally, I got tired of hearing how to do it by people who don't actually have to. If you're going to talk the talk, you should walk the walk. As a side, this problem is really bad with "thought leaders."

All this sounds like I'm really down on education research or at least the overarching system. I probably am but there are many education researchers doing great work and I respect them immensely.

They know they don't have a magic bullet:

This is what I tried with this population at this time and this is what happened. You might want to try it or a variation on it.

That's a far cry from "here's how to teach"

The researchers who acknowledge that their experience as college researchers or even teaching faculty are different from a k12 teacher and that no matter how hard they try to work out all the variables they can only ever account for a tiny fraction of them.

The key is that they're adding another drop into the bucket of knowledge. Over time it adds up. I have great respect for everyone doing this.

These researchers have to keep prodding us teachers to re-evaluate our practice and then either take or incorporate the research or reject it after determining if it would be good or not for our population. At the same time, it's up to practitioners to keep pushing back against magic bullet research and the one true way.

We all have a role to play in this game.

Sigcse2018 - Code Tracing

Next up from SIGCSE is An Explicit Strategy to Scaffold Novice Program Tracing by Benjamin Xie, Greg Nelson and Andy Ko, presented by Benjamin Xie.

The core of Xie's presentation was that tracing through code is a good thing and that spending a short amount of time teaching code tracing can lead to improved student outcomes.

The idea is simple. Walk through the code as though you were the computer running your program. Xie suggested that students frequently struggle with code tracing. They have a hard time keeping track of variables, they try to work entirely in their head and being novices, they don't have any good way of representing overall program state. Personally, I also think there's a resistance these days to doing thing by hand. Xie noted that students can trace through their programs using online tools such as debuggers with steppers but doing so is a passive process. The student just clicks next over and over again. They aren't actively engaged in the code tracing.

That last point is a very important one. That passive clicking through a stepper seems similar to me to students ignoring compiler warnings or students using robust auto completion or snippets which I believe retards their learning of fundamental constructs.

Xie shared a simple directed strategy to enable students to "embody the computer:"

  1. Read question: Understand what you are being asked to do. At the end of the problem instructions, write a check mark.
  2. Find where the program begins executing. At the start of that line, draw an arrow.
  3. Execute each line according to the rules of Java.
    1. From the syntax, determine the rule for each part of the line.
    2. Follow the rules.
    3. Update memory table(s).
    4. Find the code for the next part.
    5. Repeat until the program terminates.

When tracing through the code, a participant creates a memory table with each method call…

In additionn to the strategy, Xie produced a simple paper handout on which students could write down variable values and easily organize and store the computers state as they traced through a program.

Xie noted that just a few minutes of instruction to give the kids a concrete method of code tracing can provide big postitive returns.

The presentation was terrific and all true and I'm sure of tremendous value to anyone in the audience not familiar with code tracing but it was also the presentation that led me to compose this tweet:

While Xie's presentation was terrific, code tracing and teachers showing explicit code tracing strategies to kids is nothing new. I remember being taught about this back in the 80s. We called it a "desk check" back then. While it's true that maybe this was explicitly taught because we were using punch cards and our programs were run overnight, it was also taught to me by math teachers with very limited CS knowledge. It's also a practice that appears to be pretty common among High School CS teachers even when their content knowledge is spotty. We also frequently employ things like state diagrams, cons cell diagrams, and other techniques to capture state and assist in program tracing.

This seemed to me to be a great example of something that in my experience is a not uncommon technique for high school CS teachers but maybe isn't used as widely at the college level (?).

The other thing this made me think about was the divide between practitioners and researchers. I think everyone knows which camp I'm in. Andy Ko, Benji Xie's advisor and co-author mentioned this in his SIGCSE summary. When I read the actual paper, it notes that they basically worked with 24 students and looked at the results. So, that's research. On the other hand, when I share a takeaway from looking at my 150 kids a year whom I met five days a week and look at this over decades, it's just an anecdote. Hmmmm.

One other side point is that in Andy's summary he notes his perception that SIGCSE is largely a teacher's conference as opposed to other conferences he goes to which he says are more researcher's conferences. I've only been to two SIGCSE's but my teacher friends tell me that they feel that SIGCSE is more of a researcher's conference and CSTA is more of a teacher's conference. I guess it's all a matter of perspective and frame of reference. Also possibly because I think of teacher as K12 teachers as teachers and professors as profressors be they research or teaching faculty.

Finally ,given all of this, was the talk and paper of value? Tremendously so. I don't think it's a new technique and I think it's fairly well disseminated in the K12 space but that said, it's a good technique and it will be new to some. It's also hard to get students these days to meticulously do anything on paper and sharing a successful practice is always of great value. Finally, it left me thinking about extending online environments such as Thonny to support restricted code tracing where the students would have to enter the state of all changed variables in a given line before the stepper would move to the next one.

I very much enjoyed this SIGCSE session. You can read the paper linked at the top if you have access to the ACM Digital Library. If not, you can read Benji Xi's medium post here.

Using Emacs 44 - An org-mode workflow for application processing

One of my titles at Hunter College is Director of the Daedalus CS Honors program. It's something like a Hunter specific, CS specific version of the CUNY Macaulay Honors program.

Hunter gives all its students the ability to get a great computer science education at a fraction of the cost of a private institution and if you're a Daedalus scholar you also get a scholarship, a laptop, special classes (with me :-) ), activities and more. Just the other day we visited Samsung Next accelerator and earlier in the year we made our annual visit to Catskills Conf, arguably my favorite event of the year.

When deciding on which students to recommend for acceptance, I try to glean as much information as I can about each applicant. When I feel there's not enough information, I've been known to reach out to recommenders and other sources for more. But first I go through the applications. For each student, I'm provided with a pdf file with a bunch of data and also an entry in an internal Hunter online form with even more.

For the first cohort, this wasn't a big deal. I hadn't even started at Hunter when the applications closed so there was no outreach. Everything was after the fact so there were very few students to evaluate.

Last year, I was able to do some outreach and we had around 60 or so applications for a little over 20 spots.

This year, there are well over 100 applicants (and we're looking to grow the program by a large number of students). All of a sudden, it wasn't so easy to navigate all the pdf files.

Emacs to the rescue. Using a combination of org-mod, pdf-tools, and org-pdfview I've come up with a workflow that I very much like.

Take a look and let me know what you think:

Sigcse2018 Bootstrapworld on Creativity in CS classes

I really didn't know what to expect at the Creativity, Customization, and Ownership: Game Design in Bootstrap: Algebra session. I've been a big fan of Bootstrep for years and looking at the authors, Emmanuel Schanzer's been a freind forever. I've never met Shriram Krishnamurthi in person but am looking forward to it. We've traded emails and blog comments. I'd like to consider him a friend and I certainly respect him and his work even though we frequently disagree around the edges. The third author and presenter, Kathi Fisler was new to me.

The Bootstrap program is embedded in algebra classes. In it, students use Racket (nee scheme) to reinforce math skills while building computer science skills. The big student project is a graphical game.

When designing the project, students are asked to decide on and find four resources:

  1. The background image
  2. The player image
  3. The target image
  4. The enemy image

Students are given a short amount of time to decide on and find these four images. I think it was about ten minutes and that's it. That's all the "creativity" in the assignment. After that, all the students are essentially creating the same game with different skins.

This design makes sense. You can't have students going all over the place. Constraining the assignment in this way allows teachers who might now be strong in computer science to guide the kids through the program to completion.

At the time I was thinking: I really like all of this but is it really open ended creativity and discovery with respect to math or computer science? As it turned out, Fisler addressed this point at the end of the talk in a way that made me vary happy.

Fisler went on to describe the rest of the student experience and then went on to talk about the statistics they gathered.

One big takeaway was that while all the students were essentially writing the same game varying only the graphical elements, this encouraged students to create very different themes. They also created rich stories around their games. The project might not have been "creative" with respect to the CS or Math directions but it was certainly creative in other important areas. The other takeaway was that survey's indicated all sorts of positives from the program as a whole so the project didn't seem to have suffered by having the students essentially write the same program. Participants were proud of their work, they felt their games were different from their peers and in general the experience was good.

During questions, someone asked about adding a fifth element - a projectile or missile. It turns out that at one point the program had a projectile component but that led to the vast majority of projects to be themed in very similar ways. Even though not the same, it reminded me to something Randy Pausch said in his Last Lecture:

You make whatever you want. Two rules: no shooting violence and no pornography. Not because I’m opposed to those in particular, but you know, that’s been done with VR, right? [laughter] And you’d be amazed how many 19-year-old boys are completely out of ideas when you take those off the table.

At the very end, Fisler addressed my questions about creativity and discovery. She posed these questions of her own: "Do we overstate the case for creativity?" and "Is pure constructivism a win?"

I've ranted on contructivism before. It can be great but a constructivist lesson takes a knowledgeable educator and a lot of time, preparation, and effort. It's a big ask for, say, a high school teacher who's already taking home hours of work every evening. Too often I've seen the following "contructivist" model instead:

  • Take an isntructor that doesn't know their craft, the content, or niether.
  • Let the kids play with stuff.
  • Show off the couple of autodidacts that figure it out as success stories.

I'll rant more about this "model" with respect to the new buzz word "lead learner" at some point in the future.

On the creativity side, it's important but there are also times for the instructor to lead and for guidelines to be followed. We want to foster creativity but that doesn't mean that it's 100% creativity 100% of the time. Education is like life, a balance. The Bootstrap program had to constrain the CS and math learning but allowed for creativity in other areas. It's smart and it's a win.

I still want to meet Shriram in person one day and now also Kathi Fisler. I didn't know what to expect walking in but I left the talk reminded of why I'm such a fan of Emmanuel, his team, and their work.




Enter your email address:

Delivered by FeedBurner

Google Analytics Alternative