I'm not too concerned about graphics or 3D math. I'm working in a 2D space with the most amateur of graphics. I'm interested in having some looming trade-offs pointed out to me so that I can make decisions with my architecture to best receive those trade-offs. I'm interested in design patterns that allow me to modularly enrich the complexity of my simulation.
If you're curious, https://github.com/MeoMix/antfarm/blob/main/src/util.ts Here is a file that became quite the dumping ground. I am not proud of this code. I had intended to tease out some utility methods which take a world and return a cloned and updated world. It's easy enough to separate out view concepts, and it's easy enough to separate out constructors, but all of the "interesting" simulation logic found its way to this dumping ground.
One book I am going to purchase is https://tynansylvester.com/book/ as it's by the developer of RimWorld which is a world-class simulation game. I don't think this will approach technical trade-offs, though, only functional.
Another resource I found is the development blog for Sandspiel, https://maxbittker.com/making-sandspiel This is actually quite a useful resource and I think I would do well to internalize it more, but it also focuses heavily on particle physics and automata-driven simulations. These are good concepts to explore and ones I should strive to master, but they aren't the only ways to slice a simulation game.
Did you use a game engine? These will often encourage you to follow a particular pattern when writing code. If you didn't, then I'd encourage you to look into entity component systems (which I also used for my homepage). It's quite a light weight pattern and it really lent itself to programming in a game loop (as opposed to say, MVC which fits the request/response cycle of web programming better)
As FragrantRiver also already said, start small. Think of the smallest scope possible, then reduce it even more. Perhaps consider a game engine, so your programming efforts are focused on the economy side, then the ants can be event driven, and graphics are easier to handle/implement. (I started a Universal Paperclip clone a while back, using cljs, and had bags of fun making the tech tree and economy logic, but then got bored when I had to build a UI finally.)
https://www.youtube.com/watch?v=eZfj7LEFT98
But other than that, it's like building most types of software. It's scary when you start and don't know where to go. Start with a small loop. Implement it. Extend it. Refactor it.