As for my personnal experience I started programming with Pd and it help me to get a grasp of what programmation can help me achieve and more importantly it got me excited about it ! because it was easy to achieve some results quite early with the help of the awesome community.
Now I use pd mainly as an audio lib, I developp patches in pd and use them in third party code using libpd : https://github.com/libpd/libpd
Data-flow is truly awesome when it comes to audio it enables you to prototype really easily. Pd is truly cross-platform, is one of the most complete and easy to use audio lib you could find. It is really worth it ! If you are already an experienced programmer I would go the libpd way.
As David says Katja does amazing work, her website is a real reference for me. I would also mention Andy Farnell's work with this reference book which uses pd for all the code examples : https://mitpress.mit.edu/books/designing-sound (which are available free for download). Unfortunately http://obiwannabe.co.uk/ is down but you would find a ton of tutorials from the book.
As for abstraction libs that are well coded and documented from which you can get good design patterns :
There are probably a lot of other good libraries too.
As for best practices they are the same as other programming languages keep your abstractions short and modular, write comments etc.
For pd specifics, you could try not to cross too much cables, and you probably want to try to keep your data going from top to bottom as much as you can and make it clear if you don't.