<html><head><meta http-equiv="Content-Type" content="text/html charset=utf-8"></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" class=""><br class=""><div><blockquote type="cite" class=""><div class="">Le 12 juil. 2016 à 21:29, Jean-Denis Muys via swift-evolution &lt;<a href="mailto:swift-evolution@swift.org" class="">swift-evolution@swift.org</a>&gt; a écrit :</div><br class="Apple-interchange-newline"><div class=""><div dir="ltr" class=""><span class="im"><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">&nbsp; &nbsp; &nbsp; &nbsp; * What is your evaluation of the proposal?<br class=""></blockquote><div class=""><br class=""></div></span><span class="im"><div class="">I am strongly opposed to that proposal. I am mostly a lurker on this list, the volume of which I cannot cope with. However, I feel this proposal is important enough that I decided to invest more time than usual.</div><div class="">So I have read carefully the arguments presented here.</div><div class="">And I am still opposed to the proposal.</div><div class="">I believe no programmer, least of which myself, can be trusted with the decision to reliably decide ahead of time that this or that class cannot or will not be subclassed.</div></span></div></div></blockquote><div><br class=""></div><div>If you can’t trust a developer, how could you use its library ? Using third-party code involve some kind of trusting, as you would have to trust the developer to write reliable and efficient code, which is IMHO, far more important than knowing if the developer carefully choose what can be subclasses or not.</div><div><br class=""></div><div>And when you encounter a library where the dev choose to allow subclassing, you will have far more trust than the code was design to be subclassed.</div><div><br class=""></div><div>Some design patterns work better with subclassing than with protocol or delegation. So I’m confident than library developers will ‘open’ there classes if needed.</div><div><br class=""></div><blockquote type="cite" class=""><div class=""><div dir="ltr" class=""><span class="im"><div class="">So strong -1 for me.</div><div class="">&nbsp;</div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">&nbsp; &nbsp; &nbsp; &nbsp; * Is the problem being addressed significant enough to warrant a change to Swift?<br class=""></blockquote><div class=""><br class=""></div></span><div class="">I don't think the problem is a problem at all.</div><div class=""><span style="font-size:12.800000190734863px;color:rgb(80,0,80)" class="">&nbsp;</span><br class=""></div><span class="im"><blockquote class="gmail_quote" style="font-size:12.800000190734863px;margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">&nbsp; &nbsp; &nbsp; &nbsp; * Does this proposal fit well with the feel and direction of Swift?<br class=""></blockquote><div class=""><br class=""></div><div class="">Not in my mind. Swift aims for safety, but not at the price of inflexibility</div><div class=""><br class=""></div><div class=""><br class=""></div><div class="">&nbsp; &nbsp; &nbsp; &nbsp; * If you have used other languages or libraries with a similar feature, how do you feel that this proposal compares to those?</div><div class=""><br class=""></div><div class="">I would compare it for example to the decision for the C++ developer to mark methods virtual or not, with the usual recommendation to mark everything virtual, especially the destructor</div><div class=""><br class=""><div class=""><div class="gmail_quote">&nbsp; &nbsp; &nbsp; &nbsp; * How much effort did you put into your review? A glance, a quick reading, or an in-depth study?<br class=""></div></div></div><div class=""><div dir="ltr" class=""><div class="gmail_quote"><div class=""><br class=""></div><div class="">I read it and ready carefully the debate on this list.</div><div class="">&nbsp;</div></div></div></div></span></div><div class="gmail_extra"><br class=""><div class="gmail_quote">On Tue, Jul 12, 2016 at 5:36 PM, Jon Akhtar via swift-evolution <span dir="ltr" class="">&lt;<a href="mailto:swift-evolution@swift.org" target="_blank" class="">swift-evolution@swift.org</a>&gt;</span> wrote:<br class=""><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">I completely agree, the programmer should have as much power as we can<br class="">
give them, even if it means allowing them to shoot themselves in the foot,<br class="">
because at the end of the day Swift isn¹t an academic exercise, it is a<br class="">
real world programming language, so it should be optimized for solving<br class="">
real world problems not having some kind of technical, philosophical, and<br class="">
stylistic perfection when those come at the cost of the former.<br class="">
<br class="">
So -1<br class="">
<br class="">
-Jon<br class="">
<br class="">
On 7/11/16, 16:00, "<a href="mailto:swift-evolution-bounces@swift.org" class="">swift-evolution-bounces@swift.org</a> on behalf of<br class="">
Jonathan Hull via swift-evolution" &lt;<a href="mailto:swift-evolution-bounces@swift.org" class="">swift-evolution-bounces@swift.org</a> on<br class="">
<div class=""><div class="h5">behalf of <a href="mailto:swift-evolution@swift.org" class="">swift-evolution@swift.org</a>&gt; wrote:<br class="">
<br class="">
&gt;<br class="">
&gt;&gt; On Jul 10, 2016, at 7:48 PM, Rod Brown &lt;<a href="mailto:rodney.brown6@icloud.com" class="">rodney.brown6@icloud.com</a>&gt; wrote:<br class="">
&gt;&gt;<br class="">
&gt;&gt;&gt; On 11 Jul 2016, at 12:33 PM, Jonathan Hull &lt;<a href="mailto:jhull@gbis.com" class="">jhull@gbis.com</a>&gt; wrote:<br class="">
&gt;&gt;&gt;<br class="">
&gt;&gt;&gt; It is pre-breaking in that it is the exact same code that doesn¹t work<br class="">
&gt;&gt;&gt;in both cases (only in the pre-breaking case, a bunch of other code<br class="">
&gt;&gt;&gt;also doesn¹t work).&nbsp; I know it feels different because it ³was never<br class="">
&gt;&gt;&gt;possible² vs our change being the cause, but it is one of those things<br class="">
&gt;&gt;&gt;like me giving you $5 or giving you $10 and later taking back $5.&nbsp; As<br class="">
&gt;&gt;&gt;humans we are loss averse so we devise strategies to hide the loss from<br class="">
&gt;&gt;&gt;ourselves.<br class="">
&gt;&gt;<br class="">
&gt;&gt; I completely disagree with this.<br class="">
&gt;&gt;<br class="">
&gt;&gt; Not providing someone something due to risk of breakage is not the same<br class="">
&gt;&gt;thing as ³giving it and taking it away². We don¹t build bridges out of<br class="">
&gt;&gt;spare parts and tell people ³We build it but we expect it to break at<br class="">
&gt;&gt;some stage, so use with caution.² You either build it correctly, or you<br class="">
&gt;&gt;don¹t let people cross the bridge. At All.<br class="">
&gt;&gt;<br class="">
&gt;&gt; This isn¹t about ³loss averse². This is about risk management.<br class="">
&gt;&gt;<br class="">
&gt;&gt; Where does the line lie on risk? That¹s ultimately something the core<br class="">
&gt;&gt;team will have to decide.<br class="">
&gt;<br class="">
&gt;My point is that you are completely ignoring an entire class of risk that<br class="">
&gt;has a real-world $$$ cost.&nbsp; Every time I have to use a framework under<br class="">
&gt;this proposal, I am now completely at the mercy of the author.&nbsp; In the<br class="">
&gt;case of open source frameworks I can at least make a fork, but for closed<br class="">
&gt;source frameworks (often from large companies where us using their<br class="">
&gt;framework has been negotiated by the bosses) you have now just added<br class="">
&gt;weeks to my development cycle while I wait for<br class="">
&gt;big-company-who-doesn¹t-really-care-that-much to update their stuff.<br class="">
&gt;(sure I can work on other things during that time, but delaying a launch<br class="">
&gt;isn¹t free)<br class="">
&gt;<br class="">
&gt;Are you offering to explain to my boss/client why I can¹t add the feature<br class="">
&gt;in a reasonable timeframe like I can with Objective C frameworks?&nbsp; That<br class="">
&gt;it may not even be possible now in Swift even though the Android guy just<br class="">
&gt;did it in a few hours?<br class="">
&gt;<br class="">
&gt;Do you know what I am going to tell my boss/client?&nbsp; "Don¹t use Swift for<br class="">
&gt;frameworks² and ³Try to avoid partnering with companies that have Swift<br class="">
&gt;frameworks².&nbsp; "It is too much of a risk".&nbsp; "We are giving them too much<br class="">
</div></div>&gt;control over the future of our productŠ"&nbsp; I mean, it even affects the<br class="">
<span class="">&gt;prices that companies can charge for crappy frameworks. If I am asking<br class="">
&gt;for a bunch of features that I NEED them to add to provide a basic<br class="">
&gt;feature, that affects negotiations/price (vs a world where I can add it<br class="">
&gt;myself if needed).&nbsp; Sealed-by-default gives them leverage.<br class="">
&gt;<br class="">
&gt;To use your bridge analogy, which is better in the case that you haven¹t<br class="">
&gt;provided a bridge for me:<br class="">
&gt;1) I build my own bridge knowing that I will need to maintain it<br class="">
&gt;periodically (usually on a predictable schedule)<br class="">
&gt;2) Have everyone wait for 6 months (loosing $ the whole time) while I<br class="">
&gt;plead with you to build the bridge for me.<br class="">
&gt;<br class="">
&gt;By definition, the least thought through frameworks are the ones most<br class="">
&gt;likely to need workarounds, but under this proposal, they are also the<br class="">
&gt;ones we will be unable to fix.&nbsp; I think some people think that this<br class="">
</span>&gt;proposal will make them fix those frameworks or make them disappearŠ but<br class="">
<span class="">&gt;they are often from big brand name companies, who don¹t care that much<br class="">
&gt;because tech isn¹t their main business.&nbsp; In my experience, we can get the<br class="">
&gt;changes we need, but it takes anywhere from 2 months to a year.&nbsp; Being<br class="">
&gt;able to patch in a stop-gap while we are waiting is very important for<br class="">
&gt;the health of the business.<br class="">
&gt;<br class="">
&gt;For example, I had a recent client that called me in a panic<br class="">
&gt;(unfortunately I have somehow gotten a reputation as someone to call for<br class="">
&gt;impossible tasks) because they had a demo they needed to show for a<br class="">
&gt;potential multimillion dollar deal and it just wasn¹t working.&nbsp; The tech<br class="">
</span>&gt;they had used as a base wasn¹t doing what it was supposed toŠ and the<br class="">
<span class="">&gt;fixes were 3-6 months away (the demo was a week and a half away).&nbsp; I<br class="">
&gt;would call the support guy for the tech, and they would tell me ³that<br class="">
&gt;isn¹t possible yet. Just wait for the update².&nbsp; I would call them back a<br class="">
&gt;couple of hours later saying ³If someone else asks, here is how I did<br class="">
</span>&gt;itŠ²&nbsp; Was that code beautiful? No.&nbsp; Did I get all the features in that<br class="">
<span class="">&gt;demo working?&nbsp; Yes, with something like 1 hour to spare.&nbsp; The demo went<br class="">
&gt;very very well.<br class="">
&gt;<br class="">
&gt;Should I have let that deal fall through because it wasn¹t the ³proper²<br class="">
&gt;ideological way to write code?&nbsp; Sometimes things just need to get done<br class="">
</span>&gt;and there isn¹t another wayŠ.&nbsp; A few people have suggested that these<br class="">
<span class="">&gt;types of concerns aren¹t relevant, but I find them very relevant to my<br class="">
&gt;everyday life.&nbsp; This is the first proposal with the ability to actually<br class="">
&gt;cost me (and my clients) money.<br class="">
&gt;<br class="">
&gt;I am completely ok with needing to type ³unsafe² (or similar) to<br class="">
&gt;acknowledge and take responsibility for my actions in those situations.<br class="">
&gt;I understand those modifications might break when the framework is<br class="">
&gt;finally updated in 3-6 months (hopefully we can even remove them at that<br class="">
&gt;point).&nbsp; Just don¹t ³safety" my clients out of business by making working<br class="">
&gt;around bad frameworks impossible.<br class="">
&gt;<br class="">
&gt;One last analogy.&nbsp; At a restaurant, they might be afraid I would cut<br class="">
&gt;myself with a sharp knife.&nbsp; They don¹t force me to wear mittens or<br class="">
&gt;otherwise make using knifes impossible.&nbsp; They give everyone butterknives,<br class="">
&gt;but I can always get a real knife if I ask for one.&nbsp; If I order steak, I<br class="">
</span>&gt;don¹t even have to askŠ they just bring me a real knife.&nbsp; This is how<br class="">
<div class="HOEnZb"><div class="h5">&gt;Swift has been and should continue to be IMHO.&nbsp; Prevent me from<br class="">
&gt;subclassing accidentally, but if I acknowledge the risk, let me do it.<br class="">
&gt;³Safe-by-default² != ³Impossible-by-default²<br class="">
&gt;<br class="">
&gt;Thanks,<br class="">
&gt;Jon<br class="">
&gt;<br class="">
&gt;P.S. This discussion is reminding me of one of my favorite blogs.&nbsp; He<br class="">
&gt;often talks about the tension between doing things right, and actually<br class="">
&gt;getting out there and doing things.&nbsp; Here is a good/relevant article:<br class="">
&gt;<a href="http://prog21.dadgum.com/87.html" rel="noreferrer" target="_blank" class="">http://prog21.dadgum.com/87.html</a><br class="">
&gt;<br class="">
&gt;<br class="">
&gt;-<br class="">
&gt;-<br class="">
&gt;_______________________________________________<br class="">
&gt;swift-evolution mailing list<br class="">
&gt;<a href="mailto:swift-evolution@swift.org" class="">swift-evolution@swift.org</a><br class="">
&gt;<a href="https://lists.swift.org/mailman/listinfo/swift-evolution" rel="noreferrer" target="_blank" class="">https://lists.swift.org/mailman/listinfo/swift-evolution</a><br class="">
<br class="">
_______________________________________________<br class="">
swift-evolution mailing list<br class="">
<a href="mailto:swift-evolution@swift.org" class="">swift-evolution@swift.org</a><br class="">
<a href="https://lists.swift.org/mailman/listinfo/swift-evolution" rel="noreferrer" target="_blank" class="">https://lists.swift.org/mailman/listinfo/swift-evolution</a><br class="">
</div></div></blockquote></div><br class=""></div>
_______________________________________________<br class="">swift-evolution mailing list<br class=""><a href="mailto:swift-evolution@swift.org" class="">swift-evolution@swift.org</a><br class="">https://lists.swift.org/mailman/listinfo/swift-evolution<br class=""></div></blockquote></div><br class=""></body></html>