<?xml version="1.0" encoding="iso-8859-1"?>
<!DOCTYPE rdf:RDF [
<!ENTITY % HTMLlat1 PUBLIC
 "-//W3C//ENTITIES Latin 1 for XHTML//EN"
 "http://www.w3.org/TR/xhtml1/DTD/xhtml-lat1.ent">
 %HTMLlat1;
]>
<rdf:RDF
 xmlns="http://purl.org/rss/1.0/"
 xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
 xmlns:dc="http://purl.org/dc/elements/1.1/"
 xmlns:content="http://purl.org/rss/1.0/modules/content/"
 xmlns:admin="http://webns.net/mvcb/"
>
<channel rdf:about="http://www.cs.uni.edu/~wallingf/blog/index.xml">
<title>Knowing and Doing</title>
<link>http://www.cs.uni.edu/~wallingf/blog/index.html</link>
<description>Reflections of an Academic and Computer Scientist</description>
<dc:language>en-us</dc:language>
<dc:creator>Eugene Wallingford</dc:creator>
<admin:generatorAgent rdf:resource="http://home.columbus.rr.com/n1xt3r/nanoblogger/" />
<items>
<rdf:Seq>
<rdf:li rdf:resource="http://www.cs.uni.edu/~wallingf/blog/archives/monthly/2009-11.html#e2009-11-21T05_54_44.htm" />
<rdf:li rdf:resource="http://www.cs.uni.edu/~wallingf/blog/archives/monthly/2009-11.html#e2009-11-20T15_35_31.htm" />
<rdf:li rdf:resource="http://www.cs.uni.edu/~wallingf/blog/archives/monthly/2009-11.html#e2009-11-18T06_45_09.htm" />
<rdf:li rdf:resource="http://www.cs.uni.edu/~wallingf/blog/archives/monthly/2009-11.html#e2009-11-16T20_32_47.htm" />
<rdf:li rdf:resource="http://www.cs.uni.edu/~wallingf/blog/archives/monthly/2009-11.html#e2009-11-15T20_02_06.htm" />
<rdf:li rdf:resource="http://www.cs.uni.edu/~wallingf/blog/archives/monthly/2009-11.html#e2009-11-13T14_18_08.htm" />
<rdf:li rdf:resource="http://www.cs.uni.edu/~wallingf/blog/archives/monthly/2009-11.html#e2009-11-11T13_08_28.htm" />
<rdf:li rdf:resource="http://www.cs.uni.edu/~wallingf/blog/archives/monthly/2009-11.html#e2009-11-09T21_54_27.htm" />
<rdf:li rdf:resource="http://www.cs.uni.edu/~wallingf/blog/archives/monthly/2009-11.html#e2009-11-04T19_33_41.htm" />
<rdf:li rdf:resource="http://www.cs.uni.edu/~wallingf/blog/archives/monthly/2009-11.html#e2009-11-03T19_48_28.htm" />
</rdf:Seq>
</items>
</channel>
<item rdf:about="http://www.cs.uni.edu/~wallingf/blog/archives/monthly/2009-11.html#e2009-11-21T05_54_44.htm">
<link>http://www.cs.uni.edu/~wallingf/blog/archives/monthly/2009-11.html#e2009-11-21T05_54_44.htm</link>
<title>Quotes of the Day</title>
<dc:date>2009-11-21T05:54:44-06:00</dc:date>
<dc:creator>Eugene Wallingford</dc:creator>
<dc:subject>General</dc:subject>
<description><![CDATA[<p>The day was yesterday.
</p><p>
<B>I am large, I contain multitudes.</B>
</p><p>
<BLOCKQUOTE><EM>
The to-do list is a time capsule, containing missives and
pleas to your future selves.  ...  Why is it not trivially
easy to carry out items on your own to-do list?  And the
answer is: Because the one writing the list, and the one
carrying it out are two different people.
</EM></BLOCKQUOTE>
</p><p>
Now I understand the problem...  my to-do list is a
<A HREF="http://justbeast.livejournal.com/176790.html">
   form of time travel</A>.
</p><p>
<B>Open to Multitudes</B>
</p><p>
<BLOCKQUOTE><EM>
It's the kind of culture that can tolerate rap music and
extreme sports that can also create space for guys like
Page and Brin and Google.  That's one of our hidden
strengths.
</EM></BLOCKQUOTE>
</p><p>
This is from economist Paul Romer, as quoted by
<A HREF="http://www.marginalrevolution.com/marginalrevolution/2009/11/from-poverty-to-prosperity-watch.html">
   Tyler Cowen</A>.
I agree.  We need to try out lots of ideas to find the
great ones.
</p><p>
<B>Going to an Extreme</B>
</p><p>
<BLOCKQUOTE><EM>
I'm not interested in writing short stories.  Anything that
doesn't take years of your life and drive you to suicide
hardly seems worth doing.
</EM></BLOCKQUOTE>
</p><p>
Cormac McCarthy must live on the edge.  This is one of
those romantic notions that has never appealed to me.
I've never been so driven -- nor felt like I wanted to
be.
</p><p>
<B>A Counterproposal</B>
</p><p>
<BLOCKQUOTE><EM>
6. MAKE MANY SKETCHES
</p><p>
Join the best sketches to produce others and improve them
until the result is satisfactory.
</p><p>
To make sketches is a humble and unpretentious approach
toward perfection.
</EM></BLOCKQUOTE>
</p><p>
... says composer Arnold Schonberg, as quoted at
<A HREF="http://peripateticaxiom.blogspot.com/2009/11/sketches.html">
   peripatetic axiom</A>.
This is more my style.
</p><p>
<B>Speaking of Perfection</B>
</p><p>
<BLOCKQUOTE><EM>
My perfect day is sitting in a room with some blank paper.
That's heaven.  That's gold and anything else is just a
waste of time.
</EM></BLOCKQUOTE>
</p><p>
Again from Cormac McCarthy.  Unlike McCarthy, I do
not think that everything else is a waste of time.  Yet
I feel a kinship with his sense of a perfect day.  To
sit in a room, alone, with an open terminal.  To write,
whether prose or code.  But especially code.</p>]]></description>
</item>
<item rdf:about="http://www.cs.uni.edu/~wallingf/blog/archives/monthly/2009-11.html#e2009-11-20T15_35_31.htm">
<link>http://www.cs.uni.edu/~wallingf/blog/archives/monthly/2009-11.html#e2009-11-20T15_35_31.htm</link>
<title>Learning Through Crisis</title>
<dc:date>2009-11-20T15:35:31-06:00</dc:date>
<dc:creator>Eugene Wallingford</dc:creator>
<dc:subject>Teaching and Learning, Patterns</dc:subject>
<description><![CDATA[<p><P ALIGN="right">
<EM>... an author never does more damage to his readers <BR/>
than when he hides a difficulty.  <BR/>
-- &Eacute;variste Galois</EM>
</p><p>
</p><p>
Like many of the aphorisms we quote for guidance, this
one is true, but not quite true if taken with the wrong
sense of its words or at the wrong scale.
</p><p>
First, there are different senses of the word "difficulty".
Some difficulties are incidental, and some are essential.
An author should indeed hide incidental difficulties; they
only get in the way.  However, the author must not hide
essential difficulty.  Part of the author's job is to help
the readers overcome the difficulty.
</p><p>
Second, we need to consider the scale of revelation and
hiding.   Authors who expose difficulties too soon only
confuse their readers.  Part of the author's job is to
prepare the reader, to explain, inspire, and lead
readers from their initial state into a state where they
are ready to face the difficulty.  At that moment, the
author is ready to bring the difficulty out into the open.
The readers are ready.
</p><p>
What if the reader has already uncovered the difficulty
before meeting the author?  In that time, the author
must not try to hide it, to fool his readers.  He must
attack it head on -- perhaps with the same deliberation
in explaining, inspiring, and leading, but without
artifice.  It is this sense in which Galois has nailed
a universal truth.
</p><p>
If we replace "author" with "teacher" in this discussion
we still have truths.  The teacher's job is to eliminate
incidental difficulties while exposing essential ones.
Yet the teacher must be deliberate, too, and prepare the
reader, the student, to overcome the difficulty.  Indeed,
a large part of the teacher's craft is the judicious use
of simplification and unfolding, leading students to a
deeper understanding.
</p><p>
Sometimes, we teachers can use difficulty to our advantage.
As I
<A HREF="http://www.cs.uni.edu/~wallingf/blog/archives/monthly/2009-11.html#e2009-11-13T14_18_08.htm">
   discussed recently</A>,
the brain often learns best when it it encounters its own
limitations.  Some say that is the only way we learn, but
I don't think I believe the notion when taken to this
extreme.  But I think that difficulty is often the teacher's
best source of leverage.  Confront students with difficulty,
and then help them to find resolution.
</p><p>
Ben Blum-Smith expresses a similar viewpoint in his recent
nugget on
<A HREF="http://researchinpractice.wordpress.com/2009/11/13/nuggets-ii-proof/">
   teaching students to do proofs</A>
in mathematics.  He launches his essay with remarks by
Paul Lockhart, whose essay I
<A HREF="http://www.cs.uni.edu/~wallingf/blog/archives/monthly/2008-07.html#e2008-07-02T10_23_56.htm">
   discussed last summer</A>.
Blum-Smith's teaching nugget is this:
</p><p>
<BLOCKQUOTE><EM>
The impulse toward rigorous proof comes about when your
intuition fails you.  If your intuition is never given a
chance to fail you, it's hard to see the point of proof.
</EM></BLOCKQUOTE>
</p><p>
This is just as true for us as we learn to create programs
as it is when we learn to create proofs.  If our intuition
and our current toolbox never fail us, it's hard to see
the point of learning a new tool -- especially one that is
difficult to learn.
</p><p>
Blum-Smith then quotes Lockhart:
</p><p>
<BLOCKQUOTE><EM>
Rigorous formal proof only becomes important when there is
a crisis -- when you discover that your imaginary objects
behave in a counterintuitive way; when there is a paradox
of some kind.
</EM></BLOCKQUOTE>
</p><p>
This quote doesn't inspire cool thoughts in me the way so
many other passages in Lockhart's paper do, but one word
stands way out on this reading: <B>crisis</B>.  It inspires
Blum-Smith as well:
</p><p>
<BLOCKQUOTE><EM>
... what happens is that when kids reach a point in their
mathematical education where they are asked to prove things,
they find
<UL>
<LI> that they have no idea how to accomplish what is being
     asked of them, and </LI>
<LI> that they don't really get why they're being asked to
     do it in the first place.  </LI>
</UL>
</p><p>
The way out of this is to give them a crisis.  We need to
give them problems where the obvious pattern is not the
real pattern.  What you see is not the whole story!  Then,
there is a reason to prove something.
</EM></BLOCKQUOTE>
</p><p>
We need to give our programming students
<A HREF="http://www.cs.uni.edu/~wallingf/blog/archives/monthly/2005-03.html#e2005-03-14T14_47_54.htm">
   problems</A>
in which the obvious solution, the solution that flows
naturally from their fingers onto the keyboards, doesn't
feel right, or maybe even doesn't work at all.  There is
more to the story; there is reason to learn something new.
</p><p>
Teachers who know a lot and can present useful knowledge
to students can be quite successful, and every teacher
really needs to be able to play this role sometime.
But that is not enough, especially in a world where
increasingly
<A HREF="http://www.cs.uni.edu/~wallingf/blog/archives/monthly/2009-11.html#e2009-11-15T20_02_06.htm">
   knowledge is a plentiful commodity</A>.
Great teachers have to know how to create in the minds
of their students a crisis: a circumstance in which
they doubt what they know just enough to spur the hard
work needed to learn.
</p><p>
A good writer can do this in print, but I think that
this is a competitive advantage available to classroom
teachers: they operate in a more visceral environment,
in which one can create safe and reliably effective
crises in their students minds.  If face-to-face
university courses with domain experts are to thrive in
the new, connected world, it will be because they are
able to exploit this advantage.
</p><p>
~~~~
</p><p>
Postscript:  Galois, the mathematician quoted at the
top of this article, was born on October 25.  That was
the date of one of my latest
<A HREF="http://www.cs.uni.edu/~wallingf/blog/archives/monthly/2009-10.html#e2009-10-26T15_23_47.htm">
   confrontations with difficulty</A>.
Let me assure you:  You can run, but you cannot hide!</p>]]></description>
</item>
<item rdf:about="http://www.cs.uni.edu/~wallingf/blog/archives/monthly/2009-11.html#e2009-11-18T06_45_09.htm">
<link>http://www.cs.uni.edu/~wallingf/blog/archives/monthly/2009-11.html#e2009-11-18T06_45_09.htm</link>
<title>The Gang-of-Four Book at Fifteen</title>
<dc:date>2009-11-18T06:45:09-06:00</dc:date>
<dc:creator>Eugene Wallingford</dc:creator>
<dc:subject>Patterns, Software Development</dc:subject>
<description><![CDATA[<p>One of the fun parts of teaching software engineering
this semester has been revisiting some basic patterns
in the design part of the course, and now as we discuss
refactoring in the part of the course that deals with
implementation and maintenance.  2009 is the 15th
anniversary of the publication of <EM>Design Patterns</EM>,
the book that launched software patterns into the
consciousness of mainstream developers.  Some folks
reminisced about the event at OOPSLA this year, but I
wasn't able to make it to Orlando.  OOPSLA 2004 had a
great 10th-anniversary celebration, which I had the
good fortune to attend
<A HREF="http://www.cs.uni.edu/~wallingf/blog/archives/monthly/2004-10.html#e2004-10-26T23_08_52.htm">
   and write about</A>.
</p><p>
I wasn't present at OOPSLA in 1994, when the book
created an unprecedented spectacle in the exhibit
hall; that just predates my own debut at OOPSLA.
But wish I had been!
</p><p>
InformIT recently ran a series of interviews with OO
and patterns luminaries, sharing their thoughts on
the book and on how patterns have changed the
landscape of software development.  The
<A HREF="http://www.informit.com/articles/article.aspx?p=1404182">
   interview with Brian Foote</A>
had a passage that I really liked:
</p><p>
<BLOCKQUOTE><EM>
<B>InformIT: How has </B>Design Patterns<B> changed your
impressions about the way software is built?</B>
<BR/><BR/>
The vision of reuse that we had in the object-oriented
community in hindsight seems like a God that Failed.  Just
as the Space Shuttle never lived up to its promised reuse
potential, libraries, frameworks, and components, while
effective in as far as they went, never became foundations
of routine software reuse that many had envisioned and
hoped.
<BR/><BR/>
Instead, designs themselves, design ideas, <B>patterns</B>
became the loci of reuse.  We craft our ideas, by hand,
into each new artifact we build.
</EM></BLOCKQUOTE>
</p><p>
This insight gets to the heart of why patterns matter.
Other forms of reuse have their place and use, but they
operate at a code level that is ultimately fragile in
the face of the different contexts in which our programs
operate.  So they are, by necessity, limited as vehicles
for reuse.
</p><p>
Design ideas are less specific, more malleable.  They
apply in a million contexts, though never in quite the
same way.  We mold them to the context of our program.
The patterns we see in our designs and tests and
implementations give us the abstract raw material out
of which to create our programs.  We still strive for
reuse, but at a different level of thinking and working.
</p><p>
Read the full interview linked above.  It is typical
Brian Foote: entertaining and full of ideas presented
slightly askew from the typical vantage point.  That
twist helps me to think differently about things that
may have otherwise become commonplace.  And as so often
happens, I had to
<A HREF="http://www.merriam-webster.com/dictionary/lahar">
   look a word up in the dictionary</A>
before I reached the end.  I always seem to learn
something from Brian!</p>]]></description>
</item>
<item rdf:about="http://www.cs.uni.edu/~wallingf/blog/archives/monthly/2009-11.html#e2009-11-16T20_32_47.htm">
<link>http://www.cs.uni.edu/~wallingf/blog/archives/monthly/2009-11.html#e2009-11-16T20_32_47.htm</link>
<title>Towards Software that Improves on Index Cards</title>
<dc:date>2009-11-16T20:32:47-06:00</dc:date>
<dc:creator>Eugene Wallingford</dc:creator>
<dc:subject>Software Development</dc:subject>
<description><![CDATA[<p>Who would have thought that this would turn out
to be a major challenge to software developers,
software to improve on index cards?
</p><p>
Like a dog gnawing on a bone, I had planned to
write more about the topic of
<A HREF="http://www.cs.uni.edu/~wallingf/blog/archives/monthly/2009-11.html#e2009-11-09T21_54_27.htm">
   software for XP planning</A>.
The thread on the XP list just kept on going,
and I was sure that I needed to rebut some of
the attitude about index cards being the perfect
technology for executing XP.  I'm not sure why
I felt this need.  I mostly agree that small
cards and fat pens are the best way for us to
implement story planning and team communication
in XP.  Maybe it's an academic's vice to drive
any topic into the ground on a technicality.
</p><p>
Fortunately, though, I came to realize that I
was punching a strawman.  Most of the folks on
the list who are talking up the use of low-fi
technology don't take a hard stance on reality
versus simulation as discussed in my previous
post, even when it colors their rhetoric.
Most would simply say something like this:
"Index cards and felt-tip markers simply work
better for us right now than anything else.
If someone wants to claim that a software tool
can do as well or better, they'll have to show
us."
</p><p>
Skepticism and
<A HREF="http://www.cs.uni.edu/~wallingf/blog/archives/monthly/2009-10.html#e2009-10-29T16_19_31.htm">
   asking for evidence</A>
-- many of us all can do better with such an
attitude.
</p><p>
I also realized what has been the most interesting
result of this discussion thread for me: a chance
to see what XP practitioners consider to be the
essential features of a planning tool for agile
teams.  Which characteristics of cards and markers
make them so useful?  Which characteristics of
existing software tools get in the way of doing
the job as well as index cards?  This includes
general-purpose software that we use for XP, say,
a spreadsheet, and software built explicitly for
XP teams (there are many).
</p><p>
As a part of the XP list discussion, Ilja Preuss
posted a link to his blog entry on
<A HREF="http://iljapreuss.blogspot.com/2009/07/criteria-for-scrum-tool-or-any-agile.html">
   criteria for XP team tools</A>.
Here the start of a feature list for XP planning
software that I gleaned from that entry and from
a few of the articles in the thread:
<UL>
<LI> easy to see all the stories at once </LI>
<LI> easy to move the stories around </LI>
<LI> easy to make notations of various sorts on
     the stories </LI>
<LI> provides visual cues of the size of the
     system and what stories are most important </LI>
<LI> makes all of the people related to the project
     comfortable with making changes </LI>
</UL>
</p><p>
The overarching themes in this discussion are <B>high
visibility</B> and <B>strong collaboration</B>.  In
this context, good tools provide more than a one- or
even two-way communication medium.  In addition to
what they communicate, they must communicate in a way
that is visible to as many team members as possible
at all times.  This is the first step toward enabling
and encouraging interactivity.  One of the most
powerful roles that cards play in software development
is that of tokens in a
<A HREF="http://alistair.cockburn.us/Software+development+as+a+cooperative+game">
   cooperative game</A>
-- several games, really -- that moves a project
forward.  Without interactivity, the communication
that makes it possible for projects to succeed tends
to die off.
</p><p>
Some people are trying to build better tools, and I
applaud them.  I hope they draw on their own experience
and on the experiences we find shared in forums such
as the XP list.  One tool-in-progress that caught my
attention was
<A HREF="http://agilebooknote.blogspot.com/2009/11/taskboardy-available.html">
   Taskboardy</A>,
which builds on Google Wave.  Kent Beck recently
tweeted and blogged that he had not yet grokked the
need to be satisfied by Wave.  Without a killer itch
to be scratched, it is hard for a new technology,
especially a radically different one, to become
indispensable and displace other tools.  Maybe the
high degree of communication and interactivity demanded
by agile software teams is just the sort of need that
Wave can satisfy?  I don't know, but the best way to
find out is for someone to try.</p>]]></description>
</item>
<item rdf:about="http://www.cs.uni.edu/~wallingf/blog/archives/monthly/2009-11.html#e2009-11-15T20_02_06.htm">
<link>http://www.cs.uni.edu/~wallingf/blog/archives/monthly/2009-11.html#e2009-11-15T20_02_06.htm</link>
<title>Knowledge Arbitrage</title>
<dc:date>2009-11-15T20:02:06-06:00</dc:date>
<dc:creator>Eugene Wallingford</dc:creator>
<dc:subject>Teaching and Learning, General</dc:subject>
<description><![CDATA[<p>A couple of weeks back, Brian Foote
<A HREF="http://twitter.com/bigballofmud/status/5209395023">
   tweeted</A>:
</p><p>
<BLOCKQUOTE><EM>
Ward Cunningham: Pure Knowledge arbitrageurs will
no longer gain by hoarding as knowledge increasingly
becomes a plentiful commodity #oopsla
</EM></BLOCKQUOTE>
</p><p>
This reminds me of a "quought" of the day that I read
a couple of years ago.  Paraphrased, it asked marketers:
<EM>What will you do when all of your competitors know
all of the same things you do?</EM>  Ward's message
broadens the implication from marketers to any playing
field on which knowledge drives success.  If everyone
has access to the same knowledge, how do you distinguish
yourself?  Your product?  The future looks a bit more
imposing when no one starts with any particular advantage
in knowledge.
</p><p>
Ward's own contributions to the world -- the wiki and
extreme programming among them -- give us a hint as
to what this new future might look like.  Hoarding is
not the answer.  Sharing and building together might be.
</p><p>
The history of the internet and the web tells us at
the result of collaboration and open knowledge may
well be a net win for all of us over a world in which
knowledge is hoarded and exploited for gain in
controlled bursts.
</p><p>
Part of the ideal of the academy has always been the
creation and sharing of knowledge.  But increasingly
its business model has been exposed as depending on
the sort of knowledge arbitrage that Ward warns
against.  Universities now compete in a world of
<A HREF="http://www.cs.uni.edu/~wallingf/blog/archives/monthly/2009-06.html#e2009-06-11T20_24_02.htm">
   knowledge more plentiful and open</A>
than ever before.  <EM>What can they do when all of
their <B>customers</B> have access to much of the
same knowledge that they hope to disseminate?</EM>
Taking a cue from Ward, universities probably need
to be thinking hard about how they share knowledge,
how they help students, professors, and industry
build knowledge together, and how they add value
in their unique way through academic inquiry.</p>]]></description>
</item>
<item rdf:about="http://www.cs.uni.edu/~wallingf/blog/archives/monthly/2009-11.html#e2009-11-13T14_18_08.htm">
<link>http://www.cs.uni.edu/~wallingf/blog/archives/monthly/2009-11.html#e2009-11-13T14_18_08.htm</link>
<title>Learning via Solutions to our Limitations</title>
<dc:date>2009-11-13T14:18:08-06:00</dc:date>
<dc:creator>Eugene Wallingford</dc:creator>
<dc:subject>Teaching and Learning, Patterns</dc:subject>
<description><![CDATA[<p>Yesterday I introduced refactoring in my software
engineering course.  Near the beginning of my code demo,
I got sidetracked a bit when I mentioned that I would
be using JUnit to run some automated tests.  We have
not talked about testing yet, automated or otherwise,
and I thought that refactoring might be a good way to
show its value.
</p><p>
One student wondered why he should go to the trouble;
why not just write a few lines of code to do his own
testing?  My initial response turned too quickly to
the idea of automation, which seemed natural given the
context of refactoring.  Automating tests is essential
when we are working in a tight cycle of code-test-refactor-test.
This wasn't all that persuasive to the student, who had
not seen us refactor yet.  Fortunately, another student,
who has used testing frameworks at work, jumped in to
point out the real flaw in what the first student had
proposed: interspersing test code and production code.
I think that was more persuasive to the class, and we
moved on.
</p><p>
That got me to thinking about a different way to
introduce both testing frameworks and refactoring next
time.  The key pedagogical idea is to focus on students'
current experience and why they <EM>need</EM> something
new.  Necessity gives birth not only to invention but
also to the desire to learn.
</p><p>
Somedays, I think the web is magic.
<A HREF="http://blog.mrmeyer.com/?p=5085">
  This</A>
popped into newsfeed when I refreshed this morning:
</p><p>
<BLOCKQUOTE><EM>
whenever possible, introduce new skills and new knowledge
as the solution to the limitations of old skills and old
knowledge
</EM></BLOCKQUOTE>
</p><p>
Meyer, who teaches HS math, has a couple of images
contrasting the typical approach to lesson planning
(introduce concept, pay "brief homage to workers who use
it", work sample problems) to an approach based on the
limitations of old skills:
<OL>
<LI> summarize briefly relevant prior skills </LI>
<LI> show a "sample problem that renders those skills
     pretty well useless" </LI>
<LI> describe the new skill </LI>
</OL>
</p><p>
I like to teach design patterns using a more active
version of this approach:
<OL>
<LI> give the students a problem to solve, preferably
     one that looks like a good fit for their current
     skill set </LI>
<LI> as a group, explore the weaknesses in their
     solutions or the difficulties they had creating
     them </LI>
<LI> introduce a pattern that balances the forces in
     this problem, and the discuss the more general
     context in which it applies </LI>
</OL>
</p><p>
I need to remember to use this strategy with more of
the new skills and techniques.  It's hard to do this
in the small for all techniques, but when I can tie
the new idea to an error students make or a difficulty
they have, I usually have better success.  (My favorite
success story with this approach was helping students
to learn selection patterns -- ways to use <TT>if</TT>
statements -- in CS1 back in the mid-1990s.)</p>]]></description>
</item>
<item rdf:about="http://www.cs.uni.edu/~wallingf/blog/archives/monthly/2009-11.html#e2009-11-11T13_08_28.htm">
<link>http://www.cs.uni.edu/~wallingf/blog/archives/monthly/2009-11.html#e2009-11-11T13_08_28.htm</link>
<title>Time Waits for No One</title>
<dc:date>2009-11-11T13:08:28-06:00</dc:date>
<dc:creator>Eugene Wallingford</dc:creator>
<dc:subject>Computing, Personal</dc:subject>
<description><![CDATA[<p></p><p>
<B>OR:</B>  for all p, <IMG SRC="http://www.cs.uni.edu/~wallingf/blog-images/logic/modal-diamond.png" alt="eventually (modal)" />passed(p)
</p><p>
~~~~
</p><p>
Last week saw the
<A HREF="http://www.acm.org/news/featured/pnueli">
   passing of computer scientist Amir Pnueli</A>.
Even though, Pnueli received the Turing Award, I do
not have the impression that many computer scientists
know much about his work.  That is a shame.  Pnueli
helped to invent an important new sub-discipline of
computing:
</p><p>
<BLOCKQUOTE><EM>
Pnueli received ACM's A. M. Turing Award in 1996 for
introducing temporal logic, a formal technique for
specifying and reasoning about the behavior of systems
over time, to computer science.  In particular, the
citation lauded his landmark 1977 paper, "The Temporal
Logic of Programs," as a milestone in the area of
reasoning about the dynamic behavior of systems.
</EM></BLOCKQUOTE>
</p><p>
I was fortunate to read "The Temporal Logic of Programs"
early in my time as a graduate student.  When I started
at Michigan State, most of its AI research was done in
the world-class
<A HREF="http://www.cse.msu.edu/rgroups/prip/">
   Pattern Recognition and Image Recognition lab</A>.
That kind of AI didn't appeal to me much, and I soon
found myself drawn to the Design Automation Research
Group, which was working on ways to derive hardware
designs from specs and to prove assertions about the
behavior of systems from their designs.  This was a
neat application area for logic, modeling, and
reasoning about design.  I began to work under
<A HREF="http://www.cse.msu.edu/~wojcik/">
   Anthony Wojcik</A>,
applying the idea of modal logics to reasoning about
hardware design.  That's where I encountered the work
of Pnueli, which was still relatively young and full
of promise.
</p><p>
Classical propositional logic allows us to reason about
the truth and falsehood of assertions.  It assumes that
the world is determinate and static: each assertion must
be either true or false, and the truth value of an
assertion never changes.  <B>Modal logic</B> enables
us to express and reason about contingent assertions.
In a modal logic, one can assert "John <B>might</B> be
in the room" to demonstrate the possibility of John's
presence, regardless of whether he is or is not in the
room.  If John were known to be out of the country, one
could assert "John <B>cannot</B> be in the room" to
denote that it is necessarily true that he is not in
the room.  Modal logic is sometimes referred to as the
logic of possibility and necessity.
</p><p>
These notions of contingency are formalized in the modal
operators
<IMG SRC="http://www.cs.uni.edu/~wallingf/blog-images/logic/modal-diamond.png" alt="possibly (modal)" />p,
"possibly p," and
<IMG SRC="http://www.cs.uni.edu/~wallingf/blog-images/logic/modal-square.png" alt="necessarily (modal)" />p,
"necessarily p."  Much like the propositional operators
"and" and "or",
<IMG SRC="http://www.cs.uni.edu/~wallingf/blog-images/logic/modal-diamond.png" alt="possibly (modal)" />
and
<IMG SRC="http://www.cs.uni.edu/~wallingf/blog-images/logic/modal-square.png" alt="necessarily (modal)" />
can be used to express the other in combination with
&not;, because necessity is really nothing more than
possibility "turned inside out".  The fundamental
identities of modal logic embody this relationship:
</p><p>
<BLOCKQUOTE>
<IMG SRC="http://www.cs.uni.edu/~wallingf/blog-images/logic/modal-identities.png" alt="modal identities" />
</BLOCKQUOTE>
</p><p>
Modal logic extends the operator set of classical logic
to permit contingency.  All the basic relationships of
classical logic are also present in modal logic.
<IMG SRC="http://www.cs.uni.edu/~wallingf/blog-images/logic/modal-diamond.png" alt="possibly (modal)" />
and
<IMG SRC="http://www.cs.uni.edu/~wallingf/blog-images/logic/modal-square.png" alt="necessarily (modal)" />
are not themselves truth functions but quantifiers over
possible states of a contingent world.
</p><p>
When you begin to play around with modal operators, you
start to discover some fun little relationships.  Here
are a few I remember enjoying:
</p><p>
<BLOCKQUOTE>
<IMG SRC="http://www.cs.uni.edu/~wallingf/blog-images/logic/modal-relationships.png" alt="modal relationships" />
</BLOCKQUOTE>
</p><p>
The last of those is an example of a distributive
property for modal operators.  Part of my master's
research was to derive or discover other properties
that would be useful in our design verification tasks.
</p><p>
The notion of contingency can be interpreted in many
ways.  <EM>Temporal logic</EM> interprets the operators
of modal logic as reasoning over time.
<IMG SRC="http://www.cs.uni.edu/~wallingf/blog-images/logic/modal-square.png" alt="necessarily (modal)" />p
becomes "always p" or "henceforth p," and
<IMG SRC="http://www.cs.uni.edu/~wallingf/blog-images/logic/modal-diamond.png" alt="possibly (modal)" />p
becomes "sometimes p" or "eventually p."  When we use
temporal logic to reason over circuits, we typically
think in terms of "henceforth" and "eventually."  The
states of the world represent discrete points in time at
which one can determine the truth value of individual
propositions.  One need not assume that time is discrete
by its nature, only that we can evaluate the truth value
of an assertion at distinct points in time.  The
fundamental identities of modal logic hold in this
temporal logic as well.
</p><p>
In temporal logic, we often define other operators that
have specific meanings related to time.  Among the more
useful temporal logical connectives are:
</p><p>
<BLOCKQUOTE>
<IMG SRC="http://www.cs.uni.edu/~wallingf/blog-images/logic/temporal-operators.png" alt="temporal logic operators" />
</BLOCKQUOTE>
</p><p>
My master's research focused specifically on applications
of interval temporal logic, a refinement of temporal
logic that treats <I>sequences</I> of points in time as
the basic units of reasoning.  Interval logics consider
possible states of the world from a higher level.  They
are especially useful for computer science applications,
because hardware and software behavior can often be
expressed in terms of nested time intervals or sequences
of intervals.  For example, the change in the state of a
flip-flop can be characterized by the interval of time
between the instant that its input changes and the instant
at which its output reflects the changed input.
</p><p>
Though I ultimately moved into the brand-new AI/KBS Lab
for my doctoral work, I have the fondest memories of my
work with Wojcik and the DARG team.  It resulted in my
master's paper, "Temporal Logic and its Use in the
Symbolic Verification of Hardware", from which the above
description is adapted.  While Pnueli's passing was a
loss for the computer science community, it inspired
me to go back to that twenty-year-old paper and reminisce
about the research a younger version of myself did.  In
retrospect, it was a pretty good piece of work.  Had I
continued to work on symbolic verification, it may have
produced an interesting result or two.
</p><p>
<B>Postscript</B>.  When I first read of Pnueli's passing,
I didn't figure I had a copy of my master's paper.  After
twenty years of moving files from machine to machine, OS to
OS, and external medium to medium, I figured it would have
been lost in the ether.  Yet I found both a hardcopy in my
filing cabinet and an electronic version on disk.  I wrote
the paper in nroff format on an old Sparc workstation.
nroff provided built-in char sequences for all of the
special symbols I needed when writing about modal logic
that worked perfectly -- unlike HTML, whose codes I've been
struggling with for this entry.  Wonderful!  I'll have to
see whether I can generate a PDF document from the old
nroff source.  I am sure you all would love to read it.</p>]]></description>
</item>
<item rdf:about="http://www.cs.uni.edu/~wallingf/blog/archives/monthly/2009-11.html#e2009-11-09T21_54_27.htm">
<link>http://www.cs.uni.edu/~wallingf/blog/archives/monthly/2009-11.html#e2009-11-09T21_54_27.htm</link>
<title>Reality versus Simulation</title>
<dc:date>2009-11-09T21:54:27-06:00</dc:date>
<dc:creator>Eugene Wallingford</dc:creator>
<dc:subject>Software Development, General</dc:subject>
<description><![CDATA[<p>A recent discussion on the XP mailing list discussed
the relative merits of using physical cards for story
planning versus a program, even something as simple
as a spreadsheet.  Someone had asked, "why not use
a program?", and lots of XP aficionados explained
why not.
</p><p>
I mostly agree with the explanations, but one
undercurrent in the discussion bothered me.  It is
best captured in this comment:
</p><p>
<BLOCKQUOTE><EM>
The software packages are simulations.  The board
and cards are the real thing.
</EM></BLOCKQUOTE>
</p><p>
I was immediately transported twenty years back, to
a set of old arguments against artificial intelligence.
They went something like this...  If we write a
program to simulate a rainstorm, we will not get wet;
it is just a simulation.  By the same token, we can
write a program to simulate symbol processing the way
we think people do it, but it's not real symbol
processing; it is just a simulation.  We can write a
program to simulate human thought, but it's not real;
it's just simulated thought.  Just as a simulated
rainstorm will not make us wet, simulated thought
can't enlighten us.  Only human thought is real.
</p><p>
That always raised my hackles.  I understand the
difference between a physical phenomenon like rain
and a simulation of it.  But symbol processing and
thought are something different.  They are physical
in our brains, but they manifest themselves in our
interactions with the exterior world, including other
symbol processors and thinkers.  Turing's insight in
his seminal paper
<A HREF="http://www.loebner.net/Prizef/TuringArticle.html">
   Computing Machinery and Intelligence</A>
was to separate the physical instantiation of intelligent
behavior from the behavior itself.  The essence of the
behavior is its ability to communicate ideas to other
agents.  If a program can carry on such communication
in a way indistinguishable form how humans communicate,
then on what grounds are we to say that the simulation
is any less real than the real thing?
</p><p>
That seems like a long way to go back for a connection,
but when I read the above remark, from someone whose
work I greatly respect, it, too, raised my hackles.
Why would a software tool that supports an XP practice
be "only" a simulation and current practice be the real
thing?
</p><p>
The same person prefaced his conclusion above with
this, which explains the reasoning behind it:
</p><p>
<BLOCKQUOTE><EM>
Every software package out there has to "simulate" some
definite subset of these opportunities, and the more of
them the package chooses to support the more complex to
learn and operate it becomes.  Whereas with a physical
board and cards, the opportunities to represent useful
information are just there, they don't need to be
simulated.
</EM></BLOCKQUOTE>
</p><p>
The current way of doing things -- index cards and
post-it notes on pegboards -- is a medium of expression.
It is an old medium, familiar, comfortable, and well
understood, but a medium nonetheless.  So is a piece
of software.  Maybe we can't express as much in our
program, or maybe it's not as convenient to say what
we want to say.  This disadvantage is about what we
can say or say easily.  It's not about reality.
</p><p>
The same person has the right idea elsewhere in his
post:
</p><p>
<BLOCKQUOTE><EM>
Physical boards and cards afford a much larger world
of opportunities for representing information about
the work as it is getting done.
</EM></BLOCKQUOTE>
</p><p>
Ah...  The physical medium fits better into how we
work.  It gives us the ability to easily represent
information as the work is being done.  This is about
work flow, not reality.
</p><p>
Another poster gets it right, too:
</p><p>
<BLOCKQUOTE><EM>
It may seem counterintuitive for those of us who
work with technology, but the physical cards and
boards are simply more powerful, more expressive,
and more useful than electronic storage.  Maybe
because it's not about storage but communication.
</EM></BLOCKQUOTE>
</p><p>
The physical medium is more expressive, which makes
it more powerful.  More power combined with greater
convenience makes the physical medium more useful.
This conclusion is about communication.  It doesn't
make the software tool less real, only less useful
or effective.
</p><p>
You will find that communication is often the bottom
line when we are talking about software development.
The agile approaches emphasize communication and so
occasionally reach what seems to be a counterintuitive
result for a technical profession.
</p><p>
I agree with the XP posters about the use of physical
cards and big, visible boards for displaying them.
This physical medium encourages and enhances human
communication in a way that most software does not
-- at least for now.  Perhaps we could create better
software tools to support our work?  Maybe computer
systems will evolve to the point that a live display
board will dynamically display our stories, tasks,
and status in a way that meshes as nicely with human
workflow and teamwork as physical displays do now.
Indeed, this is probably possible now, though not
as inexpensively or as conveniently as stash of index
cards, a cheap box of push pins, and some cork board.
</p><p>
I am open to a new possibility.  Framing the issue
as one of reality versus simulation seems to imply
that it's not possible.  I think that perspective
limits us more than it helps us.</p>]]></description>
</item>
<item rdf:about="http://www.cs.uni.edu/~wallingf/blog/archives/monthly/2009-11.html#e2009-11-04T19_33_41.htm">
<link>http://www.cs.uni.edu/~wallingf/blog/archives/monthly/2009-11.html#e2009-11-04T19_33_41.htm</link>
<title>Wherefore Art Thou Agile?</title>
<dc:date>2009-11-04T19:33:41-06:00</dc:date>
<dc:creator>Eugene Wallingford</dc:creator>
<dc:subject>Software Development</dc:subject>
<description><![CDATA[<p>In recent years, my favorite conference,
<A HREF="http://www.oopsla.org/">
   OOPSLA</A>,
has been suffering a strange identity crisis.  When
the conference began in the mid-1980s, object-oriented
programming was a relatively new idea, known to some
academics but unheard of by most in industry.  By the
early 2000s, it had gone mainstream.  Most developers
understands OOP now, or think they do.  Our languages
and tools make it seem second nature.  We teach it to
freshmen in many universities.  Who needs a big conference
devoted to objects?
</p><p>
As I've written before, say,
<A HREF="http://www.cs.uni.edu/~wallingf/blog/archives/monthly/2007-10.html#e2007-10-04T18_40_13.htm">
   here</A>,
this reflects a fundamental misunderstanding about
OOPSLA has always been about.  It's a natural
misunderstanding, given the name and the marketing
hype around it through the 1990s, but a misunderstanding
nonetheless.  It's hard to unbrand a well-known
conference and re-brand it once its existing brand
loses its purpose or zip.  So OOPSLA struggles a bit.
I hear that next year it will become one attraction
under the umbrella of a new event, "SPLASH".  (More on
that later!)
</p><p>
In the last few years, people have begun to notice
something similar going on with a younger spinoff from
OOPSLA.  Agile software development has started to
become mainstream.  It is over the initial hump of
awareness and acceptance.  Most everyone knows what
'agile' is, or thinks he does.  Its practices have
begun to seep into a large number of software houses,
whether from Scrum or XP.  Our languages and tools
now make it possible to work in shorter iterations
with continuous feedback and more confidence.  We
teach it in universities, sometimes even to freshmen.
Agile has become old school.
</p><p>
Maybe I'm overstating things a bit, but the buzz has
certainly died off.  Now we are more likely to hear
grumbling.  I don't know that many people are asking
whether we need conferences devoted to agile approaches
yet.  But I am starting to read articles that second
guess the "movement" and to see a lot of revisionist
history.  Perhaps this is what happens when the
excitement of newness fades into the blandness of
same-old, same-old.  The excitement passes, and people
begin to pay attention more to the chinks in the
armor than the strengths that gave the idea birth.
</p><p>
Let's not forget what made agile development and
especially XP so galvanizing.
<A HREF="http://www.williamcaputo.com/archives/000288.html">
   William Caputo hasn't forgotten</A>:
</p><p>
<BLOCKQUOTE><EM>
But why Agile sells isn't why I liked it.  I liked
it *because* it put the programmer at the center
of the effort of programming (crazy notion that),
I didn't need the manifesto to tell me that I had
to find ways to make the person paying the money
delighted with my efforts, what I needed was a way
to tell them that <B>I would gladly do so, if they
would just let me</B>.
</EM></BLOCKQUOTE>
</p><p>
(The asterisks are his.  The bold is mine.)
</p><p>
This is what made XP and the other agile approaches
so very important.  Focusing on the buyers' needs
is easy to do.  They pay for software and so have
an opportunity to affect strongly the nature of
software development.  What was missing pre-agile
was attention to the <B>developer</B>.  I still
prefer the term "programmer", with all it implies.
It was easy to find ways in which programmers were
marginalized, buried beneath processes, documentation,
and tools that seemed primarily to serve purposes
other than to trust and help programmers to make
great software.
</p><p>
The agile movement helped to change that, to shift
the perspective from inhuman processes that expected
the worst from programmers to practices that celebrate
programmers and their love for making software.
That some people are now even talking about restating
the Agile Manifesto's values toward maximizing
shareholder value is a tribute to agile's success at
changing the overarching story of the industry.
</p><p>
All this reminds me of an essay by Brian Marick on
<A HREF="http://www.exampler.com/ease-and-joy.html">
   ease and joy</A>.
Agile is about joy at work.  We programmers love to
make software -- software that improves the lives of
its users.  Great software.  Let us love writing
programs, and we can do great things for you.</p>]]></description>
</item>
<item rdf:about="http://www.cs.uni.edu/~wallingf/blog/archives/monthly/2009-11.html#e2009-11-03T19_48_28.htm">
<link>http://www.cs.uni.edu/~wallingf/blog/archives/monthly/2009-11.html#e2009-11-03T19_48_28.htm</link>
<title>Parts of Speech in Programming Languages</title>
<dc:date>2009-11-03T19:48:28-06:00</dc:date>
<dc:creator>Eugene Wallingford</dc:creator>
<dc:subject>Computing, Software Development</dc:subject>
<description><![CDATA[<p>I enjoyed Reg Braithwaite's talk
<FONT SIZE="+1"><TT>Ruby.rewrite(Ruby)</TT></FONT>
(slides
<A HREF="http://www.flickr.com/photos/raganwald/sets/72157606272767656/">
   available on-line</A>).
It gives a nice survey of some
<A HREF="http://www.cs.uni.edu/~wallingf/blog/archives/monthly/2009-11.html#e2009-11-02T18_59_40.htm">
   metaprogramming hacks</A>
related to Ruby's syntactic and semantic structure.
</p><p>
To me, one of the most thought-provoking things Reg
says is actually a rather small point in the overall
message of the talk.  Object-oriented programming is,
he summarizes, basically a matter a matter of nouns
and verbs, objects and their behaviors.  What about
other parts of speech?  He gives a simple example of
an adverb:
</p><p>
<BLOCKQUOTE><EM>
<FONT SIZE="+=2"><TT>blitz.not.blank?</TT></FONT>
</EM></BLOCKQUOTE>
</p><p>
In this expression, <FONT SIZE="+=1"><TT>not</TT></FONT>
is an adverb that modifies the behavior of
<FONT SIZE="+=1"><TT>blank?</TT></FONT>.  At the
syntactic level, we are really telling
<FONT SIZE="+=1"><TT>blitz</TT></FONT> to behave
differently in response to the next message, which
happens to be <FONT SIZE="+=1"><TT>blank?</TT></FONT>,
but from the programmer's semantic level
<FONT SIZE="+=1"><TT>not</TT></FONT> modifies the
predicate <FONT SIZE="+=1"><TT>blank?</TT></FONT>.
It is an adverb!
</p><p>
Reg notes that some purists might flag this code as
a violation of the
<A HREF="http://www.ccs.neu.edu/home/lieber/LoD.html">
   Law of Demeter</A>,
because it sends a message to an object received
from another message send.  But it doesn't!  It just
looks that way at the syntax level.  We aren't
chaining two requests together; we are
<B>modifying</B> how one of the requests works, how
its result is to be interpreted.  While this may
look like a violation of the Law of Demeter, it
isn't.  Being able to talk about adverbs, and thus
to distinguish among different kinds of message,
helps to make this clear.
</p><p>
It also helps us to program better in at least two
ways.  First, we are able to use our tools without
unnecessary guilt at breaking the letter of a law
that doesn't really apply.  Second, we are freed
to think more creatively about how our programs can
say what we mean.  I <EM>love</EM> that Ruby allows
me to create constructs such as 
<FONT SIZE="+=1"><TT>not</TT></FONT> and weave them
seamlessly into my code.  Many of my favorite gems
and apps use this feature to create domain-specific
languages that look and feel like what they are and
look and feel like Ruby -- at the same time.
<A HREF="http://treetop.rubyforge.org/">
   Treetop</A>
is an example.  I'd love to hear about your favorite
examples.
</p><p>
So, our OO programs have nouns and verbs and adverbs.
What about other parts of speech?  I can think of
at least two from Java.  One is pronouns.  In English,
<FONT SIZE="+=1"><TT>this</TT></FONT> is a
demonstrative pronoun.  It is in Java, too.  I think
that <FONT SIZE="+=1"><TT>super</TT></FONT> is also
demonstrative pronoun, though it's not a word we use
similarly in English.  As an object, I consist of
<FONT SIZE="+=1"><TT>this</TT></FONT> part of me and
that (<FONT SIZE="+=1"><TT>super</TT></FONT>) part
of me.
</p><p>
Another is adjectives.  When I teach Java to students,
I usually make an analogy from access modifiers --
<FONT SIZE="+=1"><TT>public</TT></FONT>,
<FONT SIZE="+=1"><TT>private</TT></FONT>, and
<FONT SIZE="+=1"><TT>protected</TT></FONT> -- to
adjectives.  They modify the variables and methods
which they accompany.  So do
<FONT SIZE="+=1"><TT>synchronized</TT></FONT> and
<FONT SIZE="+=1"><TT>volatile</TT></FONT>.
</p><p>
Once we free ourselves to think this way, though, I
think there is something more powerful afoot.  We
can begin to think about creating and using our own
pronouns and adjectives in code.  Do we need to say
something in which another part of speech helps us
to communicate better?  If so, how can we make it
so?  We shouldn't be limited to the keywords defined
for us five or fifteen or fifty years ago.
</p><p>
Thinking about adverbs in programming languages
reminds me of a wonderful
<A HREF="http://www.oopsla.org/oopsla2003/files/onw-2.html">
   Onward! talk</A>
I heard at the
<A HREF="http://www.oopsla.org/oopsla2003/files/">
   OOPSLA 2003</A>
conference.
<A HREF="http://www.ics.uci.edu/~lopes/">
   Cristina Lopes</A>
talked about
<A HREF="http://www.ics.uci.edu/~lopes/documents/oopsla03/index.html">
   naturalistic programming</A>.
She suggested that this was a natural step in the
evolution from aspect-oriented programming, which had
delocalized references within programs in a new way,
to code that is concise, effective, and understandable.
Naturalistic programming would seek to take advantage
of elements in natural language that humans have been
using to think about and describe complex systems for
thousand of years.  I don't remember many of the details
of the talk, but I recall discussion of how we could
use anaphora (repetition for the sake of emphasis)
and temporal references in programs.  Now that my mind
is tuned to this wavelength, I'll go back to read the
paper and see what other connections it might trigger.
What other parts of speech might we make a natural
part of our programs?
</p><p>
(While writing this essay, I have felt a strong sense
of <EM>deja vu</EM>.  Have I written a previous blog
entry on this before?  If so, I haven't found it yet.
I'll keep looking.)</p>]]></description>
</item>
</rdf:RDF>
