anitsh / til

Today I Learn (til) - Github `Issues` used as daily learning management system for taking notes and storing resource links.
https://anitshrestha.com.np
MIT License
77 stars 11 forks source link

System Design #192

Open anitsh opened 4 years ago

anitsh commented 4 years ago

image

image

A paradigm is a distinct set of concepts or thought patterns, including theories, research methods, postulates, and standards for what constitutes legitimate contributions to a field.

Design paradigm refers to exemplary design solutions that create "design trends", the second meaning refers to what a group of people expects from a type of design solutions. It is used within the design professions, including architecture, industrial design and engineering design, to indicate an archetypal solution.

A system is an entity with a well-defined behavior in terms of output it produces and which is a function of the input it receives, the passage of time and its internal logic. By “well-defined behavior” we mean that the output produced by the system is previ- ously agreed upon and unambiguously distinguishable from output that does not qualify as well-defined behavior. The well-defined behavior of a system is called the system specification. A system interacts with its environment by receiving input from it and delivering output to it. It may be possible to decompose a system into constitu- ent (sub)systems. In CBSE terms a system is a component that may consists of the assembly of a number of smaller components. In OO terms a system is a composi- tion of objects, each of which may be itself a composition of smaller objects.

Resource:

System Design Interview

Reference

344 #462 #176

anitsh commented 3 years ago

Software engineers apply engineering principles to build software and systems to solve problems. They use modeling language and other tools to devise solutions that can often be applied to problems in a general way, as opposed to merely solving for a specific instance or client. Software engineering solutions adhere to the scientific method and must work in the real world, as with bridges or elevators. - IBM

A System Is A State Machine. Garbage In - Garbage Out image

Software Design

Software design is the process of defining software methods, functions, objects, and the overall structure and interaction of code so that the resulting functionality will satisfy users requirements.

The software design process is a sequence of steps that enables the designer to describe all aspects of the software for building. Creative skill, past experience, a sense of what makes "good" software, and an overall commitment to quality are examples of critical success factors for a competent design. It is not always a straightforward procedure. Basic design principles enable the software engineer to navigate the design process.

There are many different ways of designing software, almost all of which involve coming up with an initial design and refining it as necessary. Different developers prefer different amounts of design up front or during implementation phase. Generally the overall design should be well thought out and reviewed before coding starts. It is easier to try out different designs up front and discover problems early in the development cycle than to make a major design change after much of the code has been written.

Primarily, all Software Design has two primary items to deal with:

Difference: Software Design and Analysis

The main difference between software analysis and design is that the output of a software analysis consists of smaller problems to solve. Additionally, the analysis should not be designed very differently across different team members or groups. In contrast, the design focuses on capabilities, and thus multiple designs for the same problem can and will exist. Depending on the environment, the design often varies, whether it is created from reliable frameworks or implemented with suitable design patterns. Design examples include operation systems, webpages, mobile devices or even the new cloud computing paradigm.

Software Design Concepts

The Design Concepts provide the software designer with a foundation from which more sophisticated methods can be applied. A set of fundamental design concepts has evolved. They are as follows:

-Structural Partitioning - The program structure can be divided into both horizontally and vertically. Horizontal partitions define separate branches of modular hierarchy for each major program function. Vertical partitioning suggests that control and work should be distributed top down in the program structure.

Aspects To Consider When Designing Software

There are many aspects to consider in the design of a piece of software. The importance of each consideration should reflect the goals and expectations that the software is being created to meet. Some of these aspects are:

Software Design Classifications Bases On Programming Paradigms

Just as software engineering (as a process) is defined by differing methodologies, so the programming languages (as models of computation) are defined by differing paradigms. Some languages are designed to support one paradigm (Smalltalk supports object-oriented programming, Haskell supports functional programming), while other programming languages support multiple paradigms (such as Object Pascal, C++, Java, JavaScript, C#, Scala, Visual Basic, Common Lisp, Scheme, Perl, PHP, Python, Ruby, Wolfram Language, Oz, and F#). For example, programs written in C++, Object Pascal or PHP can be purely procedural, purely object-oriented, or can contain elements of both or other paradigms. Software designers and programmers decide how to use those paradigm elements.

In object-oriented programming, programs are treated as a set of interacting objects. Hence, the software is designed as in the context of objects.

It is good to know some of the programming paradigms there are:

Software Design Principles

Grady Booch defined Principles of Hierarchy, Abstraction, Modularisation, and Encapsulation(PHAME) as the fundamental software design principles in his book Object-Oriented Analysis and Design with Applications, 2004.

image

Alan M. Davis suggests a set of principles for software design in his book `201 Principles of Software Development, 1995, which have been adapted and extended in the following list:

The software design should be reviewed for compliance with overall design objectives, including:

Plan on spending as much time as necessary to answer any questions before turning the design over for programming. The more time spent in the early planning phases will help to create easier coding and save time later in the software programming phase.

Software Modeling

The Software Design Model can be compared to an architect's plans for a house. It begins by representing the totality of the thing that is to be built (e.g., a three-dimensional rendering of the house); slowly, the thing is refined to provide guidance for constructing each detail (e.g., the plumbing lay). Similarly, the design model that is created for software provides a variety of different views of the computer software. By software modeling we do not mean expressing a scientific theory or algorithm in software. This is what scientists traditionally call a software model. What we mean here by software modeling is larger than an algorithm or a single method. Software modeling should address the entire software design including interfaces, interactions with other software, and all the software methods. Software models are ways of expressing a software design. Usually some sort of abstract language or pictures are used to express the software design. For object-oriented software, an object modeling language such as UML is used to develop and express the software design. There are several tools that you can use to develop your UML design. In almost all cases a modeling language is used to develop the design not just to capture the design after it is complete. This allows the designer to try different designs and decide which will be best for the final solution. Think of designing your software as you would a house. You start by drawing a rough sketch of the floor plan and layout of the rooms and floors. The drawing is your modeling language and the resulting blueprint will be a model of your final design. You will continue to modify your drawings until you arrive at a design that meets all your requirements. Only then should you start cutting boards or writing code. Again the benefit of designing your software using a modeling language is that you discover problems early and and fix them without refactoring your code.

anitsh commented 3 years ago

Component-based Software Engineering