Resources for Development Process

Git

Learning Git

Trunk-Based Development

Django Project Deployment: AWS, Vercel, and Railway

Node.js Project Deployment: Azure

Automated Frontend Deployment with Vercel

Flask Application Deployment on Heroku

NextJS Deployment on AWS

iOS App Deployment onto the App Store

Quality Assurance Testing

Getting Started With Docker

Getting Started With WSL 2

Accessing your Project

Nginx

Introduction to Nginx

Caddy

Getting Started with Caddy

DuckDNS

Overcoming Dynamic IPs with DuckDNS

Build requirements

Requirements.txt

CMakeLists.txt

Github Actions

Introduction to Github Actions

Build tools

Introduction to make and Makefiles

Introduction to Jenkins

Introduction to the Gradle build tool

Testing Frameworks

React Testing Library

Intro to Jest for JavaScript

URL Sanitization

URL Sanitization

Code Quality

Developing With SonarQube

Test Driven Development

Intro to Test Driven Development

Design Decisions

GraphQL vs. REST: Which API type to use?

Graceful Error Handling in Express

Serverless Computing

Serverless Computing

Azure Functions

Introduction to Shells

Introduction to using Shell

Environment

Managing Environment Variables and Secrets

SOLID PRINCIPLES:

SOLID is a mnemonic acronym that represents a set of five very important software development principles which lead to code that is easier to read, maintain, and extend, leading to higher-quality software that is easier to evolve over time.

The SOLID principles are:

Single Responsibility Principle (SRP):

Open/Closed Principle (OCP)

Liskov Substitution Principle (LSP)

A closer look at the LSP: LSP

Interface Segregation Principle (ISP)

Dependency Inversion Principle (DIP)

Restaurant example of each principle

SRP

Consider a Chef in a restaurant. Initially, the chef might handle multiple responsibilities: preparing dishes, managing inventory, and overseeing kitchen hygiene. Adhering to SRP, distinct roles are established. The chef focuses solely on cooking and kitchen hygiene, while inventory management becomes the responsibility of a dedicated inventory manager.

SRP

OCP

Suppose a restaurant offers a fixed menu, and every addition or modification requires altering the entire menu preparation process. Adhering to OCP, the menu system can be designed with a base menu class that remains closed for modification. New dishes or changes are introduced via an extension, such as a SpecialsMenu class, allowing additions without altering the existing menu. This principle enables the restaurant to introduce seasonal or daily specials without affecting the core menu.

OCP

LSP

Imagine a scenario where the restaurant’s system expects all orders to be instances of a generic Order class. Adhering to LSP, any specialized order, like a delivery order, dine-in order, or takeaway order, should be substitutable for a standard order without breaking the system’s functionality. Each specific order type should adhere to the expected behavior of the generic Order class, ensuring seamless substitution.

LSP

ISP

Consider a system where all employees (servers, chefs, and cleaners) are expected to use the same comprehensive Employee interface, including methods for serving tables, cooking dishes, and cleaning. Adhering to ISP, distinct interfaces are established for each role: ServerInterface, ChefInterface, and CleanerInterface. This segregation ensures that each role implements only the methods relevant to their responsibilities, preventing unnecessary method implementations.

ISP

DIP

Suppose the restaurant’s ordering system directly depends on specific external services for payment processing and inventory updates. Adhering to DIP, the system can depend on abstract interfaces like PaymentProcessor and InventoryService, allowing flexibility to switch between different payment processors or inventory management systems without directly impacting the core ordering system. This abstraction and dependency on interfaces rather than concrete implementations facilitate adaptability and system maintenance.

DIP

Resource that gives example of actual code of SOLID principles

LINK : https://www.youtube.com/watch?v=_jDNAf3CzeY

Clean Architecture:

A system’s design that divides it into logical parts and specifies how those parts may communicate with one another is referred to as clean architecture. The objective is to make the software system easier to design, deploy, operate, and maintain while still keeping as many options open  for as long as possible.

Clean Architecture works on the well-defined division of layers. It is important to understand what the different layers are and which layers are allowed to interact with each other. The independence that clean architecute introduced to the a software system is vital since it reduces dependancies within the system. In clean architecture, the elements of the inner most layers should not have any information about the outermost layers. Anything declared in an outer layer must not be used anywhere within the inner layer of the code.

image

Some of the layers are (Simplified):

This is only a simplification of what “Clean Architecture” is; the topic is so vast that there have been texts that have been dedicated to this topic. Some resources that can be beneficial in understanding and clearing up any doubts about the topic have been linked below.

Code Smells

Code Smells

Clean coding

Coding and commenting styles

Prompt Engineering

Basics of Prompt Engineering

Technical Documents

Intro to Request for Comments (RFCs)

API documentation with SwaggerHub

Ubuntu Server Edition 20.04

Guide for setting up a home server with Ubuntu Server Edition