sentenz / convention

General articles, conventions, and guides.
https://sentenz.github.io/convention/
Apache License 2.0
4 stars 2 forks source link

Modify guideline about `Software Development Guide` #265

Open sentenz opened 1 year ago

sentenz commented 1 year ago

Software Development Guide

Software development refers to the design, documentation, programming, testing, and maintenance of a software deliverable. The combination of these steps are used to create a workflow pipeline, a sequence of stages that when followed produce high-quality software deliverables. This pipeline is known as the Software Development Life Cycle (SDLC).

1. Category

1.1. Software Development Life Cycle

The Software Development Life Cycle (SDLC) is a systematic approach to software development that consists of various phases and activities. Each phase has specific goals and deliverables, and it provides a structured framework for managing and controlling the software development process.

1.1.1. Discover

Projects are envisioned, designed, and prioritized.

Features of Discover:

  1. Process Principles

    • Agile

      Scrum is an Agile framework for managing and delivering complex projects. It provides a flexible and iterative approach to software development that focuses on delivering value to customers through regular product increments. Scrum promotes collaboration, transparency, and adaptability, allowing teams to respond quickly to changing requirements and market dynamics.

      Extreme Programming (XP) is an agile methodology that focuses on producing high-quality software through iterative and incremental development. It emphasizes collaboration, customer involvement, and continuous feedback.

  2. Software Analysis

    • Requirements Analysis

      Requirements analysis sets the foundation for the development process, guiding subsequent phases such as design, implementation, and testing. Conducting requirements analysis reduces the risk of scope creep, improves software quality, and delivers a product that meets stakeholder expectations.

  3. Architecture Decision Records

    Architecture Decision Records (ADR) captures the key options available, the main requirements that drive a decision, and the design decisions themselves.

1.1.2. Plan

Stakeholders are identified, budgets set, and infrastructure requisitioned. Design documents from the concept phase are broken down into actionable tasks.

Features of Plan:

  1. Software Architecture Description

    A software architecture description provides an overview and detailed documentation of the architecture of a software system. It describes the structure, components, relationships, and behavior of the software system, enabling developers, architects, and stakeholders to understand and communicate the design decisions and principles underlying the system.

  2. Project Layout

    Project layout refers to the arrangement of files, folders, and other resources within a project. A well-designed project layout can improve the organization, readability, and maintainability of the project's codebase.

  3. Software Architectural Patterns

    • Component-Driven Development (CDD)

      Component-Driven Development (CDD) is an approach to software development that emphasizes the construction of applications by composing modular, reusable components. It focuses on building and integrating self-contained, loosely coupled components as the primary building blocks of an application.

1.1.3. Code

Development teams work to build production-ready software that meets requirements and feedback.

Features of Code:

  1. Coding

    • Comment

      Comment styles and tags are used to providing code context and documentation, and annotate code with additional information for improving code quality and maintainability.

    • App Resources

      App resources refer to the various assets and components utilized by an application, such as images, icons, sounds, videos, and other media files, as well as configuration files, database connections, external API endpoints, and managing static strings and magic numbers.

    • Feature Flags

      Feature flags are a software development technique that enables developers to turn on and off certain features or functionality of an application or service.

    • Software Design Principals

      Software design patterns are general reusable solutions to common software design problems that have been proven effective over time. Design patterns provide a way to organize and structure software code in a way that is easily maintainable, scalable, and extensible.

    • Software Design Patterns

      Software design patterns are general reusable solutions to common software design problems that have been proven effective over time. Design patterns provide a way to organize and structure software code in a way that is easily maintainable, scalable, and extensible.

    • Software Architectural Patterns

      Software architectural patterns are high-level design templates or solutions that provide a structured approach for organizing and designing software systems. Architectural patterns offer proven solutions to recurring design problems and help architects and developers build scalable, maintainable, and robust software applications.

  2. Cryptography

    Cryptography is the practice of securing communication from third-party interference, where a third-party is anyone who is not authorized to access the communication. Cryptography uses mathematical algorithms to convert the original message, known as plaintext, into an unreadable format called ciphertext.

    • Password Hashing Algorithms

      Password hashing algorithms are a specific type of hash function that are designed to store and verify passwords securely. Passwords are often the first line of defense in protecting user accounts and sensitive information, so it is important to store them securely.

  3. Software Testing

    • Test-Driven Development

      Test-Driven Development (TDD) is a software development approach that emphasizes writing automated tests before writing the actual code. TDD is based on the idea that writing tests first can lead to better code quality, better design, and improved overall software development processes.

    • Testing Patterns

      Testing patterns are reusable techniques to common testing problems that can be used to improve the effectiveness of software testing. They allow to organize and structure test code in a way that is maintainable, scalable, and extensible.

    • Unit Testing

      Unit testing focuses on testing individual components of the software, such as classes or functions, to ensure that they work as expected. This type of testing is performed during the development phase and is an important part of the software development process.

    • Fuzz Testing

      Fuzz testing is a type of testing that involves sending random or malformed inputs to the software in an attempt to find defects. It helps identify any security or reliability issues that may occur in the software, and helps ensure that the software is robust and resilient.

  4. Everything as Code (XaC)

    Everything as Code (XaC) is a software development philosophy that treats infrastructure as code.

    • Infrastructure as Code (IaC)

      Infrastructure as Code (IaC) involves managing and provisioning infrastructure resources (e.g. virtual machines, networks, storage) through code, rather than using manual processes to configure devices or systems.

    • Configuration as Code (CaC)

      In Configuration as Code (CaC) application and system configurations are represented as code, treating application config resources as versioned artifacts to manage and deploy consistent configurations across different environments.

    • Documentation as Code (DaC)

      Documentation as Code (DaC) involves writing documentation as code, allowing teams to manage documentation in version-controlled repositories and automate documentation generation.

  5. Software Analysis

    • Static Analysis

      Static analysis is a software analysis technique that examines software artifacts, such as source code, design documents, or models, without executing the program. It analyzes the structure, syntax, and semantics of the code to identify potential issues, vulnerabilities, and quality concerns. Static analysis helps detect defects, improve code quality, and ensure adherence to coding standards.

    • Dynamic Analysis

      Dynamic analysis is a software analysis technique that involves observing and analyzing the behavior of a software system during its execution. It helps uncover defects, validate functionality, memory leaks, assess performance, and understand system behavior under different conditions.

    • Security Analysis

      Security analysis is a software analysis technique focused on assessing the security posture of a software system. It involves identifying vulnerabilities, weaknesses, and potential risks in the software design, implementation, configuration, and deployment. The objective of security analysis is to uncover security flaws and recommend mitigations to protect the system against unauthorized access, data breaches, and malicious attacks.

  6. Continuous Pipelines

    • Continuous Integration

      Continuous Integration (CI) refers to the practice of automating the process of integrating code changes from multiple developers into a single version control repository. This process typically involves building and testing the code changes as soon as they are committed to the repository, and providing feedback to developers on the quality and stability of their changes. The goal of CI is to catch issues early in the development process and promote collaboration among team members.

