Live data from Hacker News

Jujutsu at Google [video]

youtube.com

171–180 of 212 posts

Re: Jujutsu at Google [video]

#171

Earlier quoted context omitted.

This is exactly what I meant. https://git-scm.com/book/en/v2/Git-Branching-Branches-in-a-N... The book says that ‘ To really understand the way Git does branching, we need to take a step back and examine how Git stores its data’ then it starts talking about trees and blobs. At that point you’ve lost almost everyone. If you have a strong interest in vcs implementation then fine, otherwise it’s typically the kind of de…

To be honest, if you’re using a tool that stores things as trees and blobs and almost every part of its functionality is influenced by that fact, then you just need to understand trees and blobs. This is like trying to teach someone how to interact with the file system and they are like “whoa whoa whoa, directories? Files? I don’t have time to understand this, I just want to organize my documents.” Actually I take th…

I see your point but … trees and blobs are an implementation detail that I shouldn’t need to know. This is different from files and directories ( at least directories ) in your example. What I want to know is that I have a graph and am moving references around - I don’t need to know how it’s stored.

The git mental model is more complex than cvs, but strangely enough the docs almost invariably refer to the internal implementation details which shouldn’t be needed to work with it.

I remember when git appeared - the internet was full of guides called ‘git finally explained ‘ , and they all started by explaining the plumbing and the implementation. I think this has stuck, and does not make things easy to understand.

Please note I say all this having been using git for close to 20 years, being familiar with the git codebase, and understanding it very well.

I just think the documentation and ui work very hard towards making it difficult to understand .

Re: Jujutsu at Google [video]

#172
post #5

Off topic, and I don't want to knock the presenter here, but if you're ever going to give a public talk or presentation at work _please_ review the Death By Powerpoint slide deck[0] first. [0] https://www.slideshare.net/slideshow/death-by-powerpoint/855...

Thanks for the link. I went through it but I'm not sure what it's telling me to change. Can you elaborate? If it's "be more engaging", i think is unfortunately going to be hard to improve because this is just how i am.

Thanks for presenting. I was a fig lover so this area is interesting to me.

This is a really hard topic since it's hard to understand the significance of the jj contributions without explaining a ton of internal details like Piper, CitC, TAP, blaze, etc. I think you struck a good balance here.

I don't think you need to "be more engaging" or be more passionate, and when people say that, it indicates they aren't engaged, but it's not a useful suggestion of how to improve.

I think the main issue was that on just about every slide, I found myself wanting to read ahead on the slides instead of waiting to listen to you talk. There are a couple factors to this:

1. Impatience. I want to ingest information faster. Believe it or not, the "talk slowly" advice is usually not good for a technical talk with decent acoustics. E.g. listen to a talk by Bryan Cantrill and notice how fast he talks while still being clear. Rehearsal helps, but if you simplify your slides, you can also make them easier to perform. Listen to a random slide in your video and notice how much time is filled with silence or filler words.

2. Scanning the slide because I'm unsynchronized with the speaker. E.g. if everything you say isn't clearly correlated with the content of the slide in a linear way, then I have to scan the slide to attempt to "resychronize" and figure out what bullet you are on. Sometimes presenters don't want to read the bullets verbatim, which makes it difficult to match up the spoken language with the written language, whereas if you said the first word in a bullet, I could quickly seek to that line. Skipping bullets also causes this, especially at the end of a slide, since then I want to try to read all the bullets on a slide ahead of you in case you decide to skip them in the future.

Fewer bullets per slide and fewer words per bullet help with both of these. Aggressively cut or summarize material so you don't have to skip over anything (e.g. instead of listing 6 jj piper commands and only talking about 2, list just 2 and write the number of total commands e.g. "we added 22 subcommands including mail and submit"). Put extra material (if any) in an appendix after the end if you think you might have extra time or want to use it for Q&A. Rehearse until you can belt out what you want to say on each slide without fillers or pauses (and record yourself so you can tell how much you are doing this). When I'm sharing my screen, I actually like to point my mouse cursor at the bullet I'm on so nobody has to guess where we are, but sometimes that's not available.

Your first slides essentially teach the audience how to consume your talk. E.g. a good pattern is if (1) all your bullets are short (2) you read every bullet verbatim, elaborate on that bullet for a bit, and then repeat on the next bullet. If you stick with a pattern like that, then your audience knows how to follow along. Other patterns work too.

