Wednesday, October 3, 2012

An approach to Software Design



  • Visualize your system (from inside)
  • Identify different (disparate) entities in your system
  • Group objects which are inherently common (from functional aspect or in real world aspect)
  • Identify inherent relation-ships in those entities: use tools such as is-a, has-a, uses, composition, aggregation, generalization, realization, cardinality
  • Identify key data structures to model the entities
  • Identify the interaction  model between these entities to achieve the end goal of the system
  • Identify tasks and ways you can break down your tasks. 
  • Identify task relationships
  • Identify Workers or Threads and how and model their interaction
  • Choose appropriate Thread Synchronizers in each situation (each has its way of defining a thread interaction mechanism)
  • Identify business rules
  • Identify actors in your system
  • Identify and abstract common design patterns
  • Stick to SOLID principles for Design  (Highly cohesive and lowest coupling)
  • Ask questions and gather constraints = which are the most essential limiting factors in shaping your system
  • Visualize your system (from outside)
  • Identify the above things using your system as one component and how it interacts or interfaces with its outside world
  • Identify performance goals of your system (latency/throughput)
  • Design for performance (scale-able - identify performance/scale-ability bottlenecks): liveness issues/memory leaks/resource leaks issues
  • Don't over design
  • Start small and let your design evolve
  • Keep it flexible and simple (use the SOLID principles of design)
     

No comments:

Post a Comment