It’s been a while since I blogged about SharePoint, and thankfully it has been over a year since I last had the misfortune of working with it. I’ve had time to reflect and without a doubt I can say Sharepoint sucks. Here are the main reasons:
SharePoint does everything, just not very well
What exactly is SharePoint, A CMS? A DMS? An intranet? An application framework? A workflow system? A task list? A database? Or a wiki? SharePoint rather than being 1 product, is more like a collection of haphazardly slotted together mini apps. In short, everything is there, which looks great on paper, but each component lacks quality.
Misunderstood and underestimated
I’ve worked on enough SP projects now to understand the trend. At first there is a general enthusiasm towards a SP project. This is because if you’ve never worked with SP, then from a management perspective it seems like a great starting point, which will require only a few tweaks here and there to become a functional product. From a developers point of view, it at first glance appears to be just another CMS, that you can customize with relative ease. That is until you’ve actually worked with it.
Everything is convoluted
I can honestly say, I’ve never worked with a more confusing and mind numbingly over complicated (unnecessarily) product before. Believe me when I tell you (and no exaggeration here) from a developers point of view, SharePoint is a parody. If you’ve seen the series Faulty Towers, then John Cleese’s frustrations dealing with a somewhat bizarre little Spaniard are minor in comparison to the frustrations any SP developer faces when dealing with the “devil of all software”.
Another analogy comes to mind, and that is that if the sun, moon and all the planets were perfectly aligned and down to the last millisecond brought forth the perfect conditions for the antithesis of good software architecture then that product would be SharePoint.
Let’s get specific:
Lists and their definitions
Once you start getting into professional (take with pinch of salt) SP development, you’ll naturally want to bundle up all your lists, content types and fields into a WSP package. All these definitions are XML – awesome! Except not so awesome because that xml (especially for lists) needs to include most of the plumbing. If you’ve had any experience with WCF 3, then you’ll know that if was hard to configure, and by the time 4 came out, a lot of the required stuff in 3 was removed and replaced with defaults. This made WCF 4 much easier to use. Ironically none of this love was spent on SharePoint.
Now a SharePoint list is supposed to resemble a database table, in the sense that it stores tabular data. Databases however are logical. In every RDBMS that I’ve worked with, the field definitions are comprised ONLY in the table definition.
However since in SP it is possible to host multiple row types in the form of content types, in the same list. The content types and their corresponding field types are defined separately, Each with their own unique GUID. To make matters worse content types have a proprietary inheritance naming that you need to understand, or things don’t work.
Also since SP is more confused than a boy lady bug, you need to define the field and content types, both separately and then again reiterate these same definitions as part of the list (SP data table).
This means a tedious amount of work.
Web Application, Site Collection, and Site
Now this theory is covered when you first get into SP, mostly in 1 liners. At first it is confusing. The Web Application appears to be a Web Application in IIS. But then if that is the case what is the site collection? Is the site a virtual directory? But to make matters worse deployment needs to take place at different levels. And will greatly impact on if your application will actually work or not. A lot of this is hit and miss and you usually figure this out when things don’t work as you expected. This is because no one has the time to learn all this upfront prior to starting a project.
Long winded deployment process
Didn’t work? IISReset /Noforce? Did you re register the feature? Is it enabled? Did you unregister the last one? So you think powershell to the rescue, only in powershell you need to manually code in the thread sleeps to give each execution time to run because the calls are async. Still even if you’re well setup, a huge amount of time is wasted in deployment during development. Simply because this isn’t the copy to webserver, hit f5 refresh type of deployment you love, not at all.
Won’t run (or not supposed to run) on a desktop
For this reason, nearly every SP developer works in a VM, usually on some cheap laptop with the bare minimum amount of RAM. Needless to say performance is dismal. Things don’t get much better in production. SP is a resource hog of note, which is why when a framework like WordPress might run on an old 486. SP requires an entire farm to run smoothly.
This ain’t Farmville
Farms seem transparent enough on paper, however as any SP developer knows, nothing is that simple. No matter what you can expect some issue sooner or later with deployment at the application level. Typically DLL’s not quite making it to the corresponding GACs of all application servers in the farm.
The query language is too nothing short of parody
Out of all the query languages I’ve come across CAML has to be the least intuitive. I’ve also only ever seen it used with SP. I guess it doesn’t have a huge following.
Take this SQL statement: Select * from customers where (active = true and hasPurchased = true ) or (active = false and reason = unhappyCustomer)
Seems logical even to a non developer, the same query would look something like this in CAML:
<or><and>active=true<and>hasPurchased=true<or><and>active=false<and>reason=unhappyCustomer
But to make matters worse, the ORs and ANDs are grouped into 2: So it isn’t uncommon to see statements like this:
<Where>
<And>
<Or>
<Eq>
<FieldRef Name='FirstName' />
<Value Type='Text'>John</Value>
</Eq>
<Or>
<Eq>
<FieldRef Name='LastName' />
<Value Type='Text'>John</Value>
</Eq>
<Eq>
<FieldRef Name='Profile' />
<Value Type='Text'>John</Value>
</Eq>
</Or>
</Or>
<And>
<Or>
<Eq>
<FieldRef Name='FirstName' />
<Value Type='Text'>Doe</Value>
</Eq>
<Or>
<Eq>
<FieldRef Name='LastName' />
<Value Type='Text'>Doe</Value>
</Eq>
<Eq>
<FieldRef Name='Profile' />
<Value Type='Text'>Doe</Value>
</Eq>
</Or>
</Or>
<Or>
<Eq>
<FieldRef Name='FirstName' />
<Value Type='Text'>123</Value>
</Eq>
<Or>
<Eq>
<FieldRef Name='LastName' />
<Value Type='Text'>123</Value>
</Eq>
<Eq>
<FieldRef Name='Profile' />
<Value Type='Text'>123</Value>
</Eq>
</Or>
</Or>
</And>
</And>
</Where>
Like I said this is SharePoint, so you can expect it to suck.
Taxonomy sucks too
Ah the hidden list, and the sync issues – just Google it.
The general quirky nature of it, things I’ve forgotten about
I just remember always feeling like I was wrestling a bull while working with SP. Nothing ever just slotted into place. Everything seemed over complicated and required way too many manual steps. In short a ton of energy for a small bit of functionality.
I’ve forgotten about all the odds and ends, but at the end of the day SharePoint just sucks and there are much more cost effective and less frustrating solutions out there.