I'm sorry this wasn't shorter and I hope it's helpful.

Re: Jujutsu at Google [video]

#173

Earlier quoted context omitted.

Again, amazing to be seeking feedback (or open to it). I'm at minute 13 (code review management / bookmarks, etc.), and will give my feedback from there: https://www.essayselevate.com/post/how-to-structure-a-winnin... "SCAR", which I learned as "Situation, Consequences, Actions, Results" but the above essay will let you go deeper. Bad: "Two people stood up there, said a few words, and then everybody had cake and went…

Thanks for the detailed comment. My target audience were the people at the conference, who are mostly long-term jj users. The topic was "Jujutsu at Google: Architecture and future plans", i.e. explaining how it works and what our plans are at Google. I'm mentioning this because I think what you're suggesting is for a different presentation, more explaining what the advantages of Jujutsu at Google are rather than how…

Not at all! So for example at ~20-25m, you're explaining "the revset engine"

Just basically flip the first two bullet points:

Situation: "Our repo shape can assume: ..."

Consequences: "Non-mainline graphs fit in memory ..."

Actions: "Tada! Revset engine!"

Result: "Monotonic commit numbers"

Impact: "b/c we can sort ranges => unlocks filtering, client-side processing, etc"

(please excuse my poor understanding of the DETAILS of `jj-at-goog` internals, so I'm butchering some of the details of impact, etc).

...another comment mentioned "death by powerpoint". You can still do/make your slides as you're currently doing it, but when you're "done", just move all the text down into the "speakers notes", and focus on providing some illustrations or comparisons for the visual portion.

Example here: https://share.google/images/tWSmujLgnX2gDvtgL

On the revset, a bunch of it could be helped by "illustrating the impact" or "compare and contrast"

     | RevSet         |  Git-on-ext3   |
     +----------------+----------------+
     | Indexed        | FS-Traversal   |
     | Working Memory | Disk Cache     |
     | Strong Server  | Local Limits   |
     | 456 > 123      | $RAND != $RAND |
                  ...etc...
...and in your speakers notes, you can record some of the technical details you want to talk through.

You're so deep in the weeds it's like asking a fish what they think about water (and to clarify: I'm absolutely not meaning this in any sort of insulting way)... it's just that when you're communicating to others, you may have to end up moving "back and forth" or "up and down" ... illustrated: https://www.youtube.com/watch?v=3amL4O8BSAg ... stretching things out so you can see the individual threads then putting them back, or giving them a twist and blending in a new topic.

Because of your intimate familiarity with the inner workings, sometimes in your talk you're describing an inner working (ie: there's 206 bones in the human body!) but there's no context about what makes that better, or worse, or how they're conceptually connected with each other.

On the grand scale, what is the IMPACT you want your talk to have? To put words into your mouth: "We're about to go GA at google, which is a big deal."

How do you get there? Where did you start from? To put words into your mouth: "JJ is solving google-scale problems, and there's _demand_ and _support_ for bringing it about." [that's your situation]

Consequences? Actions? => now you have set the scene for your very same technical deep dives on JJ.

1) Google has big problems, JJ is solving lots of them!

2) The consequences of (jj-solving-them) or (suffering-further-with-git) are: ...

3a) The actions that have helped jj forge ahead (better than git) are: ...

3b) The actions that jj reduces suffering compared to git are: ...

4) ...as a result, we're about to go GA

5) The impact is increased community trust, improved internal development capabilities, etc...

...again: it's _mostly_ about rearranging things, and providing a little bit more context so that what you _are_ presenting hits your audience better. (3a and 3b are kindof what your current presentation was all about... just set it up a little more on how those interact with the larger picture)

Situation: You've done a great technical thing, and are being asked to present more and be an advocate for it (and yourself)

Consequences: ...if people don't understand JJ, there will be less adoption, or people that would be well-served by it won't use it, or won't contribute

Action: ...you're taking feedback on presentation skills, will continue your systematic learning and iterative improvement approach to this tech-adjacent skill

Result: Butterflies! Rainbows! 150% increase in JJ contributors and 5000% increase in JJ adoption... world peace imminent! :-P

<3 ... best of luck, and free free to reach out if you'd like to continue the conversation!

Re: Jujutsu at Google [video]

#174

Earlier quoted context omitted.

