I made a chess engine as an independent study, for my last semester. It had some pretty big problems:
- Instead of storing information about the moves at a given state, the move generator stored the entire board for every move. This meant that the move generator copied the entire board for every move it generated (very costly).
- It was written in objective-c, and instead of using native c function calls, I decided to almost exclusively use message calls. Therefore, every call had a dynamic lookup overhead associated with it.
- There was no quiescence search, so the engine would see blunders as strong moves.
- The evaluation was strictly based on material, so it didn't have any positional understanding.
Apart from all of these issues, I think I learned a lot from the project, especially on what you should and shouldn't do when writing a chess engine.