Team owned architecture

In early 2013, I was in my penultimate year of my software engineering degree.

At the time, we were split in groups of 6 people to work on various project (ranging from technical to more management-oriented projects).

At some point, we decided to take leaderships according to our pre-existing skills (which is a great tactic if we want to have a high quality delivery for the best efficiency, but a poor learning/long-term strategy).

We had a big home automation project (12 weeks), at the time, Google was just starting to communicate their plans about it, and the aim of the project was to build a home automation center.

We decided to embed a Java server with a WebUI on a Raspberry Pi (which was launch a year before). I took the lead on it, laying out the architecture.

It was mostly interface-based:

  • An interface for describing devices (and there probes, such as temperature, and actions, such as switching the light)
  • An interface for describing data sources (such as local weather website)
  • An interface for WebUI components building

On top of that, we had a rule system which was connecting everything.

It was a giant failure in terms of management:

  • We worked too hard on it (I worked until the presentation day, sleeping 2 hours)
  • I barely explained myself about the design (I actually only support on how to work with it)
  • I left little room for debate (my usual reply at the time was trust me: "it will work")

I was actually feeling bad about prior to the presentation.

At some point, one of the teachers asked:

So, you have a monolithic Java application, does it mean that you are forced to recompile each time you want to add a new device type?

I went blank.

One of my teammates jumped on it:

No we don't, as Java allows you to dynamically load code

Another one continued with:

We have interfaces for devices and WebUI, so we don't even need to change existing code to be extensible.

I was impressed, even with a lack of communication, they were able to strive in the architecture, and to own them.

Aside of that, the results were pretty good:

  • Each of my group mates were able to work independently (each one of them being able to focus on their favorite part, writing devices driver, creating WebUI components, rules)
  • The WebUI was clear and swift
  • The automation was working like a charm
  • We have got the best grade of the class

It took me a while to learn from this experience, but since then, I have learnt to:

  • Protect my team from overload (as much as I could)
  • Discuss and argue about architecture (instead of forcing it)
  • Take small steps when setting up an architecture
  • Build a sustainable product development environment

Over the years, I think of it more and more, should I judged it:

  • From a process point of view
  • From an outcome point of view

If I transpose it to my day-to-day work:

  • Should I create technical debt (of sacrifice my team/personal well-being) to meet a business deadline? (being effectively important or not)
  • Should I favor a middle/long-term plan, and risking the loss of unplanned opportunities?