The underlying feeling... or is it a smell... is of someone afraid of their own code. I suspect you are not a master of your own code base, but a slave to it. Same for your build environment. The pattern matches and it's very common. We have already discussed ways to alieviate this, but you rejected those too. Version control. Version control allows you extremely sharp tools for maintaining code base in a safe way where all changes (commited ones) can be reversed, replayed, split, merged, reordered. Your build environment should be scripted, so it can be recreated in hours. Once you can do that, an LLM destroying your code base or your build env, is just Monday morning.
This is kind of the clash between software engineers and electronics engineers who do software engineering. Being primarily an electronics engineer myself who spends most of his time writing software
, I'm not too fond on all things like Agile, CI/CD, docker, automated test scripting, etc. For me that is just extra stuff on my plate. And I typically delegate that to others. I think peter-h is in the same boat as I am; primarily an electronics engineer who keeps getting sucked into software development.
I hear you. I'll be honest and say, at it's modern day finest, Enterprise software has lost it's way. It is entirely "business driven", there is no "engineering isolation" and thus no automony, private "truth" or protection of values/rigor/disipline. That proper layering only really still exists in financial infra, aerospace, defense or in places where code mistakes costs are immediate and eye watering.
The goal is to use prior software engineering to simply new software engineering with the goal being, software engineering not being required at all. Software solutions become more like "join the dots", "paint by numbers", the solution already dictated by platform, ditated by business and what they got sold. Engineering get almost no say in the mater.
There are many problems with this. It's "borrowing progress" for one. It creates a world where "software engineering" is deprecated entirely and replaced with "cookie cutter IDEs". Look at gaming for a parallel. The vast majority of games run on one of 2 or 3 game engines. 90% enterprise software runs on 2 or 3 cloud providers, using one of half a dozen primary components and frameworks.
If you want to get into the career, all you need to do now, starting from zero qualifications, is get a "bootcamp" in one of those frameworks/compoents etc. And you can get a software engineering role at 40K+ in the UK. At what point did this person get taught all the other stuff? They didn't.
However.... the contrast to the electronics "firmware" problem is getting starker and starker and you do not need to go as far as the above madness.
The key point I keep returning to is a question, literally the first question I would ask when someone floats a project by me in work. "How many people, how quickly?"
The answer to that will decide what tooling, what processes, what structures, what admin, what management etc. Before we even get to "Tech stack" or language.
CI/CD? It's nothing more in spirit to an IDE "auto build on change". The enterprise stack is split up for many reasons, but you don't need to that far. For one you are unlikely to need to run containerised test harnesses, PR environments etc. So most enterprise "CI/CD" systems would be completely wasted.
However. The principles and disciplines that come FROM using a CI/CD structure apply even with the simpler cases.
* Separation of development and build environments - your windows crashes and needs reinstalled does not stop the production line.
* Centralising build and quality control - no idiot forgetting to switch OFF disable_tests and releasing a build.
* Automating build and deploy.
* Integration to the "work tracking systems"
* Forcing "single point truth" in the code repo. If it's not committed, it doesn't exist.
* Simultaneous parallel version builds with parallel dependencies. (support legacy devices/customers)
There are probably others... more related to team and competing teams and multi-environments. Although that later one applies.
One point is that builds are reproducable. A valid "failure mode" point is what happens when the "infra" running the CI/CD gets corrupted or "broken". That one is addressed by making everything that can be made ephemeral, ephemeral. The entire CI/CD stack install/deploy can itself be scripted. Just don't lose the descriptors and scripts!
Consider. You need to support builds for 3 different MCU platforms, which have sutble build changes and branches. A CI/CD style system can help you automate things like; "Commit code, push code. Tag code with MCU_1_v1_deploy and wait. If you didn't break the build the MCU test harness in the corner beeps and runs the tests. Or... you go into a queue because your peer is already running tests on it. Even if these MCUs are in a different country. Nobody leaves their desks.
What that looks like for a small one dev, versus a small team, versus a large set of teams, is different. The value of it is also different.
Agile is/was great. What is currently being "called" agile is a velocity over progress management system used to maintain perpetual work streams and revenue.