<html xmlns:v="urn:schemas-microsoft-com:vml" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns:m="http://schemas.microsoft.com/office/2004/12/omml" xmlns="http://www.w3.org/TR/REC-html40">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta name="Generator" content="Microsoft Word 15 (filtered medium)">
<style><!--
/* Font Definitions */
@font-face
        {font-family:"Cambria Math";
        panose-1:2 4 5 3 5 4 6 3 2 4;}
@font-face
        {font-family:Aptos;
        panose-1:2 11 0 4 2 2 2 2 2 4;}
@font-face
        {font-family:"Apple Color Emoji";
        panose-1:0 0 0 0 0 0 0 0 0 0;}
@font-face
        {font-family:Consolas;
        panose-1:2 11 6 9 2 2 4 3 2 4;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
        {margin:0in;
        font-size:12.0pt;
        font-family:"Aptos",sans-serif;}
p.MsoHeader, li.MsoHeader, div.MsoHeader
        {mso-style-priority:99;
        mso-style-link:"Header Char";
        margin:0in;
        font-size:12.0pt;
        font-family:"Aptos",sans-serif;}
p.MsoFooter, li.MsoFooter, div.MsoFooter
        {mso-style-priority:99;
        mso-style-link:"Footer Char";
        margin:0in;
        font-size:12.0pt;
        font-family:"Aptos",sans-serif;}
a:link, span.MsoHyperlink
        {mso-style-priority:99;
        color:blue;
        text-decoration:underline;}
pre
        {mso-style-priority:99;
        mso-style-link:"HTML Preformatted Char";
        margin:0in;
        margin-bottom:.0001pt;
        font-size:10.0pt;
        font-family:"Courier New";}
span.HTMLPreformattedChar
        {mso-style-name:"HTML Preformatted Char";
        mso-style-priority:99;
        mso-style-link:"HTML Preformatted";
        font-family:"Consolas",serif;}
span.EmailStyle22
        {mso-style-type:personal-reply;
        font-family:"Aptos",sans-serif;
        color:windowtext;}
span.HeaderChar
        {mso-style-name:"Header Char";
        mso-style-priority:99;
        mso-style-link:Header;
        font-family:"Aptos",sans-serif;}
span.FooterChar
        {mso-style-name:"Footer Char";
        mso-style-priority:99;
        mso-style-link:Footer;
        font-family:"Aptos",sans-serif;}
.MsoChpDefault
        {mso-style-type:export-only;
        font-size:10.0pt;
        mso-ligatures:none;}
/* Page Definitions */
@page
        {mso-endnote-separator:url("cid:header.htm\@01DA5B6A.3CDBF500") es;
        mso-endnote-continuation-separator:url("cid:header.htm\@01DA5B6A.3CDBF500") ecs;}
@page WordSection1
        {size:8.5in 11.0in;
        margin:1.0in 1.0in 1.0in 1.0in;
        mso-footer:url("cid:header.htm\@01DA5B6A.3CDBF500") f1;}
div.WordSection1
        {page:WordSection1;}
--></style><!--[if gte mso 9]><xml>
<o:shapedefaults v:ext="edit" spidmax="2050" />
</xml><![endif]--><!--[if gte mso 9]><xml>
<o:shapelayout v:ext="edit">
<o:idmap v:ext="edit" data="2" />
</o:shapelayout></xml><![endif]-->
</head>
<body bgcolor="white" lang="EN-US" link="blue" vlink="purple" style="word-wrap:break-word">
<div class="WordSection1">
<p class="MsoNormal"><span style="font-size:11.0pt">Hi Juan,<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt"><br>
Thank you for your thoughtful reply.  I don’t disagree with anything you said and I very much appreciate hearing your philosophy on changes.<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt"><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt">I just want to clarify one thing. I didn’t mean to suggest a high maintenance effort regarding the code versions. Ideally any concept of tracking compatibility would be somewhat automatic (the code was last
 developed on version x, etc) with the option of potentially tagging it later when an incompatibility is found. But even that wasn’t fully thought out.  Regardless, my intention was to share a somewhat outsider’s opinion about dangers of breaking changes and
 it was not to push for a specific solution.<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt"><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt">Jon<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt"><o:p> </o:p></span></p>
<div id="mail-editor-reference-message-container">
<div>
<div style="border:none;border-top:solid #B5C4DF 1.0pt;padding:3.0pt 0in 0in 0in">
<p class="MsoNormal" style="margin-bottom:12.0pt"><b><span style="color:black">From:
</span></b><span style="color:black">Cuis-dev <cuis-dev-bounces@lists.cuis.st> on behalf of Juan Vuletich via Cuis-dev <cuis-dev@lists.cuis.st><br>
<b>Date: </b>Friday, February 9, 2024 at 1:43</span><span style="font-family:"Arial",sans-serif;color:black"> </span><span style="color:black">PM<br>
<b>To: </b>Discussion of Cuis Smalltalk <cuis-dev@lists.cuis.st><br>
<b>Cc: </b>Juan Vuletich <juan@cuis.st>, Jon Raiford <raiford@labware.com><br>
<b>Subject: </b>Re: [Cuis-dev] [DEFECT] #copyFrom:count: for OrderedCollections<o:p></o:p></span></p>
</div>
<p class="MsoNormal">Hi Jon,<br>
<br>
It's nice to see you here. Welcome!<br>
<br>
On 2/9/2024 12:55 PM, Jon Raiford via Cuis-dev wrote: <o:p></o:p></p>
<blockquote style="margin-top:5.0pt;margin-bottom:5.0pt">
<div>
<div id="mail-editor-reference-message-container">
<div>
<p class="MsoNormal">Hi,<o:p></o:p></p>
<p class="MsoNormal"> <o:p></o:p></p>
<p class="MsoNormal">My obligatory “long time listener, first time caller”:  I joined the list about a year ago and have enjoyed reading the daily happenings even though I haven’t really contributed directly yet. I was offline recently and finally got a chance
 to catch up. Wow! There were more messages in the last couple weeks than I’ve seen on this list since I joined (combined, or at least it felt like that).<o:p></o:p></p>
<p class="MsoNormal"><span style="font-size:11.0pt"> </span><o:p></o:p></p>
<p class="MsoNormal"><span style="font-size:11.0pt">Anyway, I wanted badly to be upset with Juan’s change to OrderedCollection class>>new:. Generally speaking, I do think that peer/sibling classes should be allowed to implement the same method with very different
 behavior. Of course if the parent class also implements the method then it does seem reasonable that there are restrictions, and I do think that defining those rules is also reasonable. No I’m not going to suggest what those rules are
</span><span style="font-size:11.0pt;font-family:"Apple Color Emoji"">😊</span><o:p></o:p></p>
<p class="MsoNormal"><span style="font-size:11.0pt"> </span><o:p></o:p></p>
<p class="MsoNormal"><span style="font-size:11.0pt">The bigger issue seems to be with the concept of changing well established historical behavior. I assume we are all familiar with Python’s switch from v2 to v3. We know now that Python survived the version
 change and is very much thriving, but back when the change happened it wasn’t so sure that it would. Breaking changes are bad, especially when there is a lot of code out there that potentially will no longer work.</span><o:p></o:p></p>
</div>
</div>
</div>
</blockquote>
<p class="MsoNormal"><br>
Of course. The tension between moving forward and not wanting to break things is something every software system struggles with.<br>
<br>
On a Smalltalk system, where for any existing method there may be some external code potentially depending on it, the problem is harder. Strict, 100% percent back compatibility for every method means that almost no changes are possible. Only fixes for bad bugs
 and additions of new APIs are possible. We don't want that for Cuis. Cuis was started to enable evolution.<br>
<br>
<br>
<o:p></o:p></p>
<blockquote style="margin-top:5.0pt;margin-bottom:5.0pt">
<div>
<div id="mail-editor-reference-message-container">
<div>
<p class="MsoNormal"><span style="font-size:11.0pt"> </span><o:p></o:p></p>
<p class="MsoNormal"><span style="font-size:11.0pt">I think that was Gerald’s point about marking it as deprecated for a time and having the method log the soon to be invalid usage. It may be worth going a bit further than that and having a standard way to
 tag source code to say what version it was written in, or what versions it is compatible with. Then, if breaking changes are documented by version then you have a proactive way to look for code patterns that need to change. It may even be possible to make
 a tool to help with this. In this particular case, “OrderedCollection new:” should be easy enough to find.</span><o:p></o:p></p>
<p class="MsoNormal"><span style="font-size:11.0pt"> </span><o:p></o:p></p>
<p class="MsoNormal"><span style="font-size:11.0pt">Just my 2 cents as a bit of an outsider’s opinion.</span><o:p></o:p></p>
<p class="MsoNormal"><span style="font-size:11.0pt"> </span><o:p></o:p></p>
<p class="MsoNormal"><span style="font-size:11.0pt">Jon</span><o:p></o:p></p>
</div>
</div>
</div>
</blockquote>
<p class="MsoNormal"><br>
The approach we have been following with Cuis since it started is something like this:<br>
<br>
- Any change that is seen as an improvement can be done. Back compatibility is not guaranteed.<br>
<br>
- The possible consequences of each change are evaluated in an informal, intuitive way. This is augmented with 1.Running tests. 2.Reviewing code that could be affected. This can be done only if there are tests to run, and for client code that has been published.
 We can't do this with 3rd parties private code.<br>
<br>
- If it seems (yeah, this is fuzzy) that the change is risky, we don't hurry. We reach out to people that could be affected. We ask the community (via email) to review the changes, do their own evaluation of risks and give their opinion. This is not done often,
 but it is done sometimes.<br>
<br>
- In general, most changes are seen as "low risk" and we move ahead. Some changes are riskier, but the risk is seen as worth taking. Any affected code in the Cuis base image and all packages in repos in the Cuis-Smalltalk organization are updated. This may
 take a bit of time. Developers using Cuis for their projects may need to adapt their code.<br>
<br>
- All this is not perfect, or even well defined. We always try to improve.<br>
<br>
This approach has allowed Cuis to go through deep redesign of central parts of the system, including Strings, Characters, Floats, FileSystem and the whole Morphic system. A lot of code has broke, and was later updated. No one was left behind.<br>
<br>
However, there are reasons to believe this will be less and less of a problem in the future. Cuis is becoming more stable. After disruptive past changes like migration to Spur, TrueType and VectorGraphics and Unicode, the main objectives set for Cuis when it
 was started are finally a reality. I expect most interesting activity to happen in external packages and applications, not so much on the base image itself.
<br>
<br>
A recent initiative to alleviate these issues is the Stable Releases of Cuis. This means that projects concerned about compatibility can stay in the same Stable Release until they are ready to face change in the base system.<br>
<br>
Still, something like what you envision could be possible. In any case, I would not track the compatibility of all code over time. I think this would only make sense for a small set of classes and methods. For instance, many methods in kernel classes are intended
 to be used only by the kernel classes themselves, and are then "free to change". But we don't have the distinction between "public" and "private" in Smalltalk. So, how do we define this set?<br>
<br>
Other questions that come to mind. Who would be willing to spend a significant amount of effort in writing the specifications that should be honored over time? Should they be a document (like ANSI Smalltalk), a set of TestCases, some kind of MethodAnnotations?
 How long would it take until people say all this is only worth doing if compatibility between dialects is also considered, and this is not just for Cuis?<br>
<br>
Thanks,<br>
<br>
<o:p></o:p></p>
<pre>-- <o:p></o:p></pre>
<pre>Juan Vuletich<o:p></o:p></pre>
<pre>cuis.st<o:p></o:p></pre>
<pre><a href="http://github.com/jvuletich">github.com/jvuletich</a><o:p></o:p></pre>
<pre><a href="http://researchgate.net/profile/Juan-Vuletich">researchgate.net/profile/Juan-Vuletich</a><o:p></o:p></pre>
<pre><a href="http://independent.academia.edu/JuanVuletich">independent.academia.edu/JuanVuletich</a><o:p></o:p></pre>
<pre><a href="http://patents.justia.com/inventor/juan-manuel-vuletich">patents.justia.com/inventor/juan-manuel-vuletich</a><o:p></o:p></pre>
<pre><a href="http://linkedin.com/in/juan-vuletich-75611b3">linkedin.com/in/juan-vuletich-75611b3</a><o:p></o:p></pre>
<pre><a href="http://twitter.com/JuanVuletich">twitter.com/JuanVuletich</a><o:p></o:p></pre>
</div>
</div>
</div>
</body>
</html>