• Stars
    star
    627
  • Rank 70,049 (Top 2 %)
  • Language
  • License
    MIT License
  • Created over 7 years ago
  • Updated over 7 years ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

โ˜• The longflow manifesto

The Longflow Manifesto

Version 1

About this manifesto

The longflow model is an engineering-centric workflow for serious software developers, tired of the "Agile"/"Scrum" bullshit.

The question of Time

Time and Work

In the software industry, like in every industry, a business owner does not sell time. A business owner sells a product. However, a software developer bills time worked.

Somewhere, time must be transformed into improvements to the product. The action of applying this transformation to time is called work.

However, the relation between time spent and work done is absolutely not linear. Premature optimization, for example, is a good candidate for a log-like relation, where more and more time is being invested for less and less benefits. On the other hand, good refactoring can use a moderate amount of time for exponential returns over a long period of time.

This is the key principle of the longflow methodology: everything has to be done with long-term goals in mind.

That does not mean no prototyping. That does not mean premature optimization. That does mean quality has a price: time.

Estimates

Estimates are to be avoided at all cost. They create needless pressure, competition, and participate in a toxic witch-hunt of who is the less productive.

In the software development world, it is impossible to produce meaningful estimates, let alone precise ones, for anything but nano-tasks.

It is often impossible to split a task into meaningful smaller ones, even more so before starting the original task. Just like it may be impossible to split a function into meaningful smaller ones, when such function is already coherent and provides a self-contained service.

Have the workflow match the project, not the other way around.
This draws a nice parallel with data-oriented design, where the data is the core and the logic has to match it.

Time-based events

Frequent, time-based interactions between executives and engineers are one of the best way to crash a company.
Having a meeting once in a week/month or other indicator based solely on time is meaningless. It conveys the idea that all the tasks are the same, that all progress must be at a steady pace. It's also an excellent way to focus more on immediate results than on the long term goals.

Interactions between executives and engineers must be limited in terms of number and frequency.
It's also best to be as unintrusive as possible : a mail may be better than a meeting in a lot of cases.

Micro-management should be avoided at all costs, because it creates interferences between executives and engineers, and reduces creativity.

Rushes, sprints, crunch-time, etc. are toxic and dangerous.

Quality is infinitely superior to quantity. Software engineers aim to produce working, beautiful, readable code.
By forcing deadlines upon them, they are encouraged to produce "the least dysfunctional" code instead of "the best possible" code. The longflow methodology advocates having medium to large sized meaningful tasks, self-assigned whenever possible, where developers can leverage both technical and problem-solving skills. Have developers write no code at first, but simply think about how they can solve the problem. Or, better yet, asking themselves questions like:

  • Is there a problem to solve?
  • Can I improve this part of the code?
  • Are there tasks I wish I had done differently?

Curiosity and creativity are very important skills for software developers, but these skills can't develop if there is pressure to release code as fast as possible. It is very detrimental to have long, let alone permanent, deadlines.

Developers should be allowed, and even encouraged, to spend some time learning and toying with new things and concepts. Being able to apply a large variety of solutions and concepts on a problem is crucial for a good software developer. Denying their right to learn will hinder the ability of developers to improve and produce quality code.

The longflow methodology in simple steps

Management

  • Keep thinking about long term goals.
  • Let engineers self-assign tasks.
  • Value quality over deadlines.
  • Let the engineers do engineering.
  • Don't micro-manage.
  • Don't interfere with engineers more than strictly required.
  • Never rush, always think and plan ahead.
  • Don't fear failure.
  • Avoid cargo-cults like the plague.

Technical

  • Keep thinking about long term goals.
  • Pick up your own tasks.
  • Try to fix bugs before introducing new features, to an extent.
  • Try to clean the codebase before introducing new features, to an extent.
  • Try to write the best possible code.
  • Don't fear trying something different.
  • Think more, write less.
  • Always try to learn things, be curious.
  • Don't fear running late.
  • Don't fear to fail.
  • Avoid cargo-cults like the plague.

A typical implementation

A typical implementation of the longflow manifesto, from the point of view of an engineer, is something like this:

  1. I pick or create a task.
  2. I spent a few minutes/hours/days thinking about the task. Do we need it? Have I done something similar before? What does the task achieve?
  3. If the task turns out to be unneeded, go back to 1.
  4. If I need to learn something to do the task, I go learn it.
  5. If I want to learn something new, I go learn it too.
  6. I think about the task again. I may go back to 4 or 1 if the things I learned changed my mind about the task.
  7. I work on the task. I may go back to 2 at any point.
  8. I finish the task.
  9. I think about the task again. I may want to go back to 2.
  10. The task is now considered done, but I (or someone else) can decide to work on it at any time, going back to 2.

