I do but so far I'm only doing the most rudimentary of shapes. Mostly I am simply automating manual jobs at home.
I started using wizards to generate the more complex code for shapes and contours and then reverse engineered them. The wizards were buggy so once I learned how the G-codes function, I found it easier to build Excel sheets to generate my tool paths. Start with origin points, calculate steps and offsets and then just copy and paste into my editor.
I committed to learning to program manually so I would have a base understanding of what posted code will look and act like in execution. I figured this would help in the long run at work and at home as I do not have a background in machining. The long road is the best road when it comes to obtaining knowledge.
At work we use custom Siemens functions or "canned cycles". Some of it breaks down to G or M codes eventually but most does not. Our machines are essentially two in one so function is much more complex. We use CNC protocols to position an end effector and a corresponding secondary tool. The positioning is done via a Siemens 840D controller and then the end effector function is controlled via 3 separate PLC controllers.
We use Catia modeling to generate a 3D part position in which to position TCP (tool center point). Once in position, the machine executes a canned cycle.
There are up to 32 different axis's involved depending on which of our machines we are discussing.
It's good environment to learn CNC controls but we don't think on the terms of toolpath so such things are very much still a mystery to me. Our machines do work "on parts", we don't actually "make parts".
This is the beast I am currently parked in front of.