If you would look over my github repositories, you’ll see that most of my programs are pretty small. And in general they are command-line applications. And that is good, because small is beautiful and simplicity is a virtue.
Recently I saw this blog post titled software has diseconomies of scale. This concerns the development of software, not the marginal costs or reproducing instances. The latter is almost free.
This confirmed some things that I have felt for a long time.
The larger a program grows, the harder it becomes to keep a significant portion of it in your head. This means you’ll spend more time looking back and reading code than writing new code. And it means more effort to fix bugs or refactor. Dividing programs into modules reduces but does not eliminate the problem.
Command-line programs in general have a relatively simple flow. You read some choices, and then for each file given you do something. In asynchronous programs or GUI program your code can get lost in the framework. Additionally such toolkits or frameworks carry a lot of assumptions that you have to learn.