a) Prevent mediocrity from being "too nice" (e.g. allowing classic things like treating every problem as web/CRUD, too many layers of DALs or object hierarchies or using nested set tree traversal instead of materialized path when it's called for)
b) Get people to focus on the consequences of their design decisions when they affect the users/product, even if the implementation required to handle them might not be available with existing/obvious tools, or as my CEO said today "slow is smooth and smooth is fast", so get people to take it slow in the right way
c) Encourage critical thinking and asking questions over copy/pasting stack overflow or top google results, learning about evolution and historical rationale of a design/problem
d) Without offending anyone
I'm working on how to communicate without being condescending or dismissive and finding it hard. When I was in management positions in the past I could just make these decisions and people would be fine with it because I would take final responsibility, but since deciding to go deeper into IC territory, I find myself needing to persuade less experienced colleagues more often. I like teaching but don't want to be paternalistic, and sometimes I just want people to learn fast and use the guard rails provided, or spend the time to climb a difficult learning curve.
How do you do it?