Hacker News new | past | comments | ask | show | jobs | submit login
Seven Years of Factorio Friday Facts (2020) (spieswl.github.io)
385 points by destructuredObj on June 9, 2021 | hide | past | favorite | 73 comments

Author here. Wow, uh, I definitely did not expect to be featured on HN this morning, but seeing this linked put a massive smile on my face.

There are just so many examples of captivating writing, innovative problem solving, and candid discussion throughout the FFFs. Taken all together, the Factorio journey is one of my favorite _stories_ to read...and it contributed to becoming a better designer and engineer along the way. I really encourage people to read more of their blog than just what I've linked, since it crosses so many areas of interest.

To anyone reading that's worked on Factorio, thank you and you all are wonderful people.

Quick links to the five "must read" posts that William highlighted:

> FFF #243 - New GUI tileset: Showing off their GUI design document. A MUST READ, if only for a good example of a comprehensive design style that fits the game theme perfectly. (https://factorio.com/blog/post/fff-243)

> FFF #176 - Belts optimization for 0.15 : Incredible analysis of transport belts and optimizing their performance. A MUST READ. (https://factorio.com/blog/post/fff-176)

> FFF #204 - Another day, another optimisation : Solid technical writeup on how a prefetching optimization patch works across a number of resource-heavy factory builds. A MUST READ. (https://factorio.com/blog/post/fff-204)

> FFF #296 - All kinds of bugs : The snippet at the bottom is a perfect encapsulation of their attitude towards problem solving. It’s such a simple concept, just going a little farther, that can take tremendous discipline and focus. A MUST READ. (https://factorio.com/blog/post/fff-296)

> FFF #356 - Blueprint library for real : Michal “kovarex” Kovařík, one of the two cofounders, talks about falling out of the development process, losing his sense of purpose, and how playing Factorio with his son brought him back. Reading this one, even through the sometimes-broken English, is inspirational and a wonderful look at how things fall apart and come back together. Like I mentioned in the intro, this is one of those rare, special offerings that is technical in nature but deeply personal and human-centric in form. A MUST READ. (https://factorio.com/blog/post/fff-356)

> Earlier this week we got a bug report about the game freezing, consuming all of the available RAM, and then crashing when it ran out of RAM. It was again a modded save file so my first instinct was to blame it on a mod. Again, I had to test it. And again... it's never what you think it is.

> So, I still repeat the phrase: "Crashing on dereferencing null? Just add a null check!" as a reminder to myself and others to always look deeper into why and never stop at the basic symptom of a problem.

I feel this is a very important rule that people often forget - most anytime your "safety" code triggers, something went wrong somewhere else and it can be worth tracking it down.

It's a perfect example of how useful it is to think in terms of what invariants should hold and why.

> FFF #176 - Belts optimization

The last bit of this post mentions UDP packets not making it through ISPs if their checksum is 0x0000 or 0xFFFF...what is THAT all about? This would have been in February of 2017.

> If you remember from the previous FFF, our map downloader was having some extremely rare problems with some mysterious packets that would always get filtered over the Internet. We already had a fix for it, but I was curious what was going on. Thanks to the investigative power of the Factorio community, we found out that all those mysterious packets, before NAT, had a checksum of 0xFFFF. Admalledd from the forum sent some hand-crafted packets through his Internet connection and surprise, all packets would go through, except those with a checksum of 0xFFFF or 0x0000. At this point I would just assume this ISP(and some other few ISPs around the world) have some faulty hardware or software that do not handle these special cases of UDP checksums.

If the checksum comes out as all 0's you're supposed to make it all 1's (0 in a UDP checksum means no checksum) so really it's related to that singular value and, if you've ever seen the quality of some of the dirt cheap hardware with ancient firmware some carriers use, it's really not that surprising for it to be bugged as described as they really don't care about dropping the occasional UDP packet when it's probably dropping more than that of general traffic due to how cheap and overrun it is anyways.

