This saying means you shouldn't start coding from scratch something that has already been done and you can use to save time and effort. The wheel basically is a method of function, or a set of them, that is needed as part of the software you're developing.
This philosophy is not a bad thing in itself, it means well, it wants you to avoid extra work. But it's awfully abused and misinterpreted.
Here are the only two cases when you can use this philosophy:
- You have to know how to make the wheel in the first place! Most people avoiding reinventing the wheel, do it out of laziness and lack of proper programming knowledge. You should at least be able to visualize how you would construct the wheel, with a fair amount of implementation detail.
- You have already made similar wheels in the past. From experience, you know how to do it, and you could do it, but you're behind schedule, and this borrowed wheel won't alter your software's customization and flexibility.
- The wheel is 100% yours to customize, alter, destroy, make rectangular, etc.
- Deriving from that idea, the wheel you're using is not attached to some third-party license or user-agreement.
- You can isolate your wheel and make it available for others, giving that they fit in one of the two cases established above.
- Reinventing the wheel, in most cases, implies doing it your way, with your style, your choice of design, and it's a perfect fit for your software
- Reinventing the wheel proves you can do it, and shows you're capable. You would be surprise how many ignorant programmers use this "reinventing the wheel" philosophy to hide the fact that they have absolutely no clue on how to do it. If you're a manager, be wary of those!