Software Development Lifecycle
Tags: sde
Published: 2021-10-19 08:54:13

## What is Software Development/Engineering?

<em>Software engineering is defined as the application of a systematic, disciplined, quantifiable approach to the development, operation, and maintenance of software.</em> - IEEE's Standard Glossary

Software devlopment is not just writing code, its about writing clean, understandable and maintainable code. And there are many other things involved in software development process. Things like requiremnt gathering, planning, desinging, testing, releasing and later maintaining. These aspects are also very important!

Like Martin Fowler said,  “Any fool can write code that a computer can understand. Good programmers write code that humans can understand.”


### Types of software engineers:
SDE(Software development engineer) - A common term used to represent an umbrella of professions.
- Frontend engineers: Folks who deal with visual components of the product.
- Backend engineers: Folks who deal with internal system components providing an abstraction in form of APIs which frontend engineers can use.
- Fullstack engineers: Combination of both of the above roles.
- System Architect: The system designer, makes sure the systems design is good .
- SDET(tester): One who test the whole system for bugs and acceptance critereas.
	- In some companies testing is part of development process, so this role is played by SDE itself. Ex: in TDD
- Operations engineer: Deals with releasing the product to market. Deployment and stuff.
- SRE - Site reliability engineers: Folks who work both on development teams and operations teams(release teams)
- Devops engineer: Acts as a middleman between devolopment teams and operations team. It's more of a culture. So, some companies may not have this role at all.


### Testing
- Acceptance tests: end-to-end tests to ensure the whole system adheres to business requirements.
- Performance, Load, Regression testing: Even though all the test cases pass, system has to be performant, should be able to handle load etc. These tests evaluate above metrics.

## Software Development Models:

### Waterfall model:
Steps in waterfall model:
1. Requirement collection (gather customer requirement)
2. Desgin (design system accordingly)
3. Implementation (build system)
4. Verification (verify if the product meets the initial requriements)
5. Maintenance (Maintain the project)

In this model we assume that all requirements are collected before implementation (which is almost never the case!)

### Iterative Model:
Steps in iterative model:
1. Requirement collection
2. Design
3. Implement 
4. Verify
5. Jump to 1st step(and repeat)

- Repeat this until the customer is satisfied ^^
- Problem from waterfall model is solved!

### Agile!
- Agile itself is not a model, it is an umbrella term.
- Agile way says,
	- we have to build software in iterative, incrementing, short cycles.
	- Intra-team(cross-team) communication is key to reduce conflicts in future.

### Some models of agile:
#### Lean development:[copied from wiki]
1. Eliminate waste : do not add anything which is not required.
2. Amplify learning: gather requirments constantly, share knowledge among teams.
3. Decide as late as possible: conter-intuitive? nah, just don't commit early.
4. Deliver ASAP: the faster the deliver, the faster the feedback and faster the cycle repeats.
5. Empower the team: Important.
6. Optimize the whole: Always think about how the system works on the whole.

#### SCRUM!!
- The whole project is broken down into chunks. 
- Each chunk is divided such that it can be completed in 2-4 weeks.
- And this timeframe to complete a chuck is called `sprint`.
- Each chunk of work is again divided into tasks which people can pickup and complete.
- Number of tasks completed in a sprint gives teams `velocity`.
- Balance the velocity, it shouldn't be too high(easy tasks) or too low(hard tasks).
- The tasks which are not completed(spillovers) are again put into next sprint.
- Scrum events:
	- Planning - Initial planning of whole project
	- Estimation - Splitting into chunks
	- Daily standups - Daily updates(what was done yesterday, what will be done today, any blockers?) - each team member talks about these three points in short.
	- Retrospection - After each sprint, what went well and what can be improved must be discussed among team. And actions items have to be planned accordingly.

#### Kanban
- A board style todo-list.
- Contains lanes
	- TODO/Backlog	
	- Doing
	- Review
	- Done
- More lanes can be added according to teams need and style
- Ex: Trello

#### Devops!
- Popular!
- People are switching to microservice architecture.
- As number of services increase in microservice architecture, each team which is responsible for a service owns the service. Hence, team should also be involved in operations related tasks!
- Devops itself has become a new role now-a-days. It was just a culture before...

Visit my personal blog: https://rahilrehan.github.io/