356 is a really nice read. inspirational indeed.

Yeah, that one caught my eye (and then moistened it).

The way he breaks his slump by sharing Factorio with his son -- what a wonderful, unexpected benefit of working in games. How many of us will get to do something like that?

I've been a huge fan of Factorio since 2014.

A huge fan of the game, the team, and the entrepreneurial adventure.

Their willingness to share insights, every weeks, for 7 years is quite rare in the industry.

It was also awesome to read the thought process behind each design decision alongside some nerdy story about C++ optimization.

Factorio team, if you're ready this, thank you!

The game is also seriously fun :D. It has such replay-ability for me. You can either make new factories or you can infinitely tweak old ones. So much fun tweaking lines to increase efficiency and throughput.

Any tips on where I could go to read more about the entrepreneurial adventure?

For those wondering why this game about factory management keeps showing up on the front page of HN, it’s because the gameplay reminds its fans of software engineering in subtle ways. People who are good at one are likely to be good at the other. More about this here - https://blog.nindalf.com/posts/factorio-and-software-enginee...

There are two kinds of programmers,

Those who look at Factorio and go: "That's my day job! Why would I do it for fun?"

and those who look at Factorio and go: "That's my day job! You mean I can do it for fun?!"

My day job is getting alignment and approvals on fixing things. Factorio is deciding to fix something and then doing it.

Have you tried Factorio multiplayer? I tried it with some other people and it really is like real life.

Somebody put in an ugly hack to deal with scaling rather than rearchitect? Well, I'd like to fix it but it'll mean downtime that'll interrupt player 2's OKR of getting the rocket control units made.

Plus, we didn't allocate enough space, so I need to talk to player 3 who owns the adjacent area (and whose functionality I don't understand). Player 3 doesn't like the idea of moving or redesigning that area, so I'm going to try asking Player 2 or Player 4 to help me rebuild it in an undeveloped area.

Building the new section while the old section is still running has overdrawn on our electricity capacity, which has been oversubscribed for a while but we just kept accumulating tech debt on electrical with ugly hacks. Which brings me back to step 1.

Exactly. I can completely disrupt my factory to refactor it for hours without worrying about pesky end-users and other stakeholders.

Having a PM to help me stay focused would not be a bad thing when I play Factorio. However, that would probably come bundled with having a PM constantly ask me to half-ass (I mean MVP) three different new projects in the factory in the time it would normally take me to full-ass one project.

Three halves > 1 full, sounds like a win to me! /s

I'm of the first type. I love Factorio, I bought it when it was still pretty much unknown (I'm a hipster like that), but I can't bring myself to play it while I'm in my current state of extreme burnout. I have a hard time writing code, I really can't muster the strength to play "programming and refactoring, the game."

Or those that go: "its like my day job and there are no idiots stopping me from solving problems!"

And the third kind who goes "this game is fun! but it's like my day job, why don't I just do that for fun instead?"

Of course Factorio doesn't come with obligations to document and hand over your glorious creation...

Good lord... I'm #2... I also play FortressCraft and Satisfactory and other games of the genre... after working on the same crap all day.

You missed those who say "I do this for fun, just like my day job!!!1!"

I've seen this said literally hundreds of times and can only imagine that these comments are hyperbole now.

I've given Factorio dozens of shots now, and have played for hours and hours with people who are great at the game, but it just isn't for me. I get bored in the monotony of the early game, and I'm too stupid to keep things going in the mid game.

When I first picked up Factorio I loved it for about ~12 hours. Then I just felt, everything is too hard and there isn't a sense of purpose.

For me, I think it would me a fun game if there was more strategy or something else to do besides build the factory. It seems to me the progression system is actually really linear.

> I get bored in the monotony of the early game, and I'm too stupid to keep things going in the mid game.

This is my other big issue. I don't like putting in much effort when playing video games. It seems like just getting blue science takes hours of work, and those hours were fun for the first factory, but now it's just repetitive.

