I've often heard that those things cannot be taught, because you can master them only through good gut feeling fed with years of experience. However various patterns and principles are quite well documented and I start to think, that you can actually learn quite a lot of good stuff from books, training and exercises. What is your take? Please discuss.
There are classes at many schools for software engineering covering design patterns and such things. Yes I do think that it is a good thing to learn for software developers.
Experience trumps all for software development though, no amount of theory and learning can make up for lack of experience.
Overall a good mix is important and best.
Design, architecture and modeling are more often than not domains of software engineering/software development as opposed to (pure) computer science.
If you're gearing your students towards software engineering, then this is reasonable, otherwise, it may not be as useful.
A definitive YES.
However how deep you go into the details and techniques depends on the intended use of programming of the audience. Someone basically making quick scripts to help alleviate the repetitiveness of a task does not need as much knowledge as a software architect of a large distributed system.
Both profiles will greatly benefit from learning proper and clean ways to do things. It is all tied together, In my opinion Design and code are part of a whole and must be taught as such.
Q: How do I make sure my program works ?
A: by testing
Q: How do I test ?
A: (teach about unit testing, mocking etc)
Q: Yeah but that is a lot of work, how do I make it easier ?
A: Well you can reduce coupling, isolate better the different parts, reuse code that you have written already...
Too often teachers of programming will stop at the actual language itself, never enter such discussion and that is a shame. Enumerating the tools is not enough to know what to do with them, using the tools is not enough either, you must be also thought proper techniques to use them efficiently.
I think these are critical things to learn, I've seen far too many applications that clearly have no design but ar ejust a bunch of hacks thrown together. And don't get me started on the serious lack of database design that is crippling most of the COTS (Commercial-Off-The-Shelf) software that it has been my displeasure to support. However, I think we often try to teach them too soon when the understanding isn't there. When I taught, evry database programming books began with database design and none of the students were ready for at that point. You need to understand how to query a database and how to build a basic program and start learning the advanced stuff before the reason why you need to design correctly becomes apparent and then they are ready to learn design. After all design is not that critical to getting "hello World" to work, but try to get the space shuttle software to work without it.
Firstly it's not a binary yes/no issue: theory vs experience; I haven't had any 'formal' training at a university; but I have occasionally benefitted from small doses of 'formal' training in small doses: from colleagues, the odd small course, etc. The shport answer is yes they should be taught - but no one should be under the illusion that you only need to do one or they other.
To an extent it depends on who you are - different people learn in different ways; whilst this is often personal there can also be cultural influences (some cultures place relatively more value in academic achievement than others).
For myself, I've learnt on the job, and that includes working with some very experienced peers / mentors. I learn better and faster by actually doing something, making mistakes and correcting my course. The caveat is that you need some mechanism for ensuring your on the right course - for me this was mainly the more experienced people I was working with.
Modeling (for example) is a skill like most others - some people will take to it more naturally that others; and in most cases the more you do it the better you'll become.
An issue I think is relevant to this is the increasing complexity and maturity of the IT architecure related field.
The range and depth of the IT field is ever increasing - there's more to learn, new areas of specialization are emerging. Architecture, design and modeling are IMHO becoming more relevant, and as such they should be "taught" at least to some degree - but like most things formal theory based teaching isn't going to be enough on it's own.
Architecture and Design is benefitting from a popular rise in the use of design patterns, which is making 'formal' design more mainstream (or at least more visible). I think that as disiplines they are much more well understood now than say 10 (?) years ago. On this basis I would say to not teach them would be to omit an important building block in one's knowledge: be it formally or via experience.