Extensions
Below are suggested extensions. They vary in difficulty.
There are many other possible extensions to Game of Life. If you'd like to implement something that isn't an option below you're welcome to do so, but please speak to a lecturer first.
Halo Exchange

Recall that to process an iteration of Game of Life, each worker needs two extra rows (or columns). These are known as the halo regions. They need to be updated with data from neighbouring workers to process each iteration correctly.
The easiest solution is to have all workers resync with a central distributor node on every iteration. This introduces a heavy communication overhead (which you might be able to measure).
Implement a Halo Exchange scheme, where workers communicate the halo regions directly to each other. Analyse the performance of your new solution and compare it with your previous implementation.
Parallel Distributed System

Add parallel workers within each distributed AWS Node.
Analyse the performance of your new solution and compare it with your previous implementation. Use various provided PGM images and analyse the effect on performance in context of the image size.
SDL Live View of Distributed Implementation
Instead of showing a blank SDL window in your local controller, add support for a Live View, in a similar way to the parallel implementation. Try to keep your implementation as efficient as possible.
Analyse the performance of your new solution and compare it with your previous implementation. Quantify and explain the overhead (if any) added by the Live View.
Fault Tolerance
Add fault tolerance to your Distributed Implementation.
In your report, explain the design of your fault tolerance mechanism. Conduct experiments to verify the effectiveness of your fault tolerance approach.
Memory Sharing
Redesign your parallel implementation to use pure memory sharing. Replace all channels with traditional synchronisation mechanisms (mutexes, sempahores, condition variables).
We recommend first replacing any channels used between the workers and the distributor.
Then remove channels linking the distributor with the IO and with SDL.
You should still keep them as seperate goroutines. Your solution must be free of deadlocks and race conditions.
Analyse the performance of your new solution and compare it with your previous implementation. Explain any differences observed.
Secure and Fault-Tolerant Replicated Broker
Explore how distributed systems remain secure and dependable during failure by replacing the single Game of Life broker with a replicated Raft broker. Implement leader election, failover, authenticated membership, protected control messages and checkpoint validation, then evaluate consistency, recovery, security and performance under controlled failure and attack scenarios on AWS nodes. Details are available here.
Secure CI/CD and Software Supply-Chain Assurance
Explore how secure engineering practices protect the software delivery process by creating a CI/CD pipeline for the Game of Life implementation. Integrate automated testing, static analysis, dependency and secret scanning, provenance, software bills of materials and signed releases, then evaluate enforcement decisions, workflow usability, execution cost and residual supply-chain risks. Details are available here.