The invading bugs sort of are the purpose, to defend against those. But I find it tedious, so I like to turn them off, and then yes, the game is even more noticeably lacking purpose.

I think though that making train networks is my big pleasure with the game. Very satisfying.

My recipe to monotony of early game was to design a really small starter base (~20 red/green/black/blue science per minute) with the explicit target to produce construction bots. With bots, things become easier.

That being said, I understand the sentiment. I have been playing lots of modded Minecraft and Factorio over the past decade, and lately I felt a bit of guilt because I feel I could be working on some other, more meaningful, project.

I don't think there's a statement in there about enjoying the game, just the shared skillset and mindset. :)

Maybe that's why I don't enjoy it... Feels like I could be getting work done on any of my side projects when I play. Don't have that same feeling when I'm playing other games.

That being said, I do enjoy it at LAN parties because I just build walls and hunt biter nests

The comment that really made it click for me is that there are two diametrically opposed responses for engineers playing Factorio:

* "This game is scratching the same itches as my day job, but with more dopamine and less bureaucracy - how can I play this all the time?" * "This game requires me to expend the same brain-effort as my work/side-projects, but I don't even get anything tangible out of it? Why would I ever 'play' this?"

Neither of them are wrong - and I suspect that the same person might even have different reactions at different points in their life.

I'm square in the second group. Factorio is fun for a while, but after somewhere around mid-game you realize that it's much more frustrating and less enjoyable than actual programming.

I can't easily "refactor" parts of my factory without fearing it will break some pipeline that depends on the changes. I wish there was a way to "write" "tests" or do mass changes safely. Blueprints and robots help automate things, but it's not that flexible.

I wish I could use a "debugger" and step through the execution and play with changes to see how it affects the factory.

And then I finally get to the conclusion that this would all be easier from a text editor using proper programming tools, and more enjoyable to work on a real project that could have tangible benefits (and then never finish that either...).

Most of my games ending when I realized that I have to rebuild half of my base because of some thing and I don't want to spend so much time with inactive base. And my internal perfectionist can't live forever with quickly-hacked sub-par solutions.

Robots at least make it somewhat bearable.

I absolutely understand where you're coming from. The closest thing I found to "tests" was that you could hook up alarm klaxons to belts/containers that would alert you when a certain resource was below a given level - but that's very much a in-production canary of "tell me when things are going wrong", not a mid-development "tell me how this change will end up looking".

An interesting thing about Factorio to me (beyond what’s stated in the linked article), is that it contains a nearly a perfect 1:1 analogy to software concurrency.

• Belts are blocking CSP channels, as seen in e.g. Golang (where N producers have to share — or eventually “merge onto” — one channel representing the blocking-receive point of the consumer; which are best only used to transport messages of a single type, or if not, then the sum-typed channel must be demultiplexed at the end, with this tending to lower throughput; where messages of a given type “queue up” until the channel is full, and then all producers block when attempting to write to the channel; where if you’ve got producers producing at different rates, then the fastest ones can hog the capacity of the channel, decreasing throughput and unevenly spending input resources such that some components fail long before others; where the solution to this is to give each producer its own bounded outbox channel that multiplexes onto the consumer’s channel, such that the producer will block itself rather than blocking its siblings; etc.)

• Logistics robots are message-queue topics (where N producers can publish messages of a given type, without worrying about how they’ll get to a consumer; where consumers [demand chests] subscribe to specific event message types; where the bus itself can get overloaded, causing delivery failures of unrelated topics as delivery-threads sit around holding a message unable to deliver it; where the solution to this is to add reliable MQ-internal storage [network-linked storage chests] for the agents to offload produced messages to until demand comes for them.)

