It has a large amount of internal consistency problems:
The object model uses different names for the webs of the application to the user.
Documentation is patchy – terminology that you are told to avoid is part of the object model.
Negatively named attributes.
The object model can be inconsistent: why does adding a list return a guid whilst adding a site returns the new site?
The built in web services are kind of functional but I would always recommend defining your own:
- They will not break on upgrade (or at least the interface won’t change)
- They have a defined interface rather than requiring large blocks of CAML