Software Engineering Practice
Jump to navigation
Jump to search
A Software Engineering Practice is a systems engineering practice within software engineering that aims to enhance the software development process and product quality.
- Context:
- It can range from being a Software Engineering Best-Practice to being a Software Engineering Past-Practice.
- It can influence the choice of Programming Paradigms such as Object-Oriented Programming, Functional Programming, or Procedural Programming.
- It can emphasize following security-focused programming practices to prevent vulnerabilities.
- ...
- Example(s):
- Testing and Quality Assurance-focused Software Engineering Practices, such as:
- Unit Testing Practices: A practice that involves software testing individual units of source code to ensure they function as intended.
- Test-Driven Development (TDD) Methodology: A practice that involves writing test cases first and then developing software to pass those tests, ensuring that the software meets its requirements from the outset.
- Automated Acceptance Testing Practices / Specification by Example Practices: Practices that use examples and automatable tests for specifying and verifying software requirements, creating a clear and executable specification.
- Chaos Engineering Practices: A practice that involves testing the resilience of software systems by introducing chaos or unexpected conditions, especially in distributed systems, to ensure they can withstand and recover from real-world events.
- Software Reliability Engineering Practices: A practice focused on designing and developing software systems that are reliable, maintainable, and fault-tolerant.
- Integration and Deployment-focused Software Engineering Practices, such as:
- Continuous Integration Practices: A practice that involves regularly merging all developers' working copies into a shared mainline, to prevent integration problems and to improve software quality.
- Continuous Deployment Practices: A practice that ensures every change to the software passes all stages of the production pipeline and is released automatically, reducing the time to deliver product iterations.
- Feature Branching Strategy Practices: Facilitates parallel development by creating separate branches for each new feature, preventing interference with the main codebase.
- Pull Request Workflow Practices: Enhances code quality and team collaboration by reviewing and discussing code changes before merging them into the main codebase.
- Infrastructure and Configuration Management Software Engineering Practices, such as:
- Infrastructure as Code Practices: A practice that involves managing and provisioning computing infrastructure through machine-readable definition files, rather than physical hardware configuration or manual operating procedures.
- Configuration Management Practices: A practice that involves automating the configuration of software and systems, ensuring that all systems are in a known, consistent state.
- Policy as Code Practices: A practice where organizational policies are encoded within the software and enforced programmatically, to integrate policy enforcement directly into the software development process.
- Programming Practices Integration-focused Software Engineering Practices, such as:
- Type Hinting Practices: A practice in which developers specify the expected data types for variables, function arguments, and return values, improving code clarity and maintainability.
- Code Review Practices: Practices involving systematically examining source code by peers to identify potential errors and ensure compliance with coding standards.
- Agile-focused Software Engineering Practices, such as:
- Agile Programming Practices: Practices centered on iterative development, continuous feedback, and adaptability to changing requirements, often implemented through frameworks like Scrum or Kanban.
- Test Driven Development Practices: A core Agile programming practice that integrates testing as part of the development process to ensure requirements are met.
- Collaboration and Process Improvement-focused Software Engineering Practices, such as:
- Collective Code Ownership Practices: A practice that allows the entire team to take responsibility for the codebase, encouraging contributions and improvements from all members.
- Communication and Collaboration Practices: A practice that emphasizes the importance of effective communication and collaboration among team members in the software development process.
- Operate What You Build Practices: A practice in which developers are also responsible for operating and monitoring the software they build, promoting accountability and quality.
- Platform Engineering Practices: A practice that involves designing and constructing robust and scalable platforms to support a variety of applications and services.
- Monitoring and Analysis Software Engineering Practices, such as:
- Monitoring and Logging Practices: A practice that involves continuously tracking and analyzing application and infrastructure performance to detect and respond to issues, ensuring reliability and performance.
- Design and Architecture Software Engineering Practices, such as:
- Software Design Pattern Practices: A practice that involves applying common solutions to recurring design problems in software architecture.
- Architectural Style Practices: A practice encompassing high-level strategies for structuring software systems and determining their behavior.
- Domain-Driven Design (DDD) Methodology: A practice centering the software design around the core domain and its complexities.
- Service-Oriented Architecture (SOA) Practices: A practice that involves designing software in the form of interoperable services to enhance accessibility and reusability.
- Development Methodology-based Software Engineering Practices, such as:
- Agile Development Practices: A practice that emphasizes iterative development, team collaboration, and adaptability to changing requirements.
- Scrum Framework Practices: A practice within Agile methodology focusing on time-boxed iterations (sprints) and specific roles (Scrum Master, Product Owner).
- Kanban Practices: A practice involving visual boards to manage work and limit work-in-progress in a lean development environment.
- Extreme Programming (XP) Practices: A practice focusing on enhancing software quality and responsiveness to changing customer requirements.
- Code Quality and Standards-based Software Engineering Practices, such as:
- Code Review Practices: Practices involving systematically examining software source code by peers to improve code quality and identify potential errors.
- Static Code Analysis Practices: A practice that employs tools to automatically analyze source code for bugs, stylistic errors, and complex code patterns.
- Coding Standards Practices: Following predefined guidelines and styles for writing and structuring code to ensure consistency and readability.
- Technical Debt Management Practices: A practice that involves strategies for balancing immediate deliverables with long-term code quality and maintainability.
- Security and Compliance-focused Software Engineering Practices, such as:
- Secure Coding Practices: A practice that emphasizes writing code in a way that guards against security vulnerabilities.
- Compliance Auditing Practices: A practice that ensures software complies with legal, regulatory, and security standards.
- Data Privacy and Protection Practices: A practice focusing on secure handling, storage, and transmitting sensitive data.
- Threat Modeling Practices: A practice that involves identifying and addressing potential security threats and vulnerabilities in software systems.
- User Experience and Accessibility-focused Software Engineering Practices, such as:
- User-Centered Design Practices: A practice that prioritizes user needs and usability in the software design.
- Accessibility Standards Practices: A practice that ensures software is accessible and usable by people with various abilities and disabilities.
- Responsive Design Practices: A practice that involves creating user interfaces that adapt smoothly to various device sizes and orientations.
- Interaction Design Practices: A practice designing engaging and effective interactions between users and software interfaces.
- ...
- a practice recommended in The Agile Manifesto.
- …
- Testing and Quality Assurance-focused Software Engineering Practices, such as:
- Counter-Example(s):
- See: ML Engineering Practice, Programming Practice.
References
2017
- 14 Essential software engineering practices for your agile project."
- QUOTE: Agile initiatives are found in almost any company that build software. ... Flexibility (agility) can only happen when you are able to make changes to your product in an easy, fast, and flexible way. That is why: ... there are a set of software engineering practices that will help your team to deliver a high-quality product in a flexible state. These practices are not limited to building software, they cover the whole process until actual delivery of working software to the end user. ...
... Your organization will need to invest in these software engineering practices by training, infrastructure, tools, coaching and continuous improvement when you want your agile initiatives to actually able to deliver agility.
- 1. Unit Testing: The purpose of unit testing is not for finding bugs. It is a specification for the expected behaviors of the code under test. The code under test is the implementation for those expected behaviors. So unit test and the code under test are used to check the correctness of each other and protect each other. Later when someone changed the code under test, and it changed the behavior that is expected by the original author, the test will fail. If you code is covered by a reasonable amount of unit tests, you can maintain the code without breaking the existing feature. That’s why Michael Feathers define legacy code in his book as code without unit tests. Without unit tests your refactoring efforts will be a major risk every time you do it.
- 2. Continuous Integration: Martin Fowler defines Continuous Integration (CI) in his key article as follows: "Continuous Integration is a software development practice where members of a team integrate their work frequently, usually each person integrates at least daily - leading to multiple integrations per day. Each integration is verified by an automated build (including test) to detect integration errors as quickly as possible. Many teams find that this approach leads to significantly reduced integration problems and allows a team to develop cohesive software more rapidly." You see, without unit tests and test automation, it is impossible to do CI right. And only when you do CI right you might be able to succeed at Continuous Deployment.
- 3. Collective Code Ownership: Collective Ownership encourages everyone to contribute new ideas to all segments of the project. Any developer can change any line of code to add functionality, fix bugs, improve designs or refactor. No one person becomes a bottle neck for changes. This is easy to do when you have all your code covered with unit tests and automated acceptance tests.
- 4. Refactoring: Code should be written to solve the known problem at the time. Often, teams become wiser about the problem they are solving, and continuously refactoring and changing code ensures the code base is forever meeting the most current needs of the business in the most efficient way. In order to guarantee that changes do not break existing functionality, your regression tests should be automated. I.e. unit tests are essential.
- 5. Test Driven Development: Test-driven development is a development style that drives the design by tests developed in short cycles of:
- Write one test,
- Implement just enough code to make it pass,
- Refactor the code so it is clean.
- Ward Cunningham argues that test-first coding is not testing. Test-first coding is not new. It is nearly as old as programming. It is an analysis technique. We decide what we are programming and what we are not programming, and we decide what answers we expect. Test-first is also a design technique.
- 6. Automated Acceptance Testing: Also known as Specification by Example. Specification by Example or Acceptance test-driven development (A-TDD) is a collaborative requirements discovery approach where examples and automatable tests are used for specifying requirements—creating executable specifications. These are created with the team, Product Owner, and other stakeholders in requirements workshops. I have written about a successful implementation of this technique within Actuarial Modeling.
- 7. Chaos Engineering: Even when all of the individual services in a distributed system are functioning properly, the interactions between those services can cause unpredictable outcomes. Unpredictable outcomes, compounded by rare but disruptive real-world events that affect production environments, make these distributed systems inherently chaotic. You need to identify weaknesses before they manifest in system-wide, aberrant behaviors. Systemic weaknesses could take the form of: improper fallback settings when a service is unavailable; retry storms from improperly tuned timeouts; outages when a downstream dependency receives too much traffic; cascading failures when a single point of failure crashes; etc. You must address the most significant weaknesses proactively before they affect our customers in production. You need a way to manage the chaos inherent in these systems, take advantage of increased flexibility and velocity, and have confidence in your production deployments despite the complexity that they represent. An empirical, systems-based approach addresses the chaos in distributed systems at scale and builds confidence in the ability of those systems to withstand realistic conditions. We learn about the behavior of a distributed system by observing it during a controlled experiment. This is called Chaos Engineering. A good example of this would be the Chaos Monkey of Netflix.
- 8. Continuous Deployment: Continuous delivery is a series of practices designed to ensure that code can be rapidly and safely deployed to production by delivering every change to a production-like environment and ensuring business applications and services function as expected through rigorous automated testing. Since every change is delivered to a staging environment using complete automation, you can have confidence the application can be deployed to production with a push of a button when the business is ready. Continuous deployment is the next step of continuous delivery: Every change that passes the automated tests is deployed to production automatically. Continuous deployment should be the goal of most companies that are not constrained by regulatory or other requirements.
- 9. Micro Services: The micro services architecture runs a set of small services in a single application. These services are independent of each other and communication between these services is by means of a well-defined interface that uses a lightweight mechanism, for example, a REST API. Each service has a single function which matches micro services with business needs. There are different frameworks or programming languages that can be used to write micro services and they can also be set to either function as a single or group of services.
- 10. Infrastructure as Code: Code and software development techniques like version control and continuous integration are used to merge and provision infrastructure under this practice. The interaction with infrastructure is programmer based and at scale rather than a manual setup and configuration resource. The API-driven model of its cloud makes it possible for system administrators and developers to interact with the infrastructure as such. Code-based tools are used by engineers to interface with infrastructure; hence it is treated like an application code. There being code based makes it possible for infrastructure and servers to be quickly deployed, using fixed standards, also the latest patches and versions can either be updated or repetitively duplicated.
- 11. Configuration Management: The operating system, host configuration, operational tasks etc. are automated with codes by developers and system administrators. As codes are used, configuration changes become standard and repeatable. This relieves developers and system administrators of the burden of configuring the operating system, system applications or server software manually.
- 12. Policy as Code: The configuration of infrastructure and infrastructure itself are codified with the cloud. This makes it possible for organizations to dynamically monitor and enforce compliance. It enables the automatic tracking, validation, and reconfiguration of infrastructure. In that way, organizations can easily control changes over resources and security measures are properly and distributively enforced. The fact that resources that do not comply can be flagged automatically for further investigation or automatically restarted to comply, increases the speed level of teams within an organization.
- 13. Monitoring and Logging: To gauge the impact that the performance of application and infrastructure have on consumers, organizations monitor metrics and logs. The data and logs generated by applications and infrastructure are captured, categorized and then analyzed by organizations to understand how users are impacted by changes or updates. This makes it easy to detect sources of unexpected problems or changes. It is necessary that there be a constant monitoring, to ensure a steady availability of services and an increment in the speed at which infrastructure is updated. When these data are analyzed in real-time, organizations proficiently monitor their services
- 14. Communication and Collaboration: This is the key feature of any Agile and/or DevOps model; as development, test, security, and operations come together and share their responsibilities, team spirit is enhanced and communication skills are facilitated. Chat applications, project tracking systems, and wikis are some of the tools that can be used by not just developers and operations but also other teams like marketing or sales. This brings all parts of the organization closely together as they cooperate to see to the realization of goals and projects.
- QUOTE: Agile initiatives are found in almost any company that build software. ... Flexibility (agility) can only happen when you are able to make changes to your product in an easy, fast, and flexible way. That is why: ... there are a set of software engineering practices that will help your team to deliver a high-quality product in a flexible state. These practices are not limited to building software, they cover the whole process until actual delivery of working software to the end user. ...