30 Sep 2018 - Tom Fairweather
For many years I've felt strongly that choosing to rewrite a piece of software is something you have to think really hard about. You have to have good reasons to do it, and it's often the wrong choice. It's a classic issue in software engineering where you think it won't take long, and that you'll quickly be back to productivity.
In reality it will take longer than you thought. You will hit problems you didn't expect. It will either shut down progress on features, or feature work will continue while the rewriters chase the tail of the legacy version, trying to reach parity.
This is what we went through over the last four months at TeamUp Labs. Yes, we probably should have refactored the NodeJS codebase and got to know Node a little better, but we decided to switch to .NET Core principally because it's what the developers are used to and what we would like to get better at.
The main issue we faced was quantity of work. The specific pain points were rewriting the authentication code and migrating users to the new database schema. We used .NET Core identity for this, which gets you moving quickly. When you want to customise it a little you start having to scaffold a ton of UI, fixing it up to work the way you need it to. We did consider using Auth0 or Amazon Cognito services to handle authentication (including UI). I think we are still open to those in the future, but they may have taken just as long to implement and migrate to and we didn't consider them early enough. It's really boring to write authentication code - it's something every web app needs, so it should be just there.
Here are the features we are wishing we'd been working on over the last four months:
In retrospect I think that .NET Core will give us some benefits, but I am on the fence about whether it warranted the effort. If a user had been at the meeting when we were deciding this I'm pretty sure they would have preferred the new features.
We do have one new feature as a result of the rewrite, and that is the ability to register / signin using username / password. Before we just had Google Auth. You can try it out here: Teamup Labs Example Mapping Tool