I'm interested in writing a chess engine. So far, I've got a working move generator, verified by comparing perfts of many positions with Stockfish. This part of chess programming I found analytical, black-and-white (pun). As long as you are able to find all your mistakes in calculating legal moves, you eventually "got it right".
From here, I find many of the concepts in much more of a gray area. Techniques exist in search and evaluation, but there isn't "the one right way", and everyone does it differently. It's hard looking at chess engine implementations, even didactic ones, because techniques are interwoven and if one doesn't understand the technique, reviewing implementations isn't very useful. I'm unsure how to proceed and in what order. Any general guidance would be appreciated.
In general, I've found a basket of techniques that all have to be woven together to get something working:
- negamax
- iterative deepending
- alpha/beta pruning
- zobrist hashing
- transposition trables
- aspiration windows
- principal variation search
- quiescence search
- null move
- static exchange evaluation
- mvv-lva move ordering
- killer moves
- piece/square evaluation
- mobility
- various piece patterns for evaluation, double-bishop, etc.
- so many more ...
Can this list be ordered in a way so that I can iteratively understand/implement the techniques and get an engine that improves with each technique? Do I have anything that is in the above list that shouldn't be in a beginner's list, or isn't in the list that should?
Is there some sort of a road map that can be put together to learn this stuff one-by-one, each building on the last?