You can just record all your changes with git commit --fixup and then do a non-interactive rebase that just applies all the changes. You can use all the regular git tools in a rebase, in fact it would be quite useless without. You can also just jump to other branches or record a fix to a previous commit. It doesn't matter what you do in the meantime, it only cares what is the HEAD, when you call git rebase --continue…

Yes, it's certainly possible to do all those things with Git. Compared to jj, it's just much harder to do, easier to mess up, and harder to recover from if you do mess up.

I just gave you an example how it is not "much harder".

Re: Jujutsu at Google [video]

#175

Earlier quoted context omitted.

The reflog doesn't capture everything. jj's oplog does. An example of something that the reflog isn't going to capture is a git reset --hard losing your unstaged changes, whereas the equivalent flow and commands in jj would allow you to get those contents back.

The thing to keep in mind is that Git doesn't version the file system, it versions the index. This is because a file system guy like Torvalds knows that the file system is a shared resource and no program should think it can control its state. Therefore a Git repository doesn't consists out of all the files below a directory, it consists out of everything in the index. Git does version everything that is in the repos…

> The thing to keep in mind is that Git doesn't version the file system, it versions the index.

Yes. I think that this difference is what introduces a lot of friction, both in the model, and how people use it. The divergence between the files that exist on disk inside your working copy and what's actually tracked means lots of opportunities for friction that go away once you decide that it should. That doesn't mean things are perfect, for example, by default jj only snapshots the filesystem when you run a `jj` command, so you can still lose changes from in between those, you need to enable Watchman to get truly full logging here.

> all these states occur in the reflog.

Well, let's go back to the documentation for reflog:

> Reference logs, or "reflogs", record when the tips of branches and other references were updated in the local repository.

It only tracks changes to refs. That is, the states that refs have been in. So, one big example is detatched HEADs: any changes you make to those, which still are contents of the repository, are not tracked in the reflog.

Even for refs, there's differences: the reflog says "ref was in state x and changed to state y" without any more details. jj's oplog keeps track of not only the state change, but the reason why: "rebased commit with these args: jj rebase -r -d trunk"

The reflog only tracks individual refs. Say we rebase multiple commits. The reflog still just says "the head of this branch was in state x and changed to state y" but the oplog says "a rebase happened, it affected all of these commits refs in these ways," that is, it's just inherently more rich in what it tracks, and does it across all relative commits, not only the refs.

This doesn't mean the reflog is bad! It's just a very specific thing. Git could have an operation log too, it's just a different feature.

Re: Jujutsu at Google [video]

#176

Earlier quoted context omitted.

> You can copy a .git folder around just fine. You can do this, but due to file locking, you can corrupt the state if it's shared. jj is specifically designed so that it won't corrupt the repo in this way: https://jj-vcs.github.io/jj/latest/technical/concurrency/

Create a bare repo on the USB stick(/dropbox/Google Drive/random folder) and just push to the USB stick.

Historically speaking, this does not change things, at least for Dropbox/Google Drive. Stack Overflow is tons of posts like this: https://stackoverflow.com/questions/2199637/is-it-possible-t...

That said, I haven't tried this lately, maybe it's gotten more robust over time. But historically, even a bare repo on something like Dropbox has issues.

Re: Jujutsu at Google [video]

#177

Earlier quoted context omitted.

Yes, it's certainly possible to do all those things with Git. Compared to jj, it's just much harder to do, easier to mess up, and harder to recover from if you do mess up.

I just gave you an example how it is not "much harder".

As I understood the scenario:

1. We're rewriting some commits. Let's say a chain of commits A through G. We want to make some change to commits A and D.

2. As we're editing commit D, we realized that we need to make some changes to B to match the updated A.

3. Also while editing D we realized that we want to take a look at the state in A to see how something worked there.

With jj, here's what I would do:

1. Run `jj new A`, make the changes, then `jj squash` to squash the changes in to A and propagate them through the chain.

2. Run `jj new D` to make changes. We now notice that we wanted some changes to go into B. We can make the changes in the working copy and run `jj squash --into B -i` to interactively select the changes to squash into B.

3. Run `jj new A` to create a new working-copy commit on top of A, look around in your IDE or whatever, then run `jj edit `. Then run `jj squash` to squash the remaining changes in the working copy into D.

I think you know the steps to do with Git so I won't bother writing them down. I find them less intuitive anyway.

