Here is a link to the code I've uploaded on Github so I can get feedback, particularly on the search and evaluation phases, although of course advice is welcome applying to anywhere. The repo does include a working binary ready to respond to the UCI protocol, but it's for Linux machines, so apologies in advance if this is an issue.
Currently, my engine implements the following features (hopefully correctly):
- Negamax
- Alpha-beta pruning
- A transposition table
- Iterative deepening
- Move ordering
- Quiescence search
- A very basic opening book, created myself using the Polyglot tool and a couple thousand grandmaster games.
Now, here are my questions, which have to do with the next steps I'll be taking:
(1) Currently my engine can usually pretty comfortable search to a depth of 8, not including quiescence search, and a depth of around 11-12 including quiescence search. What should my next steps be to be able to search to much higher depths? Ideally, I'd like to be getting into the 20s at least, but I have no clue how to do that currently, and if I tried that with my current code, we would be here till the end of time. What optimizations do I need to look into using to get from a depth of 8 to a depth of 20+? Making such a jump right now seems nigh impossible to me.
(2) Although I'm not sure what the ELO of my engine is, I estimate it's around ~1400, so not really strong at all. I've gotten this estimate from downloading engines listed around 1600 and having them play against Blunder, and in all of the games I ran, Blunder lost. It wasn't necessarily a massacre I'd say, but Blunder was definitely at a disadvantage during the games. However, from testing against bots online at lichess, bots apparently ranked around ~1400, Blunder repeatedly beats them. So I'm honestly not sure. If anyone could point to any solid engines around this rating, I could use those to try to pinpoint the ELO. I also imagine that I could gain quite a bit of ELO by figuring out how to search deeper, so I suppose these two questions are connected.
(3) In addition to the search phase, are any tips you'd recommend for my evaluation phase? My philosophy when designing Blunder's evaluation was basically to keep evaluation light and use that fact to search very deeply. But of course, this leads back to question (1)
I would also like to add that before I turned to algorithmic speed improvements, per the advice of one of the folks here, I started from scratch with just Negamax and alpha-beta pruning, turned on my profiler, and spent a day or two optimizing the code. So that step has been done, hopefully well enough.
Again, any feedback on the code is welcome!