It may seem messy at first, but a workflow like this is both extremely flexible and extremely good in terms of quality of the code produced, because everyone can improve any part of the codebase whenever they want.

Author

This manifesto was written by Nax.
Feel free to modify it.

More Repositories

1

nin

A NES emulator
C++
30
star
2

xenv

An env to manage envs.
Shell
11
star
3

libwish

A rich, developer-friendly text-mode library.
C
8
star
4

dotfiles

dotfiles
Shell
7
star
5

Mog

A low-level helper library
C
5
star
6

CitizenHack.nh

A nethack variant
C
4
star
7

SCL

The Simple Coroutine Library
C
4
star
8

NewScript

C
4
star
9

chantage

A mod loader and API for Final Fantasy Tactics: WotL
C
4
star
10

build-cc

A shell script that automates the creation of a binutils/gcc cross toolchain.
Shell
3
star
11

FFT-Disassembly.old

3
star
12

nin64

A Nintendo 64 Emulator
C++
3
star
13

citizenhack.old2

C++
3
star
14

ttydr

TypeScript
3
star
15

screepy

My screeps bot
TypeScript
3
star
16

bismuth

A SNES emulator
C
3
star
17

TacticsCrafter

A Final Fantasy Tactics : The War of the Lions patch builder
C++
3
star
18

NotAndXor

The NotAndXor (https://nax.io) blog.
TypeScript
3
star
19

code-style

Code style for some languages
3
star
20

c-library-template

A template repository for my C libraries
CMake
3
star
21

TacticsCrafterScripts

A set of public patches for Tactics Crafter
Lua
3
star
22

Lums

C
2
star
23

canard

Elixir
2
star
24

Nax

"โœจspecial โœจ"
2
star
25

WotL-Disasm.old

C
2
star
26

static-site-webpack-plugin

JavaScript
2
star
27

FFT-Disassembly

A disassembly of FFT, using GhidraSync
2
star
28

OoTMM

Ocarina of Time + Majora's Mask combo randomizer
C
2
star
29

docker-mail

A simple yet powerful mail system using docker
Dockerfile
2
star
30

mangie

A project builder
Ruby
2
star
31

GLL

OpenGL Loader
C
2
star
32

node-yaz0

A fast Yaz0 compression/decompression module.
JavaScript
2
star
33

image-convert-loader

An advanced image loader for webpack
JavaScript
2
star
34

Cid

A generic DLL injector/loader
C
2
star
35

GhidraSync

A ghidra plugin to synchronize state
Java
2
star
36

Forsaken-Souls

C++
2
star
37

WotL-AjoraEdition

A vanilla modpack for Final Fantasy Tactics: the War of the Lions
Lua
2
star
38

citizenhack.old

A web roguelike in typescript, inspired by NetHack
TypeScript
2
star
39

socketty-node

Server side socketty, based on ws.
JavaScript
2
star
40

ccg

C Code Generator - Generate C from Ruby
1
star
41

besl

Basic Embeddable Scripting Language
C
1
star
42

ChantageStudio

An editor to author chantage-compatible WotL mods.
C++
1
star
43

FFT_Decrypt

Decrypt FFT WotL's EBOOT.BIN in-place in the ISO
C++
1
star
44

FF6-Disassembly

IDA-Sync files for Final Fantasy 6
1
star
45

wotl

Final Fantasy Tactics: The War of the Lions decomp
Ruby
1
star
46

libisa

A library for CPU features detection and runtime dispatch
C
1
star
47

Fragments

An experimental operating system (very early WIP)
C
1
star
48

Newt

Newt is an embeded scripting language and virtual machine made for games.
C
1
star
49

azote

A cycle accurate N64 emulator
C
1
star
50

docker-mediawiki

A mediawiki image with php-fpm and nginx
Dockerfile
1
star
51

libresin

A modern OpenGL loader
Python
1
star
52

docker-bind

1
star
53

emerald-em

C
1
star
54

ruby-yaz0

Ruby bindings for the yaz0 compression/decompression format
C
1
star