Sometimes in programming, a very minor thing can become a major obstacle. For example, if you design a binary file format, and you forget to add a magic cookie to identify the format, changing the format can become a major hassle: how does an old program recognize the new format? This is happening to lzma right now.
Another thing, which took me years to learn, is that you don't use single-letter options in command line parsing early in a program's life. They are a scarce resource, and if you allocate one for every new option, you will run out of them. At the very least, you will run out of the obvious ones for options that people will actually use a lot.
It often takes a lot of time to learn these things from one's own experience, if only because there's so many of them. Someone should make a list of them.