1) their "device simulators" could not be relied upon
2) certain devices running certain versions of their OSs would have APIs function or not (i.e: a library call may work in one OS version and not in another, but only on one type of device)
3) every time you wanted to run any code on a device, it needed to be signed by blackberry's signing servers - which were often down or slow (waits of 40-60 seconds were common). (it no longer exists, but we had http://isthesigningserverdown.com to help us know)
4) sometimes the devices just restarted, either when you tried to load something or sometimes when you made certain API calls. Blackberry devices took MINUTES to start.
5) logging infrastructure was basically non-existent... logs went to a hidden log page, (ctrl+lglg to access it and view/scroll on the bb device) - we wrote our own network logger lib to basically `tee` to the builtin logger and back to our desktop consoles.
the first 3 points combined meant you often had to iterate on real hardware, waiting 40-60 seconds to deploy each time, only to have it explode in your face by restarting and then frustrating you by not being able to figure out what was going on.