Re: Jujutsu at Google [video]

#178

Earlier quoted context omitted.

I just gave you an example how it is not "much harder".

As I understood the scenario: 1. We're rewriting some commits. Let's say a chain of commits A through G. We want to make some change to commits A and D. 2. As we're editing commit D, we realized that we need to make some changes to B to match the updated A. 3. Also while editing D we realized that we want to take a look at the state in A to see how something worked there. With jj, here's what I would do: 1. Run `jj n…

1. Edit changes, run `git commit --fixup=A`.

2. Edit changes for D. Also edit changes for B. Interactively `git add` changes for B. `git commit --fixup=B`.

3. Finish changes for D, then call git commit --fixup=D

Before push I run `git rebase --autosquash`, optionally `git rebase --exec='make check'` to rerun all the tests on the changed commits.

Where is that "much harder"?

Re: Jujutsu at Google [video]

#179

Earlier quoted context omitted.

The thing to keep in mind is that Git doesn't version the file system, it versions the index. This is because a file system guy like Torvalds knows that the file system is a shared resource and no program should think it can control its state. Therefore a Git repository doesn't consists out of all the files below a directory, it consists out of everything in the index. Git does version everything that is in the repos…

> The thing to keep in mind is that Git doesn't version the file system, it versions the index. Yes. I think that this difference is what introduces a lot of friction, both in the model, and how people use it. The divergence between the files that exist on disk inside your working copy and what's actually tracked means lots of opportunities for friction that go away once you decide that it should. That doesn't mean t…

> So, one big example is detatched HEADs: any changes you make to those, which still are contents of the repository, are not tracked in the reflog.

    $ git checkout HEAD
    $ git commit --allow-empty -m "_"
    $ git checkout master
    $ git reflog
    a91 (HEAD -> master, origin/master, origin/HEAD) HEAD@{0}: checkout: moving from b94 to master
    b94 HEAD@{1}: commit: _
    28d (origin/feature, feature) HEAD@{2}: checkout: moving from feature to @
> Even for refs, there's differences: the reflog says "ref was in state x and changed to state y" without any more details. jj's oplog keeps track of not only the state change, but the reason why: "rebased commit with these args: jj rebase -r -d trunk"

> The reflog only tracks individual refs. Say we rebase multiple commits. The reflog still just says "the head of this branch was in state x and changed to state y" but the oplog says "a rebase happened, it affected all of these commits refs in these ways," that is, it's just inherently more rich in what it tracks, and does it across all relative commits, not only the refs.

    68e HEAD@{15}: rebase (finish): returning to refs/heads/feature
    68e HEAD@{16}: rebase (pick): message #6
    7ff HEAD@{17}: rebase (pick): message #5
    797 HEAD@{18}: rebase (pick): message #4
    776 HEAD@{19}: rebase (pick): message #3
    c7d HEAD@{20}: rebase (pick): message #2
    f10 HEAD@{21}: rebase (pick): message #1
    c0d HEAD@{22}: rebase (start): checkout @~6

    a7c HEAD@{100}: rebase (reword): message ...
    3b1 HEAD@{229}: rebase (reset): '3b1' message ...
    4a4 HEAD@{270}: rebase (continue): message ...

Re: Jujutsu at Google [video]

#180

Earlier quoted context omitted.

As I understood the scenario: 1. We're rewriting some commits. Let's say a chain of commits A through G. We want to make some change to commits A and D. 2. As we're editing commit D, we realized that we need to make some changes to B to match the updated A. 3. Also while editing D we realized that we want to take a look at the state in A to see how something worked there. With jj, here's what I would do: 1. Run `jj n…

1. Edit changes, run `git commit --fixup=A`. 2. Edit changes for D. Also edit changes for B. Interactively `git add` changes for B. `git commit --fixup=B`. 3. Finish changes for D, then call git commit --fixup=D Before push I run `git rebase --autosquash`, optionally `git rebase --exec='make check'` to rerun all the tests on the changed commits. Where is that "much harder"?

Ah, I see, so you avoid interactive rebase and instead make all changes in the working copy and use `git commit --fixup` and `git rebase --autosquash` . Makes sense, but doesn't it break down when there are conflicts between the changes you're making in the working copy and the target commit? How do you adjust the steps if there were conflicts between the changes we wanted to make to A and the changes already present in B?
Post reply on HN