When I started programming MTG Forge I didn't program planeswalkers, vigilance, or exalted. I started out with plain, vanilla creatures and then added flying and haste later. MTG Forge "evolved" one step at a time. I didn't know how everything was going to fit together but I wrote good code and didn't worry about the future.
My first big challenged was Glorious Anthem, a staple of white weenie decks. I had no idea how I was going to program it. Anthem is a great card and I wanted my version of Magic to have it. MTG Forge already implemented a simple "check state effects" that moved creatures to the graveyard and I experimented by creating Anthem in that code. It may not be the best way to code it but it worked and I was very happy.
MTG Forge didn't start out supporting flashback but since MTG Forge has a flexible architecture, flashback wasn't too hard to add. MTG Forge easily allows spells and abilities to be played in any zone. Cycling is another ability that works only when the card is in your hand. (Each spell or ability has a canPlay() method which returns true if the spell or ability can be played in the particular zone that it is in.)
Giant Growth and end of turn effects is another good example where I had to experiment a little bit to see what things worked and what didn't. (Giant Growth uses the Command Pattern and executes "at the end of turn" to return the creature to normal.)
The goal of any good computer program is to start with a good architecture (foundation) and then build on it. I think that programming is similar building a house of cards, you have to be extremely careful or everything will fall down and crash the computer. MTG Forge does have its share of bugs and crashes but hopefully they aren't too annoying.