Retrospective of my time at LivTours

One year, I was joining LivTours, and I have pushed my last commit last Wednesday.

Context

LivTours is a B2C company providing high quality tours and experiences in the biggest cities across Europe.

It was founded in 2009, and currently has ~50 permanent employees.

The IT department was created 8 years ago, when I left, we were 7 in the IT team.

It is an Italy-based company, but we had people coming from 15+ countries, all of them having extensively travelled abroad.

Technology overview

On the technology side, LivTours it relying on three pillars:

  • A back-office mostly written in Haskell, see below, which was used directly by permanent employees, and direct external collaborators (affiliates, influencers, guides)
  • A WordPress instance filled with generic plugins and a lot of internally developed parts, used by permanents employees and customers
  • Many third-party tools (Metabase, ZenDesk, Jira)

I was mostly working on the back-office, which was based on Yesod (a Ruby on Rails, Symfony, etc.-style web framework) and persistent (PostGreSQL). The frontend was spread between hamlet/julius (eDSLs integrated to Yesod generating HTML/JavaScript), plain JavaScript, PureScript, htmx, _hyperscript, and TypeScript.

Learnings and confirmations

There are few things I have already encountered, which still hold:

  • It's all about interactions, not tools: we had no continuous deployment, our usage of Graphite as merge queue leading to months-long development, not extensive tests, yet, our deliveries were business-relevant and with a low defect rate.
  • Options lead to confusion: in usual legacy system, there is a kind a Darwin selection for technologies, one is picked and used everywhere, even when it does not make sense; here we had too much options (for layering, frontend, etc.), which created some long discussions during code reviews.
  • Good and bad naming spread: I have noticed it on legacy, when a module starts to use the inappropriate wording, it infects the whole codebase, creating massive confusion; I have noticed the opposite, the wording was really consistent, making obvious any misuses, or wording issue.
  • Lack of automations make deployments a big deal: only one person was able to deploy the back-office which made any deployment delayed for trivial fixes when he was busy or in vacation.
  • DDD is the cornerstone of working software: even with a complex business context, thanks to the wording consistency, I was able to on-board quickly, and "naturally" talk to other business units, without too much difficulty
  • Engineering cultured is built and rewarded: we had setup many team habits (weekly pair-programming sessions, bi-weekly technical discussions on a video/blog post), which strengthen teams bounds, making day to day work more fluid
  • Multicultural environment are easing the work: I have always thrived in multicultural environments, but in LivTours, it was the next-level. I have never experienced, by far, a place with a "can-help" mindset. Everyone assumed good intents/will, trying to help even though it's not their job (I have helped few times to buy tickets, and some of them helped me to gather the data I needed).
  • A team can perform with (almost) no meetings: unlike my previous companies, I had almost no meetings, 10-20 minutes on Monday for an IT team stand-up, and 10-20 minutes on Friday for a stand-up with other business units. Once every two weeks we also had a 30 minutes IT discussion about a blog post or a video, but it kept my average weekly meeting time below one hour.

Some learnings I wish I didn't make:

  • Yesod: I'm probably old-fashioned, but I prefer to have a strong boundary between backend and frontend code
  • PureScript: I was quite disappointed, I had high hope PureScript could give the extra power missing to Elm to have a more composable approach, it is just worse, a lot more complexity, for few benefits
  • htmx and _hyperscript: I get we had a need to get quicker on usual frontend tasks, but these two libraries have a lack of tool support, and some lacks in the documentation, making hard to deal with
  • Hamlet: it goes beyond a simple eDSL to generate HTML, it performs some transformations in the DOM, making the end result hard to predict sometimes

Finally, my observations and learnings I'm glad I've made:

  • Schema evolution: in my previous positions, when we had to make a schema evolution (e.g. adding the ability to mark an order deleted), we simply added few fields to the main table, leading to gigantic tables; in LivTours, we were created new tables (e.g. order_deleted), grouping fields together, creating highly cohesive tables.
  • Bulma: 2 years ago, I have noticed that one of the issue I had was my lack of frontend skills, I have realized I was not too far, and I had a lot of chances to have a greater mastery of Bulma.
  • How to build a great engineering culture
  • How to properly clarify: I'm used working in multi-languages environments since my first professional position, but it's the first I was so involved, making shared understanding so critical, it was challenging, but I came to several mechanisms for clarifying topics without being too painful

Gratefulness

  • Adam A. for your enthusiasm, even when we have made the most expensive icon change
  • Adam O. for your guided tour of WordPress
  • Ante for your kindness and help with nix
  • Brian for your structuring work
  • Dario for the change you gave me, your patience, and your mentoring
  • Marco for your relentless code reviews, and your comprehensive comments
  • Angelo and Kristin for your trust and the chance you gave me
  • Leona for your events planning skills, and the scariest drive I had in Rome (also, thanks to Fidelma, the best, which, with her great humour, made it the funniest drive I had)
  • Martina M. for the most awkward and funny elevator ride
  • Megan for your patience with all my questions

Why moving on?

I have spent a year at LivTours, which is too short, but any duration is too short.

I don't know if it's the fact of working with an Italian company which made me feel so connected, both my parents (and my entire family) are Italians, but it was like my second family.

Not only this, but along this year, I've never complained once to my friend about them, stating often that "I hope I'll stay a long time".

The thing is, thanks and due to LivTours, I had to become self-employed, with a one-year renewable contract, I had a chance to do it multiple times before, but LivTours gave me the courage to do it.

The end of my contract was coming, and I have got no news of the renewal, my risk-averse brain started to kick-in, and then, while I was gently turning down every offer since the beginning, I have accepted one, 5 days later, I've got a strong offer.

I have notified it, and sadly the HR came back to me with the exact offer I had one year ago, respecting company policy, but it was too late, my expectations changed.

It is all my fault to be honest, and, as I'm writing this on Friday, feel like a big mistake, with a deep sadness, missing already my coworkers.

That being said, I've started at Wire yesterday, for 4 months for the moment, it's a big gamble for me, but I look forward to new challenges.