Well that's easy, isn't it? You just learn and use a CAD package. Surely? Yep, but what about when you want parts other people can make? Or if you haven't bothered to calibrate your machine, etc. etc.
I haven't calibrated my 3D printer in ages. I just chuck filament in it, and hit "go". For non-mechanical parts, this is fine, but for mechanical parts, how do you do this and make sure that they're still going to fill their intended function? Here's a bunch of tricks I use:
Engineering Fits Need to put something on an shaft? Look up the engineering fit. Loose fit? H11, 0.1mm on an 8mm shaft. Fit a skateboard bearing into a part? H7, 22mm, so add 0.02mm. Unfortunately this often isn't enough. When printing a hole, the shrinkage of the material as it cools often makes the hole smaller than spec, and the layers mean that the precise definition of "edge" isnt' quite where the slicer may think it is. (Particularly not if you don't calibrate your extrusion multipler - which I don't).
Don't make it precise Got a long hole? Make it bigger than necessary and just narrow it at the ends. Add extra space (or remove material) around objects unless there is a very good reason for it to be tight.
Assume Imperfections A printer often has elephants foot where the bottom few layers are a little bit bigger. Assume this will be the case, and that the slicer won't compensate for it, and add a chamfer on the bottom of your parts. Similar for printer capabilities - assume there will be some overextrusion, assume the guy is printing on a bigger nozzle than you etc.
Don't assume the slicer or printer is working right Slicers struggle with certain things, such as thin walls. Printers struggle with certain things, such as overhangs. Be conservative with these. Make gear teeth big, make walls chunky. The advantage of working this way is that you can always use the same slicer profile. I have pretty much one profile: 0.8mm CHT draft with 0.3mm layers. I rarely look at sliced files because I use a build system to generate the gcode for me. This is only possible because I design the parts to work without needing to twiddle slicer settings.
You don't need support Really, I can't think of a single case in the past few years of printing where I've actually needed support for a mechanical functional part. A bit more design effort can almost always remove the need for support.
Design in print orientation. Makes your life easier, both to reason about the part and it's printability and when preparing to print. As mentioned before I use a script to generate my gcode, this is only possible because I model in print orientation. And why not? If you're modeling your parts separately and combining them into an assemble, you may as well.
If you need precision, use another tool Need a thread? Don't print it, tap it. Need a nice smoothly rotating shaft? Use a bearing. Need a close fitting hole, drill it with a drill press. And so on. Things don't all need to be printed, and it can be easiest to add precision by adding in precise parts rather than by expecting your printer to be super accurate.
The future? I look forward to the day when I can model in a CAD package and enclude engineering tolerances in my measurements, that these end up going to the slicer, and the slicer can figure out if it will do a good job of producing those parts and make any necessary adjustments (eg specify a hole as 8mm with H11, and the slicer adjusts it to print a hole that is guaranteed to be between 8.00mm and 8.15mm). But it is not this day yet.