Choosing between different solutions (WebApp, MobileApp, DesktopApp, Console or Service)
In this article I'll encourage you to keep an open mind about your options when building a software solution.
Why write or read about how to choose between different solutions? Shouldn't it be obvious? I think it's well worth our time to dwell on that, especially considering two reasons:
- Choosing the wrong solution is one of the most expensive mistakes to make. E.g. adding an unplanned feature to an application may seem expensive, but it pales in comparison with the realization that your mobile app should have been website or the other way round.
- Often a decision about a platform or solution is not made deliberately, because we are simply not aware of all our options. E.g. consider if Kahneman's WYSIATI (What You See Is All There Is) theory comes into play here or the "If all you have is a hammer, everything looks like a nail" quote rings true.
Why don't we evaluate our options more carefully?
There are a couple of obstacles that keep us from taking a closer look.
- Missing Expertise It often requires in-depth knowledge and experience of different technologies, which is hard to come by. E.g. if you're only skilled in developing Web Pages for customers you won't necessarily see that a Windows Service or a commandline tool on a Parallela Board fits the requirements better.
- Emotional Bias We're often biased towards some technology not based upon it's merits and flaws for our specific use case, but rather on our feelings and emotions based on a past project. Not only was it a different project and the technology should be reevaluated in the context of the new one, but also our emotions were influenced by other factors like a too short deadline, mismanagement, unrealistic expectations or difficulties with the involved parties.
Lots of Options
Evaluating a lot of options is difficult and straining, consider for example the book The paradox of choice or the TED Talk given by Barry Schwartz.
Removing the Obstacles
But how can you remove those obstacles?Missing Expertise
Missing Expertise can be battled in the following ways:
- Learn about it The most obvious, although hardest solution is to learn about the qualities of certain technologies. This does not mean that one needs to become an expert in every new technology that pops up, but knowing if it's a good match for a certain use case is important.
- Get Help If you're a consultant or developer and the technology that is most appropriate or required for the task does not match your expertise, you should acknowledge the fact and inform your client or boss. If you have a colleague or acquaintance that specializes in that technology or field you should refer to them.
A good way to combat emotional bias is to get to know a technology in a stressfree environment. This may mean, that you take a look at it in your spare time, without the clock ticking.
Start step by step and don't try get everything done at once. Sometimes you'll feel tempted to try something big at once that you are able to do in another language or with another framework that you've already mastered - but don't give in. Small incremental successes keep your motiviation going for a longer time.
Ask a friend
If you really dislike a certain technology, you should talk with a friend or someone you respect that is fond of it. As he or she is your friend, you are unlikely to completely dismiss them and get a glance why someone would want to use that and advantages it has.
And finally, to get a quick overview I've compiled the following list that can be used to get the juices flowing on what parts could make up the ideal solution. My hope is that by spelling them out, they'll be on the radar the next time when a problem needs solving. Many solutions do not fall strictly within one category and more often than not consist of more than one part.Disclaimer
This list is neither exhaustive nor can it be, it's just a reminder of what's out there and should be seen as an inspiration to get you to explore your options.
- Web Solutions
- Static Web Pages (consider online/offline help, manuals)
Content Management Systems (CMS)
- Wordpress (php)
- Umbraco (asp.net)
- Mobile first
Server Side Frameworks
- Asp.Net MVC
- Asp.Net WebApi
- Ruby on Rails
- phpBB (php)
- MVCForum (asp.net mvc)
- Web API
Front End Frameworks
- Mobile Applications
- Windows Phone
- Apache Cordova
- Platform specific
- Desktop Applications
- Wpf (windows only)
- WinForms (cross platform using mono)
- GTK and it's wrappers like GTK#
- DirextX and it's wrappers like SlimDX or SharpDX
- OpenGL and it's wrappers like OpenTK
- Console Applications
- Windows Services
- Linux Daemons
No SQL Databases
- Media Processing
- imagemagick for images
- sox for audios
- ffmpeg for videos
- Virtual Box
- Virtual Machine
- Operating Systems
- Hardware platforms
- Raspberry Pi
- Beagle Bone
- Cloud platforms
- Digital Ocean
As always feel free to leave a comment, especially if you want to remind me of an important option that I completely missed when I typed up the list, as I most certainly did.