minimal code for multiple buttons de-bouncing
Yes, your code should work as the most basic debouncing, although the
debouncing time may be a little bit short. Note however that, in many
instances, one would like to have a little more that the most basic. One
may also want:

deglitching: when the button is held down, your hand may make the
contacts move a little bit, making spikes in the reading that are not
associated with a real change in the button position; you don't want
those spikes to read as &quot;released and pressed again&quot;
edge detection: many times you are more interested in the button
press event than in knowing whether the button is down or up; this can
be handled by another function, but it can be convenient to integrate
it with the debouncing
non blocking operation: your program may have better things to do
than wasting CPU cycles inside delay().

Those are the reasons most debouncing codes are significantly more
complex. But it's often worth it.

Edit 1: In view of the comments, some clarification seems to be
needed. There are two kinds of glitches a mechanical button can
experience:

when the button is mechanically changing position, i.e. it is being
depressed or released; this is called a bounce
when the button is being held down, especially if the pressure on the
button is low and the finger applying that pressure is somewhat
shaky.

Most debouncing libraries you can find actually address both kinds of
glitches. Thus, they do more than just debouncing, they do what I
called “deglitching”. The previous answers implicitly assume that a
proper debouncing code must address both kinds.
The code posted in the question only addresses the first kind of
glitches, i.e. the bounces in the strict sense. That's why I wrote
that it does the “most basic debouncing”. It is however susceptible to
the second kind of glitches. So yes, with this code glitches can persist
even after debouncing.
Edit 2: As an example, consider the Bounce 2 library. It
provides edge detection, non blocking operation and, in the default
configuration, full deglitching. However, it can be configured to use
an alternative debounce algorithm called “Lock-out
interval”, which is more responsive but does not protect against the
“type 2” glitches mentioned above: it “does not cancel noise”, as the
documentation puts it.