Nice points ...! But being a Libran I would definitely like to “argue” on these J…
Regarding #1: let’s start with A&D: I had the opportunity to frame the architecture of a HR product. I started out with typical MVC FC arch., just laying the component interactions and abstractions in a very granular scale. If I define the interface, it may be possible that architecture becomes “design dependent”. I leave such implementation issues to design guys (or design stage later on). Advantages (from personal experience) of such cleaner separation:
(i) System is not “tied” to particular implementations or core classes (or interfaces)
(ii) The designer is able to “think” and design the system to suit a particular programming paradigm
(iii) There is no overall confusion: many vendors still sell SOA as an architectural design product which is completely wrong!
So when we talk of architecture, including design components in it can create some sort of wrong mindset among people which might make it difficult for them to adopt pure architectural paradigms such as SOA. I still have developers asking me about some examples where they can see “SOA implementation” (its hard for them to understand that we can have SOA based design without web services or XML at all!).
I agree with you that we generally tend to blur the boundary b/w Arch and Design. But what I think is that since this handbook is to make sure BR follows industry standards and becomes efficient and professional across projects, and the fact that this handbook would be referred by many people who might not have the experience of the level of the TSG group, this means that we don’t have many experts here who can differentiate between these 2 terms clearly and use them wisely. So I just wanted things to be laid down in a more “stricter” way.
Regarding #2: I here do not agree with you. As an example: I was involved in a not-so-big product for a Rotary international, and we decided to have 2 layers only: GUI and BL+DAL. The business logic wasn’t very complex and creating a separate layer for just BL would have been on overkill and added to reduced performance. People tend to create a “new project/assembly” and treat it as a layer. This is wrong. If we know that a system is never going to be distributed then why add such an overhead? To separate the logic from the data access, one can create simple classes by different names (instead of creating new projects) or also use data access in the same class using some separator (like #region). I have seen some projects which have 3 assemblies for 3 layers and each class contains only 15-20 lines of code which created more confusion as number of classes swelled considering the small scope of the entire project. Also, Rockford Lhotka has used Data access code in its business logic classes in CSLA.NET framework, which is being in use across very big projects!
We need to re-think on the concept of abstraction from scratch instead of just following a 3 layered strategy for every project. We need to think from an average developer’s perspective: he/she should not use 3 layers just to follow the thumb rule, but should use his mind and think out of the box too.
Finally, I may be wrong in my arguments, but that’s what the TSG is for J :to share, discuss and improvise!
Thanks
Vivek