(Sadly there’s no exact equivalent to Erlang-style message-passing, where producers target messages of arbitrary type at a specific consumer, which all go to the consumer’s single inbox; and where, if that inbox is full, then the message just “evaporates” en route, since the passed message has async semantics where the producer isn’t linked to its delivery. But, interestingly, that type of concurrency totally could be added, with a not-even-very-complex mod — just add a “outbox” chest object that can be configured to “target” a specific “inbox” chest somewhere else; and a second type of logistics robot that only moves stuff from outbox chests to inbox chests, not according to “demand” but just because anything currently sitting in an outbox chest is “intended to be” in the corresponding targeted inbox chest; and then ensure that this alternate type of logistics robots have non-reliable delivery semantics, where if the “inbox” chest signals to the network that it’s full, then all active delivery-threads targeting that inbox will literally “drop their messages on the ground”.)

IMHO it’s actually possible to learn how to be an effective distributed-systems engineer, just by playing Factorio and trying to scale the throughput of a resource-constrained system. In the process, you’ll likely re-invent many real-world concurrent software design patterns. Doing this first, and then reading a Distributed Systems textbook, will have a much more visceral impact on you, because you’ll have already faced these problems, struggled with them, and now you’re being handed all the techniques for solving them on a silver platter.

I wanted, but never got around to, creating a mod that accepts some kind of data outside the game (lines of text, JSON objects, packets from the TUN driver, whatever), wraps them up as Factorio objects, and plops them onto a belt, and another that reads them and sends them back out.

The idea being that this could be (A) a cool hack (belt speed factoring into ping time, lmao), but (B) a way to visualize data flow in complex queue systems.

Hell, why not turn Factorio into a programming language?

If you can translate a real-world problem to in-game problems, it'd be so much fun to solve them that you'd probably launch a new epoch in human history - the Factorio Age

There's a verilog2factorio compiler: https://github.com/Redcrafter/verilog2factorio

That's amazing!

And then Mazer Rackham reveals the truth about every Factorio game played since the official 1.0 release.

Oh, that would be cool. You could implement sorting algorithms and such.

