Chess Analysis Engine as an exercise in Software Architecture and Review (CAESAR)
A pet project that aims to build a chess engine with a focus on software architecture and best practices.
A chess engine is a computer program that analyses chess positions and makes decisions on the best chess moves. We will be constructing a chess engine in C#. Our focus will be on problems related to the software architecture and design principles, such as SOLID principles and general coding best practices, actually adhereing to these, while building an engine that plays chess really well.
In addition to the source code, we'll also produce a set of written articles covering the general concepts and patterns, the rationale behind design choices, and a few other things to help everyone.
I intend this to be an interactive act of discovery.
So, we're attempting to create a chess engine with software best practices in mind - simple, no?
Chess engines are almost always written way too optimized for "anyone" to just "have a peek under the hood" and dive in with contributions. Since it's a highly competitive area, the source code of most highly rated chess engines are close to unreadable without comments or prior knowledge. I have come across beautiful tutorials with general guidelines and also step-by-step instructions on how to create a chess engine from scratch. But none of them hold on to software architecture design patterns or plain simple coding best practices. Also, a chess engine is a fairly challenging piece of software to write, as it invariably will need a lot of tuning and testing and generally has a really long software lifecycle (meaning we can keep updating it for years together and there will still be value to add).
TLDR: A chess engine is complicated, fun to code, and can serve as an example of software development in every possible area.
My approach is to embark on a collaborative journey into understanding the mechanics and challenges surrounding the development of a chess engine, which is also a structurally, functionally and architecturally sound piece of software. My purpose is not to tell you all the answers that you'll need, but rather to help you ask the right questions.
The goal is to create a cross-platform console application that runs on DNX. Naturally we will be breaking down the functionality into libraries (that are also cross-platform).
More granular details on what we will accomplishing on a time-frame basis will be updated in the journal localted in the docs folder of the repository.
The intended audience for this guidance/project is any developer, senior developer or architect interested in developing a software solution which focuses on best practices. I hope that all developers, regardless of their preferred development stack, can benefit from the written guidance.
If you feel that there is anything more that we can do to make this accessible to a broader audience, you are encouraged to share.
You can communicate via email to Sudarsan.Balaji@outlook.com or even open issues at this repo, if something doesn't make sense or we have other troubles to be looked into.
I am very interested in your feedback. I encourage you to open issues on this repo. Any and all feedback is welcome.