Complex vs. Complicated
In software, everyone is talking about things that are either complex or complicated. What is the difference? In my mind the difference is fairly straight forward: Complex is something that you do not understand fully and Complicated is something that needs to be redesigned.
If you have a system that is either already complicated or is becoming complicated then it is a clear indication that you either need to do some refactoring or some redesigning. Similarly, if you trying to code something that seems to complex, then it is probably an indication that you do not fully understand what it is you are trying to do.
I do realize that there are complex things that we ask computers to do. Calculating the tragetory that the next space probe needs to take in order to crash land on a meteor travelling several billion kilometres per minute is not an easy thing to do. However, if you understand the problem and can break it down into smaller steps, and break those steps down, then you are able to take something that is complex and make it into a series of simple problems. (Granted, I have not actually done this, but I am sure it is possible.)
Whenever I am trying to solve a problem I use this little rule of thumb: if my solution seems to be getting more complicated and more complex then I am on the wrong track. Whereas if my solution is simple and understandable, then I am probably doing things right.