3 ms·
This is interesting because in some kinds of software, if you just keep adding features then the software becomes hard to understand and reason about because of
by samsquire 3y ago
This is interesting because in some kinds of software, if you just keep adding features then the software becomes hard to understand and reason about because of the multiplied interactions between features. The software become so heavy that very few people understand it.
I think you see this in programming languages themselves. I am not criticising C++ or Rust (they do good work, which I admire) but from my perspective the languages have many features that all interact in tricky ways. An example would be coroutines, threads, async, memory management.
There's also social interactions that multiply complexity: see the Python 2 to 3 migration pain that splintered the language for a while. Or Red Hat and its source.
I really enjoy this blog post about writing accidentally writing a compiler and handling the permutations of AST Nodes.
https://rachit.pl/post/you-have-built-a-compiler/ https://rachit.pl/post/you-have-built-a-compiler/
A billing or invoice system, that should be simple? But it isn't because everything interacts: failed jobs, holidays, daylight saving time, timezones, time, business processes, procedures, edge cases.
This is actually a subject that I am investigating as a hobby which is how do you handle interactions between arbitrary behaviours: such as you want a system that is Windows, Linux and Mac and platforms have different semantics that make writing your software tricky.
I think type systems get some of the way there but TLA+ and other formal verification tools help us get another part of the way there. But I am still learning.