* There's no good support for the concept of functions/procedures. Let's say we need to take some input, do some transformations and produce output, and we need to do that in multiple places in our patch. We can copy the objects but that will make the patch use more memory and there will be no code reuse. Another way is to make that an abstraction, but it's silly to make abstractions for every little thing that we need in 2 places. Also, instantiating 2 abstractions still uses more memory. We can try reusing the same code but we'll have to make multiple output connections so we'll need proper routing in order to figure out where to send the result. I made an abstraction to simplify that but this should be a standard feature of PD.
* *.pd format is not very friendly to Git. Try viewing diffs and resolving merge conflicts. Moving a subpatch on the screen causes different coordinates to be saved in the file, often resulting in conflicts. Cutting and pasting renumbers all objects and connections. This makes using branches and working on the same files impractical.
* PD seems to be maintained by only a handful of people and new features/bug fixes are rarely released. I used to code in C and was thinking of contributing but I found no good guide for new contributors. I wasn't even able to compile PD on my Mac (there's multiple build scripts in the sources but none of them work). I'm also not sure what the testing process should be (to make sure I'm not breaking any existing functionality or support for operating systems or devices).
* PD community uses mailing lists for communications, haha. In order to find useful information I have to view one message per page, with tons of distracting quotes from previous messages.
These are just the first things that came to my mind...