I made my first chess engine in high school (if you want it, it's right here). I wrote it in Borland Pascal (my first real language). It didn't do en passant, usually messed up the castling rights, and sometimes forgot which side it was suppose to find the best move for. At the time, though, it was pretty impressive. I'm still happy with its GUI and, if not for xboard, I probably would port that portion to KACE. Note: if you get it to run, type "computer" as the name to tell it which side to play.
KACE, in her first incarnation, came a couple of years later (1998 maybe?). The pretext was that I would pit KACE against BCE, an engine that my friend, Chris Bowron, wrote. The truth is, though, Chess Engining (Ha! I coined a new term!) makes a great hobby for a programmer.
KACE the 1st was built around a linked list board structure, which I still think has some untapped potential. The basic idea was that time could be saved by only looking at squares which contained pieces. This concept has some merit, but my implementation didn't pan out. Any time that was save in the end-game was long since used up in the mid-game. Had I used an opening book or augmented the list with another structure, it would have worked better. I decided instead, however, to start from scratch.
The current (and probably the last) version of KACE uses a basic iterative deepening alpha-beta search with transpositional cutoffs and move ordering based on a history heuristic. I've implemented MTD(f), but it's currently turned off since it's making 40-50+ passes, instead of the 5-15 that it is suppose to. Grrr...