Possible options:
1. All functions produce the same results in all Refine versions forever
2. Once you change the Refine version, all bets are off and no
guarantees are made
3. Function results are upward compatible for later versions of Refine
4. as for 3, with the exception of obvious bug fixes
5. <other variations>
This thought was triggered by the combination of folks who are
interested in provenance and digital forensics, combined with
perceived changes is default results for functions. We should
probably put a stake in the ground which describes what our intentions
are.
This probably deserves wider discussion on the general list, but I
figured I'd start here with a more limited community...
Tom
What backward compatibility guarantees have we (implicitly) made, or
should we make, with regard to GREL/Clojure/etc?
Possible options:
1. All functions produce the same results in all Refine versions forever
2. Once you change the Refine version, all bets are off and no
guarantees are made
3. Function results are upward compatible for later versions of Refine
4. as for 3, with the exception of obvious bug fixes
5. <other variations>
This thought was triggered by the combination of folks who are
interested in provenance and digital forensics, combined with
perceived changes is default results for functions. We should
probably put a stake in the ground which describes what our intentions
are.
This probably deserves wider discussion on the general list, but I
figured I'd start here with a more limited community...
If I give you toString() and suddenly toString() performs a toString() + "Thad" everytime, then you have changed the function's previous usefulness. In that case, the new version of toString() should not be called TO STRING any longer.David says that you could add parameters to it, sure that would make it safe. toString(value, +"Thad")But depending on and becoming accustomed to GREL 2.1 is easy to do, I think most would agree.If we make switching GREL 2.1 to 2.5, or 3.0 easy for the user, then we eliminate a lot of problems for them, I would think.If making switching GREL versions easy means that GREL should be a "scripting language module".R language modules (well, some of them) do the same thing, and some folks depend on a tspaleo15 version versus tspaleo16 (just an example, but it's out there)
On Tue, Sep 20, 2011 at 9:50 PM, Thad Guidry <thadg...@gmail.com> wrote:If I give you toString() and suddenly toString() performs a toString() + "Thad" everytime, then you have changed the function's previous usefulness. In that case, the new version of toString() should not be called TO STRING any longer.David says that you could add parameters to it, sure that would make it safe. toString(value, +"Thad")But depending on and becoming accustomed to GREL 2.1 is easy to do, I think most would agree.If we make switching GREL 2.1 to 2.5, or 3.0 easy for the user, then we eliminate a lot of problems for them, I would think.If making switching GREL versions easy means that GREL should be a "scripting language module".R language modules (well, some of them) do the same thing, and some folks depend on a tspaleo15 version versus tspaleo16 (just an example, but it's out there)Cool, good to see precedents!I think the challenge isn't about allowing the user to easily switch version, but the challenges are that the language modules might have a different release cycle than the core product, and how to support installing language modules.Overall, I think Refine has 3 "language" abstractions (and by "language" I don't mean programming language per se):1. a language for computing data (e.g., GREL)2. a language for selecting which data to operate on (i.e., faceted browsing), which can depend on (1)3. a language for transforming data (i.e., operations), which depend on both (1) and (2)
Ideally, all three are pluggable, but I don't know if that's going overboard.
On Wed, Sep 21, 2011 at 1:51 AM, David Huynh <dfh...@gmail.com> wrote:On Tue, Sep 20, 2011 at 9:50 PM, Thad Guidry <thadg...@gmail.com> wrote:If I give you toString() and suddenly toString() performs a toString() + "Thad" everytime, then you have changed the function's previous usefulness. In that case, the new version of toString() should not be called TO STRING any longer.David says that you could add parameters to it, sure that would make it safe. toString(value, +"Thad")But depending on and becoming accustomed to GREL 2.1 is easy to do, I think most would agree.If we make switching GREL 2.1 to 2.5, or 3.0 easy for the user, then we eliminate a lot of problems for them, I would think.If making switching GREL versions easy means that GREL should be a "scripting language module".R language modules (well, some of them) do the same thing, and some folks depend on a tspaleo15 version versus tspaleo16 (just an example, but it's out there)Cool, good to see precedents!I think the challenge isn't about allowing the user to easily switch version, but the challenges are that the language modules might have a different release cycle than the core product, and how to support installing language modules.Overall, I think Refine has 3 "language" abstractions (and by "language" I don't mean programming language per se):1. a language for computing data (e.g., GREL)2. a language for selecting which data to operate on (i.e., faceted browsing), which can depend on (1)3. a language for transforming data (i.e., operations), which depend on both (1) and (2)
Ideally, all three are pluggable, but I don't know if that's going overboard.Pluggability is a false feature, IMO: we are just passing the costs to somebody else.I am much more inclined to use a process that has worked well for other projects in the past:
1) within the same generation (the first number in the version number), we guarantee back-compatibility2) within the same evolution (the second number), we can introduce new things that were not available to previous evolutions3) within revision numbers (the third number), we don't introduce anything new (but we fix bugs)
also, we should export the version number for the "redo" scripts so that a new refine could reject (or adapt) an older script.
If we make things pluggable, we don't have much less work to do to maintain such contracts *and* we have made the future-compatibility of 'redo' scripts a lot more fragile and pass the cost of that fragility onto our users.
On Thu, Sep 22, 2011 at 10:49 AM, Stefano Mazzocchi <stef...@google.com> wrote:On Wed, Sep 21, 2011 at 1:51 AM, David Huynh <dfh...@gmail.com> wrote:On Tue, Sep 20, 2011 at 9:50 PM, Thad Guidry <thadg...@gmail.com> wrote:If I give you toString() and suddenly toString() performs a toString() + "Thad" everytime, then you have changed the function's previous usefulness. In that case, the new version of toString() should not be called TO STRING any longer.David says that you could add parameters to it, sure that would make it safe. toString(value, +"Thad")But depending on and becoming accustomed to GREL 2.1 is easy to do, I think most would agree.If we make switching GREL 2.1 to 2.5, or 3.0 easy for the user, then we eliminate a lot of problems for them, I would think.If making switching GREL versions easy means that GREL should be a "scripting language module".R language modules (well, some of them) do the same thing, and some folks depend on a tspaleo15 version versus tspaleo16 (just an example, but it's out there)Cool, good to see precedents!I think the challenge isn't about allowing the user to easily switch version, but the challenges are that the language modules might have a different release cycle than the core product, and how to support installing language modules.Overall, I think Refine has 3 "language" abstractions (and by "language" I don't mean programming language per se):1. a language for computing data (e.g., GREL)2. a language for selecting which data to operate on (i.e., faceted browsing), which can depend on (1)3. a language for transforming data (i.e., operations), which depend on both (1) and (2)
Ideally, all three are pluggable, but I don't know if that's going overboard.Pluggability is a false feature, IMO: we are just passing the costs to somebody else.I am much more inclined to use a process that has worked well for other projects in the past:What kinds of projects are you referring to? I'm tempted to think that Refine is peculiar in its own ways that such a process doesn't apply.
1) within the same generation (the first number in the version number), we guarantee back-compatibility2) within the same evolution (the second number), we can introduce new things that were not available to previous evolutions3) within revision numbers (the third number), we don't introduce anything new (but we fix bugs)But fixing bugs in GREL functions already changes their contracts.
also, we should export the version number for the "redo" scripts so that a new refine could reject (or adapt) an older script.+1 to having the version somewhere in there. Do you mean such adaptation would be automatic? I.e., each GREL function would look at the version and behave correspondingly.
If we make things pluggable, we don't have much less work to do to maintain such contracts *and* we have made the future-compatibility of 'redo' scripts a lot more fragile and pass the cost of that fragility onto our users.I'm guessing that we need both--contract as you described, as much as we can handle with limited human resources, plus pluggability. Imagine an agency who has managed to come up with several history scripts that it knows would work for several kinds of data it deals with, and then it needs to upgrade to a later version of Refine (because of some crucial bug fixes). But then some of the scripts no longer work as expected. If there's no pluggability, what can it do?
Rather than just picking an older GREL version, it'd need to debug those scripts.
Pluggability is a false feature, IMO: we are just passing the costs to somebody else.I am much more inclined to use a process that has worked well for other projects in the past:What kinds of projects are you referring to? I'm tempted to think that Refine is peculiar in its own ways that such a process doesn't apply.1) within the same generation (the first number in the version number), we guarantee back-compatibility2) within the same evolution (the second number), we can introduce new things that were not available to previous evolutions3) within revision numbers (the third number), we don't introduce anything new (but we fix bugs)But fixing bugs in GREL functions already changes their contracts.Oh, c'mon.
also, we should export the version number for the "redo" scripts so that a new refine could reject (or adapt) an older script.+1 to having the version somewhere in there. Do you mean such adaptation would be automatic? I.e., each GREL function would look at the version and behave correspondingly.At the very least say "this is not compatible" and avoid throwing weirder errors such as 'function not found' or worse.If we make things pluggable, we don't have much less work to do to maintain such contracts *and* we have made the future-compatibility of 'redo' scripts a lot more fragile and pass the cost of that fragility onto our users.I'm guessing that we need both--contract as you described, as much as we can handle with limited human resources, plus pluggability. Imagine an agency who has managed to come up with several history scripts that it knows would work for several kinds of data it deals with, and then it needs to upgrade to a later version of Refine (because of some crucial bug fixes). But then some of the scripts no longer work as expected. If there's no pluggability, what can it do?You are moving the cost of maintaining the interface with the language to the interface with the language/refine plugin interface... there's a win only if one can be solidified more than the other... it might be the case here, or not, I honestly don't know.But my gut feeling is that we're doing this to punt the problem and still feel good about ourselves and that rarely ends well.
Rather than just picking an older GREL version, it'd need to debug those scripts.This project is open source and will remain that. If you have a script that works with version 3.2.1, people will download that and run it. If they need bugfixes there, they can get the diffs and apply them. If they want to update it to the latest version, they can spend resources to understand the back incompatibilities introduced later and fix those.
I think that trying to avoid future compatibility problems is hopeless. We can try to be as consistent and open as possible and provide enough safety nets that people can understand what's going on without having to talk to us.