I would like to thank you all for the contributions that you have provided my answer. I would like to know what sort of architecture can i use for delivering a business system to different clients. For example I might have, say a accounting system that i would like provide to different clients, which employees cloud computing concepts. I would really like to know what is the best architecture i can use for multi-company architecture systems.
For example I might have, say a accounting system that i would like provide to different clients, which employees cloud computing concepts. I would really like to know what is the best architecture i can use for multi-company architecture systems.
Not an architecture, but a design-pattern. It's called a strategy-pattern. You'd create an abstract base class, define abstract methods for insert, update, open and close-statements. Then you'd encapsulate the first strategy into a class called "LocalMysl" and another for "Azure", and derive both from your base-class. Use a factory-pattern to instantiate the correct strategy on your behalf, similar to below
MyBaseClass data = MyDataStrategy.Create("Azure"); // returns "LocalMysl" or "Azure" object
Bastard Programmer from Hell
If you can't read my code, try converting it here[^]
I am interested in knowing how you design your Domain Model and its persistance layer.
Particularly I design the Domain Model completely independent from any other logical application layer. As a matter of fact, it is oblivious of any other logical layer.
In that case I do create a service layer that acts as a proxy and sends domain model objects to the persistence layer.
I've seen Dependency Injection/IoC to perform the persistence, having the interface defined in the Domain Model, but I never really liked this approach, because it creates a small dependence of interface implementation by the persistence layer.
Do you have "Save" methods on your Domain Objects?
I'd appreciate if you shared your thoughts.
To alcohol! The cause of, and solution to, all of life's problems - Homer Simpson
---- Our heads are round so our thoughts can change direction - Francis Picabia
If you are using relational database system like MySQL, Oracle, consider using an Object-Relational Mapping framework(ORM) that implements Data Acess Layer(DAL) design pattern . TopLink, Hibernate, ADO.Net, Java JPA, just to name a few, are popular ORM Frameworks. These frameworks abstract DBMS access and handle all database CRUD for you, and do much more. For example using Java JPA, you would save a domain object as follow:
em.persist(BookDTO);// BookDTO is the object to be saved in you database. BookDTO must be annotated as an Entity( @Entity) as far as JPA is concern. You can apply Dependency Injection/IoC to inject the EntityManager in your component.
To use DAL patern organize your Domain Model into Business Object(BO) and Data Transfer Object(DTO), and utilize an ORM framework of your choice.
At work I have created a homebrew framework ColdBlood with various object oriented design features; one is persistency.
In the specification (interface) of each object type we differ between properties, references, child and children. We do this using different attributes (in C#). A property can have the optional flag Persistent enabled, which means this property is serializable.
All the specification attributes are compiled into some info classes for fast lookup e.g. by the serializer/deserializer.
This design means a complete separation of persistency specification and serializer/deserializer implementation.
Currently, we use a serializer/deserializer implementation with multiple ToBytes and FromBytes methods. The resulting byte data can be transfered to/from files or sockets.
I have a begginers design issue.
I'm building an layered application(Presentation layer, Business logic layer and Data base layer).
I have three entities in my application:customer,staff member and vendor that all of them deriving from person.
The user can add new customer,staff member or vendor to the data base(using UI).
My question is which layer is responsible for the next tasks:
1.Validating user data
2.Saving customer,staff member,vendor in to the DB.
3.Retrieving customer,staff member,vendor from the DB.
4.Perform other DB related manipulation with customer,staff member,vendor.
5.Which classes i need to define to perform the above tasks.
I'm new in to object oriented programming so thru the current question i am trying to understand the concept.
Twenty years from now you will be more disappointed by the things that you didn't do than by the ones you did do. So throw off the bowlines. Sail away from the safe harbor. Catch the trade winds in your sails. Explore, Dream. Discover.
What are peoples' experiences with software design like?
I'm a firm advocate of the 6 P's: Proper Planning Prevents Piss Poor Performance, which to me means having a clear idea of what you want to achieve, and the necessary oversight to be able to make informed decisions.
For this purpose I find UML incredibly useful. Component or package diagrams help me determine my solution structure, decoupling of components, separation of concerns, reusability etc and completely prevent circular references.
Before I touch VS to set the solution up I make sure I've got this down, even if it's only a couple of projects and a test project. It's like I documented it before I even started.
I'm a bit baffled by some of my colleagues who expend a lot of unnecessary time and effort trying to keep their 100+ project solution in some sort of check without some sort of visualised overview. Just trying to add a single interface requires a three hour discussion involving everyone (6 developers, 18 person-hours, almost half a person-week) from two teams whereupon the only conclusion that's ever been reached in one of these productivity abyss meetings is "we need to add a new assembly" because their lack of oversight has made their solution so tightly coupled and interwoven that it's the only way short of taking everything apart and putting it back together again.
In my experience, when groups of developers have to resort to mentally storing lots of abstract information in the absence of a visualised overview, nobody can make informed architectural decisions and the solution grows organically and totally unchecked until the dependencies either get so complex that nobody knows what to do, or you run into a circular reference and people start throwing in arbitrary assemblies as a hacky workaround.
I've taken to going into discussions with the other group armed with a package diagram of their solution so I can tell them where to put what in their work. If I don't do this, each meeting descends into chaos with various people trying to compile lists or matrices of references which is exactly what the package diagram is representing. Afterwards you hear murmurs of "an overview diagram like that wouldn't be a bad thing", but nothing gets done about it unless I do it for them.
What do other people think?
How can I motivate my superiors to take software architecture seriously and value the advantages a bit of forethought will bring?
because their lack of oversight has made their solution so tightly coupled and
interwoven that it's
Not sure that has much to to with the rest of this. One can of course use UML and formal designs and create exactly the same sort of problem.
And from my own perspective I would like to think that my code doesn't do that, and I don't credit design for that but rather experience.
jim lahey wrote:
What do other people think?
UML by itself isn't sufficient. I use UML and encapsulate it in a design document.
But I don't do it for others since that is often a futile effort.
jim lahey wrote:
How can I motivate my superiors to take software architecture seriously and
value the advantages a bit of forethought will bring?
There are numerous studies that show significant benifits from formal process control. Reduced delivery times, better scheduling, better resource utilization, reduced bugs, reduced overall costs, reduced maintenance costs are some I believe I remember.
There are however countless stories about organizations that fail to implement process control correctly. And many ways to blame the failure (usually on the process methodology while ingoring the role developers play.)
Best incentives that I can remember, again from the studies (IEEE and ACM) were
1. A senior VP or higher must consider process control a primary goal.
2. Employee reviews must have a significant percentage of the review devoted to how well the developer and mid-level managers participated in the process control processes. It certainly helps if bonuses/raises are based on the review and thus correct participation in process control.
I don't think the problem you're experiencing is unique to software. In many walks of life you will find people who 'just want to get on with it' or haven't got 'time to waste' designing and planning. Or just don't know any other way yet.
When learning to program I reached a point, about 4:00 in the morning if I remember correctly, with reams of code printout spread across the room trying to track down mis-behaving pointers when I became convinced there had to be a better way. I found eventually it the form of a book on OOA/OOD in a university book shop, and later in the form of UML, Interface design etc. But I already had the motivation to find a better way.
I do think that your comment about developers 'mentally storing lots of abstract information' is a common problem. I know how developers 'want to program' - as I, and probably most people using CodeProject, once did or still do. Once typing or coding has started, it becomes a mental challenge, probably for the same reason as do crosswords and so on. Being in a position to promote the use of Components, Interfaces, Decoupling and design in general, aided by UML as the visualisation medium, I found some 'enlightened' developers took to analysis and design well, seeing - or showing each other - how it could aid and clarify the mental juggling act of information - and how it could contributed to making things work. Though I also came across quite a few who "didn't do UML" or professed not to understand, or simply drew a diagram then got on with it just as before.
Everyone concerned with what you're doing has their own perspective: from developers to managers to clients. I know it's software technicalities under discussion but you need to put across your points in a way that the people your addressing can understand - and see advantage in; and they might not be 'software people'. So you might need one set of arguments to convince your managers and another to convince fellow developers. Demonstrations can help a lot. The project management 'iron triangle' of Cost; Time; and Quality, and also Risks: 'what if ...?' are good starting points to measure and convey the benefits to more senior people. In fact UML can be pretty confusing, so it might be best not to use to use UML as the medium to try and convince of the need for design using UML.
A lot of discussions about reasoning for the use of software design tend to use as a starting point the metaphor of a construction architect: producing a simple diagram to get the 'feel' of what's needed, then more detailed plans to put to the owner and planning officials. Then other plans for the builders, electricians etc. This illustrates that differing perspectives exist requiring differing plans - but this is also then used as a jumping off point for putting a question of the form: You wouldn't consider putting people to work on a building (or some mechanical equipment) without an accepted design and plans, so why would you consider building (or letting be built), something complex like software without an equivalent design in place.
'Lessons learned' i.e. examples of where design and UML would have helped, or did help, is also an accepted format for putting across arguments such as you have.
There are a lot of 'enlightened' software designers, architects and coders out there.
interesting thread, especially as I'm of the building architecture type designer and a tutor in that field also.
I find it interesting and fitting that architecture is use in software design.
In our field we establish constraints, analyse the brief, create bubble diagrams (like flow charts) create a site analysis (considering the "environment" and "context") draw some sketch designs (remembering the type of drawing has to be suitable for the viewer, perhaps the client (maybe little knowledge of construction), the client is shown drawings that will describe to them how they'll experience the building and its spaces. Maybe drawings are done for other consultants (mostly interested in there disciplines) and they can handle much more detail and are less interested in the experience. And all the way through are trying to do all this within the budget.
I hope you appreciate the analogy
As a building architect, or as a software architect, you might be interested in John Zachman's 1987 article on the need for IT systems architecture which he presents based on an analogy with building architecture and plans. In 1987 he starts with a bubble diagram as do you 25 years later which perhaps shows the maturity of the building architecture design process compared to IT and software systems design processes. Perhaps due to the rapidly changing IT landscape and the options open to IT/software design, such IT maturity is yet to be established, or maybe the analogy doesn't hold there as IT changes so rapidly.
Perhaps due to the rapidly changing IT landscape and the options open to
IT/software design, such IT maturity is yet to be established, or maybe the
analogy doesn't hold there as IT changes so rapidly.
Not to mention that the vast majority of projects in IT are substantially different than every other IT project.
If 90% of architects spent all of their time developing building that were substantially different than all others and had a lead time that is typically less than a year then it might be similar.
We tend to use the Software Design and Software Architecture loosely as equivalent terms. However, there are two different things.
In a nutshell, Software Architecture captures nonfunctional requirements( environment and system constraints, technologies, platform,...), analyses high level structure of the software components. The goal is a Software Architecture Design Document which is very important in stakeholders' early decision.
In contrast, Software Design or Software Implementation Design to be clear, elicits functional requirements. It is about detail implementation of divers software components.
Incidentally, Software Architecture and Software Design don't use the same techniques or methodology to meet their respective goals( they don't have the same goals!!!). The former uses 5 Architectural Views for example produce the Software Architecture Document, but the latter deals with class diagrams, sequence diagrams, use cases, state diagrams, etc... to produce Software code.
Anything more than a simple App I will design properly.
Start with a requirement outline and build the candidate classes from there. Then add in use cases to see what is needed or missing.
I use UMLet[^] for modelling and I try to at least model the main classes and activities.
Reality is an illusion caused by a lack of alcohol
Its a nice discussion. I would like to add some of my approaches to convince the management about a Software product Architecture:
1. At first I directly talk with my managers and try explain them about the importance of proper Architecture.
2. I prepare a POC and then have a meeting again with them.
3. I even include Tech Leads & some Senior Developers.
4. I circulate some supporting articles/blogs to them.
Be a good professional who shares programming secrets with others.
I really have fallen in love with the DDD concept. In short this is how we always work out a project.
All you need in the beginning is a whiteboard and a marker.
1. Define the domains within the scope of your project
2. Define the components within each domain.
3. VERY IMPORTANT: Give the domains and components GOOD names.
4. AGREE on the CONTRACTS of each component
5. Document your Diagram and Contracts.
6. Split the teams up each dealing with their component(s) and let them create UML diagrams.
7. Let each ULM diagram be coded out by a team that did not create the diagram.
I am trying to make distributed application in RMI/CORBA like ebay : allow individuals to submit classified ads to sell items with an auction system. At the closing date of the auction, the buyers who bid the last (if it exists) has the privilege of being able to acquire the object.A user can at any time be buyer or seller. Information of "user" necessary for the rest are mainly: name, password, bank details.
As want to operate::
1: Get a list of items currently for sale (list or search by keyword possibly). Obtained including a description, a current price, a date (or time remaining) closing of the sale.
When an item is worth :
1: get a minimum of information about the seller
2: the bid there must have authenticated.
Can I get help and little explanation about the architecture?
Well I am editing it....why u misinterpreted that...if u also know that this is not the place to give the code ...n I already admitted ....but u stick on that point rather than the main subject...strange..!!!
I did not misinterpret it. You distinctly asked for someone to write the code for you and then explain it to you. Why did you write that if that is not what you meant?
u stick on that point rather than the main subject
No, you asked for someone to write a bunch of code for you and I simply explained to you that that was not going to happen. Why you keep harping on that instead of posting the code you have written and asking an answerable question is beyond me.
I think u r good enough to understand the english words....I never ask someone to write code for me....even I admitted that in the first reply. n I dont understand why u take this so seriously ...u forcefully put ur assumption ..if u r interested to help me anyway ..do this otherwise leave it n I have changed the post .i think it is fine enough now.
I'm working on a new design for our old (25+) application. In this design should be more than one SQL servers (synchronized via replication). Each SQL server wrapped inside a DAL layer, and those DAL's are grouped using load balancing.
I looking to add cache to this design, and at first I thought that the best place to do so is at the individual DAL, however in this case I have to design a synchronization method between separated DALs.
To solve this synchronization problem I thought about a cache service to serve all the DALs (and maybe other parts of the design).
My question is, according to your knowledge and experience, will it be still effective to use a remote service to cache, or better to design cache synchronization that cross DALs?
Persumably you have 25 or more applications. And each of those use 1 or more databases.
After that your explanation loses me.
Do you intend, at some future time to consolidate databases? And that is a hard plan driven by business reasons? Because if not then they is absolutely no reason why any of these should be combined into a single cache.
Is there a distributed transaction model in play? If not then there is no need for "synchronization". And if there is then you should look into an actual distributed transaction model.
And why do you think you need to cache everything? Or even anything for that matter?
And I have no idea what you think "load balancing" means in this context. That term means a way of balancing requests across different servers. A DAL (Data Access Layer) exists within the application and unless all of the applications run on one machine load balancing across multiple applications would be difficult.
First of all thank you for your time...
and now some explanations to make it clear...
There is only one app - a web one. The application is distributed so the DAL is only a part of it (there are many layers between the UI that sits in the web server and the DAL which is combined, if not necessary physically, with the actual DB). The DAL is designed in a stateless way so we can lunch infinite number of DALs. In case of multiple DALs they grouped with load balancing. And when I say load balancing I mean exactly what you mean...
I thought about cache to improve performance of the DAL, but after looking into it I saw that I must
or make some synchronization between local caches
or make some cache server.
My question was about the usefulness of such cache server...
The DAL is designed in a stateless way so we can lunch infinite number of DALs
Then you have a server, not a DAL.
Kornfeld Eliyahu Peter wrote:
My question was about the usefulness of such cache server..
Depends on the data and the nature of the business.
If, for example, you have some small set of data that is used a lot and doesn't change often then caching is doable even with the complication of cross server syncing. As long as there is some allowed latency in the timeliness.
Conversely if you are loading billions of customer records by request from a user then there isn't much point because each request by itself likely has a very limited lifespan in the cache. And you would also need to implement sticky sessions for it to be useful.
We're developing a couple of web applications and want to allow users some advanced options if they've identified themselves.
The goal is that the user should only remember one username/password for all our applications (and services, we provide all kinds of newsletters and alerts as well).
SSO (Single-Sign On) was the first thing that came to mind, so my question is: what kind of recommendations can you give? I read a little about OpenId, but I know Google, Yahoo, windows live, ... also provides this.
Should we choose an existing service, and wich one is the best or should we write something for ourselves for our company only?
In the (near or further) future I would like to add the personnel as well through ldap or something.
This stuff is completely new to me so any advice, tutorials, recommendations would be helpful.
I have not a huge experience with SSO but just from how I'd feel as a user I'd say using an existing service as only possibility would be not a great idea.
If you us another service then you should add your own possibility too, such as CodeProject does offer a merged sign-on for codeproject.com and rootadmin.com - combined with the chance to use a Google account for signin in/up.
To the best of my knowledge you wouldn't be wrong to take a look at a form of Federated Identity Management using a Token Service. OpenId, SAML, WIF and OAuth are all token-based and will take you down the road of claims-based authentication and authorization.
I would have used something like STS as a starting point for a token service, but our management in their infinite wisdom want us to roll our own token service. This despite the fact that our token service will not be interoperable with anything else as it doesn't support any common standards beyond putting a token on the same HTTP header as other token services do. Oh, and there's no integrity check for our claims and everything is passed as clear text. Well, not as clear text actually, we're base64 encoding the token so it would only take a determined person a couple of extra seconds to walk right on in. Then there's the issue of token size, which is limited, so we'll roll our own zip function to cope with that, even though a decent token service will already do this for you, along with everything else we've implemented for no good reason.
But whatever, rant over. Just don't try and reinvent the wheel like our place does. Token authentication is not a walk in the park by any stretch of the imagination so anything you can use off the shelf will save you a ton or arseache.
When I ask questions about architecture I often hear back several arguments to explain this or that choice.
* For maintenance
* For performance
* for Security
* For data consistency
What, for you, are valid arguments to make a decision?
Personally I place "data consistency" in number one and it is a non negotiable priority but I think I'm alone to think like that because the current pattern, decisions, modern architectures emphasize maintenance, performance and security.
Hmmm. That's an interesting question. I would agree that consistency is an important consideration, but how do you define consistency? I ask this because you really need to put a qualification on consistency so that you have a measurable baseline. Unfortunately, this isn't a case of black and white - do you mean instantly consistent (which has a huge impact on your database architecture) or do you mean eventually consistent (whereby you could have an update made from one server and know that this would eventually be updated in all the other servers). There is no hard and fast answer to this question.
I was brought up to respect my elders. I don't respect many people nowadays.