12
16 Comments

I only have production code

Hi,
I'm Nena and I am developing and maintaining my open source software open3A. It's an invoicing application with CRM, staff- and inventory management. I am working on open3A since 2007 by myself and It has gotten really big. Since 2021 I have an employee but I still am the only one coding the entire application.

As a single developer I have to make some compromises because I just don't have the time to do all the fancy stuff like unit tests, CI/CD, younameit. I need to produce working code because that is what I am paid for.

I have one principle for developing new features:

I only develop something if I have someone who will use it directly afterwards. Even if that is myself ๐Ÿ˜‰. This is great because I don't waste time on features no one will use and it has another upside: I don't need to write any tests for the functionality. Because a real person will be using it. In a real use-case. In their own environment. And they usually use it in ways I never considered.

For this to work I need to be able to fix a bug really quickly because there is only code that is in production. I use PHP as language of choice and my software is open source so I can just send my users/customers the new version of a file and tell them where to copy it and everything is fine.

Of course if multiple files are affected I need a process for that, too.
I have two versions of my software. The last stable one and my developer version which I call "nightly". The last stable version is just the nightly version with a feature freeze at some point. After the freeze I only backport some important bug fixes to the stable version. Soooo, a user reports a bug, what do I do? I fix it in nightly and maybe backport it to stable. I then tell the user to make a full update with the last stable version OR with the current nightly version. Yep. With the nightly. For production. I know, I am crazy ๐Ÿ˜œ

But let me take you full circle. I wrote earlier, that I only develop a new feature if there is someone who will use it directly afterwards. This means there is always someone who is already using the nightly version. Because new features are only in the nightly version. I use my users to continuously test the software. This way I can concentrate on production code, make sure everything works as expected and even when (there is no if) something gets broken, people only tell me "wow, you are really fast!". They don't know that I use them for testing. They don't care because they are used to things not working. It is my fast response saving the day.

This also works for the extensions I write for customers. I get a lot of requests to build this and that into the software and often I don't extend my main version for it but instead I write a single file which contains the desired functionality. I have a whole extension system in place but it simply is impossible to check every extension I ever wrote. There are hundreds which I created over the years. Sooo, a user with a custom extension - which I've already forgotten existed โ˜บ๏ธ - makes an update and boom ๐Ÿ’ฅ, it breaks because I made a change two versions ago and she didn't update since then. No biggie, I just fix the extension to work with the current version and send it, along with instructions where to copy the file.

Of course this only works because I don't do complete rewrites and making any extension compatible again only includes some code changes. I have this base version of my software which I won't rewrite completely. Ever. It's just too big by now and I couldn't pull it off anyway. I don't do revolution. I only do evolution. Sure enough I clean up technical debt (I have to) when I am working on some code again after months or years. But I never touch stuff that has no reported problems. I accept that there are pieces of my application that might not be working right now. But that is fine. If no one notices, then no one uses it and it might as well be broken.

  1. 2

    Is your domain open3a.de? If so, you should know it appears it's on MetaMask's warning list for phishing.

  2. 1

    It sounds like you've developed a really interesting and effective workflow for developing and maintaining open3A.

    Your approach of only developing new features if there is someone who will use them directly afterward is a great way to ensure that you're not wasting time on features that won't be used, and it also allows for real-world testing of the new functionality.

    Your use of "nightly" builds and your focus on quickly fixing bugs also seem like smart ways to ensure that your software stays stable and reliable for your users.

    1. 1

      Yes, this process has been working for 15 years now. In the early days I sent people a zip file with the new version โ˜บ๏ธ These days I tell them to download it from the homepage where the nightly version is updated daily directly from git.

  3. 1

    While this "I only develop something if I have someone who will use it directly afterwards." will keep you focused on meaningful project, I highly recommend people to do more than just than meaningful projects. Without experiment and learning new skills, there's no way to have real breakthrough.

    1. 2

      I totally agree, sometimes we have to play โ˜บ๏ธ

  4. 1

    This domain is currently on the MetaMask domain warning list. This means that based on information available to us, MetaMask believes this domain could currently compromise your security and, as an added safety feature, MetaMask has restricted access to the site. To override this, please read the rest of this warning for instructions on how to continue at your own risk.

    1. 1

      Yeah, I don't know what they want. I didn't take the time to fix this.

  5. 1

    interesting workflow. Thanks for sharing. What is the version control system that you use? github?

    1. 1

      I used gitosis for many years and installed a self hosted version of gitlab two years ago.

  6. 1

    Hi Nena, may I ask, how did you market your software? How did you find users?

    1. 2

      You may ask๐Ÿ˜Š
      Back when I created open3A in 2007, I never intended it to earn money. I put it on the internet for free and it actually found users by itself. They asked me if I would implement more features and at some point started paying me for it.
      I didn't market it back then. I paid for some adwords now and then but never found that it makes any difference. I'm relying on word of mouth and it is the best marketing I can get. The world was different back then. The internet was smaller and open3A was probably the first web-based invoicing application. Now there are hundreds.

  7. 1

    ๐Ÿ‘๐Ÿ‘๐Ÿ‘๐Ÿ‘

  8. 1

    Hey Nena,

    I think it's really impressive.

    I love your principle of only developing new features if there is someone who will use them directly afterwards. This not only ensures that you're not wasting time on features that no one will use, but it also allows you to test the functionality in real-world scenarios, which is incredibly valuable.

    Overall, it sounds like you have a unique and effective approach to developing and maintaining your software as a single developer, keep up the great work!

    1. 2

      Thank you for your comment!

      This process still works, even after 15 years. I'm astonished myself ๐Ÿ˜ณ

  9. 0

    intriguing work process. Gratitude for sharing. What is the form control framework that you use? github? https://essentialsclothing.co/

    1. 1

      I wrote my own framework. Back then there were very few frameworks. I think ExtJS was one of them and Smarty something. But I didn't like them. I believe it saved me so much work over the years to just build it from scratch. Self-hosted gitlab instance.

Trending on Indie Hackers
After 10M+ Views, 13k+ Upvotes: The Reddit Strategy That Worked for Me! 42 comments Getting first 908 Paid Signups by Spending $353 ONLY. 24 comments I talked to 8 SaaS founders, these are the most common SaaS tools they use 20 comments What are your cold outreach conversion rates? Top 3 Metrics And Benchmarks To Track 19 comments Hero Section Copywriting Framework that Converts 3x 12 comments Join our AI video tool demo, get a cool video back! 12 comments