> (Sadly there’s no exact equivalent to Erlang-style message-passing, where producers target messages of arbitrary type at a specific consumer, which all go to the consumer’s single inbox; and where, if that inbox is full, then the message just “evaporates” en route

Train stations plus circuits can do this. Trains can be configured to leave a station when not empty (after receiving a message item of any type), and recipient stations can be disabled by a circuit if the receiver is full, causing the train to skip the station. The last station on the train's route would empty it before it goes back to waiting for a message item to deliver.

Not quite the same scheduling/locking semantics, though — sure, it's "concurrent" and packet-oriented, but it's a token ring. It's similar to the original Redis model of concurrency: just have everyone make a series of tiny requests, and then loop around / select(2) from your clients, handling each client's latest request serially, with no request queuing because all requests are synchronous/blocking for the client making them.

N logistics bots are a much closer analogue to N scheduler threads each working in parallel to 1. take a message from a priority heap (really, to take a schedulable process from a priority heap and then run it to produce messages, but same difference) and then 2. synchronously shuttle that message to its destination queue.

I suppose you could get the same semantics with N parallel train tracks, one per scheduler-thread; plus an actual scheduler priority-queue implemented in circuits. But I feel like that's a "non-idiomatic case", in that, no matter how you designed your stations or where you put them, it'd be incredibly painful to design a loader/unloader for a "bus" of parallel train tracks. Especially if all the trains arrive together. It'd be a setup the devs would take one look at and say "that's too much of a kludge, and yet the kludgeyness is necessary, and that's our fault for not including a necessary abstraction. We'll just put in that abstraction."

(The alternative would be a mod that allows trains to pass through one-another on a track. Then you could have one train-line where each train cleanly represents a scheduler thread. No idea what would happen if they tried to stop at the same station at the same time, though. Ghost trains~)

Also I see trains as network design. You have to commit to the train size upfront (network block size) and you can hit throughput limits

Subtle and not so subtle. I'm pretty sure someone's implemented Tetris in it.

Programmer Crack

The Friday Facts were fantastic. I don't know of any other non-open-source project (but counterexamples are of course welcome) that encourages the developers to put that much technical information about what they're up to out on the website. I especially loved the ones about belt optimizations, multi-threading, and the networking model, since those are all interesting problems that any game developer is likely to think about but not necessarily get around to really solving the way that Factorio did. The FFF's inspired me to, on a total lark, send over my resume, which turned out to be good timing.

I think my "holy crap I'm working on factorio, pinch me" was equivalent to some people's "holy crap I'm working for Microsoft." I still remember the odd smell of the office when I first walked in ("sorry it smells like acid in here", I was told, and was later disappointed to learn that when Europeans say "smells like acid" they just mean it smells bad; there was no open use of entheogens while I was there).

I'm glad fff-200 made the cut for this guy's list, as that's the one where I announced the new 'programmable noise' terrain generator. More deets in https://www.factorio.com/blog/post/fff-207, https://www.factorio.com/blog/post/fff-258, and https://www.factorio.com/blog/post/fff-282, among others.

Absolutely. I'm a sucker for good writing and I feel that you all set an excellent example of how to do technical writing and analysis correctly.

Thanks for writing (the code and the blogs!)

What are you up to these days?

These days I'm at a 'regular job' that is far less interesting, but pays a lot better, which I was especially glad about when the furnace needed replacing. So it goes, sometimes. I mostly blame the US healthcare^W extortion system.

Probably the best game I have ever played and the only game I bought not once, but thrice (two were gifts).

As a developer, it allowed me to determine what kind of developer I am, where my interests lie, and how I contribute to code (or a base). The analogue between coding and Factorio is incredible.

Preamble: I mean this as a compliment to the game, so I hope I don't come off too negative.

Factorio is so analogous to coding that I just couldn't get into it. I laid out a neat little factory and then requirements changed and I realized that I needed to basically abandon what I had and build something new. My factory was not really "open to refactoring". Something about that feeling felt so similar to what I have to do at work all day that I closed the game and haven't gone back to it since.

I got really into a technical Minecraft mod back in my college days (Better Than Wolves). For some reason I never really had the same problem with that, in fact I really enjoyed crawling around in tunnels and changing things around. Something about the 3d-ness of Minecraft made it feel more like tinkering maybe.

Idk, this post has become a ramble - but suffice it to say that Factorio felt _too much_ like programming for me to truly enjoy it. Maybe that says something about the kind of developer _I_ am ;)

There is an inherent tension in Factorio (and software engineering!) between trying to get everything right up front and just building anything that works and fixing it later. I've found a balance that is fun for me in the low-stakes video game world.

Every Factorio player I know has an enormous laundry list of things they wish they'd done better after their first game. That urge never completely goes away, and if that feeling is more distressing than energizing to you, then perhaps Factorio is not the game for you.

Still, the process of analyzing a system in a factory and redesigning it to be more efficient is massively satisfying. New challenges arise at every stage of a factory's growth, and before long, your 'starter base' is just a small part of your whole operation, and the shortcomings there just don't matter in the whole scheme of things.

I've played a few hundred hours of factorio, so by no means a _lot_ but I've launched quite a few rockets and "finished" the game a few times.

Depending on how long you played you might have missed out on the part that's the most fun (for me at least) - the later/end game.

Once you have bots the game changes a lot and you stop building stuff yourself and let bots build stuff for you. Once you have a few hundred bots (and resources) you can build/destroy/rebuild/scale up huge parts of the factory.

The starting factory is usually abandoned but a megabase can be a beast of it's own with constantly tweaking bottlenecks - which can be quite a lot of fun (or it is for me at least)

That is an oft-echoed sentiment. I've experienced it a little bit myself, but the main reason I've fallen out of it (after a few fiercely addicted bouts) was it felt like I was exacerbating some RSI, especially with my mousing hand.

But yeah once you start thinking about on-demand rail delivery using signals as RPC...it's pretty work-like. :D The async nature of the inventory system means long-range signal transmission handling ends up feeling exactly like bit-banging on a microcontroller, which is sufficiently out of my current work scope that it's fun and interesting. Oh no, this makes me want to attempt the Ben Eater computer in factorio...

