Skip to content

Development: Process

Ben Bucksch edited this page Apr 13, 2025 · 16 revisions

If we implement a completely new feature, e.g. Calendar Invitations or PGP Encryption, here's how we proceed, from a high level point of view. Please follow the steps in order, because earlier steps inform the later steps. If we skip steps, we will make unfortunate engineering decisions that will be very hard to revise later.

We follow these steps per feature, not for the entire app at once (Agile). We work together on these. Everybody can give input at every step.

User needs

Who: UX, input from Target Users

  • Why does the user want this feature? What is his goal?
  • What information does the user need to accomplish the goal? What do we need to show to him?
  • What controls does the user need to direct the feature and adapt it to his circumstances? In which ways does he need to direct the app?
  • Which parts of this information and controls (previous 2 points) are inherently needed by typical use cases? Which parts will every user understand? Which parts are needed only by special circumstances or very advanced users?

Concept

User flow

Who: UX, input from Development

Create a user flow:

  • Where does the information and the controls fit most naturally into the existing application concepts and UI?
  • What happens when?
  • Which parts can be done automatically by the application, without bothering the user? If the user would have to gather the information, can the application help him with that and automate it?
  • Which parts are user choices and preferences?

Object model

Who: Development

  • Classes, properties, functions, relations
  • Which inherent concepts and objects exist? How do they interact with each other and the existing core objects?
  • Which classes do we make for this new feature? Are they subclasses (e.g. EMailProcessor) or entirely new concepts?
  • Avoid adding functions to existing core objects (e.g. EMail, Event or Account) for your new feature. Those core objects existed fine without it so far, so your new function is likely not needed for the core object. If we add every new feature to the core objects, they will become unmaintainable over the coming years. OTOH, adding functions on core objects does make sense, if the function is useful in a generic way and inherently about that core concept, entirely independent of your feature.

API

Who: Development

  • Based on the concept, create the new classes, with their properties, functions and relations, as stubs. Define all types tightly.
  • Create dummy fake objects, in TestData.ts.
  • APIs should be callable, but not do anything useful yet.

UI

Who: UX and Development

  • UX and dev: Should it be exposed during setup, in preferences, in contacts, or in the normal UI?
  • UX and UI Designer: Makes mockups
  • Dev: Creates the UI controls, in the actual app, based on the mockups
  • Dev: Style it using CSS
  • Polish - Developer together with UX and UI Designer
  • All: Show it off within the team. Celebrate.

Implementation

Who: Development

  1. Core logic
  2. Protocol
  3. Storage of the objects and properties on disk
  4. Unit tests

Test

Who: All

  1. Let other team members try it out. Receive feedback, openly listen to it, adapt to it.
  2. QA
  3. Iterate through previous steps, where feedback shows that it's not right yet.
  4. Show to a few external users or testers, get their feedback, adapt.
  5. Development: Set up integration tests with servers, third party apps etc. (Where possible)

Done

Who: All

  • Celebrate 💯 🥳 🎆
Clone this wiki locally