diff --git a/bin/guide-migrator.cjs b/bin/guide-migrator.cjs
new file mode 100644
index 000000000..32b2d913e
--- /dev/null
+++ b/bin/guide-migrator.cjs
@@ -0,0 +1,83 @@
+const fs = require('fs');
+const path = require('path');
+const yaml = require('json-to-pretty-yaml');
+
+const contentDirPath = path.join(__dirname, './developer-roadmap/content');
+const guides = require('./developer-roadmap/content/guides.json');
+const authors = require('./developer-roadmap/content/authors.json');
+
+const guideImagesDirPath = path.join(__dirname, './developer-roadmap/public/guides');
+const newGuideImagesDirPath = path.join(__dirname, '../public/guides');
+
+// Remove the guide images directory
+if (fs.existsSync(newGuideImagesDirPath)) {
+ fs.rmSync(newGuideImagesDirPath, { recursive: true });
+}
+
+fs.cpSync(guideImagesDirPath, newGuideImagesDirPath, { recursive: true });
+
+// Remove the old guides directory
+const newGuidesDirPath = path.join(__dirname, '../src/guides');
+if (fs.existsSync(newGuidesDirPath)) {
+ fs.rmSync(newGuidesDirPath, { recursive: true });
+}
+
+fs.mkdirSync(newGuidesDirPath);
+
+guides.forEach((guide) => {
+ const { id: guideId } = guide;
+
+ const originalGuidePath = path.join(contentDirPath, 'guides', `${guideId}.md`);
+ const newGuidePath = path.join(__dirname, `../src/guides/${guideId}.md`);
+
+ const guideWithoutFrontmatter = fs.readFileSync(originalGuidePath, 'utf8');
+ fs.copyFileSync(originalGuidePath, newGuidePath);
+
+ const guideAuthor = authors.find((author) => author.username === guide.authorUsername);
+
+ const guideFrontMatter = yaml
+ .stringify({
+ title: guide.title,
+ description: guide.description,
+ author: {
+ name: guideAuthor.name,
+ url: `https://twitter.com/${guideAuthor.twitter}`,
+ imageUrl: `${guideAuthor.picture}`,
+ },
+ seo: {
+ title: `${guide.title} - roadmap.sh`,
+ description: guide.description,
+ },
+ isNew: guide.isNew,
+ type: guide.type,
+ date: guide.createdAt.replace(/T.*/, ''),
+ sitemap: {
+ priority: 0.7,
+ changefreq: 'weekly',
+ },
+ tags: ['guide', `${guide.type}-guide`, `guide-sitemap`],
+ })
+ .replace(/date: "(.+?)"/, 'date: $1');
+
+ const guideWithUpdatedUrls = guideWithoutFrontmatter
+ .replace(/\[\!\[\]\((.+?\.png)\)\]\((.+?\.png)\)/g, '[![]($1)]($2)')
+ .replace(/\[\!\[\]\((.+?\.svg)\)\]\((.+?\.svg)\)/g, '[![]($1)]($2)')
+ .replace(/\/http/g, 'http')
+ .replace(/]\(\/guides\/(.+?)\.png\)/g, '](/guides/$1.png)')
+ .replace(//g, '');
+
+ const guideWithFrontmatter = `---\n${guideFrontMatter}---\n\n${guideWithUpdatedUrls}`;
+
+ console.log(`Writing guide ${guideId} to disk`);
+ fs.writeFileSync(newGuidePath, guideWithFrontmatter);
+});
+
+const oldAuthorAssetsPath = path.join(__dirname, 'developer-roadmap/public/authors');
+const newAuthorAssetsPath = path.join(__dirname, '../public/authors');
+
+if (fs.existsSync(newAuthorAssetsPath)) {
+ fs.rmSync(newAuthorAssetsPath, { recursive: true });
+}
+
+fs.cpSync(oldAuthorAssetsPath, newAuthorAssetsPath, { recursive: true });
diff --git a/bin/sync-content.sh b/bin/sync-content.sh
index c3153c0fe..ee35af3fd 100644
--- a/bin/sync-content.sh
+++ b/bin/sync-content.sh
@@ -24,7 +24,7 @@ echo "=== Migrating Content ==="
node content-migrator.cjs
echo "=== Migrating Guides ==="
-# node guide-migrator.cjs
+node guide-migrator.cjs
echo "=== Migrating Videos ==="
# node video-migrator.cjs
diff --git a/public/authors/danielgruesso.jpeg b/public/authors/danielgruesso.jpeg
new file mode 100644
index 000000000..038f8d4d9
Binary files /dev/null and b/public/authors/danielgruesso.jpeg differ
diff --git a/public/authors/dmytrobol.png b/public/authors/dmytrobol.png
new file mode 100644
index 000000000..5bdc96cb8
Binary files /dev/null and b/public/authors/dmytrobol.png differ
diff --git a/public/authors/ebrahimbharmal007.png b/public/authors/ebrahimbharmal007.png
new file mode 100644
index 000000000..148e9f2be
Binary files /dev/null and b/public/authors/ebrahimbharmal007.png differ
diff --git a/public/authors/jesse.png b/public/authors/jesse.png
new file mode 100644
index 000000000..a02fc7972
Binary files /dev/null and b/public/authors/jesse.png differ
diff --git a/public/authors/kamran.jpeg b/public/authors/kamran.jpeg
new file mode 100644
index 000000000..a69fbeb89
Binary files /dev/null and b/public/authors/kamran.jpeg differ
diff --git a/public/authors/kamranahmedse.jpeg b/public/authors/kamranahmedse.jpeg
new file mode 100644
index 000000000..5c743b583
Binary files /dev/null and b/public/authors/kamranahmedse.jpeg differ
diff --git a/public/authors/lesovsky.jpeg b/public/authors/lesovsky.jpeg
new file mode 100644
index 000000000..c62c8b458
Binary files /dev/null and b/public/authors/lesovsky.jpeg differ
diff --git a/public/authors/spekulatius.jpg b/public/authors/spekulatius.jpg
new file mode 100644
index 000000000..9061fe242
Binary files /dev/null and b/public/authors/spekulatius.jpg differ
diff --git a/public/guides/asymptotic-notation.png b/public/guides/asymptotic-notation.png
new file mode 100644
index 000000000..8e7f17e53
Binary files /dev/null and b/public/guides/asymptotic-notation.png differ
diff --git a/public/guides/avoid-render-blocking-javascript-with-async-defer.png b/public/guides/avoid-render-blocking-javascript-with-async-defer.png
new file mode 100644
index 000000000..92354dd55
Binary files /dev/null and b/public/guides/avoid-render-blocking-javascript-with-async-defer.png differ
diff --git a/public/guides/bash-vs-shell.jpeg b/public/guides/bash-vs-shell.jpeg
new file mode 100644
index 000000000..b5ea28aef
Binary files /dev/null and b/public/guides/bash-vs-shell.jpeg differ
diff --git a/public/guides/basic-authentication.png b/public/guides/basic-authentication.png
new file mode 100644
index 000000000..7b8992571
Binary files /dev/null and b/public/guides/basic-authentication.png differ
diff --git a/public/guides/basic-authentication/chrome-basic-auth.png b/public/guides/basic-authentication/chrome-basic-auth.png
new file mode 100644
index 000000000..22f73f93e
Binary files /dev/null and b/public/guides/basic-authentication/chrome-basic-auth.png differ
diff --git a/public/guides/basic-authentication/safari-basic-auth.png b/public/guides/basic-authentication/safari-basic-auth.png
new file mode 100644
index 000000000..c3b04523d
Binary files /dev/null and b/public/guides/basic-authentication/safari-basic-auth.png differ
diff --git a/public/guides/big-o-notation.png b/public/guides/big-o-notation.png
new file mode 100644
index 000000000..1afe6efca
Binary files /dev/null and b/public/guides/big-o-notation.png differ
diff --git a/public/guides/character-encodings.png b/public/guides/character-encodings.png
new file mode 100644
index 000000000..961c4f085
Binary files /dev/null and b/public/guides/character-encodings.png differ
diff --git a/public/guides/ci-cd.png b/public/guides/ci-cd.png
new file mode 100644
index 000000000..ded525fae
Binary files /dev/null and b/public/guides/ci-cd.png differ
diff --git a/public/guides/dhcp.png b/public/guides/dhcp.png
new file mode 100644
index 000000000..360c8a9cc
Binary files /dev/null and b/public/guides/dhcp.png differ
diff --git a/public/guides/jwt-authentication.png b/public/guides/jwt-authentication.png
new file mode 100644
index 000000000..0e015e887
Binary files /dev/null and b/public/guides/jwt-authentication.png differ
diff --git a/public/guides/oauth.png b/public/guides/oauth.png
new file mode 100644
index 000000000..591fbf179
Binary files /dev/null and b/public/guides/oauth.png differ
diff --git a/public/guides/project-history.png b/public/guides/project-history.png
new file mode 100644
index 000000000..7ea6f87a0
Binary files /dev/null and b/public/guides/project-history.png differ
diff --git a/public/guides/proxy/forward-proxy.png b/public/guides/proxy/forward-proxy.png
new file mode 100644
index 000000000..f68a56e09
Binary files /dev/null and b/public/guides/proxy/forward-proxy.png differ
diff --git a/public/guides/proxy/proxy-example.png b/public/guides/proxy/proxy-example.png
new file mode 100644
index 000000000..11cf6edf4
Binary files /dev/null and b/public/guides/proxy/proxy-example.png differ
diff --git a/public/guides/proxy/reverse-proxy.png b/public/guides/proxy/reverse-proxy.png
new file mode 100644
index 000000000..95a0be4db
Binary files /dev/null and b/public/guides/proxy/reverse-proxy.png differ
diff --git a/public/guides/random-numbers.png b/public/guides/random-numbers.png
new file mode 100644
index 000000000..7a41a271e
Binary files /dev/null and b/public/guides/random-numbers.png differ
diff --git a/public/guides/scaling-databases.svg b/public/guides/scaling-databases.svg
new file mode 100644
index 000000000..855105dc9
--- /dev/null
+++ b/public/guides/scaling-databases.svg
@@ -0,0 +1,87 @@
+
diff --git a/public/guides/session-authentication.png b/public/guides/session-authentication.png
new file mode 100644
index 000000000..d35178077
Binary files /dev/null and b/public/guides/session-authentication.png differ
diff --git a/public/guides/sli-slo-sla.jpeg b/public/guides/sli-slo-sla.jpeg
new file mode 100644
index 000000000..0eec28167
Binary files /dev/null and b/public/guides/sli-slo-sla.jpeg differ
diff --git a/public/guides/ssl-tls-https-ssh.png b/public/guides/ssl-tls-https-ssh.png
new file mode 100644
index 000000000..4e997016c
Binary files /dev/null and b/public/guides/ssl-tls-https-ssh.png differ
diff --git a/public/guides/sso.png b/public/guides/sso.png
new file mode 100644
index 000000000..a5ef85f4f
Binary files /dev/null and b/public/guides/sso.png differ
diff --git a/public/guides/token-authentication.png b/public/guides/token-authentication.png
new file mode 100644
index 000000000..40eb86755
Binary files /dev/null and b/public/guides/token-authentication.png differ
diff --git a/public/guides/torrent-client/address.png b/public/guides/torrent-client/address.png
new file mode 100644
index 000000000..0a11fa5fc
Binary files /dev/null and b/public/guides/torrent-client/address.png differ
diff --git a/public/guides/torrent-client/bitfield.png b/public/guides/torrent-client/bitfield.png
new file mode 100644
index 000000000..cd4384281
Binary files /dev/null and b/public/guides/torrent-client/bitfield.png differ
diff --git a/public/guides/torrent-client/choke.png b/public/guides/torrent-client/choke.png
new file mode 100644
index 000000000..3c6d374e9
Binary files /dev/null and b/public/guides/torrent-client/choke.png differ
diff --git a/public/guides/torrent-client/client-server-p2p.png b/public/guides/torrent-client/client-server-p2p.png
new file mode 100644
index 000000000..a119bff9d
Binary files /dev/null and b/public/guides/torrent-client/client-server-p2p.png differ
diff --git a/public/guides/torrent-client/download.png b/public/guides/torrent-client/download.png
new file mode 100644
index 000000000..c5a8f86d0
Binary files /dev/null and b/public/guides/torrent-client/download.png differ
diff --git a/public/guides/torrent-client/handshake.png b/public/guides/torrent-client/handshake.png
new file mode 100644
index 000000000..262da0d9a
Binary files /dev/null and b/public/guides/torrent-client/handshake.png differ
diff --git a/public/guides/torrent-client/info-hash-peer-id.png b/public/guides/torrent-client/info-hash-peer-id.png
new file mode 100644
index 000000000..ad343bde3
Binary files /dev/null and b/public/guides/torrent-client/info-hash-peer-id.png differ
diff --git a/public/guides/torrent-client/info-hash.png b/public/guides/torrent-client/info-hash.png
new file mode 100644
index 000000000..1afeda969
Binary files /dev/null and b/public/guides/torrent-client/info-hash.png differ
diff --git a/public/guides/torrent-client/message.png b/public/guides/torrent-client/message.png
new file mode 100644
index 000000000..b70155a7c
Binary files /dev/null and b/public/guides/torrent-client/message.png differ
diff --git a/public/guides/torrent-client/pieces.png b/public/guides/torrent-client/pieces.png
new file mode 100644
index 000000000..efd22f321
Binary files /dev/null and b/public/guides/torrent-client/pieces.png differ
diff --git a/public/guides/torrent-client/pipelining.png b/public/guides/torrent-client/pipelining.png
new file mode 100644
index 000000000..bdfc029be
Binary files /dev/null and b/public/guides/torrent-client/pipelining.png differ
diff --git a/public/guides/torrent-client/trackers.png b/public/guides/torrent-client/trackers.png
new file mode 100644
index 000000000..8bbd6a84c
Binary files /dev/null and b/public/guides/torrent-client/trackers.png differ
diff --git a/public/guides/unfamiliar-codebase.png b/public/guides/unfamiliar-codebase.png
new file mode 100644
index 000000000..12e704966
Binary files /dev/null and b/public/guides/unfamiliar-codebase.png differ
diff --git a/public/guides/web-vitals.png b/public/guides/web-vitals.png
new file mode 100644
index 000000000..a50f7db40
Binary files /dev/null and b/public/guides/web-vitals.png differ
diff --git a/src/guides/asymptotic-notation.md b/src/guides/asymptotic-notation.md
new file mode 100644
index 000000000..20db33e39
--- /dev/null
+++ b/src/guides/asymptotic-notation.md
@@ -0,0 +1,26 @@
+---
+title: "Asymptotic Notation"
+description: "Learn the basics of measuring the time and space complexity of algorithms"
+author:
+ name: "Kamran Ahmed"
+ url: "https://twitter.com/kamranahmedse"
+ imageUrl: "/authors/kamranahmedse.jpeg"
+seo:
+ title: "Asymptotic Notation - roadmap.sh"
+ description: "Learn the basics of measuring the time and space complexity of algorithms"
+isNew: false
+type: "visual"
+date: 2021-04-03
+sitemap:
+ priority: 0.7
+ changefreq: "weekly"
+tags:
+ - "guide"
+ - "visual-guide"
+ - "guide-sitemap"
+---
+
+Asymptotic notation is the standard way of measuring the time and space that an algorithm will consume as the input grows. In one of my last guides, I covered "Big-O notation" and a lot of you asked for a similar one for Asymptotic notation. You can find the [previous guide here](/guides/big-o-notation).
+
+[![](/guides/asymptotic-notation.png)](/guides/asymptotic-notation.png)
+
diff --git a/src/guides/avoid-render-blocking-javascript-with-async-defer.md b/src/guides/avoid-render-blocking-javascript-with-async-defer.md
new file mode 100644
index 000000000..d1078f907
--- /dev/null
+++ b/src/guides/avoid-render-blocking-javascript-with-async-defer.md
@@ -0,0 +1,24 @@
+---
+title: "Async and Defer Script Loading"
+description: "Learn how to avoid render blocking JavaScript using async and defer scripts."
+author:
+ name: "Kamran Ahmed"
+ url: "https://twitter.com/kamranahmedse"
+ imageUrl: "/authors/kamranahmedse.jpeg"
+seo:
+ title: "Async and Defer Script Loading - roadmap.sh"
+ description: "Learn how to avoid render blocking JavaScript using async and defer scripts."
+isNew: false
+type: "visual"
+date: 2021-09-10
+sitemap:
+ priority: 0.7
+ changefreq: "weekly"
+tags:
+ - "guide"
+ - "visual-guide"
+ - "guide-sitemap"
+---
+
+[![](/guides/avoid-render-blocking-javascript-with-async-defer.png)](/guides/avoid-render-blocking-javascript-with-async-defer.png)
+
diff --git a/src/guides/basic-authentication.md b/src/guides/basic-authentication.md
new file mode 100644
index 000000000..4f35d5bc5
--- /dev/null
+++ b/src/guides/basic-authentication.md
@@ -0,0 +1,24 @@
+---
+title: "Basic Authentication"
+description: "Understand what is basic authentication and how it is implemented"
+author:
+ name: "Kamran Ahmed"
+ url: "https://twitter.com/kamranahmedse"
+ imageUrl: "/authors/kamranahmedse.jpeg"
+seo:
+ title: "Basic Authentication - roadmap.sh"
+ description: "Understand what is basic authentication and how it is implemented"
+isNew: false
+type: "visual"
+date: 2021-05-19
+sitemap:
+ priority: 0.7
+ changefreq: "weekly"
+tags:
+ - "guide"
+ - "visual-guide"
+ - "guide-sitemap"
+---
+
+[![](/guides/basic-authentication.png)](/guides/basic-authentication.png)
+
diff --git a/src/guides/basics-of-authentication.md b/src/guides/basics-of-authentication.md
new file mode 100644
index 000000000..244dcff81
--- /dev/null
+++ b/src/guides/basics-of-authentication.md
@@ -0,0 +1,105 @@
+---
+title: "Basics of Authentication"
+description: "Learn the basics of Authentication and Authorization"
+author:
+ name: "Kamran Ahmed"
+ url: "https://twitter.com/kamranahmedse"
+ imageUrl: "/authors/kamranahmedse.jpeg"
+seo:
+ title: "Basics of Authentication - roadmap.sh"
+ description: "Learn the basics of Authentication and Authorization"
+isNew: false
+type: "textual"
+date: 2022-09-21
+sitemap:
+ priority: 0.7
+ changefreq: "weekly"
+tags:
+ - "guide"
+ - "textual-guide"
+ - "guide-sitemap"
+---
+
+Our last video series was about data structures. We looked at the most common data structures, their use cases, pros and cons, and the different operations you could perform on each data structure.
+
+Today, we are kicking off a similar series for Authentication strategies where we will discuss everything you need to know about authentication and authentication strategies.
+
+In this guide today will be talking about what authentication is, and we will cover some terminology that will help us later in the series. You can watch the video below or continue reading this guide.
+
+
+
+## What is Authentication?
+
+Authentication is the process of verifying someone's identity. A real-world example of that would be when you board a plane, the airline worker checks your passport to verify your identity, so the airport worker authenticates you.
+
+If we talk about computers, when you log in to any website, you usually authenticate yourself by entering your username and password, which is then checked by the website to ensure that you are who you claim to be. There are two things you should keep in mind:
+
+- Authentication is not only for the persons
+- And username and password are not the only way to authenticate.
+
+Some other examples are:
+
+- When you open a website in the browser. If the website uses HTTP, TLS is used to authenticate the server and avoid the fake loading of websites.
+
+- There might be server-to-server communication on the website. The server may need to authenticate the incoming request to avoid malicious usage.
+
+## How does Authentication Work?
+
+On a high level, we have the following factors used for authentication.
+
+- **Username and Password**
+- **Security Codes, Pin Codes, or Security Questions** — An example would be the pin code you enter at an ATM to withdraw cash.
+- **Hard Tokens and Soft Tokens** — Hard tokens are the special hardware devices that you attach to your device to authenticate yourself. Soft tokens, unlike hard tokens, don't have any authentication-specific device; we must verify the possession of a device that was used to set up the identity. For example, you may receive an OTP to log in to your account on a website.
+- **Biometric Authentication** — In biometric authentication, we authenticate using biometrics such as iris, facial, or voice recognition.
+
+We can categorize the factors above into three different types.
+
+- Username / Password and Security codes rely on the person's knowledge: we can group them under the **Knowledge Factor**.
+
+- In hard and soft tokens, we authenticate by checking the possession of hardware, so this would be a **Possession Factor**.
+
+- And in biometrics, we test the person's inherent qualities, i.e., iris, face, or voice, so this would be a **Qualities** factor.
+
+This brings us to our next topic: Multi-factor Authentication and Two-Factor Authentication.
+
+## Multifactor Authentication
+
+Multifactor authentication is the type of authentication in which we rely on more than one factor to authenticate a user.
+
+For example, if we pick up username/password from the **knowledge factor**. And we pick soft tokens from the **possession factor**, and we say that for a user to authenticate, they must enter their credentials and an OTP, which will be sent to their mobile phone, so this would be an example of multifactor authentication.
+
+In multifactor authentication, since we rely on more than one factor, this way of authentication is much more secure than single-factor authentication.
+
+One important thing to note here is that the factors you pick for authentication, they must differ. So, for example, if we pick up a username/password and security question or security codes, it is still not true multifactor authentication because we still rely on the knowledge factor. The factors have to be different from each other.
+
+### Two-Factor Authentication
+
+Two-factor authentication is similar to multifactor authentication. The only difference is that there are precisely two factors in 2FA. In MFA, we can have 2, 3, 4, or any authentication factors; 2FA has exactly two factors. We can say that 2FA is always MFA, because there are more than one factors. MFA is not always 2FA because there may be more than two factors involved.
+
+Next we have the difference between authentication and authorization. This comes up a lot in the interviews, and beginners often confuse them.
+
+### What is Authentication
+Authentication is the process of verifying the identity. For example, when you enter your credentials at a login screen, the application here identifies you through your credentials. So this is what the authentication is, the process of verifying the identity.
+
+In case of an authentication failure, for example, if you enter an invalid username and password, the HTTP response code is "Unauthorized" 401.
+
+### What is Authorization
+
+Authorization is the process of checking permission. Once the user has logged in, i.e., the user has been authenticated, the process of reviewing the permission to see if the user can perform the relevant operation or not is called authorization.
+
+And in case of authorization failure, i.e., if the user tries to perform an operation they are not allowed to perform, the HTTP response code is forbidden 403.
+
+## Authentication Strategies
+
+Given below is the list of common authentication strategies:
+
+- Basics of Authentication
+- Session Based Authentication
+- Token-Based Authentication
+- JWT Authentication
+- OAuth - Open Authorization
+- Single Sign On (SSO)
+
+In this series of illustrated videos and textual guides, we will be going through each of the strategies discussing what they are, how they are implemented, the pros and cons and so on.
+
+So stay tuned, and I will see you in the next one.
diff --git a/src/guides/big-o-notation.md b/src/guides/big-o-notation.md
new file mode 100644
index 000000000..ee704e732
--- /dev/null
+++ b/src/guides/big-o-notation.md
@@ -0,0 +1,26 @@
+---
+title: "Big-O Notation"
+description: "Easy to understand explanation of Big-O notation without any fancy terms"
+author:
+ name: "Kamran Ahmed"
+ url: "https://twitter.com/kamranahmedse"
+ imageUrl: "/authors/kamranahmedse.jpeg"
+seo:
+ title: "Big-O Notation - roadmap.sh"
+ description: "Easy to understand explanation of Big-O notation without any fancy terms"
+isNew: false
+type: "visual"
+date: 2021-03-15
+sitemap:
+ priority: 0.7
+ changefreq: "weekly"
+tags:
+ - "guide"
+ - "visual-guide"
+ - "guide-sitemap"
+---
+
+Big-O notation is the mathematical notation that helps analyse the algorithms to get an idea about how they might perform as the input grows. The image below explains Big-O in a simple way without using any fancy terminology.
+
+[![](/guides/big-o-notation.png)](/guides/big-o-notation.png)
+
diff --git a/src/guides/character-encodings.md b/src/guides/character-encodings.md
new file mode 100644
index 000000000..98046473a
--- /dev/null
+++ b/src/guides/character-encodings.md
@@ -0,0 +1,24 @@
+---
+title: "Character Encodings"
+description: "Covers the basics of character encodings and explains ASCII vs Unicode"
+author:
+ name: "Kamran Ahmed"
+ url: "https://twitter.com/kamranahmedse"
+ imageUrl: "/authors/kamranahmedse.jpeg"
+seo:
+ title: "Character Encodings - roadmap.sh"
+ description: "Covers the basics of character encodings and explains ASCII vs Unicode"
+isNew: false
+type: "visual"
+date: 2021-05-14
+sitemap:
+ priority: 0.7
+ changefreq: "weekly"
+tags:
+ - "guide"
+ - "visual-guide"
+ - "guide-sitemap"
+---
+
+[![](/guides/character-encodings.png)](/guides/character-encodings.png)
+
diff --git a/src/guides/ci-cd.md b/src/guides/ci-cd.md
new file mode 100644
index 000000000..fcf7b3d94
--- /dev/null
+++ b/src/guides/ci-cd.md
@@ -0,0 +1,26 @@
+---
+title: "What is CI and CD?"
+description: "Learn the basics of CI/CD and how to implement that with GitHub Actions."
+author:
+ name: "Kamran Ahmed"
+ url: "https://twitter.com/kamranahmedse"
+ imageUrl: "/authors/kamranahmedse.jpeg"
+seo:
+ title: "What is CI and CD? - roadmap.sh"
+ description: "Learn the basics of CI/CD and how to implement that with GitHub Actions."
+isNew: false
+type: "visual"
+date: 2021-07-09
+sitemap:
+ priority: 0.7
+ changefreq: "weekly"
+tags:
+ - "guide"
+ - "visual-guide"
+ - "guide-sitemap"
+---
+
+The image below details the differences between the continuous integration and continuous delivery. Also, here is the [accompanying video on implementing that with GitHub actions](https://www.youtube.com/watch?v=nyKZTKQS_EQ).
+
+[![](/guides/ci-cd.png)](/guides/ci-cd.png)
+
diff --git a/src/guides/design-patterns-for-humans.md b/src/guides/design-patterns-for-humans.md
new file mode 100644
index 000000000..2e2cbd2c7
--- /dev/null
+++ b/src/guides/design-patterns-for-humans.md
@@ -0,0 +1,2291 @@
+---
+title: "Design Patterns for Humans"
+description: "A language agnostic, ultra-simplified explanation to design patterns"
+author:
+ name: "Kamran Ahmed"
+ url: "https://twitter.com/kamranahmedse"
+ imageUrl: "/authors/kamranahmedse.jpeg"
+seo:
+ title: "Design Patterns for Humans - roadmap.sh"
+ description: "A language agnostic, ultra-simplified explanation to design patterns"
+isNew: false
+type: "textual"
+date: 2019-01-23
+sitemap:
+ priority: 0.7
+ changefreq: "weekly"
+tags:
+ - "guide"
+ - "textual-guide"
+ - "guide-sitemap"
+---
+
+Design patterns are solutions to recurring problems; **guidelines on how to tackle certain problems**. They are not classes, packages or libraries that you can plug into your application and wait for the magic to happen. These are, rather, guidelines on how to tackle certain problems in certain situations.
+
+> Design patterns are solutions to recurring problems; guidelines on how to tackle certain problems
+
+Wikipedia describes them as
+
+> In software engineering, a software design pattern is a general reusable solution to a commonly occurring problem within a given context in software design. It is not a finished design that can be transformed directly into source or machine code. It is a description or template for how to solve a problem that can be used in many different situations.
+
+## Be Careful
+
+Developers, mostly beginners, make the mistake of over-thinking and forcing the design patterns which results in a horrible un-maintainable mess. The rule of thumb is to keep the codebase as simple as possible, once you start developing, you will start to see the patterns repeating in the codebase in which case you can go ahead and implement the relevant design patterns.
+
+- Design patterns are not a silver bullet to all your problems.
+- Do not try to force them; bad things are supposed to happen, if done so.
+- Keep in mind that design patterns are solutions **to** problems, not solutions **finding** problems; so don't overthink.
+- If used in a correct place in a correct manner, they can prove to be a savior; or else they can result in a horrible mess of a code.
+
+> Also note that the code samples below are in PHP-7, however this shouldn't stop you because the concepts are same anyways.
+
+## Types of Design Patterns
+
+This guide is about Gang of Four (GoF) design patterns, which refers to the four authors of [the book which introduced these design patterns](https://en.wikipedia.org/wiki/Design_Patterns). There are three types of design patterns:
+
+* [Creational](#creational-design-patterns)
+* [Structural](#structural-design-patterns)
+* [Behavioral](#behavioral-design-patterns)
+
+## Creational Design Patterns
+
+In plain words
+> Creational patterns are focused towards how to instantiate an object or group of related objects.
+
+Wikipedia says
+> In software engineering, creational design patterns are design patterns that deal with object creation mechanisms, trying to create objects in a manner suitable to the situation. The basic form of object creation could result in design problems or added complexity to the design. Creational design patterns solve this problem by somehow controlling this object creation.
+
+There are 6 types of Creational patterns
+
+ * [Simple Factory](#-simple-factory)
+ * [Factory Method](#-factory-method)
+ * [Abstract Factory](#-abstract-factory)
+ * [Builder](#-builder)
+ * [Prototype](#-prototype)
+ * [Singleton](#-singleton)
+
+🏠 Simple Factory
+--------------
+Real world example
+> Consider, you are building a house and you need doors. You can either put on your carpenter clothes, bring some wood, glue, nails and all the tools required to build the door and start building it in your house or you can simply call the factory and get the built door delivered to you so that you don't need to learn anything about the door making or to deal with the mess that comes with making it.
+
+In plain words
+> Simple factory simply generates an instance for client without exposing any instantiation logic to the client
+
+Wikipedia says
+> In object-oriented programming (OOP), a factory is an object for creating other objects – formally a factory is a function or method that returns objects of a varying prototype or class from some method call, which is assumed to be "new".
+
+**Programmatic Example**
+
+First of all we have a door interface and the implementation
+```php
+interface Door
+{
+ public function getWidth(): float;
+ public function getHeight(): float;
+}
+
+class WoodenDoor implements Door
+{
+ protected $width;
+ protected $height;
+
+ public function __construct(float $width, float $height)
+ {
+ $this->width = $width;
+ $this->height = $height;
+ }
+
+ public function getWidth(): float
+ {
+ return $this->width;
+ }
+
+ public function getHeight(): float
+ {
+ return $this->height;
+ }
+}
+```
+Then we have our door factory that makes the door and returns it
+```php
+class DoorFactory
+{
+ public static function makeDoor($width, $height): Door
+ {
+ return new WoodenDoor($width, $height);
+ }
+}
+```
+And then it can be used as
+```php
+// Make me a door of 100x200
+$door = DoorFactory::makeDoor(100, 200);
+
+echo 'Width: ' . $door->getWidth();
+echo 'Height: ' . $door->getHeight();
+
+// Make me a door of 50x100
+$door2 = DoorFactory::makeDoor(50, 100);
+```
+
+**When to Use?**
+
+When creating an object is not just a few assignments and involves some logic, it makes sense to put it in a dedicated factory instead of repeating the same code everywhere.
+
+🏭 Factory Method
+--------------
+
+Real world example
+> Consider the case of a hiring manager. It is impossible for one person to interview for each of the positions. Based on the job opening, she has to decide and delegate the interview steps to different people.
+
+In plain words
+> It provides a way to delegate the instantiation logic to child classes.
+
+Wikipedia says
+> In class-based programming, the factory method pattern is a creational pattern that uses factory methods to deal with the problem of creating objects without having to specify the exact class of the object that will be created. This is done by creating objects by calling a factory method—either specified in an interface and implemented by child classes, or implemented in a base class and optionally overridden by derived classes—rather than by calling a constructor.
+
+ **Programmatic Example**
+
+Taking our hiring manager example above. First of all we have an interviewer interface and some implementations for it
+
+```php
+interface Interviewer
+{
+ public function askQuestions();
+}
+
+class Developer implements Interviewer
+{
+ public function askQuestions()
+ {
+ echo 'Asking about design patterns!';
+ }
+}
+
+class CommunityExecutive implements Interviewer
+{
+ public function askQuestions()
+ {
+ echo 'Asking about community building';
+ }
+}
+```
+
+Now let us create our `HiringManager`
+
+```php
+abstract class HiringManager
+{
+
+ // Factory method
+ abstract protected function makeInterviewer(): Interviewer;
+
+ public function takeInterview()
+ {
+ $interviewer = $this->makeInterviewer();
+ $interviewer->askQuestions();
+ }
+}
+
+```
+Now any child can extend it and provide the required interviewer
+```php
+class DevelopmentManager extends HiringManager
+{
+ protected function makeInterviewer(): Interviewer
+ {
+ return new Developer();
+ }
+}
+
+class MarketingManager extends HiringManager
+{
+ protected function makeInterviewer(): Interviewer
+ {
+ return new CommunityExecutive();
+ }
+}
+```
+and then it can be used as
+
+```php
+$devManager = new DevelopmentManager();
+$devManager->takeInterview(); // Output: Asking about design patterns
+
+$marketingManager = new MarketingManager();
+$marketingManager->takeInterview(); // Output: Asking about community building.
+```
+
+**When to use?**
+
+Useful when there is some generic processing in a class but the required sub-class is dynamically decided at runtime. Or putting it in other words, when the client doesn't know what exact sub-class it might need.
+
+🔨 Abstract Factory
+----------------
+
+Real world example
+> Extending our door example from Simple Factory. Based on your needs you might get a wooden door from a wooden door shop, iron door from an iron shop or a PVC door from the relevant shop. Plus you might need a guy with different kind of specialities to fit the door, for example a carpenter for wooden door, welder for iron door etc. As you can see there is a dependency between the doors now, wooden door needs carpenter, iron door needs a welder etc.
+
+In plain words
+> A factory of factories; a factory that groups the individual but related/dependent factories together without specifying their concrete classes.
+
+Wikipedia says
+> The abstract factory pattern provides a way to encapsulate a group of individual factories that have a common theme without specifying their concrete classes
+
+**Programmatic Example**
+
+Translating the door example above. First of all we have our `Door` interface and some implementation for it
+
+```php
+interface Door
+{
+ public function getDescription();
+}
+
+class WoodenDoor implements Door
+{
+ public function getDescription()
+ {
+ echo 'I am a wooden door';
+ }
+}
+
+class IronDoor implements Door
+{
+ public function getDescription()
+ {
+ echo 'I am an iron door';
+ }
+}
+```
+Then we have some fitting experts for each door type
+
+```php
+interface DoorFittingExpert
+{
+ public function getDescription();
+}
+
+class Welder implements DoorFittingExpert
+{
+ public function getDescription()
+ {
+ echo 'I can only fit iron doors';
+ }
+}
+
+class Carpenter implements DoorFittingExpert
+{
+ public function getDescription()
+ {
+ echo 'I can only fit wooden doors';
+ }
+}
+```
+
+Now we have our abstract factory that would let us make family of related objects i.e. wooden door factory would create a wooden door and wooden door fitting expert and iron door factory would create an iron door and iron door fitting expert
+```php
+interface DoorFactory
+{
+ public function makeDoor(): Door;
+ public function makeFittingExpert(): DoorFittingExpert;
+}
+
+// Wooden factory to return carpenter and wooden door
+class WoodenDoorFactory implements DoorFactory
+{
+ public function makeDoor(): Door
+ {
+ return new WoodenDoor();
+ }
+
+ public function makeFittingExpert(): DoorFittingExpert
+ {
+ return new Carpenter();
+ }
+}
+
+// Iron door factory to get iron door and the relevant fitting expert
+class IronDoorFactory implements DoorFactory
+{
+ public function makeDoor(): Door
+ {
+ return new IronDoor();
+ }
+
+ public function makeFittingExpert(): DoorFittingExpert
+ {
+ return new Welder();
+ }
+}
+```
+And then it can be used as
+```php
+$woodenFactory = new WoodenDoorFactory();
+
+$door = $woodenFactory->makeDoor();
+$expert = $woodenFactory->makeFittingExpert();
+
+$door->getDescription(); // Output: I am a wooden door
+$expert->getDescription(); // Output: I can only fit wooden doors
+
+// Same for Iron Factory
+$ironFactory = new IronDoorFactory();
+
+$door = $ironFactory->makeDoor();
+$expert = $ironFactory->makeFittingExpert();
+
+$door->getDescription(); // Output: I am an iron door
+$expert->getDescription(); // Output: I can only fit iron doors
+```
+
+As you can see the wooden door factory has encapsulated the `carpenter` and the `wooden door` also iron door factory has encapsulated the `iron door` and `welder`. And thus it had helped us make sure that for each of the created door, we do not get a wrong fitting expert.
+
+**When to use?**
+
+When there are interrelated dependencies with not-that-simple creation logic involved
+
+## 👷 Builder
+Real world example
+> Imagine you are at Hardee's and you order a specific deal, lets say, "Big Hardee" and they hand it over to you without *any questions*; this is the example of simple factory. But there are cases when the creation logic might involve more steps. For example you want a customized Subway deal, you have several options in how your burger is made e.g what bread do you want? what types of sauces would you like? What cheese would you want? etc. In such cases builder pattern comes to the rescue.
+
+In plain words
+> Allows you to create different flavors of an object while avoiding constructor pollution. Useful when there could be several flavors of an object. Or when there are a lot of steps involved in creation of an object.
+
+Wikipedia says
+> The builder pattern is an object creation software design pattern with the intentions of finding a solution to the telescoping constructor anti-pattern.
+
+Having said that let me add a bit about what telescoping constructor anti-pattern is. At one point or the other we have all seen a constructor like below:
+
+```php
+public function __construct($size, $cheese = true, $pepperoni = true, $tomato = false, $lettuce = true)
+{
+}
+```
+
+As you can see; the number of constructor parameters can quickly get out of hand and it might become difficult to understand the arrangement of parameters. Plus this parameter list could keep on growing if you would want to add more options in future. This is called telescoping constructor anti-pattern.
+
+**Programmatic Example**
+
+The sane alternative is to use the builder pattern. First of all we have our burger that we want to make
+
+```php
+class Burger
+{
+ protected $size;
+
+ protected $cheese = false;
+ protected $pepperoni = false;
+ protected $lettuce = false;
+ protected $tomato = false;
+
+ public function __construct(BurgerBuilder $builder)
+ {
+ $this->size = $builder->size;
+ $this->cheese = $builder->cheese;
+ $this->pepperoni = $builder->pepperoni;
+ $this->lettuce = $builder->lettuce;
+ $this->tomato = $builder->tomato;
+ }
+}
+```
+
+And then we have the builder
+
+```php
+class BurgerBuilder
+{
+ public $size;
+
+ public $cheese = false;
+ public $pepperoni = false;
+ public $lettuce = false;
+ public $tomato = false;
+
+ public function __construct(int $size)
+ {
+ $this->size = $size;
+ }
+
+ public function addPepperoni()
+ {
+ $this->pepperoni = true;
+ return $this;
+ }
+
+ public function addLettuce()
+ {
+ $this->lettuce = true;
+ return $this;
+ }
+
+ public function addCheese()
+ {
+ $this->cheese = true;
+ return $this;
+ }
+
+ public function addTomato()
+ {
+ $this->tomato = true;
+ return $this;
+ }
+
+ public function build(): Burger
+ {
+ return new Burger($this);
+ }
+}
+```
+And then it can be used as:
+
+```php
+$burger = (new BurgerBuilder(14))
+ ->addPepperoni()
+ ->addLettuce()
+ ->addTomato()
+ ->build();
+```
+
+**When to use?**
+
+When there could be several flavors of an object and to avoid the constructor telescoping. The key difference from the factory pattern is that; factory pattern is to be used when the creation is a one step process while builder pattern is to be used when the creation is a multi step process.
+
+🐑 Prototype
+------------
+Real world example
+> Remember dolly? The sheep that was cloned! Lets not get into the details but the key point here is that it is all about cloning
+
+In plain words
+> Create object based on an existing object through cloning.
+
+Wikipedia says
+> The prototype pattern is a creational design pattern in software development. It is used when the type of objects to create is determined by a prototypical instance, which is cloned to produce new objects.
+
+In short, it allows you to create a copy of an existing object and modify it to your needs, instead of going through the trouble of creating an object from scratch and setting it up.
+
+**Programmatic Example**
+
+In PHP, it can be easily done using `clone`
+
+```php
+class Sheep
+{
+ protected $name;
+ protected $category;
+
+ public function __construct(string $name, string $category = 'Mountain Sheep')
+ {
+ $this->name = $name;
+ $this->category = $category;
+ }
+
+ public function setName(string $name)
+ {
+ $this->name = $name;
+ }
+
+ public function getName()
+ {
+ return $this->name;
+ }
+
+ public function setCategory(string $category)
+ {
+ $this->category = $category;
+ }
+
+ public function getCategory()
+ {
+ return $this->category;
+ }
+}
+```
+Then it can be cloned like below
+```php
+$original = new Sheep('Jolly');
+echo $original->getName(); // Jolly
+echo $original->getCategory(); // Mountain Sheep
+
+// Clone and modify what is required
+$cloned = clone $original;
+$cloned->setName('Dolly');
+echo $cloned->getName(); // Dolly
+echo $cloned->getCategory(); // Mountain sheep
+```
+
+Also you could use the magic method `__clone` to modify the cloning behavior.
+
+**When to use?**
+
+When an object is required that is similar to existing object or when the creation would be expensive as compared to cloning.
+
+💍 Singleton
+------------
+Real world example
+> There can only be one president of a country at a time. The same president has to be brought to action, whenever duty calls. President here is singleton.
+
+In plain words
+> Ensures that only one object of a particular class is ever created.
+
+Wikipedia says
+> In software engineering, the singleton pattern is a software design pattern that restricts the instantiation of a class to one object. This is useful when exactly one object is needed to coordinate actions across the system.
+
+Singleton pattern is actually considered an anti-pattern and overuse of it should be avoided. It is not necessarily bad and could have some valid use-cases but should be used with caution because it introduces a global state in your application and change to it in one place could affect in the other areas and it could become pretty difficult to debug. The other bad thing about them is it makes your code tightly coupled plus mocking the singleton could be difficult.
+
+**Programmatic Example**
+
+To create a singleton, make the constructor private, disable cloning, disable extension and create a static variable to house the instance
+```php
+final class President
+{
+ private static $instance;
+
+ private function __construct()
+ {
+ // Hide the constructor
+ }
+
+ public static function getInstance(): President
+ {
+ if (!self::$instance) {
+ self::$instance = new self();
+ }
+
+ return self::$instance;
+ }
+
+ private function __clone()
+ {
+ // Disable cloning
+ }
+
+ private function __wakeup()
+ {
+ // Disable unserialize
+ }
+}
+```
+Then in order to use
+```php
+$president1 = President::getInstance();
+$president2 = President::getInstance();
+
+var_dump($president1 === $president2); // true
+```
+
+## Structural Design Patterns
+In plain words
+> Structural patterns are mostly concerned with object composition or in other words how the entities can use each other. Or yet another explanation would be, they help in answering "How to build a software component?"
+
+Wikipedia says
+> In software engineering, structural design patterns are design patterns that ease the design by identifying a simple way to realize relationships between entities.
+
+There are 7 types of structural patterns
+
+ * [Adapter](#-adapter)
+ * [Bridge](#-bridge)
+ * [Composite](#-composite)
+ * [Decorator](#-decorator)
+ * [Facade](#-facade)
+ * [Flyweight](#-flyweight)
+ * [Proxy](#-proxy)
+
+🔌 Adapter
+-------
+Real world example
+> Consider that you have some pictures in your memory card and you need to transfer them to your computer. In order to transfer them you need some kind of adapter that is compatible with your computer ports so that you can attach memory card to your computer. In this case card reader is an adapter.
+> Another example would be the famous power adapter; a three legged plug can't be connected to a two pronged outlet, it needs to use a power adapter that makes it compatible with the two pronged outlet.
+> Yet another example would be a translator translating words spoken by one person to another
+
+In plain words
+> Adapter pattern lets you wrap an otherwise incompatible object in an adapter to make it compatible with another class.
+
+Wikipedia says
+> In software engineering, the adapter pattern is a software design pattern that allows the interface of an existing class to be used as another interface. It is often used to make existing classes work with others without modifying their source code.
+
+**Programmatic Example**
+
+Consider a game where there is a hunter and he hunts lions.
+
+First we have an interface `Lion` that all types of lions have to implement
+
+```php
+interface Lion
+{
+ public function roar();
+}
+
+class AfricanLion implements Lion
+{
+ public function roar()
+ {
+ }
+}
+
+class AsianLion implements Lion
+{
+ public function roar()
+ {
+ }
+}
+```
+And hunter expects any implementation of `Lion` interface to hunt.
+```php
+class Hunter
+{
+ public function hunt(Lion $lion)
+ {
+ $lion->roar();
+ }
+}
+```
+
+Now let's say we have to add a `WildDog` in our game so that hunter can hunt that also. But we can't do that directly because dog has a different interface. To make it compatible for our hunter, we will have to create an adapter that is compatible
+
+```php
+// This needs to be added to the game
+class WildDog
+{
+ public function bark()
+ {
+ }
+}
+
+// Adapter around wild dog to make it compatible with our game
+class WildDogAdapter implements Lion
+{
+ protected $dog;
+
+ public function __construct(WildDog $dog)
+ {
+ $this->dog = $dog;
+ }
+
+ public function roar()
+ {
+ $this->dog->bark();
+ }
+}
+```
+And now the `WildDog` can be used in our game using `WildDogAdapter`.
+
+```php
+$wildDog = new WildDog();
+$wildDogAdapter = new WildDogAdapter($wildDog);
+
+$hunter = new Hunter();
+$hunter->hunt($wildDogAdapter);
+```
+
+🚡 Bridge
+------
+Real world example
+> Consider you have a website with different pages and you are supposed to allow the user to change the theme. What would you do? Create multiple copies of each of the pages for each of the themes or would you just create separate theme and load them based on the user's preferences? Bridge pattern allows you to do the second i.e.
+
+![With and without the bridge pattern](https://cloud.githubusercontent.com/assets/11269635/23065293/33b7aea0-f515-11e6-983f-98823c9845ee.png)
+
+In Plain Words
+> Bridge pattern is about preferring composition over inheritance. Implementation details are pushed from a hierarchy to another object with a separate hierarchy.
+
+Wikipedia says
+> The bridge pattern is a design pattern used in software engineering that is meant to "decouple an abstraction from its implementation so that the two can vary independently"
+
+**Programmatic Example**
+
+Translating our WebPage example from above. Here we have the `WebPage` hierarchy
+
+```php
+interface WebPage
+{
+ public function __construct(Theme $theme);
+ public function getContent();
+}
+
+class About implements WebPage
+{
+ protected $theme;
+
+ public function __construct(Theme $theme)
+ {
+ $this->theme = $theme;
+ }
+
+ public function getContent()
+ {
+ return "About page in " . $this->theme->getColor();
+ }
+}
+
+class Careers implements WebPage
+{
+ protected $theme;
+
+ public function __construct(Theme $theme)
+ {
+ $this->theme = $theme;
+ }
+
+ public function getContent()
+ {
+ return "Careers page in " . $this->theme->getColor();
+ }
+}
+```
+And the separate theme hierarchy
+```php
+
+interface Theme
+{
+ public function getColor();
+}
+
+class DarkTheme implements Theme
+{
+ public function getColor()
+ {
+ return 'Dark Black';
+ }
+}
+class LightTheme implements Theme
+{
+ public function getColor()
+ {
+ return 'Off white';
+ }
+}
+class AquaTheme implements Theme
+{
+ public function getColor()
+ {
+ return 'Light blue';
+ }
+}
+```
+And both the hierarchies
+```php
+$darkTheme = new DarkTheme();
+
+$about = new About($darkTheme);
+$careers = new Careers($darkTheme);
+
+echo $about->getContent(); // "About page in Dark Black";
+echo $careers->getContent(); // "Careers page in Dark Black";
+```
+
+## 🌿 Composite
+
+Real world example
+> Every organization is composed of employees. Each of the employees has the same features i.e. has a salary, has some responsibilities, may or may not report to someone, may or may not have some subordinates etc.
+
+In plain words
+> Composite pattern lets clients treat the individual objects in a uniform manner.
+
+Wikipedia says
+> In software engineering, the composite pattern is a partitioning design pattern. The composite pattern describes that a group of objects is to be treated in the same way as a single instance of an object. The intent of a composite is to "compose" objects into tree structures to represent part-whole hierarchies. Implementing the composite pattern lets clients treat individual objects and compositions uniformly.
+
+**Programmatic Example**
+
+Taking our employees example from above. Here we have different employee types
+
+```php
+interface Employee
+{
+ public function __construct(string $name, float $salary);
+ public function getName(): string;
+ public function setSalary(float $salary);
+ public function getSalary(): float;
+ public function getRoles(): array;
+}
+
+class Developer implements Employee
+{
+ protected $salary;
+ protected $name;
+ protected $roles;
+
+ public function __construct(string $name, float $salary)
+ {
+ $this->name = $name;
+ $this->salary = $salary;
+ }
+
+ public function getName(): string
+ {
+ return $this->name;
+ }
+
+ public function setSalary(float $salary)
+ {
+ $this->salary = $salary;
+ }
+
+ public function getSalary(): float
+ {
+ return $this->salary;
+ }
+
+ public function getRoles(): array
+ {
+ return $this->roles;
+ }
+}
+
+class Designer implements Employee
+{
+ protected $salary;
+ protected $name;
+ protected $roles;
+
+ public function __construct(string $name, float $salary)
+ {
+ $this->name = $name;
+ $this->salary = $salary;
+ }
+
+ public function getName(): string
+ {
+ return $this->name;
+ }
+
+ public function setSalary(float $salary)
+ {
+ $this->salary = $salary;
+ }
+
+ public function getSalary(): float
+ {
+ return $this->salary;
+ }
+
+ public function getRoles(): array
+ {
+ return $this->roles;
+ }
+}
+```
+
+Then we have an organization which consists of several different types of employees
+
+```php
+class Organization
+{
+ protected $employees;
+
+ public function addEmployee(Employee $employee)
+ {
+ $this->employees[] = $employee;
+ }
+
+ public function getNetSalaries(): float
+ {
+ $netSalary = 0;
+
+ foreach ($this->employees as $employee) {
+ $netSalary += $employee->getSalary();
+ }
+
+ return $netSalary;
+ }
+}
+```
+
+And then it can be used as
+
+```php
+// Prepare the employees
+$john = new Developer('John Doe', 12000);
+$jane = new Designer('Jane Doe', 15000);
+
+// Add them to organization
+$organization = new Organization();
+$organization->addEmployee($john);
+$organization->addEmployee($jane);
+
+echo "Net salaries: " . $organization->getNetSalaries(); // Net Salaries: 27000
+```
+
+☕ Decorator
+-------------
+
+Real world example
+
+> Imagine you run a car service shop offering multiple services. Now how do you calculate the bill to be charged? You pick one service and dynamically keep adding to it the prices for the provided services till you get the final cost. Here each type of service is a decorator.
+
+In plain words
+> Decorator pattern lets you dynamically change the behavior of an object at run time by wrapping them in an object of a decorator class.
+
+Wikipedia says
+> In object-oriented programming, the decorator pattern is a design pattern that allows behavior to be added to an individual object, either statically or dynamically, without affecting the behavior of other objects from the same class. The decorator pattern is often useful for adhering to the Single Responsibility Principle, as it allows functionality to be divided between classes with unique areas of concern.
+
+**Programmatic Example**
+
+Lets take coffee for example. First of all we have a simple coffee implementing the coffee interface
+
+```php
+interface Coffee
+{
+ public function getCost();
+ public function getDescription();
+}
+
+class SimpleCoffee implements Coffee
+{
+ public function getCost()
+ {
+ return 10;
+ }
+
+ public function getDescription()
+ {
+ return 'Simple coffee';
+ }
+}
+```
+We want to make the code extensible to allow options to modify it if required. Lets make some add-ons (decorators)
+```php
+class MilkCoffee implements Coffee
+{
+ protected $coffee;
+
+ public function __construct(Coffee $coffee)
+ {
+ $this->coffee = $coffee;
+ }
+
+ public function getCost()
+ {
+ return $this->coffee->getCost() + 2;
+ }
+
+ public function getDescription()
+ {
+ return $this->coffee->getDescription() . ', milk';
+ }
+}
+
+class WhipCoffee implements Coffee
+{
+ protected $coffee;
+
+ public function __construct(Coffee $coffee)
+ {
+ $this->coffee = $coffee;
+ }
+
+ public function getCost()
+ {
+ return $this->coffee->getCost() + 5;
+ }
+
+ public function getDescription()
+ {
+ return $this->coffee->getDescription() . ', whip';
+ }
+}
+
+class VanillaCoffee implements Coffee
+{
+ protected $coffee;
+
+ public function __construct(Coffee $coffee)
+ {
+ $this->coffee = $coffee;
+ }
+
+ public function getCost()
+ {
+ return $this->coffee->getCost() + 3;
+ }
+
+ public function getDescription()
+ {
+ return $this->coffee->getDescription() . ', vanilla';
+ }
+}
+```
+
+Lets make a coffee now
+
+```php
+$someCoffee = new SimpleCoffee();
+echo $someCoffee->getCost(); // 10
+echo $someCoffee->getDescription(); // Simple Coffee
+
+$someCoffee = new MilkCoffee($someCoffee);
+echo $someCoffee->getCost(); // 12
+echo $someCoffee->getDescription(); // Simple Coffee, milk
+
+$someCoffee = new WhipCoffee($someCoffee);
+echo $someCoffee->getCost(); // 17
+echo $someCoffee->getDescription(); // Simple Coffee, milk, whip
+
+$someCoffee = new VanillaCoffee($someCoffee);
+echo $someCoffee->getCost(); // 20
+echo $someCoffee->getDescription(); // Simple Coffee, milk, whip, vanilla
+```
+
+📦 Facade
+----------------
+
+Real world example
+> How do you turn on the computer? "Hit the power button" you say! That is what you believe because you are using a simple interface that computer provides on the outside, internally it has to do a lot of stuff to make it happen. This simple interface to the complex subsystem is a facade.
+
+In plain words
+> Facade pattern provides a simplified interface to a complex subsystem.
+
+Wikipedia says
+> A facade is an object that provides a simplified interface to a larger body of code, such as a class library.
+
+**Programmatic Example**
+
+Taking our computer example from above. Here we have the computer class
+
+```php
+class Computer
+{
+ public function getElectricShock()
+ {
+ echo "Ouch!";
+ }
+
+ public function makeSound()
+ {
+ echo "Beep beep!";
+ }
+
+ public function showLoadingScreen()
+ {
+ echo "Loading..";
+ }
+
+ public function bam()
+ {
+ echo "Ready to be used!";
+ }
+
+ public function closeEverything()
+ {
+ echo "Bup bup bup buzzzz!";
+ }
+
+ public function sooth()
+ {
+ echo "Zzzzz";
+ }
+
+ public function pullCurrent()
+ {
+ echo "Haaah!";
+ }
+}
+```
+Here we have the facade
+```php
+class ComputerFacade
+{
+ protected $computer;
+
+ public function __construct(Computer $computer)
+ {
+ $this->computer = $computer;
+ }
+
+ public function turnOn()
+ {
+ $this->computer->getElectricShock();
+ $this->computer->makeSound();
+ $this->computer->showLoadingScreen();
+ $this->computer->bam();
+ }
+
+ public function turnOff()
+ {
+ $this->computer->closeEverything();
+ $this->computer->pullCurrent();
+ $this->computer->sooth();
+ }
+}
+```
+Now to use the facade
+```php
+$computer = new ComputerFacade(new Computer());
+$computer->turnOn(); // Ouch! Beep beep! Loading.. Ready to be used!
+$computer->turnOff(); // Bup bup buzzz! Haah! Zzzzz
+```
+
+🍃 Flyweight
+---------
+
+Real world example
+> Did you ever have fresh tea from some stall? They often make more than one cup that you demanded and save the rest for any other customer so to save the resources e.g. gas etc. Flyweight pattern is all about that i.e. sharing.
+
+In plain words
+> It is used to minimize memory usage or computational expenses by sharing as much as possible with similar objects.
+
+Wikipedia says
+> In computer programming, flyweight is a software design pattern. A flyweight is an object that minimizes memory use by sharing as much data as possible with other similar objects; it is a way to use objects in large numbers when a simple repeated representation would use an unacceptable amount of memory.
+
+**Programmatic example**
+
+Translating our tea example from above. First of all we have tea types and tea maker
+
+```php
+// Anything that will be cached is flyweight.
+// Types of tea here will be flyweights.
+class KarakTea
+{
+}
+
+// Acts as a factory and saves the tea
+class TeaMaker
+{
+ protected $availableTea = [];
+
+ public function make($preference)
+ {
+ if (empty($this->availableTea[$preference])) {
+ $this->availableTea[$preference] = new KarakTea();
+ }
+
+ return $this->availableTea[$preference];
+ }
+}
+```
+
+Then we have the `TeaShop` which takes orders and serves them
+
+```php
+class TeaShop
+{
+ protected $orders;
+ protected $teaMaker;
+
+ public function __construct(TeaMaker $teaMaker)
+ {
+ $this->teaMaker = $teaMaker;
+ }
+
+ public function takeOrder(string $teaType, int $table)
+ {
+ $this->orders[$table] = $this->teaMaker->make($teaType);
+ }
+
+ public function serve()
+ {
+ foreach ($this->orders as $table => $tea) {
+ echo "Serving tea to table# " . $table;
+ }
+ }
+}
+```
+And it can be used as below
+
+```php
+$teaMaker = new TeaMaker();
+$shop = new TeaShop($teaMaker);
+
+$shop->takeOrder('less sugar', 1);
+$shop->takeOrder('more milk', 2);
+$shop->takeOrder('without sugar', 5);
+
+$shop->serve();
+// Serving tea to table# 1
+// Serving tea to table# 2
+// Serving tea to table# 5
+```
+
+## 🎱 Proxy
+Real world example
+> Have you ever used an access card to go through a door? There are multiple options to open that door i.e. it can be opened either using access card or by pressing a button that bypasses the security. The door's main functionality is to open but there is a proxy added on top of it to add some functionality. Let me better explain it using the code example below.
+
+In plain words
+> Using the proxy pattern, a class represents the functionality of another class.
+
+Wikipedia says
+> A proxy, in its most general form, is a class functioning as an interface to something else. A proxy is a wrapper or agent object that is being called by the client to access the real serving object behind the scenes. Use of the proxy can simply be forwarding to the real object, or can provide additional logic. In the proxy extra functionality can be provided, for example caching when operations on the real object are resource intensive, or checking preconditions before operations on the real object are invoked.
+
+**Programmatic Example**
+
+Taking our security door example from above. Firstly we have the door interface and an implementation of door
+
+```php
+interface Door
+{
+ public function open();
+ public function close();
+}
+
+class LabDoor implements Door
+{
+ public function open()
+ {
+ echo "Opening lab door";
+ }
+
+ public function close()
+ {
+ echo "Closing the lab door";
+ }
+}
+```
+Then we have a proxy to secure any doors that we want
+```php
+class SecuredDoor
+{
+ protected $door;
+
+ public function __construct(Door $door)
+ {
+ $this->door = $door;
+ }
+
+ public function open($password)
+ {
+ if ($this->authenticate($password)) {
+ $this->door->open();
+ } else {
+ echo "Big no! It ain't possible.";
+ }
+ }
+
+ public function authenticate($password)
+ {
+ return $password === '$ecr@t';
+ }
+
+ public function close()
+ {
+ $this->door->close();
+ }
+}
+```
+And here is how it can be used
+```php
+$door = new SecuredDoor(new LabDoor());
+$door->open('invalid'); // Big no! It ain't possible.
+
+$door->open('$ecr@t'); // Opening lab door
+$door->close(); // Closing lab door
+```
+Yet another example would be some sort of data-mapper implementation. For example, I recently made an ODM (Object Data Mapper) for MongoDB using this pattern where I wrote a proxy around mongo classes while utilizing the magic method `__call()`. All the method calls were proxied to the original mongo class and result retrieved was returned as it is but in case of `find` or `findOne` data was mapped to the required class objects and the object was returned instead of `Cursor`.
+
+## Behavioral Design Patterns
+
+In plain words
+> It is concerned with assignment of responsibilities between the objects. What makes them different from structural patterns is they don't just specify the structure but also outline the patterns for message passing/communication between them. Or in other words, they assist in answering "How to run a behavior in software component?"
+
+Wikipedia says
+> In software engineering, behavioral design patterns are design patterns that identify common communication patterns between objects and realize these patterns. By doing so, these patterns increase flexibility in carrying out this communication.
+
+There are 10 types of behavioral design patterns
+
+* [Chain of Responsibility](#-chain-of-responsibility)
+* [Command](#-command)
+* [Iterator](#-iterator)
+* [Mediator](#-mediator)
+* [Memento](#-memento)
+* [Observer](#-observer)
+* [Visitor](#-visitor)
+* [Strategy](#-strategy)
+* [State](#-state)
+* [Template Method](#-template-method)
+
+## 🔗 Chain of Responsibility
+
+Real world example
+> For example, you have three payment methods (`A`, `B` and `C`) setup in your account; each having a different amount in it. `A` has 100 USD, `B` has 300 USD and `C` having 1000 USD and the preference for payments is chosen as `A` then `B` then `C`. You try to purchase something that is worth 210 USD. Using Chain of Responsibility, first of all account `A` will be checked if it can make the purchase, if yes purchase will be made and the chain will be broken. If not, request will move forward to account `B` checking for amount if yes chain will be broken otherwise the request will keep forwarding till it finds the suitable handler. Here `A`, `B` and `C` are links of the chain and the whole phenomenon is Chain of Responsibility.
+
+In plain words
+> It helps building a chain of objects. Request enters from one end and keeps going from object to object till it finds the suitable handler.
+
+Wikipedia says
+> In object-oriented design, the chain-of-responsibility pattern is a design pattern consisting of a source of command objects and a series of processing objects. Each processing object contains logic that defines the types of command objects that it can handle; the rest are passed to the next processing object in the chain.
+
+**Programmatic Example**
+
+Translating our account example above. First of all we have a base account having the logic for chaining the accounts together and some accounts
+
+```php
+abstract class Account
+{
+ protected $successor;
+ protected $balance;
+
+ public function setNext(Account $account)
+ {
+ $this->successor = $account;
+ }
+
+ public function pay(float $amountToPay)
+ {
+ if ($this->canPay($amountToPay)) {
+ echo sprintf('Paid %s using %s' . PHP_EOL, $amountToPay, get_called_class());
+ } elseif ($this->successor) {
+ echo sprintf('Cannot pay using %s. Proceeding ..' . PHP_EOL, get_called_class());
+ $this->successor->pay($amountToPay);
+ } else {
+ throw new Exception('None of the accounts have enough balance');
+ }
+ }
+
+ public function canPay($amount): bool
+ {
+ return $this->balance >= $amount;
+ }
+}
+
+class Bank extends Account
+{
+ protected $balance;
+
+ public function __construct(float $balance)
+ {
+ $this->balance = $balance;
+ }
+}
+
+class Paypal extends Account
+{
+ protected $balance;
+
+ public function __construct(float $balance)
+ {
+ $this->balance = $balance;
+ }
+}
+
+class Bitcoin extends Account
+{
+ protected $balance;
+
+ public function __construct(float $balance)
+ {
+ $this->balance = $balance;
+ }
+}
+```
+
+Now let's prepare the chain using the links defined above (i.e. Bank, Paypal, Bitcoin)
+
+```php
+// Let's prepare a chain like below
+// $bank->$paypal->$bitcoin
+//
+// First priority bank
+// If bank can't pay then paypal
+// If paypal can't pay then bit coin
+
+$bank = new Bank(100); // Bank with balance 100
+$paypal = new Paypal(200); // Paypal with balance 200
+$bitcoin = new Bitcoin(300); // Bitcoin with balance 300
+
+$bank->setNext($paypal);
+$paypal->setNext($bitcoin);
+
+// Let's try to pay using the first priority i.e. bank
+$bank->pay(259);
+
+// Output will be
+// ==============
+// Cannot pay using bank. Proceeding ..
+// Cannot pay using paypal. Proceeding ..:
+// Paid 259 using Bitcoin!
+```
+
+👮 Command
+-------
+
+Real world example
+> A generic example would be you ordering food at a restaurant. You (i.e. `Client`) ask the waiter (i.e. `Invoker`) to bring some food (i.e. `Command`) and waiter simply forwards the request to Chef (i.e. `Receiver`) who has the knowledge of what and how to cook.
+> Another example would be you (i.e. `Client`) switching on (i.e. `Command`) the television (i.e. `Receiver`) using a remote control (`Invoker`).
+
+In plain words
+> Allows you to encapsulate actions in objects. The key idea behind this pattern is to provide the means to decouple client from receiver.
+
+Wikipedia says
+> In object-oriented programming, the command pattern is a behavioral design pattern in which an object is used to encapsulate all information needed to perform an action or trigger an event at a later time. This information includes the method name, the object that owns the method and values for the method parameters.
+
+**Programmatic Example**
+
+First of all we have the receiver that has the implementation of every action that could be performed
+```php
+// Receiver
+class Bulb
+{
+ public function turnOn()
+ {
+ echo "Bulb has been lit";
+ }
+
+ public function turnOff()
+ {
+ echo "Darkness!";
+ }
+}
+```
+then we have an interface that each of the commands are going to implement and then we have a set of commands
+```php
+interface Command
+{
+ public function execute();
+ public function undo();
+ public function redo();
+}
+
+// Command
+class TurnOn implements Command
+{
+ protected $bulb;
+
+ public function __construct(Bulb $bulb)
+ {
+ $this->bulb = $bulb;
+ }
+
+ public function execute()
+ {
+ $this->bulb->turnOn();
+ }
+
+ public function undo()
+ {
+ $this->bulb->turnOff();
+ }
+
+ public function redo()
+ {
+ $this->execute();
+ }
+}
+
+class TurnOff implements Command
+{
+ protected $bulb;
+
+ public function __construct(Bulb $bulb)
+ {
+ $this->bulb = $bulb;
+ }
+
+ public function execute()
+ {
+ $this->bulb->turnOff();
+ }
+
+ public function undo()
+ {
+ $this->bulb->turnOn();
+ }
+
+ public function redo()
+ {
+ $this->execute();
+ }
+}
+```
+Then we have an `Invoker` with whom the client will interact to process any commands
+```php
+// Invoker
+class RemoteControl
+{
+ public function submit(Command $command)
+ {
+ $command->execute();
+ }
+}
+```
+Finally let's see how we can use it in our client
+```php
+$bulb = new Bulb();
+
+$turnOn = new TurnOn($bulb);
+$turnOff = new TurnOff($bulb);
+
+$remote = new RemoteControl();
+$remote->submit($turnOn); // Bulb has been lit!
+$remote->submit($turnOff); // Darkness!
+```
+
+Command pattern can also be used to implement a transaction based system. Where you keep maintaining the history of commands as soon as you execute them. If the final command is successfully executed, all good otherwise just iterate through the history and keep executing the `undo` on all the executed commands.
+
+➿ Iterator
+--------
+
+Real world example
+> An old radio set will be a good example of iterator, where user could start at some channel and then use next or previous buttons to go through the respective channels. Or take an example of MP3 player or a TV set where you could press the next and previous buttons to go through the consecutive channels or in other words they all provide an interface to iterate through the respective channels, songs or radio stations.
+
+In plain words
+> It presents a way to access the elements of an object without exposing the underlying presentation.
+
+Wikipedia says
+> In object-oriented programming, the iterator pattern is a design pattern in which an iterator is used to traverse a container and access the container's elements. The iterator pattern decouples algorithms from containers; in some cases, algorithms are necessarily container-specific and thus cannot be decoupled.
+
+**Programmatic example**
+
+In PHP it is quite easy to implement using SPL (Standard PHP Library). Translating our radio stations example from above. First of all we have `RadioStation`
+
+```php
+class RadioStation
+{
+ protected $frequency;
+
+ public function __construct(float $frequency)
+ {
+ $this->frequency = $frequency;
+ }
+
+ public function getFrequency(): float
+ {
+ return $this->frequency;
+ }
+}
+```
+Then we have our iterator
+
+```php
+use Countable;
+use Iterator;
+
+class StationList implements Countable, Iterator
+{
+ /** @var RadioStation[] $stations */
+ protected $stations = [];
+
+ /** @var int $counter */
+ protected $counter;
+
+ public function addStation(RadioStation $station)
+ {
+ $this->stations[] = $station;
+ }
+
+ public function removeStation(RadioStation $toRemove)
+ {
+ $toRemoveFrequency = $toRemove->getFrequency();
+ $this->stations = array_filter($this->stations, function (RadioStation $station) use ($toRemoveFrequency) {
+ return $station->getFrequency() !== $toRemoveFrequency;
+ });
+ }
+
+ public function count(): int
+ {
+ return count($this->stations);
+ }
+
+ public function current(): RadioStation
+ {
+ return $this->stations[$this->counter];
+ }
+
+ public function key()
+ {
+ return $this->counter;
+ }
+
+ public function next()
+ {
+ $this->counter++;
+ }
+
+ public function rewind()
+ {
+ $this->counter = 0;
+ }
+
+ public function valid(): bool
+ {
+ return isset($this->stations[$this->counter]);
+ }
+}
+```
+And then it can be used as
+```php
+$stationList = new StationList();
+
+$stationList->addStation(new RadioStation(89));
+$stationList->addStation(new RadioStation(101));
+$stationList->addStation(new RadioStation(102));
+$stationList->addStation(new RadioStation(103.2));
+
+foreach($stationList as $station) {
+ echo $station->getFrequency() . PHP_EOL;
+}
+
+$stationList->removeStation(new RadioStation(89)); // Will remove station 89
+```
+
+👽 Mediator
+--------
+
+Real world example
+> A general example would be when you talk to someone on your mobile phone, there is a network provider sitting between you and them and your conversation goes through it instead of being directly sent. In this case network provider is mediator.
+
+In plain words
+> Mediator pattern adds a third party object (called mediator) to control the interaction between two objects (called colleagues). It helps reduce the coupling between the classes communicating with each other. Because now they don't need to have the knowledge of each other's implementation.
+
+Wikipedia says
+> In software engineering, the mediator pattern defines an object that encapsulates how a set of objects interact. This pattern is considered to be a behavioral pattern due to the way it can alter the program's running behavior.
+
+**Programmatic Example**
+
+Here is the simplest example of a chat room (i.e. mediator) with users (i.e. colleagues) sending messages to each other.
+
+First of all, we have the mediator i.e. the chat room
+
+```php
+interface ChatRoomMediator
+{
+ public function showMessage(User $user, string $message);
+}
+
+// Mediator
+class ChatRoom implements ChatRoomMediator
+{
+ public function showMessage(User $user, string $message)
+ {
+ $time = date('M d, y H:i');
+ $sender = $user->getName();
+
+ echo $time . '[' . $sender . ']:' . $message;
+ }
+}
+```
+
+Then we have our users i.e. colleagues
+```php
+class User {
+ protected $name;
+ protected $chatMediator;
+
+ public function __construct(string $name, ChatRoomMediator $chatMediator) {
+ $this->name = $name;
+ $this->chatMediator = $chatMediator;
+ }
+
+ public function getName() {
+ return $this->name;
+ }
+
+ public function send($message) {
+ $this->chatMediator->showMessage($this, $message);
+ }
+}
+```
+And the usage
+```php
+$mediator = new ChatRoom();
+
+$john = new User('John Doe', $mediator);
+$jane = new User('Jane Doe', $mediator);
+
+$john->send('Hi there!');
+$jane->send('Hey!');
+
+// Output will be
+// Feb 14, 10:58 [John]: Hi there!
+// Feb 14, 10:58 [Jane]: Hey!
+```
+
+💾 Memento
+-------
+Real world example
+> Take the example of calculator (i.e. originator), where whenever you perform some calculation the last calculation is saved in memory (i.e. memento) so that you can get back to it and maybe get it restored using some action buttons (i.e. caretaker).
+
+In plain words
+> Memento pattern is about capturing and storing the current state of an object in a manner that it can be restored later on in a smooth manner.
+
+Wikipedia says
+> The memento pattern is a software design pattern that provides the ability to restore an object to its previous state (undo via rollback).
+
+Usually useful when you need to provide some sort of undo functionality.
+
+**Programmatic Example**
+
+Lets take an example of text editor which keeps saving the state from time to time and that you can restore if you want.
+
+First of all we have our memento object that will be able to hold the editor state
+
+```php
+class EditorMemento
+{
+ protected $content;
+
+ public function __construct(string $content)
+ {
+ $this->content = $content;
+ }
+
+ public function getContent()
+ {
+ return $this->content;
+ }
+}
+```
+
+Then we have our editor i.e. originator that is going to use memento object
+
+```php
+class Editor
+{
+ protected $content = '';
+
+ public function type(string $words)
+ {
+ $this->content = $this->content . ' ' . $words;
+ }
+
+ public function getContent()
+ {
+ return $this->content;
+ }
+
+ public function save()
+ {
+ return new EditorMemento($this->content);
+ }
+
+ public function restore(EditorMemento $memento)
+ {
+ $this->content = $memento->getContent();
+ }
+}
+```
+
+And then it can be used as
+
+```php
+$editor = new Editor();
+
+// Type some stuff
+$editor->type('This is the first sentence.');
+$editor->type('This is second.');
+
+// Save the state to restore to : This is the first sentence. This is second.
+$saved = $editor->save();
+
+// Type some more
+$editor->type('And this is third.');
+
+// Output: Content before Saving
+echo $editor->getContent(); // This is the first sentence. This is second. And this is third.
+
+// Restoring to last saved state
+$editor->restore($saved);
+
+$editor->getContent(); // This is the first sentence. This is second.
+```
+
+😎 Observer
+--------
+Real world example
+> A good example would be the job seekers where they subscribe to some job posting site and they are notified whenever there is a matching job opportunity.
+
+In plain words
+> Defines a dependency between objects so that whenever an object changes its state, all its dependents are notified.
+
+Wikipedia says
+> The observer pattern is a software design pattern in which an object, called the subject, maintains a list of its dependents, called observers, and notifies them automatically of any state changes, usually by calling one of their methods.
+
+**Programmatic example**
+
+Translating our example from above. First of all we have job seekers that need to be notified for a job posting
+```php
+class JobPost
+{
+ protected $title;
+
+ public function __construct(string $title)
+ {
+ $this->title = $title;
+ }
+
+ public function getTitle()
+ {
+ return $this->title;
+ }
+}
+
+class JobSeeker implements Observer
+{
+ protected $name;
+
+ public function __construct(string $name)
+ {
+ $this->name = $name;
+ }
+
+ public function onJobPosted(JobPost $job)
+ {
+ // Do something with the job posting
+ echo 'Hi ' . $this->name . '! New job posted: '. $job->getTitle();
+ }
+}
+```
+Then we have our job postings to which the job seekers will subscribe
+```php
+class EmploymentAgency implements Observable
+{
+ protected $observers = [];
+
+ protected function notify(JobPost $jobPosting)
+ {
+ foreach ($this->observers as $observer) {
+ $observer->onJobPosted($jobPosting);
+ }
+ }
+
+ public function attach(Observer $observer)
+ {
+ $this->observers[] = $observer;
+ }
+
+ public function addJob(JobPost $jobPosting)
+ {
+ $this->notify($jobPosting);
+ }
+}
+```
+Then it can be used as
+```php
+// Create subscribers
+$johnDoe = new JobSeeker('John Doe');
+$janeDoe = new JobSeeker('Jane Doe');
+
+// Create publisher and attach subscribers
+$jobPostings = new EmploymentAgency();
+$jobPostings->attach($johnDoe);
+$jobPostings->attach($janeDoe);
+
+// Add a new job and see if subscribers get notified
+$jobPostings->addJob(new JobPost('Software Engineer'));
+
+// Output
+// Hi John Doe! New job posted: Software Engineer
+// Hi Jane Doe! New job posted: Software Engineer
+```
+
+🏃 Visitor
+-------
+Real world example
+> Consider someone visiting Dubai. They just need a way (i.e. visa) to enter Dubai. After arrival, they can come and visit any place in Dubai on their own without having to ask for permission or to do some leg work in order to visit any place here; just let them know of a place and they can visit it. Visitor pattern lets you do just that, it helps you add places to visit so that they can visit as much as they can without having to do any legwork.
+
+In plain words
+> Visitor pattern lets you add further operations to objects without having to modify them.
+
+Wikipedia says
+> In object-oriented programming and software engineering, the visitor design pattern is a way of separating an algorithm from an object structure on which it operates. A practical result of this separation is the ability to add new operations to existing object structures without modifying those structures. It is one way to follow the open/closed principle.
+
+**Programmatic example**
+
+Let's take an example of a zoo simulation where we have several different kinds of animals and we have to make them Sound. Let's translate this using visitor pattern
+
+```php
+// Visitee
+interface Animal
+{
+ public function accept(AnimalOperation $operation);
+}
+
+// Visitor
+interface AnimalOperation
+{
+ public function visitMonkey(Monkey $monkey);
+ public function visitLion(Lion $lion);
+ public function visitDolphin(Dolphin $dolphin);
+}
+```
+Then we have our implementations for the animals
+```php
+class Monkey implements Animal
+{
+ public function shout()
+ {
+ echo 'Ooh oo aa aa!';
+ }
+
+ public function accept(AnimalOperation $operation)
+ {
+ $operation->visitMonkey($this);
+ }
+}
+
+class Lion implements Animal
+{
+ public function roar()
+ {
+ echo 'Roaaar!';
+ }
+
+ public function accept(AnimalOperation $operation)
+ {
+ $operation->visitLion($this);
+ }
+}
+
+class Dolphin implements Animal
+{
+ public function speak()
+ {
+ echo 'Tuut tuttu tuutt!';
+ }
+
+ public function accept(AnimalOperation $operation)
+ {
+ $operation->visitDolphin($this);
+ }
+}
+```
+Let's implement our visitor
+```php
+class Speak implements AnimalOperation
+{
+ public function visitMonkey(Monkey $monkey)
+ {
+ $monkey->shout();
+ }
+
+ public function visitLion(Lion $lion)
+ {
+ $lion->roar();
+ }
+
+ public function visitDolphin(Dolphin $dolphin)
+ {
+ $dolphin->speak();
+ }
+}
+```
+
+And then it can be used as
+```php
+$monkey = new Monkey();
+$lion = new Lion();
+$dolphin = new Dolphin();
+
+$speak = new Speak();
+
+$monkey->accept($speak); // Ooh oo aa aa!
+$lion->accept($speak); // Roaaar!
+$dolphin->accept($speak); // Tuut tutt tuutt!
+```
+We could have done this simply by having an inheritance hierarchy for the animals but then we would have to modify the animals whenever we would have to add new actions to animals. But now we will not have to change them. For example, let's say we are asked to add the jump behavior to the animals, we can simply add that by creating a new visitor i.e.
+
+```php
+class Jump implements AnimalOperation
+{
+ public function visitMonkey(Monkey $monkey)
+ {
+ echo 'Jumped 20 feet high! on to the tree!';
+ }
+
+ public function visitLion(Lion $lion)
+ {
+ echo 'Jumped 7 feet! Back on the ground!';
+ }
+
+ public function visitDolphin(Dolphin $dolphin)
+ {
+ echo 'Walked on water a little and disappeared';
+ }
+}
+```
+And for the usage
+```php
+$jump = new Jump();
+
+$monkey->accept($speak); // Ooh oo aa aa!
+$monkey->accept($jump); // Jumped 20 feet high! on to the tree!
+
+$lion->accept($speak); // Roaaar!
+$lion->accept($jump); // Jumped 7 feet! Back on the ground!
+
+$dolphin->accept($speak); // Tuut tutt tuutt!
+$dolphin->accept($jump); // Walked on water a little and disappeared
+```
+
+💡 Strategy
+--------
+
+Real world example
+> Consider the example of sorting, we implemented bubble sort but the data started to grow and bubble sort started getting very slow. In order to tackle this we implemented Quick sort. But now although the quick sort algorithm was doing better for large datasets, it was very slow for smaller datasets. In order to handle this we implemented a strategy where for small datasets, bubble sort will be used and for larger, quick sort.
+
+In plain words
+> Strategy pattern allows you to switch the algorithm or strategy based upon the situation.
+
+Wikipedia says
+> In computer programming, the strategy pattern (also known as the policy pattern) is a behavioural software design pattern that enables an algorithm's behavior to be selected at runtime.
+
+**Programmatic example**
+
+Translating our example from above. First of all we have our strategy interface and different strategy implementations
+
+```php
+interface SortStrategy
+{
+ public function sort(array $dataset): array;
+}
+
+class BubbleSortStrategy implements SortStrategy
+{
+ public function sort(array $dataset): array
+ {
+ echo "Sorting using bubble sort";
+
+ // Do sorting
+ return $dataset;
+ }
+}
+
+class QuickSortStrategy implements SortStrategy
+{
+ public function sort(array $dataset): array
+ {
+ echo "Sorting using quick sort";
+
+ // Do sorting
+ return $dataset;
+ }
+}
+```
+
+And then we have our client that is going to use any strategy
+```php
+class Sorter
+{
+ protected $sorter;
+
+ public function __construct(SortStrategy $sorter)
+ {
+ $this->sorter = $sorter;
+ }
+
+ public function sort(array $dataset): array
+ {
+ return $this->sorter->sort($dataset);
+ }
+}
+```
+And it can be used as
+```php
+$dataset = [1, 5, 4, 3, 2, 8];
+
+$sorter = new Sorter(new BubbleSortStrategy());
+$sorter->sort($dataset); // Output : Sorting using bubble sort
+
+$sorter = new Sorter(new QuickSortStrategy());
+$sorter->sort($dataset); // Output : Sorting using quick sort
+```
+
+💢 State
+-----
+Real world example
+> Imagine you are using some drawing application, you choose the paint brush to draw. Now the brush changes its behavior based on the selected color i.e. if you have chosen red color it will draw in red, if blue then it will be in blue etc.
+
+In plain words
+> It lets you change the behavior of a class when the state changes.
+
+Wikipedia says
+> The state pattern is a behavioral software design pattern that implements a state machine in an object-oriented way. With the state pattern, a state machine is implemented by implementing each individual state as a derived class of the state pattern interface, and implementing state transitions by invoking methods defined by the pattern's superclass.
+> The state pattern can be interpreted as a strategy pattern which is able to switch the current strategy through invocations of methods defined in the pattern's interface.
+
+**Programmatic example**
+
+Let's take an example of text editor, it lets you change the state of text that is typed i.e. if you have selected bold, it starts writing in bold, if italic then in italics etc.
+
+First of all we have our state interface and some state implementations
+
+```php
+interface WritingState
+{
+ public function write(string $words);
+}
+
+class UpperCase implements WritingState
+{
+ public function write(string $words)
+ {
+ echo strtoupper($words);
+ }
+}
+
+class LowerCase implements WritingState
+{
+ public function write(string $words)
+ {
+ echo strtolower($words);
+ }
+}
+
+class DefaultText implements WritingState
+{
+ public function write(string $words)
+ {
+ echo $words;
+ }
+}
+```
+Then we have our editor
+```php
+class TextEditor
+{
+ protected $state;
+
+ public function __construct(WritingState $state)
+ {
+ $this->state = $state;
+ }
+
+ public function setState(WritingState $state)
+ {
+ $this->state = $state;
+ }
+
+ public function type(string $words)
+ {
+ $this->state->write($words);
+ }
+}
+```
+And then it can be used as
+```php
+$editor = new TextEditor(new DefaultText());
+
+$editor->type('First line');
+
+$editor->setState(new UpperCase());
+
+$editor->type('Second line');
+$editor->type('Third line');
+
+$editor->setState(new LowerCase());
+
+$editor->type('Fourth line');
+$editor->type('Fifth line');
+
+// Output:
+// First line
+// SECOND LINE
+// THIRD LINE
+// fourth line
+// fifth line
+```
+
+📒 Template Method
+---------------
+
+Real world example
+> Suppose we are getting some house built. The steps for building might look like
+> - Prepare the base of house
+> - Build the walls
+> - Add roof
+> - Add other floors
+
+> The order of these steps could never be changed i.e. you can't build the roof before building the walls etc but each of the steps could be modified for example walls can be made of wood or polyester or stone.
+
+In plain words
+> Template method defines the skeleton of how a certain algorithm could be performed, but defers the implementation of those steps to the children classes.
+
+Wikipedia says
+> In software engineering, the template method pattern is a behavioral design pattern that defines the program skeleton of an algorithm in an operation, deferring some steps to subclasses. It lets one redefine certain steps of an algorithm without changing the algorithm's structure.
+
+**Programmatic Example**
+
+Imagine we have a build tool that helps us test, lint, build, generate build reports (i.e. code coverage reports, linting report etc) and deploy our app on the test server.
+
+First of all we have our base class that specifies the skeleton for the build algorithm
+```php
+abstract class Builder
+{
+
+ // Template method
+ final public function build()
+ {
+ $this->test();
+ $this->lint();
+ $this->assemble();
+ $this->deploy();
+ }
+
+ abstract public function test();
+ abstract public function lint();
+ abstract public function assemble();
+ abstract public function deploy();
+}
+```
+
+Then we can have our implementations
+
+```php
+class AndroidBuilder extends Builder
+{
+ public function test()
+ {
+ echo 'Running android tests';
+ }
+
+ public function lint()
+ {
+ echo 'Linting the android code';
+ }
+
+ public function assemble()
+ {
+ echo 'Assembling the android build';
+ }
+
+ public function deploy()
+ {
+ echo 'Deploying android build to server';
+ }
+}
+
+class IosBuilder extends Builder
+{
+ public function test()
+ {
+ echo 'Running ios tests';
+ }
+
+ public function lint()
+ {
+ echo 'Linting the ios code';
+ }
+
+ public function assemble()
+ {
+ echo 'Assembling the ios build';
+ }
+
+ public function deploy()
+ {
+ echo 'Deploying ios build to server';
+ }
+}
+```
+And then it can be used as
+
+```php
+$androidBuilder = new AndroidBuilder();
+$androidBuilder->build();
+
+// Output:
+// Running android tests
+// Linting the android code
+// Assembling the android build
+// Deploying android build to server
+
+$iosBuilder = new IosBuilder();
+$iosBuilder->build();
+
+// Output:
+// Running ios tests
+// Linting the ios code
+// Assembling the ios build
+// Deploying ios build to server
+```
+
+## Wrap Up Folks
+
+And that about wraps it up. I will continue to improve this, so you might want to watch/star this repository to revisit. Also, I have plans on writing the same about the architectural patterns, stay tuned for it.
diff --git a/src/guides/dhcp-in-one-picture.md b/src/guides/dhcp-in-one-picture.md
new file mode 100644
index 000000000..9a542c139
--- /dev/null
+++ b/src/guides/dhcp-in-one-picture.md
@@ -0,0 +1,24 @@
+---
+title: "DHCP in One Picture"
+description: "Here is what happens when a new device joins the network."
+author:
+ name: "Kamran Ahmed"
+ url: "https://twitter.com/kamranahmedse"
+ imageUrl: "/authors/kamranahmedse.jpeg"
+seo:
+ title: "DHCP in One Picture - roadmap.sh"
+ description: "Here is what happens when a new device joins the network."
+isNew: false
+type: "visual"
+date: 2021-04-28
+sitemap:
+ priority: 0.7
+ changefreq: "weekly"
+tags:
+ - "guide"
+ - "visual-guide"
+ - "guide-sitemap"
+---
+
+[![](/guides/dhcp.png)](/guides/dhcp.png)
+
diff --git a/src/guides/dns-in-one-picture.md b/src/guides/dns-in-one-picture.md
new file mode 100644
index 000000000..6cb594415
--- /dev/null
+++ b/src/guides/dns-in-one-picture.md
@@ -0,0 +1,27 @@
+---
+title: "DNS in One Picture"
+description: "Quick illustrative guide on how a website is found on the internet."
+author:
+ name: "Kamran Ahmed"
+ url: "https://twitter.com/kamranahmedse"
+ imageUrl: "/authors/kamranahmedse.jpeg"
+seo:
+ title: "DNS in One Picture - roadmap.sh"
+ description: "Quick illustrative guide on how a website is found on the internet."
+isNew: false
+type: "visual"
+date: 2018-12-04
+sitemap:
+ priority: 0.7
+ changefreq: "weekly"
+tags:
+ - "guide"
+ - "visual-guide"
+ - "guide-sitemap"
+---
+
+DNS or Domain Name System is one of the fundamental blocks of the internet. As a developer, you should have at-least the basic understanding of how it works. This article is a brief introduction to what is DNS and how it works.
+
+DNS at its simplest is like a phonebook on your mobile phone. Whenever you have to call one of your contacts, you can either dial their number from your memory or use their name which will then be used by your mobile phone to search their number in your phone book to call them. Every time you make a new friend, or your existing friend gets a mobile phone, you have to memorize their phone number or save it in your phonebook to be able to call them later on. DNS or Domain Name System, in a similar fashion, is a mechanism that allows you to browse websites on the internet. Just like your mobile phone does not know how to call without knowing the phone number, your browser does not know how to open a website just by the domain name; it needs to know the IP Address for the website to open. You can either type the IP Address to open, or provide the domain name and press enter which will then be used by your browser to find the IP address by going through several hoops. The picture below is the illustration of how your browser finds a website on the internet.
+
+[![](https://i.imgur.com/z9rwm5A.png)](https://i.imgur.com/z9rwm5A.png)
diff --git a/src/guides/history-of-javascript.md b/src/guides/history-of-javascript.md
new file mode 100644
index 000000000..f523579bc
--- /dev/null
+++ b/src/guides/history-of-javascript.md
@@ -0,0 +1,63 @@
+---
+title: "Brief History of JavaScript"
+description: "How JavaScript was introduced and evolved over the years"
+author:
+ name: "Kamran Ahmed"
+ url: "https://twitter.com/kamranahmedse"
+ imageUrl: "/authors/kamranahmedse.jpeg"
+seo:
+ title: "Brief History of JavaScript - roadmap.sh"
+ description: "How JavaScript was introduced and evolved over the years"
+isNew: false
+type: "textual"
+date: 2017-10-28
+sitemap:
+ priority: 0.7
+ changefreq: "weekly"
+tags:
+ - "guide"
+ - "textual-guide"
+ - "guide-sitemap"
+---
+
+Around 10 years ago, Jeff Atwood (the founder of stackoverflow) made a case that JavaScript is going to be the future and he coined the “Atwood Law” which states that *Any application that can be written in JavaScript will eventually be written in JavaScript*. Fast-forward to today, 10 years later, if you look at it it rings truer than ever. JavaScript is continuing to gain more and more adoption.
+
+### JavaScript is announced
+JavaScript was initially created by [Brendan Eich](https://twitter.com/BrendanEich) of NetScape and was first announced in a press release by Netscape in 1995. It has a bizarre history of naming; initially it was named `Mocha` by the creator, which was later renamed to `LiveScript`. In 1996, about a year later after the release, NetScape decided to rename it to be `JavaScript` with hopes of capitalizing on the Java community (although JavaScript did not have any relationship with Java) and released Netscape 2.0 with the official support of JavaScript.
+
+### ES1, ES2 and ES3
+In 1996, Netscape decided to submit it to [ECMA International](https://en.wikipedia.org/wiki/Ecma_International) with the hopes of getting it standardized. First edition of the standard specification was released in 1997 and the language was standardized. After the initial release, `ECMAScript` was continued to be worked upon and in no-time two more versions were released ECMAScript 2 in 1998 and ECMAScript 3 in 1999.
+
+### Decade of Silence and ES4
+After the release of ES3 in 1999, there was a complete silence for a decade and no changes were made to the official standard. There was some work on the fourth edition in the initial days; some of the features that were being discussed included classes, modules, static typings, destructuring etc. It was being targeted to be released by 2008 but was abandoned due to political differences concerning language complexity. However, the vendors kept introducing the extensions to the language and the developers were left scratching their heads — adding polyfills to battle compatibility issues between different browsers.
+
+### From silence to ES5
+Google, Microsoft, Yahoo and other disputers of ES4 came together and decided to work on a less ambitious update to ES3 tentatively named ES3.1. But the teams were still fighting about what to include from ES4 and what not. Finally, in 2009 ES5 was released mainly focusing on fixing the compatibility and security issues etc. But there wasn’t much of a splash in the water — it took ages for the vendors to incorporate the standards and many developers were still using ES3 without being aware of the “modern” standards.
+
+### Release of ES6 — ECMAScript 2015
+After a few years of the release of ES5, things started to change, TC39 (the committee under ECMA international responsible for ECMAScript standardization) kept working on the next version of ECMAScript (ES6) which was originally named ES Harmony, before being eventually released with the name ES2015. ES2015 adds significant features and syntactic sugar to allow writing complex applications. Some of the features that ES6 has to offer, include Classes, Modules, Arrows, Enhanced object literals, Template strings, Destructuring, Default param values + rest + spread, Let and Const, Iterators + for..of, Generators, Maps + Sets, Proxies, Symbols, Promises, math + number + string + array + object APIs [etc](http://es6-features.org/#Constants)
+
+Browser support for ES6 is still scarce but everything that ES6 has to offer is still available to developers by transpiling the ES6 code to ES5. With the release of 6th version of ECMAScript, TC39 decided to move to yearly model of releasing updates to ECMAScript so to make sure that the new features are added as soon as they are approved and we don’t have to wait for the full specification to be drafted and approved — thus 6th version of ECMAScript was renamed as ECMAScript 2015 or ES2015 before the release in June 2015. And the next versions of ECMAScript were decided to published in June of every year.
+
+### Release of ES7 — ECMAScript 2016
+In June 2016, seventh version of ECMAScript was released. As ECMAScript has been moved to an yearly release model, ECMAScript 2016 (ES2016) comparatively did not have much to offer. ES2016 includes just two new features
+
+* Exponentiation operator `**`
+* `Array.prototype.includes`
+
+### Release of ES8 — ECMAScript 2017
+The eighth version of ECMAScript was released in June 2017. The key highlight of ES8 was the addition of async functions. Here is the list of new features in ES8
+
+* `Object.values()` and `Object.entries()`
+* String padding i.e. `String.prototype.padEnd()` and `String.prototype.padStart()`
+* `Object.getOwnPropertyDescriptors`
+* Trailing commas in function parameter lists and calls
+* Async functions
+
+### What is ESNext then?
+ESNext is a dynamic name that refers to whatever the current version of ECMAScript is at the given time. For example, at the time of this writing `ES2017` or `ES8` is `ESNext`.
+
+### What does the future hold?
+Since the release of ES6, [TC39](https://github.com/tc39) has quite streamlined their process. TC39 operates through a Github organization now and there are [several proposals](https://github.com/tc39/proposals) for new features or syntax to be added to the next versions of ECMAScript. Any one can go ahead and [submit a proposal](https://github.com/tc39/proposals) thus resulting in increasing the participation from the community. Every proposal goes through [four stages of maturity](https://tc39.github.io/process-document/) before it makes it into the specification.
+
+And that about wraps it up. Feel free to leave your feedback in the comments section below. Also here are the links to original language specifications [ES6](https://www.ecma-international.org/ecma-262/6.0/), [ES7](https://www.ecma-international.org/ecma-262/7.0/) and [ES8](https://www.ecma-international.org/ecma-262/8.0/).
diff --git a/src/guides/http-basic-authentication.md b/src/guides/http-basic-authentication.md
new file mode 100644
index 000000000..93b66e4ff
--- /dev/null
+++ b/src/guides/http-basic-authentication.md
@@ -0,0 +1,115 @@
+---
+title: "HTTP Basic Authentication"
+description: "Learn what is HTTP Basic Authentication and how to implement it in Node.js"
+author:
+ name: "Kamran Ahmed"
+ url: "https://twitter.com/kamranahmedse"
+ imageUrl: "/authors/kamranahmedse.jpeg"
+seo:
+ title: "HTTP Basic Authentication - roadmap.sh"
+ description: "Learn what is HTTP Basic Authentication and how to implement it in Node.js"
+isNew: true
+type: "textual"
+date: 2022-10-03
+sitemap:
+ priority: 0.7
+ changefreq: "weekly"
+tags:
+ - "guide"
+ - "textual-guide"
+ - "guide-sitemap"
+---
+
+Our last guide was about the [basics of authentication](/guides/basics-of-authentication), where we discussed authentication, authorization, types of authentication, authentication factors, authentication strategies, and so on.
+
+In this guide today, we will be learning about basic authentication, and we will see how we can implement Basic Authentication in Node.js. We have a [visual guide on the basic authentication](/guides/basic-authentication) and an illustrative video, watch the video below or continue reading:
+
+
+
+## What is Basic Authentication?
+Given the name "Basic Authentication", you should not confuse Basic Authentication with the standard username and password authentication. Basic authentication is a part of the HTTP specification, and the details can be [found in the RFC7617](https://www.rfc-editor.org/rfc/rfc7617.html).
+
+Because it is a part of the HTTP specifications, all the browsers have native support for "HTTP Basic Authentication". Given below is the screenshot from the implementation in Google Chrome.
+
+![](/guides/basic-authentication/chrome-basic-auth.png)
+
+
+## How does it Work?
+Now that we know what basic authentication is, the question is, how does it work? The answer is: it is controlled by the response of the server.
+
+### Step 1
+When the browser first requests the server, the server tries to check the availability of the `Authorization` header in the request. Because it is the first request, no `Authorization` header is found in the request. So the server responds with the `401 Unauthorized` response code and also sends the `WWW-Authenticate` header with the value set to `Basic`, which tells the browser that it needs to trigger the basic authentication flow.
+
+```text
+401 Unauthorized
+WWW-Authenticate: Basic realm='user_pages'
+```
+
+If you notice the response, we have an additional parameter called `realm`, which is just a value assigned to a group of pages that share the same credentials.
+
+The browser might use Realm to cache the credential. In the future, when there is an authentication failure browser will check if it has the credentials in the cache for the given realm of the domain, and it may use the same credentials.
+
+## Step 2
+Upon receiving the response from the server, the browser will notice the `WWW-Authenticate` header and will show the authentication popup.
+
+![](/guides/basic-authentication/chrome-basic-auth.png)
+
+## Step 3
+After the user submits the credentials through this authentication popup, the browser will automatically encode the credentials using the `base64` encoding and send them in the `Authorization` header of the same request.
+
+### Step 4
+Upon receiving the request, the server will decode and verify the credentials. If the credentials are valid, the server will send the response to the client.
+
+So that is how Basic Authentication works.
+
+## Basic Authentication in Node.js
+I have prepared the sample project in Node.js, which can be found on GitHub [kamranahmedse/node-basic-auth-example](https://github.com/kamranahmedse/node-basic-auth-example). If you look at the codebase of the project, we have two files `index.js` with the following content:
+
+```javascript
+// src/index.js
+
+const express = require('express');
+const authMiddleware = require('./auth');
+
+const app = express();
+const port = 3000;
+
+// This middleware is where we have the
+// basic authentication implementation
+app.use(authMiddleware);
+
+app.get('/', (req, res) => {
+ res.send('Hello World!');
+});
+
+app.listen(port, () => {
+ console.log(`App running @ http://localhost:${port}`);
+})
+```
+
+As you can see, it's just a regular express server. `authMiddleware` registration is where we have all the code for "Basic Authentication". Here is the content of the middleware:
+
+```javascript
+// src/auth.js
+const base64 = require("base-64");
+
+function decodeCredentials(authHeader) {
+ // ...
+}
+
+module.exports = function(req, res, next) {
+ // Take the header and decode credentials
+ const [username, password] = decodeCredentials(req.headers.authorization || '');
+
+ // Verify the credentials
+ if (username === 'admin' && password === 'admin') {
+ return next();
+ }
+
+ // Respond with authenticate header on auth failure.
+ res.set('WWW-Authenticate', 'Basic realm="user_pages"');
+ res.status(401).send('Authentication required.');
+}
+```
+
+And that is how the basic authentication is implemented in Node.js.
diff --git a/src/guides/http-caching.md b/src/guides/http-caching.md
new file mode 100644
index 000000000..97ae0c1c7
--- /dev/null
+++ b/src/guides/http-caching.md
@@ -0,0 +1,273 @@
+---
+title: "HTTP Caching"
+description: "Everything you need to know about web caching"
+author:
+ name: "Kamran Ahmed"
+ url: "https://twitter.com/kamranahmedse"
+ imageUrl: "/authors/kamranahmedse.jpeg"
+seo:
+ title: "HTTP Caching - roadmap.sh"
+ description: "Everything you need to know about web caching"
+isNew: false
+type: "textual"
+date: 2018-11-29
+sitemap:
+ priority: 0.7
+ changefreq: "weekly"
+tags:
+ - "guide"
+ - "textual-guide"
+ - "guide-sitemap"
+---
+
+As users, we easily get frustrated by the buffering of videos, the images that take seconds to load, and pages that got stuck because the content is being loaded. Loading the resources from some cache is much faster than fetching the same from the originating server. It reduces latency, speeds up the loading of resources, decreases the load on the server, cuts down the bandwidth costs etc.
+
+### Introduction
+
+What is a web cache? It is something that sits somewhere between the client and the server, continuously looking at the requests and their responses, looking for any responses that can be cached. So that there is less time consumed when the same request is made again.
+
+![Web Cache](https://i.imgur.com/mJYVvTh.png)
+
+> Note that this image is just to give you an idea. Depending upon the type of cache, the place where it is implemented could vary. More on this later.
+
+Before we get into further details, let me give you an overview of the terms that will be used, further in the article
+
+- **Client** could be your browser or any application requesting the server for some resource
+- **Origin Server**, the source of truth, houses all the content required by the client and is responsible for fulfilling the client's requests.
+- **Stale Content** is cached but expired content
+- **Fresh Content** is the content available in the cache that hasn't expired yet
+- **Cache Validation** is the process of contacting the server to check the validity of the cached content and get it updated for when it is going to expire
+- **Cache Invalidation** is the process of removing any stale content available in the cache
+
+![](https://i.imgur.com/9MjlzvW.png)
+
+### Caching Locations
+
+Web cache can be shared or private depending upon the location where it exists. Here is the list of different caching locations
+
+- [Browser Cache](#browser-cache)
+- [Proxy Cache](#proxy-cache)
+- [Reverse Proxy Cache](#reverse-proxy-cache)
+
+#### Browser Cache
+
+You might have noticed that when you click the back button in your browser it takes less time to load the page than the time that it took during the first load; this is the browser cache in play. Browser cache is the most common location for caching and browsers usually reserve some space for it.
+
+![Web Cache](https://i.imgur.com/mJYVvTh.png)
+
+A browser cache is limited to just one user and unlike other caches, it can store the "private" responses. More on it later.
+
+#### Proxy Cache
+
+Unlike browser cache which serves a single user, proxy caches may serve hundreds of different users accessing the same content. They are usually implemented on a broader level by ISPs or any other independent entities for example.
+
+![Proxy Cache](https://i.imgur.com/3mj6e1O.png)
+
+#### Reverse Proxy Cache
+
+A Reverse proxy cache or surrogate cache is implemented close to the origin servers in order to reduce the load on the server. Unlike proxy caches which are implemented by ISPs etc to reduce the bandwidth usage in a network, surrogates or reverse proxy caches are implemented near the origin servers by the server administrators to reduce the load on the server.
+
+![Reverse Proxy Cache](http://i.imgur.com/Eg4Cru3.png)
+
+Although you can control the reverse proxy caches (since it is implemented by you on your server) you can not avoid or control browser and proxy caches. And if your website is not configured to use these caches properly, it will still be cached using whatever defaults are set on these caches.
+
+### Caching Headers
+
+So, how do we control the web cache? Whenever the server emits some response, it is accompanied by some HTTP headers to guide the caches on whether and how to cache this response. The content provider is the one that has to make sure to return proper HTTP headers to force the caches on how to cache the content.
+
+- [Expires](#expires)
+- [Pragma](#pragma)
+- [Cache-Control](#cache-control)
+ - [private](#private)
+ - [public](#public)
+ - [no-store](#no-store)
+ - [no-cache](#no-cache)
+ - [max-age: seconds](#max-age)
+ - [s-maxage: seconds](#s-maxage)
+ - [must-revalidate](#must-revalidate)
+ - [proxy-revalidate](#proxy-revalidate)
+ - [Mixing Values](#mixing-values)
+- [Validators](#validators)
+ - [ETag](#etag)
+ - [Last-Modified](#last-modified)
+
+#### Expires
+
+Before HTTP/1.1 and the introduction of `Cache-Control`, there was an `Expires` header which is simply a timestamp telling the caches how long should some content be considered fresh. A possible value to this header is the absolute expiry date; where a date has to be in GMT. Below is the sample header
+
+```html
+Expires: Mon, 13 Mar 2017 12:22:00 GMT
+```
+
+It should be noted that the date cannot be more than a year and if the date format is wrong, the content will be considered stale. Also, the clock on the cache has to be in sync with the clock on the server, otherwise, the desired results might not be achieved.
+
+Although the `Expires` header is still valid and is supported widely by the caches, preference should be given to HTTP/1.1 successor of it i.e. `Cache-Control`.
+
+#### Pragma
+
+Another one from the old, pre HTTP/1.1 days, is `Pragma`. Everything that it could do is now possible using the cache-control header given below. However, one thing I would like to point out about it is, that you might see `Pragma: no-cache` being used here and there in hopes of stopping the response from being cached. It might not necessarily work; as HTTP specification discusses it in the request headers and there is no mention of it in the response headers. Rather `Cache-Control` header should be used to control the caching.
+
+#### Cache-Control
+
+Cache-Control specifies how long and in what manner should the content be cached. This family of headers was introduced in HTTP/1.1 to overcome the limitations of the `Expires` header.
+
+Value for the `Cache-Control` header is composite i.e. it can have multiple directive/values. Let's look at the possible values that this header may contain.
+
+##### private
+Setting the cache to `private` means that the content will not be cached in any of the proxies and it will only be cached by the client (i.e. browser)
+
+```html
+Cache-Control: private
+```
+
+Having said that, don't let it fool you into thinking that setting this header will make your data any secure; you still have to use SSL for that purpose.
+
+##### public
+
+If set to `public`, apart from being cached by the client, it can also be cached by the proxies; serving many other users
+
+```html
+Cache-Control: public
+```
+
+##### no-store
+**`no-store`** specifies that the content is not to be cached by any of the caches
+
+```html
+Cache-Control: no-store
+```
+
+##### no-cache
+**`no-cache`** indicates that the cache can be maintained but the cached content is to be re-validated (using `ETag` for example) from the server before being served. That is, there is still a request to server but for validation and not to download the cached content.
+
+```html
+Cache-Control: max-age=3600, no-cache, public
+```
+
+##### max-age: seconds
+**`max-age`** specifies the number of seconds for which the content will be cached. For example, if the `cache-control` looks like below:
+
+```html
+Cache-Control: max-age=3600, public
+```
+it would mean that the content is publicly cacheable and will be considered stale after 60 minutes
+
+##### s-maxage: seconds
+**`s-maxage`** here `s-` prefix stands for shared. This directive specifically targets the shared caches. Like `max-age` it also gets the number of seconds for which something is to be cached. If present, it will override `max-age` and `expires` headers for shared caching.
+
+```html
+Cache-Control: s-maxage=3600, public
+```
+
+##### must-revalidate
+**`must-revalidate`** it might happen sometimes that if you have network problems and the content cannot be retrieved from the server, the browser may serve stale content without validation. `must-revalidate` avoids that. If this directive is present, it means that stale content cannot be served in any case and the data must be re-validated from the server before serving.
+
+```html
+Cache-Control: max-age=3600, public, must-revalidate
+```
+
+##### proxy-revalidate
+**`proxy-revalidate`** is similar to `must-revalidate` but it specifies the same for shared or proxy caches. In other words `proxy-revalidate` is to `must-revalidate` as `s-maxage` is to `max-age`. But why did they not call it `s-revalidate`?. I have no idea why, if you have any clue please leave a comment below.
+
+##### Mixing Values
+You can combine these directives in different ways to achieve different caching behaviors, however `no-cache/no-store` and `public/private` are mutually exclusive.
+
+If you specify both `no-store` and `no-cache`, `no-store` will be given precedence over `no-cache`.
+
+```html
+; If specified both
+Cache-Control: no-store, no-cache
+
+; Below will be considered
+Cache-Control: no-store
+```
+
+For `private/public`, for any unauthenticated requests cache is considered `public` and for any authenticated ones cache is considered `private`.
+
+### Validators
+
+Up until now we only discussed how the content is cached and how long the cached content is to be considered fresh but we did not discuss how the client does the validation from the server. Below we discuss the headers used for this purpose.
+
+#### ETag
+
+Etag or "entity tag" was introduced in HTTP/1.1 specs. Etag is just a unique identifier that the server attaches with some resource. This ETag is later on used by the client to make conditional HTTP requests stating `"give me this resource if ETag is not same as the ETag that I have"` and the content is downloaded only if the etags do not match.
+
+Method by which ETag is generated is not specified in the HTTP docs and usually some collision-resistant hash function is used to assign etags to each version of a resource. There could be two types of etags i.e. strong and weak
+
+```html
+ETag: "j82j8232ha7sdh0q2882" - Strong Etag
+ETag: W/"j82j8232ha7sdh0q2882" - Weak Etag (prefixed with `W/`)
+```
+
+A strong validating ETag means that two resources are **exactly** same and there is no difference between them at all. While a weak ETag means that two resources although not strictly the same but could be considered the same. Weak etags might be useful for dynamic content, for example.
+
+Now you know what etags are but how does the browser make this request? by making a request to server while sending the available Etag in `If-None-Match` header.
+
+Consider the scenario, you opened a web page which loaded a logo image with caching period of 60 seconds and ETag of `abc123xyz`. After about 30 minutes you reload the page, browser will notice that the logo which was fresh for 60 seconds is now stale; it will trigger a request to server, sending the ETag of the stale logo image in `if-none-match` header
+
+```html
+If-None-Match: "abc123xyz"
+```
+
+Server will then compare this ETag with the ETag of the current version of resource. If both etags are matched, server will send back the response of `304 Not Modified` which will tell the client that the copy that it has is still good and it will be considered fresh for another 60 seconds. If both the etags do not match i.e. the logo has likely changed and client will be sent the new logo which it will use to replace the stale logo that it has.
+
+#### Last-Modified
+
+Server might include the `Last-Modified` header indicating the date and time at which some content was last modified on.
+
+```html
+Last-Modified: Wed, 15 Mar 2017 12:30:26 GMT
+```
+
+When the content gets stale, client will make a conditional request including the last modified date that it has inside the header called `If-Modified-Since` to server to get the updated `Last-Modified` date; if it matches the date that the client has, `Last-Modified` date for the content is updated to be considered fresh for another `n` seconds. If the received `Last-Modified` date does not match the one that the client has, content is reloaded from the server and replaced with the content that client has.
+
+```html
+If-Modified-Since: Wed, 15 Mar 2017 12:30:26 GMT
+```
+
+You might be questioning now, what if the cached content has both the `Last-Modified` and `ETag` assigned to it? Well, in that case both are to be used i.e. there will not be any re-downloading of the resource if and only if `ETag` matches the newly retrieved one and so does the `Last-Modified` date. If either the `ETag` does not match or the `Last-Modified` is greater than the one from the server, content has to be downloaded again.
+
+### Where do I start?
+
+Now that we have got *everything* covered, let us put everything in perspective and see how you can use this information.
+
+#### Utilizing Server
+
+Before we get into the possible caching strategies , let me add the fact that most of the servers including Apache and Nginx allow you to implement your caching policy through the server so that you don't have to juggle with headers in your code.
+
+**For example**, if you are using Apache and you have your static content placed at `/static`, you can put below `.htaccess` file in the directory to make all the content in it be cached for an year using below
+
+```html
+# Cache everything for an year
+Header set Cache-Control "max-age=31536000, public"
+```
+
+You can further use `filesMatch` directive to add conditionals and use different caching strategy for different kinds of files e.g.
+
+```html
+# Cache any images for one year
+