<?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-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:li rdf:resource="http://www.cs.uni.edu/~wallingf/blog/archives/monthly/2009-11.html#e2009-11-02T18_59_40.htm" />
<rdf:li rdf:resource="http://www.cs.uni.edu/~wallingf/blog/archives/monthly/2009-10.html#e2009-10-30T16_31_52.htm" />
<rdf:li rdf:resource="http://www.cs.uni.edu/~wallingf/blog/archives/monthly/2009-10.html#e2009-10-29T16_19_31.htm" />
<rdf:li rdf:resource="http://www.cs.uni.edu/~wallingf/blog/archives/monthly/2009-10.html#e2009-10-27T21_47_10.htm" />
<rdf:li rdf:resource="http://www.cs.uni.edu/~wallingf/blog/archives/monthly/2009-10.html#e2009-10-27T06_57_39.htm" />
<rdf:li rdf:resource="http://www.cs.uni.edu/~wallingf/blog/archives/monthly/2009-10.html#e2009-10-26T15_23_47.htm" />
<rdf:li rdf:resource="http://www.cs.uni.edu/~wallingf/blog/archives/monthly/2009-10.html#e2009-10-23T15_11_49.htm" />
<rdf:li rdf:resource="http://www.cs.uni.edu/~wallingf/blog/archives/monthly/2009-10.html#e2009-10-22T16_00_29.htm" />
</rdf:Seq>
</items>
</channel>
<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>
<item rdf:about="http://www.cs.uni.edu/~wallingf/blog/archives/monthly/2009-11.html#e2009-11-02T18_59_40.htm">
<link>http://www.cs.uni.edu/~wallingf/blog/archives/monthly/2009-11.html#e2009-11-02T18_59_40.htm</link>
<title>It's All Just Programming</title>
<dc:date>2009-11-02T18:59:40-06:00</dc:date>
<dc:creator>Eugene Wallingford</dc:creator>
<dc:subject>Computing, Software Development</dc:subject>
<description><![CDATA[<p>One of my colleagues is an old-school C programmer.
He can make the machine dance using C.  When C++
came along, he tried it for a while, but many of
the newly-available features seemed like overkill
to him.  I think templates fell into that category.
Other features disturbed him.  I remember him
reporting some particularly bad experiences with
operator overloading.  They made code unreadable!
Unmaintainable!  You could never be sure what
<FONT SIZE="+1"><TT>+</TT></FONT> was doing, let
alone operators like <FONT SIZE="+1"><TT>()</TT></FONT>
and casts.  His verdict: Operator overloading and
its ilk are too powerful.  They are fine in theory,
but real languages should not provide so much freedom.
</p><p>
Some people don't like languages with features that
allow them to reconfigure how the language looks and
works.  I may have been in that group once, long ago,
but then I met Lisp and Smalltalk.  What wonderful
friends they were.  They opened themselves completely
to me; almost nothing was off limits.  In Lisp, most
everything was open to inspection, code was data that
I could process, and macros let me define my own syntax.
In Smalltalk, everything was an object, including the
integers and the classes and the methods.  Even better,
most of Smalltalk was implemented in Smalltalk, right
there for me to browse and mimic... and
<A HREF="http://www.cs.uni.edu/~wallingf/blog/archives/monthly/2005-11.html#e2005-11-05T14_14_59.htm">
   change</A>.
</p><p>
Once I was shown a world bigger than Fortran, PL/I, and
Pascal, I came to learn something important, something
Giles Bowkett
<A HREF="http://gilesbowkett.blogspot.com/2009/07/do-you-believe-in-magic.html">
   captures in his inimitable, colorful style</A>:
</p><p>
<BLOCKQUOTE><EM>
There is no such thing as metaprogramming.
It's all just programming.
</EM></BLOCKQUOTE>
</p><p>
(Note:  "Colorful" is a euphemism for "not safe to read
aloud at work, nor to be read by those with tender
sensibilities".)
</p><p>
Ruby fits nicely with languages such as Common Lisp,
Scheme, and Smalltalk.  It doesn't erect too many
boundaries around what you can do.  The result can be
disorienting to someone coming from a more mainstream
language such as Java or C, where boundaries between
"my program" and "the language" are so much more common.
But to Lispers, Schemers, and Smalltalkers, the freedom
feels... free.  It empowers them to express their ideas
in code that is direct, succinct, and powerful.
</p><p>
Actually, when you program in C, you learn the same
lesson, only in a different way.  It's all just
programming.  Good C programmers often implement their
own little interpreters and their own higher-order
procedures as a part of larger programs.  To do so,
they simply create their own data structures and code
to manipulate them.  This truth is the raw material out
of which
<A HREF="http://philip.greenspun.com/research/">
   Greenspun's Tenth Rule of Programming</A>
springs.  And that's the point.  In languages like C,
if you want to use more powerful features, and you
will, you <EM>have to roll them for yourself</EM>.  My
friends who are "C weenies" -- including the
aforementioned colleague -- take great pride in their
ability to solve any problem with just a bit more
programming, and they love to tell us the stories
</p><p>
Metaprogramming is not magic.  It is simply another tool
in the prepared programmer's toolbox.  It's awfully nice
when that tool is also part of the programming language
we use.  Otherwise, we are limited in what we can say
conveniently in our programs by the somewhat arbitrary
lines drawn between real and meta.
</p><p>
You know what?  Almost everything in programming looks
like magic to me.  That may seem like an overstatement,
but it's not.  When I see a program of a few thousand
lines or more generate music, play chess, or even do
mundane tasks like display text, images, and video in
a web browser, I am amazed.  When I see one program
convert another into the language of a particular
machine, I am amazed.  When people show me shorter
programs that can do these things, I am even more
amazed.
</p><p>
The beauty of computer science is that we dig deeper
into these programs, learn their ideas, and come to
understand how they work.  We also learn how to write
them ourselves.
</p><p>
It may still feel like magic to me, but in my mind I
know better.
</p><p>
Whenever I bump into a new bit of sorcery, a new
illusion or a new incantation, I know what I need to
do.  I need to learn more about how to write programs.</p>]]></description>
</item>
<item rdf:about="http://www.cs.uni.edu/~wallingf/blog/archives/monthly/2009-10.html#e2009-10-30T16_31_52.htm">
<link>http://www.cs.uni.edu/~wallingf/blog/archives/monthly/2009-10.html#e2009-10-30T16_31_52.htm</link>
<title>Writing to Learn, Book-Style</title>
<dc:date>2009-10-30T16:31:52-06:00</dc:date>
<dc:creator>Eugene Wallingford</dc:creator>
<dc:subject>Teaching and Learning, Software Development, General</dc:subject>
<description><![CDATA[<p>I know all about the idea of "writing to learn".  It
is one of the most valuable aspects of this blog for
me.  When I first got into academia, though, I was
surprised to find how many books in the software
world are written by people who are far from experts
on the topic.  Over the years, I have met several
serial authors who pick a topic in conjunction with
their publishers and go.  Some of these folks write
books that are successful and useful to people.
Still the idea has always seemed odd.
</p><p>
In the last few months, I've seen several articles
in which authors talk about how they set out to write
a book on a topic they didn't know well or even much
at all.  Last summer, Alex Payne wrote
<A HREF="http://al3x.net/2009/07/07/the-tapir-book.html">
   this about writing the tapir book</A>:
</p><p>
<BLOCKQUOTE><EM>
I took on the book in part to develop a mastery of Scala,
and I've looked forward to learning something new every
time I sit down to write, week after week.  Though I
understand more of the language than I did when I started,
I still don't feel that I'm on the level of folks like
David Pollak, Jorge Ortiz, Daniel Spiewak, and the rest of
the Scala gurus who dove into the language well before Dean
or I.  Still, it's been an incredible learning experience
...
</EM></BLOCKQUOTE>
</p><p>
Then today I ran across Noel Rappin's
<A HREF="http://railsrx.wordpress.com/2009/10/30/pragprowrimon/">
   essay about PragProWriMo</A>:
</p><p>
<BLOCKQUOTE><EM>
I'm also completely confident in this statement -- if you
are willing to learn new things, and learn them quickly,
you don't need to be the lead maintainer and overlord to
write a good technical book on a topic.  (Though it does
help tremendously to have a trusted super-expert as a
technical reference.)
</p><p>
Pick something that you are genuinely curious about and
that you want to understand really, really well.  It's
painful to write even a chapter about something that
doesn't interest you.
</EM></BLOCKQUOTE>
</p><p>
This kind of writing to learn is still not a part of my
mentality.  I've certainly chosen to teach courses in
order to learn -- to have to learn -- something I want
to know, or know better.  For example, I didn't know any
PHP to speak of, so I gladly took on a
<A HREF="http://www.cs.uni.edu/~wallingf/blog/archives/monthly/2008-04.html#e2008-04-05T11_40_12.htm">
   5-week course</A>
introducing PHP as a scripting language.  But I have a
respect for books, perhaps even a reverence, that makes
the idea of publishing one on a subject I am not expert
in unpalatable.  I have to much respect for the people
who might read it to waste their time.
</p><p>
I'm coming to learn that this probably places an unnecessary
limit on myself.  Articles like Payne's and Rappin's
remind me that I can study something and become expert
enough to write a book that is useful to others.  Maybe
it's time to set out on that path.
</p><p>
Getting people to take this step is one good reason to
heed the call of
<A HREF="http://www.pragprog.com/news/pragprowrimo-git-cast-mastering-rubyrails">
   Pragmatic Programmers Writing Month</A>
(PragProWriMo), which is patterned after the more generic
<A HREF="National Novel Writing Month">
   NaNoWriMo</A>
(NaNoWriMo).  Writing is like anything else: we can
develop a habit that helps us to produce material
regularly, which is a first and necessary step to ever
producing <EM>good</EM> material regularly.  And if
<A HREF="http://www.spring.org.uk/2009/09/how-long-to-form-a-habit.php">
   research results on forming habits</A>
is right, we probably need a couple of months of
daily repetitions to form a habit we can rely on.
</p><p>
So, whether it's a book or blog you have in mind, get
to writing.
</p><p>
(Oh, and you really should click through the link in
Rappin's essay to Merlin Mann's
<A HREF="http://www.kungfugrippe.com/post/169873399/clackity-noise">
   Making the Clackity Noise</A>
for a provocative -- if salty -- essay on why you should
write.  From there, follow the link to Buffering, where
you will find a video of drummer Sonny Payne playing an
extended solo for Count Basie's orchestra.  It is simply
remarkable.)</p>]]></description>
</item>
<item rdf:about="http://www.cs.uni.edu/~wallingf/blog/archives/monthly/2009-10.html#e2009-10-29T16_19_31.htm">
<link>http://www.cs.uni.edu/~wallingf/blog/archives/monthly/2009-10.html#e2009-10-29T16_19_31.htm</link>
<title>Empirical Data about Software Practices</title>
<dc:date>2009-10-29T16:19:31-06:00</dc:date>
<dc:creator>Eugene Wallingford</dc:creator>
<dc:subject>Software Development</dc:subject>
<description><![CDATA[<p>I was happy to come across Greg Wilson's talk,
<A HREF="http://www.slideshare.net/gvwilson/bits-of-evidence-2338367">
   Bits of Evidence</A>,
on empirical data in software engineering.  When I started
preparing to teach software engineering last summer, I
looked for empirical data to support some of the claims
that we make about building software.  I wasn't all that
successful.  I figured that either I wasn't looking hard
enough, or there wasn't much.  The answer probably lies
somewhere in the middle.
</p><p>
Someone could do the SE world a great service by gathering,
organizing, and providing links to all the good work that
has been done.  Wilson is one of the people I turn to for
pointers to empirical SE results.
</p><p>
I did have fun reading some classic old work in this area.
One is McCabe's
<A HREF="http://www.literateprogramming.com/mccabe.pdf">
   original article</A>
on cyclomatic complexity.  This is very cool and has a nice
tie to theory, but it simply describes a metric.  It does
not gather present data from real programs against which
the metric has applied, and it doesn't provide any base
line for comparison.  When he speaks of 10 as a reasonable
upper bound for a module's cyclomatic complexity, or of
code with cyclomatic complexity in the 3-7 range as "quite
well structured", I wonder "Why?"  He drew these values
from experience looking at production code available to
him, but these numbers feel a bit unreliable.
</p><p>
I'm not a stickler who needs statistically significant
analysis of carefully collected data, though.  I like
to learn from experience that is gathered and presented
qualitatively.  I enjoyed reading about an informal
experiment into the
<A HREF="http://peripateticaxiom.blogspot.com/2006/05/complexity-and-test-first-0.html">
   complexity of code developed test-first</A>.
We need to be careful to take the results with a grain
of salt, given the informality of the definitions and
methodology used, but the experiment seems to say
something useful.  I also liked Martin Fowler's
<A HREF="http://martinfowler.com/bliki/DynamicTypeCheck.html">
   reflective analysis</A>
of dynamic type checking in production Ruby code from
ThoughtWorks.  He also wrote an interesting reflection
on
<A HREF="http://www.martinfowler.com/articles/rubyAtThoughtWorks.html">
   Ruby at ThoughtWorks</A>
that I learned from.
</p><p>
Still, we need more of the sort of empirical evidence
that Wilson offers in his talk.  As a discipline, we
can do a better job of paying attention to the validity
of our claims, and of more frequently asking, "Data,
please!"</p>]]></description>
</item>
<item rdf:about="http://www.cs.uni.edu/~wallingf/blog/archives/monthly/2009-10.html#e2009-10-27T21_47_10.htm">
<link>http://www.cs.uni.edu/~wallingf/blog/archives/monthly/2009-10.html#e2009-10-27T21_47_10.htm</link>
<title>William Cook on Industry and Academia</title>
<dc:date>2009-10-27T21:47:10-06:00</dc:date>
<dc:creator>Eugene Wallingford</dc:creator>
<dc:subject>Computing, Software Development</dc:subject>
<description><![CDATA[<p>I really enjoyed reading the text of William Cook's
<A HREF="http://wcook.blogspot.com/2009/10/ecoop-2009-banquet-speech.html">
   banquet speech at ECOOP 2009</A>.
When I served as tutorials chair for
<A HREF="http://www.oopsla.org/2006/">
   OOPSLA 2006</A>,
Cook was program chair, and that gave me a chance
to meet him and learn a bit about his background.
He has an interesting career story to tell.  In
this talk, he tells us this story as a way to
compare and contrast computer science in academia
and in industry.  It's well worth a read.
</p><p>
As a doctoral student, I thought my career path
might look similar to Cook's.  I applied for
research positions in industry, with two of the
Big Six accounting firms and with an automobile
manufacturer, at the same time I applied for
academic positions.  In the end, after years of
leaning toward industry, I decided to accept a
faculty position.  As a result, my experience with
industrial CS research and development is limited
to summer positions and to interactions throughout
grad school.
</p><p>
Cook's talk needs no summary; you should read it
for yourself.  Here are a few points that stood
out to me as I read:
</p><p>
<BLOCKQUOTE><EM>
Venture capitalists talk about pain killers versus
vitamins.  A vitamin is a product that might make
you healthier over the long run, but it's hard to
tell.  Pain killers are products where the customer
screams "give it to me now" and asks what it costs
later.  Venture capitalists only want to fund pain
killers.
</EM></BLOCKQUOTE>
</p><p>
This is true not only of venture capitalists, but
of lots of people.  As a professor, I recognize
this in myself and in my students all of the time.
Cook points out that most software development tools
are vitamins.  So are many of the best development
practices.  We need to learn tools and practices
that will make us most productive and powerful in
the long run, but without short-term pain we may
not generate the resolve to do so.
</p><p>
<BLOCKQUOTE><EM>
We read all the standard references on OO for
business applications.  It didn't make sense to us.
We started investigating model-driven development
styles.  We created modeling languages for data,
user interfaces, security and workflow.  These four
aspects are the core of any enterprise application.
We created interpreters to run the languages, and
our interpreters did many powerful optimizations by
weaving together the different aspects.
</EM></BLOCKQUOTE>
</p><p>
To me, this part of the talk exemplifies best how
a computer scientist thinks differently than a
non-computer scientist, whether experienced in
software development or not.  Languages are tools
we create to help us solve problems, not merely
someone else's solutions we pluck off the shelf.
Language processors are tools we create to make
our languages come to life in solving instances
of actual problems.
</p><p>
<BLOCKQUOTE><EM>
The way I see it is that industry generally has
more problems than they do solutions, but academia
often has more solutions than problems.
</EM></BLOCKQUOTE>
</p><p>
Cook makes a great case for a bidirectional flow
between industry, with its challenging problems in
context, and academia, with its solutions built of
theory, abstraction, and design.  This transfer can
be mutually beneficial, but it is complicated by
context:
</p><p>
<BLOCKQUOTE><EM>
Industrial problems are often messy and tied to
specific technical situations or domains.  It is
not easy to translate these complex problems into
something that can be worked on in academia.  This
translation involves abstraction and selection.
</EM></BLOCKQUOTE>
</p><p>
The challenge is greatest when we then take
solutions to problems abstracted from real-world
details and selected for interestingness more than
business value and try to re-inject them into the
wild.  Too often, these solutions fail to take hold,
not because people in industry are "stupid or timid"
but because <EM>the solution doesn't solve their
problem</EM>.  It solves an ideal problem, not a
real one.  The translation process from research to
development requires a finishing step that people
in the research lab often have little interest in
doing and that people in the development studio have
little time to implement.  The result is a disconnect
that can sour the relationship unnecessarily.
</p><p>
Finally, the talk is full of pithy lines that I hope
to steal and use to good effect sometime soon.  Here
is my favorite:
</p><p>
<BLOCKQUOTE><EM>
Simplicity is not where things start.  ...  It is
where they end.
</EM></BLOCKQUOTE>
</p><p>
Computer scientists seek simplicity, whether in
academia or in industry.  Cook gives us some clues
in this talk about how people in these spheres can 
understand one another better and, perhaps, work
better together toward their common goal.</p>]]></description>
</item>
<item rdf:about="http://www.cs.uni.edu/~wallingf/blog/archives/monthly/2009-10.html#e2009-10-27T06_57_39.htm">
<link>http://www.cs.uni.edu/~wallingf/blog/archives/monthly/2009-10.html#e2009-10-27T06_57_39.htm</link>
<title>Two Thumbs Up for &quot;On the Road for Education&quot;</title>
<dc:date>2009-10-27T06:57:39-06:00</dc:date>
<dc:creator>Eugene Wallingford</dc:creator>
<dc:subject>Running</dc:subject>
<description><![CDATA[<p>I don't usually advertise much in this space, but
I have to put in a positive word for the
<A HREF="http://www.ontheroad4edu.org/">
   On the Road for Education</A>
marathon, which I
<A HREF="http://www.cs.uni.edu/~wallingf/blog/archives/monthly/2009-10.html#e2009-10-26T15_23_47.htm">
   ran this weekend</A>.
Actually, the event is a set of races: a full
marathon, a half marathon, a 10K, and a 5K.  They
are organized as a fundraiser for Mason City's
parochial school system.
</p><p>
I signed up for this race in large part because it
let me keep my options open as late as possible.
I started training late and wasn't sure I'd be
ready for an October marathon.  On the Road for
Education was later than most midwest marathons,
October 25, and had a late early registration
date.  It also was less expensive than other,
better-known races.  All of these added up to an
attractive package for an unsure trainer.  They
also left me uncertain; I had no idea what to
expect from the race or organization.
</p><p>
This was a great little marathon.  It is super
small by the standard of most well-known marathons
these days.  This year, 78 men and 25 women finished,
with only one runner who started not finishing.
Add in the 101 half-marathoners, 35 10K runners,
and 78 5K runners, and the event is still super
small.  That creates an intimate setting, as well
as an opportunity to run a lot of the race solo.
</p><p>
The trimmings of the race were all good and better
than I hoped:
<UL>
<LI> Aid stations every two miles offered water and
     sport drink.  </LI>
<LI> Aid stations at miles 12, 18, and 22 offered
     energy gel.  </LI>
<LI> There were more portalets than advertised.  </LI>
<LI> There more local spectators out cheering us on
     than I had expected in such a small town, and
     on such a cold morning.  </LI>
<LI> We ran on a variety of surfaces, including many
     miles of soft surface: packed dirt in the country,
     bike trails, and a few miles of off-road trail.
     This was great for my legs.  </LI>
<LI> We ran in a variety of settings, including city
     roads, country roads, bike trails, recreation
     trails in town, and nature trail.  </LI>
<LI> The volunteers working along the course, including
     the police officers patrolling the intersections,
     were unfailingly friendly and helpful.  </LI>
<LI> The end-of-race food and drink were plentiful,
     various, and tasty.  </LI>
<LI> Finally, the high school was open after the race
     with hot showers and towel service.  Awesome!  </LI>
</UL>
</p><p>
In addition, the race hotel was excellent and happy to
serve the runners from out of town.
</p><p>
The one risk you face with this race is one the organizers
cannot control: the weather.  The last weekend of October
in northern Iowa can be dicey.  We were lucky, with temps
in the 40s F. and clouds to keep the heat down at the
end of the race.
</p><p>
This was the 11th year for the On the Road for Education
marathon.  These folks have experience putting on a race,
and it showed.  I give it two two thumbs up and recommend
it highly for an intimate, personal marathon experience.
If you want the experience of a "spectacle marathon",
look elsewhere.  This one isn't about tens of thousands
of spectators or bands playing at every mile.  It's about
the run.
</p><p>
One final warning: don't expect a course built for PRs.
Eleven of the miles were net climbs, with steep rises
during miles 6, 7, and 21.  Eleven of the miles were
net drops, and the rest of the course is flat.  But even
that is deceptive.  Miles 15-19 show as flat on the
course elevation map, but they were in a nature area.
They might be net neutral, but they undulate throughout.
This makes for interesting running!  Just don't expect
a flat Iowa course and an easy PR.</p>]]></description>
</item>
<item rdf:about="http://www.cs.uni.edu/~wallingf/blog/archives/monthly/2009-10.html#e2009-10-26T15_23_47.htm">
<link>http://www.cs.uni.edu/~wallingf/blog/archives/monthly/2009-10.html#e2009-10-26T15_23_47.htm</link>
<title>That Marathon Feeling Again</title>
<dc:date>2009-10-26T15:23:47-06:00</dc:date>
<dc:creator>Eugene Wallingford</dc:creator>
<dc:subject>Running</dc:subject>
<description><![CDATA[<p>I made it.  My sixth marathon is now in the books.
Yesterday I ran the
<A HREF="http://www.ontheroad4edu.org/">
   On the Road for Education marathon</A>
in Mason City, Iowa.  No two marathons have been
the same for me, and this one was unusual in many
ways, from how the race went to the venue itself.
</p><p>
The weather was dreary but almost perfect for a
race: in the low 40s, cloudy, with little wind.
</p><p>
After feeling good with an 8:30/mile pace in a half
marathon
<A HREF="http://www.cs.uni.edu/~wallingf/blog/archives/monthly/2009-09.html#e2009-09-13T14_06_38.htm">
   six weeks ago</A>,
I decided to try that pace for the full.  After
nine miles, I was right on target, though by an
unusual path.  The first three miles were downhill
and fast, the next three were uphill and slower,
and the next three were flatter and down in a steady
25:30.
</p><p>
My time at the halfway mark was 1:51:51.  After
fifteen miles, I was at 2:07:36 -- still on an
8:30/mile pace.  It seemed too good.  I need to look
up my times from previous races, but I think that
these may be my best times ever at those two points
in a marathon.
</p><p>
On top of it all, I felt good.  At the Mile 15, I
thought to myself, "I can do this."  And I could,
but not at that pace.
</p><p>
By mile 15, we had entered a 5-mile loop on soft
trail through the
<A HREF="http://www.limecreeknature.org/">
   Lime Creek Nature Center</A>.
My pace slowed for at least three reason.  The
<A HREF="http://www.ontheroad4edu.org/elevation.htm">
   course elevation map</A>
says this part of the race is flat, but that must
be net rise.  These miles were hilly.  Add to that
the overnight rain which had softened them up even
more and created a little bit of mud for us.
Slippery footing on hills means a slower pace.
</p><p>
The third ingredient was a dose of reality.  My legs
weren't quite ready to maintain the ambitious pace
for a full marathon.  I did manage a couple of miles
at near-goal pace after leaving the nature center,
but in general I had slowed down.  I took a second
restroom break at the 20-mile mark, which added more
than a minute to my time but gave my legs a brief
respite.
</p><p>
Then came miles 23, 24, and 25.  My legs were dead,
and my pace slowed further.  I had another short
reprieve when a half dozen of us experienced our own
<A HREF="http://www.desmoinesregister.com/article/20091018/SPORTS14/91018007">
   Des Moines moment</A>
in Mile 23.  For a while in the last two miles, I
chanted to myself
<A HREF="http://www.cs.uni.edu/~wallingf/blog/archives/monthly/2009-09.html#e2009-09-05T15_10_44.htm">
   just keep running</A>.
For some reason I had the strongest of desires not to
walk even as my body had the strongest desire to stop.
Somehow I kept moving.  I never reached what one of
my friend's calls "the dead man's shuffle", but my
pace had slowed dramatically.
</p><p>
The last 0.2 of a mile snuck up on me.  I felt a
brief boost of energy as I crossed the Mile 26 marker
and managed to run through the finish line with a
smile on my face.
</p><p>
It was a tough finish.  In retrospect should have gone
out with 8:45 miles for 10, 15, or 20 miles and then
taken stock of what I had left.  That would have been
the conservative approach, the wise strategy.  But the
siren call of 8:30 miles and a time near
<A HREF="http://www.cs.uni.edu/~wallingf/blog/archives/monthly/2004-10.html#e2004-10-17T15_23_52.htm">
   my PR</A>
was too much for my dreams, or my vanity.  I had to
know.  Now I do!  Going into the arena has a way of
showing us reality.
</p><p>
This race was unusual for me in another respect.  My
wife and daughters made the trip with me.  This was
the first time I'd had family with me since my wife
accompanied me to
<A HREF="http://www.cs.uni.edu/~wallingf/personal/chicago-marathon/">
   my first</A>.
They met me along the route a half dozen times or so,
and seeing them boosted my spirits every time.  It
was easy for them to do this, which is one of the
benefits of a race in a small town.  I'll have more
to say about a small town race in a coming entry.
</p><p>
So, I survived.  Even with the rest stops, I ended up
with my third-best time ever.  After my experience the
last two years, with dicey health, on-again, off-again
training, and the mental doubts that came from those
two, I really could not be happier with my time.
Asking for more would be unrealistic and would devalue
what turned out to be a good performance.
</p><p>
I could feel better physically, though.  A few days'
rest can give me that.  Heck, I already feel like a
short jog!</p>]]></description>
</item>
<item rdf:about="http://www.cs.uni.edu/~wallingf/blog/archives/monthly/2009-10.html#e2009-10-23T15_11_49.htm">
<link>http://www.cs.uni.edu/~wallingf/blog/archives/monthly/2009-10.html#e2009-10-23T15_11_49.htm</link>
<title>Universal Ideas of Harmonious Design</title>
<dc:date>2009-10-23T15:11:49-06:00</dc:date>
<dc:creator>Eugene Wallingford</dc:creator>
<dc:subject>Computing, Software Development</dc:subject>
<description><![CDATA[<p>I didn't write
<A HREF="http://profile.typepad.com/6p0120a5a08463970b">
   this comment</A>
on the blog entry
<A HREF="http://www.presentationzen.com/presentationzen/2009/09/wa-the-key-to-clear-design.html">
   Wa: The key to clear, harmonious design</A>:
</p><p>
<BLOCKQUOTE><EM>
I know that you are talking about visual design,
but I am struck by how this approach applies to
many other domains.
</EM></BLOCKQUOTE>
</p><p>
But I could have.
</p><p>
I started university life intending to become an architect,
and my interest in visual design has remained strong
through the years.  I was delighted when I learned of
Christopher Alexander's influence on some in the software
world, because it gave me more opportunities to read and
think about architectural design -- and to think about
how its ideas relate to how we design software.  I am
quite interested in the notion that there are universal
truths about design, and even if not what we can learn
from designers in other disciplines.
</p><p>
Garr Reynolds identifies seven principles of the Zen
aesthetic of harmony.  Like the commenter, my thoughts
turned quickly from the visual world to another domain.
For me, the domain is software.  How well do these
principles of harmony apply to software?  Several are
staples of software design.  Others require more
thought.
</p><p>
<BLOCKQUOTE><EM>
(1) Embrace economy of materials and means <BR/>
(3) Keep things clean and clutter-free
</EM></BLOCKQUOTE>
</p><p>
These are no-brainers.  Programmers want to keep their
code clean, and most prefer an economical style, even
when using a language that requires more overhead than
they would like.
</p><p>
<BLOCKQUOTE><EM>
(6) Think not only of yourself, but of the other (e.g., the viewer).
</EM></BLOCKQUOTE>
</p><p>
When we develop software, we have several kinds of
others to consider.  The most obvious are our users.
We have disciplines, such as human-computer interaction,
and development styles, such as user-centered design,
focused squarely on the people who will use our programs.
</p><p>
We also need to think of other programmers.  These are
the people who will read our code.  Software usually
spends much more time in maintenance than in creation,
so readability pays off in a huge way over time.  We
can help our readers by writing good documentation, an
essential complement to our programs.  However, the
best way to help our readers is to <EM>write readable
code</EM>.  In this we are more like Reynolds's presenters.
We need to focus on the clarity and beauty of our primary
product.
</p><p>
Finally, let's not forget our customers and our clients,
the people who pay us to write software.  To me, one of
the most encouraging contributions of XP was its emphasis
on delivering tangible value to our customers every day.
</p><p>
<BLOCKQUOTE><EM>
(7) Remain humble and modest.
</EM></BLOCKQUOTE>
</p><p>
This is not technical advice.  It is human advice.  And I
think it is underrated in too many contexts.
</p><p>
I have worked with programmers who were not humble enough.
Sadly, I have been that programmer, too.
</p><p>
A lack of humility almost always hurts the project and
the team.  Reynolds is right in saying that true confidence
follows from humility and modesty.  Without humility,
a programmer is prone to drift into arrogance, and
<A HREF="http://teddziuba.com/2009/09/i-read-fred-wilsons-blog.html">
   arrogance is more dangerous than incompetence</A>.
</p><p>
A programmer needs to balance humility against gumption,
the hubris that empowers us to tackle problems which seem
insurmountable.  I have always found that humility is
a great asset when I have the gumption to tackle a big
problem.  Humility keeps me alert to things I don't
understand or might not see otherwise, and it encourages
me to take care at each step.
</p><p>
...  Now come a couple of principles that cause me to
thing harder.
</p><p>
<BLOCKQUOTE><EM>
(2) Repeat design elements.
</EM></BLOCKQUOTE>
</p><p>
Duplication is a bane to software developers.  We long
ago recognized that repetition of the same code creates
so many problems for writing and modifying software that
we have coined maxims such as "Don't repeat yourself"
and "Say it one once and only once."  We even create
acronyms such as DRY to get the idea across in three
spare letters.
</p><p>
However, at another level, repetition is unavoidable.
A stack is a powerful way to organize and manipulate
data, so we want to use one whenever it helps.  Rather
than copy and paste the code, we create an abstract
data type or a class and reuse the component by
instantiating it.
</p><p>
Software reuse of this sort is how programmers repeat
design elements.  Indeed, one of the most basic ideas
in all of programming is the procedure, an abstraction
of a repeated behavioral element.  It is fundamental
to all programming, and one of the contributions that
computer science made as we moved away from our roots
in mathematics.
</p><p>
In the last two decades, programmers have begun to
embrace repeatable design units at higher levels.
Design patterns recur across contexts, and so now we
do our best to document them and share them with others.
Architectures and protocols and, yes, even our languages
are ways to reify recurring patterns in a way that makes
using them as convenient as possible.
</p><p>
<BLOCKQUOTE><EM>
(4) Avoid symmetry.
</EM></BLOCKQUOTE>
</p><p>
Some programmers may look at this principle and say,
"Huh?  How can this apply?  I'm not even sure what it
means in the context of software."
</p><p>
When linguistic structures and data structures repeat,
they repeat just as they are, bringing a natural
symmetry to the algorithms we use and the code we
write.  But at the level of design patterns and
architectures, things are not so simple.  Christopher
Alexander, the building architect who is the
intellectual forefather of the software patterns
community, famously said that a pattern appears a
million times, but never exactly the same.  The pattern
is molded to fit the peculiar forces at play in each
system.  This seems to me a form of breaking symmetry.
</p><p>
But we can take the idea of avoiding symmetry farther.
In the mathematical and scientific communities, there
has long been a technical definition of symmetry in
groups, as well as a corresponding definition of
breaking symmetry in patterns.  Only a few people in
the software community have taken this formal step
with design patterns.  Chief among them are Jim Coplien
and Liping Zhao.  Check out their book chapter,
<A HREF="http://www.springerlink.com/content/1bmlnjucaqhvg6qw/">
   Symmetry Breaking in Software Patterns</A>,
if you'd like to learn more.
</p><p>
A few years ago I was able to spend some time looking
at this paper and at some of the scientific literature
on patterns and symmetry breaking.  Unfortunately, I
have not been able to return to it since.  I don't yet
fully understand these ideas, but I think I understand
enough to see that there is something important here.
This glimmer convinces me that avoiding symmetry is
perhaps an important principle for us software designers,
one worthy of deeper investigation.
</p><p>
...  This leaves us with one more principle from the
Presentation Zen article:
</p><p>
<BLOCKQUOTE><EM>
(5) Avoid the obvious in favor of the subtle
</EM></BLOCKQUOTE>
</p><p>
This is the one principle out of the seven that I think
does not apply to writing software.  All other things
being equal, we should prefer the obvious to the
subtle.  Doing something that isn't obvious is the
single best reason to write a comment in our code.
When we must do something unexpected by our readers, we
must tell them what we have done and <EM>why</EM>.
Subtlety is an impediment to understanding code.
</p><p>
Perhaps this is a way in which we who work in software
differ from creative artists.  Subtlety can enhance a
work of art, by letting -- even requiring -- the mind
to sense, explore, and discover something beyond the
surface.  As much art as there is in good code, code is
at its core a functional document.  Requiring
maintenance programmers to mull over a procedure and to
explore its hidden treasures only slows them down and
increases the chances that they will make errors while
changing it.
</p><p>
I love subtlety in algorithms and designs, and I think
I've learned a lot from reading code that engages me
in a way I've not experienced before.  But there is
something dangerous about code in which subtlety becomes
more important than what the program does.
</p><p>
Blaine Buxton recently wrote a nice entry on the idea of
<A HREF="http://blog.blainebuxton.net/2009/10/devilishly-clever.html">
   devilishly clever code</A>:
</p><p>
<BLOCKQUOTE><EM>
But, it got me thinking about clever and production code.
In my opinion, clever is never good or wanted in production
code.  It's great to learn and understand clever code,
though.  It's a great mental workout to keep you sharp.
</EM></BLOCKQUOTE>
</p><p>
Maybe I am missing something subtle here; I've been
accused of not seeing nuance before.  This may be like
the principle of avoiding symmetry, but I haven't
reached the glimmer of understanding yet.  Certainly,
many people speak of Apple's great success with subtle
design that engages and appeals to users in a way that
other design companies do not.  Others, though attribute
its success to creating products that are intuitive to
use.  To me, intuitiveness points more to obviousness
and clarity than to subtlety.  And besides, Apple's
user experience is at the level of design Reynolds is
talking about, not at the level of code.
</p><p>
I would love to hear examples, pro and con, of subtlety
in code.  I'd love to learn something new!</p>]]></description>
</item>
<item rdf:about="http://www.cs.uni.edu/~wallingf/blog/archives/monthly/2009-10.html#e2009-10-22T16_00_29.htm">
<link>http://www.cs.uni.edu/~wallingf/blog/archives/monthly/2009-10.html#e2009-10-22T16_00_29.htm</link>
<title>Local Boys Succeed in Gaming Industry</title>
<dc:date>2009-10-22T16:00:29-06:00</dc:date>
<dc:creator>Eugene Wallingford</dc:creator>
<dc:subject>General</dc:subject>
<description><![CDATA[<p>I went last night to see a talk by Aaron Schurman,
co-founder and CEO of
<A HREF="http://www.phantomefx.com/">
   Phantom EFX</A>.
Phantom is a homegrown local company that makes
video games.  The talk told the story of their
latest and most ambitious release,
<A HREF="http://www.darkestofdays.com/">
   Darkest of Days</A>,
a first-person shooter game built around historic
narratives and a time-travel hook.
</p><p>
Phantom got its start with casino games.  They started
from scratch, with no training in software development.
Part of the team did have background in graphic design,
which gave them a foundation to build on.  In the last
decade, they have became serious players in the market,
with several top-selling titles.
</p><p>
I'm am not a "computer gamer" and rarely ever play the
sort of games that are so popular with students these
days.  But as a computer scientists, I am interested
in them as programs.  Nearly every game these days
requires artificial intelligence, both to play the
game and, in character-based games, to provide
realistic agents in the simulated world.  My background
in AI made me a natural local resource to the company
when they were getting started.  As a result, I have
had the good fortune to be a long-time friend of the
company.
</p><p>
Aaron's talk was like the game; it had something for
almost everyone: history, creative writing, art,
animation, media studies, and computer science.  The
CS is not just AI, of course.  A game at this level
of scale is a <EM>serious</EM> piece of software.  The
developers faced a number of computational constraints
in filling a screen with a large number of realistic
humans and while maintaining the frame rate required
for an acceptable video experience.  There were also
software development challenges, such as building for
multiple platforms in sync and working with contractors
distributed across the globe.  There is a lot to be
learned by conducting a retrospective of this project.
</p><p>
Aaron spoke a lot about the challenges they faced.
His response was the sort you expect from people who
succeed:  <EM>Don't be dismayed</EM>.  Do you think
you are too small or too poor to compete with the big
boys?  Don't be dismayed.  You can find a way, even
if it means rolling your own gaming engine because
the commercial alternatives are too expensive.  Don't
know how to do something?  Don't be dismayed.  You
simply don't know <EM>yet</EM>.  Work hard to learn.
Everyone can do that.
</p><p>
The practical side of me is glad that we are so close
to a company like this and have connections.  We've
recently begun exploring ways to place our students
at Phantom EFX for internships.  I love the idea of
running an iPhone development class to port some of
the company's games to that market.  This is a great
opportunity for the students, but also for professors!
</p><p>
The dreamer in me was inspired by this talk.  I am
always impressed when I meet people, especially
former students, who have a vision to build something
big.  This sort of person accepts risks and works hard.
The return on that investment can be huge, both monetarily
and spiritually.  I hope more of our students take stories
like this to heart and realize that
<A HREF="http://www.cs.uni.edu/~wallingf/blog/archives/monthly/2005-06.html#e2005-06-07T13_44_49.htm">
   entrepreneurship</A>
offers an alternative career path when they have ideas
and are willing to put their their work hours toward
something that they really care about.
</p><p>
At its bottom, this is the story of small-town Iowa
guys staying in small-town Iowa and building a new tech
company.  Now they have Hollywood producers knocking on
their doors, bidding to option their script and concept
for a major motion picture.  Not a bad way to make a
living.</p>]]></description>
</item>
</rdf:RDF>
