So there are a couple of ways to approach this:
Preserve Single
library(tidyverse)
year <- factor(c(rep(c(2020), 11), rep(c(2021), 8)))
author <- c("Mary", "Nicol", "Steve", "Mary", "Nicol", "Mary", "Mary", "Mary", "Steve", "Nicol", "Mary",
"Nicol", "Steve", "Frank", "Mary", "Mary", "Frank", "Nicol", "Nicol")
msg <- rep("blablabla", 19)
df <- data.frame(year, author, msg)
p <- ggplot(df, aes(x = author, group = year, fill = year))
p + geom_bar(position = position_dodge2(preserve = "single")) +
labs(x = "", y = "Number of messages", title = "Number of messages by year and by author")

tidyr::complete
library(tidyverse)
year <- factor(c(rep(c(2020), 11), rep(c(2021), 8)))
author <- c("Mary", "Nicol", "Steve", "Mary", "Nicol", "Mary", "Mary", "Mary", "Steve", "Nicol", "Mary",
"Nicol", "Steve", "Frank", "Mary", "Mary", "Frank", "Nicol", "Nicol")
msg <- rep("blablabla", 19)
df <- data.frame(year, author, msg)
df |>
count(year, author) |>
complete(year, author) |>
ggplot(aes(x = author, y = n, fill = year)) +
geom_col(position = position_dodge2()) +
labs(x = "", y = "Number of messages", title = "Number of messages by year and by author")
#> Warning: Removed 1 rows containing missing values (geom_col).

Created on 2021-12-08 by the reprex package (v2.0.1)