diff options
| -rw-r--r-- | content/hire-me/index.md | 24 | ||||
| -rw-r--r-- | content/pyblock/_index.md | 7 | ||||
| -rw-r--r-- | content/pyblock/introduction.md | 110 |
3 files changed, 126 insertions, 15 deletions
diff --git a/content/hire-me/index.md b/content/hire-me/index.md index 5d9e003..586cc50 100644 --- a/content/hire-me/index.md +++ b/content/hire-me/index.md @@ -1,9 +1,9 @@ --- title: Hire Me -date: 2023-02-07T09:21:26-0500 +date: 2025-12-11T13:23:00-0400 --- -I've been a professional software developer since the early 2000s and an enthusiastic amateur even longer, and a manager of developers since 2019. I'm also deeply interested in organizational dynamics and group consensus: software, like ourselves, lives in a society, and both serves the needs of and serves to help shape that society. +I've been a professional software developer since the early 2000s and an enthusiastic amateur even longer. I was also, for a while, a manager of developers. I'm deeply interested in organizational dynamics and group consensus: software, like ourselves, lives in a society, and both serves the needs of and serves to help shape that society. I'm always interested in hearing from people and organizations that I can help, whether that means coming in for a few days to talk about end-to-end testing or joining your organization full-time to help turn an idea into reality. @@ -21,31 +21,25 @@ Major projects I contributed to include a declarative policy engine to allow dev ## Ada Support (2022-2023) -As an engineering manager at Ada, I lead a team of engineers to build an internal platform for chat applications. Our goal was to enable growth into new markets, by making it possible to extend Ada's product in novel ways based on the needs of new customers. +As an engineering manager at Ada, I led a team of engineers to build an internal platform for chat applications. Our goal was to enable growth into new markets, by making it possible to extend Ada's product in novel ways based on the needs of new customers. -During my tenure the team set out on building an event processing system based on Kafka, intended to decouple the company's in-house chat frontend from the response generation services and to become the common interface for other customer service platforms, so that Ada could intervene to assist customers via email, phone, and other services our customers might already be using. +During my tenure, the team set out on building an event processing system based on Kafka, intended to decouple the company's in-house chat frontend from the response generation services and to become the common interface for other customer service platforms, so that Ada could intervene to assist customers via email, phone, and other services our customers might already be using. ## Heroku/Salesforce (2015-2022) -In my time with Heroku (and with Salesforce, Heroku's parent organization), I've contributed to the delivery and operation of services that let developers bring their ideas to life on the internet, both as a developer and as a manager. I've been involved in maintaining and expanding existing features, exploring and developing new products, and in cultivating my peers and my team as people and as developers. +In my time with Heroku (and with Salesforce, Heroku's parent organization), I contributed to the delivery and operation of services that let developers bring their ideas to life on the internet, both as a developer and as a manager. I was involved in maintaining and expanding existing features, exploring and developing new products, and in cultivating my peers and my team as people and as developers. -* As an engineering manager (2018 to 2022), I've been responsible for building and supporting an effective, unified team across multiple continents. Moving into management was motivated by a desire to act as a force multiplier, which I've brought to life through coaching, process management, facilitating ongoing discussions about the direction and health of the team, and through actively being involved in my reports' progress as developers. - - Each of the teams I've worked on has been responsible for both developing and operating a mature product, delivered at scale via the internet, to a diverse range of customers. My team has served everyone from single developers working on hobby projects all the way up to billion-dollar enterprises who selected Heroku as their platform of choice for the enterprise. - - Those teams have been comprised of everything from unique, hard-to-replace domain experts to interns on their first outing. In order to organize and lead, I take a disciplined approach to communication, emphasizing clarity and empathy. I provide as much flexibility around scheduling as the organization can spare, to enable my teams to work when they're at their best. And, as my team's ambassador to the organization, I gather up the disparate and sometimes highly-speculative streams of work in flight to present as a coherent roadmap against organizational goals. - - I've also been responsible for the huge range of work that Salesforce expects from line management, including performance management and coaching, compensation planning, hiring and interviewing, balancing on-call schedules against burnout and retention risks, and skilling up the team to handle the parts of all of these processes that can be delegated, while keeping their time free to do the things they're good at as much as is possible. +* As an engineering manager (2018 to 2022), I was responsible for building and supporting an effective, unified team across North and South America and Europe. Moving into management was motivated by a desire to act as a force multiplier, which I practiced through coaching, process management, facilitating ongoing discussions about the direction and health of the team, and through active investment in my reports' progress. * As a lead developer (2015-2018), I worked on the [Heroku build system](https://devcenter.heroku.com/articles/git), which ingests code from end users and deploys that code to applications running on the Heroku platform. As part of that work, we implemented a number of features to control abuse, support language-specific features and needs, and to develop [new ways to deploy code](https://devcenter.heroku.com/articles/build-docker-images-heroku-yml) to Heroku. ## FreshBooks (2009-2014) -During the five years I was with the company, it grew from a 20-person one-room organization to a healthy, growing two-hundred-person technology company. As an early employee, I had my hand in many, many projects and helped the development team absorb the massive cultural changes that come with growth, while also building a SaaS product that let others realize their dreams. Some highlights: +While I was with the company, it grew from a 20-person one-room organization to a healthy, growing two-hundred-person technology company. As an early employee, I had my hand in many, many projects and helped the development team absorb the massive cultural changes that come with growth, while also building a SaaS product that let others realize their dreams. Some highlights: -* As the team's database administrator, I was responsible for balancing concerns about reliability and availability against the need to deliver new services and functional improvements for customers. Alongside the operations team, I handled capacity planning, reliability, outage planning, and performance monitoring. Alongside the development team, I was responsible for designing processes tooling and providing advice on the most effective ways to use MySQL to accomplish their goals. +* As the team's database administrator, I was responsible for balancing concerns about reliability and availability against the need to deliver new services and functional improvements for customers. Alongside the operations team, I handled capacity planning, reliability, outage planning, and performance monitoring. Alongside the development team, I was responsible for designing processes, tooling, and expertise on the most effective ways to use MySQL. -* As an ops toolsmith, I worked extensively on deployment automation and standardizing process for internal services. I created a standard development VM to ensure developers had an environment consistent with reality, I automated packaging and rollout to testing servers, I explored options around platform-as-a-service products to look for fit, and more. As part of this work, I built training materials and ran sessions to teach other developers how to think like a sysadmin, covering Linux, Puppet, virtualization, and other topics. +* As an ops toolsmith, I worked extensively on deployment automation and standardizing process for internal services. I created a standard development VM to ensure developers had an environment consistent with reality. I automated packaging and rollout to testing servers. I explored options around platform-as-a-service products to look for fit. As part of this work, I built training materials and ran sessions to teach other developers how to think like a sysadmin, covering Linux, Puppet, virtualization, and other topics. ## Contact Me diff --git a/content/pyblock/_index.md b/content/pyblock/_index.md new file mode 100644 index 0000000..4dd5ad1 --- /dev/null +++ b/content/pyblock/_index.md @@ -0,0 +1,7 @@ +--- +title: PyBlock Hard Mode +--- + +A loosely-annotated playthrough of one of the most infamously difficult [Factorio] mods. + +[Factorio]: https://factorio.com diff --git a/content/pyblock/introduction.md b/content/pyblock/introduction.md new file mode 100644 index 0000000..c020c28 --- /dev/null +++ b/content/pyblock/introduction.md @@ -0,0 +1,110 @@ +--- +title: Introduction +date: 2026-01-01T13:57:41-05:00 +--- + +Welcome to PyBlock Hard Mode. + +<!--more--> + +## Background + +Factorio is a game of industrial colonialism. The player arrives in a pristine wilderness near profuse natural resources, with a minimum of equipment and no way to return, and is tasked with building their way up from stone furnaces and hand-gathered fuel to a spacecraft capable of returning them to their home. In the Space Age expansion, gameplay continues, with the player then tasked with colonizing and industrializing a series of other planets in the same solar system, before fleeing the solar system in a starship of their own construction. In the course of this endeavour, the player must also deal with the native flora and fauna, displacing or exterminating anything that gets in their way. + +The game has a goal (build a spaceship and go home), but it's an open secret that the game is "meant" to be played endlessly. The game provides a number of infinite goals to pursue, and pursuing those goals rather than completing the game leads to continuing work to expand the factory (or factories) and to solve new problems. That's fun in its own right. + +The game presents a highly-polished but also very simplified manufacturing process, whose key steps are + +* Resource extraction, using mines, water pumps, and pumpjacks to produce raw ores, water, and crude oil; +* Smelting, using furnaces to convert raw ores into basic materials like iron and copper; +* Manufacturing, using generic assembler buildings, plus a small collection of specialized buildings, to convert basic materials into more complex products; +* Research, using labs to convert the final products of manufacturing into further upgrades, new recipies, and other ways to expand the factory; +* Logistics, ranging from mechanical arms to conveyor belts to cars and trains to move goods from where they're made to where they're needed, +* Rocketry, using rocket silos and landing pads to send goods to orbit and retrieve the results; and, finally, +* Military, using finished goods to force native creatures ("biters") out of their territory so that the player can extract and exploit the resources they were obstructing. + +Even in a simplified form, a normal Factorio playthrough is expected to take tens of hours. Speedruns for the base game clock in at a bit over an hour, and for the expansion, at six to eight hours. It's not uncommon for players to take hundreds of hours if they play more slowly, or if they're working on a particularly large base. + +Progress through the game is marked both by research, mentioned above, and by qualitatively distinct gameplay phases where the player's capability to manipulate the world around them grows substantially. Initially, the player must make and place every item by hand, mining the raw resources themselves if necessary. Most players progress to automating _manufacturing_ of basic items like belts and assemblers, but then must walk to collect them and place them. The player's inventory and walking speed are then augmented with powered armour and with vehicles, before being rendered almost entirely irrelevant once the player sets up construction and logistics robots that can place things in the world _en masse_ from player-designed blueprints or by copying existing designs. By the end of the game it's very common for players to spend nearly all of their time in the map view, ignoring their character entirely in favour of directing automatic systems. + +## Pyanodons + +Pyanodons is a [collection of mods][pymods] to the game, intended to add complexity and _drastically_ slow the growth of the player's capabilities. Each mod replaces some set of manufacturing steps with a much larger process, often using more specialized buildings and generating byproducts that must be handled for production to continue. They also add entirely new production chains, dealing with things like alien life, that are structurally unlike anything in base Factorio. The mods can be used individually, but they're at their most interesting when used together. + +[pymods]: https://mods.factorio.com/user/pyanodon + +As an illustration, consider the basic transport belt, used in the thousands to move items around the player's factory. Assuming that the player has access to iron and copper ores, the process for producing conveyor belts in vanilla Factorio is: + +1. Smelt 3 iron ore to make 3 iron plates. This process happens in furnaces, and will either consume a small amount of fuel (usually coal, which is a raw resource to be mined), or, later in the game, electrical power. +2. Convert 2 iron plates into 1 iron gear wheel. This process happens in assemblers, or in the player's inventory; when done in an assembler, it takes a small amount of electricity. +3. Convert the remaining 1 iron plate and the 1 iron gear wheel into 2 tiles of transport belt. + +This process consumes very few resources and is easy to both memorize and implement. Automating belts is often one of the player's first automation projects once they've set up iron smelting. + +By comparison, the same process in Pyanodons is: + +1. Smelt 40 iron ore to make 5 iron plates. This process happens in a furnace, which will burn fuel and may produce fuel byproducts, such as ash. Electric smelting is an option, and is available much earlier than in vanilla, but it consumes dramatically more power and specialized buildings. +2. Convert 2 iron plates into 4 iron sticks. This process happens, initially, in a _burner_ assembler, which also consumes fuel and produces fuel byproducts. +3. Convert 4 iron sticks into 4 iron bolts. This is, again, done in a burner assembler, so that also requires fuel and byproduct removal. +4. Convert 2 iron plates into 2 iron gear wheels. This requires another burner assembler, with the associated infrastructure. +6. Smelt 16 copper ore to make 2 copper plates. As above, this either consumes fuel and produces fuel byproducts, or happens in expensive and specialized electric furnaces. +7. Convert 2 copper plates into 4 copper cables in a burner assembler. +8. Convert 3 iron bolts, 3 copper cables, and 1 iron gear wheel into 1 small parts in a burner assembler. This leaves 1 copper cable and 1 iron bolt unused, which can be either output as byproducts or buffered and reused. +9. Convert 1 small parts and 1 iron plate to 2 tiles of transport belt. + +Most obviously, this is a longer process with more steps. Many of those steps also require additional inputs (fuel, in this case) or generate additional outputs (frequently ash). These amounts are _low_ - assemblers can be reasonably hand-fed fuel early on, and ash removal doesn't need to be automated right away either - but they do need to be accounted for or the process will stop. It can also be done in the player's inventory, as with vanilla, in which case it requires no fuel and produces no byproducts, but the player themselves must deal with the excess bolts and cables somehow. Finally, the process consumes drastically more raw resources - 36 iron ore and 12 copper ore on average, to vanilla Factorio's 3 iron ore per belt. + +This is characteristic of Pyanodons approach to difficulty and is one of the simplest examples. The result is a _very_ slow gameplay pace. Where vanilla Factorio or Space Age is expected to take tens of hours on average, Pyanodons runs are expected to take around a thousand hours. Amenities that players rely on very early in Factorio, like conveyor belt splitters, are locked behind research and production chains with tens of steps. More capable logistics technologies, like trains, are similarly delayed. The mods use this to force the player to come up with alternatives to Factorio's most common design solutions. + +Unlike baseline Factorio, Pyanodons acknowledges that the real goal is to grow the factory: its victory condition is not escape, but rather the completion of the "Pyrrhic Victory" research target, at the far end of its sprawling research system. The player's character never notionally escapes; the factory is where they'll live forever. + +While Pyanodons ultimately amplifies the game's industrial excesses, it often tones down the colonial excesses. The mod pack was not designed with biters in mind, and early ammunition production is a major tax on iron-related industry. The documentation recommends turning biters off (and pollution, since it primarily serves to drive biter-related game loops and is fairly CPU-intensive for large bases). PyBlock, described below, doesn't generate biter nests by default either. + +## PyBlock + +Pyanodons is not the only increased-difficulty mod collection. An earlier set of mods, collectively known as [Angels] and [Bobs], implemented a similar set of ideas, though at a less-extreme difficulty and complexity. Players rapidly observed that Angels and Bobs allowed players to produce infinite resources (very slowly) using only water and air as inputs, which lead to the creation of the [Sea Block] mod, formalizing this idea by starting the player in an infinite ocean without any normal resources to find and challenging them to complete the game from there. (The name comes from a Minecraft mod with [a similar premise][skyblock]). + +[Angels]: https://mods.factorio.com/user/arch666angel +[Bobs]: https://mods.factorio.com/user/bobingabout +[Sea Block]: https://mods.factorio.com/mod/SeaBlock +[skyblock]: https://skyblock.net + +PyBlock takes the same observation and applies it to Pyanodons, instead of Angels and Bobs. The player is dropped into an open ocean or on a lonely and resource-minimal island with a small collection of starting resources, and challenged to complete the same Pyrrhic Victory research. PyBlock is considered extremely hard even within Pyanodons' own community. To the best of the game's Discord community's knowledge, a single-digit number of people have ever fully completed it as of this writing. + +PyBlock patches over some things that a normal Pyanodons run would require that are impossible to bootstrap without ores. For example, PyBlock adds early-game burner versions of several key buildings, including soil extractors and destructive distillation columns, that run slowly and inefficiently off of fuel or steam power rather than requiring electrical power, so that the player can make the resources to _set up_ their initial electrical network without having to have one already established. However, those affordances are invariably small and awkward to work with, and make difficult tradeoffs in return for being available early on. + +## Hard Mode + +[Pyanodons Hard Mode][hard mode] is an optional additional mod to Pyanodons, usable in PyBlock, which makes it much harder for the player to automatically destroy unwanted fluids and gasses. _Many_ processes in Pyanodons produce these as byproducts: for example, washing soil to produce sand or stone also produces muddy water as a byproduct. In normal Pyanodons, you can route unused muddy water into a sinkhole to get rid of it. In Hard Mode, you can't - it has to be processed somehow. + +[hard mode]: https://mods.factorio.com/mod/pyhardmode + +To compensate for this, the mod adds a number of additional processes that take common fluid byproducts as inputs and _do something_ to them. The Hard Mode process for dealing with muddy water, for example, recovers some water and soil from it, though not in the ideal ratio for further washing. The excess water can then either be reused or thrown into a sinkhole freely, while the soil can be routed back into the soil-washing process' input to be processed again. + +Hard mode also makes several changes to container sizes, logistics, power generation, and resource processing, all with the aim of making the already-quite-difficult Pyanodons mods even more challenging. + +## Goals + +I'm not personally aware of anyone completing a Pyblock Hard Mode run. I'm not at all convinced _I'm_ going to complete the game this way - and that's not my goal. Instead, I want a project I can tinker with when I'm bored, and which will motivate me to write more. I also want to climb this particular virtual mountain more or less "because it's there." + +I will be journalling a Pyblock Hard Mode run more or less whenever the whim takes me. I'm going to do my best to document the most important steps and observations along the way. This won't be a guide or a spoiler, but the lessons I learn about the game will be documented as clearly as I can in the hopes of helping others through the mod, and I won't be marking spoilers. + +I'll be playing with a few optional "quality of life" mods to take the edge off the parts of Py Hard Mode that I find the least interesting. The key ones are: + +* [Enable all Feature Flags](https://mods.factorio.com/mod/enable-all-feature-flags), specifically so that I can use the game's spoilage mechanic. Pyanodons adds several "interesting" spoilable resources, including most radioactive compounds (clever!) and the native flora needed to build the first science packs. +* [AAI Loaders](https://mods.factorio.com/mod/aai-loaders), which is a recommended optional addon to Pyanodons Hard Mode. A "loader" is a building that allows a belt to be fed directly into a building, rather than having items moved individually between belts and buildings by inserters. The Py Hard Mode mod description notes that it "adds loaders, but at what cost" and I'm excited to find out about that. +* [Inserter Configuration](https://mods.factorio.com/mod/Inserter_Config), which allows bent inserters and controlling where an inserter drops its outputs. This also allows inserters to run at noticably higher throughput if they're not rotating through a full 180°, though the game's inserter throughput limits will still be a significant factor. +* [Recipe Book](https://mods.factorio.com/mod/RecipeBook), which provides a more comprehensive and more configurable view of the multitude of recipes and processes than the built-in Factoriopedia feature allows. +* [Updated Construction Drones - Forked](https://mods.factorio.com/mod/Construction_Drones_Forked), which adds a small number of construction robots to the player's starting inventory. These robots, unlike vanilla construction drones, are restricted to the ground, and must be able to find an open path to their destination. I'm long past the point where placing every last item by hand is interesting, so this will take the edge off of early construction, and they'll also make moving and removing foundation easier. I can't make more bots until I can make simple circuits, and I don't intend to make more then, either. +* [Even Distribution](https://mods.factorio.com/mod/even-distribution), to make hand-feeding buildings in the early game less tedious. +* [Factory Planner](https://mods.factorio.com/mod/factoryplanner), to sketch out production chains before building them. However, based on past experiences I probably won't be relying on this that heavily, as it tends to bait me into over-building my infrastructure and requires a lot of babysitting to make sure it understands how Pyanodons' alien life recipes work. +* [Rate Calculator](https://mods.factorio.com/mod/RateCalculator), because doing arithmetic to work out the throughput of a block of buildings is a bad use of my time. +* The built-in Elevated Rails mod. + +I may add or remove mods as I go. + +I'll be using the Pyblock Classic start, which places the player on a single tile of foundation. There's no starting island, and there are no ore patches to harvest. Any resources I will need will either need to come from the seawater, be gathered out of the air, or collected from the litter floating on the ocean's surface. + +I'll be preserving the crashed ship from the game start. Even the most grotesque industrial excesses needs a human touch somewhere. + +Wish me luck. |