1.1.4. Build, Test and Release

A reliable system is resilient to failures and meets its documented service level objectives, which may also include security guarantees. CI/CD pipelines ensure an efficient developer experience.

Features of Build, Test and Release:

  1. Continuous Pipelines

    • Continuous Verification

      Continuous Verification refers to the practice of continuously verifying the quality and functionality of software applications and systems. This can involve automating the process of testing and validating code changes, and can help organizations to catch and fix bugs and other issues before they are deployed to production. Continuous Verification helps to ensure that software is of high quality and reliable, and can improve the overall stability and user experience of applications. Continuous Verification encourages a shift-left approach by identifying and addressing issues early in the development lifecycle.

    • Continuous Build

      Continuous Build refers to the practice of automatically building and compiling software applications and systems, whenever changes are committed to the source code repository. This can involve automating the process of building, compiling, and packaging software, and can help organizations to ensure that software is always up-to-date and ready for deployment. Continuous Build helps to speed up the software development process, reduce errors and inconsistencies, and improve the overall efficiency of software development and deployment.

    • Continuous Testing

      Continuous Testing refers to the practice of automating the process of testing code changes throughout the software development lifecycle. This process typically involves the use of test automation tools and scripts that run automatically as code changes are committed, built, and deployed. Continuous Testing helps to ensure that code changes are thoroughly tested and validated before they are released to production, reducing the risk of defects and improving the overall quality of the software.

    • Continuous Release

      Continuous Release is the process of releasing software updates to end users frequently and incrementally. It involves using automated tools and techniques to manage release cycles, such as versioning, branching, tagging, or changelogs.

1.1.5. Deploy

Deploy involves to deliver an code is approved and merged the software to production.

Features of Deploy:

  1. Continuous Pipelines

    • Continuous Delivery

      Continuous Delivery (CD) is a set of practices and techniques that aim to automate the process of delivering code changes from the development environment to production. This process typically involves testing and verifying code changes at multiple stages, such as build, test, and deployment, before they are released to production. CD helps to ensure that code changes are deployed quickly, with minimal manual intervention such as Code Review, and with confidence in their quality and stability.

  2. Patch Management

    Patch management refers to the process of planning, testing, deploying, and monitoring updates (or patches) to software applications, operating systems, and other IT systems. Effective patch management helps keep systems secure by addressing vulnerabilities and fixing bugs. It's crucial to regularly update software to protect against cyberattacks and ensure optimal performance.

1.1.6. Operate

Operate involves monitoring the software in production, identifying and resolving issues, and providing support to end users.

Features of Operate:

  1. Continuous Pipelines

    • Continuous Feedback

      Continuous Feedback refers to the practice of providing real-time feedback to developers on the quality and performance of their code changes. This can include feedback from automated testing tools, performance metrics, and user feedback, among other sources. The goal of Continuous Feedback is to provide developers with quick and actionable insights into the quality and stability of their code changes, and to promote continuous improvement in the software development process.

1.1.7. Observe

