Przede wszystkim - samodzielność.
Nikt nie jest w stanie wszystkiego znać, wszystkiego zrobić od ręki i bez błędów.
Ale podstawowa różnica, która oddziela fachowca od amatora/początkującego to właśnie ta samodzielność (oraz wspomniana przez @WeiXiao kurjoziti
). Chodzi o to, że osoba naprawdę dobra umie poszukiwać samodzielnie rozwiązań. Nie wisi na swoim PM/opiekunie/koledze z dłuższym stażem, ale umie sama podejść do tematu, pokombinować, poszukać rozwiązania itp.
Oczywiście - są też inne rzeczy, takie jak pisanie czystego kodu, trzymanie się standardów, znajomość wielu bibliotek czy algorytmów i tak dalej. Ale, moim zdaniem, samobieżność i niezależność to podstawowy wyróżnik kogoś dobrego. Plus jeszcze coś, czego ja osobiście nienawidzę - czyli analizowanie gotowego kodu. Chyba każdy się zgodzi z tym, że 100x łatwiej jest samemu coś napisać od zera, niż rozbierać na czynniki pierwsze coś, co zostało napisane wcześniej przez kogoś (albo nawet siebie samego). Dobry programista powinien umieć bezproblemowo analizować istniejący kod i odczytywać intencje autora. To jak z doświadczonym kierowcą - potrafi nie tylko pilnować siebie, ale i przewidywać zachowania innych uczestników ruchu.