1. Do you design software when you “write” a program?
Yes.
2. What makes software design different from coding?
Basically, coding will rely on your design decisions, starting from the language you will be using.
3. If a software design is not a program (and it isn’t), then what is it?
Well, Software design is a phase that bridges the gap between the requirements gathering phase and the implementation phase of the software development cycle.
During the requirements gathering phase, the focus is on understanding and capturing the needs and expectations of users and customers. It describe what the software must (should, may / not) do, and what features it must (should, may / not) have.
The design phase will then take these requirements and translate them into a plan that describes how the system will be structured, organized and implemented. It involves making important decisions about the overall architecture of the software, its components or modules, the appropriate algorithms, dependencies, and data structures... It also includes consideration of non-functional (i.e. quality) requirements such as performance, scalability, reliability, maintainability and ease of use (refer to ISO 25000 standards family).
Designers can create various diagrams and other documents to communicate and document their design decisions, which will provide a clear roadmap for writing the code. The effective design will therefore ensure that the implementation result conforms to the original requirements, and meets the desired objectives and quality standards.
If you just "write" a program without a previous design, you are in effect creating an ad-hoc design through your implementation, as you have to make decisions about how you structure your program.
However, in proper software engineering, you would come up with a separate design, e.g. using UML, before starting the implementation.
This design can (maybe should) be so abstract (as mentioned by Robert Schaefer), that it can exist by itself and be neutral with respect to the intended implementation language.
So in a nutshell, you cannot implement without a design, but you can design without an implementation.
Why qualify, “write”. Writing has not required meaning in ordinary language to be copyrightabley, broadly, since the late 19th century (See Julian Warner. Writing and literary work in copyright: a binational and historical analysis. Journal of the American Society for Information Science. 44, 6, 1993, pp.307-321. https://asistdl.onlinelibrary.wiley.com/doi/10.1002/(SICI)1097-4571(199307)44:6%3C307::AID-ASI1%3E3.0.CO;2-R).
And both design and implementation (well distinguished) depend on the exactness produced by writing.
I see where you are coming from, with small examples or even code snippets. And of course, I wouldn't suggest to come up with UML diagrams for these tasks, that would be just silly.
Nevertheless, even in these simple/small cases one has to decide to do things in a certain way and not in another way. To me, the act of deciding how to solve a certain problem implies some kind of design.
Julian, I'm thinking the quotes on "write" might be a denigration of the activity, or that the quotes might be used to indicate the disconnect between the physical act of typing versus a more narrow view that "writing" can only be hand-writing. Either of these, to me, seem greater than the possible concern over copyright, though copyright is still a possiblity.
Only Yanay can remove this ambiguity.
Note too, this discussion provides an inner teaching moment within the outer teaching moment. That is, design itself often contains ambiguity, that the coder is yet to discover by the act of mapping design to code, done during the act of "writing" software. Writing software is not just "writing," writing is also "thinking."
You don't know what you don't know until you take the next step. Looking at the design, we can't really say that it's going to work, until we take the next step, i.e., write some code and see whether it works or not. The devil is in the details and those devilish dirty details just can not be seen in a design.
Both design and coding are necessary in the software development process. The methodologies relate activities for each of these phases.
According to the book Software Engineering A Practitioners Approach 9na by authors Roger Pressman and Bruce Maxim:
Software design is an iterative process by which requirements are translated into a "blueprint" for building the software. Initially, the blueprint represents a holistic view of the software. That is, the design is represented at a high level of abstraction, a level that can be traced directly to the specific goal of the system and the more detailed data, functional and behavioral requirements. As design iterations occur, refinement leads to design representations at much lower levels of abstraction. These levels of abstraction can still trace back to requirements, but connections may not be obvious at these lower levels of abstraction.
Design is important because it allows a software team to assess the quality of the software before it is implemented, at a time when errors, omissions or inconsistencies are easy and inexpensive to correct.
Software design creates a representation or model of the software and provides details about software architecture, data structures, interfaces and components needed to implement the system.
During the design phase, the system or product to be built is modeled. The design model can be evaluated and improved before code is generated, testing is performed and a large number of end users are involved.
So, every computer program has a design. What is valuable when that design was developed on-purpose. I share the Yanay Hernández Sosa perspective. This also differentiates software architecture from programming in the small.
Software design and coding are related and are both important. Design is the representation of software at a high level of abstraction and coding is the language used to represent this design.
According to authors Roger Pressman and Bruce Maxim in the 9th edition of their book Software Engineering A Practitioners Approach refer:
Software design commences as the first iteration of requirements engineering concludes. The intent of software design is to apply a set of principles, concepts, and practices that lead to the development of a high-quality system or product. The goal of design is to create a model of software that will implement all customer requirements correctly and bring delight to those who use it. Software designers must sift through many design alternatives and converge on a solution that best suits the needs of project stakeholders.
During the design phase, you model the system or product that needs to be built. The design model can be assessed for quality and improved before code is generated, tests are conducted, and end users become involved in large numbers.
Yulennys Suárez Ramírez I think that is a particular model of software development, what some call the waterfall staging of phases. It doesn't have to be that way and I suspect there is more iteration and spiraling in practice for many classes of application and scale. I suspect that formal design may not be undertaken so often, and certainly not in advance of any development. It might depend on how important proof-of-concept is and also how risk management is handled, especially knowing when to stop or redirect as early as possible.
design is an abstraction and coding is the realization, so basically are different activities. Though that doesn't mean that they need to be done separately in noticeable phases.
According to agile approaches and if the experience of the developer is enough, is completely correct to design in the mind, while coding with the fingers almost at the same time.
Just remember that talented people, or with enough experience, like Mozart, was able to "transcript" (as he used to say) his symphonies. There aren't drafts of his work where he designed them. He was able to design on the fly while writing them.
That's the same analogue, so according to the context and factors, design and coding can be done in different phases or at the same time. Nevertheless, are two different activities.
Eliu Montoya-Mariscal I agree with that. I think an important issue has to do with whether design and principles that apply to a system are available, and accurate, for consultation when changes and maintenance arise. Much of this can be captured in interface descriptions and data dictionaries at some level. I suspect that, at various levels in a system, it is important to be aware of invariants that need to be preserved among the moving parts. I also suspect that this is not something that is easily introduced in education and training. I have seen this be carried in code commentaries, but there is an anti-pattern about that.
Designing software and writing (or coding) a program are two different but closely related aspects of software development. Both activities are essential in the software development lifecycle, but they serve different functions and require distinct skills and thinking processes.
Designing Software
Software design is the phase where you plan and specify how the software product will be created and how it will work. This involves making decisions about the architecture of the software, data models, algorithms, user interface, and overall system integrity. It is more about the "what" and "how" of a software product's functionality and interaction.
Key activities during the software design phase include:
Requirements Analysis: Interpreting and understanding what the client or user needs the software to do.
System Design: Designing the software's architecture, which involves making high-level decisions about the overall structure and components of the software.
Detailed Design: Specifying the design of each component in detail, including data structures, algorithms, and interfaces between components.
Coding or Programming
Coding is the stage of software development where the actual code is written based on the designs and specifications created during the software design phase. This involves translating the design into a machine-readable language. In other words, coding is the process of implementing the design and bringing it to life.
Key activities during the coding phase include:
Code Writing: Translating the design into code using a programming language.
Code Review: Checking the written code for errors or inefficiencies and making sure it adheres to the design.
Unit Testing: Testing individual parts of the code to ensure they work as intended.
Differences Between Software Design and Coding
Nature of Work: Software design is a more abstract, conceptual, and high-level activity, while coding is a more concrete, detailed, and low-level activity. Designers need to think about the big picture and the overall architecture, while coders focus on the minutiae of implementing each component.
Skills Required: Software design requires strong analytical and decision-making skills, a deep understanding of software architecture and patterns, and the ability to translate user requirements into a viable plan. Coding requires proficiency in one or more programming languages, attention to detail, and the ability to solve problems and debug code.
Output: The output of the design phase is a set of specifications or blueprints that describe how the software will be built and how it will function, while the output of the coding phase is the actual software product, written in code.
Order of Activities: Design usually comes before coding in the software development process. The design decisions guide the coding work.
In summary, you are indeed designing software when you "write" a program, but the design happens before you write the code. The design phase is where you decide what to build and how to build it, while the coding phase is where you actually build it. Both are essential for creating a well-functioning, efficient, and user-friendly software product.
Software design artefacts will be the basis of code design. Code design goes deeper in the design process to realising the abstraction of detailed architectural design. Software code can sometimes be generated from detailed architectural design artefact. This production strategy will become commonplace with the emergence of generative AI and other techniques or methodologies.
En mi opinión, el diseño de software se enfoca en la estructura y la planificación del sistema, mientras que la codificación se enfoca en la implementación del diseño mediante la codificación. Son procesos diferentes y uno depende del otro, por lo que pienso que cuando se codifica no se diseña, sino al contrario, primero se diseña y luego se codifica la solución que se diseñó. Ambos son procesos críticos en el desarrollo de software y deben ser realizados con cuidado para garantizar un software de alta calidad que cumpla con los requisitos del usuario.
Before writing the code we must have some basic clear goal by analyzing and designing, so for that first we must do the manual design and flow of the code which can be represented by the flowchart and also generate some tentative design model what you want to make, then after once we do the coding its easy to implement each and every task and processes.
Design is the 'What is needed' coding is 'How we achieve those ends.' Some one-off code for personal use will require very little design. For commercial software design is essential for success. Almost everything exists in a multifaceted environment with many different interests. There may be different governing agencies and even different nations to consider. The more widely the software is to be used, the more effort is required in design.
Design is also the basis for coding documentation so subsequent coders can make contextual modifications.
Design = Identify components & relations between them. Usually is a diagram with boxes and lines. Also, a textual description of the operational semantics (e.g. how the data flows).
Writing code = implementing the operational semantics.
Software design and coding are two distinct but interconnected activities in the software development process. Let's take a closer look at each:
Software Design:
Software design involves creating a blueprint or plan for how a software system should be structured and organized to meet specific requirements. It focuses on the overall architecture, high-level components, relationships between modules, and the behavior of the system. Designing software typically involves the following aspects:
System architecture: Defining the overall structure and components of the software system, including its modules, layers, and dependencies.
Functional design: Identifying the system's functionalities, specifying how they should interact, and designing the algorithms and data structures required to implement them.
User interface design: Designing the user interface components and their layout, aiming for usability and an intuitive user experience.
Database design: Defining the structure and relationships of the data to be stored and manipulated by the software, including tables, fields, and constraints.
Deployment design: Planning how the software will be deployed and integrated with other systems, including hardware considerations and network infrastructure.
Software design focuses on the broader picture and aims to ensure that the system is well-organized, maintainable, and scalable. It provides a foundation for coding by outlining the structure and behavior of the software.
Coding:
Coding, also known as programming, is the process of writing code instructions in a programming language to implement the design and bring the software to life. It involves translating the software design into executable code that a computer can understand and execute. Key activities in coding include:
Writing algorithms: Implementing the algorithms and logic defined during the software design phase.
Selecting programming languages and frameworks: Choosing the appropriate programming language and frameworks to develop the software based on its requirements and constraints.
Writing code: Translating the software design into actual lines of code by following the syntax and rules of the chosen programming language.
Testing and debugging: Verifying the correctness of the code by testing and fixing any issues or bugs that arise.
Optimization: Identifying areas where the code can be improved for performance, efficiency, or maintainability.
While software design focuses on the structure and organization of the system, coding involves the actual implementation of that design through writing code.
In summary, software design is the process of planning and conceptualizing the software system, while coding involves translating that design into executable instructions through writing code. Both design and coding are crucial steps in the software development lifecycle, and they complement each other to create functional and efficient software.
Software design is the process of creating a plan or blueprint for the software that will be developed. It is done to provide an architectural view of the software according to the requirements analysis and guidelines provided by the customer.
Coding, on the other hand, is the technical implementation of the design. Designing software is different from coding because designing involves creating a plan or blueprint for the software that will be developed while coding involves implementing that plan or blueprint
Software design is the process to make fully automated system code which is define the flow of the whole program, design is the part to create a model for the specific program that shows how to navigate throughout the system and how to take decision for the specific program