Incident management is when Development and Operations respond to unplanned events and restore services using reliable methods for prioritizing incidents and getting to resolution fast.

Features of Observe:

  1. Continuous Pipelines

    • Continuous Monitoring

      Continuous Monitoring refers to the practice of monitoring the performance and stability of software applications in production, and proactively addressing any issues that may arise. This process typically involves collecting and analyzing performance and log data, as well as monitoring system health and availability. Continuous Monitoring helps to ensure that software applications are performing optimally in production, and helps to minimize downtime and resolve issues quickly.

  2. Incident Management

    Incident management is the process of identifying, analyzing, and resolving incidents that occur in a software system. An incident is any event that disrupts or degrades the normal operation of the system, such as a system outage, a performance degradation, or a security breach.

  3. Logging and Monitoring

    Logging and monitoring are essential components of modern software systems and infrastructure. They play a crucial role in ensuring the reliability, performance, and security of applications and services.

  4. Software Metrics

    • DORA

      The DORA (DevOps Research and Assessment) metrics are a set of key performance indicators (KPIs) developed by the DevOps Research and Assessment organization. These metrics are designed to assess the performance of software delivery teams and provide insights into the effectiveness of DevOps practices.

    • Technical Dept

      Technical debt refers to the accumulated consequences of shortcuts, suboptimal solutions, and compromises made during the development process of software. Technical debt can lead to increased complexity, reduced maintainability, decreased productivity, and higher costs in the future.

1.1.8. Security

Security involves identifying and mitigating security risks throughout the software development lifecycle.

  1. Continuous Pipelines

    • Continuous Compliance

      Continuous Compliance is the process of ensuring that the software adheres to the relevant laws, regulations, standards, licenses, and policies throughout the development cycle. It involves using automated tools and techniques to check and enforce compliance rules, such as security controls, data privacy, or audit trails.

    • Continuous Security

      Continuous Security is the process of integrating security practices and tools into every stage of the development cycle. It involves using automated tools and techniques to identify and mitigate security scans and risks, such as vulnerabilities, threats, or breaches.

  2. Risk Management

    Risk management involves identifying, assessing, and mitigating potential risks that could impact the success of a software project. It includes steps like risk identification, analysis, prioritization, and implementing strategies to minimize or address those risks. Effective risk management helps ensure the project stays on track and delivers the desired outcomes.

    • ISO 31000

      Provides principles and guidelines for effective risk management practices that can be applied to any type of organization and industry.

    • IEC 62443

      IEC 62443 is a series of international standards developed by the International Electrotechnical Commission (IEC) that provides a framework for implementing cybersecurity in industrial automation and control systems (IACS). The series comprises of several parts, each of which addresses a specific aspect of IACS cybersecurity.

  3. Identity and Access Management (IAM)

    Identity and Access Management (IAM) is primarily concerned with the authentication and authorization of the user in the network, i.e. with establishing the identity of the user and the associated access rights that the user has in the network, applications and systems.

  4. Software Analysis

    • Security Analysis

      Security analysis is a software analysis technique focused on assessing the security posture of a software system. It involves identifying vulnerabilities, weaknesses, and potential risks in the software design, implementation, configuration, and deployment. The objective of security analysis is to uncover security flaws and recommend mitigations to protect the system against unauthorized access, data breaches, and malicious attacks.

    • Software Composition Analysis

      Software Composition Analysis (SCA) is a software analysis technique that focuses on identifying, analyzing and managing the composition of third-party and open-source software components used in a software system.

1.2. Key Features

1.2.1. Agile

Agile is an iterative approach to project management and software development that helps teams deliver value to their customers faster and with fewer headaches. Agile methodologies empower teams to be inherently flexible, well-organized, and capable of responding to change.

1.2.2. Everything Ops (XOps)

Everything Ops (XOps) is a set of principles and practices, tools, and a cultural philosophy that automate and integrate the processes of software development. XOps, an umbrella term used for a combination of IT tech like DevOps, DevSecOps, AIOps, MLOps, GitOps, and BizDevOps. XOps supposedly helps to shorten a system development cycles and provides continuous delivery with high software quality. It focuses team empowerment, cross-team communication and collaboration, and technology automation.

1.2.3. Everything as Code (XaC)

Everything as Code (XaC) is a concept that extends the idea of Infrastructure as Code (IaC) to include various aspects of software development, deployment, and operations represented as code.

1.2.4. Everything as a Service (XaaS)

Everything as a Service (XaaS) is a concept that extends the idea of Infrastructure as a Service (IaaS) to include various aspects of software development, deployment, and operations represented as a service.

1.2.5. Continuous Pipelines

Continuous Pipelines describes the key stages in an automated software development and deployment flow. This flow typically includes design, coding, validation, testing, integration, delivery and phased deployment activities orchestrated as a release workflow before operation in a target/production environment.

1.2.6. Software Architecture

Software Architectural Patterns are high-level design templates or solutions that provide a structured approach for organizing and designing software systems. Architectural patterns offer proven solutions to recurring design problems and help architects and developers build scalable, maintainable, and robust software applications.

2. References