[squeak-dev] Brave New World
keith
keith_hodges at yahoo.co.uk
Sun Jan 24 01:43:48 UTC 2010
> Wow, you're really not willing to concede a single point, ever, are
> you?
Hi Josh,
You are really not understanding my point. So I didn't concede your
point, because your point seemed to me to be being scored against the
wrong target.
You appear to be attempting to point score on the relative technical
merits and possible uses of individual scm tools. Whereas I was
attempting some abstract thinking about the process here, and the
actual tools are not that relevant.
You appear to repeat the same mistake when you have a go at "bob", bob
is only a hacked together second attempt at a concrete tool for
attempting to implement an abstract idea, a new way of working and
thinking about the problem, in other words a different paradigm. You
attack the tool and its implementer, on its lack of technical merits,
and my inadequate capabilities, without understanding the value of the
abstract thinking behind it. The deliverable of bob, is the
demonstration and framework that allows you to think using the new
paradigm, not fundamentally the tool itself. You say to me, ah ha,
Lukas has developed a new CI tool, which is better than yours, so its
ok we can ignore you, throwing bob away is justified. But, Lukas is
using his new tool simply as a way of automating the old paradigm.
Conceptually, you load an image from scratch, load some packages and
test them, this is how Lukas is using his tool. You can do this
manually, there is no new paradigm demonstrated here.
Lets try again once more.
1.
Conceptually, there is one Seaside3 repository held centrally, and one
team developing it, and there is one Seaside3 Head, for the entire
world. This is the essence of the centralised approach. (Of course,
anyone can do what they want locally) Linux may use distributed tools,
but conceptually it is being controlled by one individual Linus, so it
is also fundamentally a centralised model of thinking, no matter what
the tools are able to achieve in practice.
Your point that Monticello can work in a distributed fashion is fine,
of course it can, but in practice, it isn't used that way. There is
only one head for Seaside3, and there is only one head for Linux,
since effectively the Linux kernel is only one product with one gate
keeper, and there is only one head for "trunk" too.
Fundamentally 3 years ago a small group of us recognised that
innovating new features on just "one head" was a thing of the past for
squeak, we already have 8 or more maintained forks of varying
descriptions. That's what the pharo guys were doing too just
innovating for themselves, and with every commit pharo was making it
harder to maintain packages in common with squeak. The pharo team's
response to this dilemma was to say "we dont care", the squeak team
and the boards response to this dilemma 3 years ago was to say "we do
care". We will write tools that fundamentally expect to fix, innovate
and test against multiple forks. We can let pharo be the hare, but we
can win in the long haul as the tortoise, because our innovations will
be more carefully implemented and tested, and will be more useful to
more people with existing code bases to support.
So as I was saying, it is an abstract point, that conceptually the way
we think when we do development, is basically to swarm around a
centralised resource, be it a repository, an image or a person. When
we do this, we are signing up to depend on that resource for the
longer term.
2.
Along comes Mercurial, a new kid on the block with a new fundamental
concept.
They put forward a different abstract idea fundamentally. When you use
mercurial, every checkout/branch is a head, and is equal at every
level and is indistinguishable from the original (In fact unlike, git
and bzr, mercurial, only really supports any notion of centralised
repositories, and a lightweight checkout because some users demanded
it for pragmatic reasons)
With mercurial when you branch, you get everything. Your "head" is
equal to and as good as anyone elses, and you could take your work to
the moon, and forget the rest of the world exists, forever.
The equivalent in the squeak world is that when I branch to develop
something on top of seaside3, I get the whole of the seaside
repository to take with me, and I get my own seaside3 head. I can now
make innovations to seaside locally, and I can provide a new seaside
head to the world if I want to.
Now that is a silly idea isnt it, I hear you think, what would the
world want with, and what is the use of, 15 different heads to a
product that is obviously being developed by one team.
However, if you read the documentation, the Mercurial guys then
recommend an entirely new approach to working. What you do, is you
make a separate branch relative to a fixed point (A), (a release for
example) for each new feature or bug fix, (B, C and D), (or developer
working on a feature) in your product. This ensures that each feature
may be tested and developed by itself, relative to a known starting
point, the branch ancestor.
The result being that you locally get all the little deltas of each
little change (B.1->B.2->B.3) you make when developing that feature,
but when you come to publish, you also have one big delta (B.3 - A)
for the whole feature. That big delta for that feature is not
contaminated with the work on other features.
So, when the time comes to make a release you make a new fresh branch
(A.2) from the old fixed point (A), you pull from each of the
innovations in turn and merge them in (A.2 = A + (B3.-A)+(C.3-A)+(D3-
A)), (this is the opposite of the above 1, in which the innovators all
effectively push to a central repo. or gatekeeper). In addition, you
don't then automatically require the developer of that new feature to
continue his work from your new head (AA). He can continue to produce
B.4 B.5 and B.6, so that when you merge in his work again. You merge
(A3= A.2 + B.6-B.3).
Are you getting the point that the mercurial approach is a different
paradigm, it is fundamentally distributed. (even though technically
you can use it in a centralised manner)
So... I was suggesting that with Cuis, we could switch from a mindset
that thinks centrally, to a mindset that thinks distributed.
At present there is conceptually one head for the world for
everything, i.e. Squeak3.10 + 700 packages in squeak map.
My thought was that when you download a distribution built on cuis,
you conceptually get all 700 packages, and all their history. When you
work you adapt everything you need to work for cuis, and you ignore
the rest of world. You could in fact over a very long weekend delete
FileDirectory and port every single package to something better.
Then when you publish your result, it becomes a brand new distribution
"Sooty", equal in status to the first, each of the packages you load
is fully manageable in the context that it is being used. Others
interested in your innovations can study them in context, and pull
them as they desire.
3.
When you tell me that my bob process relying on Mantis is no good, as
many have attempted to do. This criticism is based upon point scoring
because they dont think that technically these tools would do it as
well as they would like. Basically saying imho "mantis is crap so
anything that uses mantis will also be crap", by definition.
What you fail to understand is that my bob process is not built on
mantis, it is built on the abstract principle, that you start with a
known fixed point and develop each innovation as a separate delta.
Then you can apply those deltas individually to several forks. If for
some reason a delta doesn't work in a fork, then the fork can be fixed
to address the problem. Fixing the fork actually results in all the
forks converging to be closer to the original fixed point, and some
essential commonality is preserved. Every innovation that you make for
just your own image, that you do not make available for other forks to
try, is potentially destroying commonality. Every innovation and patch
that you make available for other forks to try is potentially
improving commonality.
Mantis just happens to be the place where the fixes are at the moment.
Several developers all innovate relative to that known fixed point.
Bug fixers develop bug fixes relative to that known fixed point, and
then the next release can be produced by cherry picking innovations
that are actually complete, and bug fixes that are complete and tested.
So here is where "bob" could conceptually comes in...
With bob you can load your version of package A (e.g. Rio), as you
maintain it in your local distribution, in your fork, and
automatically test it. You make your "rio testing bob" open, so that
anyone can add their distribution to the list. Bob downloads their
image from their ftp site when it changes, and adds it to the test
schedule. So, you can develop package A, seeing the impact you are
making on every derived distribution in bobs list. When you see that
package A's new feature is going to work for everyone, you can
announce that feature and those who are interested can pull it over.
At the same time, each user of package A, is also running the tests,
so they get to see if they accidentally undermine package A, breaking
by doing something silly.
5.
Currently, in its technically limited way, using Bob, and Sake/Tasks,
you can write a script made of a series of tasks that you think would
pull 200 fixes and update to the latest packages to make 3.10 into 3.11.
Then you can run that script against 3.9, and low and behold, 95% of
that script will execute. Any parts that need a tweak, can be tweeked
by subclassing or overriding the task that failed. In this manner some
fixes can be omitted, or extra ones loaded if needed.
Then you can run that same script against your production image based
upon 3.9, and it might well pass too. If it does, and you fix your
production image to work, then this means, that all the code in your
production image, can migrate to 3.11 seamlessly.
The net result will be, that there will be a new monticello,
squeakmap, sunit, in squeak 3.11, but also, there will potentially be
a 3.9.2 with that same new monticello, squeakmap and sunit, and also a
3.8.4 with that same monticello, squeakmap and sunit. All generated
and tested simultaneously.
If the pharo guys want to pull your 3.10-3.11 innovations, they simply
add a subclass for pharo, let bob build Pharo1.0+(3.10 to 3.11 delta
script) and see what works and what doesn't. Or they can see exactly
what steps you went through to make 3.11, and they can cherry pick the
ones they like. If the pharo guys made Pharo 1, from squeak 3.9 in the
same manner then you could pull their innovations too. (this is the
principle that the mercurial guys are aiming to support)
The more different forks, that load common fixes, (and I know not
everything will work) the more compatability we will have, even though
the kernels of the forks may be different.
Before you tell me that this wouldn't work, may I point out that LPF
already did this for 8(?) different squeak forks, you can download 3.7-
lpf, 3.8-lpf, cobalt-lpf etc etc.
In addition, Sake/Packages knows the package dependencies for all the
packages that are loadable in 3.10, and 3.9, so bob can produce. 3.7-
lpf + sake/packages = 3.7-build, 3.8-build, 3.9-build, cobalt2.0-build
etc.
So, we can update and maintain 8 different forks to have the same scm
tools, the same package management tools, and the same testing tools.
So... if we can achieve this by pushing out fixes and packages to
different forks, then applying the same principles, of publishing the
list of changes we make to move from, 3.10 to 3.11, as code. Other
forks based on 3.10 can pull what they want of the changes, but they
are not forced to accept everything we do. For example, I want a fork
of 3.10 which uses Rio, so I wouldn't pull any of the fixes to
FileDirectory.
The current situation is that "trunk" is the only head, and all
contributors are working on it, because they are following their
esteemed leader. The chances of removing FileDirectory from trunk is
0, because of the legacy, it will never happen.
However if I choose to fork 3.10 and make an image which doesn't have
FileDirectory, (YAY!), then I am on my own, because "trunk" is no use
to me. However if "trunk" innovations were of use to me, then I
wouldn't be on my own.
3.11 with FileDirectory can be tracked to produce a parallel 3.11 with
Rio full integrated and FileDirectory removed..
Seaside with FileDirectory can be tracked to produce a parallel
Seaside with Rio.
eventually FileDirectory can die a graceful death.
its just an idea
Keith
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.squeakfoundation.org/pipermail/squeak-dev/attachments/20100124/5c68f0ea/attachment.htm
More information about the Squeak-dev
mailing list
|