LOTS of 'em
It depends on the methodology used.
If you use test-driven development, it is more likely that you won't find much errors because you do the testing first.
If you use Rapid Application Development (RAD, like the Borland/Embarcadero RAD Studio the later 'Delphi' and 'C++ Builder') you may find performance issues, database connecting issues, UI design issues and mostly RAM memory proper handling.
If you use languages of not-so-high level, like C, you may have some trouble with pointers, segFault, memory handlers, etc.
If you use some methodology that relies too much on the user's machine, like .net-dependent applications and (unusual to have issues but still counts) JVM, you may find some implementation issues.
Of experience I can say: if it works, it may fail. If it fails, it may work.
And there are things that are not 'bugs' or 'problems' but lack of features or improvements. By example: I can easily develop an application that populates a table with 1.000.000.000 entries. But I can make it work in a LOT of ways and one (or some) of them will have a better performance. About the lack of features, it is easy to IMAGINE the software you want. You can think 'uh, I wanna build a web browser that recognizes the face of the user and, according to its smile, it loads some specific URL'. Well, GREAT! But, HOW to 'make it work'? It is not a problem nor a bug, but it is something that will easily show up on a test.
Final words: if you don't wanna have problems with testing, go test-driven. If you wanna easy development, go RAD and learn some performance tricks. If you wanna go 'easy', go with ultra-high-level languages like python. And if you wanna go suicidal, go ASM ;p