Plenty have people have weighed in on the pro-integration side, which I largely agree with, but I think nbp's motivation is valid and worth looking into as an indication of real problems that are only going to get worse if we commit entirely to maximum integration.

On 05/12/2016 05:04 PM, Ehsan Akhgari wrote:
On 2016-05-12 9:53 AM, Nicolas B. Pierron wrote:
The more we empower people for working only on their domain(s) of
expertise, the less we would have need for such heroes.  Having persons
responsible for the integration would help us on that.

As someone who has worked on many parts of the browser, I cannot
disagree more.  Bugs just don't tend to align themselves within
someone's "domain expertise".  I think of bugs which seem to only
require me to only remember knowledge that I have accrued over the years
as "easy bugs", and the more I learn about different parts of the
browser, the more I come across issues that touch on the things that I
have never learned about before, or things that I haven't learned well
enough.  Those I call "normal bugs".

But as you say yourself, below, there is a place for specialists. If everyone tries to spread themselves across the whole browser, we're as surely doomed as if everyone tried to carve out their own corner. Some bugs *do* align well within one person's domain of expertise, and some of those bugs are nasty enough that you really do want a specialist to handle them.

Also bugs are only one part of our work.  I have found out that the more
parts of the browser I have learned about, the more I have been able to
work on "cross-functional" things that have benefited the browser as a
whole, and nowadays these sorts of stuff are commonplace projects that
we're working on.  Take e10s as an example, that project doesn't map at
all to any of the islands that we have created in our organization
and/or code base.  We need more and more people to be able and willing
to step out of the little islands, as the whole world has grown much
smaller now and the islands that maybe we created for good reasons back
in the day are really just an artifact of the past.

It's an important message, echoed with hard data at <http://mrrrgn.com/33/>. But it doesn't negate the need for specialists.

It's true that a successful project requires both specialists and
generalists, and none of the above means that all people need to be
generalists.  It means that we need to see these little islands
(SpiderMonkey included) as what they are, remnants of the past simple
days where we'd get away with pretending to have we have a bunch of
loosely integrated components that we could make a browser out of.
(Anyone remember the pre-libxul days where we pretended to have
"libraries" and whatnot? ;-)

This is the part where I cannot fully agree. Sure, we started out with too fine of a breakdown, but the conclusion is not to roll everything up in a monolithic ball of mud.

Any boundary between components has a cost. Sometimes the cost is worth it, sometimes not. If you look at spidermonkey in particular, it seems pretty clear to me that keeping it architecturally separate from gecko is far better than letting them merge indiscriminately. The places where gecko-isms have crept into SM already make me pretty nervous.

Random example from an area I am close to: we have reasons for triggering a GC that are reserved for gecko's use, like REFRESH_FRAME and PAGE_HIDE. That's not something the JS engine should really be aware of. We really ought to be translating those actions into only the semantics that are meaningful to scheduling GC. As we say in the docs, "Mostly, Gecko uses these to indicate that a significant fraction of the scheduled zone's memory is probably reclaimable." We really ought to be communicating only in those sorts of terms. (And in practice, we pretty much are; those individual enum values are just documentation that gets into GC logs and telemetry.)

Another example would be how the way the DOM and the JIT integrate is kept as general as possible. It would be easier to just let them both know anything and everything about each other, but it would result in us painting ourselves into a corner.

As we have done numerous times in the past. The multiple JSContext model, I feel was based too closely on Gecko's needs, and we're architecturally better off making gecko adapt to something simpler. XPConnect (thankfully always kept separate from SM proper) continues to be difficult to disentangle from places where it's no longer the best solution. The CC/GC integration has always been problematic, though by its nature it's a hard one to keep separate. It's often hard to see when we're doing something mind-numbingly stupid, simply because we've rolled too much complexity up together for expedience or short-term performance wins.

I know I'm taking your argument to an extreme, making it something of a strawman, but I think my point stands that more integration is not always better.

I wouldn't go so far as to say that SM should be its own repo -- in fact, I'd be dead set against it. But I *do* think that keeping gecko and SM as disentangled as possible is a worthwhile goal.

nbp talked about one reason that I'd like to amplify: test failures that require the entire system, with huge setup and low visibility into what is actually happening. These are always going to be an unfortunate fact of life, but I believe we need to be better about reproducing these sorts of failures and extracting standalone test cases from them. While the ideal would be some sort of record-and-replay system that captures communication between gecko and SM, I think there are much more modest steps that could be taken to improve determinism and make it faster to focus in on the actual problematic pieces of a test failure. Sometimes that means coming up with a way to construct an SM-only test case, and sometimes it means being able to conclusively determine that the problem is either in the test or outside of SM.

Whether or not concluding a failure is due to non-SM gecko means that the person investigating the bug changes is a separate question, having to do with workloads and priorities. Which brings me to the next issue: letting specialists be specialists. I believe we would benefit from having someone around who could (if it turned out to make sense) rewrite the whole JIT engine on a somewhat different model. But that is simply impossible if that person is constantly getting distracted by test failures that require deep investigation of unfamiliar corners of Gecko. It's too much to ask of an individual person to be able to be very deep and concentrated on one subsystem and at the same time be productive in jumping into completely unrelated areas. (Or rather, expect what you want, but if you took away half of that job, they'd be far better at the other half, and some tasks can only be accomplished by someone working at full capacity in a specialized area. It doesn't matter how much extra time you give them, it simply *will not happen*. And we restrict our possible advances to those doable by generalists or distracted specialists.)

I don't think that requires a whole separate integration team. It does mean that the expectations for some people will be different than for others. Which I'm sure is already the case, but I think that organizationally we should support this rather than discouraging it.

On a related note, I think we're also organizationally weak about taking advantage of ideas and new approaches. Specifically, you can come up with all the great ideas you want, as long as you're going to personally implement them. Anything that would best be done by someone else or a collaboration of multiple people requires strong salesmanship, which is not always the forté of the person coming up with the idea. But I've rambled on too long already, so I'm not going to get into that.

The current reality how web browsers are made don't afford us treating
our codebase in that way any more.  To me, discussions around unifying
the coding style drill into the heart of this problem: we need to move
on from having small compartments with people painting the walls to
their heart's content, and treat the browser as the one unified beast
that it truly is.  Not because it matters how much whitespace we put
where, but because a unified style paints the walls in a way that urges
people to stop thinking in terms of small islands, and start thinking in
terms of Firefox as a whole.

Nothing I particularly disagree with here, although I think of it more as minimizing the pointless difference between components that add friction, while still maintaining the separability in terms of testing and even distribution (in the case of spidermonkey). I want to think of Firefox as a whole that is comprised of separable parts, though only when separating those parts is actually useful.

Anyway, I'll try to list out some specifics that I see lacking and have potential for improvement.

- too hard for specialists to focus and stay specialized

- too hard to reproduce test failures

- too hard to minimize test failures

- we don't have a clear view of where the gecko architecture should and shouldn't have component boundaries

- we learn too little from tests we fix. We need some root cause analysis after the fix, especially for bugs in the tests themselves. And the results should be disseminated.

- the Mozilla "idea/innovation engine" is powered solely by heroes

_______________________________________________
dev-tech-js-engine-internals mailing list
dev-tech-js-engine-internals@lists.mozilla.org
https://lists.mozilla.org/listinfo/dev-tech-js-engine-internals

Reply via email to