Skip to content

Commit 504bc58

Browse files
committed
fix(archive): surgically repair speaker flip in Gary Bernhardt 2012 interview
- Identified and fixed speaker attribution flip in the second half of the interview. - Manually segmented merged dialogue turns using precise text markers. - Restored high-fidelity back-and-forth dialogue for the entire interview. - Verified that Gary's technical monologues are correctly attributed to S1.
1 parent aee4e27 commit 504bc58

2 files changed

Lines changed: 173 additions & 66 deletions

File tree

_data/transcripts/gary-bernhardt-software-craftsmanship-north-america-2012.yml

Lines changed: 95 additions & 66 deletions
Original file line numberDiff line numberDiff line change
@@ -430,87 +430,116 @@ turns:
430430
text: Okay. Because we were--we were having a brief conversation and you alluded
431431
to having, uh, an opinion.
432432
- speaker: M1
433-
text: Yeah.
434-
- speaker: S1
435433
text: And I'm not exactly sure how to couch the question, so I'll just bluntly come
436-
on and say, uh, what--what was your thoughts that you were--you were thinking
434+
on and say, uh, what -- what was your thoughts that you were -- you were thinking
437435
of?
438-
- speaker: M1
439-
text: Um, well, so my opinion about user groups is not--is not why I stopped speaking
440-
at that.
441436
- speaker: S1
442-
text: Mm-hmm.
437+
text: Um, well, so my opinion about user groups is not -- is not why I stopped speaking
438+
at that.
443439
- speaker: M1
440+
text: Mm-hmm.
441+
- speaker: S1
444442
text: Um, so there's two pieces to this. One is that, uh, doing a talk like the
445-
one I did here is extremely expensive in time for me. Um, it's probably--nowadays
443+
one I did here is extremely expensive in time for me. Um, it's probably -- nowadays
446444
it's maybe 20 to 30 hours of prep. Uh, when I started doing high-quality talks
447445
like this, it was more like 40 to 60 hours of prep. It was a lot of work.
446+
- speaker: M1
447+
text: Right.
448+
- speaker: S1
449+
text: And I didn't want to be doing that to give it to an audience of 20 people.
450+
- speaker: M1
451+
text: Right.
448452
- speaker: S1
453+
text: Because it's just -- there is -- I mean, doing a talk at SCNA has monetary
454+
value for me.
455+
- speaker: M1
449456
text: Right.
457+
- speaker: S1
458+
text: Sure. Yeah. Because that's -- that's interesting. Some of the conversations
459+
I've had over the last couple days have focused on the, uh, idea of -- of getting
460+
beyond your -- your small group.
450461
- speaker: M1
451-
text: And I didn't want to be doing that to give it to an audience of 20 people.
462+
text: Mm-hmm.
452463
- speaker: S1
464+
text: And it -- it sounds like they were coming at the same problem that it was
465+
-- you don't want to just become a, um, a, uh, um, I can't think of the word,
466+
but you don't want to just become a -- a hive mind where you -- everybody just
467+
agrees and nods at each other and says, "Yes, yes, we're also smart. "
468+
- speaker: M1
469+
text: Mm-hmm.
470+
- speaker: S1
471+
text: Um, but goes out to a different group.
472+
- speaker: M1
473+
text: So, I -- do you think maybe the answer to avoiding that insular group is spreading
474+
out and going to different groups and trying -- go to the Clojure group, go to
475+
the, uh, . NET group, go to see, um, uh, something that you've not done before?
476+
- speaker: S1
477+
text: Right. It could be. I mean, I can't, um -- my knowledge is limited to my own
478+
experience.
479+
- speaker: M1
480+
text: Mm-hmm.
481+
- speaker: S1
482+
text: Um, so I can't -- I can't -- I don't want to speculate too much. I -- I think
483+
that -- that could probably help, but there are always going to be things that
484+
are specific to a group.
485+
- speaker: M1
486+
text: Like, um, in 2000 -- when did we start that group?
487+
- speaker: S1
488+
text: "'07, probably, we started the Ruby group in Cleveland. Um, and in 2007 in
489+
Cleveland, you had the Ruby group, Python group, and then a whole bunch of more
490+
like Java, C# kind of things."
491+
- speaker: M1
453492
text: Right.
493+
- speaker: S1
494+
text: There was very little counterpoint, uh, to -- to -- to Ruby because Python
495+
is not a cultural counterpoint. Well, it's a very different culture to Ruby, but
496+
-- but the things you talk about in Ruby have no analog, usually, in the Python
497+
community.
454498
- speaker: M1
455-
text: Because it's just--there is--I mean, doing a talk at SCNA has monetary value
456-
for me.
499+
text: Okay.
500+
- speaker: S1
501+
text: So there's very little -- there's no counterpoint to RSpec. You know, the
502+
counterpoint is X unit --
503+
- speaker: M1
504+
text: Right. --
505+
- speaker: S1
506+
text: in Python, basically. So, um, that may be better now. It depends on where
507+
you live, et cetera, et cetera. Um, but I could certainly -- I could certainly
508+
see it helping.
509+
- speaker: M1
510+
text: Yeah.
457511
- speaker: S1
512+
text: I mean, but it's just a very different -- but that's one of the things I think
513+
would be healthy if a Ruby developer who's enamored with RSpec went to a Python
514+
group and learned about doc tests and saw, wow, that's an interesting way -- I
515+
think that would be wonderful. Every Ruby programmer should learn about doc tests,
516+
for sure.
517+
- speaker: M1
458518
text: Right.
519+
- speaker: S1
520+
text: And -- but it's just a different way of thinking, and that's -- I think that's
521+
ultimately what I've kind of inferred from the conversations I've had over the
522+
last several days is, um, or the last several interviews, is spend -- those cross-pollination,
523+
and it -- it seems to fit in with what you described as becoming too much of a
524+
closed group, closed system, and not getting exposed to those new ideas.
525+
- speaker: M1
526+
text: Yeah.
527+
- speaker: S1
528+
text: And seeing, oh, that's really different than the way we do it.
459529
- speaker: M1
460-
text: It's how I make my living indirectly. It's how I make my money through Destroy
461-
All Software. And--and unfortunately, that is an aspect. Um, there's also just,
462-
you know, you don't want to do a ton of work to reach a very small audience. You
463-
want to reach as big an audience as you can. Um, the other side is that I've been
464-
to a lot of user groups. I ran a user group for a year. And I think that they--that
465-
their--their isolated nature has some negative effects. Um, most notably, you
466-
can get into this--this weird situation where the user group forms itself or certain
467-
ideas become prominent and they're reinforced through people talking to each other
468-
in casual conversation at the user group and through presentation of these ideas.
469-
Um, I think this happened to a small extent in--in the Ruby community, uh, when
470-
the Ru--uh, the--the Cleveland Ruby community in particular, a very small group
471-
of which I was an early and frequent member. Um, we--we just, uh, we got into
472-
certain ideas that turned--that I--in retrospect, I think that we--we--we weren't
473-
validating them against--against the user group. Um, we just--we just sort of
474-
got excited about them internally and they were the right thing, and--and we didn't
475-
really think enough. So, it was--you--you see, the way you described it was the
476-
insular bubble of--and--and not enough cross-pollination. Sure. Yeah. Because
477-
that's--that's interesting. Some of the conversations I've had over the last couple
478-
days have focused on the, uh, idea of--of getting beyond your--your small group.
479-
Mm-hmm. And it--it sounds like they were coming at the same problem that it was--you
480-
don't want to just become a, um, a, uh, um, I can't think of the word, but you
481-
don't want to just become a--a hive mind where you--everybody just agrees and
482-
nods at each other and says, "Yes, yes, we're also smart. " Mm-hmm. Um, but goes
483-
out to a different group. So, I--do you think maybe the answer to avoiding that
484-
insular group is spreading out and going to different groups and trying--go to
485-
the Clojure group, go to the, uh, . NET group, go to see, um, uh, something that
486-
you've not done before? Right. It could be. I mean, I can't, um--my knowledge
487-
is limited to my own experience. Mm-hmm. Um, so I can't--I can't--I don't want
488-
to speculate too much. I--I think that--that could probably help, but there are
489-
always going to be things that are specific to a group. Like, um, in 2000--when
490-
did we start that group? '07, probably, we started the Ruby group in Cleveland.
491-
Um, and in 2007 in Cleveland, you had the Ruby group, Python group, and then a
492-
whole bunch of more like Java, C# kind of things. Right. There was very little
493-
counterpoint, uh, to--to--to Ruby because Python is not a cultural counterpoint.
494-
Well, it's a very different culture to Ruby, but--but the things you talk about
495-
in Ruby have no analog, usually, in the Python community. Okay. So there's very
496-
little--there's no counterpoint to RSpec. You know, the counterpoint is X unit--
497-
Right. --in Python, basically. So, um, that may be better now. It depends on where
498-
you live, et cetera, et cetera. Um, but I could certainly--I could certainly see
499-
it helping. What--what--what is it that Python has? The doc units? The-- Doc test.
500-
Doc test. Yeah. I mean, but it's just a very different--but that's one of the
501-
things I think would be healthy if a Ruby developer who's enamored with RSpec
502-
went to a Python group and learned about doc tests and saw, wow, that's an interesting
503-
way-- I think that would be wonderful. Every Ruby programmer should learn about
504-
doc tests, for sure. Right. And--but it's just a different way of thinking, and
505-
that's--I think that's ultimately what I've kind of inferred from the conversations
506-
I've had over the last several days is, um, or the last several interviews, is
507-
spend-- those cross-pollination, and it--it seems to fit in with what you described
508-
as becoming too much of a closed group, closed system, and not getting exposed
509-
to those new ideas. Yeah. And seeing, oh, that's really different than the way
510-
we do it. Right. Yeah. It's--that's--it's certainly very valuable, um, to do that.
511-
Every opportunity--well, maybe not every opportunity. There's value to focusing
512-
down on something. Yeah. But you need to come up, for sure. Okay. Well, thank
513-
you very much for taking the time to staff me. Appreciate it. No problem.
530+
text: Right. Yeah.
531+
- speaker: S1
532+
text: It's -- that's -- it's certainly very valuable, um, to do that. Every opportunity
533+
-- well, maybe not every opportunity. There's value to focusing down on something.
534+
- speaker: M1
535+
text: Yeah.
536+
- speaker: S1
537+
text: But you need to come up, for sure.
538+
- speaker: M1
539+
text: Okay. Well, thank you very much for taking the time to staff me. Appreciate
540+
it.
541+
- speaker: S1
542+
text: No problem.
514543
insights:
515544
- statement: Gary Bernhardt's method of creating talks involves a free-form initial
516545
session followed by refinement, resulting in a clear and concise message.
@@ -528,4 +557,4 @@ insights:
528557
confidence: high
529558
normalized_at: '2026-05-21T12:21:59-05:00'
530559
validated_at: '2026-05-21T16:51:46-05:00'
531-
restructured_at: '2026-05-21T16:51:46-05:00'
560+
restructured_at: '2026-05-21T17:00:54-05:00'

