►
Description
Daniel Smith projects his screen and reviews API-changing PRs while giving live commentary!
Presenter: Daniel Smith, Google
A
I
guess
we
should
go
ahead
and
get
started.
This
is
gonna,
be
a
improvisational
session.
I've
never
done
this
before.
If
everybody
could
come
kit
sit
close,
maybe
you
want
to
ask
questions
or
something
or
and
also
there's
gonna,
be
like
tiny
code
up
on
the
screen.
So
if
you
want
to
come
sit
in
the
first
few
rows,
I
think
that'd
be
better.
A
A
Can
you
get
us
a
little
too
much
slightly
delayed
reaction?
Okay,
there
we
go
so
this
is
just
a
random
API,
changing
PR
and
whenever
I,
whenever
I
look
at
a
API
changing
PR.
The
first
thing
I
try
to
do
is
figure
out.
What
is
the
purpose
of
this?
What
are
they
trying
to
accomplish?
What
do
they
think
they're
trying
to
accomplish
so
and
then
then
I
look
at
like
well,
let's,
let's,
let's
see
if
we
can
figure
out
what
this
API
change
is
about.
A
So,
let's
see
include
a
new
staging
repo
ads
but
doesn't
implement
runtime
class
and
there's
even
a
link
to
a
cap.
So
let's
see,
let's
take
a
look
at
the
commits
and
see
what's
in
there.
Sometimes
people
are
very
nice
and
they
group
commits
logically
with
like
generated
code
and
one
chunk
and
API
changes
and
and
another
commit.
So
let's
see
I
think
Tim
might
have
done
that
generators,
API
types,
nobody
API,
repo,
ok,
let's
look
at
the
API
types,
so
after
I've
got
like
some
context.
A
The
next
thing
I
try
to
do
is
is
I.
Look
at
the
types
right,
so
zoom
out
just
a
little
bit
more.
Actually
that's
unified
here,
since
this
is
mostly
new
code,
I.
Think
yeah,
since
it's
mostly
new
code,
it'll
be
easier
to
read
like
this
ok
now
it
is
super
important
to
have
good
documentation
in
the
api's,
because
the
the
comments
that
you
put
on
your
API
is
end
up
going
into
the
the
release.
Documentation
that
end
users
see.
So
it's
important
to
give
people
context.
A
A
This
model
there's
a
mental
model
of
how
all
the
pieces
work
together
and
all
that,
but
I've
never
seen
your
API
before
so
if,
if
I
can't
figure
it
out
from
the
comments,
probably
people
who
have
less
context
in
the
system
will
also
have
a
really
hard
time.
So,
okay,
this
is
a
pretty
short
one.
So,
let's
start
with
runtime
class
okay,
this
seems
to
be
the
like
route
object.
Right,
like
you
are,
our
types
usually
have
like
a
thing
that
has
spec.
A
A
So
at
this
point,
like
I
already
have
a
a
comet
which
is
I,
am
not
sure
what
that
means
like
what
is
the
runtime?
Maybe
it
means
a
docker
container
runtime,
that's
my
guess,
but
it's
not
clear
like
right.
Like
it
doesn't
say
it's
is
it
related
to
nodes,
so
so
I'm
gonna
read
a
little
bit
more
and
then
figure
out
what
what
kind
of
comment
to
leave.
A
So,
let's
see,
we
have
a
type
meta
and
object
meta.
Those
are
always
on
our
types.
So
that's
pretty
standard.
One
thing:
that's
good
to
check
is
that
the
JSON
tag
names
match
or
are
correct
in
some
way.
That
has
been
at
least
partly
automated,
no
I
highway
sitting
over
there,
so
I
don't
have
to
be
quite
as
careful
as
they
used
to
so
this
is
very
simple.
This
object,
coz
has
a
spot
for
the
type.
A
That's
got
a
soft
spot
for
the
object,
meta
and
it's
got
a
speck,
and
the
comment
on
the
spec
is
specification
of
the
runtime
class
with
a
more
info
link
that
appears
to
link
to
the
general
API
API
object
definition.
So
what
I'd
really
like
to
see
here
is
is
yeah,
and-
and
here
we
have
also
a
runtime
class
spec-
is
a
specification
of
a
runtime
class.
So
I
I,
don't
know
about
you,
but
I
like
to
see
in
comments
things
that
I
couldn't
have
figured
out
from
the
name
right
like.
A
Meninas
that
your
name
was
good
right
like
if
the
name
is
as
expressive
as
the
comet.
That's
that's
that's
a
point
in
favor
of
your
name.
It's
not
a
point
in
favor.
If
your
comment,
we're
not
just
making
these
comments
to
make,
go
doc
happy
with
us.
Well,
maybe
some
of
us
are,
but
in
API
types,
hopefully
we're
writing
these
commas
to
help
people
understand
the
system.
So
instead
of
a
this
is
a
sort
of
general.
My
theory
on
code
comments
in
general
is
like
don't
tell
people
what
the
code
is
doing.
A
People
can
read
the
code,
the
exception
being,
if
you're
doing
something,
especially
subtle,
in
which
case,
maybe
you
should
think
about
not
doing
that.
But
if
you
have
to
do
a
subtle
thing,
then
okay
tell
people
what
the
code
is
doing,
but
most
of
the
time
you
want
to
tell
people
why
you
wrote
that
code
or
why
you
did
it
that
way
as
to
posed
to
some
other
way
right.
So
it's
this
it's
the
same
with
API
types.
So
is
a
specification
of
a
runtime
class.
A
Okay,
let's
see
we
have
one
member
and
it's
called
a
runtime
handler.
So
let's
see
if
this
comment
helps
us
runtime
handler
specifies
the
underlying
runtime
and
configuration
that
the
CRI
implementation
will
use
to
handle
pods
of
this
class.
Okay,
so
apparently,
pods
have
some
relationship
to
runtime
classes.
A
B
A
A
A
Ok,
so
so-
and
let
me
just
read
the
rest
of
this-
this
is
literally
the
first
time
I
looked
at
this
PR,
so
we're
not.
It
is
assumed
that
all
handlers
are
available
on
every
node
and
handlers
of
the
same
name
are
equivalent
on
every
node.
If
this
is
not
specified,
a
default
will
be
chosen
by
the
implementation
so
and
runtime
handler,
and
it's
a
string
is
a
pointer
to
a
string
because
it's
optional,
ok,
so
and
then
a
list
is
just
a
list.
A
A
So
now
yeah
we
can.
We
can
double
check
some
mechanical
things
like
ok,
it's
optional.
That
means
it's
a
pointer.
It
means
it's
got
home
and
empty.
Those
are
those
those
match.
That's
good!
Json
runtime
handler
matches
this.
The
JSON
tag.
Name
is
lowercase.
The
NGO
name
is
uppercase.
That's
all
good!
You
can
see
here
that
the
proto
protobuf
generator
has
been
run.
A
A
Yeah,
so
maybe
the
comment
is:
maybe
we
shouldn't
use
links
for
the
API
conventions,
yeah,
that's
a
that's
a
good
question
or
good
thought.
I
think
that
we
do
this
and
many
of
our
resources,
III
think
stuff
stuff
like
metadata.
That
may
be
okay,
because
it
really
is
like
we
don't
want
this
documented
separately.
That
means,
if
we
change
it,
we
have
to
update
it
in
a
dozen
places
so
that
part's,
okay,
I
think,
but
the
this
usage
on
spec
right
here,
I
think
is-
is
a
little
bit
problematic.
A
C
A
Should
we
inline
this
string,
I
think
so
I
actually
I
think
there's
a
broader
question
which
is:
is
this
object
all
spec
or
is
at
all
status?
Our
users
are
allowed
to
change
the
handler
or
is
the
handler
something
like
a
fact
that
cubelet
is
going
to
report
back
about
the
system
and
I
don't
see
enough
information
in
this
to
know
the
answer
to
that
and
I
also
haven't
read
the
runtime
class
cap.
A
So
I
don't
know
the
answer
to
that
see
actually
sometimes
it's
kind
of
a
benefit
to
not
having
read
the
cap,
because
this
way
you
know
yeah
you
you
know
if
you
can
understand
it
from
the
comments
that
it's
that
it's
gonna
work.
Okay,
alright,
how
do
people
feel?
Would
you
like
to
see
me
actually
write
the
comments
that
I
would
write
out
for
this,
or
should
we
go
to
then
go
to
the
next
one?
So
raise
your
hand
if
you're
in
favor
of
seeing
me
type
comments,
laborious
lis,
okay
at
least
do
one
okay.
A
A
A
C
A
I
think
if
I
didn't
have
those
questions
about
this
comment,
then
it
would
be
then
it
would
be
better.
Okay,
that's
good
I
think
this
one
is
possibly
the
one
of
the
more
confusing
one,
so
at
least
I
am
first
going
to
say.
Can
we
spell
out
CRI
least
once
can
we
say
what
the
relationship
to
this
object
and
CRI
is
okay,.
A
C
A
That's
a
great
question,
so
the
question
is:
is
a
present
but
empty
string
equivalent
to
an
absent
string,
and
the
answer
is
kind
of
the
answer?
Is
yes
or
no
is
kind
of
like
the
quantum
superposition
of
two
states?
If
you're
looking
at
the
wire
in
the
let's,
let's
pick
the
JSON
representation,
a
absent
string
means
the
field
is
omitted
completely
a
present,
but
empty
string
means
the
field
is
present
with
a
colon.
A
Like
quote
quote,
you
can
imagine,
although
I
think
yeah
JSON
doesn't
really
have
a
like
the
concept
of
a
type
or
whatever
you
can
imagine.
Somebody
typing
out
a
JSON
file
that
is
present
:
null,
so
the
wire
format
can
express
those
things,
but
it's
kind
of
up
to
the
people
who
are
reading
the
wire
format
as
to
what
they
how
they
interpret
that.
So
yes,
here
it
says,
omit
empty
and
it's
a
pointer
to
a
string,
which
means
it
would
only
be
omitting
it
if
the
pointer
were
nil.
A
So
you
will
either
have
a
this
means.
You'll
definitely
be
able
to
tell
whether
the
user
added
the
string
or
not
and
if
they
added
the
string,
then
you'll
you'll
get
a
value
there
and
you'll
be
able
to
tell
if
they've
put
a
empty
string
or
provided
a
string
so
yeah.
Actually
that's
that's
another
thing
we
can
ask
here,
which
is:
is
it
okay
for
a
user
to
provide
this
string
with
an
empty
value.
A
Yeah:
okay:
there
was
something
else
that
I
wanted
to
ask
about
this,
which
is
oh
yeah,
who
are
the
actors
that
are
expected
to
work
with
this
object,
who's?
Writing
it
who's.
Reading
it
and
I
think
that
a
good
place
to
say
that
is
by
the
top
level
type
and
the
actors
that
will
read
and/or
write
this
object.
A
D
A
Yeah,
so
that
that
so
to
rephrase,
the
thought
is
that
maybe
this
is
a
way
of
plumbing
some
sort
of
untyped
blob
of
data
from
somebody
who
knows
what
it
should
be
to
somebody
who
needs
to
consume.
It
I
really
hope.
That's
not
what
this
API
is
about,
because
that
that's
hard
on
the
system
like
in
theory
the
kubernetes
api
is
kind
of
typed
saved
type,
safe
and
and
you're,
if
you're
dodging
that
you
make
the
system
worse
in
that.
A
A
Yeah,
that's
not
a
bad
question
like
what
would
it
be
okay
to
just
omit
the
object
completely
in
that
case
and
and
that
that's
like
related
to
my
question
like?
Is
that
spec
or
is
it
status
and
who
is
reading
it
and
who
is
writing
it
and
what
sorts
of
sibling
fields
might
we
expect
to
be
added
in
the
future,
so
that
was
like?
That
might
be
a
reason
to
yeah
yeah.
It's
not
it's
not
clear
to
me.
E
C
A
Yeah,
it
does
seem
like
from
the
PR
description
that
this
is
kind
of
a
first
draft
and
it's
not
intended
to
be
complete.
So
maybe
maybe
that's
okay,
but
on
the
other
hand,
I
think
the
project
as
a
whole
is
worked
like
we're
trying
to
be
better
we're
trying
not
to
commit
partial
api's,
because
sometimes
we
like
to
make
releases
and
ship
and
it's
hard
if
things
are
partially
implemented.
A
That
is
a
good
that
it
is.
It
is
alpha
yeah
yeah,
it
is
alpha.
Okay,
shall
we
go
on
to
the
to
the
next
one?
Maybe
let's,
let's
keep
going
okay.
This
is
again.
I
have
not
I
looked
at
these
enough
to
like
copy
the
links
and
open
up
tabs,
but
I
haven't
looked
at
the
contents,
and
also
this
is
a
adventure
for
all
of
us.
Okay,
let's
see
this
is
an
API
change.
A
It
implements
an
API
change
after
some
discussion,
so
I'm
actually,
once
again,
gonna
read
the
API
change
without
context,
because
people
who
come
to
the
API
will
also
be
reading
it
without
context.
So
and
if,
if,
if,
if
necessary,
we
can
go,
read
the
context
next,
let's
see
so
it
fixes
this
other
thing:
user
facing
change.
Okay,
we
extend
the
volume,
sub
path
and
expansion
alpha
feature
to
support
environment.
Variable
expansion,
oh
okay,
implements
sub
path,
expression,
field,
the
field,
sub
path,
expression
and
sub
path
are
mutually
exclusive.
A
Alright,
that
sounds
like
some
potential
backwards
compatibility
landmines.
Let's
go
take
a
look
and
see
alright,
like
whenever
you've
got
a
field
like
if,
if
it
used
to
be
required,
and
now
like
this
other
field,
is
optional
and
like
they're,
mutually
exclusive.
What
about
clients
that
expected
the
old
field
to
always
be
present?
So
hopefully
it
didn't
used
to
be
phrased
like
that
and
the
other
hand
it's
also
alpha.
So
maybe
maybe
it
doesn't
matter
it
did
say
it
was
an
alpha
field
right,
okay,
so
that's
fine!
Okay
type
stock
go!
A
That
is
a
very
short
change,
but
let's
find
so
if
you
were
here
for
Stefan's
presentation
in
the
last
hour,
you
know
that
we
have
versioned
types
and
internal
types,
and
this
one
is
the
internal
type.
The
internal
types
comment
is
just
nice
to
have.
It
doesn't
actually
need
anything.
So
let's
go
find
the
external
type
definition
on
this.
This
change
has
a
validation,
so
that'll
be
interesting.
A
A
A
A
Okay
and
okay,
let's
get
some
more
context
here.
So
what
are
we
talking
about?
Okay
volume
mounts
volume
amount
describes
the
mounting
of
a
volume
within
a
container
who
here
has
mounted
a
volume
into
a
pod
before
Cadiz
okay,
so
you
have
like
some
context
or
some
idea
of
what
this
is
doing.
Right
like
in
a
in
a
pod,
you
specify
the
volumes
and
you
specify
where
they
mounted
separately.
Okay,
that
seems
okay,.
A
A
C
A
Sub
path,
so
I
understand
mountain
path.
Path
within
the
container
at
which
the
volume
should
be
mounted
must
not
contain
:
sub
path
path
in
the
volume
from
which
okay,
so
so
seems
like
there's
a
two-phase
selection
thing
going
on
here
like
there's:
where
do
you
want
it
to
be
mounted
in
the
container?
Where
do
you
mount
it
want
it
to
be
mounted
from
in
the
in
the
volume
right
so
yeah.
D
D
C
A
The
comment
is
sometimes
you
want
things
in
things
in
the
you
yeah,
you
want
to
divvy
up
your
volume.
You
mounted
one
volume.
Different
paths
go
to
different
containers
in
your
pod.
Perhaps
I
think
subpath
is
a
really
bad
name.
For
that,
honestly,
it
gives
you
no
indication
that
it
is
about
the
source.
It
is
yeah,
so
mount
path,
I
guess
that
makes
sense,
but
why
wouldn't
they
call
it
like
source
path
or,
yes,
I-
think
source
path
by
the
way
target?
It's
a
terrible
name.
You
can't
tell
if
target
means
source
or
destination
it?
A
A
Expanded
path
within
the
volume
from
which
the
containers
volume
should
be
mounted
defaults
to
empty,
empty
quote.
Okay,
so
I,
guess
that
the
idea
is
we're
gonna,
expand
with
environment
variables.
This
path,
however
I
don't
know
what's
in
texts,
are
using,
are
they
gonna
use
like
bash
standard
syntax?
Are
they
gonna
use
the
like
dollar
paren,
syntax
that
we
have
elsewhere
in
the
API?
C
A
A
Yah-Hoo,
that's
a
good
question.
Yeah
who
is
doing
the
expansion
I
will
ask
that
one
yeah.
Let's
just
ask
that
now
I'll
ask
what
component
I
always
try
to
be
neutral
about
components
like
it's
very
natural
for
software
engineers
to
kind
of
identify
what
their
component,
but
then,
then,
if
you
like
try
to
make
a
technical
criticism,
it
can
come
off
as
a
personal
attack.
So
it's
usually
good
to
ask
what
component
and
not
who
I
don't
always
remember,
but
I
try
what's
the
CRI
is
the
is
the
component.
A
Oh
cool
I
think
yeah
I'm
still
gonna
yeah
I
was
still
gonna.
Ask
the
question
sometimes
sometimes
by
the
way
like
like
these
are
things
that
I
genuinely
haven't
seen
before,
but
often
even
if
I
do
know
what
they're
doing
I
will
still
praise
all
of
my
criticisms.
This
way,
I
think
that
I
have
found
that
that
is
much
easier
to
receive
than
being
told
that
you're
wrong.
So
I
try
not
to
do
that.
So,
let's
see
what
component
will
do
the
expansion
and
finally,
what
sources
of
in
marry
apples
will
be
used.
A
C
A
Yeah
then
we
have
to
like
how
complicated
do
we
want
to
get
yeah
so
technically,
a
you're
providing
both
of
them
even
if
they're
empty,
but
it's
not
a
problem
because
they
both
say
the
same
thing,
but
that's
kind
of
a
weird,
a
weird
interaction.
I
think
it
would
be
best.
If
both
of
them
were
pointers,
then
it
would
be
very
clear
which
one
you
were
choosing
and
it'd
be
easier
to
yeah
question.
A
A
A
Unfortunately,
people
with
who
are
using
client
go
may
not
be
quite
so
happy
with
you
so,
but
historically
like
we
have
made
people
with
client
go
upgrade
every
release
and
I
mean
that's.
This
is
a
bug
report,
not
a
future
statement
so
but
I
think
I
think
it
might
be
best
if
we
promoted
this
to
optional.
That
said,
although
it
is,
it
is
safe.
F
C
A
F
C
F
C
A
D
A
Right
yeah,
that
is
correct
and
yeah
I,
think
that
that
yeah,
so
there's
sort
of
there's
sort
of
this
unstated
I
believe
it's
document.
It
is
definitely
documented
and
various
like
google
internal
how
to
how
to
do
code
reviews,
but
the
the
idea
is
like
the
questions.
I
asked,
like
don't
answer
me
answer
it
in
the
code
like
answer
in
the
comments,
I
believe
that,
as
documented
somewhere
in
the
community
guidelines
for
free
kubernetes,
this
is
this
is
also
like.
This
is
this
is
just
something
I
sort
of
expect.
David
wants
to
tell
me
something.
C
C
C
A
Yeah,
honestly,
I,
don't
I,
don't
look
at
the
internal
types
that
carefully
I
sort
of
expect
people
to
like
copy
back
the
comments
like
either.
You
should
have
MIT
them
or
they
should
match
I
think.
Typically
they
they
they
match,
I'm,
not
quite
as
worried
about
the
internal
types,
because
they
don't
they're,
not
the
source
of
truth
for
documentation.
A
So
I
I
have
lots
of
things
to
review.
So
I
have
to
spend
my
time
carefully
finding
the
most
the
places
where
I
can
add
the
most
value.
Okay,
so,
let's
see
there's
a
commenter
recently
found
issues
with
this
validation
and
downgrade
scenarios.
Yeah
I'm
I'm
a
little
worried
about
that
too
I'll
be
able
to
delete
your
pods
because
it
will
fail.
This
validation,
yeah
remember
when
I
first
opened
this
I'm,
like
oh,
that
sounds
like
a
backwards
compatibility
concerned.
So,
okay,
let's,
let's
see
so
they're,
adding
something
if
the
length
is
greater
than
zero.
A
C
A
E
A
A
A
You
know
if
there's
already
a
feature
gate
for
the
other
one.
Why
do
we
really
need
to
add
a
feature
gate
for
this
new
one
right
like
feature
gates,
are
there's
some
overhead
that
comes
with
like
like
not
not
code
overhead,
but
like
conceptual
overhead
that
comes
with
those
now
it's
subpath
screen
and
zero.
Okay,
that
seems
alright.
A
C
F
A
It
looks
like
people
are
already
worried
about
the
yeah
yeah,
so
we've
had
a
discussion
ongoing
discussion
about
how
feature
gates
should
work.
My
own
position
is
that
a
feature
gate
like
lets.
You
use
the
feature,
but
it's
not
a
it's
not
like
the
primary
way
you
enable
or
disable
it
it's
like
an
extra
safety
check
at
the
beginning.
A
So
if
you,
if
you
manage
to
set
it
in
an
object
and
the
feature
gate
is,
is
on
or
is
off,
then
it
you
should
continue
to
be
able
to
update
the
object,
otherwise
you're
kind
of
in
a
bind.
If
you
turn
off
the
feature
gate,
which
is
you
know
something
that
you
might
want
to
do,
it's
also
sort
of
the
worst
time
to
start
exercising
new
code
baths
right,
like
the
whole
reason
to
turn
off
the
feature.
A
Gate
is
because
you
found
a
bug,
which
means
you,
don't
necessarily
trust
the
testing
of
the
people
who
put
in
the
feature,
which
means
that
you
know
now.
You've
now
you've
got
the
feature
gate
off,
but
objects
that
are
trying
to
use
the
feature
so
you're
exercising
a
different
set
of
code
paths.
So
so
seems
risky,
so
yeah
I
think
that
we
don't
have
too
much
time,
but
that
would
be
by
next.
My
next
comment.
A
A
F
A
All
right,
we've
got
two
minutes
left
questions
for
the
thoughts.
Are
you
all
gonna
go
out
and
review
some
API
changes
now
yeah.
Please
please,
please
do
it's
it's.
Actually.
It's
actually
helpful
to
have
somebody
go
through
and
because
often
like
somebody
will
go
out
and
make
changes
and
then
I
come
back
to
it
like
later
with
fresh
eyes
and
have
to
basically
reread
the
whole
thing.
So
it's
pretty
it's
pretty
helpful.
If
somebody
can
like
get
the
comments
fixed
or
whatever
yeah.
A
How
do
you
make
sure
your
PR
is
getting
reviewed?
I
I
have
to
confess
that
I
have
like
somewhere
in
the
range
of
40
to
60
PR.
It's
assigned
to
me
that
I'm,
unfortunately
not
paying
good
attention
to
basically
at
all
times
so
I'm,
just
sort
of
resigned
to
the
fact
that
I'm
gonna
feel
guilty
for
the
rest
of
my
life
and
unfortunately,
the
way
it
works
and
it'll
probably
stop
working.
B
A
G
A
There
is
actually
a
style
guide,
I
think
it's
a
is
it
perfect
and
complete
I'm,
not
sure
there
is
definitely
API
conventions
document.
Maybe
we
can
find
it
I,
always
Google
stuff,
Nettie's
API
conventions,
don't
see
API
conventions,
let's
see
yeah,
okay,
what
happened
there?
It's
a
little
old
it
looks
like,
but
let's
see
is.