Both are needed. However, direct manipulation should be used way more than it currently is. Whenever I look at UI Designs from other designers, I am struck by the plethora of indirect manipulation cases. Here is an example to clarify.
Case: You have a table of data (columns and rows) and you want to reorder the columns. The designer makes a button called “Edit Columns” where you can add/remove/order the visible columns. You are editing a UI that doesn’t look like a table to manipulate the table. This is indirect manipulation.
A better choice is to allow drag-drop of the columns and add a “last column” where you can type in the field you want. Also, you could click on the header to change the field to something else. This is direct manipulation. It requires more sophisticated programming, but that is the price for a better interface.
The reason it’s better is because it maintains the mental model of the UI. This is a simplistic example, but every product has areas you can change things (Admin area!) and it makes a change on some other distant area of the application. It makes it harder to understand the consequences of your action. It also makes it harder to understand where to change the behavior of the screen you are looking at.
In the physical world the same thing happens. In Flint Michigan, the city supervisors changed their water policy to save money. It also had the effect of poisoning it’s citizens with lead and other toxins. They didn’t mean to poison people. Imagine if someone said to them, “If you ADD LEAD to the water and poison people, we will pay you a few million bucks.” I doubt if the powers that be would agree to that deal. However, they did exactly that. They just didn’t realize it.
Direct manipulation forces you to see the results of your actions. Indirect manipulation hides that connection. I’m not saying you should use direct manipulation everywhere. I am just saying it should be your first choice, not your last.