The most simple form of engine look like this: Interface - Board - Overall manager - Tactical subroutines
For any go engine, interfaces subroutines are necessary. User interface can be either text base or GUI base, and for compatibility to communicate with other programs, something like go text protocol (GoTextProtocol) is required.
A part of the engine need to keep track of the stone pieces, remove the dead stones, and check for the rules.
To decide on a meaningful move, some codes are required. This is the part that decide which tectical subroutine to use, and make the final decision on moves.
These are the subroutines to solve more detail problems. The most basic ones are:
1. Big scale move decider - take the empty spot on the board, first corner, then side, finally the middle.
2. Boundary blocker - seal boundaries safely to form territories
3. Small scale killing solver - solving for AtariAtari problem and maybe further more utilize Net to trap oppoenent stones.
4. Life and death solver - to make eyes and to take away eyes
These are the most basic functions required to at least have a program that "appears" to play go. Only appears, because it is going to be very weak, but at least the program will look like it is trying.