In a suite with no wait library, every engineer writes waits from memory. Some wait for presence when they meant visibility. Some read the element before waiting. Some hard-code timeouts. Every one of those is a flaky test waiting for a slow day.
The fix is not training. It is making the correct thing the easiest thing to write.
Start from what people actually get wrong.
Presence instead of visibility. elementLocated returns as soon as the element is in the DOM, which can be before it is visible or interactive. Then the click fails.