How to distinguish between tools and raw materials, and more importantly, why
chir.ag
chir.ag
Success is best explained by product x market. So you can have great novels that languish, and massive movies that are rubbish.
The idea of "what can be easily changed" is significant, and is the basis of Parnas' influential paper on information hiding: you hide the decisions that are likely to change, so when they are changed, their impact is isolated from the rest of the system. Decisions that are expected to change together are grouped together in modules: http://www.cs.umd.edu/class/spring2003/cmsc838p/Design/crite... This is perhaps the most influential comp sci paper, and it's an interesting read; no maths IIRC, and pretty straightforward.
I think "raw materials vs. tools" is not as helpful as "what can be easily changed", because the materials/tools distinction can always be made arbitrary. eg: compiler vs. interpreter for the same language. One is a "tool", the other "raw material". A difference in performance (usually); but equal difficulty in changing them (you have to rewrite your code.)
A related question is: once you have modules, with fixed interfaces between them, what if you got it wrong (different decisions need to change) and you have to change the interfaces and modules? Because "what you think will change" is a prediction. It's a hunch, or if you like, guessing. Your hunches improve with experience, both in a specific domain, and in general; but you will always be guessing. Or you should be; because if you know the answer, you should have automated it, bought/reused a tool that automates it, or made a tool that automates it and started selling it/giving it away.
As I said: great questions. For learning, they really are more important than great answers.
The module paper looks brilliant, partly why I love compsci - in 1970s they were writing about what I am slowly learning now. Thanks for the wonderful feedback.
I think the most difficult decisions to make in a project is what to make reversible and what to make easily changable. Abstraction often carries a cost, performance wise or otherwise.