This, for me, certainly drove home how much I hate refactoring things. If I need to reconfigure my factory for some reason, beyond throwing in a little spaghetti and in-filling some gaps to add another few bits of production, I'll just waltz off into the distance a ways and start anew, piping in resources from the old factory as needed.

And then I run into bottlenecks arising from the utilization of the old factory and the process repeats itself.

I find your comment super interesting. I myself deeply enjoy refactoring as an activity in software, and I share that affinity towards it both in Factorio and Minecraft, where I'll deeply enjoy tearing down massive chunks of my base to reconstruct them slightly or completely differently.

To anyone who loves Factorio as much as I do, I strongly recommend the new game Dyson Sphere Program. I never truly beat Factorio the way I did DSP, so I can't compare them completely, but DSP takes the concept to a 3D planetary scale and is in many ways much friendlier.

Also no combat/bugs, at least not yet. The dev team is Chinese and are releasing amazing quality-of-life updates at a rapid clip, too. Truly impressive piece of software.

Glad you mentioned DSP so I didn't have to ;) It really feels like the perfect extension/progression, or what I imagine Factorio 2.0 would/should be. The graphics are absolutely stunning as well, which is one point that started to really turn me off of Factorio after hundreds of hours, especially on a 4K monitor... not to mention watching spaceships fly cargo around the solar system is way cooler than trains ;) Also a lot of the tedious build-up that killed my interest in restarting Factorio for the Nth time is handled IMHO much nicer, such as giving you drones from the start. I haven't played in a couple months, still waiting for blueprints, which are supposedly right around the corner. I'm also very curious what/how they plan to implement enemies...

Yeah, nothing in Factorio can quite match watching all of your solar sails and ships orbiting and snapping into place around the sun in the sky. Which you can also fly right up to and watch all the little details in person.

This reminds me of a cool article I read about how Kerbal Space Program 2 renders orbits. I love reading things like this:


Those disclaimers at the beginning of the article are so out of touch

I... what?



My biggest Factorio lesson was this:

I no longer start a new factory from scratch if I want to do things differently. I use my existing - and now outdated - factory to launch a new one a few minutes run away.

Throw the first one away. Especially when starting a run, plan on throwing away the starter base.

I learned this trick watching AntiElitz speedruns. He'll build a manual bootstrap "factory" (really just mines and smelting) to get plates, then build a very-polished-through-iteration bootstrap base which builds all the development essentials - circuits, arms, belts, ammo, etc. That's used to build the real base.

That sounds a lot like the old Gentoo stage 1 / 2 / 3 build system...

Makes me a little more interested, in general.

I've done this once, but ended up spending three days building a rail in one direction because resource patches get bigger the further you are away from spawn. I ended up using nuclear powered trains to traverse it and it was still about 15 minutes to travel.

I wish they had expanded on the demo/tutorial mode's "story line". I liked how there were these secret half-built/half-destroyed bases waiting to be found.

You could try the Space Exploration mod; it’s got some exploration and discovery to do.

I find myself playing Rocket Rush, without the rush. This allows access to all the tech without the grind. I've built so many small nuclear plants with a bunch of steam tanks to store the power until needed. I've also built a ton of solar arraignments.

The constant things I always buy are 4 heavy oil, and 200 plastic. I usually get 10 miners, electric furnaces, and level 2 assemblers. Once I have power, and coal gasification up and running for plastic/explosives/batteries, it's just a grind.

I've settled on using an Island terrain, to give it an end, rather than just not wanting to keep expanding forever. Once the island is cleared, and has radar, it's time to start again.

From what I remember from this older interview with the two founders (in Czech) the main inspiration for doing Factorio were Tekkit-like mods for Minecraft.

Guidelines | FAQ | Lists | API | Security | Legal | Apply to YC | Contact