Press enter or click to view image in full size
TABLE OF CONTENTS
==================================
01. Introduction
02. The Development Experience is Awful
03. Performance is Consistently Poor
04. The Architecture is a Mess
05. The User Experience Hasn't Improved Since 2007
06. It's an Integration Nightmare
07. The Modern SharePoint Online Isn't Much Better
08. When Should You Use SharePoint?
09. What to Use Instead
10. SummaryIntroduction
I’ve spent more time than I’d like fighting with SharePoint, and I’m going to be blunt: it’s terrible. Not “has some rough edges” terrible, not “could use improvement” terrible, but genuinely, comprehensively bad at almost everything it tries to do. It’s slow, it’s unintuitive, the development experience is miserable, and it manages to be simultaneously overcomplicated and underpowered.
The frustrating bit is that SharePoint started with a reasonable premise. Give organisations a place to store documents, manage lists of data, build simple workflows, and collaborate. That’s not rocket science. But Microsoft took that straightforward idea and built a sprawling, bloated platform that excels at nothing whilst somehow costing a fortune in licensing and developer time.
The Development Experience is Awful
If you’ve ever had to build anything custom for SharePoint, you know what I’m talking about. The developer experience is spectacularly terrible.
SharePoint Framework is Still Painful
SharePoint Framework (SPFx) was supposed to fix the development experience. It didn’t. Sure, it’s better than the old server-side approaches with timer jobs and feature stapling, but that’s setting the bar on the floor. SPFx gives you a React/TypeScript environment for building web parts, which sounds modern, but the development loop is painfully slow.
Want to test a change? Package your web part, deploy it to your SharePoint tenant, refresh the page, and hope it worked. The local workbench barely functions for anything beyond trivial examples because it can’t properly mock SharePoint’s APIs. You end up deploying to a dev tenant constantly, and each deploy takes minutes. Compare that to modern web development where you save a file and see changes instantly.
The Object Model is Inconsistent
SharePoint has multiple APIs: the REST API, the CSOM (Client-Side Object Model), the JSOM (JavaScript Object Model), and the legacy SOAP services. They don’t have feature parity. Some operations are only available in REST, others only in CSOM. Documentation is scattered and often outdated. You spend half your time trying to figure out which API even supports what your trying to do.
Here’s an example. Want to get the permissions for a list item? In CSOM, you do this,
var context = new ClientContext(siteUrl);
var list = context.Web.Lists.GetByTitle("MyList");
var item = list.GetItemById(1);
context.Load(item, i => i.RoleAssignments.Include(
ra => ra.Member,
ra => ra.RoleDefinitionBindings));
context.ExecuteQuery();That context.Load() with lambda expressions for specifying what to load is SharePoint's weird lazy-loading mechanism. You build up a batch of operations, then call ExecuteQuery() to actually execute them. It's verbose, non-intuitive, and easy to get wrong. Miss a property in your Load() call, and you get a PropertyOrFieldNotInitializedException at runtime.
In the REST API, you’d do something like,
GET /_api/web/lists/getbytitle('MyList')/items(1)/roleassignments?$expand=Member,RoleDefinitionBindingsCompletely different syntax and structure. And good luck finding consistent documentation for what properties are available on what endpoints.
Debugging is Miserable
Debugging SharePoint code is an exercise in frustration. If you’re building server-side solutions (which you shouldn’t be, but sometimes you’re stuck with legacy code), you need to attach to the SharePoint process on the server. If you’re building SPFx, you’re debugging transpiled JavaScript in the browser with source maps that sometimes work and sometimes just lie to you.
Error messages are spectacularly unhelpful. You’ll get “An error occured” or “The request failed” with no additional context. You end up trawling through ULS logs (SharePoint’s logging system) looking for the needle in a haystack of noise. The logs are verbose, inconsistently formatted, and spread across multiple servers if you’re in a farm enviroment.
Deployment is a Nightmare
Deploying SharePoint customisations is fragile. Feature activation can fail silently. App installation can hang. Updating an existing customisation can leave orphaned files or broken references. Rollbacks are painful because SharePoint stores metadata in its content database, and reverting a deployment often requires manual database cleanup or PowerShell scripting that’s easy to get wrong.
The deployment model also makes CI/CD harder than it should be. You can automate it, but you’re fighting SharePoint every step of the way. There’s no clean “deploy this package” command that just works. You need PowerShell scripts, app catalogs, and a prayer.
Performance is Consistently Poor
SharePoint is slow. Not occasionally slow, consistently slow. Page loads take seconds. Searches take seconds. Uploading files takes longer than it should. It doesn’t matter how much hardware you throw at it; SharePoint finds a way to be sluggish.
Page Rendering is Slow
A typical SharePoint page takes 3–5 seconds to load, even on a fast network. That’s unacceptable in 2026. Modern web applications load in under a second. SharePoint’s page rendering involves multiple round-trips to the server, loading dozens of JavaScript files, and rendering web parts that each make their own API calls. There’s no efficient bundling or lazy loading. Everything gets loaded upfront, whether you need it or not.
The “modern” pages in SharePoint Online are supposed to be faster, but they’re still noticeably slower than a well-built static site or SPA. You click on a document library and wait. You click on a list and wait. Every interaction has perceptible lag.
List Performance Degrades Quickly
SharePoint lists are fine for a few hundred items. Once you hit a few thousand, performance tanks. Even with proper indexing (which requires manual configuration and has limitations), querying large lists is slow. The list view threshold is 5,000 items by default, and if your query exceeds that, SharePoint just refuses to run it. You have to break your data into folders or create filtered views, which is ridiculous. Databases handle millions of rows without breaking a sweat, but SharePoint chokes on 10,000.
Here’s a real-world example. I worked on a system where we stored document metadata in a SharePoint list. We hit 8,000 items, and suddenly queries started timing out. We had to implement a manual archive process to move old items to a seperate list just to keep performance acceptable. That’s not a scalable solution; that’s a workaround for a fundamental limitation.
Search is Slow and Often Wrong
SharePoint search is powered by Microsoft Search (or the older SharePoint Search Service in on-prem). It’s slow to return results, the ranking is often nonsensical, and it frequently misses documents that definitely exist. You search for a filename you know is there, and it doesn’t show up. You search for a keyword, and you get results from three years ago that aren’t relevant.
Search indexing is also delayed. Upload a document, and it might not appear in search results for 15 minutes (or longer in SharePoint Online). If you need real-time search, you’re out of luck.
The Architecture is a Mess
SharePoint’s architecture is a product of 20+ years of bolting new features onto an aging foundation. It shows.
Everything Goes into Content Databases
In SharePoint on-prem, everything is stored in SQL Server content databases. Your documents, list items, metadata, user permissions, web part configurations, everything. This makes sense for transactional consistency, but it creates massive databases that are hard to maintain, backup, and restore. A single content database can grow to hundreds of gigabytes, and queries against it are complex and slow.
SharePoint also stores files in the database as BLOBs. This is fine for small files, but for large files (like videos), it’s inefficient. You can configure Remote BLOB Storage to offload files to a file system or external storage, but that’s an additional layer of complexity.
The Permission Model is Overcomplicated
SharePoint’s permission model is role-based but implemented in a way that’s impossibly complex. You have site permissions, list permissions, and item-level permissions. You have SharePoint groups, Active Directory groups, and individual users. Permissions can be inherited or broken. You can have unique permissions on a folder, a list, a list item, or a document.
In theory, this flexibility is powerful. In practice, it’s a mess. No one understands the effective permissions on a given item without clicking through multiple layers of UI or running PowerShell commands. Auditing who has access to what is nearly impossible. You end up with permission sprawl where people have access they shouldn’t because someone broke inheritance on a folder five years ago and no one knows why.
Workflows are Abandonware
SharePoint workflows were built on Windows Workflow Foundation (WF). Microsoft deprecated WF years ago, and SharePoint 2013 workflows are in maintenance mode. The modern replacement is Power Automate (formerly Flow), which is a separate product that integrates with SharePoint but isn’t really part of SharePoint.
If you’re on SharePoint on-prem and you want workflows, you’re stuck with the old, deprecated technology. If you’re on SharePoint Online, you’re pushed toward Power Automate, which is fine for simple workflows but has its own limitations and costs.
The User Experience Hasn’t Improved Since 2007
SharePoint’s UI has always been bad, and it still is. The “modern” experience in SharePoint Online looks better than the classic ribbon UI, but it’s still clunky and unintuitive.
Navigation is Confusing
SharePoint sites have inconsistent navigation. You’ve got the top navigation bar, the left-hand quick launch, breadcrumbs that sometimes work, and a hub navigation structure if you’re using SharePoint Online with hub sites. Finding what you need involves clicking through multiple menus and guessing where things are.
Compare that to a well-designed web app with clear navigation, search, and breadcrumbs that actually make sense. SharePoint feels like navigating a maze.
The Ribbon UI Was a Mistake
The ribbon UI (borrowed from Office) was supposed to make SharePoint more familiar to Office users. It didn’t. It’s cluttered, buries common actions under obscure tabs, and wastes vertical screen space. The modern UI ditches the ribbon, but it replaces it with a command bar that’s not much better. Common actions are hidden behind “…” menus or require multiple clicks.
Forms are Terrible
The default SharePoint forms for creating and editing list items are ugly and inflexible. They’re basically auto-generated HTML forms with minimal styling. If you want a decent user experience, you need to customise the forms with SPFx or Power Apps, which is additional work.
Mobile Experience is an Afterthought
The SharePoint mobile app is bad. Really bad. It’s slow, the UI is inconsistent with the web experience, and it’s missing features. Most organisations just don’t bother with it and instead use the mobile browser, which is marginally better but still frustrating.
It’s an Integration Nightmare
SharePoint is supposed to integrate with other Microsoft products. It does, but not well.
Microsoft 365 Integration is Half-Baked
SharePoint Online integrates with Teams, OneDrive, Outlook, and other M365 services, but the experience is fragmented. A SharePoint document library can appear as a tab in Teams, but it’s just an embedded iframe. You don’t get the full SharePoint functionality, and navigation between Teams and SharePoint is jarring.
OneDrive is built on SharePoint, but the user experience is completely different. Syncing files between OneDrive and SharePoint involves the OneDrive sync client, which is its own source of frustration (sync conflicts, files not syncing, the dreaded “red X” icon).
APIs are Inconsistent
As I mentioned earlier, SharePoint has multiple APIs with inconsistent capabilities. Integrating with external systems involves picking which API to use, dealing with authentication (which changed from SharePoint on-prem to Online), and writing a lot of error-handling code because the APIs fail in unpredictable ways.
Webhooks are Limited
SharePoint Online supports webhooks for list items, but they’re limited. You can subscribe to change notifications, but you don’t get details about what changed. You get a notification that something in the list changed, and then you have to query the list to figure out what. This makes building real-time integrations harder than it should be.
The Modern SharePoint Online Isn’t Much Better
Microsoft has been pushing “modern SharePoint” for years, promising that SharePoint Online fixes the problems of on-prem SharePoint. It doesn’t. It’s better in some ways, worse in others.
You Don’t Control the Platform
With SharePoint Online, Microsoft controls the deployment schedule. They push updates whenever they want, and sometimes those updates break your customisations. You can’t pin to a specific version or delay updates. If Microsoft changes an API or deprecates a feature, you adapt or your solution breaks.
It’s Still Slow
Modern SharePoint is faster than classic SharePoint, but it’s still slow compared to modern web apps. Pages take multiple seconds to load. Document libraries with thousands of files are sluggish. The performance is better than on-prem, but it’s not good.
Customisation is Limited
SharePoint Online pushes you toward low-code/no-code solutions like Power Apps and Power Automate. If you need custom code, you’re building SPFx web parts, which as I said earlier, have a painful development experience. You can’t deploy server-side code, which limits what you can do. Some scenarios that were possible in on-prem SharePoint are just not possible in SharePoint Online without convoluted workarounds.
Licensing and Costs Add Up
SharePoint Online is included in many M365 plans, but once you start adding Power Apps, Power Automate, premium features, or third-party tools, the costs add up fast. Microsoft’s licensing is opaque, and you can easily end up paying more than you expected.
When Would You Actually Use SharePoint?
After all that, is there ever a good reason to use SharePoint? Honestly, not many.
You’re Already Deep in the Microsoft Ecosystem
If your organisation is heavily invested in Microsoft 365, and everyone’s already using Teams, Outlook, and OneDrive, then SharePoint might make sense as a document management and basic collaboration tool. It’s there, it’s included in your licence, and it integrates (sort of) with the other tools.
You Need Basic Document Management
For small teams that just need a place to store documents with version history and basic permissions, SharePoint is fine. It’s not great, but it works. You’re not building anything custom; you’re just using document libraries and maybe a few lists. In that scenario, SharePoint’s shortcomings are annoying but tolerable.
You’re Stuck with Legacy Systems
If you inherited a SharePoint environment and you don’t have the budget or political capital to migrate, you’re stuck with it. In that case, you do your best to minimise customisations, keep things simple, and plan an exit strategy for when it becomes feasible.
What to Use Instead
Telling you to avoid SharePoint isn’t helpful if I don’t give you alternatives. Here’s what to actually use, depending on what you’re trying to accomplish.
Document Storage and Collaboration
If you just need somewhere to store files with version history and permissions, Azure Blob Storage with a simple front-end works brilliantly. You get proper scalability, reasonable costs, and you’re not fighting SharePoint’s weird permission inheritance model. Pair it with Azure AD for authentication and you’ve got something that actually performs.
For teams that want a more polished out-of-the-box experience, Google Workspace or Dropbox Business are both faster and more intuitive than SharePoint document libraries. They sync properly, the mobile apps don’t make you want to throw your phone, and your users won’t need training to figure out how to upload a file.
Lists and Structured Data
SharePoint lists are just a bad database. If you need to store structured data, use an actual database. Azure SQL or Cosmos DB will handle millions of records without the 5,000-item threshold nonsense. Yes, you need to build a front-end, but a simple Blazor app or even a Power Apps canvas app talking to a real database will outperform SharePoint lists by orders of magnitude.
For simpler needs, Airtable or Notion databases give you the spreadsheet-like interface that people like about SharePoint lists, but with better performance and a UI that doesn’t look like it escaped from 2007.
Workflows and Automation
Power Automate is actually decent for simple workflows, and you’re probably already paying for it. For anything complex, build proper Azure Functions or Logic Apps. You get better logging, proper error handling, and you’re not constrained by SharePoint’s event model.
If you’re not locked into Microsoft, Zapier or n8n (self-hosted) are more intuitive for business users and have broader integration support.
Intranet and Internal Portals
This is where SharePoint supposedly shines, but it really doesn’t. Notion, Confluence, or even a static site generator like Hugo with Azure Static Web Apps will give you a faster, cleaner internal site. You lose some of the “enterprise” features like managed metadata and content types, but honestly, how many organisations actually use those properly?
If you absolutely must have a Microsoft-flavoured intranet, SharePoint is tolerable for this use case, just don’t build anything custom on top of it. Use it as a basic CMS and nothing more.
The Short Version
Stop trying to make SharePoint do everything. Use Blob Storage for files, a real database for data, dedicated tools for workflows, and accept that a simple static site is probably better than a SharePoint intranet. You’ll spend less time fighting the platform and more time building things that actually work.
Summary
SharePoint is a bloated, slow, poorly designed platform that excels at nothing. The development experience is miserable, the performance is bad, the architecture is a mess, and the user experience hasn’t meaningfully improved in 15 years. It’s held together by the fact that it’s bundled with Microsoft 365 and organisations are too entrenched to migrate.
If you’re starting a new project and considering SharePoint, don’t. Use a proper document management system, a real database, or modern collaboration tools. Your developers and users will thank you.
If you’re already stuck with SharePoint, my condolences. Keep customisations minimal, avoid building complex solutions on it, and start planning your migration. Your future self will thank you.