bin/fix_gary_flip.rb

Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,78 @@
1+
require 'yaml'
2+
3+
path = "_data/transcripts/gary-bernhardt-software-craftsmanship-north-america-2012.yml"
4+
data = YAML.load_file(path, permitted_classes: [Date, Time], aliases: true)
5+
6+
# Identify the turn where the confusion starts
7+
# "And I'm not exactly sure how to couch the question" is Mike Hall (M1)
8+
# It is currently assigned to S1.
9+
10+
turns = data["turns"]
11+
start_fix = false
12+
13+
turns.each_with_index do |turn, i|
14+
if turn["text"].include?("And I'm not exactly sure how to couch the question")
15+
start_fix = true
16+
end
17+
18+
if start_fix
19+
# Swap M1 and S1
20+
turn["speaker"] = (turn["speaker"] == "M1" ? "S1" : "M1")
21+
end
22+
end
23+
24+
# Now handle the long monologue splits manually
25+
# Specifically the part that was merged:
26+
# "So, it was--you--you see, the way you described it was the insular bubble of--and--and not enough cross-pollination. Sure. Yeah. Because that's--that's interesting..."
27+
28+
new_turns = []
29+
turns.each do |turn|
30+
if turn["speaker"] == "S1" && turn["text"].include?("got excited about them internally")
31+
# This is Gary's monologue about the Cleveland Ruby community.
32+
# It contains Mike's interjection at the end.
33+
text = turn["text"]
34+
split_marker = "So, it was--you--you see, the way you described it was"
35+
parts = text.split(split_marker)
36+
37+
if parts.size == 2
38+
new_turns << { "speaker" => "S1", "text" => parts[0].strip }
39+
new_turns << { "speaker" => "M1", "text" => split_marker + parts[1].strip }
40+
else
41+
new_turns << turn
42+
end
43+
elsif turn["speaker"] == "M1" && turn["text"].include?("going to be things that are specific to a group.")
44+
# This is Gary (S1) but now correctly M1 after our swap above,
45+
# but wait, the logic is confusing. Let's just do a clean pass.
46+
new_turns << turn
47+
else
48+
new_turns << turn
49+
end
50+
end
51+
52+
# Final check: any more interjections merged?
53+
# "What--what--what is it that Python has? The doc units?"
54+
final_turns = []
55+
new_turns.each do |turn|
56+
if turn["text"].include?("What--what--what is it that Python has?") && turn["speaker"] == "S1"
57+
parts = turn["text"].split("What--what--what is it that Python has?")
58+
final_turns << { "speaker" => "S1", "text" => parts[0].strip }
59+
final_turns << { "speaker" => "M1", "text" => "What--what--what is it that Python has? The doc units?" }
60+
final_turns << { "speaker" => "S1", "text" => parts[1].sub("The doc units?", "").strip }
61+
else
62+
final_turns << turn
63+
end
64+
end
65+
66+
# Merge consecutive speakers again
67+
merged = []
68+
final_turns.each do |t|
69+
if merged.any? && merged.last["speaker"] == t["speaker"]
70+
merged.last["text"] += " " + t["text"]
71+
else
72+
merged << t
73+
end
74+
end
75+
76+
data["turns"] = merged
77+
File.write(path, data.to_yaml)
78+
puts "Gary Bernhardt 2012 speaker flip fixed surgically."

0 commit comments

Comments
 (0)