I am currently writing a chess engine in C++, and thought I should share some ideas, and ask for some guidance from those chess programming gurus like Robert Hyatt, Tord Romstad, Marco Costalba, Robert Houdart, and surely many others I don't know or forgot to mention.
At the moment it doesn't even play a game of chess, but here's what I have done:
Generally I coded everything from scratch, as I believe in self teaching by trial and error, rather than copying ready made solutions.
1/ Bitboards:
* I used my own implementation of rotated bitboards, adapted from my old code (BibiChess 0.5), just cleaned up a little.
* For bit looping and counting, I used the nice bit-tricks from StockFish.
* Nowadays people use magic bitboards, but since I don't understand them, I am not going to copy some code that I don't understand (imagine debugging it, lol). I might do it in the future, once I get down to understanding how it works.
2/ Board:
* Writing a bug-free and efficient Board class, and move generators, was quite a long and painful process. But using defensive programming techniques, as I learnt from reading SF for guidance, paid off (lots of assert, use encapsulation and limit side effects)
* my move generators generate directly legal moves, never pseudo-legal ones. It was somewhat simpler, and not very costly, although everyone else uses pseudo legal moves, since beta-cutoffs avoid checking legality of moves never searched.
3/ MoveSort:
* following the idea of the MovePicker class in SF, I did a MoveSort class. Much simpler, it allows reading moves in descending sort score in a nice encapsulated way.
* my sort works as follows: TT move first (if available), good captures (by descending SEE), non-captures (by History scores), bad captures.
* the problem I see is that many SEE!=0 moves have the same SEE, and they don't get sorted. For example if 5 moves score SEE=1 Pawn, then they are just sorted as they come from the move generator. Is there any simple way to improve this ?
* Also, I saw in SF that winning captures are sorted by MVV/LVA. It didn't seem that good in my test, so I stayed with my general SEE sorting.
4/ History
* I used the same history scoring as SF: add d*d when good and substract d*d when bad, scale down the history scores when we exceed a threshold. The impact of history scores in the move ordering are not increasing the search speed as I naively imagined they would.
* But if everyone else does it, it can't be bad, and must payoff in the long run (like in late move reductions, or history pruning)
5/ Quiescent Search
* moves considered: captures only, or evasions if in check.
* SEE pruning: don't search moves with < 0 SEE. First I wanted to exclude checking moves from this condition, but I realised that (in general) it didn't make much sense (since the checking piece is going to be captured anyway, although it can miss some forced mated in rare cases such as 1. f4 e5 2. fxe5 d6 3. exd6 Bxd6 4. Nc3? Qh4+ etc.)
* transposition table
6/ Search
* alpha-beta + PVS: At PV node, only the first move is search with full window, otherwise a zero window is tried first (if fails high, then re-search full window).
* transposition table
* razoring, at depth <= 3. I was quite sceptical about it, but it prunes a lot more than I thought, so for whatever it may miss the overall gain is probably significant.
* IID: when no TTable move available, and deph is big enough. Search depth/2 for a good move to start with. Use different min depth for PV and non PV nodes, following the idea of SF.
* For now I don't use: null move pruning, history pruning or late move reduction, futility pruning, aspiration, and surely many other tricks. I just want to make sure the little I have works robustly and harmoniously, before I start breaking it

7/ Eval
* I litteraly have no eval t the moment. The last thing I'm interested in. Only when the search is efficient and stable will I start doing one (if the former ever happens...)
* Using piece on square table material score only.
* I'm just wondering: what's the simplest way to make an eval that would be ok-ish ? I'm considering psq tables + mobility only, following the minimalistic approach of the earlier versions of Fruit.
* Generally, I'd much rather solve problems by search improvements than spending time doing speculative eval code to compensate the weakness of the search. Which is why I force myself not to write an eval for now.
Of course, what you take from the free software community, you must give it back. It's only fair. So if ever I make something decent and useable, it will be released under GNU GPL.