Over the past years or so I has the chance to speak with some developers from many different areas and countries. After all those talks and some introspection I came with the conclusion that programming usually involves 6 aspects to varying degrees. These aspects are in no particular order: Technologies: This relates to what technologies you use at your job. Some jobs require that you know in depth because most of them have their quirks and pitfalls. Or maybe they are hard to to learn or use in general. Usually I would include here stuff like programming languages, database types, various ORMs, IDEs, frameworks and prebuilt libraries to make your life easier. This doesn't really involve a lot of creativity and thinking but rather knowledge. You don't really need an innate ability and talent for these things. Just curiosity. Architecture/Software design: This is related more to object oriented programming and how you structure your code into various modules and components....