<div>Dear John,</div>
<div>&nbsp;</div>
<div>It is my belief that you have hit the imperative programming problem on the nail. There is, however, work that might be useful in making&nbsp;sense of what is going on for both the students and the instructor. To write/develop a function start with a specification ( 
i.e. preconditions for the input and a postcondition for the output and, yes, we can adapt for arguments passed by reference :-). As code is developed insert Hoare Logic-like assertions as comments&nbsp;between statements to describe the state of the computation. Very broadly, Precondition + code + assertions = Postcondition. This approach avoids &quot;leaving statements out&quot; and indicates why the order of statements is important. It takes time to get good at doing this in a classroom, but I have used it effectively in the past. 
</div>
<div>&nbsp;</div>
<div>The technique applied to Java has been polished by Doug Troeger of The City College of New York. You may want to contact him for ideas and sample course material.</div>
<div>&nbsp;</div>
<div>I hope this helps!</div>
<div>&nbsp;</div>
<div>Cheers,</div>
<div>&nbsp;</div>
<div>Marco<br>&nbsp;</div><br><br>
<div><span class="gmail_quote">On 5/11/07, <b class="gmail_sendername">John Clements</b> &lt;<a href="mailto:clements@brinckerhoff.org">clements@brinckerhoff.org</a>&gt; wrote:</span>
<blockquote class="gmail_quote" style="PADDING-LEFT: 1ex; MARGIN: 0px 0px 0px 0.8ex; BORDER-LEFT: #ccc 1px solid">I&#39;m hoping that others here can point me to existing work on this<br>topic, or help to refine this idea for me.
<br><br>I&#39;m teaching Java to first-year students, and we&#39;re about to walk off<br>a cliff and start programming imperatively.&nbsp;&nbsp;I&#39;ve done this<br>transition several times now, and it occurs to me that what&#39;s most
<br>irritating to me about the imperative style is the lack of &quot;flow&quot;.<br><br>What do I mean by flow?&nbsp;&nbsp;Simply that each expression produces a<br>result that is used by another expression.&nbsp;&nbsp;In imperative<br>programming, by contrast, I feel that I have a bunch of statements
<br>lying on the floor, and that their order is both important and<br>difficult to explain clearly.<br><br>Here&#39;s a simple example of the difference: take a functional<br>program.&nbsp;&nbsp;remove a subexpression.&nbsp;&nbsp;Does it still compile?&nbsp;&nbsp;Probably
<br>not. In contrast: take an imperative program.&nbsp;&nbsp;Remove a statement.<br>Does it still compile?&nbsp;&nbsp;Sure it does, and does the wrong thing.<br><br>This problem is inverted when we&#39;re talking about program<br>construction (the job of a programming teacher).&nbsp;&nbsp;How do I write a
<br>function?&nbsp;&nbsp;Well, in a functional program I can start &quot;at the top&quot;<br>with the outermost constructor for the result and proceed inward.<br>How do I know when I&#39;m done?&nbsp;&nbsp;Well,&nbsp;&nbsp;the program won&#39;t compile until
<br>I supply all of the pieces.&nbsp;&nbsp;To construct an imperative function, by<br>contrast--especially one of type void--I can simply write &quot;return;&quot;.<br>How do I know when I&#39;ve got all the pieces?&nbsp;&nbsp;I don&#39;t have a good
<br>answer here.<br><br>In fact, a better name for this might not be &quot;functional&quot;, but rather<br>&quot;algebraic,&quot; in the sense that program fragments are combined<br>algebraically to form programs.<br><br>
Once again; can anyone point me to existing work, or tell me that I&#39;m<br>wrong?<br><br>John Clements<br><br><br><br>_________________________________________________<br>For list-related administrative tasks:<br><a href="http://list.cs.brown.edu/mailman/listinfo/plt-scheme">
http://list.cs.brown.edu/mailman/listinfo/plt-scheme</a><br><br><br></blockquote></div><br>