Who creates this software? Software does not write itself. Curious and committed people create it. These people describe themselves using one or more of these titles: developer, packager, power user, bug reporter and user.
After making use of Free Software people find it usually does almost exactly what they need. These people often share their need with the software developers either informally or as a well written issue/defect/problem/change request/bug report. This itself is an extremely valuable contribution.
Because the source code is available, people can then get involved often with a change to the software (called a patch) that improves it with some new (small or large) feature for their own use. Sharing this change back to the project helps the project developer (they don’t have to create the new feature) and other users who can then use the new feature. The patch creator also does not need to maintain their changes against newer versions of the project. Contributing a patch is the first step in becoming a software developer.
The people who write this code often need this code. However, like musical bands, volunteer software developers can and often do change what software they develop. Software that is widely used naturally finds people who are able and willing to contribute to sustain the software.
While each project is different, several different organized groups of people usually work together to provide end users with their software. Free Software and open source software is commonly distributed through a GNU/Linux Distribution that provides packaging. To make a full system function all the parts (the Linux kernel, often the GNU C Library and other parts) must function harmoniously together as a system, be installed correctly, provide defaults and instructions for configuration, be upgraded correctly and (when required) be removed correctly. Packagers provide the necessary and important work that is specific to the distribution you are using.
The software engineering development lifecycle is well understood by those that create software regularly. There are many best practices, not all of which are completely understood by everyone practicing in the field.
Programs used in many locations often need i18n and l10n or preparing the program for translations (aka i18n or internationalization) and providing the local translation strings (aka l10n or localization).
Why do people create software? Often times people need code to solve their own problems or those of their employer. When people share their code everyone benefits.