The first guest post here on "Part of the Process" from Martyn Osborne as he explains the Infrastructure side of bashfully, a parallel concern to testing the vision.
Since we've recently publicly unveiled Bashfully, it seems prudent to run through the technology stack and why we chose it. I’m hoping it may also at least partially explain why starting a side project was appealing to me!
Naturally, there were some elements I wanted to focus on when selecting the language:
- Fun. As it's a side project (in addition to a full-time development job), I wanted something interesting to play with in my free time.
- Functional. I love F# and the paradigm, so that was the direction I wanted to go.
- Web sockets. This project is a toy - and I wanted to play with them at some point (of course, when appropriate!)
- Practical. Yes, I wanted a toy. I also wanted a project that will eventually materialise!
I had been keeping a close eye on Elixir for quite a while, and Bashfully seemed an excellent excuse to use it in anger! Elixir also has an excellent web framework with Phoenix, and an exceptionally helpful community.
So far, Elixir genuinely makes me happy. I personally think that’s high praise, and I may dive into more detail there in the future.
PostgreSQL suffices for persistence. Elixir has good support with Ecto, it’s easy to run on my machine, and Heroku allows remote PSQL sessions.
To be honest, I battled with the idea of making Bashfully an SPA for a while (and I have some expertise in that area). However, I now believe that would have been overkill; especially at what is essentially a prototype phase.
Instead, we’re primarily using Phoenix to render pages on the server side with Vue sprinkled throughout where advantageous. I’m not particularly attached to Vue yet, but it’s sufficient and I am eager to explore further.
On the hosting side of things, Heroku has been fantastic. We’re using GitLab CI to build, test and immediately deploy Bashfully to our Heroku staging environment; we can then promote that build to production with Heroku’s pipeline feature. This was working well within an hour!
Even though this setup was primarily to make my own life easier, it also had the interesting effect of allowing Neil to easily make design, wording and content changes to the application (via GitLab’s excellent editing UI) and have them deploy to staging without any technical barriers.
This bit is pretty important. We have worked on a similar web application for a while and have learnt several lessons along the way; these lessons have been incorporated into Bashfully.
We decided from the very beginning to go passwordless and use third-party authentication providers (Google, Facebook, etc). This was trivial to set up (we’re using Ueberauth) and means we don’t have to process or store credentials - very helpful in the age of data breaches!
Site-wide HTTPS has also been implemented courtesy of LetsEncrypt via Heroku.
For anyone else attempting a side project (and with the intention of going live in a reasonable timeframe!), I would suggest:
- Don’t pick any technologies too esoteric. Make sure they’re fun, but also practical!
- Do pick some technologies that you are familiar with. Writing good quality idiomatic code when learning one technology is hard enough - don’t try it with too many.
- Keep the infrastructure simple. I toyed with the idea of building the infrastructure myself on AWS; but not doing so let us concentrate on the mockups, journeys, and the application itself!
- Define your vision early on. Staying focused on building the right things is critical, and a vision helps (especially as a developer!).
- Break the project up into smaller chunks. Something like Trello is a great help. I would argue that this is a critical skill for any developer and one that a side project can help with.
If you made it this far - kudos! I will probably be expanding on these topics in the future, so keep an eye on this blog!
To add to this, not only was I using the GitLab UI but I have created, merged and squashed feature branches. I have even wired up some page handlers unaided without knowing any Elixir or Phoneix!