- {author.name}
+ {author.frontmatter.name}
·
Illustrated Video
-
+
{frontmatter.title}
-
+
{frontmatter.description}
diff --git a/src/data/authors/ebrahim-bharmal.md b/src/data/authors/ebrahim-bharmal.md
new file mode 100644
index 000000000..3763d5972
--- /dev/null
+++ b/src/data/authors/ebrahim-bharmal.md
@@ -0,0 +1,8 @@
+---
+name: 'Ebrahim Bharmal'
+imageUrl: '/authors/ebrahimbharmal007.png'
+social:
+ twitter: 'https://twitter.com/BharmalEbrahim'
+---
+
+Full-stack developer interested in all things web development.
\ No newline at end of file
diff --git a/src/data/authors/fernando.md b/src/data/authors/fernando.md
new file mode 100644
index 000000000..8e936f656
--- /dev/null
+++ b/src/data/authors/fernando.md
@@ -0,0 +1,11 @@
+---
+name: 'Fernando Doglio'
+imageUrl: '/authors/fernando.jpeg'
+social:
+ twitter: 'https://twitter.com/deleteman123'
+ linkedin: 'https://www.linkedin.com/in/fernandodoglio'
+---
+
+With two decades of experience in Software Development, Fernando Doglio excels in diverse languages like Ruby, Perl, PHP, Python, and JavaScript. He's led teams in crafting scalable architectures for both in-house and cloud infrastructures.
+
+An author of 8 technical books and over 250 articles, Fernando's current role as a Dev Advocate allows him to blend his passion for coding with content creation, enhancing developer experiences with products through engaging outreach.
\ No newline at end of file
diff --git a/src/data/authors/jesse-li.md b/src/data/authors/jesse-li.md
new file mode 100644
index 000000000..4f7049c52
--- /dev/null
+++ b/src/data/authors/jesse-li.md
@@ -0,0 +1,9 @@
+---
+name: 'Jesse Li'
+imageUrl: '/authors/jesse.png'
+social:
+ twitter: 'https://twitter.com/__jesse_li'
+ github: 'https://github.com/veggiedefender'
+---
+
+Jesse has made several [interesting open-source projects](https://github.com/veggiedefender) and wrote some interesting [articles on his blog](https://blog.jse.li/) including the one he wrote on roadmap.sh.
\ No newline at end of file
diff --git a/src/data/authors/kamran.md b/src/data/authors/kamran.md
new file mode 100644
index 000000000..5b80785c4
--- /dev/null
+++ b/src/data/authors/kamran.md
@@ -0,0 +1,16 @@
+---
+name: 'Kamran Ahmed'
+imageUrl: '/authors/kamran.jpeg'
+employment:
+ title: 'Founder'
+ company: 'roadmap.sh'
+social:
+ linkedin: 'https://www.linkedin.com/in/kamrify'
+ twitter: 'https://twitter.com/kamrify'
+ github: 'https://github.com/kamranahmedse'
+ website: 'https://kamranahmed.info'
+---
+
+Kamran is the founder of **roadmap.sh**. He has a decade long experience working mostly with startups and scale-ups. Over the years, he has worked with a variety of technologies in a variety of domains and have worn several different hats. He is working full time on roadmap.sh at the moment.
+
+He is also a Google Developer Expert and a GitHub Star. He is a huge proponent of open-source, and has authored several popular open-source projects. He is [the second most starred developer](https://twitter.com/kamrify/status/1750345095587754382) on GitHub globally.
\ No newline at end of file
diff --git a/src/data/authors/peter-thaleikis.md b/src/data/authors/peter-thaleikis.md
new file mode 100644
index 000000000..635f41a86
--- /dev/null
+++ b/src/data/authors/peter-thaleikis.md
@@ -0,0 +1,9 @@
+---
+name: 'Peter Thaleikis'
+imageUrl: '/authors/peter-thaleikis.png'
+social:
+ twitter: 'https://twitter.com/spekulatius1984'
+ website: 'https://peterthaleikis.com/'
+---
+
+Peter Thaleikis a software engineer and business owner. He has been developing web applications since around 2000. Before he started his own software development company [Bring Your Own Ideas Ltd.](https://bringyourownideas.com/), he has been a Lead Developer for multiple organizations.
\ No newline at end of file
diff --git a/src/data/best-practices/backend-performance/backend-performance.json b/src/data/best-practices/backend-performance/backend-performance.json
new file mode 100644
index 000000000..c9adf67f6
--- /dev/null
+++ b/src/data/best-practices/backend-performance/backend-performance.json
@@ -0,0 +1,4290 @@
+{
+ "mockup": {
+ "controls": {
+ "control": [
+ {
+ "ID": "1585",
+ "typeID": "Arrow",
+ "zOrder": "4",
+ "w": "1",
+ "h": "81",
+ "measuredW": "150",
+ "measuredH": "100",
+ "x": "814",
+ "y": "2335",
+ "properties": {
+ "curvature": "0",
+ "leftArrow": "false",
+ "rightArrow": "false",
+ "stroke": "dotted",
+ "color": "10027263",
+ "p0": {
+ "x": 0,
+ "y": 0
+ },
+ "p1": {
+ "x": 0.49999999999999994,
+ "y": 0
+ },
+ "p2": {
+ "x": 0,
+ "y": 81.09090909090901
+ }
+ }
+ },
+ {
+ "ID": "1589",
+ "typeID": "Arrow",
+ "zOrder": "5",
+ "w": "587",
+ "h": "1",
+ "measuredW": "150",
+ "measuredH": "100",
+ "x": "225",
+ "y": "718",
+ "properties": {
+ "curvature": "0",
+ "leftArrow": "false",
+ "rightArrow": "false",
+ "color": "4273622",
+ "p0": {
+ "x": -0.2686368305519409,
+ "y": 0
+ },
+ "p1": {
+ "x": 0.5001077701859015,
+ "y": 0.00033913823433391014
+ },
+ "p2": {
+ "x": 587.2092515685516,
+ "y": 0
+ }
+ }
+ },
+ {
+ "ID": "1590",
+ "typeID": "Arrow",
+ "zOrder": "6",
+ "w": "591",
+ "h": "1",
+ "measuredW": "150",
+ "measuredH": "100",
+ "x": "222",
+ "y": "413",
+ "properties": {
+ "curvature": "0",
+ "leftArrow": "false",
+ "rightArrow": "false",
+ "color": "4273622",
+ "p0": {
+ "x": 0,
+ "y": 0
+ },
+ "p1": {
+ "x": 0.4999449522687746,
+ "y": 0.0003335799224988862
+ },
+ "p2": {
+ "x": 590.6951281847257,
+ "y": 0
+ }
+ }
+ },
+ {
+ "ID": "1591",
+ "typeID": "Canvas",
+ "zOrder": "7",
+ "w": "189",
+ "h": "50",
+ "measuredW": "100",
+ "measuredH": "70",
+ "x": "360",
+ "y": "389",
+ "properties": {
+ "color": "16776960"
+ }
+ },
+ {
+ "ID": "1592",
+ "typeID": "__group__",
+ "zOrder": "8",
+ "measuredW": "30",
+ "measuredH": "30",
+ "w": "30",
+ "h": "30",
+ "x": "218",
+ "y": "512",
+ "properties": {
+ "controlName": "check:caching-strategies"
+ },
+ "children": {
+ "controls": {
+ "control": [
+ {
+ "ID": "0",
+ "typeID": "TextArea",
+ "zOrder": "0",
+ "w": "30",
+ "h": "30",
+ "measuredW": "200",
+ "measuredH": "140",
+ "x": "0",
+ "y": "0"
+ }
+ ]
+ }
+ }
+ },
+ {
+ "ID": "1593",
+ "typeID": "__group__",
+ "zOrder": "9",
+ "measuredW": "508",
+ "measuredH": "58",
+ "w": "508",
+ "h": "58",
+ "x": "264",
+ "y": "512",
+ "properties": {
+ "controlName": "caching-strategies"
+ },
+ "children": {
+ "controls": {
+ "control": [
+ {
+ "ID": "0",
+ "typeID": "Label",
+ "zOrder": "0",
+ "measuredW": "508",
+ "measuredH": "28",
+ "x": "0",
+ "y": "0",
+ "properties": {
+ "size": "20",
+ "text": "Use cache aside, write-through, or read-through caching"
+ }
+ },
+ {
+ "ID": "1",
+ "typeID": "Label",
+ "zOrder": "1",
+ "measuredW": "442",
+ "measuredH": "28",
+ "x": "0",
+ "y": "30",
+ "properties": {
+ "size": "20",
+ "text": "patterns based on your application requirements."
+ }
+ }
+ ]
+ }
+ }
+ },
+ {
+ "ID": "1594",
+ "typeID": "Label",
+ "zOrder": "10",
+ "measuredW": "323",
+ "measuredH": "40",
+ "x": "661",
+ "y": "226",
+ "properties": {
+ "size": "32",
+ "text": "Backend Performance"
+ }
+ },
+ {
+ "ID": "1595",
+ "typeID": "Canvas",
+ "zOrder": "11",
+ "w": "361",
+ "h": "150",
+ "measuredW": "100",
+ "measuredH": "70",
+ "x": "1059",
+ "y": "158"
+ },
+ {
+ "ID": "1596",
+ "typeID": "Label",
+ "zOrder": "12",
+ "measuredW": "332",
+ "measuredH": "26",
+ "x": "1075",
+ "y": "176",
+ "properties": {
+ "text": "Find the detailed version of this checklist",
+ "size": "18"
+ }
+ },
+ {
+ "ID": "1597",
+ "typeID": "Label",
+ "zOrder": "13",
+ "measuredW": "318",
+ "measuredH": "26",
+ "x": "1075",
+ "y": "204",
+ "properties": {
+ "size": "18",
+ "text": "With details on how to implement these"
+ }
+ },
+ {
+ "ID": "1598",
+ "typeID": "__group__",
+ "zOrder": "14",
+ "measuredW": "329",
+ "measuredH": "51",
+ "w": "329",
+ "h": "51",
+ "x": "1075",
+ "y": "240",
+ "properties": {
+ "controlName": "ext_link:roadmap.sh"
+ },
+ "children": {
+ "controls": {
+ "control": [
+ {
+ "ID": "0",
+ "typeID": "Canvas",
+ "zOrder": "0",
+ "w": "329",
+ "h": "51",
+ "measuredW": "100",
+ "measuredH": "70",
+ "x": "0",
+ "y": "0",
+ "properties": {
+ "color": "4273622",
+ "borderColor": "4273622"
+ }
+ },
+ {
+ "ID": "1",
+ "typeID": "Label",
+ "zOrder": "1",
+ "measuredW": "172",
+ "measuredH": "28",
+ "x": "79",
+ "y": "12",
+ "properties": {
+ "color": "16777215",
+ "size": "20",
+ "text": "https://roadmap.sh"
+ }
+ }
+ ]
+ }
+ }
+ },
+ {
+ "ID": "1599",
+ "typeID": "Canvas",
+ "zOrder": "15",
+ "w": "373",
+ "h": "169",
+ "measuredW": "100",
+ "measuredH": "70",
+ "x": "196",
+ "y": "148"
+ },
+ {
+ "ID": "1600",
+ "typeID": "__group__",
+ "zOrder": "16",
+ "measuredW": "189",
+ "measuredH": "27",
+ "w": "189",
+ "h": "27",
+ "x": "226",
+ "y": "222",
+ "properties": {
+ "controlName": "ext_link:roadmap.sh/backend"
+ },
+ "children": {
+ "controls": {
+ "control": [
+ {
+ "ID": "0",
+ "typeID": "Label",
+ "zOrder": "0",
+ "measuredW": "156",
+ "measuredH": "26",
+ "x": "33",
+ "y": "0",
+ "properties": {
+ "size": "18",
+ "text": "Backend Roadmap"
+ }
+ },
+ {
+ "ID": "1",
+ "typeID": "__group__",
+ "zOrder": "1",
+ "measuredW": "24",
+ "measuredH": "24",
+ "w": "24",
+ "h": "24",
+ "x": "0",
+ "y": "3",
+ "children": {
+ "controls": {
+ "control": [
+ {
+ "ID": "0",
+ "typeID": "Icon",
+ "zOrder": "0",
+ "measuredW": "24",
+ "measuredH": "24",
+ "x": "0",
+ "y": "0",
+ "properties": {
+ "color": "16777215",
+ "icon": {
+ "ID": "circle",
+ "size": "small"
+ }
+ }
+ },
+ {
+ "ID": "1",
+ "typeID": "Icon",
+ "zOrder": "1",
+ "measuredW": "24",
+ "measuredH": "24",
+ "x": "0",
+ "y": "0",
+ "properties": {
+ "color": "10066329",
+ "icon": {
+ "ID": "check-circle",
+ "size": "small"
+ }
+ }
+ }
+ ]
+ }
+ }
+ }
+ ]
+ }
+ }
+ },
+ {
+ "ID": "1601",
+ "typeID": "__group__",
+ "zOrder": "17",
+ "measuredW": "238",
+ "measuredH": "27",
+ "w": "238",
+ "h": "27",
+ "x": "226",
+ "y": "258",
+ "properties": {
+ "controlName": "ext_link:roadmap.sh/system-design"
+ },
+ "children": {
+ "controls": {
+ "control": [
+ {
+ "ID": "0",
+ "typeID": "Label",
+ "zOrder": "0",
+ "measuredW": "205",
+ "measuredH": "26",
+ "x": "33",
+ "y": "0",
+ "properties": {
+ "size": "18",
+ "text": "System Design Roadmap"
+ }
+ },
+ {
+ "ID": "1",
+ "typeID": "__group__",
+ "zOrder": "1",
+ "measuredW": "24",
+ "measuredH": "24",
+ "w": "24",
+ "h": "24",
+ "x": "0",
+ "y": "3",
+ "children": {
+ "controls": {
+ "control": [
+ {
+ "ID": "0",
+ "typeID": "Icon",
+ "zOrder": "0",
+ "measuredW": "24",
+ "measuredH": "24",
+ "x": "0",
+ "y": "0",
+ "properties": {
+ "color": "16777215",
+ "icon": {
+ "ID": "circle",
+ "size": "small"
+ }
+ }
+ },
+ {
+ "ID": "1",
+ "typeID": "Icon",
+ "zOrder": "1",
+ "measuredW": "24",
+ "measuredH": "24",
+ "x": "0",
+ "y": "0",
+ "properties": {
+ "color": "10066329",
+ "icon": {
+ "ID": "check-circle",
+ "size": "small"
+ }
+ }
+ }
+ ]
+ }
+ }
+ }
+ ]
+ }
+ }
+ },
+ {
+ "ID": "1602",
+ "typeID": "Label",
+ "zOrder": "18",
+ "measuredW": "209",
+ "measuredH": "32",
+ "x": "226",
+ "y": "172",
+ "properties": {
+ "size": "24",
+ "text": "Related Roadmaps"
+ }
+ },
+ {
+ "ID": "1603",
+ "typeID": "Arrow",
+ "zOrder": "19",
+ "w": "1",
+ "h": "76",
+ "measuredW": "150",
+ "measuredH": "100",
+ "x": "812",
+ "y": "134",
+ "properties": {
+ "curvature": "0",
+ "leftArrow": "false",
+ "rightArrow": "false",
+ "p0": {
+ "x": 0,
+ "y": 0
+ },
+ "p1": {
+ "x": 0.49999999999999994,
+ "y": 0
+ },
+ "p2": {
+ "x": 0,
+ "y": 76.17275043077757
+ },
+ "stroke": "dotted",
+ "color": "10027263"
+ }
+ },
+ {
+ "ID": "1682",
+ "typeID": "Label",
+ "zOrder": "20",
+ "measuredW": "75",
+ "measuredH": "28",
+ "x": "417",
+ "y": "400",
+ "properties": {
+ "size": "20",
+ "text": "Caching"
+ }
+ },
+ {
+ "ID": "1683",
+ "typeID": "Arrow",
+ "zOrder": "21",
+ "w": "1",
+ "h": "2056",
+ "measuredW": "150",
+ "measuredH": "100",
+ "x": "814",
+ "y": "287",
+ "properties": {
+ "curvature": "0",
+ "leftArrow": "false",
+ "rightArrow": "false",
+ "color": "4273622",
+ "p0": {
+ "x": 0,
+ "y": -0.48484848484849863
+ },
+ "p1": {
+ "x": 0.4999999999999998,
+ "y": 0
+ },
+ "p2": {
+ "x": 0,
+ "y": 2055.448967650736
+ }
+ }
+ },
+ {
+ "ID": "1701",
+ "typeID": "TextArea",
+ "zOrder": "22",
+ "w": "471",
+ "h": "118",
+ "measuredW": "200",
+ "measuredH": "140",
+ "x": "578",
+ "y": "2249"
+ },
+ {
+ "ID": "1702",
+ "typeID": "Label",
+ "zOrder": "23",
+ "measuredW": "366",
+ "measuredH": "25",
+ "x": "631",
+ "y": "2268",
+ "properties": {
+ "size": "17",
+ "text": "Continue Learning with following relevant tracks"
+ }
+ },
+ {
+ "ID": "1703",
+ "typeID": "__group__",
+ "zOrder": "24",
+ "measuredW": "235",
+ "measuredH": "44",
+ "w": "235",
+ "h": "44",
+ "x": "801",
+ "y": "2305",
+ "properties": {
+ "controlName": "ext_link:roadmap.sh/system-design"
+ },
+ "children": {
+ "controls": {
+ "control": [
+ {
+ "ID": "0",
+ "typeID": "TextArea",
+ "zOrder": "0",
+ "w": "235",
+ "h": "44",
+ "measuredW": "200",
+ "measuredH": "140",
+ "x": "0",
+ "y": "0",
+ "properties": {
+ "color": "16770457"
+ }
+ },
+ {
+ "ID": "1",
+ "typeID": "Label",
+ "zOrder": "1",
+ "measuredW": "194",
+ "measuredH": "25",
+ "x": "21",
+ "y": "9",
+ "properties": {
+ "size": "17",
+ "text": "System Design Roadmap"
+ }
+ }
+ ]
+ }
+ }
+ },
+ {
+ "ID": "1704",
+ "typeID": "__group__",
+ "zOrder": "25",
+ "measuredW": "198",
+ "measuredH": "44",
+ "w": "198",
+ "h": "44",
+ "x": "593",
+ "y": "2305",
+ "properties": {
+ "controlName": "ext_link:roadmap.sh/backend"
+ },
+ "children": {
+ "controls": {
+ "control": [
+ {
+ "ID": "0",
+ "typeID": "TextArea",
+ "zOrder": "0",
+ "w": "198",
+ "h": "44",
+ "measuredW": "200",
+ "measuredH": "140",
+ "x": "0",
+ "y": "0",
+ "properties": {
+ "color": "16770457"
+ }
+ },
+ {
+ "ID": "1",
+ "typeID": "Label",
+ "zOrder": "1",
+ "measuredW": "147",
+ "measuredH": "25",
+ "x": "25",
+ "y": "9",
+ "properties": {
+ "size": "17",
+ "text": "Backend Roadmap"
+ }
+ }
+ ]
+ }
+ }
+ },
+ {
+ "ID": "1705",
+ "typeID": "__group__",
+ "zOrder": "26",
+ "measuredW": "30",
+ "measuredH": "30",
+ "w": "30",
+ "h": "30",
+ "x": "218",
+ "y": "589",
+ "properties": {
+ "controlName": "check:cache-invalidation"
+ },
+ "children": {
+ "controls": {
+ "control": [
+ {
+ "ID": "0",
+ "typeID": "TextArea",
+ "zOrder": "0",
+ "w": "30",
+ "h": "30",
+ "measuredW": "200",
+ "measuredH": "140",
+ "x": "0",
+ "y": "0"
+ }
+ ]
+ }
+ }
+ },
+ {
+ "ID": "1707",
+ "typeID": "Canvas",
+ "zOrder": "28",
+ "w": "189",
+ "h": "50",
+ "measuredW": "100",
+ "measuredH": "70",
+ "x": "362",
+ "y": "694",
+ "properties": {
+ "color": "16776960"
+ }
+ },
+ {
+ "ID": "1708",
+ "typeID": "Label",
+ "zOrder": "29",
+ "measuredW": "98",
+ "measuredH": "28",
+ "x": "408",
+ "y": "705",
+ "properties": {
+ "size": "20",
+ "text": "Databases"
+ }
+ },
+ {
+ "ID": "1709",
+ "typeID": "__group__",
+ "zOrder": "30",
+ "measuredW": "30",
+ "measuredH": "30",
+ "w": "30",
+ "h": "30",
+ "x": "218",
+ "y": "771",
+ "properties": {
+ "controlName": "check:connection-pooling"
+ },
+ "children": {
+ "controls": {
+ "control": [
+ {
+ "ID": "0",
+ "typeID": "TextArea",
+ "zOrder": "0",
+ "w": "30",
+ "h": "30",
+ "measuredW": "200",
+ "measuredH": "140",
+ "x": "0",
+ "y": "0"
+ }
+ ]
+ }
+ }
+ },
+ {
+ "ID": "1710",
+ "typeID": "__group__",
+ "zOrder": "31",
+ "measuredW": "503",
+ "measuredH": "28",
+ "w": "503",
+ "h": "28",
+ "x": "262",
+ "y": "772",
+ "properties": {
+ "controlName": "connection-pooling"
+ },
+ "children": {
+ "controls": {
+ "control": [
+ {
+ "ID": "0",
+ "typeID": "Label",
+ "zOrder": "0",
+ "measuredW": "503",
+ "measuredH": "28",
+ "x": "0",
+ "y": "0",
+ "properties": {
+ "size": "20",
+ "text": "Use connection pooling to reduce connection overhead"
+ }
+ }
+ ]
+ }
+ }
+ },
+ {
+ "ID": "1711",
+ "typeID": "__group__",
+ "zOrder": "32",
+ "measuredW": "30",
+ "measuredH": "30",
+ "w": "30",
+ "h": "30",
+ "x": "218",
+ "y": "1073",
+ "properties": {
+ "controlName": "check:pagination-large-data"
+ },
+ "children": {
+ "controls": {
+ "control": [
+ {
+ "ID": "0",
+ "typeID": "TextArea",
+ "zOrder": "0",
+ "w": "30",
+ "h": "30",
+ "measuredW": "200",
+ "measuredH": "140",
+ "x": "0",
+ "y": "0"
+ }
+ ]
+ }
+ }
+ },
+ {
+ "ID": "1712",
+ "typeID": "__group__",
+ "zOrder": "33",
+ "measuredW": "437",
+ "measuredH": "28",
+ "w": "437",
+ "h": "28",
+ "x": "262",
+ "y": "1074",
+ "properties": {
+ "controlName": "pagination-large-data"
+ },
+ "children": {
+ "controls": {
+ "control": [
+ {
+ "ID": "0",
+ "typeID": "Label",
+ "zOrder": "0",
+ "measuredW": "437",
+ "measuredH": "28",
+ "x": "0",
+ "y": "0",
+ "properties": {
+ "size": "20",
+ "text": "Implement efficient pagination for large datasets"
+ }
+ }
+ ]
+ }
+ }
+ },
+ {
+ "ID": "1713",
+ "typeID": "__group__",
+ "zOrder": "34",
+ "measuredW": "30",
+ "measuredH": "30",
+ "w": "30",
+ "h": "30",
+ "x": "218",
+ "y": "918",
+ "properties": {
+ "controlName": "check:db-indexes"
+ },
+ "children": {
+ "controls": {
+ "control": [
+ {
+ "ID": "0",
+ "typeID": "TextArea",
+ "zOrder": "0",
+ "w": "30",
+ "h": "30",
+ "measuredW": "200",
+ "measuredH": "140",
+ "x": "0",
+ "y": "0"
+ }
+ ]
+ }
+ }
+ },
+ {
+ "ID": "1714",
+ "typeID": "__group__",
+ "zOrder": "35",
+ "measuredW": "303",
+ "measuredH": "28",
+ "w": "303",
+ "h": "28",
+ "x": "262",
+ "y": "919",
+ "properties": {
+ "controlName": "db-indexes"
+ },
+ "children": {
+ "controls": {
+ "control": [
+ {
+ "ID": "0",
+ "typeID": "Label",
+ "zOrder": "0",
+ "measuredW": "303",
+ "measuredH": "28",
+ "x": "0",
+ "y": "0",
+ "properties": {
+ "size": "20",
+ "text": "Create efficient database indexes"
+ }
+ }
+ ]
+ }
+ }
+ },
+ {
+ "ID": "1715",
+ "typeID": "__group__",
+ "zOrder": "36",
+ "measuredW": "30",
+ "measuredH": "30",
+ "w": "30",
+ "h": "30",
+ "x": "218",
+ "y": "1113",
+ "properties": {
+ "controlName": "check:select-star"
+ },
+ "children": {
+ "controls": {
+ "control": [
+ {
+ "ID": "0",
+ "typeID": "TextArea",
+ "zOrder": "0",
+ "w": "30",
+ "h": "30",
+ "measuredW": "200",
+ "measuredH": "140",
+ "x": "0",
+ "y": "0"
+ }
+ ]
+ }
+ }
+ },
+ {
+ "ID": "1716",
+ "typeID": "__group__",
+ "zOrder": "37",
+ "measuredW": "511",
+ "measuredH": "28",
+ "w": "511",
+ "h": "28",
+ "x": "262",
+ "y": "1114",
+ "properties": {
+ "controlName": "select-star"
+ },
+ "children": {
+ "controls": {
+ "control": [
+ {
+ "ID": "0",
+ "typeID": "Label",
+ "zOrder": "0",
+ "measuredW": "511",
+ "measuredH": "28",
+ "x": "0",
+ "y": "0",
+ "properties": {
+ "size": "20",
+ "text": "Avoid SELECT * queries and fetch only required columns"
+ }
+ }
+ ]
+ }
+ }
+ },
+ {
+ "ID": "1718",
+ "typeID": "Canvas",
+ "zOrder": "38",
+ "w": "189",
+ "h": "50",
+ "measuredW": "100",
+ "measuredH": "70",
+ "x": "362",
+ "y": "1592",
+ "properties": {
+ "color": "16776960"
+ }
+ },
+ {
+ "ID": "1719",
+ "typeID": "Label",
+ "zOrder": "39",
+ "measuredW": "73",
+ "measuredH": "28",
+ "x": "420",
+ "y": "1603",
+ "properties": {
+ "size": "20",
+ "text": "Security"
+ }
+ },
+ {
+ "ID": "1720",
+ "typeID": "__group__",
+ "zOrder": "40",
+ "measuredW": "30",
+ "measuredH": "30",
+ "w": "30",
+ "h": "30",
+ "x": "218",
+ "y": "1670",
+ "properties": {
+ "controlName": "check:up-to-date"
+ },
+ "children": {
+ "controls": {
+ "control": [
+ {
+ "ID": "0",
+ "typeID": "TextArea",
+ "zOrder": "0",
+ "w": "30",
+ "h": "30",
+ "measuredW": "200",
+ "measuredH": "140",
+ "x": "0",
+ "y": "0"
+ }
+ ]
+ }
+ }
+ },
+ {
+ "ID": "1721",
+ "typeID": "__group__",
+ "zOrder": "41",
+ "measuredW": "323",
+ "measuredH": "28",
+ "w": "323",
+ "h": "28",
+ "x": "264",
+ "y": "1671",
+ "properties": {
+ "controlName": "up-to-date"
+ },
+ "children": {
+ "controls": {
+ "control": [
+ {
+ "ID": "0",
+ "typeID": "Label",
+ "zOrder": "0",
+ "measuredW": "323",
+ "measuredH": "28",
+ "x": "0",
+ "y": "0",
+ "properties": {
+ "size": "20",
+ "text": "Keep your dependencies up to date"
+ }
+ }
+ ]
+ }
+ }
+ },
+ {
+ "ID": "1722",
+ "typeID": "__group__",
+ "zOrder": "42",
+ "measuredW": "30",
+ "measuredH": "30",
+ "w": "30",
+ "h": "30",
+ "x": "218",
+ "y": "1782",
+ "properties": {
+ "controlName": "check:request-throttling"
+ },
+ "children": {
+ "controls": {
+ "control": [
+ {
+ "ID": "0",
+ "typeID": "TextArea",
+ "zOrder": "0",
+ "w": "30",
+ "h": "30",
+ "measuredW": "200",
+ "measuredH": "140",
+ "x": "0",
+ "y": "0"
+ }
+ ]
+ }
+ }
+ },
+ {
+ "ID": "1723",
+ "typeID": "__group__",
+ "zOrder": "43",
+ "measuredW": "407",
+ "measuredH": "28",
+ "w": "407",
+ "h": "28",
+ "x": "264",
+ "y": "1783",
+ "properties": {
+ "controlName": "request-throttling"
+ },
+ "children": {
+ "controls": {
+ "control": [
+ {
+ "ID": "0",
+ "typeID": "Label",
+ "zOrder": "0",
+ "measuredW": "407",
+ "measuredH": "28",
+ "x": "0",
+ "y": "0",
+ "properties": {
+ "size": "20",
+ "text": "Implement request throttling and rate limiting"
+ }
+ }
+ ]
+ }
+ }
+ },
+ {
+ "ID": "1730",
+ "typeID": "__group__",
+ "zOrder": "44",
+ "measuredW": "30",
+ "measuredH": "30",
+ "w": "30",
+ "h": "30",
+ "x": "853",
+ "y": "471",
+ "properties": {
+ "controlName": "check:reasonable-payload"
+ },
+ "children": {
+ "controls": {
+ "control": [
+ {
+ "ID": "0",
+ "typeID": "TextArea",
+ "zOrder": "0",
+ "w": "30",
+ "h": "30",
+ "measuredW": "200",
+ "measuredH": "140",
+ "x": "0",
+ "y": "0"
+ }
+ ]
+ }
+ }
+ },
+ {
+ "ID": "1731",
+ "typeID": "__group__",
+ "zOrder": "45",
+ "measuredW": "347",
+ "measuredH": "28",
+ "w": "347",
+ "h": "28",
+ "x": "899",
+ "y": "472",
+ "properties": {
+ "controlName": "reasonable-payload"
+ },
+ "children": {
+ "controls": {
+ "control": [
+ {
+ "ID": "0",
+ "typeID": "Label",
+ "zOrder": "0",
+ "measuredW": "347",
+ "measuredH": "28",
+ "x": "0",
+ "y": "0",
+ "properties": {
+ "size": "20",
+ "text": "Enforce reasonable payload size limits"
+ }
+ }
+ ]
+ }
+ }
+ },
+ {
+ "ID": "1732",
+ "typeID": "__group__",
+ "zOrder": "46",
+ "measuredW": "30",
+ "measuredH": "30",
+ "w": "30",
+ "h": "30",
+ "x": "853",
+ "y": "512",
+ "properties": {
+ "controlName": "check:enable-compression"
+ },
+ "children": {
+ "controls": {
+ "control": [
+ {
+ "ID": "0",
+ "typeID": "TextArea",
+ "zOrder": "0",
+ "w": "30",
+ "h": "30",
+ "measuredW": "200",
+ "measuredH": "140",
+ "x": "0",
+ "y": "0"
+ }
+ ]
+ }
+ }
+ },
+ {
+ "ID": "1733",
+ "typeID": "__group__",
+ "zOrder": "47",
+ "measuredW": "314",
+ "measuredH": "28",
+ "w": "314",
+ "h": "28",
+ "x": "899",
+ "y": "513",
+ "properties": {
+ "controlName": "enable-compression"
+ },
+ "children": {
+ "controls": {
+ "control": [
+ {
+ "ID": "0",
+ "typeID": "Label",
+ "zOrder": "0",
+ "measuredW": "314",
+ "measuredH": "28",
+ "x": "0",
+ "y": "0",
+ "properties": {
+ "size": "20",
+ "text": "Enable compression for responses"
+ }
+ }
+ ]
+ }
+ }
+ },
+ {
+ "ID": "1734",
+ "typeID": "Arrow",
+ "zOrder": "3",
+ "w": "587",
+ "h": "1",
+ "measuredW": "150",
+ "measuredH": "100",
+ "x": "225",
+ "y": "1617",
+ "properties": {
+ "curvature": "0",
+ "leftArrow": "false",
+ "rightArrow": "false",
+ "color": "4273622",
+ "p0": {
+ "x": -0.2686368305519409,
+ "y": 0
+ },
+ "p1": {
+ "x": 0.5001077701859015,
+ "y": 0.00033913823433391014
+ },
+ "p2": {
+ "x": 587.2092515685516,
+ "y": 0
+ }
+ }
+ },
+ {
+ "ID": "1736",
+ "typeID": "__group__",
+ "zOrder": "48",
+ "measuredW": "30",
+ "measuredH": "30",
+ "w": "30",
+ "h": "30",
+ "x": "218",
+ "y": "1222",
+ "properties": {
+ "controlName": "check:join-operations"
+ },
+ "children": {
+ "controls": {
+ "control": [
+ {
+ "ID": "0",
+ "typeID": "TextArea",
+ "zOrder": "0",
+ "w": "30",
+ "h": "30",
+ "measuredW": "200",
+ "measuredH": "140",
+ "x": "0",
+ "y": "0"
+ }
+ ]
+ }
+ }
+ },
+ {
+ "ID": "1737",
+ "typeID": "__group__",
+ "zOrder": "49",
+ "measuredW": "494",
+ "measuredH": "28",
+ "w": "494",
+ "h": "28",
+ "x": "262",
+ "y": "1223",
+ "properties": {
+ "controlName": "join-operations"
+ },
+ "children": {
+ "controls": {
+ "control": [
+ {
+ "ID": "0",
+ "typeID": "Label",
+ "zOrder": "0",
+ "measuredW": "494",
+ "measuredH": "28",
+ "x": "0",
+ "y": "0",
+ "properties": {
+ "size": "20",
+ "text": "Optimize JOIN operations and avoid unnecessary joins"
+ }
+ }
+ ]
+ }
+ }
+ },
+ {
+ "ID": "1741",
+ "typeID": "Canvas",
+ "zOrder": "51",
+ "w": "281",
+ "h": "50",
+ "measuredW": "100",
+ "measuredH": "70",
+ "x": "965",
+ "y": "389",
+ "properties": {
+ "color": "16776960"
+ }
+ },
+ {
+ "ID": "1742",
+ "typeID": "Label",
+ "zOrder": "52",
+ "measuredW": "214",
+ "measuredH": "28",
+ "x": "999",
+ "y": "400",
+ "properties": {
+ "size": "20",
+ "text": "Optimize API Response"
+ }
+ },
+ {
+ "ID": "1743",
+ "typeID": "Arrow",
+ "zOrder": "50",
+ "w": "591",
+ "h": "1",
+ "measuredW": "150",
+ "measuredH": "100",
+ "x": "818",
+ "y": "413",
+ "properties": {
+ "curvature": "0",
+ "leftArrow": "false",
+ "rightArrow": "false",
+ "color": "4273622",
+ "p0": {
+ "x": 0,
+ "y": 0
+ },
+ "p1": {
+ "x": 0.4999449522687746,
+ "y": 0.0003335799224988862
+ },
+ "p2": {
+ "x": 590.6951281847257,
+ "y": 0
+ }
+ }
+ },
+ {
+ "ID": "1744",
+ "typeID": "__group__",
+ "zOrder": "53",
+ "measuredW": "30",
+ "measuredH": "30",
+ "w": "30",
+ "h": "30",
+ "x": "853",
+ "y": "555",
+ "properties": {
+ "controlName": "check:implement-pagination"
+ },
+ "children": {
+ "controls": {
+ "control": [
+ {
+ "ID": "0",
+ "typeID": "TextArea",
+ "zOrder": "0",
+ "w": "30",
+ "h": "30",
+ "measuredW": "200",
+ "measuredH": "140",
+ "x": "0",
+ "y": "0"
+ }
+ ]
+ }
+ }
+ },
+ {
+ "ID": "1745",
+ "typeID": "__group__",
+ "zOrder": "54",
+ "measuredW": "437",
+ "measuredH": "28",
+ "w": "437",
+ "h": "28",
+ "x": "899",
+ "y": "556",
+ "properties": {
+ "controlName": "implement-pagination"
+ },
+ "children": {
+ "controls": {
+ "control": [
+ {
+ "ID": "0",
+ "typeID": "Label",
+ "zOrder": "0",
+ "measuredW": "437",
+ "measuredH": "28",
+ "x": "0",
+ "y": "0",
+ "properties": {
+ "size": "20",
+ "text": "Implement efficient pagination for large datasets"
+ }
+ }
+ ]
+ }
+ }
+ },
+ {
+ "ID": "1746",
+ "typeID": "Canvas",
+ "zOrder": "55",
+ "w": "300",
+ "h": "50",
+ "measuredW": "100",
+ "measuredH": "70",
+ "x": "956",
+ "y": "689",
+ "properties": {
+ "color": "16776960"
+ }
+ },
+ {
+ "ID": "1747",
+ "typeID": "Label",
+ "zOrder": "56",
+ "measuredW": "125",
+ "measuredH": "28",
+ "x": "1043",
+ "y": "701",
+ "properties": {
+ "size": "20",
+ "text": "Asynchronism"
+ }
+ },
+ {
+ "ID": "1748",
+ "typeID": "Arrow",
+ "zOrder": "2",
+ "w": "587",
+ "h": "1",
+ "measuredW": "150",
+ "measuredH": "100",
+ "x": "818",
+ "y": "717",
+ "properties": {
+ "curvature": "0",
+ "leftArrow": "false",
+ "rightArrow": "false",
+ "color": "4273622",
+ "p0": {
+ "x": -0.2686368305519409,
+ "y": 0
+ },
+ "p1": {
+ "x": 0.5001077701859015,
+ "y": 0.00033913823433391014
+ },
+ "p2": {
+ "x": 587.2092515685516,
+ "y": 0
+ }
+ }
+ },
+ {
+ "ID": "1751",
+ "typeID": "__group__",
+ "zOrder": "57",
+ "measuredW": "30",
+ "measuredH": "30",
+ "w": "30",
+ "h": "30",
+ "x": "853",
+ "y": "767",
+ "properties": {
+ "controlName": "check:offload-heavy"
+ },
+ "children": {
+ "controls": {
+ "control": [
+ {
+ "ID": "0",
+ "typeID": "TextArea",
+ "zOrder": "0",
+ "w": "30",
+ "h": "30",
+ "measuredW": "200",
+ "measuredH": "140",
+ "x": "0",
+ "y": "0"
+ }
+ ]
+ }
+ }
+ },
+ {
+ "ID": "1752",
+ "typeID": "__group__",
+ "zOrder": "58",
+ "measuredW": "449",
+ "measuredH": "28",
+ "w": "449",
+ "h": "28",
+ "x": "899",
+ "y": "768",
+ "properties": {
+ "controlName": "offload-heavy"
+ },
+ "children": {
+ "controls": {
+ "control": [
+ {
+ "ID": "0",
+ "typeID": "Label",
+ "zOrder": "0",
+ "measuredW": "449",
+ "measuredH": "28",
+ "x": "0",
+ "y": "0",
+ "properties": {
+ "size": "20",
+ "text": "Offload heavy tasks to background jobs or queues"
+ }
+ }
+ ]
+ }
+ }
+ },
+ {
+ "ID": "1753",
+ "typeID": "__group__",
+ "zOrder": "59",
+ "measuredW": "30",
+ "measuredH": "30",
+ "w": "30",
+ "h": "30",
+ "x": "853",
+ "y": "807",
+ "properties": {
+ "controlName": "check:message-brokers"
+ },
+ "children": {
+ "controls": {
+ "control": [
+ {
+ "ID": "0",
+ "typeID": "TextArea",
+ "zOrder": "0",
+ "w": "30",
+ "h": "30",
+ "measuredW": "200",
+ "measuredH": "140",
+ "x": "0",
+ "y": "0"
+ }
+ ]
+ }
+ }
+ },
+ {
+ "ID": "1754",
+ "typeID": "__group__",
+ "zOrder": "60",
+ "measuredW": "448",
+ "measuredH": "59",
+ "w": "448",
+ "h": "59",
+ "x": "899",
+ "y": "808",
+ "properties": {
+ "controlName": "message-brokers"
+ },
+ "children": {
+ "controls": {
+ "control": [
+ {
+ "ID": "0",
+ "typeID": "Label",
+ "zOrder": "0",
+ "measuredW": "448",
+ "measuredH": "28",
+ "x": "0",
+ "y": "0",
+ "properties": {
+ "size": "20",
+ "text": "Utilize message brokers for async communication"
+ }
+ },
+ {
+ "ID": "1",
+ "typeID": "Label",
+ "zOrder": "1",
+ "measuredW": "163",
+ "measuredH": "28",
+ "x": "0",
+ "y": "31",
+ "properties": {
+ "size": "20",
+ "text": "between services."
+ }
+ }
+ ]
+ }
+ }
+ },
+ {
+ "ID": "1755",
+ "typeID": "__group__",
+ "zOrder": "61",
+ "measuredW": "30",
+ "measuredH": "30",
+ "w": "30",
+ "h": "30",
+ "x": "853",
+ "y": "598",
+ "properties": {
+ "controlName": "check:unnecessary-computation"
+ },
+ "children": {
+ "controls": {
+ "control": [
+ {
+ "ID": "0",
+ "typeID": "TextArea",
+ "zOrder": "0",
+ "w": "30",
+ "h": "30",
+ "measuredW": "200",
+ "measuredH": "140",
+ "x": "0",
+ "y": "0"
+ }
+ ]
+ }
+ }
+ },
+ {
+ "ID": "1756",
+ "typeID": "__group__",
+ "zOrder": "62",
+ "measuredW": "426",
+ "measuredH": "60",
+ "w": "426",
+ "h": "60",
+ "x": "899",
+ "y": "599",
+ "properties": {
+ "controlName": "unnecessary-computation"
+ },
+ "children": {
+ "controls": {
+ "control": [
+ {
+ "ID": "0",
+ "typeID": "Label",
+ "zOrder": "0",
+ "measuredW": "426",
+ "measuredH": "28",
+ "x": "0",
+ "y": "0",
+ "properties": {
+ "size": "20",
+ "text": "Minimise unnecessary processing or expensive"
+ }
+ },
+ {
+ "ID": "1",
+ "typeID": "Label",
+ "zOrder": "1",
+ "measuredW": "241",
+ "measuredH": "28",
+ "x": "0",
+ "y": "32",
+ "properties": {
+ "size": "20",
+ "text": "computation on the server."
+ }
+ }
+ ]
+ }
+ }
+ },
+ {
+ "ID": "1757",
+ "typeID": "Arrow",
+ "zOrder": "63",
+ "w": "587",
+ "h": "1",
+ "measuredW": "150",
+ "measuredH": "100",
+ "x": "817",
+ "y": "919",
+ "properties": {
+ "curvature": "0",
+ "leftArrow": "false",
+ "rightArrow": "false",
+ "color": "4273622",
+ "p0": {
+ "x": -0.2686368305519409,
+ "y": 0
+ },
+ "p1": {
+ "x": 0.5001077701859015,
+ "y": 0.00033913823433391014
+ },
+ "p2": {
+ "x": 587.2092515685516,
+ "y": 0
+ }
+ }
+ },
+ {
+ "ID": "1758",
+ "typeID": "Canvas",
+ "zOrder": "64",
+ "w": "300",
+ "h": "50",
+ "measuredW": "100",
+ "measuredH": "70",
+ "x": "956",
+ "y": "891",
+ "properties": {
+ "color": "16776960"
+ }
+ },
+ {
+ "ID": "1759",
+ "typeID": "Label",
+ "zOrder": "65",
+ "measuredW": "231",
+ "measuredH": "28",
+ "x": "990",
+ "y": "903",
+ "properties": {
+ "size": "20",
+ "text": "Load Balancing & Scaling"
+ }
+ },
+ {
+ "ID": "1760",
+ "typeID": "__group__",
+ "zOrder": "66",
+ "measuredW": "30",
+ "measuredH": "30",
+ "w": "30",
+ "h": "30",
+ "x": "853",
+ "y": "965",
+ "properties": {
+ "controlName": "check:scaling-strategies"
+ },
+ "children": {
+ "controls": {
+ "control": [
+ {
+ "ID": "0",
+ "typeID": "TextArea",
+ "zOrder": "0",
+ "w": "30",
+ "h": "30",
+ "measuredW": "200",
+ "measuredH": "140",
+ "x": "0",
+ "y": "0"
+ }
+ ]
+ }
+ }
+ },
+ {
+ "ID": "1761",
+ "typeID": "__group__",
+ "zOrder": "67",
+ "measuredW": "497",
+ "measuredH": "28",
+ "w": "497",
+ "h": "28",
+ "x": "899",
+ "y": "966",
+ "properties": {
+ "controlName": "scaling-strategies"
+ },
+ "children": {
+ "controls": {
+ "control": [
+ {
+ "ID": "0",
+ "typeID": "Label",
+ "zOrder": "0",
+ "measuredW": "497",
+ "measuredH": "28",
+ "x": "0",
+ "y": "0",
+ "properties": {
+ "size": "20",
+ "text": "Use Horizontal or Vertical scaling whatever appropriate"
+ }
+ }
+ ]
+ }
+ }
+ },
+ {
+ "ID": "1762",
+ "typeID": "__group__",
+ "zOrder": "68",
+ "measuredW": "30",
+ "measuredH": "30",
+ "w": "30",
+ "h": "30",
+ "x": "853",
+ "y": "1004",
+ "properties": {
+ "controlName": "check:load-balancing"
+ },
+ "children": {
+ "controls": {
+ "control": [
+ {
+ "ID": "0",
+ "typeID": "TextArea",
+ "zOrder": "0",
+ "w": "30",
+ "h": "30",
+ "measuredW": "200",
+ "measuredH": "140",
+ "x": "0",
+ "y": "0"
+ }
+ ]
+ }
+ }
+ },
+ {
+ "ID": "1763",
+ "typeID": "__group__",
+ "zOrder": "69",
+ "measuredW": "479",
+ "measuredH": "28",
+ "w": "479",
+ "h": "28",
+ "x": "899",
+ "y": "1005",
+ "properties": {
+ "controlName": "load-balancing"
+ },
+ "children": {
+ "controls": {
+ "control": [
+ {
+ "ID": "0",
+ "typeID": "Label",
+ "zOrder": "0",
+ "measuredW": "479",
+ "measuredH": "28",
+ "x": "0",
+ "y": "0",
+ "properties": {
+ "size": "20",
+ "text": "Use load balancing to distribute traffic across servers"
+ }
+ }
+ ]
+ }
+ }
+ },
+ {
+ "ID": "1764",
+ "typeID": "Canvas",
+ "zOrder": "70",
+ "w": "300",
+ "h": "50",
+ "measuredW": "100",
+ "measuredH": "70",
+ "x": "956",
+ "y": "1059",
+ "properties": {
+ "color": "16776960"
+ }
+ },
+ {
+ "ID": "1765",
+ "typeID": "Label",
+ "zOrder": "71",
+ "measuredW": "168",
+ "measuredH": "28",
+ "x": "1022",
+ "y": "1071",
+ "properties": {
+ "size": "20",
+ "text": "Code Optimization"
+ }
+ },
+ {
+ "ID": "1766",
+ "typeID": "Arrow",
+ "zOrder": "1",
+ "w": "587",
+ "h": "1",
+ "measuredW": "150",
+ "measuredH": "100",
+ "x": "817",
+ "y": "1085",
+ "properties": {
+ "curvature": "0",
+ "leftArrow": "false",
+ "rightArrow": "false",
+ "color": "4273622",
+ "p0": {
+ "x": -0.2686368305519409,
+ "y": 0
+ },
+ "p1": {
+ "x": 0.5001077701859015,
+ "y": 0.00033913823433391014
+ },
+ "p2": {
+ "x": 587.2092515685516,
+ "y": 0
+ }
+ }
+ },
+ {
+ "ID": "1767",
+ "typeID": "__group__",
+ "zOrder": "72",
+ "measuredW": "30",
+ "measuredH": "30",
+ "w": "30",
+ "h": "30",
+ "x": "853",
+ "y": "1176",
+ "properties": {
+ "controlName": "check:profile-code"
+ },
+ "children": {
+ "controls": {
+ "control": [
+ {
+ "ID": "0",
+ "typeID": "TextArea",
+ "zOrder": "0",
+ "w": "30",
+ "h": "30",
+ "measuredW": "200",
+ "measuredH": "140",
+ "x": "0",
+ "y": "0"
+ }
+ ]
+ }
+ }
+ },
+ {
+ "ID": "1768",
+ "typeID": "__group__",
+ "zOrder": "73",
+ "measuredW": "474",
+ "measuredH": "28",
+ "w": "474",
+ "h": "28",
+ "x": "899",
+ "y": "1177",
+ "properties": {
+ "controlName": "profile-code"
+ },
+ "children": {
+ "controls": {
+ "control": [
+ {
+ "ID": "0",
+ "typeID": "Label",
+ "zOrder": "0",
+ "measuredW": "474",
+ "measuredH": "28",
+ "x": "0",
+ "y": "0",
+ "properties": {
+ "size": "20",
+ "text": "Profile your code to identify performance bottlenecks"
+ }
+ }
+ ]
+ }
+ }
+ },
+ {
+ "ID": "1769",
+ "typeID": "__group__",
+ "zOrder": "74",
+ "measuredW": "30",
+ "measuredH": "30",
+ "w": "30",
+ "h": "30",
+ "x": "853",
+ "y": "1215",
+ "properties": {
+ "controlName": "check:optimize-algorithms"
+ },
+ "children": {
+ "controls": {
+ "control": [
+ {
+ "ID": "0",
+ "typeID": "TextArea",
+ "zOrder": "0",
+ "w": "30",
+ "h": "30",
+ "measuredW": "200",
+ "measuredH": "140",
+ "x": "0",
+ "y": "0"
+ }
+ ]
+ }
+ }
+ },
+ {
+ "ID": "1770",
+ "typeID": "__group__",
+ "zOrder": "75",
+ "measuredW": "410",
+ "measuredH": "28",
+ "w": "410",
+ "h": "28",
+ "x": "899",
+ "y": "1216",
+ "properties": {
+ "controlName": "optimize-algorithms"
+ },
+ "children": {
+ "controls": {
+ "control": [
+ {
+ "ID": "0",
+ "typeID": "Label",
+ "zOrder": "0",
+ "measuredW": "410",
+ "measuredH": "28",
+ "x": "0",
+ "y": "0",
+ "properties": {
+ "size": "20",
+ "text": "Optimize algorithms and data structures used"
+ }
+ }
+ ]
+ }
+ }
+ },
+ {
+ "ID": "1771",
+ "typeID": "__group__",
+ "zOrder": "76",
+ "measuredW": "30",
+ "measuredH": "30",
+ "w": "30",
+ "h": "30",
+ "x": "853",
+ "y": "1252",
+ "properties": {
+ "controlName": "check:critical-paths"
+ },
+ "children": {
+ "controls": {
+ "control": [
+ {
+ "ID": "0",
+ "typeID": "TextArea",
+ "zOrder": "0",
+ "w": "30",
+ "h": "30",
+ "measuredW": "200",
+ "measuredH": "140",
+ "x": "0",
+ "y": "0"
+ }
+ ]
+ }
+ }
+ },
+ {
+ "ID": "1773",
+ "typeID": "__group__",
+ "zOrder": "78",
+ "measuredW": "30",
+ "measuredH": "30",
+ "w": "30",
+ "h": "30",
+ "x": "218",
+ "y": "1262",
+ "properties": {
+ "controlName": "check:cleanup-data"
+ },
+ "children": {
+ "controls": {
+ "control": [
+ {
+ "ID": "0",
+ "typeID": "TextArea",
+ "zOrder": "0",
+ "w": "30",
+ "h": "30",
+ "measuredW": "200",
+ "measuredH": "140",
+ "x": "0",
+ "y": "0"
+ }
+ ]
+ }
+ }
+ },
+ {
+ "ID": "1774",
+ "typeID": "__group__",
+ "zOrder": "79",
+ "measuredW": "491",
+ "measuredH": "96",
+ "w": "491",
+ "h": "96",
+ "x": "262",
+ "y": "1263",
+ "properties": {
+ "controlName": "cleanup-data"
+ },
+ "children": {
+ "controls": {
+ "control": [
+ {
+ "ID": "0",
+ "typeID": "Label",
+ "zOrder": "0",
+ "measuredW": "491",
+ "measuredH": "28",
+ "x": "0",
+ "y": "0",
+ "properties": {
+ "size": "20",
+ "text": "Regularly clean up unused data and perform database"
+ }
+ },
+ {
+ "ID": "1",
+ "typeID": "Label",
+ "zOrder": "1",
+ "measuredW": "438",
+ "measuredH": "28",
+ "x": "0",
+ "y": "34",
+ "properties": {
+ "size": "20",
+ "text": "maintenance tasks like vacuuming, indexing, and"
+ }
+ },
+ {
+ "ID": "2",
+ "typeID": "Label",
+ "zOrder": "2",
+ "measuredW": "170",
+ "measuredH": "28",
+ "x": "0",
+ "y": "68",
+ "properties": {
+ "size": "20",
+ "text": "optimizing queries."
+ }
+ }
+ ]
+ }
+ }
+ },
+ {
+ "ID": "1775",
+ "typeID": "__group__",
+ "zOrder": "80",
+ "measuredW": "30",
+ "measuredH": "30",
+ "w": "30",
+ "h": "30",
+ "x": "218",
+ "y": "1372",
+ "properties": {
+ "controlName": "check:slow-logging"
+ },
+ "children": {
+ "controls": {
+ "control": [
+ {
+ "ID": "0",
+ "typeID": "TextArea",
+ "zOrder": "0",
+ "w": "30",
+ "h": "30",
+ "measuredW": "200",
+ "measuredH": "140",
+ "x": "0",
+ "y": "0"
+ }
+ ]
+ }
+ }
+ },
+ {
+ "ID": "1776",
+ "typeID": "__group__",
+ "zOrder": "81",
+ "measuredW": "463",
+ "measuredH": "28",
+ "w": "463",
+ "h": "28",
+ "x": "262",
+ "y": "1373",
+ "properties": {
+ "controlName": "slow-logging"
+ },
+ "children": {
+ "controls": {
+ "control": [
+ {
+ "ID": "0",
+ "typeID": "Label",
+ "zOrder": "0",
+ "measuredW": "463",
+ "measuredH": "28",
+ "x": "0",
+ "y": "0",
+ "properties": {
+ "size": "20",
+ "text": "Enable slow-query logging and keep an eye on that."
+ }
+ }
+ ]
+ }
+ }
+ },
+ {
+ "ID": "1777",
+ "typeID": "Arrow",
+ "zOrder": "82",
+ "w": "587",
+ "h": "1",
+ "measuredW": "150",
+ "measuredH": "100",
+ "x": "814",
+ "y": "1976",
+ "properties": {
+ "curvature": "0",
+ "leftArrow": "false",
+ "rightArrow": "false",
+ "color": "4273622",
+ "p0": {
+ "x": -0.2686368305519409,
+ "y": 0
+ },
+ "p1": {
+ "x": 0.5001077701859015,
+ "y": 0.00033913823433391014
+ },
+ "p2": {
+ "x": 587.2092515685516,
+ "y": 0
+ }
+ }
+ },
+ {
+ "ID": "1778",
+ "typeID": "Canvas",
+ "zOrder": "127",
+ "w": "189",
+ "h": "50",
+ "measuredW": "100",
+ "measuredH": "70",
+ "x": "362",
+ "y": "1897",
+ "properties": {
+ "color": "16776960"
+ }
+ },
+ {
+ "ID": "1779",
+ "typeID": "Label",
+ "zOrder": "128",
+ "measuredW": "75",
+ "measuredH": "28",
+ "x": "419",
+ "y": "1908",
+ "properties": {
+ "size": "20",
+ "text": "Network"
+ }
+ },
+ {
+ "ID": "1780",
+ "typeID": "__group__",
+ "zOrder": "129",
+ "measuredW": "30",
+ "measuredH": "30",
+ "w": "30",
+ "h": "30",
+ "x": "220",
+ "y": "1974",
+ "properties": {
+ "controlName": "check:network-latency"
+ },
+ "children": {
+ "controls": {
+ "control": [
+ {
+ "ID": "0",
+ "typeID": "TextArea",
+ "zOrder": "0",
+ "w": "30",
+ "h": "30",
+ "measuredW": "200",
+ "measuredH": "140",
+ "x": "0",
+ "y": "0"
+ }
+ ]
+ }
+ }
+ },
+ {
+ "ID": "1781",
+ "typeID": "__group__",
+ "zOrder": "130",
+ "measuredW": "447",
+ "measuredH": "59",
+ "w": "447",
+ "h": "59",
+ "x": "265",
+ "y": "1976",
+ "properties": {
+ "controlName": "network-latency"
+ },
+ "children": {
+ "controls": {
+ "control": [
+ {
+ "ID": "0",
+ "typeID": "Label",
+ "zOrder": "0",
+ "measuredW": "447",
+ "measuredH": "28",
+ "x": "0",
+ "y": "0",
+ "properties": {
+ "size": "20",
+ "text": "Minimize network latency by hosting your backend"
+ }
+ },
+ {
+ "ID": "2",
+ "typeID": "Label",
+ "zOrder": "1",
+ "measuredW": "174",
+ "measuredH": "28",
+ "x": "0",
+ "y": "31",
+ "properties": {
+ "size": "20",
+ "text": "close to your users."
+ }
+ }
+ ]
+ }
+ }
+ },
+ {
+ "ID": "1782",
+ "typeID": "__group__",
+ "zOrder": "131",
+ "measuredW": "30",
+ "measuredH": "30",
+ "w": "30",
+ "h": "30",
+ "x": "220",
+ "y": "2092",
+ "properties": {
+ "controlName": "check:cdns"
+ },
+ "children": {
+ "controls": {
+ "control": [
+ {
+ "ID": "0",
+ "typeID": "TextArea",
+ "zOrder": "0",
+ "w": "30",
+ "h": "30",
+ "measuredW": "200",
+ "measuredH": "140",
+ "x": "0",
+ "y": "0"
+ }
+ ]
+ }
+ }
+ },
+ {
+ "ID": "1783",
+ "typeID": "__group__",
+ "zOrder": "132",
+ "measuredW": "471",
+ "measuredH": "28",
+ "w": "471",
+ "h": "28",
+ "x": "265",
+ "y": "2094",
+ "properties": {
+ "controlName": "cdns"
+ },
+ "children": {
+ "controls": {
+ "control": [
+ {
+ "ID": "0",
+ "typeID": "Label",
+ "zOrder": "0",
+ "measuredW": "471",
+ "measuredH": "28",
+ "x": "0",
+ "y": "0",
+ "properties": {
+ "size": "20",
+ "text": "Use CDNs for static and frequently accessed assets"
+ }
+ }
+ ]
+ }
+ }
+ },
+ {
+ "ID": "1784",
+ "typeID": "__group__",
+ "zOrder": "83",
+ "measuredW": "30",
+ "measuredH": "30",
+ "w": "30",
+ "h": "30",
+ "x": "218",
+ "y": "1823",
+ "properties": {
+ "controlName": "check:regular-audits"
+ },
+ "children": {
+ "controls": {
+ "control": [
+ {
+ "ID": "0",
+ "typeID": "TextArea",
+ "zOrder": "0",
+ "w": "30",
+ "h": "30",
+ "measuredW": "200",
+ "measuredH": "140",
+ "x": "0",
+ "y": "0"
+ }
+ ]
+ }
+ }
+ },
+ {
+ "ID": "1785",
+ "typeID": "__group__",
+ "zOrder": "84",
+ "measuredW": "412",
+ "measuredH": "28",
+ "w": "412",
+ "h": "28",
+ "x": "264",
+ "y": "1824",
+ "properties": {
+ "controlName": "regular-audits"
+ },
+ "children": {
+ "controls": {
+ "control": [
+ {
+ "ID": "0",
+ "typeID": "Label",
+ "zOrder": "0",
+ "measuredW": "412",
+ "measuredH": "28",
+ "x": "0",
+ "y": "0",
+ "properties": {
+ "size": "20",
+ "text": "Regularly audit and update security measures"
+ }
+ }
+ ]
+ }
+ }
+ },
+ {
+ "ID": "1786",
+ "typeID": "__group__",
+ "zOrder": "85",
+ "measuredW": "30",
+ "measuredH": "30",
+ "w": "30",
+ "h": "30",
+ "x": "218",
+ "y": "1710",
+ "properties": {
+ "controlName": "check:authentication-authorization"
+ },
+ "children": {
+ "controls": {
+ "control": [
+ {
+ "ID": "0",
+ "typeID": "TextArea",
+ "zOrder": "0",
+ "w": "30",
+ "h": "30",
+ "measuredW": "200",
+ "measuredH": "140",
+ "x": "0",
+ "y": "0"
+ }
+ ]
+ }
+ }
+ },
+ {
+ "ID": "1790",
+ "typeID": "Canvas",
+ "zOrder": "87",
+ "w": "300",
+ "h": "50",
+ "measuredW": "100",
+ "measuredH": "70",
+ "x": "956",
+ "y": "1640",
+ "properties": {
+ "color": "16776960"
+ }
+ },
+ {
+ "ID": "1791",
+ "typeID": "Label",
+ "zOrder": "88",
+ "measuredW": "215",
+ "measuredH": "28",
+ "x": "998",
+ "y": "1652",
+ "properties": {
+ "size": "20",
+ "text": "Monitoring and Logging"
+ }
+ },
+ {
+ "ID": "1792",
+ "typeID": "__group__",
+ "zOrder": "89",
+ "measuredW": "30",
+ "measuredH": "30",
+ "w": "30",
+ "h": "30",
+ "x": "852",
+ "y": "1727",
+ "properties": {
+ "controlName": "check:monitoring-logging"
+ },
+ "children": {
+ "controls": {
+ "control": [
+ {
+ "ID": "0",
+ "typeID": "TextArea",
+ "zOrder": "0",
+ "w": "30",
+ "h": "30",
+ "measuredW": "200",
+ "measuredH": "140",
+ "x": "0",
+ "y": "0"
+ }
+ ]
+ }
+ }
+ },
+ {
+ "ID": "1793",
+ "typeID": "__group__",
+ "zOrder": "90",
+ "measuredW": "482",
+ "measuredH": "59",
+ "w": "482",
+ "h": "59",
+ "x": "898",
+ "y": "1728",
+ "properties": {
+ "controlName": "monitoring-logging"
+ },
+ "children": {
+ "controls": {
+ "control": [
+ {
+ "ID": "0",
+ "typeID": "Label",
+ "zOrder": "0",
+ "measuredW": "453",
+ "measuredH": "28",
+ "x": "0",
+ "y": "0",
+ "properties": {
+ "size": "20",
+ "text": "Implement comprehensive monitoring and logging"
+ }
+ },
+ {
+ "ID": "1",
+ "typeID": "Label",
+ "zOrder": "1",
+ "measuredW": "482",
+ "measuredH": "28",
+ "x": "0",
+ "y": "31",
+ "properties": {
+ "size": "20",
+ "text": "to track performance metrics and troubleshoot issues"
+ }
+ }
+ ]
+ }
+ }
+ },
+ {
+ "ID": "1794",
+ "typeID": "Arrow",
+ "zOrder": "0",
+ "w": "587",
+ "h": "1",
+ "measuredW": "150",
+ "measuredH": "100",
+ "x": "817",
+ "y": "1666",
+ "properties": {
+ "curvature": "0",
+ "leftArrow": "false",
+ "rightArrow": "false",
+ "color": "4273622",
+ "p0": {
+ "x": -0.2686368305519409,
+ "y": 0
+ },
+ "p1": {
+ "x": 0.5001077701859015,
+ "y": 0.00033913823433391014
+ },
+ "p2": {
+ "x": 587.2092515685516,
+ "y": 0
+ }
+ }
+ },
+ {
+ "ID": "1795",
+ "typeID": "__group__",
+ "zOrder": "91",
+ "measuredW": "30",
+ "measuredH": "30",
+ "w": "30",
+ "h": "30",
+ "x": "852",
+ "y": "1800",
+ "properties": {
+ "controlName": "check:prometheus-graphana"
+ },
+ "children": {
+ "controls": {
+ "control": [
+ {
+ "ID": "0",
+ "typeID": "TextArea",
+ "zOrder": "0",
+ "w": "30",
+ "h": "30",
+ "measuredW": "200",
+ "measuredH": "140",
+ "x": "0",
+ "y": "0"
+ }
+ ]
+ }
+ }
+ },
+ {
+ "ID": "1796",
+ "typeID": "__group__",
+ "zOrder": "92",
+ "measuredW": "421",
+ "measuredH": "28",
+ "w": "421",
+ "h": "28",
+ "x": "898",
+ "y": "1801",
+ "properties": {
+ "controlName": "prometheus-graphana"
+ },
+ "children": {
+ "controls": {
+ "control": [
+ {
+ "ID": "0",
+ "typeID": "Label",
+ "zOrder": "0",
+ "measuredW": "421",
+ "measuredH": "28",
+ "x": "0",
+ "y": "0",
+ "properties": {
+ "size": "20",
+ "text": "Use tools like Prometheus, Grafana, ELK stack."
+ }
+ }
+ ]
+ }
+ }
+ },
+ {
+ "ID": "1797",
+ "typeID": "__group__",
+ "zOrder": "93",
+ "measuredW": "30",
+ "measuredH": "30",
+ "w": "30",
+ "h": "30",
+ "x": "218",
+ "y": "1415",
+ "properties": {
+ "controlName": "check:replication"
+ },
+ "children": {
+ "controls": {
+ "control": [
+ {
+ "ID": "0",
+ "typeID": "TextArea",
+ "zOrder": "0",
+ "w": "30",
+ "h": "30",
+ "measuredW": "200",
+ "measuredH": "140",
+ "x": "0",
+ "y": "0"
+ }
+ ]
+ }
+ }
+ },
+ {
+ "ID": "1798",
+ "typeID": "__group__",
+ "zOrder": "94",
+ "measuredW": "428",
+ "measuredH": "60",
+ "w": "428",
+ "h": "60",
+ "x": "262",
+ "y": "1415",
+ "properties": {
+ "controlName": "replication"
+ },
+ "children": {
+ "controls": {
+ "control": [
+ {
+ "ID": "0",
+ "typeID": "Label",
+ "zOrder": "0",
+ "measuredW": "428",
+ "measuredH": "28",
+ "x": "0",
+ "y": "0",
+ "properties": {
+ "size": "20",
+ "text": "Set up database replication for redundancy and"
+ }
+ },
+ {
+ "ID": "1",
+ "typeID": "Label",
+ "zOrder": "1",
+ "measuredW": "256",
+ "measuredH": "28",
+ "x": "0",
+ "y": "32",
+ "properties": {
+ "size": "20",
+ "text": "improved read performance."
+ }
+ }
+ ]
+ }
+ }
+ },
+ {
+ "ID": "1799",
+ "typeID": "__group__",
+ "zOrder": "95",
+ "measuredW": "30",
+ "measuredH": "30",
+ "w": "30",
+ "h": "30",
+ "x": "218",
+ "y": "1485",
+ "properties": {
+ "controlName": "check:use-db-sharding"
+ },
+ "children": {
+ "controls": {
+ "control": [
+ {
+ "ID": "0",
+ "typeID": "TextArea",
+ "zOrder": "0",
+ "w": "30",
+ "h": "30",
+ "measuredW": "200",
+ "measuredH": "140",
+ "x": "0",
+ "y": "0"
+ }
+ ]
+ }
+ }
+ },
+ {
+ "ID": "1800",
+ "typeID": "__group__",
+ "zOrder": "96",
+ "measuredW": "436",
+ "measuredH": "28",
+ "w": "436",
+ "h": "28",
+ "x": "262",
+ "y": "1486",
+ "properties": {
+ "controlName": "use-db-sharding"
+ },
+ "children": {
+ "controls": {
+ "control": [
+ {
+ "ID": "0",
+ "typeID": "Label",
+ "zOrder": "0",
+ "measuredW": "436",
+ "measuredH": "28",
+ "x": "0",
+ "y": "0",
+ "properties": {
+ "size": "20",
+ "text": "Use DB sharding for data distribution if required."
+ }
+ }
+ ]
+ }
+ }
+ },
+ {
+ "ID": "1801",
+ "typeID": "__group__",
+ "zOrder": "97",
+ "measuredW": "30",
+ "measuredH": "30",
+ "w": "30",
+ "h": "30",
+ "x": "853",
+ "y": "1323",
+ "properties": {
+ "controlName": "check:compiled-languages"
+ },
+ "children": {
+ "controls": {
+ "control": [
+ {
+ "ID": "0",
+ "typeID": "TextArea",
+ "zOrder": "0",
+ "w": "30",
+ "h": "30",
+ "measuredW": "200",
+ "measuredH": "140",
+ "x": "0",
+ "y": "0"
+ }
+ ]
+ }
+ }
+ },
+ {
+ "ID": "1802",
+ "typeID": "__group__",
+ "zOrder": "98",
+ "measuredW": "492",
+ "measuredH": "59",
+ "w": "492",
+ "h": "59",
+ "x": "899",
+ "y": "1323",
+ "properties": {
+ "controlName": "compiled-languages"
+ },
+ "children": {
+ "controls": {
+ "control": [
+ {
+ "ID": "0",
+ "typeID": "Label",
+ "zOrder": "0",
+ "measuredW": "492",
+ "measuredH": "28",
+ "x": "0",
+ "y": "0",
+ "properties": {
+ "size": "20",
+ "text": "Consider using compiled languages like Go or Rust for"
+ }
+ },
+ {
+ "ID": "1",
+ "typeID": "Label",
+ "zOrder": "1",
+ "measuredW": "388",
+ "measuredH": "28",
+ "x": "0",
+ "y": "31",
+ "properties": {
+ "size": "20",
+ "text": "performance-critical parts of your backend."
+ }
+ }
+ ]
+ }
+ }
+ },
+ {
+ "ID": "1803",
+ "typeID": "__group__",
+ "zOrder": "99",
+ "measuredW": "30",
+ "measuredH": "30",
+ "w": "30",
+ "h": "30",
+ "x": "853",
+ "y": "1397",
+ "properties": {
+ "controlName": "check:architectural-styles"
+ },
+ "children": {
+ "controls": {
+ "control": [
+ {
+ "ID": "0",
+ "typeID": "TextArea",
+ "zOrder": "0",
+ "w": "30",
+ "h": "30",
+ "measuredW": "200",
+ "measuredH": "140",
+ "x": "0",
+ "y": "0"
+ }
+ ]
+ }
+ }
+ },
+ {
+ "ID": "1804",
+ "typeID": "__group__",
+ "zOrder": "100",
+ "measuredW": "474",
+ "measuredH": "59",
+ "w": "474",
+ "h": "59",
+ "x": "899",
+ "y": "1398",
+ "properties": {
+ "controlName": "architectural-styles"
+ },
+ "children": {
+ "controls": {
+ "control": [
+ {
+ "ID": "0",
+ "typeID": "Label",
+ "zOrder": "0",
+ "measuredW": "392",
+ "measuredH": "28",
+ "x": "0",
+ "y": "0",
+ "properties": {
+ "size": "20",
+ "text": "Look into different architectural styles (SOA,"
+ }
+ },
+ {
+ "ID": "1",
+ "typeID": "Label",
+ "zOrder": "1",
+ "measuredW": "474",
+ "measuredH": "28",
+ "x": "0",
+ "y": "31",
+ "properties": {
+ "size": "20",
+ "text": "Micro services) and decompose services if required."
+ }
+ }
+ ]
+ }
+ }
+ },
+ {
+ "ID": "1807",
+ "typeID": "__group__",
+ "zOrder": "101",
+ "measuredW": "30",
+ "measuredH": "30",
+ "w": "30",
+ "h": "30",
+ "x": "218",
+ "y": "961",
+ "properties": {
+ "controlName": "check:orm-queries"
+ },
+ "children": {
+ "controls": {
+ "control": [
+ {
+ "ID": "0",
+ "typeID": "TextArea",
+ "zOrder": "0",
+ "w": "30",
+ "h": "30",
+ "measuredW": "200",
+ "measuredH": "140",
+ "x": "0",
+ "y": "0"
+ }
+ ]
+ }
+ }
+ },
+ {
+ "ID": "1808",
+ "typeID": "__group__",
+ "zOrder": "102",
+ "measuredW": "396",
+ "measuredH": "28",
+ "w": "396",
+ "h": "28",
+ "x": "262",
+ "y": "962",
+ "properties": {
+ "controlName": "orm-queries"
+ },
+ "children": {
+ "controls": {
+ "control": [
+ {
+ "ID": "0",
+ "typeID": "Label",
+ "zOrder": "0",
+ "measuredW": "396",
+ "measuredH": "28",
+ "x": "0",
+ "y": "0",
+ "properties": {
+ "size": "20",
+ "text": "Keep an eye on and fine-tune ORM queries."
+ }
+ }
+ ]
+ }
+ }
+ },
+ {
+ "ID": "1809",
+ "typeID": "__group__",
+ "zOrder": "103",
+ "measuredW": "30",
+ "measuredH": "30",
+ "w": "30",
+ "h": "30",
+ "x": "218",
+ "y": "1002",
+ "properties": {
+ "controlName": "check:lazy-eager"
+ },
+ "children": {
+ "controls": {
+ "control": [
+ {
+ "ID": "0",
+ "typeID": "TextArea",
+ "zOrder": "0",
+ "w": "30",
+ "h": "30",
+ "measuredW": "200",
+ "measuredH": "140",
+ "x": "0",
+ "y": "0"
+ }
+ ]
+ }
+ }
+ },
+ {
+ "ID": "1810",
+ "typeID": "__group__",
+ "zOrder": "104",
+ "measuredW": "458",
+ "measuredH": "59",
+ "w": "458",
+ "h": "59",
+ "x": "262",
+ "y": "1003",
+ "properties": {
+ "controlName": "lazy-eager"
+ },
+ "children": {
+ "controls": {
+ "control": [
+ {
+ "ID": "0",
+ "typeID": "Label",
+ "zOrder": "0",
+ "measuredW": "458",
+ "measuredH": "28",
+ "x": "0",
+ "y": "0",
+ "properties": {
+ "size": "20",
+ "text": "Utilize features such as lazy loading, eager loading,"
+ }
+ },
+ {
+ "ID": "1",
+ "typeID": "Label",
+ "zOrder": "1",
+ "measuredW": "428",
+ "measuredH": "28",
+ "x": "0",
+ "y": "31",
+ "properties": {
+ "size": "20",
+ "text": "and batch processing to optimize data retrieval."
+ }
+ }
+ ]
+ }
+ }
+ },
+ {
+ "ID": "1812",
+ "typeID": "__group__",
+ "zOrder": "105",
+ "measuredW": "30",
+ "measuredH": "30",
+ "w": "30",
+ "h": "30",
+ "x": "218",
+ "y": "1526",
+ "properties": {
+ "controlName": "check:profiling-tools"
+ },
+ "children": {
+ "controls": {
+ "control": [
+ {
+ "ID": "0",
+ "typeID": "TextArea",
+ "zOrder": "0",
+ "w": "30",
+ "h": "30",
+ "measuredW": "200",
+ "measuredH": "140",
+ "x": "0",
+ "y": "0"
+ }
+ ]
+ }
+ }
+ },
+ {
+ "ID": "1813",
+ "typeID": "__group__",
+ "zOrder": "106",
+ "measuredW": "391",
+ "measuredH": "28",
+ "w": "391",
+ "h": "28",
+ "x": "262",
+ "y": "1527",
+ "properties": {
+ "controlName": "profiling-tools"
+ },
+ "children": {
+ "controls": {
+ "control": [
+ {
+ "ID": "0",
+ "typeID": "Label",
+ "zOrder": "0",
+ "measuredW": "391",
+ "measuredH": "28",
+ "x": "0",
+ "y": "0",
+ "properties": {
+ "size": "20",
+ "text": "Use profiling tools offered by your database."
+ }
+ }
+ ]
+ }
+ }
+ },
+ {
+ "ID": "1814",
+ "typeID": "__group__",
+ "zOrder": "107",
+ "measuredW": "30",
+ "measuredH": "30",
+ "w": "30",
+ "h": "30",
+ "x": "853",
+ "y": "1473",
+ "properties": {
+ "controlName": "check:connection-timeouts"
+ },
+ "children": {
+ "controls": {
+ "control": [
+ {
+ "ID": "0",
+ "typeID": "TextArea",
+ "zOrder": "0",
+ "w": "30",
+ "h": "30",
+ "measuredW": "200",
+ "measuredH": "140",
+ "x": "0",
+ "y": "0"
+ }
+ ]
+ }
+ }
+ },
+ {
+ "ID": "1815",
+ "typeID": "__group__",
+ "zOrder": "108",
+ "measuredW": "470",
+ "measuredH": "60",
+ "w": "470",
+ "h": "60",
+ "x": "899",
+ "y": "1474",
+ "properties": {
+ "controlName": "connection-timeouts"
+ },
+ "children": {
+ "controls": {
+ "control": [
+ {
+ "ID": "0",
+ "typeID": "Label",
+ "zOrder": "0",
+ "measuredW": "470",
+ "measuredH": "28",
+ "x": "0",
+ "y": "0",
+ "properties": {
+ "size": "20",
+ "text": "Set appropriate connection timeouts and implement"
+ }
+ },
+ {
+ "ID": "1",
+ "typeID": "Label",
+ "zOrder": "1",
+ "measuredW": "455",
+ "measuredH": "28",
+ "x": "0",
+ "y": "32",
+ "properties": {
+ "size": "20",
+ "text": "efficient retry mechanism to handle network issues"
+ }
+ }
+ ]
+ }
+ }
+ },
+ {
+ "ID": "1816",
+ "typeID": "__group__",
+ "zOrder": "109",
+ "measuredW": "30",
+ "measuredH": "30",
+ "w": "30",
+ "h": "30",
+ "x": "854",
+ "y": "1553",
+ "properties": {
+ "controlName": "check:similar-requests"
+ },
+ "children": {
+ "controls": {
+ "control": [
+ {
+ "ID": "0",
+ "typeID": "TextArea",
+ "zOrder": "0",
+ "w": "30",
+ "h": "30",
+ "measuredW": "200",
+ "measuredH": "140",
+ "x": "0",
+ "y": "0"
+ }
+ ]
+ }
+ }
+ },
+ {
+ "ID": "1817",
+ "typeID": "__group__",
+ "zOrder": "110",
+ "measuredW": "483",
+ "measuredH": "59",
+ "w": "483",
+ "h": "59",
+ "x": "900",
+ "y": "1554",
+ "properties": {
+ "controlName": "similar-requests"
+ },
+ "children": {
+ "controls": {
+ "control": [
+ {
+ "ID": "0",
+ "typeID": "Label",
+ "zOrder": "0",
+ "measuredW": "483",
+ "measuredH": "28",
+ "x": "0",
+ "y": "0",
+ "properties": {
+ "size": "20",
+ "text": "Batch similar requests together to minimize overhead"
+ }
+ },
+ {
+ "ID": "1",
+ "typeID": "Label",
+ "zOrder": "1",
+ "measuredW": "342",
+ "measuredH": "28",
+ "x": "0",
+ "y": "31",
+ "properties": {
+ "size": "20",
+ "text": "and reduce the number of round trips."
+ }
+ }
+ ]
+ }
+ }
+ },
+ {
+ "ID": "1818",
+ "typeID": "__group__",
+ "zOrder": "111",
+ "measuredW": "30",
+ "measuredH": "30",
+ "w": "30",
+ "h": "30",
+ "x": "852",
+ "y": "1846",
+ "properties": {
+ "controlName": "check:async-logging"
+ },
+ "children": {
+ "controls": {
+ "control": [
+ {
+ "ID": "0",
+ "typeID": "TextArea",
+ "zOrder": "0",
+ "w": "30",
+ "h": "30",
+ "measuredW": "200",
+ "measuredH": "140",
+ "x": "0",
+ "y": "0"
+ }
+ ]
+ }
+ }
+ },
+ {
+ "ID": "1819",
+ "typeID": "__group__",
+ "zOrder": "112",
+ "measuredW": "467",
+ "measuredH": "59",
+ "w": "467",
+ "h": "59",
+ "x": "898",
+ "y": "1846",
+ "properties": {
+ "controlName": "async-logging"
+ },
+ "children": {
+ "controls": {
+ "control": [
+ {
+ "ID": "0",
+ "typeID": "Label",
+ "zOrder": "0",
+ "measuredW": "467",
+ "measuredH": "28",
+ "x": "0",
+ "y": "0",
+ "properties": {
+ "size": "20",
+ "text": "Use asynchronous logging mechanisms to minimise"
+ }
+ },
+ {
+ "ID": "1",
+ "typeID": "Label",
+ "zOrder": "1",
+ "measuredW": "196",
+ "measuredH": "28",
+ "x": "0",
+ "y": "31",
+ "properties": {
+ "size": "20",
+ "text": "the logging overhead."
+ }
+ }
+ ]
+ }
+ }
+ },
+ {
+ "ID": "1820",
+ "typeID": "__group__",
+ "zOrder": "113",
+ "measuredW": "30",
+ "measuredH": "30",
+ "w": "30",
+ "h": "30",
+ "x": "218",
+ "y": "467",
+ "properties": {
+ "controlName": "check:utilize-caching"
+ },
+ "children": {
+ "controls": {
+ "control": [
+ {
+ "ID": "0",
+ "typeID": "TextArea",
+ "zOrder": "0",
+ "w": "30",
+ "h": "30",
+ "measuredW": "200",
+ "measuredH": "140",
+ "x": "0",
+ "y": "0"
+ }
+ ]
+ }
+ }
+ },
+ {
+ "ID": "1821",
+ "typeID": "__group__",
+ "zOrder": "114",
+ "measuredW": "504",
+ "measuredH": "28",
+ "w": "504",
+ "h": "28",
+ "x": "264",
+ "y": "468",
+ "properties": {
+ "controlName": "utilize-caching"
+ },
+ "children": {
+ "controls": {
+ "control": [
+ {
+ "ID": "0",
+ "typeID": "Label",
+ "zOrder": "0",
+ "measuredW": "504",
+ "measuredH": "28",
+ "x": "0",
+ "y": "0",
+ "properties": {
+ "size": "20",
+ "text": "Utilize caching mechanisms (HTTP, Server/Client, CDN)"
+ }
+ }
+ ]
+ }
+ }
+ },
+ {
+ "ID": "1824",
+ "typeID": "__group__",
+ "zOrder": "115",
+ "measuredW": "30",
+ "measuredH": "30",
+ "w": "30",
+ "h": "30",
+ "x": "854",
+ "y": "1136",
+ "properties": {
+ "controlName": "check:streaming-large"
+ },
+ "children": {
+ "controls": {
+ "control": [
+ {
+ "ID": "0",
+ "typeID": "TextArea",
+ "zOrder": "0",
+ "w": "30",
+ "h": "30",
+ "measuredW": "200",
+ "measuredH": "140",
+ "x": "0",
+ "y": "0"
+ }
+ ]
+ }
+ }
+ },
+ {
+ "ID": "1825",
+ "typeID": "__group__",
+ "zOrder": "116",
+ "measuredW": "454",
+ "measuredH": "28",
+ "w": "454",
+ "h": "28",
+ "x": "900",
+ "y": "1137",
+ "properties": {
+ "controlName": "streaming-large"
+ },
+ "children": {
+ "controls": {
+ "control": [
+ {
+ "ID": "0",
+ "typeID": "Label",
+ "zOrder": "0",
+ "measuredW": "454",
+ "measuredH": "28",
+ "x": "0",
+ "y": "0",
+ "properties": {
+ "size": "20",
+ "text": "Implement streaming of large requests/responses"
+ }
+ }
+ ]
+ }
+ }
+ },
+ {
+ "ID": "1826",
+ "typeID": "__group__",
+ "zOrder": "133",
+ "measuredW": "30",
+ "measuredH": "30",
+ "w": "30",
+ "h": "30",
+ "x": "220",
+ "y": "2045",
+ "properties": {
+ "controlName": "check:keep-alive"
+ },
+ "children": {
+ "controls": {
+ "control": [
+ {
+ "ID": "0",
+ "typeID": "TextArea",
+ "zOrder": "0",
+ "w": "30",
+ "h": "30",
+ "measuredW": "200",
+ "measuredH": "140",
+ "x": "0",
+ "y": "0"
+ }
+ ]
+ }
+ }
+ },
+ {
+ "ID": "1827",
+ "typeID": "__group__",
+ "zOrder": "134",
+ "measuredW": "500",
+ "measuredH": "28",
+ "w": "500",
+ "h": "28",
+ "x": "265",
+ "y": "2047",
+ "properties": {
+ "controlName": "keep-alive"
+ },
+ "children": {
+ "controls": {
+ "control": [
+ {
+ "ID": "0",
+ "typeID": "Label",
+ "zOrder": "0",
+ "measuredW": "500",
+ "measuredH": "28",
+ "x": "0",
+ "y": "0",
+ "properties": {
+ "size": "20",
+ "text": "Utilize HTTP keep-alive to reduce connection overhead"
+ }
+ }
+ ]
+ }
+ }
+ },
+ {
+ "ID": "1828",
+ "typeID": "__group__",
+ "zOrder": "117",
+ "measuredW": "30",
+ "measuredH": "30",
+ "w": "30",
+ "h": "30",
+ "x": "218",
+ "y": "813",
+ "properties": {
+ "controlName": "check:connection-pool-settings"
+ },
+ "children": {
+ "controls": {
+ "control": [
+ {
+ "ID": "0",
+ "typeID": "TextArea",
+ "zOrder": "0",
+ "w": "30",
+ "h": "30",
+ "measuredW": "200",
+ "measuredH": "140",
+ "x": "0",
+ "y": "0"
+ }
+ ]
+ }
+ }
+ },
+ {
+ "ID": "1830",
+ "typeID": "__group__",
+ "zOrder": "119",
+ "measuredW": "30",
+ "measuredH": "30",
+ "w": "30",
+ "h": "30",
+ "x": "218",
+ "y": "1153",
+ "properties": {
+ "controlName": "check:denormalize"
+ },
+ "children": {
+ "controls": {
+ "control": [
+ {
+ "ID": "0",
+ "typeID": "TextArea",
+ "zOrder": "0",
+ "w": "30",
+ "h": "30",
+ "measuredW": "200",
+ "measuredH": "140",
+ "x": "0",
+ "y": "0"
+ }
+ ]
+ }
+ }
+ },
+ {
+ "ID": "1831",
+ "typeID": "__group__",
+ "zOrder": "120",
+ "measuredW": "528",
+ "measuredH": "58",
+ "w": "528",
+ "h": "58",
+ "x": "262",
+ "y": "1154",
+ "properties": {
+ "controlName": "denormalize"
+ },
+ "children": {
+ "controls": {
+ "control": [
+ {
+ "ID": "0",
+ "typeID": "Label",
+ "zOrder": "0",
+ "measuredW": "528",
+ "measuredH": "28",
+ "x": "0",
+ "y": "0",
+ "properties": {
+ "size": "20",
+ "text": "Consider denormalizing database schema for ready-heavy"
+ }
+ },
+ {
+ "ID": "1",
+ "typeID": "Label",
+ "zOrder": "1",
+ "measuredW": "356",
+ "measuredH": "28",
+ "x": "0",
+ "y": "30",
+ "properties": {
+ "size": "20",
+ "text": "workloads and reduce JOIN operations."
+ }
+ }
+ ]
+ }
+ }
+ },
+ {
+ "ID": "1832",
+ "typeID": "__group__",
+ "zOrder": "135",
+ "measuredW": "30",
+ "measuredH": "30",
+ "w": "30",
+ "h": "30",
+ "x": "220",
+ "y": "2132",
+ "properties": {
+ "controlName": "check:prefetch-preload"
+ },
+ "children": {
+ "controls": {
+ "control": [
+ {
+ "ID": "0",
+ "typeID": "TextArea",
+ "zOrder": "0",
+ "w": "30",
+ "h": "30",
+ "measuredW": "200",
+ "measuredH": "140",
+ "x": "0",
+ "y": "0"
+ }
+ ]
+ }
+ }
+ },
+ {
+ "ID": "1833",
+ "typeID": "__group__",
+ "zOrder": "136",
+ "measuredW": "483",
+ "measuredH": "63",
+ "w": "483",
+ "h": "63",
+ "x": "265",
+ "y": "2134",
+ "properties": {
+ "controlName": "prefetch-preload"
+ },
+ "children": {
+ "controls": {
+ "control": [
+ {
+ "ID": "0",
+ "typeID": "Label",
+ "zOrder": "0",
+ "measuredW": "482",
+ "measuredH": "28",
+ "x": "1",
+ "y": "0",
+ "properties": {
+ "size": "20",
+ "text": "Prefetch or preload resources, data, or dependencies"
+ }
+ },
+ {
+ "ID": "1",
+ "typeID": "Label",
+ "zOrder": "1",
+ "measuredW": "480",
+ "measuredH": "28",
+ "x": "0",
+ "y": "35",
+ "properties": {
+ "size": "20",
+ "text": "required for subsequent requests to minimise latency"
+ }
+ }
+ ]
+ }
+ }
+ },
+ {
+ "ID": "1834",
+ "typeID": "Arrow",
+ "zOrder": "121",
+ "w": "587",
+ "h": "1",
+ "measuredW": "150",
+ "measuredH": "100",
+ "x": "225",
+ "y": "1926",
+ "properties": {
+ "curvature": "0",
+ "leftArrow": "false",
+ "rightArrow": "false",
+ "color": "4273622",
+ "p0": {
+ "x": -0.2686368305519409,
+ "y": 0
+ },
+ "p1": {
+ "x": 0.5001077701859015,
+ "y": 0.00033913823433391014
+ },
+ "p2": {
+ "x": 587.2092515685516,
+ "y": 0
+ }
+ }
+ },
+ {
+ "ID": "1835",
+ "typeID": "Canvas",
+ "zOrder": "122",
+ "w": "297",
+ "h": "50",
+ "measuredW": "100",
+ "measuredH": "70",
+ "x": "959",
+ "y": "1948",
+ "properties": {
+ "color": "16776960"
+ }
+ },
+ {
+ "ID": "1836",
+ "typeID": "Label",
+ "zOrder": "123",
+ "measuredW": "187",
+ "measuredH": "28",
+ "x": "1014",
+ "y": "1959",
+ "properties": {
+ "size": "20",
+ "text": "Performance Testing"
+ }
+ },
+ {
+ "ID": "1837",
+ "typeID": "__group__",
+ "zOrder": "124",
+ "measuredW": "30",
+ "measuredH": "30",
+ "w": "30",
+ "h": "30",
+ "x": "850",
+ "y": "2031",
+ "properties": {
+ "controlName": "check:perf-testing"
+ },
+ "children": {
+ "controls": {
+ "control": [
+ {
+ "ID": "0",
+ "typeID": "TextArea",
+ "zOrder": "0",
+ "w": "30",
+ "h": "30",
+ "measuredW": "200",
+ "measuredH": "140",
+ "x": "0",
+ "y": "0"
+ }
+ ]
+ }
+ }
+ },
+ {
+ "ID": "1838",
+ "typeID": "__group__",
+ "zOrder": "125",
+ "measuredW": "510",
+ "measuredH": "89",
+ "w": "510",
+ "h": "89",
+ "x": "896",
+ "y": "2030",
+ "properties": {
+ "controlName": "perf-testing"
+ },
+ "children": {
+ "controls": {
+ "control": [
+ {
+ "ID": "0",
+ "typeID": "Label",
+ "zOrder": "0",
+ "measuredW": "508",
+ "measuredH": "28",
+ "x": "0",
+ "y": "0",
+ "properties": {
+ "size": "20",
+ "text": "Conduct regular performance testing and benchmarking"
+ }
+ },
+ {
+ "ID": "2",
+ "typeID": "Label",
+ "zOrder": "1",
+ "measuredW": "510",
+ "measuredH": "28",
+ "x": "0",
+ "y": "30",
+ "properties": {
+ "size": "20",
+ "text": "to identify performance regressions, track improvements,"
+ }
+ },
+ {
+ "ID": "3",
+ "typeID": "Label",
+ "zOrder": "2",
+ "measuredW": "390",
+ "measuredH": "28",
+ "x": "0",
+ "y": "61",
+ "properties": {
+ "size": "20",
+ "text": "and fine-tune optimization efforts over time."
+ }
+ }
+ ]
+ }
+ }
+ },
+ {
+ "ID": "1841",
+ "typeID": "Arrow",
+ "zOrder": "126",
+ "w": "1",
+ "h": "76",
+ "measuredW": "150",
+ "measuredH": "100",
+ "x": "190",
+ "y": "376",
+ "properties": {
+ "curvature": "0",
+ "leftArrow": "false",
+ "rightArrow": "false",
+ "p0": {
+ "x": 0,
+ "y": 0
+ },
+ "p1": {
+ "x": 0.49999999999999994,
+ "y": 0
+ },
+ "p2": {
+ "x": 0,
+ "y": 76.17275043077757
+ },
+ "stroke": "dotted",
+ "color": "16777215"
+ }
+ },
+ {
+ "ID": "1852",
+ "typeID": "__group__",
+ "zOrder": "86",
+ "measuredW": "483",
+ "measuredH": "59",
+ "w": "483",
+ "h": "59",
+ "x": "263",
+ "y": "1711",
+ "properties": {
+ "controlName": "authentication-authorization"
+ },
+ "children": {
+ "controls": {
+ "control": [
+ {
+ "ID": "0",
+ "typeID": "Label",
+ "zOrder": "0",
+ "measuredW": "482",
+ "measuredH": "28",
+ "x": "1",
+ "y": "0",
+ "properties": {
+ "size": "20",
+ "text": "Implement proper authentication and authorization to"
+ }
+ },
+ {
+ "ID": "1",
+ "typeID": "Label",
+ "zOrder": "1",
+ "measuredW": "266",
+ "measuredH": "28",
+ "x": "0",
+ "y": "31",
+ "properties": {
+ "size": "20",
+ "text": "prevent unauthorized access."
+ }
+ }
+ ]
+ }
+ }
+ },
+ {
+ "ID": "1857",
+ "typeID": "__group__",
+ "zOrder": "27",
+ "measuredW": "505",
+ "measuredH": "58",
+ "w": "505",
+ "h": "58",
+ "x": "264",
+ "y": "589",
+ "properties": {
+ "controlName": "cache-invalidation"
+ },
+ "children": {
+ "controls": {
+ "control": [
+ {
+ "ID": "0",
+ "typeID": "Label",
+ "zOrder": "0",
+ "measuredW": "505",
+ "measuredH": "28",
+ "x": "0",
+ "y": "0",
+ "properties": {
+ "size": "20",
+ "text": "Use proper cache-invalidation strategies to ensure data"
+ }
+ },
+ {
+ "ID": "1",
+ "typeID": "Label",
+ "zOrder": "1",
+ "measuredW": "409",
+ "measuredH": "28",
+ "x": "0",
+ "y": "30",
+ "properties": {
+ "size": "20",
+ "text": "consistency and prevent stale content issues."
+ }
+ }
+ ]
+ }
+ }
+ },
+ {
+ "ID": "1868",
+ "typeID": "__group__",
+ "zOrder": "118",
+ "measuredW": "517",
+ "measuredH": "89",
+ "w": "517",
+ "h": "89",
+ "x": "261",
+ "y": "814",
+ "properties": {
+ "controlName": "connection-pool-settings"
+ },
+ "children": {
+ "controls": {
+ "control": [
+ {
+ "ID": "0",
+ "typeID": "Label",
+ "zOrder": "0",
+ "measuredW": "516",
+ "measuredH": "28",
+ "x": "1",
+ "y": "0",
+ "properties": {
+ "size": "20",
+ "text": "Fine-tune connection pool settings (e.g. max connections"
+ }
+ },
+ {
+ "ID": "1",
+ "typeID": "Label",
+ "zOrder": "1",
+ "measuredW": "457",
+ "measuredH": "28",
+ "x": "0",
+ "y": "30",
+ "properties": {
+ "size": "20",
+ "text": "idle timeout, connection reuse params) to optimize"
+ }
+ },
+ {
+ "ID": "2",
+ "typeID": "Label",
+ "zOrder": "2",
+ "measuredW": "498",
+ "measuredH": "28",
+ "x": "0",
+ "y": "61",
+ "properties": {
+ "size": "20",
+ "text": "resource utilization and prevent connection exhaustion."
+ }
+ }
+ ]
+ }
+ }
+ },
+ {
+ "ID": "1875",
+ "typeID": "__group__",
+ "zOrder": "77",
+ "measuredW": "427",
+ "measuredH": "59",
+ "w": "427",
+ "h": "59",
+ "x": "899",
+ "y": "1253",
+ "properties": {
+ "controlName": "critical-paths"
+ },
+ "children": {
+ "controls": {
+ "control": [
+ {
+ "ID": "0",
+ "typeID": "Label",
+ "zOrder": "0",
+ "measuredW": "427",
+ "measuredH": "28",
+ "x": "0",
+ "y": "0",
+ "properties": {
+ "size": "20",
+ "text": "Identify and optimize critical paths or frequently"
+ }
+ },
+ {
+ "ID": "1",
+ "typeID": "Label",
+ "zOrder": "1",
+ "measuredW": "411",
+ "measuredH": "28",
+ "x": "0",
+ "y": "31",
+ "properties": {
+ "size": "20",
+ "text": "accessed endpoints for overall system health."
+ }
+ }
+ ]
+ }
+ }
+ }
+ ]
+ },
+ "attributes": {
+ "name": "New Wireframe 1 copy",
+ "order": 1000009.1336392317,
+ "parentID": null,
+ "notes": ""
+ },
+ "branchID": "Master",
+ "resourceID": "E62F7257-0C11-4024-8C48-67BDED6B975E",
+ "mockupH": "2282",
+ "mockupW": "1230",
+ "measuredW": "1420",
+ "measuredH": "2416",
+ "version": "1.0"
+ },
+ "groupOffset": {
+ "x": 0,
+ "y": 0
+ },
+ "dependencies": [],
+ "projectID": "file:///Users/kamrify/Desktop/New%20Roadmaps/Android%20Roadmap.bmpr"
+}
\ No newline at end of file
diff --git a/src/data/best-practices/backend-performance/backend-performance.md b/src/data/best-practices/backend-performance/backend-performance.md
new file mode 100644
index 000000000..a23cbff20
--- /dev/null
+++ b/src/data/best-practices/backend-performance/backend-performance.md
@@ -0,0 +1,30 @@
+---
+jsonUrl: '/jsons/best-practices/backend-performance.json'
+pdfUrl: '/pdfs/best-practices/backend-performance.pdf'
+order: 1
+briefTitle: 'Backend Performance'
+briefDescription: 'Backend Performance Best Practices'
+isNew: true
+isUpcoming: false
+title: 'Backend Performance Best Practices'
+description: 'Detailed list of best practices to improve your backend performance'
+dimensions:
+ width: 968
+ height: 1789.23
+schema:
+ headline: 'Backend Performance Best Practices'
+ description: 'Detailed list of best practices to improve the backend performance of your website. Each best practice carries further details and how to implement that best practice.'
+ imageUrl: 'https://roadmap.sh/best-practices/backend-performance.png'
+ datePublished: '2023-01-23'
+ dateModified: '2023-01-23'
+seo:
+ title: 'Backend Performance Best Practices'
+ description: 'Detailed list of best practices to improve the backend performance of your website. Each best practice carries further details and how to implement that best practice.'
+ keywords:
+ - 'backend performance'
+ - 'api performance'
+ - 'backend performance best practices'
+ - 'backend performance checklist'
+ - 'backend checklist'
+ - 'make performant backends'
+---
diff --git a/src/data/best-practices/backend-performance/content/architectural-styles.md b/src/data/best-practices/backend-performance/content/architectural-styles.md
new file mode 100644
index 000000000..a51af1707
--- /dev/null
+++ b/src/data/best-practices/backend-performance/content/architectural-styles.md
@@ -0,0 +1,3 @@
+# Architectural Styles and Service Decomposition
+
+Backend performance in web applications greatly depends on the selection of architectural styles like Service-Oriented Architecture (SOA) or Microservices and the ability to decompose services when necessary. For instance, using Microservices, an application is broken into smaller, loosely coupled services, making it easy to maintain and scale, improving the overall backend performance. Service decomposition, on the other hand, allows for the distribution of responsibilities, meaning if one service fails, it won't likely impact the entire system. Thus, understanding and efficiently managing architectural styles and service decomposition are critical for the optimized backend performance in web applications.
\ No newline at end of file
diff --git a/src/data/best-practices/backend-performance/content/async-logging.md b/src/data/best-practices/backend-performance/content/async-logging.md
new file mode 100644
index 000000000..c6efb1d12
--- /dev/null
+++ b/src/data/best-practices/backend-performance/content/async-logging.md
@@ -0,0 +1,3 @@
+# Asynchronous Logging Mechanisms
+
+To optimise backend performance in web applications, implementing asynchronous logging mechanisms becomes crucial. It diminishes the logging overhead, thereby speeding up the execution flow of an application. For instance, the application does not need to wait for the logging data to be written on the disk, as the writing task is executed in the background, enabling the next instructions to execute without interruption. This also prevents unnecessary queuing of tasks, thereby bolstering the overall throughput of the backend operations. Netflix's open-source tool called 'Zuul' exhibits this concept where they use async logging to achieve scalability in high traffic.
\ No newline at end of file
diff --git a/src/data/best-practices/backend-performance/content/authentication-authorization.md b/src/data/best-practices/backend-performance/content/authentication-authorization.md
new file mode 100644
index 000000000..a46538e85
--- /dev/null
+++ b/src/data/best-practices/backend-performance/content/authentication-authorization.md
@@ -0,0 +1,3 @@
+# Implementing Proper Authentication and Authorization
+
+In the backend performance of web applications, robust authentication and authorization play an integral role. Having tight security measures ensures the application's optimal functioning by preventing unauthorized access. These precautionary measures protect the system from external threats such as data breaches or malicious attacks. For example, imagine a banking application without stringent authentication procedures. It could be easily exploited by hackers, leading to serious loss of finances and damage to the bank's reputation. Therefore, secure authentication and authorization is essential for maintaining the application's integrity and stability, ultimately contributing to efficient backend performance.
\ No newline at end of file
diff --git a/src/data/best-practices/backend-performance/content/cache-invalidation.md b/src/data/best-practices/backend-performance/content/cache-invalidation.md
new file mode 100644
index 000000000..43049375f
--- /dev/null
+++ b/src/data/best-practices/backend-performance/content/cache-invalidation.md
@@ -0,0 +1,3 @@
+# Efficient Cache-Invalidation Strategies
+
+In the realm of backend performance, adopting proper cache-invalidation strategies is highly relevant. Effective cache management takes the pressure off web servers by saving and displaying previously retrieved or computed data. However, the challenge arises when such cached data becomes outdated, or 'stale'. If not addressed, users may be presented incorrect or obsolete information. Good cache-invalidation strategies ensure that the system constantly refreshes or dumps outdated cache, keeping the data consistent and accurate. For example, using time-based strategies, a system could invalidate cache after a set period, essentially creating a self-maintenance regimen. Similarly, with a write-through approach, an application updates the cache immediately as changes are made, guaranteeing the users always receive the most recent data.
\ No newline at end of file
diff --git a/src/data/best-practices/backend-performance/content/caching-locations.md b/src/data/best-practices/backend-performance/content/caching-locations.md
new file mode 100644
index 000000000..47fb273ab
--- /dev/null
+++ b/src/data/best-practices/backend-performance/content/caching-locations.md
@@ -0,0 +1,3 @@
+# Implementing Caching at Various Levels
+
+In web development, backend performance significantly depends on the speed at which data is fetched and delivered. Implementing caching at various levels like database query results, HTML fragments, or even full-page, boosts the efficiency of data retrieval processes. Through caching, redundant data fetching is avoided leading to faster response times and reduced server load. For instance, when a database query result is cached, the system doesn't have to run the same operation repetitively thus enhancing speed. Moreover, in HTML fragments caching, reusable parts of a web page get stored, so they don't have to be reprocessed for every request, improving load times. Full-page caching, on the other hand, saves a rendered copy of the whole page, offering immediate response upon user's request. Each of these cache implementations enhances performance, increases scalability and improves user experience in web applications.
\ No newline at end of file
diff --git a/src/data/best-practices/backend-performance/content/caching-strategies.md b/src/data/best-practices/backend-performance/content/caching-strategies.md
new file mode 100644
index 000000000..78d441515
--- /dev/null
+++ b/src/data/best-practices/backend-performance/content/caching-strategies.md
@@ -0,0 +1,3 @@
+# Application of Suitable Caching Patterns
+
+For optimal backend performance in web applications, implementing the correct caching approach, such as cache aside, write-through, or read-through caching, matters greatly. This is significant fundamentally because it reduces the load on your database, fetching data quicker and decreasing the latency time, leading to faster response times. For instance, consider a high-traffic e-commerce site where hundreds of thousands of product details need to be fetched simultaneously. If a suitable caching pattern like the read-through cache is applied here, it would handle retrieving data from the database when the cache is empty, ensuring that the application always receives data, improving the overall performance and user experience.
\ No newline at end of file
diff --git a/src/data/best-practices/backend-performance/content/cdns.md b/src/data/best-practices/backend-performance/content/cdns.md
new file mode 100644
index 000000000..87dd8acc9
--- /dev/null
+++ b/src/data/best-practices/backend-performance/content/cdns.md
@@ -0,0 +1,3 @@
+# Utilization of CDNs for Static and Frequently Accessed Assets
+
+For optimal backend performance in web applications, the use of Content Delivery Networks (CDNs) for serving static and frequently accessed assets is paramount. CDNs enhance website loading speed by storing a cached version of its content in multiple geographical locations. As such, when a user requests a website, the content is delivered from the nearest server, dramatically reducing latency and packet loss. This is especially beneficial for static and frequently accessed assets that remain unchanged over time like CSS, JavaScript files or Image files. For instance, a user in London trying to access a US-based web application can retrieve static content from a closer server in the UK rather than crossing the Atlantic every time, ensuring efficient and speedy content delivery.
\ No newline at end of file
diff --git a/src/data/best-practices/backend-performance/content/cleanup-data.md b/src/data/best-practices/backend-performance/content/cleanup-data.md
new file mode 100644
index 000000000..e426738db
--- /dev/null
+++ b/src/data/best-practices/backend-performance/content/cleanup-data.md
@@ -0,0 +1,3 @@
+# Regular Maintenance and Cleanup of Data
+
+Optimizing the backend performance in web applications depends greatly on how data is managed. Unnecessary or unused data could cause the system to slow down, impacting the efficiency of the backend processes. Regular cleanup of such data ensures that the server is not overburdened, allowing faster retrieval and storage of information. Similarly, routine database maintenance tasks like vacuuming and indexing help boost performance. Vacuuming helps remove stale or obsolete data, freeing up space and preventing system delays. Indexing, on the other hand, organizes data in a way that makes it easily retrievable, speeding up query response times. It's like using a well-organized filing system rather than a jumbled heap of papers. Additionally, optimizing queries aids in reducing the time taken for database interactions. An example of this would be replacing a nested query with a join, thereby reducing the processing time. Altogether, these practices lead to improved backend performance, ensuring smooth and efficient functioning of web applications.
diff --git a/src/data/best-practices/backend-performance/content/compiled-languages.md b/src/data/best-practices/backend-performance/content/compiled-languages.md
new file mode 100644
index 000000000..239e31cff
--- /dev/null
+++ b/src/data/best-practices/backend-performance/content/compiled-languages.md
@@ -0,0 +1,3 @@
+# Utilizing Compiled Languages like Go or Rust
+
+The backend performance of web applications can be substantially augmented by incorporating compiled languages such as Go or Rust. The essence of this lies in the manner these languages handle the conversion of code into machine language. Unlike interpreted languages, which convert the code into machine language during runtime, compiled languages do this step beforehand. This increased efficiency in translation results in faster performance of the code, especially valuable for performance-critical segments of your backend. For instance, Google uses Go language in several of their production systems for the very reason of increased performance and scalability. Similarly, Rust has gained acclaim in building highly concurrent and fast systems. Thus, using such compiled languages can greatly boost the overall backend performance.
\ No newline at end of file
diff --git a/src/data/best-practices/backend-performance/content/connection-pool-settings.md b/src/data/best-practices/backend-performance/content/connection-pool-settings.md
new file mode 100644
index 000000000..a12e51bb5
--- /dev/null
+++ b/src/data/best-practices/backend-performance/content/connection-pool-settings.md
@@ -0,0 +1,3 @@
+# Optimizing Connection Pool Settings
+
+Backend performance of web applications can be significantly improved by fine-tuning connection pool settings. One of the main causes of performance degradation is the unnecessary utilization of resources. If a web application can reuse existing connections (via connection reuse parameters), instead of creating new ones each time a user sends a request, it saves a lot of processing time and power thereby improving performance. Moreover, by limiting the maximum number of idle connections, and setting suitable idle timeouts, enormous amounts of resources can be conserved. This not only improves performance but also makes the application more scalable. For instance, consider an e-commerce website during a huge sale where thousands of users are constantly connecting and disconnecting. By leveraging optimized connection pool settings, the application can process user requests more efficiently and faster, thus enhancing the site's overall backend performance.
\ No newline at end of file
diff --git a/src/data/best-practices/backend-performance/content/connection-pooling.md b/src/data/best-practices/backend-performance/content/connection-pooling.md
new file mode 100644
index 000000000..4ffc9ee12
--- /dev/null
+++ b/src/data/best-practices/backend-performance/content/connection-pooling.md
@@ -0,0 +1,3 @@
+# Connection Pooling: Reducing Connection Overhead
+
+Effective backend performance in web applications heavily relies on proficiently managing database connections, for which connection pooling plays a crucial role. When a web application needs to establish multiple connections or reconnect frequently, high overhead can become burdensome and slow down performance. Utilizing connection pools addresses this issue by enabling applications to reuse existing connections, rather than needing to establish a new one for each user or session that needs database access. For instance, in a high traffic eCommerce website, leveraging connection pooling can significantly reduce lag in loading product details or processing transactions, resulting in a smoother user experience and increased operational efficiency. By reducing connection overhead through connection pooling, backend performance is greatly enhanced, leading to an optimized and expedited data exchange process.
\ No newline at end of file
diff --git a/src/data/best-practices/backend-performance/content/connection-timeouts.md b/src/data/best-practices/backend-performance/content/connection-timeouts.md
new file mode 100644
index 000000000..63c48315e
--- /dev/null
+++ b/src/data/best-practices/backend-performance/content/connection-timeouts.md
@@ -0,0 +1,3 @@
+# Managing Network Issues: Setting Appropriate Connection Timeouts and Implementing Efficient Retry Mechanisms
+
+Efficient management of network issues directly contributes to enhanced backend performance in web applications. When an application attempts to establish a network connection, a reasonable connection timeout ensures the process doesn't hang indefinitely while waiting for a response. This allows for optimal system resource utilization, reducing unnecessary load on the server, thereby enhancing backend performance. For example, a server dealing with heavy traffic might cause delays. If the connection timeout is set too low, the application might terminate the process prematurely, reducing efficiency. Meanwhile, an effective retry mechanism is crucial to handle network failures. Without an efficient retry mechanism, network failures could trigger serious system errors or downtime. For example, if a network call fails due to temporary network issues, a well-implemented retry mechanism can attempt at re-establishing the connection, ensuring uninterrupted backend operations and enhanced application performance.
\ No newline at end of file
diff --git a/src/data/best-practices/backend-performance/content/critical-paths.md b/src/data/best-practices/backend-performance/content/critical-paths.md
new file mode 100644
index 000000000..4d8b3caba
--- /dev/null
+++ b/src/data/best-practices/backend-performance/content/critical-paths.md
@@ -0,0 +1,3 @@
+# Optimizing Critical Paths and Frequently Accessed Endpoints
+
+In web applications, maintaining the overall system health is crucial, and an important aspect of this is the optimization of critical paths and frequently accessed endpoints. These paths and endpoints act as the vital junctions where most user requests are processed, converted, and delivered as output. Proper identification and optimization of these routes ensure seamless user experience and high-speed data delivery. For instance, when a user logs on to an e-commerce website, the critical paths may include user authentication, product search, and payment gateway. Prioritizing the performance of these backend endpoints helps in reducing latency and enhances page load speed, preserving optimum overall system health.
\ No newline at end of file
diff --git a/src/data/best-practices/backend-performance/content/db-indexes.md b/src/data/best-practices/backend-performance/content/db-indexes.md
new file mode 100644
index 000000000..aa18b21e2
--- /dev/null
+++ b/src/data/best-practices/backend-performance/content/db-indexes.md
@@ -0,0 +1,3 @@
+# Efficient Database Indexing
+
+In web application development, efficient database indexing is instrumental in boosting backend performance. Indexes significantly cut short the time it takes for databases to retrieve and write data by providing swift navigational access to the rows in a table. For instance, a database without indexes may need to scan every row in a table to retrieve the required data, resulting in slow query response time. However, if the table is indexed, the same database can locate the data quickly and efficiently. It's akin to finding a book in a library - without a cataloguing system (index), you'd have to go through each book manually. With a cataloguing system (index), you can swiftly locate the exact book you need. Therefore, proper indexing strategy is key for high backend performance.
\ No newline at end of file
diff --git a/src/data/best-practices/backend-performance/content/denormalize.md b/src/data/best-practices/backend-performance/content/denormalize.md
new file mode 100644
index 000000000..339cce320
--- /dev/null
+++ b/src/data/best-practices/backend-performance/content/denormalize.md
@@ -0,0 +1,3 @@
+# Denormalizing Database Schema for Read-Heavy Workloads and Reducing Join Operations
+
+Web applications with high read demand benefit from a denormalized database schema, as it significantly improves backend performance. Primarily, denormalization reduces the need for costly join operations, making data retrieval quicker and more efficient. For example, an e-commerce application with millions of views per day would benefit from denormalized schema because each product page view might need to fetch data from multiple tables such as product, reviews, price, and vendor details. If these tables are denormalized into a single table, it eradicates the need for join operations, making the page load faster for end users. The subsequent boost in efficiency benefits the backend system by alleviating processing strain and enables it to deal with higher volume loads, thus enhancing overall backend performance.
\ No newline at end of file
diff --git a/src/data/best-practices/backend-performance/content/enable-compression.md b/src/data/best-practices/backend-performance/content/enable-compression.md
new file mode 100644
index 000000000..0a133275d
--- /dev/null
+++ b/src/data/best-practices/backend-performance/content/enable-compression.md
@@ -0,0 +1,3 @@
+# Enabling Compression for Responses
+
+Optimizing the backend performance of web applications often necessitates the enablement of compression for responses. Compression methods, such as Gzip or Brotli, reduce the size of the data transmitted between the server and the client. This result in faster data transfer, minimizing the load time of the web page and improving the user experience. For instance, if a web page has a size of 100 KB, applying compression can reduce it to 30 KB. This means less data to download, hence quicker loading times. Therefore, enabling compression for responses is critical in making web applications more efficient and responsive.
\ No newline at end of file
diff --git a/src/data/best-practices/backend-performance/content/implement-pagination.md b/src/data/best-practices/backend-performance/content/implement-pagination.md
new file mode 100644
index 000000000..e758064ae
--- /dev/null
+++ b/src/data/best-practices/backend-performance/content/implement-pagination.md
@@ -0,0 +1,3 @@
+# Efficient Pagination for Large Datasets
+
+Handling large datasets effectively is key to improving backend performance in web applications. When a database query returns too much data, it can lead to slow load times and a poor user experience. Implementing efficient pagination significantly reduces the amount of data to be processed at once, thus reducing server load and latency times. For example, instead of loading thousands, or even millions, of records in one go, pagination allows it to load only a specific number of records per page, boosting speed and efficiency. It helps ensure seamless data retrieval, an impressive server response time, and ultimately better overall performance.
\ No newline at end of file
diff --git a/src/data/best-practices/backend-performance/content/index.md b/src/data/best-practices/backend-performance/content/index.md
new file mode 100644
index 000000000..4e768b56d
--- /dev/null
+++ b/src/data/best-practices/backend-performance/content/index.md
@@ -0,0 +1 @@
+#
\ No newline at end of file
diff --git a/src/data/best-practices/backend-performance/content/join-operations.md b/src/data/best-practices/backend-performance/content/join-operations.md
new file mode 100644
index 000000000..a0d6ffb89
--- /dev/null
+++ b/src/data/best-practices/backend-performance/content/join-operations.md
@@ -0,0 +1,3 @@
+# Optimizing Join Operations and Avoiding Unnecessary Joins
+
+In the realm of backend performance, the efficiency of join operations weighs heavily. Join operations combine rows from two or more tables, an action that can be processor-intensive and can drastically slow down system response times. As the size and complexity of databases increase, so does the time taken for these operations. Hence, optimizing join operations is paramount. This could involve appropriately indexing your tables or using specific types of joins such as INNER JOIN or LEFT JOIN depending on your needs. Similarly, unnecessary joins can clutter system processes and slow down performance. For example, if two tables have no real association but are joined, data retrieval can become sluggish and inefficient. Hence, preventing unnecessary joins enhances the overall backend performance.
\ No newline at end of file
diff --git a/src/data/best-practices/backend-performance/content/keep-alive.md b/src/data/best-practices/backend-performance/content/keep-alive.md
new file mode 100644
index 000000000..561c004b8
--- /dev/null
+++ b/src/data/best-practices/backend-performance/content/keep-alive.md
@@ -0,0 +1,3 @@
+# Utilization of HTTP Keep-Alive for Reducing Connection Overhead
+
+Significant enhancement in backend performance for web applications can be achieved through the utilization of HTTP keep-alive. This protocol allows for multiple HTTP requests to be sent over the same TCP connection. Typically, each new request from a client to a server would require a new TCP connection, and this process can be resource-intensive and slow as it involves a three-way handshake. With HTTP keep-alive, these overheads are greatly reduced as one connection can be reused for multiple requests. For example, in a web application where users constantly interact and request data, using this method can greatly speed up the load time and response, creating a smoother user experience.
\ No newline at end of file
diff --git a/src/data/best-practices/backend-performance/content/lazy-eager.md b/src/data/best-practices/backend-performance/content/lazy-eager.md
new file mode 100644
index 000000000..793b398d4
--- /dev/null
+++ b/src/data/best-practices/backend-performance/content/lazy-eager.md
@@ -0,0 +1,3 @@
+# Optimizing Data Retrieval with Lazy Loading, Eager Loading, and Batch Processing
+
+Optimizing data retrieval has a direct impact on backend performance in web applications. Specifically, features such as lazy loading, eager loading, and batch processing can greatly improve system responsiveness. Lazy loading, which entails loading data only when it's genuinely needed, can facilitate quicker initial page loading, thus improving user experience. On the contrary, eager loading minimizes the number of database queries by loading all necessary data upfront. While it may delay the initial loading process, it significantly speeds up subsequent data retrievals. In a similar vein, batch processing groups and executes similar tasks together, reducing the overhead associated with starting and ending tasks. These techniques are therefore crucial, as they help avoid performance bottlenecks and maintain efficient, seamless operation on the backend.
\ No newline at end of file
diff --git a/src/data/best-practices/backend-performance/content/load-balancing.md b/src/data/best-practices/backend-performance/content/load-balancing.md
new file mode 100644
index 000000000..046587513
--- /dev/null
+++ b/src/data/best-practices/backend-performance/content/load-balancing.md
@@ -0,0 +1,3 @@
+# Load Balancing for Traffic Distribution
+
+The performance of a backend system in web applications hugely relies on the way it handles incoming traffic. If a server is overwhelmed with too much traffic, it may slow down significantly or, in the worst-case scenario, crash completely. Opting to use load balancing mitigates these risks. Load balancing involves distributing network traffic across multiple servers, thereby ensuring none is overwhelmed. This undoubtedly optimizes backend performance, maintaining system stability, and increasing the capacity to handle more traffic. For instance, high traffic websites like Amazon and Facebook use load balancers to evenly distribute millions of requests per day among countless servers, ensuring smooth and efficient service delivery.
\ No newline at end of file
diff --git a/src/data/best-practices/backend-performance/content/message-brokers.md b/src/data/best-practices/backend-performance/content/message-brokers.md
new file mode 100644
index 000000000..5ec09353f
--- /dev/null
+++ b/src/data/best-practices/backend-performance/content/message-brokers.md
@@ -0,0 +1,3 @@
+# Utilizing Message Brokers for Async Communication Between Services
+
+Backend performance enhancement heavily relies on effective communication between diverse services. Message brokers, in this context, prove to be an essential instrument as they facilitate asynchronous communication, a method which boosts the system’s overall performance by allowing multiple operations to occur simultaneously. For instance, in a web application that processes online payments, a message broker can permit the receipt of payments (one service) to occur concurrently with updating the user’s payment history (another service). This prevents delays and halts, which means end users receive faster and smoother experiences. An improved backend performance, characterized by efficiency and time-effectiveness, makes this possible.
\ No newline at end of file
diff --git a/src/data/best-practices/backend-performance/content/monitoring-logging.md b/src/data/best-practices/backend-performance/content/monitoring-logging.md
new file mode 100644
index 000000000..475b5b6e8
--- /dev/null
+++ b/src/data/best-practices/backend-performance/content/monitoring-logging.md
@@ -0,0 +1,3 @@
+# Comprehensive Monitoring and Logging
+
+Backend performance can significantly affect the functionality and user experience of a web application. This necessitates the implementation of comprehensive monitoring and logging to track performance metrics and troubleshoot issues. These tactics give us eyes and ears within the performance of our application's infrastructure, helping identify potential bottlenecks or breakdowns. For example, monitoring could reveal that a particular database operation is taking longer than expected, which could be the cue to optimize the associated query. Similarly, logging will give us detailed records of application events, allowing us to trace and resolve any errors or issues captured in these logs. Unresolved issues can often slow down backend operations, or hamper their working altogether, hence impacting performance. Therefore, effective application of monitoring and validating logging data can enhance backend efficiency and bring valuable insights for further improvement.
\ No newline at end of file
diff --git a/src/data/best-practices/backend-performance/content/network-latency.md b/src/data/best-practices/backend-performance/content/network-latency.md
new file mode 100644
index 000000000..193a4e44f
--- /dev/null
+++ b/src/data/best-practices/backend-performance/content/network-latency.md
@@ -0,0 +1,3 @@
+# Hosting Backend Close to Users to Minimize Network Latency
+
+In web applications, reducing network latency can substantially enhance the backend performance. This means data has less distance to travel between users and servers, resulting in faster response times and smoother user experiences. For instance, if a company's primary user base resides in Asia but its server is in North America, the geographical gap can cause noticeable delays. However, by situating the backend near this Asia-based user base, data doesn't have to cross oceans and continents, making interactive web services more responsive and reliable. Hence, hosting the backend location close to the users is a crucial strategy in minimizing network latency.
\ No newline at end of file
diff --git a/src/data/best-practices/backend-performance/content/offload-heavy.md b/src/data/best-practices/backend-performance/content/offload-heavy.md
new file mode 100644
index 000000000..3eccf5de8
--- /dev/null
+++ b/src/data/best-practices/backend-performance/content/offload-heavy.md
@@ -0,0 +1,3 @@
+# Offloading Heavy Tasks to Background Jobs or Queues
+
+In web applications, backend performance can be significantly optimized through the offloading of heavy tasks to background jobs or queues. If significant computational tasks or resource-intensive operations are processed in real-time, there can be a considerable slowdown in the system’s response time. This can lead to an undesirable user experience as requests take longer to process. In contrast, moving these heavy tasks to background processes allows for a more streamlined and efficient operation. For instance, creating a thumbnail for an uploaded image or sending a confirmation email could be moved to a background job, leaving the main thread free to handle user requests. This way, the user wouldn't have to wait unnecessarily and could continue navigating the website seamlessly, hence, improving overall system performance and responsiveness.
\ No newline at end of file
diff --git a/src/data/best-practices/backend-performance/content/optimize-algorithms.md b/src/data/best-practices/backend-performance/content/optimize-algorithms.md
new file mode 100644
index 000000000..47c490a60
--- /dev/null
+++ b/src/data/best-practices/backend-performance/content/optimize-algorithms.md
@@ -0,0 +1,3 @@
+# Optimization of Algorithms and Data Structures Used
+
+Efficient use and optimization of algorithms and data structures significantly contribute to improving backend performance in web applications. For instance, a well-optimized sorting algorithm can enhance data processing speed while providing quick access to information. In contrast, an inefficient algorithm can increase server load leading to slowdowns and higher response times. Similarly, using appropriate data structures reduces memory usage and enhances data management. A classic example is using hash tables for efficient search operations instead of an array, reducing the time complexity from O(n) to O(1). Therefore, optimizing algorithms and data structures is essential for competent backend performance.
\ No newline at end of file
diff --git a/src/data/best-practices/backend-performance/content/orm-queries.md b/src/data/best-practices/backend-performance/content/orm-queries.md
new file mode 100644
index 000000000..daab5c55e
--- /dev/null
+++ b/src/data/best-practices/backend-performance/content/orm-queries.md
@@ -0,0 +1,3 @@
+# Fine-Tuning ORM Queries
+
+For backend performance in web applications, one must diligently monitor and fine-tune Object-Relational Mapping (ORM) queries. Why? ORMs help to convert data between incompatible types, enabling database manipulations using an object-oriented paradigm. However, they can also generate heavy, inefficient SQL queries without proper management, creating lag in web performance. By keenly watching and fine-tuning these queries, you can ensure a smoother and faster data retrieval process, resulting in an overall boost to backend performance. For instance, ORM functions like eager loading and batch loading can be used to fetch related data in fewer queries, reducing load times and enhancing performance.
\ No newline at end of file
diff --git a/src/data/best-practices/backend-performance/content/pagination-large-data.md b/src/data/best-practices/backend-performance/content/pagination-large-data.md
new file mode 100644
index 000000000..91225d591
--- /dev/null
+++ b/src/data/best-practices/backend-performance/content/pagination-large-data.md
@@ -0,0 +1,3 @@
+# Efficient Pagination for Large Datasets
+
+Backend performance in web applications can significantly be improved with efficient pagination for large datasets. When data-loaded in an application is quite extensive, executing simple queries without pagination can slow down response times, producing an adverse user experience. Through pagination, applications can deliver data in smaller, manageable chunks, reducing the amount of data transferred on each request and thereby increasing the speed and performance of the backend. For instance, instead of retrieving a million records at once, the application retrieves chunks of 50 or 100 at a time, dramatically enhancing the performance.
\ No newline at end of file
diff --git a/src/data/best-practices/backend-performance/content/perf-testing.md b/src/data/best-practices/backend-performance/content/perf-testing.md
new file mode 100644
index 000000000..58b2d92f6
--- /dev/null
+++ b/src/data/best-practices/backend-performance/content/perf-testing.md
@@ -0,0 +1,3 @@
+# Regular Performance Testing and Benchmarking
+
+Maintaining optimal backend performance in web applications involves consistent and regular performance testing and benchmarking. This practice helps in pinpointing any performance regressions which could otherwise significantly slow down the applications, leading to a subpar user experience. For example, if a new feature introduces memory leaks, regular testing can catch it before the feature is deployed. It also highlights improvements and illustrates the actual impact of optimization efforts over time. Through regular testing, ineffective optimizations can be scrapped before too many resources are invested into them, while beneficial strategies can be identified and further fine-tuned. Consequently, these actions contribute to a more efficient and productive application performance management strategy.
\ No newline at end of file
diff --git a/src/data/best-practices/backend-performance/content/prefetch-preload.md b/src/data/best-practices/backend-performance/content/prefetch-preload.md
new file mode 100644
index 000000000..8f98c046f
--- /dev/null
+++ b/src/data/best-practices/backend-performance/content/prefetch-preload.md
@@ -0,0 +1,3 @@
+# Optimising Backend Performance through Prefetching or Preloading Resources
+
+The optimisation of backend performance in web applications involves proactively fetching or loading resources, data, or dependencies needed for future requests. By performing these operations in advance, costly delays (latency) are reduced significantly. This process ensures that resources are available as soon as they are required, resulting in a seamless and faster interaction for users. For instance, when a user opens a site, if images or other data that are likely to be used next are already preloaded, the user will not experience any delay as these elements load. As such, prefetching or preloading is critical to improve the overall speed of a web application, directly enhancing user experience.
\ No newline at end of file
diff --git a/src/data/best-practices/backend-performance/content/profile-code.md b/src/data/best-practices/backend-performance/content/profile-code.md
new file mode 100644
index 000000000..183b9ad54
--- /dev/null
+++ b/src/data/best-practices/backend-performance/content/profile-code.md
@@ -0,0 +1,3 @@
+# Identifying Performance Bottlenecks through Code Profiling
+
+The effective performance of a web application's backend heavily relies on the smooth operation of its code. Profiling is the process of monitoring the behaviour of your code, including the frequency and duration of function calls. This allows for the identification of performance bottlenecks—specific parts of the code that impede optimal performance. For example, a function that requires significant processing power and slows down the application can be revealed through code profiling. By identifying and resolving these bottlenecks, the backend performance can be dramatically improved, leading to faster response times and enhanced user experience.
\ No newline at end of file
diff --git a/src/data/best-practices/backend-performance/content/profiling-tools.md b/src/data/best-practices/backend-performance/content/profiling-tools.md
new file mode 100644
index 000000000..af204ec41
--- /dev/null
+++ b/src/data/best-practices/backend-performance/content/profiling-tools.md
@@ -0,0 +1,3 @@
+# Use of Profiling Tools in Database Management
+
+The backend performance of web applications can greatly benefit from the utilization of profiling tools provided by the database. These tools allow for the identification and isolation of performance bottlenecks within an application. By identifying slow queries or areas of inefficient data retrieval, detection of these issues early-on can prevent the propagation of defects through the application, ultimately enhancing user experience. For instance, MySQL features a database profiling tool that can identify query performance through examination of query execution times. Profiling not only contributes to maintaining the speed and efficiency of a website, but also enables developers to optimize their code more effectively, saving valuable development time and resources.
\ No newline at end of file
diff --git a/src/data/best-practices/backend-performance/content/prometheus-graphana.md b/src/data/best-practices/backend-performance/content/prometheus-graphana.md
new file mode 100644
index 000000000..78bdf4eba
--- /dev/null
+++ b/src/data/best-practices/backend-performance/content/prometheus-graphana.md
@@ -0,0 +1,3 @@
+# Backend Monitoring with Prometheus, Grafana, ELK Stack
+
+Efficiency and rate of performance are paramount for the backend processes in web applications. Utilizing performance monitoring tools such as Prometheus, Grafana, and the ELK Stack ensures that any issues impacting performance can be promptly identified and rectified. For example, Prometheus offers robust monitoring capabilities by collecting numeric time series data, presenting a detailed insight into the application's performance metrics. Grafana can visualize this data in an accessible, user-friendly way, helping developers to interpret complex statistics and notice trends or anomalies. Meanwhile, the ELK Stack (Elasticsearch, Logstash, Kibana) provides log management solutions, making it possible to search and analyze logs for indications of backend issues. By using these tools, developers can effectively keep backend performance at optimal levels, ensuring smoother user experiences.
\ No newline at end of file
diff --git a/src/data/best-practices/backend-performance/content/reasonable-payload.md b/src/data/best-practices/backend-performance/content/reasonable-payload.md
new file mode 100644
index 000000000..64e98a3cf
--- /dev/null
+++ b/src/data/best-practices/backend-performance/content/reasonable-payload.md
@@ -0,0 +1,3 @@
+# Enforcing Reasonable Payload Size Limits
+
+Backend performance in web applications largely depends on how quickly servers are able to process, store, and retrieve data. When large data payloads are transferred, it places a heavy strain on network resources and the server itself; potentially resulting in sluggish response times and poor application performance. Hence, enforcing reasonable payload size limits is vital to maintain optimum performance. For example, a web application dealing with large image files can implement limits to ensure that users don't upload images beyond a certain size. This not only helps to keep server and bandwidth costs manageable, but also ensures that the application runs smoothly for all users.
\ No newline at end of file
diff --git a/src/data/best-practices/backend-performance/content/regular-audits.md b/src/data/best-practices/backend-performance/content/regular-audits.md
new file mode 100644
index 000000000..44d111bc9
--- /dev/null
+++ b/src/data/best-practices/backend-performance/content/regular-audits.md
@@ -0,0 +1,3 @@
+# Regular Auditing and Updating Security Measures
+
+Securing the backend of your web application is paramount to maintaining peak performance. If a system is compromised due to outdated security measures, hackers could leverage this access to disrupt the performance of the site. For instance, an attacker may deploy a DDoS attack, rendering the service slow or completely unavailable. By conducting regular audits and updates of security measures, possible vulnerabilities can be identified and solved before they turn into larger performance affecting issues. This proactive approach supports stable operation, ensures smooth access for users, and promotes overall backend performance.
\ No newline at end of file
diff --git a/src/data/best-practices/backend-performance/content/replication.md b/src/data/best-practices/backend-performance/content/replication.md
new file mode 100644
index 000000000..d45b03efe
--- /dev/null
+++ b/src/data/best-practices/backend-performance/content/replication.md
@@ -0,0 +1,3 @@
+# Database Replication for Redundancy and Enhanced Read Performance
+
+Safeguarding backend performance necessitates database replication, as it increases redundancy thus enhancing data consistency across different systems. It facilitates simultaneous access to the same data from various servers, which significantly optimizes read performance. This is particularly beneficial for web applications that experience substantial read loads. For example, consider a busy e-commerce site during a sales event. If all read and write operations occur on the same database, it could lead to performance lags. However, with database replication, such high-volume read operations can be redirected to replicated servers, assuring smooth and efficient customer experiences.
\ No newline at end of file
diff --git a/src/data/best-practices/backend-performance/content/request-throttling.md b/src/data/best-practices/backend-performance/content/request-throttling.md
new file mode 100644
index 000000000..5335574c1
--- /dev/null
+++ b/src/data/best-practices/backend-performance/content/request-throttling.md
@@ -0,0 +1,3 @@
+# Implementing Request Throttling and Rate Limiting
+
+In the context of backend performance, implementing request throttling and rate limiting acts as a defensive mechanism against system overload. These practices help in managing the flow of incoming requests to a level that the system can handle comfortably, thereby improving responsiveness and reliability. For instance, during a high traffic spike, uncontrolled, simultaneous requests might exhaust system resources leading to service disruption. However, with request throttling and rate limiting, you can control this traffic ensuring a steady performance. Furthermore, it also provides a layer of security by thwarting potential DDoS attacks which aim to flood the system with requests leading to a system crash.
\ No newline at end of file
diff --git a/src/data/best-practices/backend-performance/content/scaling-strategies.md b/src/data/best-practices/backend-performance/content/scaling-strategies.md
new file mode 100644
index 000000000..bdac78bd3
--- /dev/null
+++ b/src/data/best-practices/backend-performance/content/scaling-strategies.md
@@ -0,0 +1,3 @@
+# Proper Implementation of Horizontal or Vertical Scaling
+
+An optimal backend performance in web applications relies heavily on implementing the right type of scaling, whether horizontal or vertical. In vertical scaling, additional resources are added to increase the capacity of an existing machine. It helps in the short run by quickly accommodating an increased load, but may be limited by the maximum capacity of individual servers. In contrast, horizontal scaling provides longer-term scalability by adding more machines to the existing pool. This improves the redundancy and reliability of the application and can handle significantly larger loads without relying on high-spec servers. A careful balance or judicious use of both can drastically improve backend performance. For example, a sudden surge in website traffic can be swiftly managed with vertical scaling while consistent long-term growth can be accommodated with horizontal scaling. Therefore, the decision of using horizontal or vertical scaling is pivotal in determining backend performance.
\ No newline at end of file
diff --git a/src/data/best-practices/backend-performance/content/select-star.md b/src/data/best-practices/backend-performance/content/select-star.md
new file mode 100644
index 000000000..44e5e33d8
--- /dev/null
+++ b/src/data/best-practices/backend-performance/content/select-star.md
@@ -0,0 +1,3 @@
+# Data Optimization: Avoid Select * Queries and Fetch Only Required Columns
+
+Efficiency in the backend of web applications can be significantly improved by careful data queries. By avoiding the use of "Select *" queries, and instead only fetching the necessary columns, you reduce the load and strain on the database. This can not only accelerate the response time, but also reduces the storage usage, thereby improving the overall performance. To illustrate, consider a large database with hundreds of columns; using "Select *" would fetch all that data unnecessarily when you might only need data from three or four columns. This smart selection contributes immensely to a more optimal backend performance.
\ No newline at end of file
diff --git a/src/data/best-practices/backend-performance/content/similar-requests.md b/src/data/best-practices/backend-performance/content/similar-requests.md
new file mode 100644
index 000000000..9db45d6eb
--- /dev/null
+++ b/src/data/best-practices/backend-performance/content/similar-requests.md
@@ -0,0 +1,3 @@
+# Minimizing Overhead Through Batch Processing
+
+The capacity of a web application's backend to process large volumes of data promptly and efficiently plays a crucial role in its performance. Grouping similar requests together in a batch, rather than processing them individually, considerably reduces data transfer overhead. This is because it minimizes the number of round trips, or interactions between the client and server to obtain a response. For instance, in an e-commerce application, instead of retrieving each product detail individually, batching gathers all product details in a single request, which enhances response times and overall performance.
\ No newline at end of file
diff --git a/src/data/best-practices/backend-performance/content/slow-logging.md b/src/data/best-practices/backend-performance/content/slow-logging.md
new file mode 100644
index 000000000..ca2647927
--- /dev/null
+++ b/src/data/best-practices/backend-performance/content/slow-logging.md
@@ -0,0 +1,3 @@
+# Slow-Query Logging and Regular Monitoring
+
+Keeping tabs on slow-query logging is vital for backend performance since it can help in identifying inefficient queries that may drag down the server's productivity. For instance, a slow query might be taking an exceptionally long time to navigate through a large database, causing delays in information retrieval. By enabling slow-query logging, such ineffective queries can be spotted and optimized or reworked to minimize their run-time. Thus, it aids in maintaining smooth and efficient server operation while enhancing the application's overall performance. Continuous monitoring of these logs can also point out recurring issues that need addressing, making it an indispensable tool for optimizing backend performance.
\ No newline at end of file
diff --git a/src/data/best-practices/backend-performance/content/streaming-large.md b/src/data/best-practices/backend-performance/content/streaming-large.md
new file mode 100644
index 000000000..e2dcbbe22
--- /dev/null
+++ b/src/data/best-practices/backend-performance/content/streaming-large.md
@@ -0,0 +1,3 @@
+# Streaming of Large Requests/Responses
+
+In web application backend performance, the implementation of streaming large requests and responses is essential to maximize efficiency and speed. This is because streaming, unlike traditional methods, doesn't require the entire file to load before it can be accessed. This means that large data pieces are broken down into more manageable, smaller chunks which are then processed separately. Streaming minimizes memory usage, prevents potential timeouts, and reduces the latency between the client and server. For instance, when streaming a video, the user doesn't have to wait for the full video to buffer, hence enhancing user experience by delivering content faster and more seamlessly.
\ No newline at end of file
diff --git a/src/data/best-practices/backend-performance/content/unnecessary-computation.md b/src/data/best-practices/backend-performance/content/unnecessary-computation.md
new file mode 100644
index 000000000..e967743d2
--- /dev/null
+++ b/src/data/best-practices/backend-performance/content/unnecessary-computation.md
@@ -0,0 +1,3 @@
+# Minimising Unnecessary Processing or Expensive Computation on the Server
+
+Efficient backend performance in web applications is often determined by how well unnecessary processing or expensive computations are minimised on the server. When an application is free of excess processing or complex computations, it expends less energy, executes tasks swiftly, and reduces any potential downtime. This remarkably improves the application's response time to user requests. For example, instead of calculating the same data repeatedly for different users, the application can calculate once, store the result, and then provide this stored result upon user request. This essentially minimises unnecessary processes, thereby enhancing the web application's backend performance.
\ No newline at end of file
diff --git a/src/data/best-practices/backend-performance/content/up-to-date.md b/src/data/best-practices/backend-performance/content/up-to-date.md
new file mode 100644
index 000000000..fa959e48b
--- /dev/null
+++ b/src/data/best-practices/backend-performance/content/up-to-date.md
@@ -0,0 +1,3 @@
+# Maintaining Updated Dependencies
+
+Keeping your dependencies up to date is crucial for optimizing backend performance in web applications. Regular updates bring new features, improvements, and important patches for security vulnerabilities that could harm the performance and security of your application. An outdated package, for example, may run inefficiently or even prevent other components from functioning at peak performance. This creates a ripple effect that could slow down or disrupt entire processes. Therefore, staying current with all updates enhances the robustness and operational efficiency, contributing to faster load times, better stability, and ultimately, an improved user experience.
\ No newline at end of file
diff --git a/src/data/best-practices/backend-performance/content/use-db-sharding.md b/src/data/best-practices/backend-performance/content/use-db-sharding.md
new file mode 100644
index 000000000..82a1b9c73
--- /dev/null
+++ b/src/data/best-practices/backend-performance/content/use-db-sharding.md
@@ -0,0 +1,3 @@
+# Database Sharding for Data Distribution
+
+When it comes to backend performance, the effectiveness of data management is critical. Here lies the value of database sharding, a type of database partitioning that separates very large databases into smaller, faster, more easily managed parts called data shards. Sharding can enhance the speed of data retrieval by spreading the load across multiple servers, thereby reducing bottlenecks and improving overall application responsiveness. For instance, in an e-commerce application with a worldwide customer base, data can be sharded on a geographical basis to ensure faster loading times for consumers, no matter where they are located. This improves user experience and ensures smooth operation on the backend side.
\ No newline at end of file
diff --git a/src/data/best-practices/backend-performance/content/utilize-caching.md b/src/data/best-practices/backend-performance/content/utilize-caching.md
new file mode 100644
index 000000000..b76f438e4
--- /dev/null
+++ b/src/data/best-practices/backend-performance/content/utilize-caching.md
@@ -0,0 +1,3 @@
+# Utilizing Caching Mechanisms
+
+Backend performance of web applications can see substantial improvements when effective caching mechanisms, like HTTP, server/client, and CDN are properly implemented. Caching can significantly decrease the load on the server, minimising the effort necessary to generate a response to a user's request. For example, when a user revisits a previously accessed web page, caching mechanisms retrieve stored information more swiftly than the server could generate it. This process effectively cuts down on latency, bandwidth usage and processing power, speeding up the loading times and contributing to smoother user experience. CDN-based caches also help in serving static resources to users from the nearest possible location, reducing network latency.
\ No newline at end of file
diff --git a/src/data/guides/asymptotic-notation.md b/src/data/guides/asymptotic-notation.md
index 4690e94fa..b7db091bb 100644
--- a/src/data/guides/asymptotic-notation.md
+++ b/src/data/guides/asymptotic-notation.md
@@ -1,10 +1,7 @@
---
title: 'Asymptotic Notation'
description: 'Learn the basics of measuring the time and space complexity of algorithms'
-author:
- name: 'Kamran Ahmed'
- url: 'https://twitter.com/kamrify'
- imageUrl: '/authors/kamranahmedse.jpeg'
+authorId: 'kamran'
seo:
title: 'Asymptotic Notation - roadmap.sh'
description: 'Learn the basics of measuring the time and space complexity of algorithms'
diff --git a/src/data/guides/avoid-render-blocking-javascript-with-async-defer.md b/src/data/guides/avoid-render-blocking-javascript-with-async-defer.md
index 7718502f8..23852c97d 100644
--- a/src/data/guides/avoid-render-blocking-javascript-with-async-defer.md
+++ b/src/data/guides/avoid-render-blocking-javascript-with-async-defer.md
@@ -1,10 +1,7 @@
---
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/kamrify'
- imageUrl: '/authors/kamranahmedse.jpeg'
+authorId: 'kamran'
seo:
title: 'Async and Defer Script Loading - roadmap.sh'
description: 'Learn how to avoid render blocking JavaScript using async and defer scripts.'
diff --git a/src/data/guides/backend-developer-skills.md b/src/data/guides/backend-developer-skills.md
new file mode 100644
index 000000000..a68bfa7b4
--- /dev/null
+++ b/src/data/guides/backend-developer-skills.md
@@ -0,0 +1,270 @@
+---
+title: '8 In-Demand Backend Developer Skills to Master'
+description: 'Learn what the essential backend skills you should master to advance in your career.'
+authorId: fernando
+excludedBySlug: '/backend/developer-skills'
+seo:
+ title: '8 In-Demand Backend Developer Skills to Master'
+ description: 'Learn what the essential backend developer skills are that you should learn and master to advance in your career.'
+isNew: false
+type: 'textual'
+date: 2024-02-27
+sitemap:
+ priority: 0.7
+ changefreq: 'weekly'
+tags:
+ - 'guide'
+ - 'textual-guide'
+ - 'guide-sitemap'
+---
+
+Whether your goal is to become a backend developer or to stay relevant as one, the goal itself requires adopting an eternal student mindset. The ever-evolving web development space demands continuous learning, regardless of the programming language you use. New frameworks, libraries, and methodologies emerge regularly, offering different solutions to old problems. To remain relevant as a [backend developer](/backend), you’ll have to stay updated by honing your core skills.
+
+In this article, we’ll cover the following set of backend developer skills we recommend you aim for:
+
+- Keeping an eye on core and new backend programming languages
+- Understanding the basics of software design and architecture
+- Understanding databases and how to use them
+- API development
+- The basics of version control
+- Testing and debugging
+- CI/CD and DevOps fundamentals
+- Soft skills
+
+So, let's get going!
+
+## Understanding Backend Development
+
+Before we move on and start discussing the different backend development skills you should focus on, let’s first understand what a backend developer is. After all, if you’re looking to actually become a backend developer, you’ll need this.
+
+A backend developer focuses entirely on writing business logic for an application and much of the supporting logic as well.
+
+That said, there might be applications where the business logic is split into the frontend and the backend. However, while the frontend dev might have to share their time between UI code and business logic, the backend dev will focus most of their time on core business logic. That’s the main difference between the two.
+
+![UI vs Backend](https://assets.roadmap.sh/guest/6529303b545cb53d4aa730ca_1709056806118.png)
+
+In the above image, you can see how there is a lot more behind the curtain than just the UI when it comes to web applications. In this case, a “simple” log-in form needs a backend to contain its core business logic.
+
+Let’s now look at the most in-demand backend developer skills you should focus on in backend development.
+
+## Proficiency in Core and Emerging Programming Languages
+
+One of the most basic skills you should focus on as a backend developer is on identifying key programming languages to learn (or at least keep an eye out for).
+
+There are some essential backend languages that the industry has adopted as de facto standards. This means most new projects are usually coded using one (or multiple) of these programming languages.
+
+![core-languages](https://assets.roadmap.sh/guest/6529303b545cb53d4aa730ca_1709058292005.png)
+
+The most common names you should look out for are:
+
+- **JavaScript (or any of its variants, such as TypeScript).** This is a very common option because it’s also the language used by frontend developers, thus making it easier for developers to work on both sides of the same project.
+- **Python.** While a very common option for other types of projects (such as data processing and [data science](https://roadmap.sh/ai-data-scientist)), it’s still very popular in the web development world. Python has many good qualities and supporting frameworks that make it a very easy-to-pick-up option for coding backend systems.
+- **Go (A.K.A Golang).** This programming language was developed by Google. It was designed with simplicity, efficiency, and concurrency in mind. That’s made it gain popularity in the backend development space, making it an interesting option for projects that prioritize performance and concurrency.
+- **Java.** One of the most common alternatives for enterprise solutions, Java, has been constantly evolving since its first release back in 1995. All that time making its way into big enterprises that trust its robustness and ever-growing community of developers. While not the easiest language to learn, it’s definitely up there in the top 10 most popular [backend languages](https://roadmap.sh/backend/languages) (according to [StackOverflow’s 2023 Developer survey](https://survey.stackoverflow.co/2023/#technology-most-popular-technologies)).
+
+While there are other options, the ones mentioned above, from the backend point of view, are some of the most relevant languages to pay attention to. Here are the top 10 most popular ones amongst professional developers (screenshot taken from SO’s survey of 2023):
+
+![Stackoverflow Survey Result](https://assets.roadmap.sh/guest/6529303b545cb53d4aa730ca_1709057007054.png)
+
+### Keeping an eye on the rising stars
+
+If working with at least one of the most common backend languages was important, understanding what are the rising technologies in the backend world is just as crucial.
+
+You won’t see a new programming language being released every month. However, in the span of a few years, you might see the release of several, and out of those, some might stick long enough to become new standards.
+
+For example, take a look at the period between 2012 and 2015; in just 3 years, 9 programming languages were released, out of which most of them are being used to this day.
+
+![Famous Languages](https://assets.roadmap.sh/guest/6529303b545cb53d4aa730ca_1709058257292.png)
+
+- In 2012, we got Julia, Elm, Go, and TypeScript.
+- In 2013, we got Dart
+- In 2014, we got Swift, Hack, and Crystal
+- And in 2015, we got Rust.
+
+Some of those languages are very relevant to this day, such as TypeScript and Rust, while others, such as Hack and Crystal, might be known to only a few in very niche sectors.
+
+Of course, it’s impossible to predict which programming language will become a standard. However, the skill that you need to hone is that of keeping an eye on the industry to spot new and emerging trends.
+
+### The importance of supporting frameworks
+
+Frameworks for a specific programming language do change a lot faster than the language itself, though.
+
+Frameworks are there to provide you with a simplified gateway into the functionalities that you’d normally need for common tasks. For example, in the context of backend web development, frameworks usually take care of:
+
+- **Parsing HTTP requests** and turning them into objects you can easily interact with (so you don’t have to learn how the HTTP protocol works).
+- **Abstracting concepts,** such as a request or a response, into objects and functions that you can reason about at a higher level. This gives you an easier time thinking about how to solve a problem using these tools.
+- **Accessing data becomes a lot easier when there are abstractions.** Some frameworks provide what is known as an ORM (Object Relational Mapping). Through ORM, you can interact with databases without having to think about writing SQL queries or even database schemas.
+- And many more.
+
+Frameworks are an essential aspect of the work you’ll do as a backend developer, which is why you should not neglect them. Of course, learning and mastering every single framework out there is impossible. Instead, learn to keep an eye out in the industry and see what are the most common frameworks, and focus on one (or two) of them.
+
+## Software Design and Architecture
+
+Coding is not just about writing code.
+
+While that statement might be a bit confusing, the truth is there is a lot of architecture involved in software development (both in frontend and backend development). Sometimes, working on these aspects of a system is the job of a specific role called “architect.” However, for backend systems, it’s not uncommon for backend developers to also be involved in architecture conversations and decisions. You’re helping design the underlying backend infrastructure, after all.
+
+The following diagram shows an example of what a very simple system’s architecture might look like:
+
+![Simple System Architecture](https://assets.roadmap.sh/guest/6529303b545cb53d4aa730ca_1709057266440.png)
+
+While the example is oversimplified, it gives you an idea of what the practice of “architecting a system” is.
+
+Essentially, architecting a system means coming up with concepts that represent different aspects of the solution and then deciding how you want to make them interact with each other.
+
+Why is architecture so important here? Because it gives you properties such as code encapsulation, separation of concerns, reusability, and even scalability as a byproduct of the architecture itself.
+
+Let’s take a quick look at some of the most common architectures used for creating backend systems.
+
+### Most common backend architectures
+
+There are too many different architectural styles and patterns to cover them all inside a single article, but let's just look at some of the most common ones and how they can help you while working on your backend system.
+
+- **Monolithic architecture:** In a monolithic architecture, the entire application is built as a single, tightly coupled unit. All components (frontend, backend, database, etc) are part of the same codebase. This is a great first architecture because it feels very natural to develop under, and if your project is not going to grow out of proportion, then you will probably not hit any of the cons.
+- **Microservice-based architecture:** The application is divided into small, independent services, each responsible for a specific business capability. These services communicate through APIs.
+- **Service-Oriented Architecture:** Similar to microservices, a service-oriented architecture splits functionality into individual services. The main difference is that these services aren’t as granular as a microservice, so they might incorporate functionalities related to different business entities.
+- **Event-driven architecture:** With this architecture, each system (or service) responds to events (e.g., user actions and messages from other services) by triggering actions or processes. All services communicate with each other indirectly through an event bus (also known as a “message bus”), so it removes the possibility of having two or more services coupled with each other (meaning that they can’t be treated individually).
+- **Serverless Architecture:** Also known as Function as a Service (FaaS), serverless architecture allows you to focus on writing code without worrying about the server where they’ll run. Functions are executed in response to events without the need for provisioning or managing servers (this is done FOR you automatically).
+- **Microkernel architecture:** This architecture lets you build the core, essential functionality into a small microkernel and have the rest of the features built as plugins that can be added, removed or exchanged easily.
+
+And if you want to know more about the patterns and principles mentioned here, please check out the [Software Design and Architecture roadmap](https://roadmap.sh/software-design-architecture).
+
+## Mastery of Database Management Systems
+
+As a backend developer, you will undoubtedly have to deal with database administration in your daily tasks. They are the industry standard for storing persistent data.
+
+Because of that, it’s important to understand that you should be aware of two main categories of databases: SQL databases and NoSQL databases.
+
+### SQL databases
+
+These are the standard structured databases (A.K.A relational databases) where you need to define the schema for your data (essentially the data structures you’re dealing with), and then you’ll use a language called [SQL (Structured Query Language)](https://roadmap.sh/sql) to interact with the data inside it. Most backend developers will interact with SQL databases at some point in their career, as this is the most common type of database.
+
+### NoSQL databases
+
+As the name implies, these are not your standard SQL databases; in fact, within this category, there are columnar databases, document-based ones (such as MongoDB), key-value-based ones (like Redis), and more. They don’t use predefined data structures, giving you more flexibility and control over what you can store and how you store it. Backend developers will deal with only a handful of these, as there are many different sub-types, and more are created every year.
+
+Some examples of these databases are:
+
+- MongoDB, a document-based database (see here a mongoDB roadmap if you’re interested).
+- Redis, an in-memory key-value pair database.
+- Neo4J, a graph database.
+- ElasticSearch, a document-based search engine.
+
+In the end, the decision between SQL and NoSQL is about trade-offs and figuring out what works best for your particular use case.
+
+## API Development Capabilities
+
+Application Programming Interfaces (APIs) are everywhere. They power the backend of almost all major systems out there (according to a [study conducted by O’Reilly in 2020](https://www.oreilly.com/pub/pr/3307), 77% of companies were using microservices/APIs).
+
+That is to say, if you’re thinking about becoming a backend developer, you will be coding APIs/microservices. This is why understanding the basics of them is crucial to ensuring your relevance in the field.
+
+![System vs External System](https://assets.roadmap.sh/guest/6529303b545cb53d4aa730ca_1709057608824.png)
+
+The above diagram explains how APIs interact with whatever you might be building.
+
+Now, if you’re inside the “**The System**” box, then you need to understand how to interact with these APIs using the right tools. If you’re inside the “**External System**” box, then you need to understand the type of standards these APIs need to follow and how to implement them.
+
+Don’t worry though, for both situations, there are always frameworks and libraries you can use to simplify your task and ensure you’re following the proper industry standards.
+
+### What are the most common API types?
+
+The most common types of APIs used in the industry currently are REST and GraphQL.
+
+As a backend developer, it’s not mandatory that you master both of these types, but it’s definitely recommended that you have some practical experience with one of them.
+
+- **RESTful APIs.** These are APIs that work over HTTP and make extensive use of the HTTP Verbs to give meaning to each request. They’ve been the most popular type of API until recently, so there are still a lot of projects and teams that make use of it.
+- **GraphQL.** GraphQL APIs operate over HTTP as well, leveraging the HTTP protocol and its verbs. In contrast to the conventional RESTful APIs, GraphQL has emerged as a powerful alternative, offering a flexible and efficient approach to data querying and manipulation. GraphQL allows clients to request only the data they need, providing a more tailored and efficient interaction between clients and servers.
+
+Is there one better than the other? There is no easy way to answer that question as both are capable of doing everything you’d need. It’s more about your particular requirements and the preferences of your dev team.
+
+## Version Control Savvy
+
+One mandatory skill that all backend developers should work on (actually, all developers, in general) is version control, or in other words, understanding and being familiar with version control systems.
+
+Essentially, you’ll want to know how to use the version control tool that everyone else is using. The industry standard at the moment of writing this is [Git](https://git-scm.com/), while there might be some teams using other (older) tools, as long as you understand the current one, you’ll be in good shape.
+
+### What is version control?
+
+Version control references the ability for you and other developers to share code with each other while you’re working on the same files.
+
+While Git is the industry standard at the moment, GitHub has created such a popular platform around Git, that it almost makes it mandatory to learn about.
+
+So go ahead and create an account, browse what others are doing, and upload your own personal projects. It’s definitely a great way to learn.
+
+### What should you learn about Git?
+
+If you’re picking up Git as your version control system of choice, there are two main areas you should be focusing on.
+
+- **The basics.** Clearly understanding how Git works and the basic commands to add, push and pull changes. You should aim to learn enough about them to feel comfortable using them on your day-to-day (because you will).
+- **Branching strategies.** Sadly, using Git alone is not enough. While through Git you can already start versioning your code, when the project is complex enough and your team big enough, the tool alone will not be enough. You’ll have to come up with [branching strategies](https://learngitbranching.js.org/?locale=es_ES) to organize the whole team’s workflow.
+
+Keep in mind that Git and Git branching are not trivial topics, and they’ll take a while to master. So, while you should give yourself time to learn about them, also make sure you check with others (or use tools such as ChatGPT) to validate your commands before using them. Remember, a wrong Git command or a wrong workflow can cause major problems within a project, especially if there are many developers working on the same codebase.
+
+## Testing
+
+Understanding both what testing is and the importance of it within the backend development workflow is crucial for all developers, and one of the mandatory backend developer skills to focus on.
+
+Testing is the development process of making sure your code works in a way that doesn’t involve you manually testing every feature but rather using tools that allow you to test and reproduce any problems that can be found programmatically.
+
+This, of course, helps to remove potential human error from the equation when testing big systems and to increase the speed at which these tests can be done (think seconds vs hours of you doing it manually).
+
+Testing is a far more complex discipline than I can describe here. Just know that there are many different ways to test a system, and all backend developers should be aware of the following:
+
+- **Unit testing:** This is the most common way of doing code testing. You’ll write tests using a testing framework for every publicly available function/method in your code. This way you’re making sure every piece of code that can be used is tested and performs according to plan. Running these tests is usually quite fast, so you’ll be doing it before every commit (usually).
+- **Integration testing:** If you’re building a system that consists of multiple independent systems working together (think, for instance, a microservice-based architecture), then testing each individual part is not enough. You also have to make sure systems that should interact with each other do so correctly. This is where integration tests come into play.
+- **End-to-end testing (E2E):** These tests are similar to integration tests, but they also include the UI of the system. There are tools you can use to automate actions in your UI as if a real user were performing them and then checking the result. For example, clicking on a log-out button and checking if you’re later redirected to the log-in screen. This flow would involve the backend performing some actions that result in the user being logged out.
+- **Load testing:** While not exactly the same process as with the previous test types, load testing is great for backend systems because it helps you determine if your backend is ready to deal with high amounts of traffic.
+
+You can think of the list in graphical format as the following diagram:
+
+![Testing types](https://assets.roadmap.sh/guest/6529303b545cb53d4aa730ca_1709057834295.png)
+
+If you’re just getting started with testing, I’d recommend focusing only on unit testing for the time being. Once you have a grasp on it, start moving out following the above diagram and slowly move into the other types as you progress.
+
+## CI/CD and DevOps Familiarity
+
+As a backend developer, your code will be constantly deployed, either into cloud environments or perhaps even into normal, on-premise servers. The point is that what you build will run through CI/CD (Continuous Integration and Continuous Deployment) processes.
+
+![ci-cd](https://assets.roadmap.sh/guest/6529303b545cb53d4aa730ca_1709058122541.png)
+
+These processes will automatically test it (Continuous Integration) and automatically deploy it (if all tests go well). As a backend developer, you’re not usually expected to know and understand how to configure these processes; however, it’s important that you know about them.
+
+DevOps is yet another tangential area to that of a backend developer. When teams are small enough, backend devs might be “gently pushed” into tasks such as configuring CI/CD pipelines, setting up servers, and more. These tasks are usually performed by dedicated professionals with the role of DevOps. Their specialty is automation, making the deployment process efficient and ensuring that everything runs smoothly in the real-world server environment. They play a crucial role in maintaining the reliability and performance of applications and websites.
+
+So, while they’re not strictly the responsibilities of backend developers, they’re close enough to the role’s day-to-day that it would be a good idea to learn about them. If you’re interested in learning more about DevOps, check out [our DevOps roadmap](https://roadmap.sh/devops) containing all the key topics you should learn about if you want to become a DevOps engineer.
+
+## Soft Skills
+
+Finally, the last set of backend developer skills you should focus on are, actually, not technical skills, nor are they exclusively useful for backend developers. These are skills that every developer should work on during their career: soft skills.
+
+### Improving communication
+
+The ability to communicate with others, both technical and non-technical people, is crucial in any developer's career.
+
+For backend developers, it’s especially important because communicating their work and the effects of it is definitely harder than other roles, such as frontend developers who can actually showcase what they’re building.
+
+As a backend developer, you’ll be able to better explain problems or blockers to your colleagues, you’ll be able to perform requirement gathering much more effectively, and you’ll even improve your own problem-solving skills by being better at articulating the problems and potential solutions to yourself.
+
+### Critical thinking
+
+Honing your critical thinking as a backend developer will help your ability to analyze complex problems, identify patterns much faster, and come up with innovative solutions to the problems you’re facing.
+
+Pushing the limits of your critical thinking skills will also foster a more systematic and strategic approach to coding and architecting robust and efficient solutions.
+
+In other words, it’ll make you a better and more efficient coder. And who doesn’t want that?
+
+## Conclusion
+
+To summarize, if you expect to become a backend developer or to grow in the area of backend development:
+
+- Keep an eye on the industry to understand what’s the status quo and what’s new and hot.
+- Understand the basics of software design and architecture.
+- Look into relational databases and NoSQL databases as well; they’re both important.
+- Learn how to build and use APIs; they’ll be part of almost every project you work on.
+- Remember, testing might look like it’s not mandatory, but it’s definitely a standard practice when it comes to backend development.
+- CI/CD and DevOps are practices you’ll be involved with, either directly or indirectly, so learn about them.
+- Soft skills are just as important as technical skills if you expect to grow in your career.
+
+That said, do not take this list as the ultimate roadmap but rather as a starting point. If you’re willing to take your backend developer career to the next level, push yourself out of your comfort zone and pursue the skills listed here and the ones listed in this detailed [backend development roadmap](https://roadmap.sh/backend).
+
+Remember, constant learning is the only absolute truth in the software development world (this is true for backend developers, too). If you keep your skillset updated with the latest trends, you’ll remain adaptable and effective as a backend developer.
diff --git a/src/data/guides/backend-developer-tools.md b/src/data/guides/backend-developer-tools.md
new file mode 100644
index 000000000..10bf3f77c
--- /dev/null
+++ b/src/data/guides/backend-developer-tools.md
@@ -0,0 +1,393 @@
+---
+title: '25 Essential Backend Development Tools for 2024'
+description: 'Elevate your development process with these 25 essential backend developer tools.'
+authorId: fernando
+excludedBySlug: '/backend/developer-tools'
+seo:
+ title: '25 Essential Backend Development Tools for 2024'
+ description: 'Elevate your coding with backend developer tools that bring efficiency, scalability, and innovation to your projects. Improve your development process today!'
+isNew: true
+type: 'textual'
+date: 2024-03-19
+sitemap:
+ priority: 0.7
+ changefreq: 'weekly'
+tags:
+ - 'guide'
+ - 'textual-guide'
+ - 'guide-sitemap'
+---
+
+
+As developers, we’re not just writing code on a text editor without any other external help. Whether we realize it or not, we’re constantly using different development tools to improve the way we work and the speed at which we can deliver our code.
+
+In this article, we’ll cover 25 backend development tools that are crucial in the web development industry, and as a [backend developer](/backend), you should be aware of them.
+
+The categories we’ll tackle are:
+
+- IDEs and Editors
+- Database Tools
+- Collaboration
+- Hosting Services
+- API-Related Tools
+- Productivity
+
+So let’s get started!
+
+## Beyond programming languages: IDEs and Editors
+
+Other than the actual programming languages, the Integrated Development Environment (A.K.A your IDE) is the single most important tool you’ll have to pick and use throughout your career in software development.
+
+Some of them are generic (as in, they work for all types of development), and others will have specific backend development tools (which is what we’re focusing on right now).
+
+Let’s see some examples that are great for a web development project.
+
+### 1. Jetbrains Products
+
+The [Jetbrains family](https://www.jetbrains.com/) of IDEs targets multiple programming languages, including JavaScript, .NET, JAVA (and the Java Virtual Machine), Python, PHP, and more (mostly great options for web development).
+
+![Jetbrains](https://assets.roadmap.sh/guest/6529303b545cb53d4aa730ca_1710849700950.png)
+
+The benefit of using these IDEs, in comparison with others, is that given how they’re language/technology specific, they have tools designed for those programming languages and specifically for this list to help in your backend development tasks, such as:
+
+- Debuggers.
+- Improved IntelliSense.
+- Improved development environment.
+
+The only minor issue with these IDEs, especially when compared to the rest of the options listed here, is that they’re not all free. While not all of them are priced the same, I recommend you check out your IDE’s pricing page to understand what options you have (there are free plans if you qualify for them).
+
+### 2. Visual Studio Code
+
+[VSCode](https://code.visualstudio.com/) is definitely one of the most popular alternatives these days for all types of web developers, but definitely for backend developers. This IDE’s strongest selling point is that it’s incredibly extensible through plugins. And the community using it is so big and varied that there are plugins for literally anything you need.
+
+![VSCode](https://assets.roadmap.sh/guest/6529303b545cb53d4aa730ca_1710849510314.png)
+
+The other major benefit of VSCode over JetBrains products is that it gives developers a fully working IDE for FREE. While some of the extensions don’t provide exactly the same developer experience as a JetBrains IDE, the proper combination of extensions can provide a very close alternative through VSCode.
+
+### 3. Zed
+
+[Zed](https://zed.dev/) is a different type of code editor, and because of that, it might just be the right one for you.
+
+![Zed](https://assets.roadmap.sh/guest/6529303b545cb53d4aa730ca_1710849771500.png)
+
+Zed, like VSCode, is an all-purpose code editor, letting you code in whatever language you want (whether you’re doing web development or not). The main reasons why you’d pick Zed over others are:
+
+- **Improved performance.** Zed takes advantage of your CPU AND GPU to improve the speed at which the IDE responds to your commands.
+- **Multi-user support.**
+- **Team features.** Zed lets you build software while working with others by sharing notes and letting you interact with teammates through the IDE.
+
+Zed is an [open-source project](https://github.com/zed-industries/zed), but at the time of writing this article, it’s only available for macOS, so Linux and Windows users are still unable to try this excellent option.
+
+### 4. Sublime Text
+
+Before VSCode, [Sublime Text](https://www.sublimetext.com/) was probably one of the most popular code editors for web developers who wanted something powerful for free.
+
+Just like VSCode, Sublime supports extensibility through plugins, and the rich ecosystem of plugins makes it quite a versatile editor. As a note, this code editor also supports GPU rendering of the UI, like Zed does, so if performance is important to you, then you’ll want to keep reading.
+
+![Sublime](https://assets.roadmap.sh/guest/6529303b545cb53d4aa730ca_1710849579321.png)
+
+With a refreshed UI (if you’ve used Sublime Text in the past, you’ll be happily surprised!) and better internal tooling, the latest version of this editor (version 4) is trying to regain the portion of the market that VSCode took from it at the time.
+
+### 5. VIM - a developer-focused editor
+
+[VIM](https://www.vim.org/) is a tool that you either hate or love as a developer, but there is no middle ground.
+
+This is such an iconic text editor that all the previously mentioned IDE have what is called a “vim mode,” which allows you to use them as if you were using VIM (with the visual and input modes).
+
+![Vim](https://assets.roadmap.sh/guest/6529303b545cb53d4aa730ca_1710849488670.png)
+
+Vim lets you write code without having to move your fingers away from the home row (the row where you “rest” your fingers, the one with the F and G keys). That means you can navigate documents, write code, move through projects, and more, all with minimum hand movement.
+
+This is the key philosophy behind Vim’s design, and if you embrace it, it should help to make you a very proficient developer. Of course, adapting to this way of working is not trivial, and there is a lot of muscle memory that has to be re-trained. But once you do it, it’s really hard to go back.
+
+Just like with all the generic IDEs here, you’ll have to [customize it through “scripts”](https://www.vim.org/scripts/script_search_results.php?order_by=creation_date&direction=descending) to make it work exactly as you want for your environment.
+
+## Database Tools
+
+While doing backend development, you will definitely be interacting with databases. They’re a ubiquitous backend tool in the realm of web development.
+
+Let’s take a look at some great database tools you can use as a backend developer to interact with your favorite database management systems (DBMS).
+
+### 6. DataGrip
+
+[Datagrip](https://www.jetbrains.com/datagrip/) is a JetBrains product, which makes it a great option if you’re also going with a JetBrains IDE.
+
+This tool lets you access all SQL databases from within the same user interface, it provides great help while browsing the data stored in the database, and it also has features that help you write better SQL queries.
+
+![DataGrip](https://assets.roadmap.sh/guest/6529303b545cb53d4aa730ca_1710849834698.png)
+
+While the pricing of these tools might be a bit steep (especially if you go with the IDE as well), it’s definitely a solid option if you’re looking for feature-rich and stable software development tools.
+
+### 7. Navicat
+
+[Navicat](https://navicat.com/en/products) actually has a family of alternatives based on what you need, from the standard set of SQL databases (such as MySQL, Oracle, Postgre, and so on) up to other NoSQL databases such as MongoDB and Redis.
+
+In general, the Navicat alternatives are quite lightweight and powerful to use. They might not be as feature-rich as Datagrip, but they let you easily browse and query the data you need.
+
+![Navicat](https://assets.roadmap.sh/guest/6529303b545cb53d4aa730ca_1710849810856.png)
+
+The free trial for Navicat only lasts 14 days, and then you’ll have to pay a monthly fee. That said, for non-commercial use, the license is quite low, which makes it accessible to almost all developers.
+
+As for features, it has all the ones you’d expect from a tool like this:
+
+- Ability to connect to multiple databases and visually browse their content.
+- Query editor with some IntelliSense built-in.
+- Model representation (automatically converts a database into ER Diagrams).
+- Simple object designer to create entities through a visual IDE.
+
+The Navicat series of apps are great backend tools to have at your disposal, if you don’t mind their price, that is.
+
+### 8. TablePlus
+
+[Tableplus](https://tableplus.com/) is very similar to Navicat in the sense that it’s another lightweight database manager. The main differences are:
+
+- Tableplus only supports SQL-based databases.
+- The pricing model is simpler, by only charging a one-time license without you having to commit to a monthly subscription.
+
+![TablePlus](https://assets.roadmap.sh/guest/6529303b545cb53d4aa730ca_1710849788403.png)
+
+Some of the most relevant features of Tableplus are:
+
+- Inline data editing.
+- Advanced filtering lets you combine different filtering conditions when searching.
+- Code auto-complete, which comes in very handy when writing SQL queries.
+- Extensible through JavaScript plugins (currently in Beta).
+
+This is a solid backend tool alternative to any of the previous options and with a simpler price tag.
+
+### 9. DBeaver
+
+[DBeaver](https://dbeaver.io/) is a free, cross-platform tool that lets you connect and interact with multiple databases. While there is a PRO version with extra features, the free version is more than powerful enough to get you started with almost any database you can think of, both SQL and NoSQL alike.
+
+For a full list of supported databases on the free version, check out their [about page](https://dbeaver.io/about/).
+
+![DBeaver Demo](https://assets.roadmap.sh/guest/6529303b545cb53d4aa730ca_1710849342173.png)
+
+Some of the major features of DBeaver are:
+
+- SQL editor with completion.
+- ER-diagram creation from a table definition.
+- In-line data editing.
+
+Task management to kill any long-lasting queries that block your database.
+
+## Collaboration tools for web development
+
+Unless you’re working as a solo-dev (and even then!), collaboration tools allow you to coordinate your work and understand who’s working on what and what you should be working on next.
+
+While these might not be considered “backend tools” per se, they definitely help improve your performance and organization, so we can still call them “development tools” as a broader term.
+
+### 10. Trello
+
+[Trello](https://trello.com/) is a very simple yet powerful organizational tool that lets teams build a Kanban-like board with clear states and simple UX (drag&drop is king in Trello).
+
+Setting up a new project and a team takes minutes in Trello, and through the plugin system, you can get extra features such as date reminders, calendar integrations, and more.
+
+![Trello](https://assets.roadmap.sh/guest/6529303b545cb53d4aa730ca_1710849443769.png)
+
+The simple UI and intuitive UX make Trello one of the best options out there for collaborative tools as long as the needs of the team are met with simple column-based layouts and minimal information.
+
+### 11. Monday
+
+[Monday](https://monday.com/) is a relatively new online platform for project management and collaboration. I say “new” because some of the other alternatives here have been around for over 5+ years.
+
+Their limited free plan lasts forever, so if you have a small team and limited requirements, this might just be the perfect tool for you. Also, if you actually need to pay, Monday’s plans are accessible, especially when compared to other alternatives.
+
+![Monday](https://assets.roadmap.sh/guest/6529303b545cb53d4aa730ca_1710849749004.png)
+
+Monday’s fully customizable UI lets you build the collaborative environment you need. This is a huge advantage over others who've been around for longer and have a fixed UI that you have to adapt to.
+
+### 12. Basecamp
+
+[Basecamp](https://basecamp.com/) is a mix between Trello, Monday, and Notion in the sense that it tries to provide developers with the best and most relevant tools from those worlds, leaving out the ones that just create “noise.”
+
+![Basecamp](https://assets.roadmap.sh/guest/6529303b545cb53d4aa730ca_1710849933042.png)
+
+Basecamp’s philosophy is to keep things simple and only focus on the features that truly add to collaboration:
+
+- Simple card tables like Trello.
+- Ability to upload and manage documents and files with your team.
+- Integrated chat.
+- Message boards to send notifications to everyone.
+
+The only “downside” to basecamp, if you will, is that there is no “forever free” plan. Both their plans are paid and have a 30-day free trial, so you can definitely give it a shot and figure out if what they offer is enough for your needs.
+
+### 13. Wrike
+
+[Wrike](https://www.wrike.com/) is yet another attempt at making project management and collaboration feel organic and seamless. They have a minimalistic UI and provide you with over 400 integrations to create your own workflows based on your needs and current ecosystem.
+
+They have a free plan that, while feature-limited, it’s perfect for understanding the basic way of using Wrike and how useful it can be to you in your current project.
+
+![Wrike](https://assets.roadmap.sh/guest/6529303b545cb53d4aa730ca_1710849645662.png)
+
+Their innovative use of AI allows you to create content faster, analyze project and task descriptions, and create subtasks based on it.
+
+Wrike feels efficient and powerful, even for its free plan. Give it a chance if you’re a freelancer or if you have a small team looking for something new and powerful.
+
+## Hosting Services
+
+When it comes to backend development, deploying your code and running it on the cloud will be a common thing; this is a practice known as continuous integration and continuous deployment (CI/CD). While in some situations, you’ll be dealing with a custom, in-house infrastructure, there are platforms that will make the entire process very lightweight (as in deploying with a couple of clicks).
+
+Let’s take a look at some of the most common alternatives!
+
+### 14. Railway
+
+[Railway.app](https://railway.app/) aims at giving developers all the tools they need at a click’s distance. We’re talking about:
+
+- PR-triggered deployments.
+- Support for all popular programming languages.
+- Autoscaling.
+- Load balancing.
+- Monitoring.
+- A great uptime (99.95%)
+- With more than 200 ready-made templates for you to get going.
+
+![Railway](https://assets.roadmap.sh/guest/6529303b545cb53d4aa730ca_1710849461849.png)
+
+Railway has no free plan, but their basic one is very accessible. Careful though, they also charge per resource utilization. Lucky for you, they have a [very handy consumption calculator](https://railway.app/pricing) to avoid surprises at the end of the month!
+
+### 15. Heroku
+
+[Heroku](https://www.heroku.com/) is another Platform as a Service provider. This one provides the basic services most of them do, such as autoscaling, monitoring, GitHub integration, and more.
+
+The list of supported programming languages is not huge, but the most common ones are definitely covered: Node.js, Ruby, JAVA, PHP, Python, Go, Scala, and even Clojure.
+
+![Heroku](https://assets.roadmap.sh/guest/6529303b545cb53d4aa730ca_1710849852086.png)
+
+Another great selling point for Heroku is that on top of their infrastructure, they also offer a managed Postgre database as a service and a Redis one. In both situations, you’ll have to pay for the services as you use them, so keep that in mind.
+
+### 16. Digital Ocean
+
+As opposed to platforms such as Heroku, [Digital Ocean](https://www.digitalocean.com/) is known as an Infrastructure as a Service provider (IaaS). They give you all the servers you need and all the resources (memory, CPU, etc) you want to pay for. However, setting up your deployment process, automating your integration tests, or even having all the required libraries to run your code is up to you.
+
+This is by no means something bad, some teams do prefer to have that freedom over other platforms like Railway and Heroku, where everything’s already managed.
+
+![Digital Ocean](https://assets.roadmap.sh/guest/6529303b545cb53d4aa730ca_1710849911479.png)
+
+Large-scale applications will usually require to have custom infrastructure that managed services can hardly provide. This is where IaaS providers come in.
+
+On top of their basic offering, they do offer managed databases such as MongoDB, MySQL, Redis, and others.
+
+### 17. Hetzner
+
+[Hetzner](https://www.hetzner.com/) is yet another IaaS that offers everything you need to get going if you know what to do with it. In other words, they offer all the hardware you might dream of, even in the cloud, but you have to configure it and maintain it.
+
+Their only “managed” offer is for web hosting though, so if you’re looking to host your website or app and you don’t want to have to deal with server maintenance and configuration, then this is a good option for you.
+
+![Hetzner](https://assets.roadmap.sh/guest/6529303b545cb53d4aa730ca_1710849893225.png)
+
+Other than that, their offering is quite standard, although their pricing model might not be. While they do have the standard pricing tiers like the rest of them, they also give you the option to “bid” for used hardware that is no longer needed.
+
+### 18. Vercel
+
+If you’re building a NextJS application and you’re looking for a quick way to deploy it, then there is probably no better place than [Vercel](https://vercel.com/) (the owner of NextJS).
+
+Their platform allows you to link your GitHub account to their systems and deploy your entire application with a single push to the repo.
+
+![Vercel](https://assets.roadmap.sh/guest/6529303b545cb53d4aa730ca_1710849618859.png)
+
+And since they’re experts on NextJS, your app will “just work.”
+
+Even their free plan is perfect for quick SaaS prototypes and small applications. On top of this, they offer monitoring, auto-scaling, load balancing, and everything you’d expect from a PaaS provider.
+
+While it’s true they don’t support other technologies or even offer other related services, such as managed databases, there is hardly anyone who can provide a better developer experience when it comes to deploying a NextJS application.
+
+### 19. Render
+
+You can think of [Render](https://render.com/) as if Vercel and Heroku had a love child. Render gives you the amazing developer experience provided by Vercel but the flexibility (or more) from Heroku.
+
+You’re not tied to a single technology; instead, you have all the major runtimes available out of the box. Much higher HTTP timeouts (up to 100 minutes, which is incredible compared to the standard 10 or 30 seconds most providers give you) and tons of other security and quality-of-life improvements.
+
+![Render](https://assets.roadmap.sh/guest/6529303b545cb53d4aa730ca_1710849533040.png)
+
+Render also offers managed MySQL and managed Redis instances for you to use, even in their free tier. In the end, unless you’ve been using Heroku for a while and you’re happy with their DX, it might be a good idea to check out Render instead.
+
+### 20. OVHCloud
+
+[OVHCloud](https://www.ovhcloud.com/) is an all-in-one solution that seems to provide you with everything you need, from “bare metal” (as in infrastructure) to managed hosting for web applications, managed databases (they have many to choose from), and many other services.
+
+However, they do not seem to offer quality-of-life integrations to make your deployment workflow simple and intuitive.
+
+![OVHCloud](https://assets.roadmap.sh/guest/6529303b545cb53d4aa730ca_1710849730064.png)
+
+Now, given how they centralize all related services from domain name registration all the way up to analytics, identity management, file storage (CDN), and even one-click install CMS (content management systems, such as WordPress), etc, it might just be a good option for you. That is if you have the expertise in your team to deal with all these options.
+
+## API-Related Tools
+
+As backend developers, we’ll always be dealing with APIs (Application Programming Interface), either through using the ones created by others or writing our own.
+
+Whatever you’re doing, it’s always good to have some backend tools to help you build and test them faster, so let’s take a look at a few options.
+
+### 21. Swagger
+
+Some developers would argue that one of the hardest parts of creating an API is documenting it. Not only because it might sound like a boring task, but explaining what the API endpoint is doing well enough is not trivial.
+
+That’s where [Swagger](https://swagger.io/) comes into play.
+
+![Swagger](https://assets.roadmap.sh/guest/6529303b545cb53d4aa730ca_1710849662815.png)
+
+This tool allows you to create interactive documentation that provides developers with all they need to understand how to use your endpoints, and at the same time, it also gives them the option to test them directly from the generated UI.
+
+### 22. Postman
+
+[Postman](https://www.postman.com/) is less of a documentation-only app and has grown over the years to become a testing API tool that every developer and development team should know about. Backend developers are especially benefited from using Postman because of how well it helps organize and manage APIs.
+
+With Postman, you can organize all your company’s APIs, share them with the associated dev teams, and let them use and interact with them without having to write a single line of code.
+
+![Postman](https://assets.roadmap.sh/guest/6529303b545cb53d4aa730ca_1710849422682.png)
+
+While Swagger is more of a development tool that every backend developer should know about, Postman is the tool that every development team should use to share & control internal API access and documentation.
+
+## Productivity
+
+Finally, the last category is about productivity. While some of the products and services mentioned already do provide productivity enhancements, they weren’t there for that. The following list of backend tools is created thinking only about the benefits they can bring to your productivity while working as a backend developer.
+
+### 23. iTerm
+
+If you’re a macOS user, then [iTerm](https://iterm2.com/) is definitely one of the “must haves” you need to look into. As a backend developer, you’ll spend a lot of your day in the terminal.
+
+![iTerm](https://assets.roadmap.sh/guest/6529303b545cb53d4aa730ca_1710849558918.png)
+
+iTerm will take that experience to the next level by bringing in features such as:
+
+- Parallel panes inside the same window making it easy to multi-task.
+- Improved auto-complete
+- In-window search outside of the current program you’re using.
+- Instant replay lets you review the latest content on the screen before cleaning it.
+- Paste history, letting you move through the latest pasted content into the terminal.
+
+Mind you, none of these features are mandatory; you can easily work without them, but they do improve your quality of life as a developer. Hence the reason why iTerm leads this list.
+
+### 24. Zsh/OhMyZsh
+
+The combination of these two gives your terminal superpowers. [Zsh](https://zsh.sourceforge.io/) is an improved shell that lets you work much faster and more efficiently if you’re spending several hours typing commands in your terminal. For example, you get features such as:
+
+- Advanced tab auto-complete
+- Extensibility
+- Spelling corrections
+- And more.
+
+![Oh my Zsh](https://assets.roadmap.sh/guest/6529303b545cb53d4aa730ca_1710849870732.png)
+
+As mentioned above, after you have your ZSH installed and set up, you should look into installing oh-my-zsh, which helps with configuring all the customization options you have on this shell:
+
+- It comes bundled with [over 300 plugins](https://github.com/ohmyzsh/ohmyzsh/wiki/Plugins), ranging from 1password integrations to the “jump” plugin, which lets you move around the filesystem by moving from mark to mark (you can assign marks to folders).
+- [Plenty of themes](https://github.com/ohmyzsh/ohmyzsh/wiki/Themes) out of the box.
+
+If you find yourself spending hours on the terminal, consider installing this combo.
+
+### 25. Raycast
+
+[Raycast](https://www.raycast.com/) allows you to improve your productivity by giving you a better application launcher. Instead of using the default launcher, you can replace it with Raycast and gain superpowers.
+
+Now, you suddenly have access to hundreds of [community-created extensions](https://www.raycast.com/store) that allow you to directly interact with chatGPT from the app launcher, use GitHub, interact with VSCode directly, and more.
+
+![Raycast](https://assets.roadmap.sh/guest/6529303b545cb53d4aa730ca_1710849400409.png)
+
+While it is only available for macOS users, Raycast has become a must-have application for backend developers on this platform. In the end, the faster you can reach for your tools, the more productive you become. And a properly configured Raycast can make your web development process feel like a breeze.
+
+
+
+
+
+
diff --git a/src/data/guides/backend-languages.md b/src/data/guides/backend-languages.md
index a273a2c5e..b33dc46c1 100644
--- a/src/data/guides/backend-languages.md
+++ b/src/data/guides/backend-languages.md
@@ -1,15 +1,12 @@
---
title: 'The 5 Best Backend Development Languages to Master (2024)'
description: 'Discover the best backend development languages to master in 2024.'
-author:
- name: 'Fernando Doglio'
- url: 'https://twitter.com/deleteman123'
- imageUrl: '/authors/fernando.jpeg'
+authorId: fernando
excludedBySlug: '/backend/languages'
seo:
title: 'The 5 Best Backend Development Languages to Master (2024)'
description: 'Discover the best backend development languages to learn right now for career development, with practical tips from an experienced developer.'
-isNew: true
+isNew: false
type: 'textual'
date: 2024-01-18
sitemap:
@@ -116,9 +113,9 @@ What makes Python extra appealing, especially for beginners, is the fact that re
One of Python's standout features is its beginner-friendly syntax, making it an ideal language for those new to programming. The emphasis on readability and the absence of complex syntax (for the most part), eases the learning curve, enabling new developers to quickly grasp fundamental concepts.
-Python's community plays a critical role in its accessibility. Abundant learning resources, tutorials, and documentation are readily available, empowering beginners to progress from basic programming principles to advanced backend development seamlessly. Online platforms like Codecademy, Coursera, realpython.com, and even Google offer comprehensive courses tailored to all skill levels.
+Python's community plays a critical role in its accessibility. Abundant learning resources, tutorials, and documentation are readily available, empowering beginners to progress from basic programming principles to advanced backend development seamlessly. Online platforms like Codecademy, Coursera, realpython.com, and even Google offer comprehensive courses tailored to all skill levels.
-#### Practical Applications and Popular Frameworks
+#### Practical Applications and Popular Frameworks
Python's versatility is evident in its applicability across a spectrum of industries, from web development and data science to artificial intelligence and automation. In the context of backend development, Python shines brightly with its two standout frameworks: [Django](https://www.djangoproject.com/) and [Flask](https://github.com/pallets/flask).
@@ -154,7 +151,7 @@ Java has a massive presence and for good reason (according to [JetBrain’s surv
#### Is it worth learning Java?
-Now, learning Java, (a strongly typed, object oriented programming language (OOP), is a journey worth taking, but it's not a walk in the park. It's a bit like climbing a mountain – you start at the bottom with the basics, and as you ascend, you get into the nitty-gritty of things like object-oriented programming. The process will force you to learn a lot, which is a great thing, by the end you’ll have a lot of understanding of mechanics and concepts around OOP that can be extrapolated into other languages. However, that can also be overwhelming to some developers who just want to learn by building mini-projects. In those situations, the learning curve of Java might be too long (not steep, but long because there is a lot more to cover than with alternatives such as Python or JavaScript).
+Now, learning Java, (a strongly typed, object oriented programming language (OOP), is a journey worth taking, but it's not a walk in the park. It's a bit like climbing a mountain – you start at the bottom with the basics, and as you ascend, you get into the nitty-gritty of things like object-oriented programming. The process will force you to learn a lot, which is a great thing, by the end you’ll have a lot of understanding of mechanics and concepts around OOP that can be extrapolated into other languages. However, that can also be overwhelming to some developers who just want to learn by building mini-projects. In those situations, the learning curve of Java might be too long (not steep, but long because there is a lot more to cover than with alternatives such as Python or JavaScript).
That said, the community is big and there are tons of resources, from online courses to forums, helping you navigate the Java landscape. And good reason, considering Java has been around for quite a while.
@@ -197,7 +194,7 @@ If you were to rank languages based on the amount of content out there to learn
#### Key Frameworks and Development Tools
-Now, let's talk about frameworks. In the case of JavaScript, this topic is so varied that recommending a single option for someone just getting started is really hard.
+Now, let's talk about frameworks. In the case of JavaScript, this topic is so varied that recommending a single option for someone just getting started is really hard.
For example, if you want to go frontend agnostic, or in other words, you don’t care about the technology being used to develop the client side of your app, then a good starting option would be [Express.js](https://expressjs.com/). This framework used to be the industry standard. And while that’s no longer the case, it’s still a perfect first choice if you’re looking for something with the required functionality to make your life a lot easier.
@@ -205,7 +202,7 @@ Now, if on the other hand, you’re looking to build the frontend and the backen
#### Does it make sense to pick up JavaScript as a backend language?
-The answer to this question is always going to be “yes”, whether you’re coming from the frontend and you already have JS experience or if you’re picking it up from scratch. In fact, according to [StackOverflow’s 2023 survey, JavaScript is the most used language by professionals](https://survey.stackoverflow.co/2023/#most-popular-technologies-language-prof) (with 65.85% of the votes).
+The answer to this question is always going to be “yes”, whether you’re coming from the frontend and you already have JS experience or if you’re picking it up from scratch. In fact, according to [StackOverflow’s 2023 survey, JavaScript is the most used language by professionals](https://survey.stackoverflow.co/2023/#most-popular-technologies-language-prof) (with 65.85% of the votes).
![JavaScript Interest](/guides/backend-languages/javascript-interest.png)
@@ -234,7 +231,7 @@ While there might not be a downside to picking JS, there is no perfect language
### PHP
-Now, if you’re looking for something very well established in the web development industry, just like Java but with a shorter learning curve, then you’re probably looking for PHP.
+Now, if you’re looking for something very well established in the web development industry, just like Java but with a shorter learning curve, then you’re probably looking for PHP.
> As a note about PHP’s relevancy, while many developers might claim that PHP is a dying tech, according to [W3Techs, over 75% of websites with a backend use PHP](https://w3techs.com/technologies/details/pl-php).
@@ -242,7 +239,7 @@ It's the glue that holds a ton of websites together, and its longevity in the we
#### Ease of Mastery and Vast Library Support
-If you're diving into PHP, you wouldn’t be so wrong (no matter what others might tell you). It's got a gentle learning curve, which means you can start building things pretty quickly. Getting everything set up and working will probably take you 10 minutes, and you’ll be writing your first “hello world” 5 minutes after that.
+If you're diving into PHP, you wouldn’t be so wrong (no matter what others might tell you). It's got a gentle learning curve, which means you can start building things pretty quickly. Getting everything set up and working will probably take you 10 minutes, and you’ll be writing your first “hello world” 5 minutes after that.
The vast community support and an ocean of online resources make mastering PHP a breeze. Plus, its library support is like having a toolkit that's always expanding – you'll find what you need, whether you're wrangling databases, handling forms, or making your website dance with dynamic content.
@@ -250,9 +247,9 @@ If you’re looking to pick up PHP, look for the LAMP stack, which stands for **
#### Modern PHP Frameworks and Their Impact
-If we’re talking about PHP frameworks, then we gotta talk about [Laravel](https://laravel.com/) and [Symfony](https://symfony.com/). They are like the rockstars of the modern PHP world.
+If we’re talking about PHP frameworks, then we gotta talk about [Laravel](https://laravel.com/) and [Symfony](https://symfony.com/). They are like the rockstars of the modern PHP world.
-Laravel comes with a lot of tools and features that help you speed up your development process. On the other side, Symfony has a modular architecture, making it a solid choice for projects of all sizes.
+Laravel comes with a lot of tools and features that help you speed up your development process. On the other side, Symfony has a modular architecture, making it a solid choice for projects of all sizes.
These frameworks showcase how PHP has evolved, staying relevant and powerful in the ever-changing landscape of web development.
@@ -302,7 +299,7 @@ Let’s take a look at some pros and cons for the last programming language on o
- Go’s ecosystem is quite young when compared to the other alternatives here, so the maturity of the tools available might not be the same as, for example, Java or JavaScript tooling.
-### Choosing the Ideal Backend Language
+## Choosing the Ideal Backend Language
So, are these the best backend programming languages out there? Is there an absolute “best” backend programming language?
@@ -329,27 +326,27 @@ A handy tool when trying to evaluate a language like that is [roadmap.sh](https:
There you’ll find community-maintained roadmaps for many career paths within software development. In particular, for this article, the [backend roadmap](https://roadmap.sh/backend) is a great place to start, because while picking a backend language is important, you’ll see there that it’s not just about the language. In fact, there is a lot of tech around the language that is also required (I’m referring to databases, git, understanding how client-server communication works, and a big “etc).
-### Jumpstarting Your Backend Development Journey
+## Jumpstarting Your Backend Development Journey
To get started with your backend development journey, it's crucial to have a roadmap that guides you through the learning process and equips you with the skills to build robust and scalable backend systems.
Lucky for you, if you’re reading this, that means you’ve found the most complete and comprehensive roadmap online: [roadmap.sh](https://roadmap.sh), the current [backend roadmap](https://roadmap.sh/backend) is filled with details of everything you should and could (optionally) learn in your journey to becoming a backend developer.
-### Guided Learning: From Online Courses to Bootcamps
+## Guided Learning: From Online Courses to Bootcamps
-Online courses and bootcamps serve as invaluable companions on your learning expedition. Platforms like Udemy, Coursera, and freeCodeCamp offer comprehensive backend development courses.
+Online courses and bootcamps serve as invaluable companions on your learning expedition. Platforms like Udemy, Coursera, and freeCodeCamp offer comprehensive backend development courses.
These resources not only cover programming languages like Python, Java, or JavaScript but also dive deep into frameworks like Django, Express.js, or Laravel. For those seeking a more immersive experience, coding bootcamps provide intensive, hands-on training to fast-track your backend development skills.
Whatever choice you go for, make sure you’re not following trends or just copying the learning methods of others. Learning is a very personal experience and what works for others might not work for you, and vice versa. So make sure to do the proper research and figure out what option works best for you.
-### Building Community Connections for Learning Support
+## Building Community Connections for Learning Support
-Joining developer communities (there are several on Twitter for example), forums like Stack Overflow, or participating in social media groups dedicated to backend development creates a network of support.
+Joining developer communities (there are several on Twitter for example), forums like Stack Overflow, or participating in social media groups dedicated to backend development creates a network of support.
Engaging with experienced developers, sharing challenges, and seeking advice fosters a collaborative learning environment. Attend local meetups or virtual events if you can to connect with professionals in the field, gaining insights and building relationships that can prove invaluable throughout your journey.
-### Think about you and your project
+## Think about you and your project
There are many ways to go about picking the ideal backend language for you. If there is anything you should take home with you after reading this article, it is that most languages are equivalent in the sense that you’ll be able to do pretty much everything with any of them.
@@ -362,15 +359,15 @@ The questions you should also be asking yourself are:
In the end, personal preference and actual project requirements (if you have any) are very important, because both will influence how much you enjoy (or don’t enjoy) the learning process.
-### Crafting a Portfolio to Display Your Backend Skills:
+## Crafting a Portfolio to Display Your Backend Skills:
As you accumulate skills and knowledge, showcase your journey through a well-crafted portfolio. Include projects that highlight your backend skills, demonstrating your ability to - design databases, implement server-side logic, and integrate with client side technologies. Whether it's a dynamic web application, a RESTful API, or a data-driven project, your portfolio becomes a tangible representation of your backend development capabilities for potential employers or collaborators.
When it comes to deciding where to publish this portfolio, you have some options, such as directly on your GitHub profile (if you have one), or perhaps on your own personal website where you can share some design thoughts about each project along with the code.
-In the end, the important thing is that you should be sharing your experience somewhere, especially when you don’t have working experience in the field.
+In the end, the important thing is that you should be sharing your experience somewhere, especially when you don’t have working experience in the field.
-### Conclusion
+## Conclusion
In the end, there are many backend programming languages to choose from, and what language you go for, is up to you and your particular context/needs. All I can do is guide you to the door, but you have to cross it yourself. Some interesting options are:
@@ -383,12 +380,3 @@ In the end, there are many backend programming languages to choose from, and wha
You’re the one who gets to decide, but just know that no matter what you choose, getting started in backend development is a one-way street. You’ll be learning from this moment on, and you’ll be jumping from one language to the other as the field evolves.
Remember that there is a very detailed version of a [backend roadmap here](https://roadmap.sh/backend), it might be a great place to get started! And if you’re also interested in frontend development, there is an [equally handy roadmap](https://roadmap.sh/frontend) here as well!
-
-
-
-
-
-
-
-
-
diff --git a/src/data/guides/basic-authentication.md b/src/data/guides/basic-authentication.md
index bc344e51a..9b5fd3980 100644
--- a/src/data/guides/basic-authentication.md
+++ b/src/data/guides/basic-authentication.md
@@ -1,10 +1,7 @@
---
title: 'Basic Authentication'
description: 'Understand what is basic authentication and how it is implemented'
-author:
- name: 'Kamran Ahmed'
- url: 'https://twitter.com/kamrify'
- imageUrl: '/authors/kamranahmedse.jpeg'
+authorId: 'kamran'
seo:
title: 'Basic Authentication - roadmap.sh'
description: 'Understand what is basic authentication and how it is implemented'
diff --git a/src/data/guides/basics-of-authentication.md b/src/data/guides/basics-of-authentication.md
index 9605e1867..5826dc223 100644
--- a/src/data/guides/basics-of-authentication.md
+++ b/src/data/guides/basics-of-authentication.md
@@ -1,10 +1,7 @@
---
title: 'Basics of Authentication'
description: 'Learn the basics of Authentication and Authorization'
-author:
- name: 'Kamran Ahmed'
- url: 'https://twitter.com/kamrify'
- imageUrl: '/authors/kamranahmedse.jpeg'
+authorId: 'kamran'
seo:
title: 'Basics of Authentication - roadmap.sh'
description: 'Learn the basics of Authentication and Authorization'
diff --git a/src/data/guides/big-o-notation.md b/src/data/guides/big-o-notation.md
index b5dbad25c..8eb6c8ae7 100644
--- a/src/data/guides/big-o-notation.md
+++ b/src/data/guides/big-o-notation.md
@@ -1,10 +1,7 @@
---
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/kamrify'
- imageUrl: '/authors/kamranahmedse.jpeg'
+authorId: 'kamran'
seo:
title: 'Big-O Notation - roadmap.sh'
description: 'Easy to understand explanation of Big-O notation without any fancy terms'
diff --git a/src/data/guides/character-encodings.md b/src/data/guides/character-encodings.md
index 6d4dcf127..268390d2d 100644
--- a/src/data/guides/character-encodings.md
+++ b/src/data/guides/character-encodings.md
@@ -1,10 +1,7 @@
---
title: 'Character Encodings'
description: 'Covers the basics of character encodings and explains ASCII vs Unicode'
-author:
- name: 'Kamran Ahmed'
- url: 'https://twitter.com/kamrify'
- imageUrl: '/authors/kamranahmedse.jpeg'
+authorId: 'kamran'
seo:
title: 'Character Encodings - roadmap.sh'
description: 'Covers the basics of character encodings and explains ASCII vs Unicode'
diff --git a/src/data/guides/ci-cd.md b/src/data/guides/ci-cd.md
index bfd9cda06..135c62b69 100644
--- a/src/data/guides/ci-cd.md
+++ b/src/data/guides/ci-cd.md
@@ -1,10 +1,7 @@
---
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/kamrify'
- imageUrl: '/authors/kamranahmedse.jpeg'
+authorId: 'kamran'
seo:
title: 'What is CI and CD? - roadmap.sh'
description: 'Learn the basics of CI/CD and how to implement that with GitHub Actions.'
diff --git a/src/data/guides/consistency-patterns-in-distributed-systems.md b/src/data/guides/consistency-patterns-in-distributed-systems.md
index 25b69c2c1..1f8f5ee2a 100644
--- a/src/data/guides/consistency-patterns-in-distributed-systems.md
+++ b/src/data/guides/consistency-patterns-in-distributed-systems.md
@@ -1,10 +1,7 @@
---
title: 'Consistency Patterns'
description: 'Everything you need to know about Week, Strong and Eventual Consistency'
-author:
- name: 'Kamran Ahmed'
- url: 'https://twitter.com/kamrify'
- imageUrl: '/authors/kamranahmedse.jpeg'
+authorId: 'kamran'
seo:
title: 'Consistency Patterns - roadmap.sh'
description: 'Everything you need to know about Week, Strong and Eventual Consistency'
diff --git a/src/data/guides/design-patterns-for-humans.md b/src/data/guides/design-patterns-for-humans.md
index 57cc96169..d3eace516 100644
--- a/src/data/guides/design-patterns-for-humans.md
+++ b/src/data/guides/design-patterns-for-humans.md
@@ -1,10 +1,7 @@
---
title: 'Design Patterns for Humans'
description: 'A language agnostic, ultra-simplified explanation to design patterns'
-author:
- name: 'Kamran Ahmed'
- url: 'https://twitter.com/kamrify'
- imageUrl: '/authors/kamranahmedse.jpeg'
+authorId: 'kamran'
seo:
title: 'Design Patterns for Humans - roadmap.sh'
description: 'A language agnostic, ultra-simplified explanation to design patterns'
diff --git a/src/data/guides/dhcp-in-one-picture.md b/src/data/guides/dhcp-in-one-picture.md
index 5c9179378..b32df3362 100644
--- a/src/data/guides/dhcp-in-one-picture.md
+++ b/src/data/guides/dhcp-in-one-picture.md
@@ -1,10 +1,7 @@
---
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/kamrify'
- imageUrl: '/authors/kamranahmedse.jpeg'
+authorId: 'kamran'
seo:
title: 'DHCP in One Picture - roadmap.sh'
description: 'Here is what happens when a new device joins the network.'
diff --git a/src/data/guides/dns-in-one-picture.md b/src/data/guides/dns-in-one-picture.md
index 8cf7bf484..8acb42731 100644
--- a/src/data/guides/dns-in-one-picture.md
+++ b/src/data/guides/dns-in-one-picture.md
@@ -1,10 +1,7 @@
---
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/kamrify'
- imageUrl: '/authors/kamranahmedse.jpeg'
+authorId: 'kamran'
seo:
title: 'DNS in One Picture - roadmap.sh'
description: 'Quick illustrative guide on how a website is found on the internet.'
diff --git a/src/data/guides/free-resources-to-learn-llms.md b/src/data/guides/free-resources-to-learn-llms.md
index e2ea0cd60..b19ef2982 100644
--- a/src/data/guides/free-resources-to-learn-llms.md
+++ b/src/data/guides/free-resources-to-learn-llms.md
@@ -1,10 +1,7 @@
---
title: '5 Free Resources to Master LLMs'
description: 'Dive into the world of LLMs with these free resources'
-author:
- name: 'Kamran Ahmed'
- url: 'https://twitter.com/kamrify'
- imageUrl: '/authors/kamranahmedse.jpeg'
+authorId: 'kamran'
seo:
title: '5 Free Resources to Master Language Models (LLMs) - roadmap.sh'
description: 'Looking to dive into the fascinating world of Language Models (LLMs)? Discover the top 5 free resources that will help you learn and excel in understanding LLMs. From comprehensive tutorials to interactive courses, this blog post provides you with the ultimate guide to sharpen your skills and unravel the potential of language models. Start your journey today and become a pro in LLMs without spending a dime!'
diff --git a/src/data/guides/history-of-javascript.md b/src/data/guides/history-of-javascript.md
index be9cc030c..637f71df4 100644
--- a/src/data/guides/history-of-javascript.md
+++ b/src/data/guides/history-of-javascript.md
@@ -1,10 +1,7 @@
---
title: 'Brief History of JavaScript'
description: 'How JavaScript was introduced and evolved over the years'
-author:
- name: 'Kamran Ahmed'
- url: 'https://twitter.com/kamrify'
- imageUrl: '/authors/kamranahmedse.jpeg'
+authorId: 'kamran'
seo:
title: 'Brief History of JavaScript - roadmap.sh'
description: 'How JavaScript was introduced and evolved over the years'
diff --git a/src/data/guides/how-to-setup-a-jump-server.md b/src/data/guides/how-to-setup-a-jump-server.md
index 70642b784..63bcd8f65 100644
--- a/src/data/guides/how-to-setup-a-jump-server.md
+++ b/src/data/guides/how-to-setup-a-jump-server.md
@@ -1,10 +1,7 @@
---
title: 'Jump Servers: What, Why and How'
description: 'Learn what is a Jump Server and how to set it up for SSH access.'
-author:
- name: 'Kamran Ahmed'
- url: 'https://twitter.com/kamrify'
- imageUrl: '/authors/kamranahmedse.jpeg'
+authorId: 'kamran'
seo:
title: 'Jump Servers: What, Why and How - roadmap.sh'
description: 'Learn what is a Jump Server and how to set it up for SSH access.'
diff --git a/src/data/guides/http-basic-authentication.md b/src/data/guides/http-basic-authentication.md
index 833335990..25b52655b 100644
--- a/src/data/guides/http-basic-authentication.md
+++ b/src/data/guides/http-basic-authentication.md
@@ -1,10 +1,7 @@
---
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/kamrify'
- imageUrl: '/authors/kamranahmedse.jpeg'
+authorId: 'kamran'
seo:
title: 'HTTP Basic Authentication - roadmap.sh'
description: 'Learn what is HTTP Basic Authentication and how to implement it in Node.js'
diff --git a/src/data/guides/http-caching.md b/src/data/guides/http-caching.md
index 41ef7ba89..bb8834925 100644
--- a/src/data/guides/http-caching.md
+++ b/src/data/guides/http-caching.md
@@ -1,10 +1,7 @@
---
title: 'HTTP Caching'
description: 'Everything you need to know about web caching'
-author:
- name: 'Kamran Ahmed'
- url: 'https://twitter.com/kamrify'
- imageUrl: '/authors/kamranahmedse.jpeg'
+authorId: 'kamran'
seo:
title: 'HTTP Caching - roadmap.sh'
description: 'Everything you need to know about web caching'
diff --git a/src/data/guides/introduction-to-llms.md b/src/data/guides/introduction-to-llms.md
index dc4f17ea7..b835bc512 100644
--- a/src/data/guides/introduction-to-llms.md
+++ b/src/data/guides/introduction-to-llms.md
@@ -1,10 +1,7 @@
---
title: 'Introduction to LLMs'
description: 'What are LLMs, how does ChatGPT and other LLMs work?'
-author:
- name: 'Kamran Ahmed'
- url: 'https://twitter.com/kamrify'
- imageUrl: '/authors/kamranahmedse.jpeg'
+authorId: 'kamran'
seo:
title: 'Introduction to LLMs - roadmap.sh'
description: 'What are LLMs, how does ChatGPT and other LLMs work?'
diff --git a/src/data/guides/journey-to-http2.md b/src/data/guides/journey-to-http2.md
index 153f56ef8..209c5d2e6 100644
--- a/src/data/guides/journey-to-http2.md
+++ b/src/data/guides/journey-to-http2.md
@@ -1,10 +1,7 @@
---
title: 'Journey to HTTP/2'
description: 'The evolution of HTTP. How it all started and where we stand today'
-author:
- name: 'Kamran Ahmed'
- url: 'https://twitter.com/kamrify'
- imageUrl: '/authors/kamranahmedse.jpeg'
+authorId: 'kamran'
seo:
title: 'Journey to HTTP/2 - roadmap.sh'
description: 'The evolution of HTTP. How it all started and where we stand today'
diff --git a/src/data/guides/jwt-authentication.md b/src/data/guides/jwt-authentication.md
index 4d09a3b73..518a9f95d 100644
--- a/src/data/guides/jwt-authentication.md
+++ b/src/data/guides/jwt-authentication.md
@@ -1,10 +1,7 @@
---
title: 'JWT Authentication'
description: 'Understand what is JWT authentication and how is it implemented'
-author:
- name: 'Kamran Ahmed'
- url: 'https://twitter.com/kamrify'
- imageUrl: '/authors/kamranahmedse.jpeg'
+authorId: 'kamran'
seo:
title: 'JWT Authentication - roadmap.sh'
description: 'Understand what is JWT authentication and how is it implemented'
diff --git a/src/data/guides/levels-of-seniority.md b/src/data/guides/levels-of-seniority.md
index f5c71e946..eb7c2f42c 100644
--- a/src/data/guides/levels-of-seniority.md
+++ b/src/data/guides/levels-of-seniority.md
@@ -1,10 +1,7 @@
---
title: 'Levels of Seniority'
description: 'How to Step Up as a Junior, Mid Level or a Senior Developer?'
-author:
- name: 'Kamran Ahmed'
- url: 'https://twitter.com/kamrify'
- imageUrl: '/authors/kamranahmedse.jpeg'
+authorId: 'kamran'
seo:
title: 'Levels of Seniority - roadmap.sh'
description: 'How to Step Up as a Junior, Mid Level or a Senior Developer?'
diff --git a/src/data/guides/oauth.md b/src/data/guides/oauth.md
index f56fde7ea..6834d67d7 100644
--- a/src/data/guides/oauth.md
+++ b/src/data/guides/oauth.md
@@ -1,10 +1,7 @@
---
title: 'OAuth — Open Authorization'
description: 'Learn and understand what is OAuth and how it works'
-author:
- name: 'Kamran Ahmed'
- url: 'https://twitter.com/kamrify'
- imageUrl: '/authors/kamranahmedse.jpeg'
+authorId: 'kamran'
seo:
title: 'OAuth — Open Authorization - roadmap.sh'
description: 'Learn and understand what is OAuth and how it works'
diff --git a/src/data/guides/proxy-servers.md b/src/data/guides/proxy-servers.md
index de53315cf..560245872 100644
--- a/src/data/guides/proxy-servers.md
+++ b/src/data/guides/proxy-servers.md
@@ -1,10 +1,7 @@
---
title: 'Proxy Servers'
description: 'How do proxy servers work and what are forward and reverse proxies?'
-author:
- name: 'Ebrahim Bharmal'
- url: 'https://twitter.com/BharmalEbrahim'
- imageUrl: '/authors/ebrahimbharmal007.png'
+authorId: 'ebrahim-bharmal'
seo:
title: 'Proxy Servers - roadmap.sh'
description: 'How do proxy servers work and what are forward and reverse proxies?'
diff --git a/src/data/guides/random-numbers.md b/src/data/guides/random-numbers.md
index 15d3d221a..f193dd15a 100644
--- a/src/data/guides/random-numbers.md
+++ b/src/data/guides/random-numbers.md
@@ -1,10 +1,7 @@
---
title: 'Random Numbers: Are they?'
description: 'Learn how they are generated and why they may not be truly random.'
-author:
- name: 'Kamran Ahmed'
- url: 'https://twitter.com/kamrify'
- imageUrl: '/authors/kamranahmedse.jpeg'
+authorId: 'kamran'
seo:
title: 'Random Numbers: Are they? - roadmap.sh'
description: 'Learn how they are generated and why they may not be truly random.'
diff --git a/src/data/guides/scaling-databases.md b/src/data/guides/scaling-databases.md
index bfc6b90e3..af2f49df8 100644
--- a/src/data/guides/scaling-databases.md
+++ b/src/data/guides/scaling-databases.md
@@ -1,10 +1,7 @@
---
title: 'Scaling Databases'
description: 'Learn the ups and downs of different database scaling strategies'
-author:
- name: 'Kamran Ahmed'
- url: 'https://twitter.com/kamrify'
- imageUrl: '/authors/kamranahmedse.jpeg'
+authorId: 'kamran'
seo:
title: 'Scaling Databases - roadmap.sh'
description: 'Learn the ups and downs of different database scaling strategies'
diff --git a/src/data/guides/session-authentication.md b/src/data/guides/session-authentication.md
index cb91ece61..c86d5f1af 100644
--- a/src/data/guides/session-authentication.md
+++ b/src/data/guides/session-authentication.md
@@ -1,10 +1,7 @@
---
title: 'Session Based Authentication'
description: 'Understand what is session based authentication and how it is implemented'
-author:
- name: 'Kamran Ahmed'
- url: 'https://twitter.com/kamrify'
- imageUrl: '/authors/kamranahmedse.jpeg'
+authorId: 'kamran'
seo:
title: 'Session Based Authentication - roadmap.sh'
description: 'Understand what is session based authentication and how it is implemented'
diff --git a/src/data/guides/session-based-authentication.md b/src/data/guides/session-based-authentication.md
index e6bba3247..cc30c62b1 100644
--- a/src/data/guides/session-based-authentication.md
+++ b/src/data/guides/session-based-authentication.md
@@ -1,10 +1,7 @@
---
title: 'Session Based Authentication'
description: 'Learn what is Session Based Authentication and how to implement it in Node.js'
-author:
- name: 'Kamran Ahmed'
- url: 'https://twitter.com/kamrify'
- imageUrl: '/authors/kamranahmedse.jpeg'
+authorId: 'kamran'
seo:
title: 'Session Based Authentication - roadmap.sh'
description: 'Learn what is Session Based Authentication and how to implement it in Node.js'
diff --git a/src/data/guides/setup-and-auto-renew-ssl-certificates.md b/src/data/guides/setup-and-auto-renew-ssl-certificates.md
index 3acbdbc87..0f7ef3750 100644
--- a/src/data/guides/setup-and-auto-renew-ssl-certificates.md
+++ b/src/data/guides/setup-and-auto-renew-ssl-certificates.md
@@ -1,10 +1,7 @@
---
title: "Guide to Let's Encrypt SSL Setup"
description: "Learn how to protect your website using Let's Encrypt SSL Certificates."
-author:
- name: 'Kamran Ahmed'
- url: 'https://twitter.com/kamrify'
- imageUrl: '/authors/kamranahmedse.jpeg'
+authorId: 'kamran'
seo:
title: "Guide to Let's Encrypt SSL Setup - roadmap.sh"
description: "Learn how to protect your website using Let's Encrypt SSL Certificates."
diff --git a/src/data/guides/single-command-database-setup.md b/src/data/guides/single-command-database-setup.md
index 129c8a5e8..e280f8819 100644
--- a/src/data/guides/single-command-database-setup.md
+++ b/src/data/guides/single-command-database-setup.md
@@ -1,10 +1,7 @@
---
title: 'Single Command Database Setup'
description: 'Learn how to run MySQL, PostgreSQL, or MongoDB in Docker with single Command'
-author:
- name: 'Kamran Ahmed'
- url: 'https://twitter.com/kamrify'
- imageUrl: '/authors/kamranahmedse.jpeg'
+authorId: 'kamran'
seo:
title: 'Single Command Database Setup - roadmap.sh'
description: 'Learn how to run MySQL, PostgreSQL, or MongoDB in Docker with single Command'
diff --git a/src/data/guides/ssl-tls-https-ssh.md b/src/data/guides/ssl-tls-https-ssh.md
index 1832b62ba..b21b140b7 100644
--- a/src/data/guides/ssl-tls-https-ssh.md
+++ b/src/data/guides/ssl-tls-https-ssh.md
@@ -1,10 +1,7 @@
---
title: 'SSL vs TLS vs SSH'
description: 'Quick tidbit on the differences between SSL, TLS, HTTPS and SSH'
-author:
- name: 'Kamran Ahmed'
- url: 'https://twitter.com/kamrify'
- imageUrl: '/authors/kamranahmedse.jpeg'
+authorId: 'kamran'
seo:
title: 'SSL vs TLS vs SSH - roadmap.sh'
description: 'Quick tidbit on the differences between SSL, TLS, HTTPS and SSH'
diff --git a/src/data/guides/sso.md b/src/data/guides/sso.md
index 6d3987015..1dd61cef7 100644
--- a/src/data/guides/sso.md
+++ b/src/data/guides/sso.md
@@ -1,10 +1,7 @@
---
title: 'SSO — Single Sign On'
description: 'Learn the basics of SAML and understand how does Single Sign On work.'
-author:
- name: 'Kamran Ahmed'
- url: 'https://twitter.com/kamrify'
- imageUrl: '/authors/kamranahmedse.jpeg'
+authorId: 'kamran'
seo:
title: 'SSO — Single Sign On - roadmap.sh'
description: 'Learn the basics of SAML and understand how does Single Sign On work.'
diff --git a/src/data/guides/token-authentication.md b/src/data/guides/token-authentication.md
index fcfac7986..bb82324a1 100644
--- a/src/data/guides/token-authentication.md
+++ b/src/data/guides/token-authentication.md
@@ -1,10 +1,7 @@
---
title: 'Token Based Authentication'
description: 'Understand what is token based authentication and how it is implemented'
-author:
- name: 'Kamran Ahmed'
- url: 'https://twitter.com/kamrify'
- imageUrl: '/authors/kamranahmedse.jpeg'
+authorId: 'kamran'
seo:
title: 'Token Based Authentication - roadmap.sh'
description: 'Understand what is token based authentication and how it is implemented'
diff --git a/src/data/guides/torrent-client.md b/src/data/guides/torrent-client.md
index 63af12295..536b57cae 100644
--- a/src/data/guides/torrent-client.md
+++ b/src/data/guides/torrent-client.md
@@ -1,10 +1,7 @@
---
title: 'Building a BitTorrent Client'
description: 'Learn everything you need to know about BitTorrent by writing a client in Go'
-author:
- name: 'Jesse Li'
- url: 'https://twitter.com/__jesse_li'
- imageUrl: '/authors/jesse.png'
+authorId: 'jesse-li'
seo:
title: 'Building a BitTorrent Client - roadmap.sh'
description: 'Learn everything you need to know about BitTorrent by writing a client in Go'
diff --git a/src/data/guides/unfamiliar-codebase.md b/src/data/guides/unfamiliar-codebase.md
index c6c07d809..41396c3e2 100644
--- a/src/data/guides/unfamiliar-codebase.md
+++ b/src/data/guides/unfamiliar-codebase.md
@@ -1,10 +1,7 @@
---
title: 'Unfamiliar Codebase'
description: 'Tips on getting familiar with an unfamiliar codebase'
-author:
- name: 'Kamran Ahmed'
- url: 'https://twitter.com/kamrify'
- imageUrl: '/authors/kamranahmedse.jpeg'
+authorId: 'kamran'
seo:
title: 'Unfamiliar Codebase - roadmap.sh'
description: 'Tips on getting familiar with an unfamiliar codebase'
diff --git a/src/data/guides/what-are-web-vitals.md b/src/data/guides/what-are-web-vitals.md
index 00a8138fe..bdc782d81 100644
--- a/src/data/guides/what-are-web-vitals.md
+++ b/src/data/guides/what-are-web-vitals.md
@@ -1,10 +1,7 @@
---
title: 'What are Web Vitals?'
description: 'Learn what are the core web vitals and how to measure them.'
-author:
- name: 'Kamran Ahmed'
- url: 'https://twitter.com/kamrify'
- imageUrl: '/authors/kamranahmedse.jpeg'
+authorId: 'kamran'
seo:
title: 'What are Web Vitals? - roadmap.sh'
description: 'Learn what are the core web vitals and how to measure them.'
diff --git a/src/data/guides/what-is-internet.md b/src/data/guides/what-is-internet.md
index e9a58773e..044676320 100644
--- a/src/data/guides/what-is-internet.md
+++ b/src/data/guides/what-is-internet.md
@@ -1,10 +1,7 @@
---
title: 'How does the internet work?'
description: 'Learn the basics of internet and everything involved with this short video series'
-author:
- name: 'Kamran Ahmed'
- url: 'https://twitter.com/kamrify'
- imageUrl: '/authors/kamranahmedse.jpeg'
+authorId: 'kamran'
seo:
title: 'How does the internet work? - roadmap.sh'
description: 'Learn the basics of internet and everything involved with this short video series'
diff --git a/src/data/guides/what-is-sli-slo-sla.md b/src/data/guides/what-is-sli-slo-sla.md
index c3bc63fc3..53e2cf386 100644
--- a/src/data/guides/what-is-sli-slo-sla.md
+++ b/src/data/guides/what-is-sli-slo-sla.md
@@ -1,10 +1,7 @@
---
title: 'SLIs, SLOs and SLAs'
description: 'Learn what are different indicators for performance identification of any service.'
-author:
- name: 'Kamran Ahmed'
- url: 'https://twitter.com/kamrify'
- imageUrl: '/authors/kamranahmedse.jpeg'
+authorId: 'kamran'
seo:
title: 'SLIs, SLOs and SLAs - roadmap.sh'
description: 'Learn what are different indicators for performance identification of any service.'
diff --git a/src/data/guides/why-build-it-and-they-will-come-wont-work-anymore.md b/src/data/guides/why-build-it-and-they-will-come-wont-work-anymore.md
index 0d7a730c3..769343c6a 100644
--- a/src/data/guides/why-build-it-and-they-will-come-wont-work-anymore.md
+++ b/src/data/guides/why-build-it-and-they-will-come-wont-work-anymore.md
@@ -1,10 +1,7 @@
---
title: 'Build it and they will come?'
description: 'Why “build it and they will come” alone won’t work anymore'
-author:
- name: 'Peter Thaleikis'
- url: 'https://twitter.com/spekulatius1984'
- imageUrl: '/authors/spekulatius.jpg'
+authorId: 'peter-thaleikis'
seo:
title: 'Build it and they will come? - roadmap.sh'
description: 'Why “build it and they will come” alone won’t work anymore'
diff --git a/src/data/roadmaps/ai-data-scientist/ai-data-scientist.md b/src/data/roadmaps/ai-data-scientist/ai-data-scientist.md
index e0df57da9..14e42dcce 100644
--- a/src/data/roadmaps/ai-data-scientist/ai-data-scientist.md
+++ b/src/data/roadmaps/ai-data-scientist/ai-data-scientist.md
@@ -1,13 +1,13 @@
---
jsonUrl: '/jsons/roadmaps/ai-data-scientist.json'
pdfUrl: '/pdfs/roadmaps/ai-data-scientist.pdf'
-order: 6
+order: 4
briefTitle: 'AI and Data Scientist'
briefDescription: 'Step by step guide to becoming an AI and Data Scientist in 2024'
title: 'AI and Data Scientist Roadmap'
description: 'Step by step guide to becoming an AI and Data Scientist in 2024'
hasTopics: true
-isNew: true
+isNew: false
dimensions:
width: 968
height: 2243.96
diff --git a/src/data/roadmaps/android/android.md b/src/data/roadmaps/android/android.md
index bdef0c396..b0efc9152 100644
--- a/src/data/roadmaps/android/android.md
+++ b/src/data/roadmaps/android/android.md
@@ -1,6 +1,6 @@
---
pdfUrl: '/pdfs/roadmaps/android.pdf'
-order: 4
+order: 5
briefTitle: 'Android'
briefDescription: 'Step by step guide to becoming an Android Developer in 2024'
title: 'Android Developer'
diff --git a/src/data/roadmaps/aspnet-core/aspnet-core.md b/src/data/roadmaps/aspnet-core/aspnet-core.md
index 697b6bf5f..e96715754 100644
--- a/src/data/roadmaps/aspnet-core/aspnet-core.md
+++ b/src/data/roadmaps/aspnet-core/aspnet-core.md
@@ -57,5 +57,5 @@ sitemap:
tags:
- 'roadmap'
- 'main-sitemap'
- - 'role-roadmap'
+ - 'skill-roadmap'
---
diff --git a/src/data/roadmaps/aspnet-core/content/104-orm/100-entity-framework-core/103-lazy-eager-explicit-loading.md b/src/data/roadmaps/aspnet-core/content/104-orm/100-entity-framework-core/103-lazy-eager-explicit-loading.md
index 7b90ff860..667be18aa 100644
--- a/src/data/roadmaps/aspnet-core/content/104-orm/100-entity-framework-core/103-lazy-eager-explicit-loading.md
+++ b/src/data/roadmaps/aspnet-core/content/104-orm/100-entity-framework-core/103-lazy-eager-explicit-loading.md
@@ -2,7 +2,7 @@
## Eager Loading
-Eager Loading helps you to load all your needed entities at once; i.e., all your child entities will be loaded at single database call. This can be achieved, using the Include method, which returs the related entities as a part of the query and a large amount of data is loaded at once.
+Eager Loading helps you to load all your needed entities at once; i.e., all your child entities will be loaded at single database call. This can be achieved, using the Include method, which returns the related entities as a part of the query and a large amount of data is loaded at once.
## Lazy Loading
diff --git a/src/data/roadmaps/aspnet-core/content/118-good-to-know-libraries/100-mediatr.md b/src/data/roadmaps/aspnet-core/content/118-good-to-know-libraries/100-mediatr.md
index 32b708b16..d2dfef54d 100644
--- a/src/data/roadmaps/aspnet-core/content/118-good-to-know-libraries/100-mediatr.md
+++ b/src/data/roadmaps/aspnet-core/content/118-good-to-know-libraries/100-mediatr.md
@@ -5,4 +5,4 @@ MediatR is an open-source library for .NET that is designed to simplify the proc
For more information, visit the following links:
- [Use MediatR in ASP.NET or ASP.NET Core](https://medium.com/dotnet-hub/use-mediatr-in-asp-net-or-asp-net-core-cqrs-and-mediator-in-dotnet-how-to-use-mediatr-cqrs-aspnetcore-5076e2f2880c)
-- [How to implement CQRS using MediatR in an ASP.NET?](https://blog.christian-schou.dk/how-to-implement-cqrs-with-mediatr-in-asp-net/)
+- [How to implement CQRS using MediatR in an ASP.NET?](https://christian-schou.dk/blog/how-to-implement-cqrs-with-mediatr-in-asp-net/)
diff --git a/src/data/roadmaps/backend/faqs.astro b/src/data/roadmaps/backend/faqs.astro
index d853a9179..de8eee1d6 100644
--- a/src/data/roadmaps/backend/faqs.astro
+++ b/src/data/roadmaps/backend/faqs.astro
@@ -7,7 +7,7 @@ export const faqs: FAQType[] = [
answer: [
"If you are a complete beginner who is just getting started, you can start by learning a backend programming language such as Python, Ruby, Java, Go etc. Once you have got the basic to intermediate understanding of the language, learn about the package manager for that language and learn how to install and use external packages into your applications. Learn the basics of some relational database e.g. PostgreSQL and learn how to run simple CRUD operations. Optionally, you can pick up and learn a web framework for the language of your choice as well. Learn how to build a simple RESTful API and implement simple Authentication/Authorization into it. While you are learning all the items mentioned above, don't forget to learn about Git and GitHub as well.",
'After following all the instructions above, you can start applying for the entry level backend developer jobs. Also, look at the backend developer roadmap above to get an idea about the landscape and see what else you are missing. A degree in computer science or related field is not always necessary but networking, building a portfolio and actively seeking internships, junior developer positions or consulting can help to start and advance a career as a backend developer.',
- "Note: remember to make a lot of projects while you are learning to solidify your understanding of the concepts. Also, it's important to have the attitude of continuous learning to improve your skills and be prepared for the fast-paced technology evolution in the industry.",
+ "Note: remember to make a lot of projects while you are learning to solidify your understanding of the concepts. Also, it's important to have the attitude of continuous learning to improve your [skills](https://roadmap.sh/backend/developer-skills) and be prepared for the fast-paced technology evolution in the industry.",
],
},
{
@@ -32,5 +32,12 @@ export const faqs: FAQType[] = [
'If you are a beginner who is just getting started, don\'t feel overwhelmed by looking at this roadmap. Look at the answer to the FAQ "How to become a Backend Developer?"',
],
},
+ {
+ question: 'What tools does a backend developer use?',
+ answer: [
+ 'Other than the language itself, some common [backend developer tools](https://roadmap.sh/backend/developer-tools) that you’ll use as a backend dev, are going to be: The IDE/Text editor; here you have tons of options from VSCode, to Zed or Sublime Text. Some database tools, such as DataGrid or Navicat interact with your databases from outside your code. API-related tools like Swagger or Postman will help you document their behavior and share the endpoints with your team. A hosting service for your code. And finally, some collaborative and productivity tools such as Jira, Wrike, Trello or Monday to help you organize your work with your colleagues. And others like Raycast or iTerm to boost your productivity. There are many alternatives in each category, it’s up to you to try them and pick the ones that work best for you.',
+
+ ]
+ }
];
---
diff --git a/src/data/roadmaps/cpp/cpp.md b/src/data/roadmaps/cpp/cpp.md
index 67beccd37..a5b7d411a 100644
--- a/src/data/roadmaps/cpp/cpp.md
+++ b/src/data/roadmaps/cpp/cpp.md
@@ -52,5 +52,5 @@ sitemap:
tags:
- 'roadmap'
- 'main-sitemap'
- - 'role-roadmap'
+ - 'skill-roadmap'
---
diff --git a/src/data/roadmaps/cyber-security/content/102-networking-knowledge/100-osi-model.md b/src/data/roadmaps/cyber-security/content/102-networking-knowledge/100-osi-model.md
index 041207cf3..84e873134 100644
--- a/src/data/roadmaps/cyber-security/content/102-networking-knowledge/100-osi-model.md
+++ b/src/data/roadmaps/cyber-security/content/102-networking-knowledge/100-osi-model.md
@@ -32,8 +32,8 @@ The **Presentation layer** is responsible for translating or converting the data
The **Application layer** is the interface between the user and the communication system. It is responsible for providing networking services for various applications, like email, web browsing, or file sharing.
-Each of these layers interacts with the adjacent layers to pass data packets back and forth. Understanding the OCI model is crucial for addressing potential security threats and vulnerabilities that can occur at each layer. By implementing strong network security measures at each layer, you can minimize the risk of cyber attacks and keep your data safe.
+Each of these layers interacts with the adjacent layers to pass data packets back and forth. Understanding the OSI model is crucial for addressing potential security threats and vulnerabilities that can occur at each layer. By implementing strong network security measures at each layer, you can minimize the risk of cyber attacks and keep your data safe.
In the next section, we will discuss network protocols and how they play an essential role in network communication and security.
-- [What is OSI Model?](https://www.youtube.com/watch?v=Ilk7UXzV_Qc&ab_channel=RealPars)
\ No newline at end of file
+- [What is OSI Model?](https://www.youtube.com/watch?v=Ilk7UXzV_Qc&ab_channel=RealPars)
diff --git a/src/data/roadmaps/data-analyst/content/100-introduction/100-data-analytics.md b/src/data/roadmaps/data-analyst/content/100-introduction/100-data-analytics.md
new file mode 100644
index 000000000..037a807ef
--- /dev/null
+++ b/src/data/roadmaps/data-analyst/content/100-introduction/100-data-analytics.md
@@ -0,0 +1,3 @@
+# Introduction to Data Analytics for Data Analysts
+
+Data Analytics is a core component of a Data Analyst's role. The field involves extracting meaningful insights from raw data to drive decision-making processes. It includes a wide range of techniques and disciplines ranging from the simple data compilation to advanced algorithms and statistical analysis. As a data analyst, you are expected to understand and interpret complex digital data, such as the usage statistics of a website, the sales figures of a company, or client engagement over social media, etc. This knowledge enables data analysts to support businesses in identifying trends, making informed decisions, predicting potential outcomes - hence playing a crucial role in shaping business strategies.
\ No newline at end of file
diff --git a/src/data/roadmaps/data-analyst/content/100-introduction/101-types-data-analytics/100-descriptive.md b/src/data/roadmaps/data-analyst/content/100-introduction/101-types-data-analytics/100-descriptive.md
new file mode 100644
index 000000000..151da87fc
--- /dev/null
+++ b/src/data/roadmaps/data-analyst/content/100-introduction/101-types-data-analytics/100-descriptive.md
@@ -0,0 +1,3 @@
+# Descriptive Analytics
+
+Descriptive Analytics is one of the fundamental types of Data Analytics that provides insight into the past. As a Data Analyst, utilizing Descriptive Analytics involves the technique of using historical data to understand changes that have occurred in a business over time. Primarily concerned with the “what has happened” aspect, it analyzes raw data from the past to draw inferences and identify patterns and trends. This helps companies understand their strengths, weaknesses and pinpoint operational problems, setting the stage for accurate Business Intelligence and decision-making processes.
\ No newline at end of file
diff --git a/src/data/roadmaps/data-analyst/content/100-introduction/101-types-data-analytics/101-diagnostic.md b/src/data/roadmaps/data-analyst/content/100-introduction/101-types-data-analytics/101-diagnostic.md
new file mode 100644
index 000000000..2f939228b
--- /dev/null
+++ b/src/data/roadmaps/data-analyst/content/100-introduction/101-types-data-analytics/101-diagnostic.md
@@ -0,0 +1,3 @@
+# Diagnostic Analytics
+
+Diagnostic analytics, as a crucial type of data analytics, is focused on studying past performance to understand why something happened. This is an integral part of the work done by data analysts. Through techniques such as drill-down, data discovery, correlations, and cause-effect analysis, data analysts utilizing diagnostic analytics can look beyond general trends and identify the root cause of changes observed in the data. Consequently, this enables businesses to address operational and strategic issues effectively, by allowing them to grasp the reasons behind such issues. For every data analyst, the skill of performing diagnostic data analytics is a must-have asset that enhances their analysis capability.
\ No newline at end of file
diff --git a/src/data/roadmaps/data-analyst/content/100-introduction/101-types-data-analytics/102-predictive.md b/src/data/roadmaps/data-analyst/content/100-introduction/101-types-data-analytics/102-predictive.md
new file mode 100644
index 000000000..4d749464c
--- /dev/null
+++ b/src/data/roadmaps/data-analyst/content/100-introduction/101-types-data-analytics/102-predictive.md
@@ -0,0 +1,3 @@
+# Predictive Analysis
+
+Predictive analysis is a crucial type of data analytics that any competent data analyst should comprehend. It refers to the practice of extracting information from existing data sets in order to determine patterns and forecast future outcomes and trends. Data analysts apply statistical algorithms, machine learning techniques, and artificial intelligence to the data to anticipate future results. Predictive analysis enables organizations to be proactive, forward-thinking, and strategic by providing them valuable insights on future occurrences. It's a powerful tool that gives companies a significant competitive edge by enabling risk management, opportunity identification, and strategic decision-making.
\ No newline at end of file
diff --git a/src/data/roadmaps/data-analyst/content/100-introduction/101-types-data-analytics/103-prescriptive.md b/src/data/roadmaps/data-analyst/content/100-introduction/101-types-data-analytics/103-prescriptive.md
new file mode 100644
index 000000000..7d1647adf
--- /dev/null
+++ b/src/data/roadmaps/data-analyst/content/100-introduction/101-types-data-analytics/103-prescriptive.md
@@ -0,0 +1,3 @@
+# Prescriptive Analytics
+
+Prescriptive analytics, a crucial type of data analytics, is essential for making data-driven decisions in business and organizational contexts. As a data analyst, the goal of prescriptive analytics is to recommend various actions using predictions on the basis of known parameters to help decision makers understand likely outcomes. Prescriptive analytics employs a blend of techniques and tools such as algorithms, machine learning, computational modelling procedures, and decision-tree structures to enable automated decision making. Therefore, prescriptive analytics not only anticipates what will happen and when it will happen, but also explains why it will happen, contributing to the significance of a data analyst’s role in an organization.
\ No newline at end of file
diff --git a/src/data/roadmaps/data-analyst/content/100-introduction/101-types-data-analytics/index.md b/src/data/roadmaps/data-analyst/content/100-introduction/101-types-data-analytics/index.md
new file mode 100644
index 000000000..d54992ed2
--- /dev/null
+++ b/src/data/roadmaps/data-analyst/content/100-introduction/101-types-data-analytics/index.md
@@ -0,0 +1,5 @@
+# Introduction to Types of Data Analytics
+
+Data Analytics has proven to be a critical part of decision-making in modern business ventures. It is responsible for discovering, interpreting, and transforming data into valuable information. Different types of data analytics look at past, present, or predictive views of business operations.
+
+Data Analysts, as ambassadors of this domain, employ these types, which are namely Descriptive Analytics, Diagnostic Analytics, Predictive Analytics and Prescriptive Analytics, to answer various questions — What happened? Why did it happen? What could happen? And what should we do next? Understanding these types gives data analysts the power to transform raw datasets into strategic insights.
\ No newline at end of file
diff --git a/src/data/roadmaps/data-analyst/content/100-introduction/102-keyconcepts-for-data/100-collection.md b/src/data/roadmaps/data-analyst/content/100-introduction/102-keyconcepts-for-data/100-collection.md
new file mode 100644
index 000000000..4e7a90855
--- /dev/null
+++ b/src/data/roadmaps/data-analyst/content/100-introduction/102-keyconcepts-for-data/100-collection.md
@@ -0,0 +1,3 @@
+# Data Collection
+
+In the realm of data analysis, the concept of collection holds immense importance. As the term suggests, collection refers to the process of gathering and measuring information on targeted variables in an established systematic fashion that enables a data analyst to answer relevant questions and evaluate outcomes. This step is foundational to any data analysis scheme, as it is the first line of interaction with the raw data that later transforms into viable insights. The effectiveness of data analysis is heavily reliant on the quality and quantity of data collected. Different methodologies and tools are employed for data collection depending on the nature of the data needed, such as surveys, observations, experiments, or scraping online data stores. This process should be carried out with clear objectives and careful consideration to ensure accuracy and relevance in the later stages of analysis and decision-making.
\ No newline at end of file
diff --git a/src/data/roadmaps/data-analyst/content/100-introduction/102-keyconcepts-for-data/101-cleanup.md b/src/data/roadmaps/data-analyst/content/100-introduction/102-keyconcepts-for-data/101-cleanup.md
new file mode 100644
index 000000000..8592fdea1
--- /dev/null
+++ b/src/data/roadmaps/data-analyst/content/100-introduction/102-keyconcepts-for-data/101-cleanup.md
@@ -0,0 +1,3 @@
+# Cleanup
+
+The Cleanup of Data is a critical component of a Data Analyst's role. It involves the process of inspecting, cleaning, transforming, and modeling data to discover useful information, inform conclusions, and support decision making. This process is crucial for Data Analysts to generate accurate and significant insights from data, ultimately resulting in better and more informed business decisions. A solid understanding of data cleanup procedures and techniques is a fundamental skill for any Data Analyst. Hence, it is necessary to hold a high emphasis on maintaining data quality by managing data integrity, accuracy, and consistency during the data cleanup process.
\ No newline at end of file
diff --git a/src/data/roadmaps/data-analyst/content/100-introduction/102-keyconcepts-for-data/102-exploration.md b/src/data/roadmaps/data-analyst/content/100-introduction/102-keyconcepts-for-data/102-exploration.md
new file mode 100644
index 000000000..587d761fd
--- /dev/null
+++ b/src/data/roadmaps/data-analyst/content/100-introduction/102-keyconcepts-for-data/102-exploration.md
@@ -0,0 +1,3 @@
+# Exploration
+
+In the realm of data analytics, exploration of data is a key concept that data analysts leverage to understand and interpret data effectively. Typically, this exploration process involves discerning patterns, identifying anomalies, examining underlying structures, and testing hypothesis, which often gets accomplished via descriptive statistics, visual methods, or sophisticated algorithms. It's a fundamental stepping-stone for any data analyst, ultimately guiding them in shaping the direction of further analysis or modeling. This concept serves as a foundation for dealing with complexities and uncertainties in data, hence improving decision-making in various fields ranging from business and finance to healthcare and social sciences.
\ No newline at end of file
diff --git a/src/data/roadmaps/data-analyst/content/100-introduction/102-keyconcepts-for-data/103-visualization.md b/src/data/roadmaps/data-analyst/content/100-introduction/102-keyconcepts-for-data/103-visualization.md
new file mode 100644
index 000000000..1a67d66bc
--- /dev/null
+++ b/src/data/roadmaps/data-analyst/content/100-introduction/102-keyconcepts-for-data/103-visualization.md
@@ -0,0 +1,3 @@
+# Visualization - A Key Concept for Data Analysts
+
+The visualization of data is an essential skill in the toolkit of every data analyst. This practice is about transforming complex raw data into a graphical format that allows for an easier understanding of large data sets, trends, outliers, and important patterns. Whether pie charts, line graphs, bar graphs, or heat maps, data visualization techniques not only streamline data analysis, but also facilitate a more effective communication of the findings to others. This key concept underscores the importance of presenting data in a digestible and visually appealing manner to drive data-informed decision making in an organization.
\ No newline at end of file
diff --git a/src/data/roadmaps/data-analyst/content/100-introduction/102-keyconcepts-for-data/104-statistical-analysis.md b/src/data/roadmaps/data-analyst/content/100-introduction/102-keyconcepts-for-data/104-statistical-analysis.md
new file mode 100644
index 000000000..1321ffcde
--- /dev/null
+++ b/src/data/roadmaps/data-analyst/content/100-introduction/102-keyconcepts-for-data/104-statistical-analysis.md
@@ -0,0 +1,3 @@
+# Statistical Analysis: A Key Concept for Data Analysts
+
+Statistical analysis plays a critical role in the daily functions of a data analyst. It encompasses collecting, examining, interpreting, and present data, enabling data analysts to uncover patterns, trends and relationships, deduce insights and support decision-making in various fields. By applying statistical concepts, data analysts can transform complex data sets into understandable information that organizations can leverage for actionable insights. This cornerstone of data analysis enables analysts to deliver predictive models, trend analysis, and valuable business insights, making it indispensable in the world of data analytics. It is vital for data analysts to grasp such statistical methodologies to effectively decipher large data volumes they handle.
diff --git a/src/data/roadmaps/data-analyst/content/100-introduction/102-keyconcepts-for-data/105-machine-learning.md b/src/data/roadmaps/data-analyst/content/100-introduction/102-keyconcepts-for-data/105-machine-learning.md
new file mode 100644
index 000000000..4b69c7346
--- /dev/null
+++ b/src/data/roadmaps/data-analyst/content/100-introduction/102-keyconcepts-for-data/105-machine-learning.md
@@ -0,0 +1,3 @@
+# Machine Learning - A Key Concept for Data Analysts
+
+Machine learning, a subset of artificial intelligence, is an indispensable tool in the hands of a data analyst. It provides the ability to automatically learn, improve from experience and make decisions without being explicitly programmed. In the context of a data analyst, machine learning contributes significantly in uncovering hidden insights, recognising patterns or making predictions based on large amounts of data. Through the use of varying algorithms and models, data analysts are able to leverage machine learning to convert raw data into meaningful information, making it a critical concept in data analysis.
\ No newline at end of file
diff --git a/src/data/roadmaps/data-analyst/content/100-introduction/102-keyconcepts-for-data/index.md b/src/data/roadmaps/data-analyst/content/100-introduction/102-keyconcepts-for-data/index.md
new file mode 100644
index 000000000..aa4a3b5ef
--- /dev/null
+++ b/src/data/roadmaps/data-analyst/content/100-introduction/102-keyconcepts-for-data/index.md
@@ -0,0 +1,3 @@
+# Introduction to Key Concepts for Data
+
+In the realm of data analysis, understanding some key concepts is essential. Data analysis is the process of inspecting, cleansing, transforming, and modeling data to discover useful information and support decision-making. In the broadest sense, data can be classified into various types like nominal, ordinal, interval and ratio, each with a specific role and analysis technique. Higher-dimensional data types like time-series, panel data, and multi-dimensional arrays are also critical. On the other hand, data quality and data management are key concepts to ensure clean and reliable datasets. With an understanding of these fundamental concepts, a data analyst can transform raw data into meaningful insights.
\ No newline at end of file
diff --git a/src/data/roadmaps/data-analyst/content/100-introduction/index.md b/src/data/roadmaps/data-analyst/content/100-introduction/index.md
new file mode 100644
index 000000000..cd4f1e2cd
--- /dev/null
+++ b/src/data/roadmaps/data-analyst/content/100-introduction/index.md
@@ -0,0 +1,3 @@
+# Introduction to Data Analysis
+
+Data Analysis plays a crucial role in today's data-centric world. It involves the practice of inspecting, cleansing, transforming, and modeling data to extract valuable insights for decision-making. A **Data Analyst** is a professional primarily tasked with collecting, processing, and performing statistical analysis on large datasets. They discover how data can be used to answer questions and solve problems. With the rapid expansion of data in modern firms, the role of a data analyst has been evolving greatly, making them a significant asset in business strategy and decision-making processes.
\ No newline at end of file
diff --git a/src/data/roadmaps/data-analyst/content/101-excel/100-basic-functions/100-sum.md b/src/data/roadmaps/data-analyst/content/101-excel/100-basic-functions/100-sum.md
new file mode 100644
index 000000000..3c48de991
--- /dev/null
+++ b/src/data/roadmaps/data-analyst/content/101-excel/100-basic-functions/100-sum.md
@@ -0,0 +1,3 @@
+# Sum
+
+Sum is one of the most fundamental operations in data analysis. As a data analyst, the ability to quickly and accurately summarize numerical data is key to draw meaningful insights from large data sets. The operation can be performed using various software and programming languages such as Excel, SQL, Python, R etc., each providing distinct methods to compute sums. Understanding the 'sum' operation is critical for tasks such as trend analysis, forecasting, budgeting, and essentially any operation involving quantitative data.
\ No newline at end of file
diff --git a/src/data/roadmaps/data-analyst/content/101-excel/100-basic-functions/101-min-max.md b/src/data/roadmaps/data-analyst/content/101-excel/100-basic-functions/101-min-max.md
new file mode 100644
index 000000000..bc6855ffb
--- /dev/null
+++ b/src/data/roadmaps/data-analyst/content/101-excel/100-basic-functions/101-min-max.md
@@ -0,0 +1,3 @@
+# Min / Max Function
+
+Understanding the minimum and maximum values in your dataset is critical in data analysis. These basic functions, often referred to as Min-Max functions, are statistical tools that data analysts use to inspect the distribution of a particular dataset. By identifying the lowest and highest values, data analysts can gain insight into the range of the dataset, identify possible outliers, and understand the data's variability. Beyond their use in descriptive statistics, Min-Max functions also play a vital role in data normalization, shaping the accuracy of predictive models in Machine Learning and AI fields.
\ No newline at end of file
diff --git a/src/data/roadmaps/data-analyst/content/101-excel/100-basic-functions/102-average.md b/src/data/roadmaps/data-analyst/content/101-excel/100-basic-functions/102-average.md
new file mode 100644
index 000000000..a414b4518
--- /dev/null
+++ b/src/data/roadmaps/data-analyst/content/101-excel/100-basic-functions/102-average.md
@@ -0,0 +1,3 @@
+# Average
+
+The average, also often referred to as the mean, is one of the most commonly used mathematical calculations in data analysis. It provides a simple, useful measure of a set of data. For a data analyst, understanding how to calculate and interpret averages is fundamental. Basic functions, including the average, are integral components in data analysis that are used to summarize and understand complex data sets. Though conceptually simple, the power of average lies in its utility in a range of analyses - from forecasting models to understanding trends and patterns in the dataset.
\ No newline at end of file
diff --git a/src/data/roadmaps/data-analyst/content/101-excel/100-basic-functions/103-count.md b/src/data/roadmaps/data-analyst/content/101-excel/100-basic-functions/103-count.md
new file mode 100644
index 000000000..77173aab0
--- /dev/null
+++ b/src/data/roadmaps/data-analyst/content/101-excel/100-basic-functions/103-count.md
@@ -0,0 +1,3 @@
+# Count
+
+The Count function in data analysis is one of the most fundamental tasks that a Data Analyst gets to handle. This function is a simple yet powerful tool that aids in understanding the underlying data by providing the count or frequency of occurrences of unique elements in data sets. The relevance of count comes into play in various scenarios – from understanding the popularity of a certain category to analyzing customer activity, and much more. This basic function offers crucial insights into data, making it an essential skill in the toolkit of any data analyst.
\ No newline at end of file
diff --git a/src/data/roadmaps/data-analyst/content/101-excel/100-basic-functions/104-concat.md b/src/data/roadmaps/data-analyst/content/101-excel/100-basic-functions/104-concat.md
new file mode 100644
index 000000000..02ced2762
--- /dev/null
+++ b/src/data/roadmaps/data-analyst/content/101-excel/100-basic-functions/104-concat.md
@@ -0,0 +1,3 @@
+# Concatenation
+
+The term 'Concat' or ‘Concatenation’ refers to the operation of combining two or more data structures, be it strings, arrays, or datasets, end-to-end in a sequence. In the context of data analysis, a Data Analyst uses concatenation as a basic function to merge or bind data sets along an axis - either vertically or horizontally. This function is commonly used in data wrangling or preprocessing to combine data from multiple sources, handle missing values, and shape data into a form that fits better with analysis tools. An understanding of 'Concat' plays a crucial role in managing the complex, large data sets that data analysts often work with.
\ No newline at end of file
diff --git a/src/data/roadmaps/data-analyst/content/101-excel/100-basic-functions/105-trim.md b/src/data/roadmaps/data-analyst/content/101-excel/100-basic-functions/105-trim.md
new file mode 100644
index 000000000..8edbc7280
--- /dev/null
+++ b/src/data/roadmaps/data-analyst/content/101-excel/100-basic-functions/105-trim.md
@@ -0,0 +1,3 @@
+# Trim
+
+Trim is considered a basic yet vital function within the scope of data analysis. It plays an integral role in preparing and cleansing the dataset, which is key to analytical accuracy. Trim allows data analysts to streamline dataset by removing extra spaces, unwanted characters, outliers or specific ranges of values, hence, enhancing the data quality. Furthermore, Trim functions can help in reducing the errors, enhancing the efficiency of data modelling and ensuring reliable data insight generation. Understanding Trim function is thus an essential part of a data analyst's toolbox.
\ No newline at end of file
diff --git a/src/data/roadmaps/data-analyst/content/101-excel/100-basic-functions/106-upper-lower-proper.md b/src/data/roadmaps/data-analyst/content/101-excel/100-basic-functions/106-upper-lower-proper.md
new file mode 100644
index 000000000..91a9ff202
--- /dev/null
+++ b/src/data/roadmaps/data-analyst/content/101-excel/100-basic-functions/106-upper-lower-proper.md
@@ -0,0 +1,3 @@
+# Upper, Lower, Proper Functions
+
+In the field of data analysis, the Upper, Lower, and Proper functions serve as fundamental tools for manipulating and transforming text data. A data analyst often works with a vast array of datasets, where the text data may not always adhere to a consistent format. To tackle such issues, the Upper, Lower, and Proper functions are used. 'Upper' converts all the text to uppercase, while 'Lower' does the opposite, transforming all text to lowercase. The 'Proper' function is used to capitalize the first letter of each word, making it proper case. These functions are indispensable when it comes to cleaning and preparing data, a major part of a data analyst's role.
\ No newline at end of file
diff --git a/src/data/roadmaps/data-analyst/content/101-excel/100-basic-functions/107-replace-substitute.md b/src/data/roadmaps/data-analyst/content/101-excel/100-basic-functions/107-replace-substitute.md
new file mode 100644
index 000000000..e7c08cb58
--- /dev/null
+++ b/src/data/roadmaps/data-analyst/content/101-excel/100-basic-functions/107-replace-substitute.md
@@ -0,0 +1,5 @@
+# Replace/Substitute
+
+When working with datasets, there is often a need for a Data Analyst to alter or adjust certain values. This necessity might arise due to incorrect or inaccurate entries, outliers affecting the results, or simply the need to rewrite certain values for better interpretation and analysis of the data. One of the key basic functions that allow for such alterations in the data is the 'replace' or 'substitute' function.
+
+The replace or substitute function provides an efficient way to replace certain values in a dataset with another. This fundamental function is not only applicable to numerals but it is also functional with categorical data. In data analysis, this replace or substitute function is absolutely critical, contributing greatly to data cleaning, manipulation, and subsequently, the accuracy and reliability of the analytical results obtained.
\ No newline at end of file
diff --git a/src/data/roadmaps/data-analyst/content/101-excel/100-basic-functions/108-vlookup-hlookup.md b/src/data/roadmaps/data-analyst/content/101-excel/100-basic-functions/108-vlookup-hlookup.md
new file mode 100644
index 000000000..e557472c0
--- /dev/null
+++ b/src/data/roadmaps/data-analyst/content/101-excel/100-basic-functions/108-vlookup-hlookup.md
@@ -0,0 +1,5 @@
+# vlookup and hlookup
+
+Data Analysts often deal with large and complex datasets that require efficient tools for data manipulation and extraction. This is where basic functions like vlookup and hlookup in Excel become extremely useful. These functions are versatile lookup and reference functions that can find specified data in a vast array, providing ease and convenience in data retrieval tasks.
+
+The Vertical Lookup (vlookup) is used to find data in a table sorted vertically, while the Horizontal Lookup (hlookup) is used on data organized horizontally. Mastering these functions is crucial for any data analyst's toolbox, as they can dramatically speed up data access, reduce errors in data extraction, and simplify the overall process of analysis. In essence, these two functions are not just basic functions; they serve as essential tools for efficient data analysis.
\ No newline at end of file
diff --git a/src/data/roadmaps/data-analyst/content/101-excel/100-basic-functions/109-if.md b/src/data/roadmaps/data-analyst/content/101-excel/100-basic-functions/109-if.md
new file mode 100644
index 000000000..3f5a74165
--- /dev/null
+++ b/src/data/roadmaps/data-analyst/content/101-excel/100-basic-functions/109-if.md
@@ -0,0 +1,3 @@
+# Basic Functions of a Data Analyst
+
+A Data Analyst serves a pivotal role in the decision-making processes within an organization. The basic function of a data analyst involves collecting, processing, and performing statistical analyses of data. Their work encompasses understanding the nature of data, finding out the patterns and insights hidden within them, and communicating these findings in a manner that can facilitate the decision-making of the company. They are often tasked to transform complex data into a format that is easily understandable, which enables the company to make informed decisions. This may involve designing and maintaining databases and data systems, conducting analysis to identify trends, and creating visualizations of their findings. These basic functions are the cornerstones upon which a data analyst builds more complex and organization-specific responsibilities from.
\ No newline at end of file
diff --git a/src/data/roadmaps/data-analyst/content/101-excel/100-basic-functions/110-datedif.md b/src/data/roadmaps/data-analyst/content/101-excel/100-basic-functions/110-datedif.md
new file mode 100644
index 000000000..cbe1dc7e9
--- /dev/null
+++ b/src/data/roadmaps/data-analyst/content/101-excel/100-basic-functions/110-datedif.md
@@ -0,0 +1,3 @@
+# DATEDIF
+
+The `DATEDIF` function is an incredibly valuable tool for a Data Analyst in Excel or Google Sheets, by providing the ability to calculate the difference between two dates. This function takes in three parameters: start date, end date and the type of difference required (measured in years, months, days, etc.). In Data Analysis, particularly when dealing with time-series data or when you need to uncover trends over specific periods, the `DATEDIF` function is a necessary asset. Recognizing its functionality will enable a data analyst to manipulate or shape data progressively and efficiently.
\ No newline at end of file
diff --git a/src/data/roadmaps/data-analyst/content/101-excel/100-basic-functions/index.md b/src/data/roadmaps/data-analyst/content/101-excel/100-basic-functions/index.md
new file mode 100644
index 000000000..fff2c3da0
--- /dev/null
+++ b/src/data/roadmaps/data-analyst/content/101-excel/100-basic-functions/index.md
@@ -0,0 +1,3 @@
+# Understanding Basic Functions
+
+As a Data Analyst, Excel is an extremely powerful tool that you will interact with on a daily basis. From organizing data into spreadsheets, performing calculations with complex formulas, to creating graphs and visual aids in presenting the data, the basic functions of Excel are crucial in your role. Excel’s plethora of complex and simple functions make it a unique, versatile, and accessible tool for data analysis. Understanding these basic functions not only elevates the expertise in handling and interpreting data but also increases efficiency and productivity in your line of work. Whether you're calculating, extracting or merging data, Excel’s basic functions can make these tasks more straightforward ensuring the necessary accuracy of the data insights you provide.
\ No newline at end of file
diff --git a/src/data/roadmaps/data-analyst/content/101-excel/101-pivot-tables.md b/src/data/roadmaps/data-analyst/content/101-excel/101-pivot-tables.md
new file mode 100644
index 000000000..531b5f582
--- /dev/null
+++ b/src/data/roadmaps/data-analyst/content/101-excel/101-pivot-tables.md
@@ -0,0 +1,3 @@
+# Pivot Tables
+
+Data Analysts recurrently find the need to summarize, investigate, and analyze their data to make meaningful and insightful decisions. One of the most powerful tools to accomplish this in Microsoft Excel is the Pivot Table. Pivot Tables allow analysts to organize and summarize large quantities of data in a concise, tabular format. The strength of pivot tables comes from their ability to manipulate data dynamically, leading to quicker analysis and richer insights. Understanding and employing Pivot Tables efficiently is a fundamental skill for any data analyst, as it directly impacts their ability to derive significant information from raw datasets.
\ No newline at end of file
diff --git a/src/data/roadmaps/data-analyst/content/101-excel/102-charting.md b/src/data/roadmaps/data-analyst/content/101-excel/102-charting.md
new file mode 100644
index 000000000..ae994582f
--- /dev/null
+++ b/src/data/roadmaps/data-analyst/content/101-excel/102-charting.md
@@ -0,0 +1,3 @@
+# Charting
+
+Excel serves as a powerful tool for data analysts when it comes to data organization, manipulation, recovery, and visualization. One of the incredible features it offers is 'Charting'. Charting essentially means creating visual representations of data, which aids data analysts to easily understand complex data and showcase compelling stories of data trends, correlations, and statistical analysis. These charts vary from simple bar graphs to more complex 3D surface and stock charts. As a data analyst, mastering charting under Excel substantially enhances data interpretation, making it easier to extract meaningful insights from substantial data sets.
\ No newline at end of file
diff --git a/src/data/roadmaps/data-analyst/content/101-excel/index.md b/src/data/roadmaps/data-analyst/content/101-excel/index.md
new file mode 100644
index 000000000..c52be4531
--- /dev/null
+++ b/src/data/roadmaps/data-analyst/content/101-excel/index.md
@@ -0,0 +1,3 @@
+# Excel
+
+Excel is a powerful tool utilized by data analysts worldwide to store, manipulate, and analyze data. It offers a vast array of features such as pivot tables, graphs and a powerful suite of formulas and functions to help sift through large sets of data. A data analyst uses Excel to perform a wide range of tasks, from simple data entry and cleaning, to more complex statistical analysis and predictive modeling. Proficiency in Excel is often a key requirement for a data analyst, as its versatility and ubiquity make it an indispensable tool in the field of data analysis.
\ No newline at end of file
diff --git a/src/data/roadmaps/data-analyst/content/102-sql.md b/src/data/roadmaps/data-analyst/content/102-sql.md
new file mode 100644
index 000000000..177b38e6c
--- /dev/null
+++ b/src/data/roadmaps/data-analyst/content/102-sql.md
@@ -0,0 +1,3 @@
+# SQL for Data Analysts
+
+Structured Query Language, or SQL, is an essential tool for every data analyst. As a domain-specific language used in programming and designed for managing data held in relational database management systems, SQL allows analysts to manipulate and analyse large volumes of data efficiently. Understanding SQL allows a data analyst to extract insights from data stored in databases, conduct complex queries, and create elaborate data reports. SQL is recognized for its effectiveness in data manipulation and its compatibility with other coding languages, making it a fundamental competency in the data analytics field.
\ No newline at end of file
diff --git a/src/data/roadmaps/data-analyst/content/103-programming-language/100-python.md b/src/data/roadmaps/data-analyst/content/103-programming-language/100-python.md
new file mode 100644
index 000000000..905abe659
--- /dev/null
+++ b/src/data/roadmaps/data-analyst/content/103-programming-language/100-python.md
@@ -0,0 +1,3 @@
+# Python as a Programming Language
+
+Python is a powerful, flexible, open-source programming language that is incredibly impactful in the realm of data analysis. As a data analyst, you are typically required to clean, interpret, visualize and present data, and Python, being versatile and well-supported, has libraries and frameworks like Pandas, Numpy, Matplotlib, and Seaborn which make these tasks easier and efficient. It is a favorite language among data analysts and data scientists due to its simplicity to learn and readability. Understanding Python can greatly enhance the capabilities and effectiveness of a data analyst.
\ No newline at end of file
diff --git a/src/data/roadmaps/data-analyst/content/103-programming-language/101-r.md b/src/data/roadmaps/data-analyst/content/103-programming-language/101-r.md
new file mode 100644
index 000000000..6376407a8
--- /dev/null
+++ b/src/data/roadmaps/data-analyst/content/103-programming-language/101-r.md
@@ -0,0 +1,3 @@
+# R
+
+R is a powerful language profoundly used by data analysts and statisticians across the globe. Offering a wide array of statistical and graphical techniques, R proves to be an excellent tool for data manipulation, statistical modeling and visualization. With its comprehensive collection of packages and built-in functions for data analysis, R allows data analysts to perform complex exploratory data analysis, build sophisticated models and create stunning visualizations. Moreover, given its open-source nature, R consistently advances with contributions from the worldwide statistical community.
\ No newline at end of file
diff --git a/src/data/roadmaps/data-analyst/content/103-programming-language/index.md b/src/data/roadmaps/data-analyst/content/103-programming-language/index.md
new file mode 100644
index 000000000..c76e40c15
--- /dev/null
+++ b/src/data/roadmaps/data-analyst/content/103-programming-language/index.md
@@ -0,0 +1,3 @@
+# Programming Language for Data Analysts
+
+As a data analyst, programming languages are crucial tools in your line of work. They not only help in collection and cleanup of data, but also assist in analyzing it to generate insightful reports and predictions. These languages can be employed to create algorithms for complex computations, model data, and visualizations amongst other tasks. Familiarity and proficiency in several programming languages can give data analysts a significant competitive edge, enhancing their ability to draw useful business insights from raw data. Examples of commonly used programming languages in data analysis include SQL, Python, R, Java and SAS.
\ No newline at end of file
diff --git a/src/data/roadmaps/data-analyst/content/104-data-manipulation-libraries/100-pandas.md b/src/data/roadmaps/data-analyst/content/104-data-manipulation-libraries/100-pandas.md
new file mode 100644
index 000000000..8a59ddd5b
--- /dev/null
+++ b/src/data/roadmaps/data-analyst/content/104-data-manipulation-libraries/100-pandas.md
@@ -0,0 +1,3 @@
+# Pandas
+
+Pandas is a widely acknowledged and highly useful data manipulation library in the world of data analysis. Known for its robust features like data cleaning, wrangling and analysis, pandas has become one of the go-to tools for data analysts. Built on NumPy, it provides high-performance, easy-to-use data structures and data analysis tools. In essence, its flexibility and versatility make it a critical part of the data analyst's toolkit, as it holds the capability to cater to virtually every data manipulation task.
\ No newline at end of file
diff --git a/src/data/roadmaps/data-analyst/content/104-data-manipulation-libraries/101-dplyr.md b/src/data/roadmaps/data-analyst/content/104-data-manipulation-libraries/101-dplyr.md
new file mode 100644
index 000000000..7f8530015
--- /dev/null
+++ b/src/data/roadmaps/data-analyst/content/104-data-manipulation-libraries/101-dplyr.md
@@ -0,0 +1,3 @@
+# Dplyr
+
+Dplyr is a powerful and popular toolkit for data manipulation in R. As a data analyst, this library provides integral functions to manipulate, clean, and process data efficiently. It has been designed to be easy and intuitive, ensuring a robust and consistent syntax. Dplyr ensures data reliability and fast processing, essential for analysts dealing with large datasets. With a strong focus on efficiency, dplyr functions like select, filter, arrange, mutate, summarise, and group_by optimise data analysis operations, making data manipulation a smoother and hassle-free procedure for data analysts.
\ No newline at end of file
diff --git a/src/data/roadmaps/data-analyst/content/104-data-manipulation-libraries/index.md b/src/data/roadmaps/data-analyst/content/104-data-manipulation-libraries/index.md
new file mode 100644
index 000000000..b123e0794
--- /dev/null
+++ b/src/data/roadmaps/data-analyst/content/104-data-manipulation-libraries/index.md
@@ -0,0 +1,3 @@
+# Data Manipulation Libraries
+
+Data manipulation is a key aspect of the role of a data analyst. There are numerous data manipulation libraries available that enable data analysts to handle, process and analyze massive datasets effectively and efficiently. These libraries, particularly in programming languages like Python, R, and more, come with a wide range of functionalities that include sorting, filtering, aggregating, merging and reshaping data. Using data manipulation libraries, data analysts can transform raw data into a more understandable or usable format to derive meaningful insights or conclusions. A few examples of these libraries are Pandas in Python, dplyr in R, and DataTable in Julia. These libraries not only make data manipulation tasks easier but also contribute to improving the overall data analysis process.
\ No newline at end of file
diff --git a/src/data/roadmaps/data-analyst/content/105-data-visualization-libraries/100-matplotlib.md b/src/data/roadmaps/data-analyst/content/105-data-visualization-libraries/100-matplotlib.md
new file mode 100644
index 000000000..66de0ec80
--- /dev/null
+++ b/src/data/roadmaps/data-analyst/content/105-data-visualization-libraries/100-matplotlib.md
@@ -0,0 +1,3 @@
+# Matplotlib
+
+Matplotlib is a paramount data visualization library used extensively by data analysts for generating a wide array of plots and graphs. Through Matplotlib, data analysts can convey results clearly and effectively, driving insights from complex data sets. It offers a hierarchical environment which is very natural for a data scientist to work with. Providing an object-oriented API, it allows for extensive customization and integration into larger applications. From histograms, bar charts, scatter plots to 3D graphs, the versatility of Matplotlib assists data analysts in the better comprehension and compelling representation of data.
\ No newline at end of file
diff --git a/src/data/roadmaps/data-analyst/content/105-data-visualization-libraries/101-ggplot2.md b/src/data/roadmaps/data-analyst/content/105-data-visualization-libraries/101-ggplot2.md
new file mode 100644
index 000000000..283748240
--- /dev/null
+++ b/src/data/roadmaps/data-analyst/content/105-data-visualization-libraries/101-ggplot2.md
@@ -0,0 +1,3 @@
+# ggplot2
+
+When it comes to data visualization in R programming, ggplot2 stands tall as one of the primary tools for data analysts. This data visualization library, which forms part of the tidyverse suite of packages, facilitates the creation of complex and sophisticated visual narratives. With its grammar of graphics philosophy, ggplot2 enables analysts to build graphs and charts layer by layer, thereby offering detailed control over graphical features and design. Its versatility in creating tailored and aesthetically pleasing graphics is a vital asset for any data analyst tackling exploratory data analysis, reporting, or dashboard building.
\ No newline at end of file
diff --git a/src/data/roadmaps/data-analyst/content/105-data-visualization-libraries/index.md b/src/data/roadmaps/data-analyst/content/105-data-visualization-libraries/index.md
new file mode 100644
index 000000000..d22471baf
--- /dev/null
+++ b/src/data/roadmaps/data-analyst/content/105-data-visualization-libraries/index.md
@@ -0,0 +1,3 @@
+# Data Visualization Libraries
+
+Data visualization is a critical part of any data analysis process. It allows data analysts to understand complex data sets by converting a myriad of numbers into engaging, meaningful visuals. Data visualization libraries are toolkits enabling this transformation. They consist of pre-built functions and methods to create visuals such as graphs, charts, maps, and many more from raw data. This gives data analysts the capacity to present their findings in an insightful, easy-to-understand manner for stakeholders. Popular libraries include `Matplotlib`, `Seaborn`, `Plotly`, and `Bokeh` in Python, and `ggplot2` in R, each varying in their features, complexity, and flexibility.
\ No newline at end of file
diff --git a/src/data/roadmaps/data-analyst/content/106-data-collection/100-databases.md b/src/data/roadmaps/data-analyst/content/106-data-collection/100-databases.md
new file mode 100644
index 000000000..db66da8c4
--- /dev/null
+++ b/src/data/roadmaps/data-analyst/content/106-data-collection/100-databases.md
@@ -0,0 +1,3 @@
+# Databases
+
+Behind every strong data analyst, there's not just a rich assortment of data, but a set of robust databases that enable effective data collection. Databases are a fundamental aspect of data collection in a world where the capability to manage, organize, and evaluate large volumes of data is critical. As a data analyst, the understanding and use of databases is instrumental in capturing the necessary data for conducting qualitative and quantitative analysis, forecasting trends and making data-driven decisions. Thorough knowledge of databases, therefore, can be considered a key component of a data analyst's arsenal. These databases can vary from relational databases like SQL to NoSQL databases like MongoDB, each serving a unique role in the data collection process.
\ No newline at end of file
diff --git a/src/data/roadmaps/data-analyst/content/106-data-collection/101-csv-files.md b/src/data/roadmaps/data-analyst/content/106-data-collection/101-csv-files.md
new file mode 100644
index 000000000..8bcab3acb
--- /dev/null
+++ b/src/data/roadmaps/data-analyst/content/106-data-collection/101-csv-files.md
@@ -0,0 +1,3 @@
+# CSV Files in Data Collection for Data Analysts
+
+CSV or Comma Separated Values files play an integral role in data collection for data analysts. These file types allow the efficient storage of data and are commonly generated by spreadsheet software like Microsoft Excel or Google Sheets, but their simplicity makes them compatible with a variety of applications that deal with data. In the context of data analysis, CSV files are extensively used to import and export large datasets, making them essential for any data analyst's toolkit. They allow analysts to organize vast amounts of information into a structured format, which is fundamental in extracting useful insights from raw data.
\ No newline at end of file
diff --git a/src/data/roadmaps/data-analyst/content/106-data-collection/102-apis.md b/src/data/roadmaps/data-analyst/content/106-data-collection/102-apis.md
new file mode 100644
index 000000000..0934b5570
--- /dev/null
+++ b/src/data/roadmaps/data-analyst/content/106-data-collection/102-apis.md
@@ -0,0 +1,3 @@
+# APIs and Data Collection
+
+Application Programming Interfaces, better known as APIs, play a fundamental role in the work of data analysts, particularly in the process of data collection. APIs are sets of protocols, routines, and tools that enable different software applications to communicate with each other. In data analysis, APIs are used extensively to collect, exchange, and manipulate data from different sources in a secure and efficient manner. This data collection process is paramount in shaping the insights derived by the analysts.
\ No newline at end of file
diff --git a/src/data/roadmaps/data-analyst/content/106-data-collection/103-web-scraping.md b/src/data/roadmaps/data-analyst/content/106-data-collection/103-web-scraping.md
new file mode 100644
index 000000000..eb94e2aae
--- /dev/null
+++ b/src/data/roadmaps/data-analyst/content/106-data-collection/103-web-scraping.md
@@ -0,0 +1,3 @@
+# Web Scraping
+
+Web scraping plays a significant role in collecting unique datasets for data analysis. In the realm of a data analyst's tasks, web scraping refers to the method of extracting information from websites and converting it into a structured usable format like a CSV, Excel spreadsheet, or even into databases. This technique allows data analysts to gather large sets of data from the internet, which otherwise could be time-consuming if done manually. The capability of web scraping and parsing data effectively can give data analysts a competitive edge in their data analysis process, from unlocking in-depth, insightful information to making data-driven decisions.
\ No newline at end of file
diff --git a/src/data/roadmaps/data-analyst/content/106-data-collection/index.md b/src/data/roadmaps/data-analyst/content/106-data-collection/index.md
new file mode 100644
index 000000000..84cdc070e
--- /dev/null
+++ b/src/data/roadmaps/data-analyst/content/106-data-collection/index.md
@@ -0,0 +1,3 @@
+# Data Collection
+
+In the context of the Data Analyst role, data collection is a foundational process that entails gathering relevant data from various sources. This data can be quantitative or qualitative and may be sourced from databases, online platforms, customer feedback, among others. The gathered information is then cleaned, processed, and interpreted to extract meaningful insights. A data analyst performs this whole process carefully, as the quality of data is paramount to ensuring accurate analysis, which in turn informs business decisions and strategies. This highlights the importance of an excellent understanding, proper tools, and precise techniques when it comes to data collection in data analysis.
\ No newline at end of file
diff --git a/src/data/roadmaps/data-analyst/content/107-data-cleaning/100-missing-data.md b/src/data/roadmaps/data-analyst/content/107-data-cleaning/100-missing-data.md
new file mode 100644
index 000000000..2d13199df
--- /dev/null
+++ b/src/data/roadmaps/data-analyst/content/107-data-cleaning/100-missing-data.md
@@ -0,0 +1,5 @@
+# Handling Missing Data in Data Cleaning
+
+When working with real-world data as a Data Analyst, encountering missing or null values is quite prevalent. This phenomenon is referred to as "Missing Data" in the field of data analysis. Missing data can severely impact the results of a data analysis process since it reduces the statistical power, which can distort the reliability and robustness of outcomes.
+
+Missing data is a part of the 'Data Cleaning' step which is a crucial part of the Preprocessing in Data Analytics. It involves identifying incomplete, incorrect or irrelevant data and then replacing, modifying or deleting this dirty data. Successful data cleaning of missing values can significantly augment the overall quality of the data, therefore offering valuable and reliable insights. It is essential for a Data Analyst to understand the different techniques for dealing with missing data, such as different types of imputations based on the nature of the data and research question.
\ No newline at end of file
diff --git a/src/data/roadmaps/data-analyst/content/107-data-cleaning/101-removing-duplicates.md b/src/data/roadmaps/data-analyst/content/107-data-cleaning/101-removing-duplicates.md
new file mode 100644
index 000000000..6c5e3e6e5
--- /dev/null
+++ b/src/data/roadmaps/data-analyst/content/107-data-cleaning/101-removing-duplicates.md
@@ -0,0 +1,3 @@
+# Removing Duplicates
+
+In the world of data analysis, a critical step is data cleaning, that includes an important sub-task: removing duplicate entries. Duplicate data can distort the results of data analysis by giving extra weight to duplicate instances and leading to biased or incorrect conclusions. Despite the quality of data collection, there's a high probability that datasets may contain duplicate records due to various factors like human error, merging datasets, etc. Therefore, data analysts must master the skill of identifying and removing duplicates to ensure that their analysis is based on a unique, accurate, and diverse set of data. This process contributes to more accurate predictions and inferences, thus maximizing the insights gained from the data.
\ No newline at end of file
diff --git a/src/data/roadmaps/data-analyst/content/107-data-cleaning/102-finding-outliers.md b/src/data/roadmaps/data-analyst/content/107-data-cleaning/102-finding-outliers.md
new file mode 100644
index 000000000..f2bed3b34
--- /dev/null
+++ b/src/data/roadmaps/data-analyst/content/107-data-cleaning/102-finding-outliers.md
@@ -0,0 +1,3 @@
+# Finding Outliers
+
+In the field of data analysis, data cleaning is an essential and preliminary step. This process involves correcting or removing any errors, inaccuracy, or irrelevance present in the obtained raw data, making it more suitable for analysis. One crucial aspect of this process is "finding outliers". Outliers are unusual or surprising data points that deviate significantly from the rest of the data. While they may be the result of mere variability or error, they will often pull the aggregate data towards them, skewing the results and impeding the accuracy of data analysis. Therefore, identifying and appropriately handling these outliers is crucial to ensure the reliability of subsequent data analysis tasks.
\ No newline at end of file
diff --git a/src/data/roadmaps/data-analyst/content/107-data-cleaning/103-data-transformation.md b/src/data/roadmaps/data-analyst/content/107-data-cleaning/103-data-transformation.md
new file mode 100644
index 000000000..737114639
--- /dev/null
+++ b/src/data/roadmaps/data-analyst/content/107-data-cleaning/103-data-transformation.md
@@ -0,0 +1,3 @@
+# Data Transformation
+
+Data Transformation, also known as Data Wrangling, is an essential part of a Data Analyst's role. This process involves the conversion of data from a raw format into another format to make it more appropriate and valuable for a variety of downstream purposes such as analytics. Data Analysts transform data to make the data more suitable for analysis, ensure accuracy, and to improve data quality. The right transformation techniques can give the data a structure, multiply its value, and enhance the accuracy of the analytics performed by serving meaningful results.
\ No newline at end of file
diff --git a/src/data/roadmaps/data-analyst/content/107-data-cleaning/104-pandas.md b/src/data/roadmaps/data-analyst/content/107-data-cleaning/104-pandas.md
new file mode 100644
index 000000000..43a0a6574
--- /dev/null
+++ b/src/data/roadmaps/data-analyst/content/107-data-cleaning/104-pandas.md
@@ -0,0 +1,3 @@
+# Pandas for Data Cleaning
+
+In the realms of data analysis, data cleaning is a crucial preliminary process, this is where `pandas` - a popular python library - shines. Primarily used for data manipulation and analysis, pandas adopts a flexible and powerful data structure (DataFrames and Series) that greatly simplifies the process of cleaning raw, messy datasets. Data analysts often work with large volumes of data, some of which may contain missing or inconsistent data that can negatively impact the results of their analysis. By utilizing pandas, data analysts can quickly identify, manage and fill these missing values, drop unnecessary columns, rename column headings, filter specific data, apply functions for more complex data transformations and much more. Thus, making pandas an invaluable tool for effective data cleaning in data analysis.
\ No newline at end of file
diff --git a/src/data/roadmaps/data-analyst/content/107-data-cleaning/105-dplyr.md b/src/data/roadmaps/data-analyst/content/107-data-cleaning/105-dplyr.md
new file mode 100644
index 000000000..656974dcc
--- /dev/null
+++ b/src/data/roadmaps/data-analyst/content/107-data-cleaning/105-dplyr.md
@@ -0,0 +1,3 @@
+# Data Cleaning with dplyr
+
+Data cleaning plays a crucial role in the data analysis pipeline, where it rectifies and enhances the quality of data to increase the efficiency and authenticity of the analytical process. The `dplyr` package, an integral part of the `tidyverse` suite in R, has become a staple in the toolkit of data analysts dealing with data cleaning. `dplyr` offers a coherent set of verbs that significantly simplifies the process of manipulating data structures, such as dataframes and databases. This involves selecting, sorting, filtering, creating or modifying variables, and aggregating records, among other operations. Incorporating `dplyr` into the data cleaning phase enables data analysts to perform operations more effectively, improve code readability, and handle large and complex data with ease.
\ No newline at end of file
diff --git a/src/data/roadmaps/data-analyst/content/107-data-cleaning/index.md b/src/data/roadmaps/data-analyst/content/107-data-cleaning/index.md
new file mode 100644
index 000000000..05a485e75
--- /dev/null
+++ b/src/data/roadmaps/data-analyst/content/107-data-cleaning/index.md
@@ -0,0 +1,3 @@
+# Data Cleaning
+
+Data cleaning, which is often referred as data cleansing or data scrubbing, is one of the most important and initial steps in the data analysis process. As a data analyst, the bulk of your work often revolves around understanding, cleaning, and standardizing raw data before analysis. Data cleaning involves identifying, correcting or removing any errors or inconsistencies in datasets in order to improve their quality. The process is crucial because it directly determines the accuracy of the insights you generate - garbage in, garbage out. Even the most sophisticated models and visualizations would not be of much use if they're based on dirty data. Therefore, mastering data cleaning techniques is essential for any data analyst.
\ No newline at end of file
diff --git a/src/data/roadmaps/data-analyst/content/108-descriptive-analysis/100-central-tendency/100-mean.md b/src/data/roadmaps/data-analyst/content/108-descriptive-analysis/100-central-tendency/100-mean.md
new file mode 100644
index 000000000..764b25364
--- /dev/null
+++ b/src/data/roadmaps/data-analyst/content/108-descriptive-analysis/100-central-tendency/100-mean.md
@@ -0,0 +1,3 @@
+# Mean
+
+Central tendency refers to the statistical measure that identifies a single value as representative of an entire distribution. The mean or average is one of the most popular and widely used measures of central tendency. For a data analyst, calculating the mean is a routine task. This single value provides an analyst with a quick snapshot of the data and could be useful for further data manipulation or statistical analysis. Mean is particularly helpful in predicting trends and patterns within voluminous data sets or adjusting influencing factors that may distort the 'true' representation of the data. It is the arithmetic average of a range of values or quantities, computed as the total sum of all the values divided by the total number of values.
diff --git a/src/data/roadmaps/data-analyst/content/108-descriptive-analysis/100-central-tendency/101-median.md b/src/data/roadmaps/data-analyst/content/108-descriptive-analysis/100-central-tendency/101-median.md
new file mode 100644
index 000000000..5ebde0a87
--- /dev/null
+++ b/src/data/roadmaps/data-analyst/content/108-descriptive-analysis/100-central-tendency/101-median.md
@@ -0,0 +1,3 @@
+# Median
+
+Median signifies the middle value in a data set when arranged in ascending or descending order. As a data analyst, understanding, calculating, and interpreting the median is crucial. It is especially helpful when dealing with outliers in a dataset as the median is less sensitive to extreme values. Thus, providing a more realistic 'central' value for skewed distributions. This measure is a reliable reflection of the dataset and is widely used in fields like real estate, economics, and finance for data interpretation and decision-making.
\ No newline at end of file
diff --git a/src/data/roadmaps/data-analyst/content/108-descriptive-analysis/100-central-tendency/102-mode.md b/src/data/roadmaps/data-analyst/content/108-descriptive-analysis/100-central-tendency/102-mode.md
new file mode 100644
index 000000000..d8645abce
--- /dev/null
+++ b/src/data/roadmaps/data-analyst/content/108-descriptive-analysis/100-central-tendency/102-mode.md
@@ -0,0 +1,7 @@
+# Mode
+
+The concept of central tendency is fundamental in statistics and has numerous applications in data analysis. From a data analyst's perspective, the central tendencies like mean, median, and mode can be highly informative about the nature of data. Among these, the "Mode" is often underappreciated, yet it plays an essential role in interpreting datasets.
+
+The mode, in essence, represents the most frequently occurring value in a dataset. While it may appear simplistic, the mode's ability to identify the most common value can be instrumental in a wide range of scenarios, like market research, customer behavior analysis, or trend identification. For instance, a data analyst can use the mode to determine the most popular product in a sales dataset or identify the most commonly reported bug in a software bug log.
+
+Beyond these, utilizing the mode along with the other measures of central tendency (mean and median) can provide a more rounded view of your data. This approach personifies the diversity that's often required in data analytic strategies to account for different data distributions and outliers. The mode, therefore, forms an integral part of the data analyst's toolkit for statistical data interpretation.
\ No newline at end of file
diff --git a/src/data/roadmaps/data-analyst/content/108-descriptive-analysis/100-central-tendency/103-average.md b/src/data/roadmaps/data-analyst/content/108-descriptive-analysis/100-central-tendency/103-average.md
new file mode 100644
index 000000000..052c31785
--- /dev/null
+++ b/src/data/roadmaps/data-analyst/content/108-descriptive-analysis/100-central-tendency/103-average.md
@@ -0,0 +1,3 @@
+# Average
+
+When focusing on data analysis, understanding key statistical concepts is crucial. Amongst these, central tendency is a foundational element. Central Tendency refers to the measure that determines the center of a distribution. The average is a commonly used statistical tool by which data analysts discern trends and patterns. As one of the most recognized forms of central tendency, figuring out the "average" involves summing all values in a data set and dividing by the number of values. This provides analysts with a 'typical' value, around which the remaining data tends to cluster, facilitating better decision-making based on existing data.
\ No newline at end of file
diff --git a/src/data/roadmaps/data-analyst/content/108-descriptive-analysis/100-central-tendency/index.md b/src/data/roadmaps/data-analyst/content/108-descriptive-analysis/100-central-tendency/index.md
new file mode 100644
index 000000000..bce95fde7
--- /dev/null
+++ b/src/data/roadmaps/data-analyst/content/108-descriptive-analysis/100-central-tendency/index.md
@@ -0,0 +1,3 @@
+# Central Tendency
+
+Descriptive analysis is a significant branch in the field of data analytics, and under this, the concept of Central Tendency plays a vital role. As data analysts, understanding central tendency is of paramount importance as it offers a quick summary of the data. It provides information about the center point around which the numerical data is distributed. The three major types of the central tendency include the Mean, Median, and Mode. These measures are used by data analysts to identify trends, make comparisons, or draw conclusions. Therefore, an understanding of central tendency equips data analysts with essential tools for interpreting and making sense of statistical data.
\ No newline at end of file
diff --git a/src/data/roadmaps/data-analyst/content/108-descriptive-analysis/101-dispersion/100-range.md b/src/data/roadmaps/data-analyst/content/108-descriptive-analysis/101-dispersion/100-range.md
new file mode 100644
index 000000000..6564c3276
--- /dev/null
+++ b/src/data/roadmaps/data-analyst/content/108-descriptive-analysis/101-dispersion/100-range.md
@@ -0,0 +1,3 @@
+# Range
+
+The concept of Range refers to the spread of a dataset, primarily in the realm of statistics and data analysis. This measure is crucial for a data analyst as it provides an understanding of the variability amongst the numbers within a dataset. Specifically in a role such as Data Analyst, understanding the range and dispersion aids in making more precise analyses and predictions. Understanding the dispersion within a range can highlight anomalies, identify standard norms, and form the foundation for statistical conclusions like the standard deviation, variance, and interquartile range. It allows for the comprehension of the reliability and stability of particular datasets, which can help guide strategic decisions in many industries. Therefore, range is a key concept that every data analyst must master.
\ No newline at end of file
diff --git a/src/data/roadmaps/data-analyst/content/108-descriptive-analysis/101-dispersion/101-variance.md b/src/data/roadmaps/data-analyst/content/108-descriptive-analysis/101-dispersion/101-variance.md
new file mode 100644
index 000000000..d9552bb09
--- /dev/null
+++ b/src/data/roadmaps/data-analyst/content/108-descriptive-analysis/101-dispersion/101-variance.md
@@ -0,0 +1,3 @@
+# Variance as a Measure of Dispersion
+
+Data analysts heavily rely on statistical concepts to analyze and interpret data, and one such fundamental concept is variance. Variance, an essential measure of dispersion, quantifies the spread of data, providing insight into the level of variability within the dataset. Understanding variance is crucial for data analysts as the reliability of many statistical models depends on the assumption of constant variance across observations. In other words, it helps analysts determine how much data points diverge from the expected value or mean, which can be pivotal in identifying outliers, understanding data distribution, and driving decision-making processes. However, variance can't be interpreted in the original units of measurement due to its squared nature, which is why it is often used in conjunction with its square root, the standard deviation.
\ No newline at end of file
diff --git a/src/data/roadmaps/data-analyst/content/108-descriptive-analysis/101-dispersion/102-standard-deviation.md b/src/data/roadmaps/data-analyst/content/108-descriptive-analysis/101-dispersion/102-standard-deviation.md
new file mode 100644
index 000000000..c60557c7d
--- /dev/null
+++ b/src/data/roadmaps/data-analyst/content/108-descriptive-analysis/101-dispersion/102-standard-deviation.md
@@ -0,0 +1,3 @@
+# Standard Deviation
+
+In the realm of data analysis, the concept of dispersion plays a critical role in understanding and interpreting data. One of the key measures of dispersion is the Standard Deviation. As a data analyst, understanding the standard deviation is crucial as it gives insight into how much variation or dispersion exists from the average (mean), or expected value. A low standard deviation indicates that the data points are generally close to the mean, while a high standard deviation implies that the data points are spread out over a wider range. By mastering the concept of standard deviation and other statistical tools related to dispersion, data analysts are better equipped to provide meaningful analyses and insights from the available data.
\ No newline at end of file
diff --git a/src/data/roadmaps/data-analyst/content/108-descriptive-analysis/101-dispersion/index.md b/src/data/roadmaps/data-analyst/content/108-descriptive-analysis/101-dispersion/index.md
new file mode 100644
index 000000000..654473af3
--- /dev/null
+++ b/src/data/roadmaps/data-analyst/content/108-descriptive-analysis/101-dispersion/index.md
@@ -0,0 +1,3 @@
+# Dispersion
+
+Dispersion in descriptive analysis, specifically for a data analyst, offers a crucial way to understand the variability or spread in a set of data. Descriptive analysis focus on describing and summarizing data to find patterns, relationships, or trends. Distinct measures of dispersion such as range, variance, standard deviation, and interquartile range gives data analysts insight into how spread out data points are, and how reliable any patterns detected may be. This understanding of dispersion helps data analysts in identifying outliers, drawing meaningful conclusions, and making informed predictions.
\ No newline at end of file
diff --git a/src/data/roadmaps/data-analyst/content/108-descriptive-analysis/102-distribution-shape/100-skewness.md b/src/data/roadmaps/data-analyst/content/108-descriptive-analysis/102-distribution-shape/100-skewness.md
new file mode 100644
index 000000000..5114949bd
--- /dev/null
+++ b/src/data/roadmaps/data-analyst/content/108-descriptive-analysis/102-distribution-shape/100-skewness.md
@@ -0,0 +1,3 @@
+# Skewness
+
+Skewness is a crucial statistical concept driven by data analysis and is a significant parameter in understanding the distribution shape of a dataset. In essence, skewness provides a measure to define the extent and direction of asymmetry in data. A positive skewness indicates a distribution with an asymmetric tail extending towards more positive values, while a negative skew indicates a distribution with an asymmetric tail extending towards more negative values. For a data analyst, recognizing and analyzing skewness is essential as it can greatly influence model selection, prediction accuracy, and interpretation of results.
\ No newline at end of file
diff --git a/src/data/roadmaps/data-analyst/content/108-descriptive-analysis/102-distribution-shape/101-kurtosis.md b/src/data/roadmaps/data-analyst/content/108-descriptive-analysis/102-distribution-shape/101-kurtosis.md
new file mode 100644
index 000000000..099fbcaf0
--- /dev/null
+++ b/src/data/roadmaps/data-analyst/content/108-descriptive-analysis/102-distribution-shape/101-kurtosis.md
@@ -0,0 +1,3 @@
+# Kurtosis
+
+Understanding distribution shapes is an integral part of a Data Analyst's daily responsibilities. When they inspect statistical data, one key feature they consider is the kurtosis of the distribution. In statistics, kurtosis identifies the heaviness of the distribution tails and the sharpness of the peak. A proper understanding of kurtosis can assist Analysts in risk management, outlier detection, and provides deeper insight into variations. Therefore, being proficient in interpreting kurtosis measurements of a distribution shape is a significant skill that every data analyst should master.
\ No newline at end of file
diff --git a/src/data/roadmaps/data-analyst/content/108-descriptive-analysis/102-distribution-shape/index.md b/src/data/roadmaps/data-analyst/content/108-descriptive-analysis/102-distribution-shape/index.md
new file mode 100644
index 000000000..d5e4d5e11
--- /dev/null
+++ b/src/data/roadmaps/data-analyst/content/108-descriptive-analysis/102-distribution-shape/index.md
@@ -0,0 +1,3 @@
+# Distribution Shape
+
+In the realm of Data Analysis, the distribution shape is considered as an essential component under descriptive analysis. A data analyst uses the shape of the distribution to understand the spread and trend of the data set. It aids in identifying the skewness (asymmetry) and kurtosis (the 'tailedness') of the data and helps to reveal meaningful patterns that standard statistical measures like mean or median might not capture. The distribution shape can provide insights into data’s normality and variability, informing decisions about which statistical methods are appropriate for further analysis.
\ No newline at end of file
diff --git a/src/data/roadmaps/data-analyst/content/108-descriptive-analysis/103-visualising-distributions.md b/src/data/roadmaps/data-analyst/content/108-descriptive-analysis/103-visualising-distributions.md
new file mode 100644
index 000000000..f3ee283ae
--- /dev/null
+++ b/src/data/roadmaps/data-analyst/content/108-descriptive-analysis/103-visualising-distributions.md
@@ -0,0 +1,3 @@
+# Visualising Distributions
+
+Visualising Distributions, from a data analyst's perspective, plays a key role in understanding the overall distribution and identifying patterns within data. It aids in summarising, structuring, and plotting structured data graphically to provide essential insights. This includes using different chart types like bar graphs, histograms, and scatter plots for interval data, and pie or bar graphs for categorical data. Ultimately, the aim is to provide a straightforward and effective manner to comprehend the data's characteristics and underlying structure. A data analyst uses these visualisation techniques to make initial conclusions, detect anomalies, and decide on further analysis paths.
\ No newline at end of file
diff --git a/src/data/roadmaps/data-analyst/content/108-descriptive-analysis/index.md b/src/data/roadmaps/data-analyst/content/108-descriptive-analysis/index.md
new file mode 100644
index 000000000..e5397a5c5
--- /dev/null
+++ b/src/data/roadmaps/data-analyst/content/108-descriptive-analysis/index.md
@@ -0,0 +1,3 @@
+# Descriptive Analysis
+
+In the realm of data analytics, descriptive analysis plays an imperative role as a fundamental step in data interpretation. Essentially, descriptive analysis encompasses the process of summarizing, organizing, and simplifying complex data into understandable and interpretable forms. This method entails the use of various statistical tools to depict patterns, correlations, and trends in a data set. For data analysts, it serves as the cornerstone for in-depth data exploration, providing the groundwork upon which further analysis techniques such as predictive and prescriptive analysis are built.
\ No newline at end of file
diff --git a/src/data/roadmaps/data-analyst/content/109-data-visualization/100-tableau.md b/src/data/roadmaps/data-analyst/content/109-data-visualization/100-tableau.md
new file mode 100644
index 000000000..3b19e2f5e
--- /dev/null
+++ b/src/data/roadmaps/data-analyst/content/109-data-visualization/100-tableau.md
@@ -0,0 +1,3 @@
+# Tableau in Data Visualization
+
+Tableau is a powerful data visualization tool utilized extensively by data analysts worldwide. Its primary role is to transform raw, unprocessed data into an understandable format without any technical skills or coding. Data analysts use Tableau to create data visualizations, reports, and dashboards that help businesses make more informed, data-driven decisions. They also use it to perform tasks like trend analysis, pattern identification, and forecasts, all within a user-friendly interface. Moreover, Tableau's data visualization capabilities make it easier for stakeholders to understand complex data and act on insights quickly.
\ No newline at end of file
diff --git a/src/data/roadmaps/data-analyst/content/109-data-visualization/101-powerbi.md b/src/data/roadmaps/data-analyst/content/109-data-visualization/101-powerbi.md
new file mode 100644
index 000000000..9635af8f3
--- /dev/null
+++ b/src/data/roadmaps/data-analyst/content/109-data-visualization/101-powerbi.md
@@ -0,0 +1,3 @@
+# PowerBI
+
+PowerBI, an interactive data visualization and business analytics tool developed by Microsoft, plays a crucial role in the field of a data analyst's work. It helps data analysts to convert raw data into meaningful insights through it's easy-to-use dashboards and reports function. This tool provides a unified view of business data, allowing analysts to track and visualize key performance metrics and make better-informed business decisions. With PowerBI, data analysts also have the ability to manipulate and produce visualizations of large data sets that can be shared across an organization, making complex statistical information more digestible.
\ No newline at end of file
diff --git a/src/data/roadmaps/data-analyst/content/109-data-visualization/102-matplotlib.md b/src/data/roadmaps/data-analyst/content/109-data-visualization/102-matplotlib.md
new file mode 100644
index 000000000..d054bbb5a
--- /dev/null
+++ b/src/data/roadmaps/data-analyst/content/109-data-visualization/102-matplotlib.md
@@ -0,0 +1,3 @@
+# Matplotlib
+
+For a Data Analyst, understanding data and being able to represent it in a visually insightful form is a crucial part of effective decision-making in any organization. Matplotlib, a plotting library for the Python programming language, is an extremely useful tool for this purpose. It presents a versatile framework for generating line plots, scatter plots, histogram, bar charts and much more in a very straightforward manner. This library also allows for comprehensive customizations, offering a high level of control over the look and feel of the graphics it produces, which ultimately enhances the quality of data interpretation and communication.
\ No newline at end of file
diff --git a/src/data/roadmaps/data-analyst/content/109-data-visualization/103-seaborn.md b/src/data/roadmaps/data-analyst/content/109-data-visualization/103-seaborn.md
new file mode 100644
index 000000000..a6f52217c
--- /dev/null
+++ b/src/data/roadmaps/data-analyst/content/109-data-visualization/103-seaborn.md
@@ -0,0 +1,3 @@
+# Seaborn
+
+Seaborn is a robust, comprehensive Python library focused on the creation of informative and attractive statistical graphics. As a data analyst, seaborn plays an essential role in elaborating complex visual stories with the data. It aids in understanding the data by providing an interface for drawing attractive and informative statistical graphics. Seaborn is built on top of Python's core visualization library Matplotlib, and is integrated with data structures from Pandas. This makes seaborn an integral tool for data visualization in the data analyst's toolkit, making the exploration and understanding of data easier and more intuitive.
\ No newline at end of file
diff --git a/src/data/roadmaps/data-analyst/content/109-data-visualization/104-ggplot2.md b/src/data/roadmaps/data-analyst/content/109-data-visualization/104-ggplot2.md
new file mode 100644
index 000000000..ebf8e2a75
--- /dev/null
+++ b/src/data/roadmaps/data-analyst/content/109-data-visualization/104-ggplot2.md
@@ -0,0 +1,3 @@
+# Data Visualization with ggplot2
+
+ggplot2 is an important and powerful tool in the data analyst's toolkit, especially for visualizing and understanding complex datasets. Built within the R programming language, it provides a flexible, cohesive environment for creating graphs. The main strength of ggplot2 lies in its ability to produce sophisticated and tailored visualizations. This allows data analysts to communicate data-driven findings in an efficient and effective manner, enabling clear communication to stakeholders about relevant insights and patterns identified within the data.
\ No newline at end of file
diff --git a/src/data/roadmaps/data-analyst/content/109-data-visualization/105-bar-charts.md b/src/data/roadmaps/data-analyst/content/109-data-visualization/105-bar-charts.md
new file mode 100644
index 000000000..f10f12d18
--- /dev/null
+++ b/src/data/roadmaps/data-analyst/content/109-data-visualization/105-bar-charts.md
@@ -0,0 +1,3 @@
+# Bar Charts in Data Visualization
+
+As a vital tool in the data analyst's arsenal, bar charts are essential for analyzing and interpreting complex data. Bar charts, otherwise known as bar graphs, are frequently used graphical displays for dealing with categorical data groups or discrete variables. With their stark visual contrast and definitive measurements, they provide a simple yet effective means of identifying trends, understanding data distribution, and making data-driven decisions. By analyzing the lengths or heights of different bars, data analysts can effectively compare categories or variables against each other and derive meaningful insights effectively. Simplicity, readability, and easy interpretation are key features that make bar charts a favorite in the world of data analytics.
\ No newline at end of file
diff --git a/src/data/roadmaps/data-analyst/content/109-data-visualization/106-histograms.md b/src/data/roadmaps/data-analyst/content/109-data-visualization/106-histograms.md
new file mode 100644
index 000000000..a77ea3857
--- /dev/null
+++ b/src/data/roadmaps/data-analyst/content/109-data-visualization/106-histograms.md
@@ -0,0 +1,3 @@
+# Histograms
+
+As a Data Analyst, understanding and representing complex data in a simplified and comprehensible form is of paramount importance. This is where the concept of data visualization comes into play, specifically the use of histograms. A histogram is a graphical representation that organizes a group of data points into a specified range. It provides an visual interpretation of numerical data by indicating the number of data points that fall within a specified range of values, known as bins. This highly effective tool allows data analysts to view data distribution over a continuous interval or a certain time period, which can further aid in identifying trends, outliers, patterns, or anomalies present in the data. Consequently, histograms are instrumental in making informed business decisions based on these data interpretations.
\ No newline at end of file
diff --git a/src/data/roadmaps/data-analyst/content/109-data-visualization/107-line-chart.md b/src/data/roadmaps/data-analyst/content/109-data-visualization/107-line-chart.md
new file mode 100644
index 000000000..d81342ee1
--- /dev/null
+++ b/src/data/roadmaps/data-analyst/content/109-data-visualization/107-line-chart.md
@@ -0,0 +1,3 @@
+# Line Chart
+
+Data visualization is a crucial skill for every Data Analyst and the Line Chart is one of the most commonly used chart types in this field. Line charts act as powerful tools for summarizing and interpreting complex datasets. Through attractive and interactive design, these charts allow for clear and efficient communication of patterns, trends, and outliers in the data. This makes them valuable for data analysts when presenting data spanning over a period of time, forecasting trends or demonstrating relationships between different data sets.
\ No newline at end of file
diff --git a/src/data/roadmaps/data-analyst/content/109-data-visualization/108-stacked-chart.md b/src/data/roadmaps/data-analyst/content/109-data-visualization/108-stacked-chart.md
new file mode 100644
index 000000000..d4b48d24a
--- /dev/null
+++ b/src/data/roadmaps/data-analyst/content/109-data-visualization/108-stacked-chart.md
@@ -0,0 +1,3 @@
+# Stacked Chart
+
+A stacked chart is an essential tool for a data analyst in the field of data visualization. This type of chart presents quantitative data in a visually appealing manner and allows users to easily compare different categories while still being able to compare the total sizes. These charts are highly effective when trying to measure part-to-whole relationships, displaying accumulated totals over time or when presenting data with multiple variables. Data analysts often use stacked charts to detect patterns, trends and anomalies which can aid in strategic decision making.
\ No newline at end of file
diff --git a/src/data/roadmaps/data-analyst/content/109-data-visualization/109-scatter-plot.md b/src/data/roadmaps/data-analyst/content/109-data-visualization/109-scatter-plot.md
new file mode 100644
index 000000000..de249c4ef
--- /dev/null
+++ b/src/data/roadmaps/data-analyst/content/109-data-visualization/109-scatter-plot.md
@@ -0,0 +1,3 @@
+# Scatter Plot
+
+A scatter plot, a crucial aspect of data visualization, is a mathematical diagram using Cartesian coordinates to represent values from two different variables. As a data analyst, understanding and interpreting scatter plots can be instrumental in identifying correlations and trends within a dataset, drawing meaningful insights, and showcasing these findings in a clear, visual manner. In addition, scatter plots are paramount in predictive analytics as they reveal patterns which can be used to predict future occurrences.
\ No newline at end of file
diff --git a/src/data/roadmaps/data-analyst/content/109-data-visualization/110-heatmap.md b/src/data/roadmaps/data-analyst/content/109-data-visualization/110-heatmap.md
new file mode 100644
index 000000000..07e33efd8
--- /dev/null
+++ b/src/data/roadmaps/data-analyst/content/109-data-visualization/110-heatmap.md
@@ -0,0 +1,3 @@
+# Heatmap
+
+Heatmaps are a crucial component of data visualization that Data Analysts regularly employ in their analyses. As one of many possible graphical representations of data, heatmaps show the correlation or scale of variation between two or more variables in a dataset, making them extremely useful for pattern recognition and outlier detection. Individual values within a matrix are represented in a heatmap as colors, with differing intensities indicating the degree or strength of an occurrence. In short, a Data Analyst would use a heatmap to decode complex multivariate data and turn it into an easily understandable visual that aids in decision making.
\ No newline at end of file
diff --git a/src/data/roadmaps/data-analyst/content/109-data-visualization/111-funnel-chart.md b/src/data/roadmaps/data-analyst/content/109-data-visualization/111-funnel-chart.md
new file mode 100644
index 000000000..695f4adf8
--- /dev/null
+++ b/src/data/roadmaps/data-analyst/content/109-data-visualization/111-funnel-chart.md
@@ -0,0 +1,3 @@
+# Funnel Chart in Data Visualization
+
+A funnel chart is an important tool for Data Analysts. It is a part of data visualization, the creation and study of the visual representation of data. A funnel chart displays values as progressively diminishing amounts, allowing data analysts to understand the stages that contribute to the output of a process or system. It is often used in sales, marketing or any field that involves a multi-step process, to evaluate efficiency or identify potential problem areas. The 'funnel' shape is symbolic of a typical customer conversion process, going from initial engagement to close of sale. As Data Analysts, understanding and interpreting funnel charts can provide significant insights to drive optimal decision making.
\ No newline at end of file
diff --git a/src/data/roadmaps/data-analyst/content/109-data-visualization/112-pie-chart.md b/src/data/roadmaps/data-analyst/content/109-data-visualization/112-pie-chart.md
new file mode 100644
index 000000000..c6873873c
--- /dev/null
+++ b/src/data/roadmaps/data-analyst/content/109-data-visualization/112-pie-chart.md
@@ -0,0 +1,3 @@
+# Pie Chart
+
+As a data analyst, understanding and efficiently using various forms of data visualization is crucial. Among these, Pie Charts represent a significant tool. Essentially, pie charts are circular statistical graphics divided into slices to illustrate numerical proportions. Each slice of the pie corresponds to a particular category. The pie chart's beauty lies in its simplicity and visual appeal, making it an effective way to convey relative proportions or percentages at a glance. For a data analyst, it's particularly useful when you want to show a simple distribution of categorical data. Like any tool, though, it's important to use pie charts wisely—ideally, when your data set has fewer than seven categories, and the proportions between categories are distinct.
\ No newline at end of file
diff --git a/src/data/roadmaps/data-analyst/content/109-data-visualization/index.md b/src/data/roadmaps/data-analyst/content/109-data-visualization/index.md
new file mode 100644
index 000000000..1a1b59ed5
--- /dev/null
+++ b/src/data/roadmaps/data-analyst/content/109-data-visualization/index.md
@@ -0,0 +1,3 @@
+# Data Visualization
+
+Data Visualization is a fundamental fragment of the responsibilities of a data analyst. It involves the presentation of data in a graphical or pictorial format which allows decision-makers to see analytics visually. This practice can help them comprehend difficult concepts or establish new patterns. With interactive visualization, data analysts can take the data analysis process to a whole new level — drill down into charts and graphs for more detail, and interactively changing what data is presented or how it’s processed. Thereby it forms a crucial link in the chain of converting raw data to actionable insights which is one of the primary roles of a Data Analyst.
\ No newline at end of file
diff --git a/src/data/roadmaps/data-analyst/content/110-statistical-analysis/100-hypothesis-testing.md b/src/data/roadmaps/data-analyst/content/110-statistical-analysis/100-hypothesis-testing.md
new file mode 100644
index 000000000..d95ef0936
--- /dev/null
+++ b/src/data/roadmaps/data-analyst/content/110-statistical-analysis/100-hypothesis-testing.md
@@ -0,0 +1,3 @@
+# Hypothesis Testing
+
+In the context of a Data Analyst, hypothesis testing plays an essential role to make inferences or predictions based on data. Hypothesis testing is an approach used to test a claim or theory about a parameter in a population, using data measured in a sample. This method allows Data Analysts to determine whether the observed data deviates significantly from the status quo or not. Essentially, it provides a probability-based mechanism to quantify and deal with the uncertainty inherent in conclusions drawn from not completely reliable data.
\ No newline at end of file
diff --git a/src/data/roadmaps/data-analyst/content/110-statistical-analysis/101-correlation-analysis.md b/src/data/roadmaps/data-analyst/content/110-statistical-analysis/101-correlation-analysis.md
new file mode 100644
index 000000000..792a9867c
--- /dev/null
+++ b/src/data/roadmaps/data-analyst/content/110-statistical-analysis/101-correlation-analysis.md
@@ -0,0 +1,3 @@
+# Correlation Analysis
+
+Correlation Analysis is a quantitative method that data analysts widely employ to determine if there is a significant relationship between two variables, and if so, how strong or weak, positive or negative that relationship might be. This form of analysis helps data analysts identify patterns and trends within datasets, and is often represented visually through scatter plots. By using correlation analysis, data analysts can derive valuable insights to inform decision-making processes within a wide range of fields, from marketing to finance. The implementation of correlation analysis is crucial to forecast future outcomes, develop strategies and drive business growth.
\ No newline at end of file
diff --git a/src/data/roadmaps/data-analyst/content/110-statistical-analysis/102-regression.md b/src/data/roadmaps/data-analyst/content/110-statistical-analysis/102-regression.md
new file mode 100644
index 000000000..80ccbc7e4
--- /dev/null
+++ b/src/data/roadmaps/data-analyst/content/110-statistical-analysis/102-regression.md
@@ -0,0 +1,3 @@
+# Regression
+
+As a data analyst, understanding regression is of paramount importance. Regression analysis is a form of predictive modelling technique which investigates the relationship between dependent and independent variables. It is used for forecast, time series modelling and finding the causal effect relationship between variables. In essence, Regression techniques are used by data analysts to predict a continuous outcome variable (dependent variable) based on one or more predictor variables (independent variables). The main goal is to understand how the typical value of the dependent variable changes when any one of the independent variables is varied, while the other independent variables are held fixed. This understanding of regression takes data analysis from a reactive position to a more powerful, predictive one, equipping data analysts with an integral tool in their work.
\ No newline at end of file
diff --git a/src/data/roadmaps/data-analyst/content/110-statistical-analysis/index.md b/src/data/roadmaps/data-analyst/content/110-statistical-analysis/index.md
new file mode 100644
index 000000000..6d93c60ca
--- /dev/null
+++ b/src/data/roadmaps/data-analyst/content/110-statistical-analysis/index.md
@@ -0,0 +1,3 @@
+# Statistical Analysis
+
+Statistical analysis is a core component of a data analyst's toolkit. As professionals dealing with vast amount of structured and unstructured data, data analysts often turn to statistical methods to extract insights and make informed decisions. The role of statistical analysis in data analytics involves gathering, reviewing, and interpreting data for various applications, enabling businesses to understand their performance, trends, and growth potential. Data analysts use a range of statistical techniques from modeling, machine learning, and data mining, to convey vital information that supports strategic company actions.
\ No newline at end of file
diff --git a/src/data/roadmaps/data-analyst/content/111-machine-learning-basics/100-supervised.md b/src/data/roadmaps/data-analyst/content/111-machine-learning-basics/100-supervised.md
new file mode 100644
index 000000000..87e4c4ddb
--- /dev/null
+++ b/src/data/roadmaps/data-analyst/content/111-machine-learning-basics/100-supervised.md
@@ -0,0 +1,3 @@
+# Supervised Machine Learning Basics for Data Analysts
+
+Supervised machine learning forms an integral part of the toolset for a Data Analyst. With a direct focus on building predictive models from labeled datasets, it involves training an algorithm based on these known inputs and outputs, helping Data Analysts establish correlations and make reliable predictions. Fortifying a Data Analyst's role, supervised machine learning enables the accurate interpretation of complex data, enhancing decision-making processes.
\ No newline at end of file
diff --git a/src/data/roadmaps/data-analyst/content/111-machine-learning-basics/101-unsupervised.md b/src/data/roadmaps/data-analyst/content/111-machine-learning-basics/101-unsupervised.md
new file mode 100644
index 000000000..5e955fcbd
--- /dev/null
+++ b/src/data/roadmaps/data-analyst/content/111-machine-learning-basics/101-unsupervised.md
@@ -0,0 +1,3 @@
+# Unsupervised Learning in Machine Learning Basics
+
+Unsupervised learning, as a fundamental aspect of Machine Learning, holds great implications in the realm of data analytics. It is an approach where a model learns to identify patterns and relationships within a dataset that isn't labelled or classified. It is especially useful for a Data Analyst as it can assist in recognizing unforeseen trends, providing new insights or preparing data for other machine learning tasks. This ability to infer without direct supervision allows a vast potential for latent structure discovery and new knowledge derivation from raw data.
\ No newline at end of file
diff --git a/src/data/roadmaps/data-analyst/content/111-machine-learning-basics/102-reinforcement.md b/src/data/roadmaps/data-analyst/content/111-machine-learning-basics/102-reinforcement.md
new file mode 100644
index 000000000..928697a30
--- /dev/null
+++ b/src/data/roadmaps/data-analyst/content/111-machine-learning-basics/102-reinforcement.md
@@ -0,0 +1,3 @@
+# Reinforcement
+
+Reinforcement learning is a key topic within the broader realm of machine learning. Data analysts and other professionals dealing with data often utilize reinforcement learning techniques. In simple, it can be considered as a type of algorithm that uses trial and error to come up with solutions to problems. Notably, these algorithms learn the ideal behaviour within a specific context, with the intention of maximizing performance. As a data analyst, understanding reinforcement learning provides a crucial expertise, especially when dealing with complex data structures and making strategic decisions based on that data.
\ No newline at end of file
diff --git a/src/data/roadmaps/data-analyst/content/111-machine-learning-basics/103-decision-trees.md b/src/data/roadmaps/data-analyst/content/111-machine-learning-basics/103-decision-trees.md
new file mode 100644
index 000000000..80e394e3d
--- /dev/null
+++ b/src/data/roadmaps/data-analyst/content/111-machine-learning-basics/103-decision-trees.md
@@ -0,0 +1,3 @@
+# Decision Trees
+
+As a data analyst, understanding machine learning topics like decision trees is crucial. Decision trees are a fundamental aspect in the field of machine learning and artificial intelligence. They present a simple yet effective method of data analysis. They have applications in several areas including customer relationship management, fraud detection, financial analysis, healthcare and more. In simpler terms, a decision tree can be considered as a method of breaking down complex decisions and estimating likely outcomes. This introduction would help data analysts understand the logic behind decision trees and how they are constructed for the purpose of predictive modeling.
\ No newline at end of file
diff --git a/src/data/roadmaps/data-analyst/content/111-machine-learning-basics/104-naive-bayes.md b/src/data/roadmaps/data-analyst/content/111-machine-learning-basics/104-naive-bayes.md
new file mode 100644
index 000000000..e751447e0
--- /dev/null
+++ b/src/data/roadmaps/data-analyst/content/111-machine-learning-basics/104-naive-bayes.md
@@ -0,0 +1,3 @@
+# Naive Bayes
+
+As a data analyst, understanding various machine learning algorithms is crucial. Naive Bayes is one of such basic yet powerful algorithms used for predictive modeling and data classification. This algorithm applies the principles of probability and statistics, specifically Bayes' theorem, with a 'naive' assumption of independence among the predictors. Ideal for dealing with large volumes of data, Naive Bayes is a competitive algorithm for text classification, spam filtering, recommendation systems, and more. Understanding Naive Bayes can significantly improve the ability of a data analyst to create more effective models and deliver superior analytical results.
\ No newline at end of file
diff --git a/src/data/roadmaps/data-analyst/content/111-machine-learning-basics/105-knn.md b/src/data/roadmaps/data-analyst/content/111-machine-learning-basics/105-knn.md
new file mode 100644
index 000000000..e204a878f
--- /dev/null
+++ b/src/data/roadmaps/data-analyst/content/111-machine-learning-basics/105-knn.md
@@ -0,0 +1,3 @@
+# KNN
+
+K-Nearest Neighbors (KNN) is a simple yet powerful algorithm used in the field of machine learning, which a Data Analyst might employ for tasks such as classification or regression. It works based on the principle of proximity, where the prediction of new instance's category depends upon the category of its nearest neighbors. For a Data Analyst working with complex data sets, it's crucial to understand how the KNN algorithm operates, its applicability, pros, and cons. This will facilitate making well-informed decisions about when to utilize it for the best possible outcome in data analysis.
\ No newline at end of file
diff --git a/src/data/roadmaps/data-analyst/content/111-machine-learning-basics/106-kmeans.md b/src/data/roadmaps/data-analyst/content/111-machine-learning-basics/106-kmeans.md
new file mode 100644
index 000000000..df7dbdb0c
--- /dev/null
+++ b/src/data/roadmaps/data-analyst/content/111-machine-learning-basics/106-kmeans.md
@@ -0,0 +1,3 @@
+# Kmeans
+
+Kmeans is a fundamentally important method in data analysis and falls under the broad umbrella of machine learning basics. A data analyst using Kmeans clusters large data sets into subgroups or clusters based upon specific characteristics or parameters. The primary purpose is to derive insights from similarities/dissimilarities within the dataset, which can then be used for understanding patterns, trends, and predictive modeling. Accurate use of Kmeans can lead to enhanced decision-making, forecasting and strategic planning based on the data.
\ No newline at end of file
diff --git a/src/data/roadmaps/data-analyst/content/111-machine-learning-basics/107-logistic.md b/src/data/roadmaps/data-analyst/content/111-machine-learning-basics/107-logistic.md
new file mode 100644
index 000000000..8e63ef05a
--- /dev/null
+++ b/src/data/roadmaps/data-analyst/content/111-machine-learning-basics/107-logistic.md
@@ -0,0 +1,3 @@
+# Logistic
+
+Logistic Regression is one of the foundational techniques that a data analyst must understand in machine learning. This method is a predictive analysis algorithm based on the concept of probability. It’s used for categorizing data into distinct classes, making it particularly useful for binary classification problems. It should be understood that despite its name, logistic regression is used in classification problems, not regression tasks. Data analysts use this algorithm to build machine learning models to solve various real-world problems such as email spam, credibility of loan applicants, development of marketing strategies and so on.
\ No newline at end of file
diff --git a/src/data/roadmaps/data-analyst/content/111-machine-learning-basics/108-model-evaluation-techniques.md b/src/data/roadmaps/data-analyst/content/111-machine-learning-basics/108-model-evaluation-techniques.md
new file mode 100644
index 000000000..e2691e89e
--- /dev/null
+++ b/src/data/roadmaps/data-analyst/content/111-machine-learning-basics/108-model-evaluation-techniques.md
@@ -0,0 +1,3 @@
+# Model Evaluation Techniques
+
+As a data analyst, it's crucial to understand various model evaluation techniques. These techniques involve different methods to measure the performance or accuracy of machine learning models. For instance, using confusion matrix, precision, recall, F1 score, ROC curves or Root Mean Squared Error (RMSE) among others. Knowing how to apply these techniques effectively not only helps in selecting the best model for a specific problem but also guides in tuning the performance of the models for optimal results. Understanding these model evaluation techniques also allows data analysts to interpret evaluation results and determine the effectiveness and applicability of a model.
\ No newline at end of file
diff --git a/src/data/roadmaps/data-analyst/content/111-machine-learning-basics/index.md b/src/data/roadmaps/data-analyst/content/111-machine-learning-basics/index.md
new file mode 100644
index 000000000..c55429fa6
--- /dev/null
+++ b/src/data/roadmaps/data-analyst/content/111-machine-learning-basics/index.md
@@ -0,0 +1,3 @@
+# Machine Learning Basics for Data Analysts
+
+Data analysts are becoming increasingly involved in the realm of machine learning. This emerging technology harnesses algorithms, statistical models, and other tools to teach machines to perform tasks that would normally require human intelligence. This includes activities such as making predictions based on data, recognizing patterns, and making decisions. Understanding the basics of machine learning is therefore not only beneficial, but essential, to modern data analysts who wish to stay competitive in their field.
\ No newline at end of file
diff --git a/src/data/roadmaps/data-analyst/content/112-big-data/100-concepts.md b/src/data/roadmaps/data-analyst/content/112-big-data/100-concepts.md
new file mode 100644
index 000000000..3b20c7c72
--- /dev/null
+++ b/src/data/roadmaps/data-analyst/content/112-big-data/100-concepts.md
@@ -0,0 +1,3 @@
+# Big Data Concepts
+
+Big data refers to extremely large and complex data sets that traditional data processing systems are unable to manage effectively. For data analysts, understanding the big data concepts is crucial as it helps them gain insights, make decisions, and create meaningful presentations using these data sets. The key concepts include volume, velocity, and variety - collectively known as the 3Vs. Volume refers to the amount of data, velocity is the speed at which data is processed, and variety indicates the different types of data being dealt with. Other advanced concepts include variability and veracity. These concepts provide a framework for understanding and working with big data for data analysts. With the growing importance of big data in various industries and sectors, a comprehensive grasp of these concepts equips a data analyst to more effectively and efficiently analyze and interpret complex data sets.
\ No newline at end of file
diff --git a/src/data/roadmaps/data-analyst/content/112-big-data/101-data-processing-techniques/100-parallel-processing.md b/src/data/roadmaps/data-analyst/content/112-big-data/101-data-processing-techniques/100-parallel-processing.md
new file mode 100644
index 000000000..271bb8f90
--- /dev/null
+++ b/src/data/roadmaps/data-analyst/content/112-big-data/101-data-processing-techniques/100-parallel-processing.md
@@ -0,0 +1,3 @@
+# Parallel Processing
+
+Parallel processing is an efficient form of data processing that allows Data Analysts to deal with larger volumes of data at a faster pace. It is a computational method that allows multiple tasks to be performed concurrently, instead of sequentially, thus, speeding up data processing. Parallel processing proves to be invaluable for Data Analysts, as they are often tasked with analyzing huge data sets and compiling reports in real-time. As the demand for rapid data processing and quick analytics is on the rise, the technique of parallel processing forms a critical element in the versatile toolkit of a Data Analyst.
\ No newline at end of file
diff --git a/src/data/roadmaps/data-analyst/content/112-big-data/101-data-processing-techniques/101-mpi.md b/src/data/roadmaps/data-analyst/content/112-big-data/101-data-processing-techniques/101-mpi.md
new file mode 100644
index 000000000..6eeb7374f
--- /dev/null
+++ b/src/data/roadmaps/data-analyst/content/112-big-data/101-data-processing-techniques/101-mpi.md
@@ -0,0 +1,3 @@
+# MPI
+
+Message Passing Interface (MPI) is a pioneering technique in the broader realm of data processing strategies. As a data analyst, understanding and implementing MPI is pivotal for managing massive data sets. MPI is an authorized standard for performing parallel computing, which allows concurrent data processing, maintaining a highly efficient and time-saving operation. This system exchanges data between separate tasks and aids in solving complex problems related to computations and data analysis. By leveraging MPI in data processing, analysts can expect to optimize their work and contribute to faster decision-making, thereby enhancing the overall organizational efficiency.
diff --git a/src/data/roadmaps/data-analyst/content/112-big-data/101-data-processing-techniques/102-map-reduce.md b/src/data/roadmaps/data-analyst/content/112-big-data/101-data-processing-techniques/102-map-reduce.md
new file mode 100644
index 000000000..b17310391
--- /dev/null
+++ b/src/data/roadmaps/data-analyst/content/112-big-data/101-data-processing-techniques/102-map-reduce.md
@@ -0,0 +1,3 @@
+# Map Reduce
+
+Map Reduce is a prominent data processing technique used by Data Analysts around the world. It allows them to handle large data sets with complex, unstructured data efficiently. Map Reduce breaks down a big data problem into smaller sub-tasks (Map) and then takes those results to create an output in a more usable format (Reduce). This technique is particularly useful in conducting exploratory analysis, as well as in handling big data operations such as text processing, graph processing, or more complicated machine learning algorithms.
\ No newline at end of file
diff --git a/src/data/roadmaps/data-analyst/content/112-big-data/101-data-processing-techniques/index.md b/src/data/roadmaps/data-analyst/content/112-big-data/101-data-processing-techniques/index.md
new file mode 100644
index 000000000..c5b2f3f14
--- /dev/null
+++ b/src/data/roadmaps/data-analyst/content/112-big-data/101-data-processing-techniques/index.md
@@ -0,0 +1,3 @@
+# Data Processing Techniques
+
+As a part of the modern business landscape, Data analysts constantly grapple with the challenges and opportunities that come with Big Data. Navigating through this complex environment requires understandings of certain key data processing techniques. These techniques are the tools that enable data analysts to effectively clean, transform, and interpret large volumes of data into actionable, data-driven insights. Leveraging these techniques properly can give businesses an edge, leading to more informed decision-making and strategy development. From MapReduce to Online Analytical Processing (OLAP), each technique has its unique approach and application, suitable for handling different Big Data cases. Significant improvements in processing speed, flexibility, and quality are possible when these techniques are appropriately applied by data analysts. Understanding the intricacies of data processing techniques is thus a significant aspect of the data analyst's role.
\ No newline at end of file
diff --git a/src/data/roadmaps/data-analyst/content/112-big-data/102-data-storage-solutions.md b/src/data/roadmaps/data-analyst/content/112-big-data/102-data-storage-solutions.md
new file mode 100644
index 000000000..02c14c2d8
--- /dev/null
+++ b/src/data/roadmaps/data-analyst/content/112-big-data/102-data-storage-solutions.md
@@ -0,0 +1,3 @@
+# Data Storage Solutions
+
+As a business enterprise expands, so does its data. For data analysts, the surge in information means they need efficient and scalable data storage solutions to manage vast volumes of structured and unstructured data, collectively referred to as Big Data. Big Data storage solutions are critical in preserving the integrity of data while also providing quick and easy access to the data when needed. These solutions use software and hardware components to securely store massive amounts of information across numerous servers, allowing data analysts to perform robust data extraction, data processing and complex data analyses. There are several options, from the traditional Relational Database Management Systems (RDBMS) to the more recent NoSQL databases, Hadoop ecosystems, and Cloud storage solutions, each offering unique capabilities and benefits to cater for different big data needs.
\ No newline at end of file
diff --git a/src/data/roadmaps/data-analyst/content/112-big-data/103-data-processing-frameworks/100-hadoop.md b/src/data/roadmaps/data-analyst/content/112-big-data/103-data-processing-frameworks/100-hadoop.md
new file mode 100644
index 000000000..84b85f001
--- /dev/null
+++ b/src/data/roadmaps/data-analyst/content/112-big-data/103-data-processing-frameworks/100-hadoop.md
@@ -0,0 +1,3 @@
+# Hadoop
+
+Hadoop is a critical element in the realm of data processing frameworks, offering an effective solution for storing, managing, and analyzing massive amounts of data. Unraveling meaningful insights from a large deluge of data is a challenging pursuit faced by many data analysts. Regular data processing tools fail to handle large-scale data, paving the way for advanced frameworks like Hadoop. This open-source platform by Apache Software Foundation excels at storing and processing vast data across clusters of computers. Notably, Hadoop comprises two key modules - the Hadoop Distributed File System (HDFS) for storage and MapReduce for processing. Hadoop’s ability to handle both structured and unstructured data further broadens its capacity. For any data analyst, a thorough understanding of Hadoop can unlock powerful ways to manage data effectively and construct meaningful analytics.
\ No newline at end of file
diff --git a/src/data/roadmaps/data-analyst/content/112-big-data/103-data-processing-frameworks/101-spark.md b/src/data/roadmaps/data-analyst/content/112-big-data/103-data-processing-frameworks/101-spark.md
new file mode 100644
index 000000000..928ac4871
--- /dev/null
+++ b/src/data/roadmaps/data-analyst/content/112-big-data/103-data-processing-frameworks/101-spark.md
@@ -0,0 +1,3 @@
+# Spark
+
+As a big data processing framework, Apache Spark showcases immense importance in the field of data analysis. Abreast with the ability to handle both batch and real-time analytics, Spark offers an interface for programming entire clusters with implicit data parallelism and fault tolerance. As a data analyst, mastery over Spark becomes essential in order to efficiently process and analyze complex and high-volume data. This powerful open-source tool can simplify the daunting task of gleaning actionable insights from massive, disparate data sets.
\ No newline at end of file
diff --git a/src/data/roadmaps/data-analyst/content/112-big-data/103-data-processing-frameworks/index.md b/src/data/roadmaps/data-analyst/content/112-big-data/103-data-processing-frameworks/index.md
new file mode 100644
index 000000000..fd9749c41
--- /dev/null
+++ b/src/data/roadmaps/data-analyst/content/112-big-data/103-data-processing-frameworks/index.md
@@ -0,0 +1,3 @@
+# Data Processing Frameworks
+
+The role of Data Analyst encompasses understanding, interpreting and making sense of vast amounts of information. In the realm of Big Data, this can be an increasingly challenging task due to the sheer volume, variety and velocity of information being produced. This is where Data Processing Frameworks come into play. Data Processing Frameworks are essential tools for any data analyst working with Big Data. They not only simplify the process of handling large data sets but also ensure reliable, scalable and distributed computing, specifically tailored for extensive analysis. Examples of these frameworks include Apache Hadoop, Apache Spark amongst others. Learning to leverage these frameworks, enables data analysts to process, analyze and uncover insights from Big Data in a timely and efficient manner.
\ No newline at end of file
diff --git a/src/data/roadmaps/data-analyst/content/112-big-data/index.md b/src/data/roadmaps/data-analyst/content/112-big-data/index.md
new file mode 100644
index 000000000..7deab6dff
--- /dev/null
+++ b/src/data/roadmaps/data-analyst/content/112-big-data/index.md
@@ -0,0 +1,3 @@
+# Big Data and Data Analyst
+
+In the modern digitized world, Big Data refers to extremely large datasets that are challenging to manage and analyze using traditional data processing applications. These datasets often come from numerous different sources and are not only voluminous but also diverse in nature, including structured and unstructured data. The role of a data analyst in the context of big data is crucial. Data analysts are responsible for inspecting, cleaning, transforming, and modeling big data to discover useful information, conclude and support decision-making. They leverage their analytical skills and various big data tools and technologies to extract insights that can benefit the organization and drive strategic business initiatives.
\ No newline at end of file
diff --git a/src/data/roadmaps/data-analyst/content/113-deep-learning/100-neutral-networks.md b/src/data/roadmaps/data-analyst/content/113-deep-learning/100-neutral-networks.md
new file mode 100644
index 000000000..7dbb25657
--- /dev/null
+++ b/src/data/roadmaps/data-analyst/content/113-deep-learning/100-neutral-networks.md
@@ -0,0 +1,3 @@
+# Neural Networks
+
+Neural Networks play a pivotal role in the landscape of deep learning, offering a plethora of benefits and applications for data analysts. They are computational models that emulate the way human brain processes information, enabling machines to make intelligent decisions. As a data analyst, understanding and utilizing neural networks can greatly enhance decision-making process as it allows to quickly and effectively analyze large datasets, recognize patterns, and forecast future trends. In deep learning, these networks are used for creating advanced models that can tackle complex tasks such as image recognition, natural language processing, and speech recognition, to name but a few. Therefore, an in-depth knowledge of neural networks is a significant asset for any aspiring or professional data analyst.
\ No newline at end of file
diff --git a/src/data/roadmaps/data-analyst/content/113-deep-learning/101-cnns.md b/src/data/roadmaps/data-analyst/content/113-deep-learning/101-cnns.md
new file mode 100644
index 000000000..06856cdb8
--- /dev/null
+++ b/src/data/roadmaps/data-analyst/content/113-deep-learning/101-cnns.md
@@ -0,0 +1,3 @@
+# CNNs
+
+Convolutional Neural Networks (CNNs) form an integral part of deep learning frameworks, particularly within the realm of image processing. Data analysts with a focus on deep learning applications often turn to CNNs for their capacity to efficiently process high-dimensional data, such as images, and extract critical features relevant to the problem at hand. As a powerful tool for modeling patterns in data, CNNs are frequently employed in applications ranging from image recognition to natural language processing (NLP). Understanding CNNs, therefore, provides a robust foundation for data analysts aspiring to harness the potential of deep learning techniques.
\ No newline at end of file
diff --git a/src/data/roadmaps/data-analyst/content/113-deep-learning/102-rnns.md b/src/data/roadmaps/data-analyst/content/113-deep-learning/102-rnns.md
new file mode 100644
index 000000000..32fb4fee7
--- /dev/null
+++ b/src/data/roadmaps/data-analyst/content/113-deep-learning/102-rnns.md
@@ -0,0 +1,5 @@
+# Understanding RNNs
+
+Recurrent Neural Networks(RNNs) are a type of Artificial Neural Networks(ANNs) which introduces us to the realm of Deep Learning, an aspect that has been significantly contributing to the evolution of Data Analysis. RNNs are specifically designed to recognize patterns in sequences of data, such as text, genomes, handwriting, or the spoken word. This inherent feature of RNNs makes them extremely useful and versatile for a data analyst.
+
+A data analyst leveraging RNNs can effectively charter the intrinsic complexity of data sequences, classify them, and make accurate predictions. With the fundamental understanding of deep learning, data analysts can unlock the full potential of RNNs in delivering insightful data analysis that goes beyond traditional statistical methods. Modern research and applications of RNNs extend to multiple domains including natural language processing, speech recognition, and even in the financial sphere for stock price prediction making this a key tool in a data analyst’s arsenal.
diff --git a/src/data/roadmaps/data-analyst/content/113-deep-learning/103-tesnor-flow.md b/src/data/roadmaps/data-analyst/content/113-deep-learning/103-tesnor-flow.md
new file mode 100644
index 000000000..5182b6564
--- /dev/null
+++ b/src/data/roadmaps/data-analyst/content/113-deep-learning/103-tesnor-flow.md
@@ -0,0 +1,3 @@
+# Tensor Flow
+
+TensorFlow, developed by Google Brain Team, has become a crucial tool in the realm of data analytics, particularly within the field of deep learning. It's an open-source platform for machine learning, offering a comprehensive and flexible ecosystem of tools, libraries, and community resources. As a data analyst, understanding and implementing TensorFlow for deep learning models allows us to identify complex patterns and make insightful predictions which standard analysis could miss. It's in-demand skill that enhances our ability to generate accurate insights from colossal and complicated structured or unstructured data sets.
\ No newline at end of file
diff --git a/src/data/roadmaps/data-analyst/content/113-deep-learning/104-pytorch.md b/src/data/roadmaps/data-analyst/content/113-deep-learning/104-pytorch.md
new file mode 100644
index 000000000..be180a116
--- /dev/null
+++ b/src/data/roadmaps/data-analyst/content/113-deep-learning/104-pytorch.md
@@ -0,0 +1,3 @@
+# PyTorch
+
+PyTorch, an open-source machine learning library, has gained considerable popularity among data analysts due to its simplicity and high performance in tasks such as natural language processing and artificial intelligence. Specifically, in the domain of deep learning, PyTorch stands out due to its dynamic computational graph, allowing for a highly intuitive and flexible platform for building complex models. For data analysts, mastering PyTorch can open up a broad range of opportunities for data model development, data processing, and integration of machine learning algorithms.
\ No newline at end of file
diff --git a/src/data/roadmaps/data-analyst/content/113-deep-learning/105-image-recognition.md b/src/data/roadmaps/data-analyst/content/113-deep-learning/105-image-recognition.md
new file mode 100644
index 000000000..c12085c6b
--- /dev/null
+++ b/src/data/roadmaps/data-analyst/content/113-deep-learning/105-image-recognition.md
@@ -0,0 +1,3 @@
+# Image Recognition
+
+Image Recognition has become a significant domain because of its diverse applications, including facial recognition, object detection, character recognition, and much more. As a Data Analyst, understanding Image Recognition under Deep Learning becomes crucial. The data analyst's role in this context involves deciphering complex patterns and extracting valuable information from image data. This area of machine learning combines knowledge of data analysis, image processing, and deep neural networks to provide accurate results, contributing significantly to the progression of fields like autonomous vehicles, medical imaging, surveillance, among others. Therefore, proficiency in this field paves the way for proficient data analysis, leading to innovative solutions and improved decision-making.
\ No newline at end of file
diff --git a/src/data/roadmaps/data-analyst/content/113-deep-learning/106-natural-language-processing.md b/src/data/roadmaps/data-analyst/content/113-deep-learning/106-natural-language-processing.md
new file mode 100644
index 000000000..6f36436e1
--- /dev/null
+++ b/src/data/roadmaps/data-analyst/content/113-deep-learning/106-natural-language-processing.md
@@ -0,0 +1,5 @@
+# Natural Language Processing
+
+In the sphere of data analysis, Natural Language Processing (NLP) has emerged as a critical aspect. NLP is a branch of artificial intelligence that involves the interaction between computers and human languages. It allows computers to understand, interpret, and generate human languages with meaning and context. This capability opens up potent avenues for data analysts, who often have to handle unstructured data such as customer reviews, comments, and other textual content.
+
+Deep Learning, a subset of machine learning based on artificial neural networks, is particularly effective for NLP tasks, enabling computers to learn from vast amounts of data. For data analysts, understanding and utilizing the potentials of NLP can greatly improve the efficiency of data processing and extraction of meaningful insights, especially when dealing with large or complex data sets. This knowledge can significantly enhance their ability to make data-driven decisions and predictions tailored to specific business objectives.
\ No newline at end of file
diff --git a/src/data/roadmaps/data-analyst/content/113-deep-learning/index.md b/src/data/roadmaps/data-analyst/content/113-deep-learning/index.md
new file mode 100644
index 000000000..a9af1484c
--- /dev/null
+++ b/src/data/roadmaps/data-analyst/content/113-deep-learning/index.md
@@ -0,0 +1,3 @@
+# Deep Learning and Data Analysis
+
+Deep learning, a subset of machine learning technique, is increasingly becoming a critical tool for data analysts. Deep learning algorithms utilize multiple layers of neural networks to understand and interpret intricate structures in large data, a skill that is integral to the daily functions of a data analyst. With the ability to learn from unstructured or unlabeled data, deep learning opens a whole new range of possibilities for data analysts in terms of data processing, prediction, and categorization. It has applications in a variety of industries from healthcare to finance to e-commerce and beyond. A deeper understanding of deep learning methodologies can augment a data analyst's capability to evaluate and interpret complex datasets and provide valuable insights for decision making.
\ No newline at end of file
diff --git a/src/data/roadmaps/data-analyst/content/index.md b/src/data/roadmaps/data-analyst/content/index.md
new file mode 100644
index 000000000..4e768b56d
--- /dev/null
+++ b/src/data/roadmaps/data-analyst/content/index.md
@@ -0,0 +1 @@
+#
\ No newline at end of file
diff --git a/src/data/roadmaps/data-analyst/data-analyst.json b/src/data/roadmaps/data-analyst/data-analyst.json
new file mode 100644
index 000000000..47b85ad9d
--- /dev/null
+++ b/src/data/roadmaps/data-analyst/data-analyst.json
@@ -0,0 +1,8365 @@
+{
+ "mockup": {
+ "controls": {
+ "control": [
+ {
+ "ID": "612",
+ "typeID": "Label",
+ "zOrder": "44",
+ "measuredW": "181",
+ "measuredH": "40",
+ "x": "671",
+ "y": "324",
+ "properties": {
+ "size": "32",
+ "text": "Data Analyst"
+ }
+ },
+ {
+ "ID": "613",
+ "typeID": "__group__",
+ "zOrder": "45",
+ "measuredW": "373",
+ "measuredH": "151",
+ "w": "373",
+ "h": "151",
+ "x": "979",
+ "y": "216",
+ "children": {
+ "controls": {
+ "control": [
+ {
+ "ID": "0",
+ "typeID": "Canvas",
+ "zOrder": "0",
+ "w": "373",
+ "h": "151",
+ "measuredW": "100",
+ "measuredH": "70",
+ "x": "0",
+ "y": "0"
+ },
+ {
+ "ID": "1",
+ "typeID": "Label",
+ "zOrder": "1",
+ "measuredW": "333",
+ "measuredH": "26",
+ "x": "18",
+ "y": "19",
+ "properties": {
+ "text": "Find the detailed version of this roadmap",
+ "size": "18"
+ }
+ },
+ {
+ "ID": "3",
+ "typeID": "__group__",
+ "zOrder": "2",
+ "measuredW": "339",
+ "measuredH": "47",
+ "w": "339",
+ "h": "47",
+ "x": "18",
+ "y": "88",
+ "properties": {
+ "controlName": "ext_link:roadmap.sh"
+ },
+ "children": {
+ "controls": {
+ "control": [
+ {
+ "ID": "0",
+ "typeID": "Canvas",
+ "zOrder": "0",
+ "w": "339",
+ "h": "47",
+ "measuredW": "100",
+ "measuredH": "70",
+ "x": "0",
+ "y": "0",
+ "properties": {
+ "borderColor": "4273622",
+ "color": "4273622"
+ }
+ },
+ {
+ "ID": "1",
+ "typeID": "Label",
+ "zOrder": "1",
+ "measuredW": "155",
+ "measuredH": "26",
+ "x": "92",
+ "y": "11",
+ "properties": {
+ "color": "16777215",
+ "text": "https://roadmap.sh",
+ "size": "18"
+ }
+ }
+ ]
+ }
+ }
+ },
+ {
+ "ID": "5",
+ "typeID": "Label",
+ "zOrder": "3",
+ "measuredW": "337",
+ "measuredH": "26",
+ "x": "18",
+ "y": "48",
+ "properties": {
+ "size": "18",
+ "text": "Along with resources and more roadmaps"
+ }
+ }
+ ]
+ }
+ }
+ },
+ {
+ "ID": "614",
+ "typeID": "Arrow",
+ "zOrder": "46",
+ "w": "1",
+ "h": "74",
+ "measuredW": "150",
+ "measuredH": "100",
+ "x": "755",
+ "y": "233",
+ "properties": {
+ "color": "2848996",
+ "curvature": "-1",
+ "direction": "bottom",
+ "leftArrow": "false",
+ "rightArrow": "false",
+ "p0": {
+ "x": 0,
+ "y": 0
+ },
+ "p1": {
+ "x": 0.4438624012549725,
+ "y": -0.00008403832147459165
+ },
+ "p2": {
+ "x": 0,
+ "y": 74.15918378573792
+ },
+ "stroke": "dotted"
+ }
+ },
+ {
+ "ID": "615",
+ "typeID": "Arrow",
+ "zOrder": "47",
+ "w": "1",
+ "h": "146",
+ "measuredW": "150",
+ "measuredH": "100",
+ "x": "755",
+ "y": "385",
+ "properties": {
+ "color": "2848996",
+ "curvature": "-1",
+ "direction": "bottom",
+ "leftArrow": "false",
+ "rightArrow": "false",
+ "p0": {
+ "x": 0,
+ "y": 0
+ },
+ "p1": {
+ "x": 0.44386240125497267,
+ "y": -0.00008403832147459163
+ },
+ "p2": {
+ "x": 0,
+ "y": 146
+ }
+ }
+ },
+ {
+ "ID": "638",
+ "typeID": "__group__",
+ "zOrder": "50",
+ "measuredW": "355",
+ "measuredH": "189",
+ "w": "355",
+ "h": "189",
+ "x": "171",
+ "y": "205",
+ "children": {
+ "controls": {
+ "control": [
+ {
+ "ID": "0",
+ "typeID": "Canvas",
+ "zOrder": "0",
+ "w": "355",
+ "h": "189",
+ "measuredW": "100",
+ "measuredH": "70",
+ "x": "0",
+ "y": "0"
+ },
+ {
+ "ID": "1",
+ "typeID": "__group__",
+ "zOrder": "1",
+ "measuredW": "287",
+ "measuredH": "27",
+ "w": "287",
+ "h": "27",
+ "x": "24",
+ "y": "69",
+ "properties": {
+ "controlName": "ext_link:roadmap.sh/ai-data-scientist"
+ },
+ "children": {
+ "controls": {
+ "control": [
+ {
+ "ID": "0",
+ "typeID": "Label",
+ "zOrder": "0",
+ "measuredW": "254",
+ "measuredH": "26",
+ "x": "33",
+ "y": "0",
+ "properties": {
+ "size": "18",
+ "text": "AI and Data Scientist Roadmap"
+ }
+ },
+ {
+ "ID": "1",
+ "typeID": "__group__",
+ "zOrder": "1",
+ "measuredW": "24",
+ "measuredH": "24",
+ "w": "24",
+ "h": "24",
+ "x": "0",
+ "y": "3",
+ "children": {
+ "controls": {
+ "control": [
+ {
+ "ID": "0",
+ "typeID": "Icon",
+ "zOrder": "0",
+ "measuredW": "24",
+ "measuredH": "24",
+ "x": "0",
+ "y": "0",
+ "properties": {
+ "color": "16777215",
+ "icon": {
+ "ID": "circle",
+ "size": "small"
+ }
+ }
+ },
+ {
+ "ID": "1",
+ "typeID": "Icon",
+ "zOrder": "1",
+ "measuredW": "24",
+ "measuredH": "24",
+ "x": "0",
+ "y": "0",
+ "properties": {
+ "color": "10066329",
+ "icon": {
+ "ID": "check-circle",
+ "size": "small"
+ }
+ }
+ }
+ ]
+ }
+ }
+ }
+ ]
+ }
+ }
+ },
+ {
+ "ID": "2",
+ "typeID": "__group__",
+ "zOrder": "2",
+ "measuredW": "153",
+ "measuredH": "27",
+ "w": "153",
+ "h": "27",
+ "x": "24",
+ "y": "105",
+ "properties": {
+ "controlName": "ext_link:roadmap.sh/sql"
+ },
+ "children": {
+ "controls": {
+ "control": [
+ {
+ "ID": "0",
+ "typeID": "Label",
+ "zOrder": "0",
+ "measuredW": "120",
+ "measuredH": "26",
+ "x": "33",
+ "y": "0",
+ "properties": {
+ "size": "18",
+ "text": "SQL Roadmap"
+ }
+ },
+ {
+ "ID": "1",
+ "typeID": "__group__",
+ "zOrder": "1",
+ "measuredW": "24",
+ "measuredH": "24",
+ "w": "24",
+ "h": "24",
+ "x": "0",
+ "y": "3",
+ "children": {
+ "controls": {
+ "control": [
+ {
+ "ID": "0",
+ "typeID": "Icon",
+ "zOrder": "0",
+ "measuredW": "24",
+ "measuredH": "24",
+ "x": "0",
+ "y": "0",
+ "properties": {
+ "color": "16777215",
+ "icon": {
+ "ID": "circle",
+ "size": "small"
+ }
+ }
+ },
+ {
+ "ID": "1",
+ "typeID": "Icon",
+ "zOrder": "1",
+ "measuredW": "24",
+ "measuredH": "24",
+ "x": "0",
+ "y": "0",
+ "properties": {
+ "color": "10066329",
+ "icon": {
+ "ID": "check-circle",
+ "size": "small"
+ }
+ }
+ }
+ ]
+ }
+ }
+ }
+ ]
+ }
+ }
+ },
+ {
+ "ID": "3",
+ "typeID": "Label",
+ "zOrder": "3",
+ "measuredW": "209",
+ "measuredH": "32",
+ "x": "24",
+ "y": "23",
+ "properties": {
+ "size": "24",
+ "text": "Related Roadmaps"
+ }
+ },
+ {
+ "ID": "4",
+ "typeID": "__group__",
+ "zOrder": "4",
+ "measuredW": "173",
+ "measuredH": "27",
+ "w": "173",
+ "h": "27",
+ "x": "24",
+ "y": "139",
+ "properties": {
+ "controlName": "ext_link:roadmap.sh/python"
+ },
+ "children": {
+ "controls": {
+ "control": [
+ {
+ "ID": "0",
+ "typeID": "Label",
+ "zOrder": "0",
+ "measuredW": "140",
+ "measuredH": "26",
+ "x": "33",
+ "y": "0",
+ "properties": {
+ "size": "18",
+ "text": "Python Roadmap"
+ }
+ },
+ {
+ "ID": "1",
+ "typeID": "__group__",
+ "zOrder": "1",
+ "measuredW": "24",
+ "measuredH": "24",
+ "w": "24",
+ "h": "24",
+ "x": "0",
+ "y": "3",
+ "children": {
+ "controls": {
+ "control": [
+ {
+ "ID": "0",
+ "typeID": "Icon",
+ "zOrder": "0",
+ "measuredW": "24",
+ "measuredH": "24",
+ "x": "0",
+ "y": "0",
+ "properties": {
+ "color": "16777215",
+ "icon": {
+ "ID": "circle",
+ "size": "small"
+ }
+ }
+ },
+ {
+ "ID": "1",
+ "typeID": "Icon",
+ "zOrder": "1",
+ "measuredW": "24",
+ "measuredH": "24",
+ "x": "0",
+ "y": "0",
+ "properties": {
+ "color": "10066329",
+ "icon": {
+ "ID": "check-circle",
+ "size": "small"
+ }
+ }
+ }
+ ]
+ }
+ }
+ }
+ ]
+ }
+ }
+ }
+ ]
+ }
+ }
+ },
+ {
+ "ID": "1329",
+ "typeID": "Arrow",
+ "zOrder": "43",
+ "w": "143",
+ "h": "52",
+ "measuredW": "150",
+ "measuredH": "100",
+ "x": "517",
+ "y": "471",
+ "properties": {
+ "color": "2848996",
+ "curvature": "-1",
+ "direction": "bottom",
+ "leftArrow": "false",
+ "rightArrow": "false",
+ "stroke": "dotted",
+ "p0": {
+ "x": 0,
+ "y": -0.5
+ },
+ "p1": {
+ "x": 0.4418865805727119,
+ "y": -0.11903425042111172
+ },
+ "p2": {
+ "x": 143,
+ "y": 51.5
+ }
+ }
+ },
+ {
+ "ID": "1330",
+ "typeID": "Arrow",
+ "zOrder": "42",
+ "w": "135",
+ "h": "3",
+ "measuredW": "150",
+ "measuredH": "100",
+ "x": "515",
+ "y": "531",
+ "properties": {
+ "color": "2848996",
+ "curvature": "-1",
+ "direction": "bottom",
+ "leftArrow": "false",
+ "rightArrow": "false",
+ "stroke": "dotted",
+ "p0": {
+ "x": 0,
+ "y": -0.5
+ },
+ "p1": {
+ "x": 0.4438624012549725,
+ "y": -0.0000840383214745914
+ },
+ "p2": {
+ "x": 135,
+ "y": 2.1591837857379232
+ }
+ }
+ },
+ {
+ "ID": "1332",
+ "typeID": "Arrow",
+ "zOrder": "41",
+ "w": "1",
+ "h": "74",
+ "measuredW": "150",
+ "measuredH": "100",
+ "x": "753",
+ "y": "553",
+ "properties": {
+ "color": "2848996",
+ "curvature": "-1",
+ "direction": "bottom",
+ "leftArrow": "false",
+ "rightArrow": "false",
+ "p0": {
+ "x": 0,
+ "y": 0
+ },
+ "p1": {
+ "x": 0.4438624012549725,
+ "y": -0.00008403832147459165
+ },
+ "p2": {
+ "x": 0,
+ "y": 74.15918378573792
+ },
+ "stroke": "dotted"
+ }
+ },
+ {
+ "ID": "1333",
+ "typeID": "Arrow",
+ "zOrder": "40",
+ "w": "126",
+ "h": "1",
+ "measuredW": "150",
+ "measuredH": "100",
+ "x": "858",
+ "y": "531",
+ "properties": {
+ "color": "2848996",
+ "curvature": "-1",
+ "direction": "bottom",
+ "leftArrow": "false",
+ "rightArrow": "false",
+ "p0": {
+ "x": 125.90373196641156,
+ "y": 0
+ },
+ "p1": {
+ "x": 0.44386240125497256,
+ "y": -0.00008403832147459163
+ },
+ "p2": {
+ "x": 0,
+ "y": 0
+ }
+ }
+ },
+ {
+ "ID": "1334",
+ "typeID": "Label",
+ "zOrder": "63",
+ "measuredW": "253",
+ "measuredH": "28",
+ "x": "1001",
+ "y": "516",
+ "properties": {
+ "text": "Building a strong foundation",
+ "size": "20"
+ }
+ },
+ {
+ "ID": "1335",
+ "typeID": "Arrow",
+ "zOrder": "64",
+ "w": "56",
+ "h": "1",
+ "measuredW": "150",
+ "measuredH": "100",
+ "x": "1273",
+ "y": "531",
+ "properties": {
+ "color": "2848996",
+ "curvature": "-1",
+ "direction": "bottom",
+ "leftArrow": "false",
+ "rightArrow": "false",
+ "p0": {
+ "x": 55.66147664889786,
+ "y": 0
+ },
+ "p1": {
+ "x": 0.4438624012549722,
+ "y": -0.0000840383214745916
+ },
+ "p2": {
+ "x": 0.05493884535781035,
+ "y": 0
+ }
+ }
+ },
+ {
+ "ID": "1337",
+ "typeID": "Arrow",
+ "zOrder": "65",
+ "w": "1",
+ "h": "513",
+ "measuredW": "150",
+ "measuredH": "100",
+ "x": "1328",
+ "y": "532",
+ "properties": {
+ "color": "2848996",
+ "curvature": "-1",
+ "direction": "bottom",
+ "leftArrow": "false",
+ "rightArrow": "false",
+ "p0": {
+ "x": 0,
+ "y": 0
+ },
+ "p1": {
+ "x": 0.4438624012549727,
+ "y": -0.00008403832147459163
+ },
+ "p2": {
+ "x": 0,
+ "y": 513.1453459260172
+ }
+ }
+ },
+ {
+ "ID": "1365",
+ "typeID": "Arrow",
+ "zOrder": "39",
+ "w": "1",
+ "h": "80",
+ "measuredW": "150",
+ "measuredH": "100",
+ "x": "1240",
+ "y": "961",
+ "properties": {
+ "color": "2848996",
+ "curvature": "-1",
+ "direction": "bottom",
+ "leftArrow": "false",
+ "rightArrow": "false",
+ "stroke": "dotted",
+ "p0": {
+ "x": 0,
+ "y": 0
+ },
+ "p1": {
+ "x": 0.44386240125497256,
+ "y": -0.00008403832147459165
+ },
+ "p2": {
+ "x": 0,
+ "y": 79.51506179303396
+ }
+ }
+ },
+ {
+ "ID": "1370",
+ "typeID": "Arrow",
+ "zOrder": "36",
+ "w": "529",
+ "h": "1",
+ "measuredW": "150",
+ "measuredH": "100",
+ "x": "685",
+ "y": "1052",
+ "properties": {
+ "color": "2848996",
+ "curvature": "-1",
+ "direction": "bottom",
+ "leftArrow": "false",
+ "rightArrow": "false",
+ "p0": {
+ "x": 528.9037319664117,
+ "y": 0
+ },
+ "p1": {
+ "x": 0.4438624012549723,
+ "y": -0.00008403832147459164
+ },
+ "p2": {
+ "x": 0.0075379026253585835,
+ "y": 0
+ }
+ }
+ },
+ {
+ "ID": "1381",
+ "typeID": "Arrow",
+ "zOrder": "38",
+ "w": "1",
+ "h": "80",
+ "measuredW": "150",
+ "measuredH": "100",
+ "x": "1240",
+ "y": "1051",
+ "properties": {
+ "color": "2848996",
+ "curvature": "-1",
+ "direction": "bottom",
+ "leftArrow": "false",
+ "rightArrow": "false",
+ "stroke": "dotted",
+ "p0": {
+ "x": 0,
+ "y": 0
+ },
+ "p1": {
+ "x": 0.44386240125497256,
+ "y": -0.00008403832147459165
+ },
+ "p2": {
+ "x": 0,
+ "y": 79.51506179303396
+ }
+ }
+ },
+ {
+ "ID": "1382",
+ "typeID": "Arrow",
+ "zOrder": "37",
+ "w": "61",
+ "h": "57",
+ "measuredW": "150",
+ "measuredH": "100",
+ "x": "1153",
+ "y": "1061",
+ "properties": {
+ "color": "2848996",
+ "curvature": "-1",
+ "direction": "bottom",
+ "leftArrow": "false",
+ "rightArrow": "false",
+ "stroke": "dotted",
+ "p0": {
+ "x": 0.4958937007040731,
+ "y": 56.23532543473789
+ },
+ "p1": {
+ "x": 0.4750593824228036,
+ "y": 0.22327790973871714
+ },
+ "p2": {
+ "x": 61.064522891522756,
+ "y": -0.2953951433596558
+ }
+ }
+ },
+ {
+ "ID": "1421",
+ "typeID": "Arrow",
+ "zOrder": "35",
+ "w": "1",
+ "h": "74",
+ "measuredW": "150",
+ "measuredH": "100",
+ "x": "512",
+ "y": "916",
+ "properties": {
+ "color": "2848996",
+ "curvature": "-1",
+ "direction": "bottom",
+ "leftArrow": "false",
+ "rightArrow": "false",
+ "p0": {
+ "x": 0,
+ "y": 0
+ },
+ "p1": {
+ "x": 0.4438624012549725,
+ "y": -0.00008403832147459165
+ },
+ "p2": {
+ "x": 0,
+ "y": 74.15918378573792
+ },
+ "stroke": "dotted"
+ }
+ },
+ {
+ "ID": "1422",
+ "typeID": "Arrow",
+ "zOrder": "34",
+ "w": "1",
+ "h": "74",
+ "measuredW": "150",
+ "measuredH": "100",
+ "x": "424",
+ "y": "917",
+ "properties": {
+ "color": "2848996",
+ "curvature": "-1",
+ "direction": "bottom",
+ "leftArrow": "false",
+ "rightArrow": "false",
+ "p0": {
+ "x": 0,
+ "y": 0
+ },
+ "p1": {
+ "x": 0.4438624012549725,
+ "y": -0.00008403832147459165
+ },
+ "p2": {
+ "x": 0,
+ "y": 74.15918378573792
+ },
+ "stroke": "dotted"
+ }
+ },
+ {
+ "ID": "1427",
+ "typeID": "Arrow",
+ "zOrder": "33",
+ "w": "1",
+ "h": "74",
+ "measuredW": "150",
+ "measuredH": "100",
+ "x": "423",
+ "y": "1098",
+ "properties": {
+ "color": "2848996",
+ "curvature": "-1",
+ "direction": "bottom",
+ "leftArrow": "false",
+ "rightArrow": "false",
+ "p0": {
+ "x": 0,
+ "y": 0
+ },
+ "p1": {
+ "x": 0.4438624012549725,
+ "y": -0.00008403832147459165
+ },
+ "p2": {
+ "x": 0,
+ "y": 74.15918378573792
+ },
+ "stroke": "dotted"
+ }
+ },
+ {
+ "ID": "1428",
+ "typeID": "Arrow",
+ "zOrder": "32",
+ "w": "1",
+ "h": "74",
+ "measuredW": "150",
+ "measuredH": "100",
+ "x": "526",
+ "y": "1098",
+ "properties": {
+ "color": "2848996",
+ "curvature": "-1",
+ "direction": "bottom",
+ "leftArrow": "false",
+ "rightArrow": "false",
+ "p0": {
+ "x": 0,
+ "y": 0
+ },
+ "p1": {
+ "x": 0.4438624012549725,
+ "y": -0.00008403832147459165
+ },
+ "p2": {
+ "x": 0,
+ "y": 74.15918378573792
+ },
+ "stroke": "dotted"
+ }
+ },
+ {
+ "ID": "1430",
+ "typeID": "Arrow",
+ "zOrder": "31",
+ "w": "70",
+ "h": "28",
+ "measuredW": "150",
+ "measuredH": "100",
+ "x": "321",
+ "y": "1020",
+ "properties": {
+ "color": "2848996",
+ "curvature": "-1",
+ "direction": "bottom",
+ "leftArrow": "false",
+ "rightArrow": "false",
+ "stroke": "dotted",
+ "p0": {
+ "x": 70.07784783471021,
+ "y": 28.59368712846549
+ },
+ "p1": {
+ "x": 0.5955016065690818,
+ "y": 0.14102106390574817
+ },
+ "p2": {
+ "x": 0.4401520728250716,
+ "y": 0.1701378379000289
+ }
+ }
+ },
+ {
+ "ID": "1431",
+ "typeID": "Arrow",
+ "zOrder": "30",
+ "w": "66",
+ "h": "16",
+ "measuredW": "150",
+ "measuredH": "100",
+ "x": "313",
+ "y": "1060",
+ "properties": {
+ "color": "2848996",
+ "curvature": "-1",
+ "direction": "bottom",
+ "leftArrow": "false",
+ "rightArrow": "false",
+ "stroke": "dotted",
+ "p0": {
+ "x": 66.70842811848411,
+ "y": 4.226639238276448
+ },
+ "p1": {
+ "x": 0.5123616496037375,
+ "y": -0.1339212068141815
+ },
+ "p2": {
+ "x": 0.4413022358245371,
+ "y": 16
+ }
+ }
+ },
+ {
+ "ID": "1432",
+ "typeID": "Arrow",
+ "zOrder": "92",
+ "w": "1",
+ "h": "184",
+ "measuredW": "150",
+ "measuredH": "100",
+ "x": "682",
+ "y": "960",
+ "properties": {
+ "curvature": "-1",
+ "direction": "bottom",
+ "leftArrow": "false",
+ "rightArrow": "false",
+ "p0": {
+ "x": 0,
+ "y": 0
+ },
+ "p1": {
+ "x": 0.44386240125497395,
+ "y": -0.00006668258117005643
+ },
+ "p2": {
+ "x": 0,
+ "y": 184
+ },
+ "color": "10027263"
+ }
+ },
+ {
+ "ID": "1433",
+ "typeID": "Arrow",
+ "zOrder": "93",
+ "w": "1",
+ "h": "184",
+ "measuredW": "150",
+ "measuredH": "100",
+ "x": "686",
+ "y": "959",
+ "properties": {
+ "curvature": "-1",
+ "direction": "bottom",
+ "leftArrow": "false",
+ "rightArrow": "false",
+ "p0": {
+ "x": 0,
+ "y": 0
+ },
+ "p1": {
+ "x": 0.44386240125497395,
+ "y": -0.00006668258117005643
+ },
+ "p2": {
+ "x": 0,
+ "y": 184
+ },
+ "color": "10027263"
+ }
+ },
+ {
+ "ID": "1434",
+ "typeID": "Label",
+ "zOrder": "94",
+ "measuredW": "220",
+ "measuredH": "28",
+ "x": "584",
+ "y": "921",
+ "properties": {
+ "size": "20",
+ "text": "Gain Programming Skills"
+ }
+ },
+ {
+ "ID": "1435",
+ "typeID": "Arrow",
+ "zOrder": "95",
+ "w": "99",
+ "h": "1",
+ "measuredW": "150",
+ "measuredH": "100",
+ "x": "586",
+ "y": "958",
+ "properties": {
+ "curvature": "-1",
+ "direction": "bottom",
+ "leftArrow": "false",
+ "rightArrow": "false",
+ "p0": {
+ "x": 99.00753790262536,
+ "y": 0
+ },
+ "p1": {
+ "x": 0.44386240125497256,
+ "y": -0.00008403832147459164
+ },
+ "p2": {
+ "x": 0,
+ "y": 0
+ },
+ "color": "10027263"
+ }
+ },
+ {
+ "ID": "1436",
+ "typeID": "Arrow",
+ "zOrder": "96",
+ "w": "99",
+ "h": "1",
+ "measuredW": "150",
+ "measuredH": "100",
+ "x": "586",
+ "y": "1145",
+ "properties": {
+ "curvature": "-1",
+ "direction": "bottom",
+ "leftArrow": "false",
+ "rightArrow": "false",
+ "p0": {
+ "x": 99.00753790262536,
+ "y": 0
+ },
+ "p1": {
+ "x": 0.44386240125497256,
+ "y": -0.00008403832147459164
+ },
+ "p2": {
+ "x": 0,
+ "y": 0
+ },
+ "color": "10027263"
+ }
+ },
+ {
+ "ID": "1437",
+ "typeID": "Arrow",
+ "zOrder": "97",
+ "w": "1",
+ "h": "97",
+ "measuredW": "150",
+ "measuredH": "100",
+ "x": "587",
+ "y": "1146",
+ "properties": {
+ "curvature": "-1",
+ "direction": "bottom",
+ "leftArrow": "false",
+ "rightArrow": "false",
+ "color": "10027263",
+ "p0": {
+ "x": 0,
+ "y": 0
+ },
+ "p1": {
+ "x": 0.4438624012549728,
+ "y": -0.00008403832147459163
+ },
+ "p2": {
+ "x": 0,
+ "y": 96.89400304511378
+ }
+ }
+ },
+ {
+ "ID": "1438",
+ "typeID": "Label",
+ "zOrder": "98",
+ "measuredW": "222",
+ "measuredH": "28",
+ "x": "551",
+ "y": "1261",
+ "properties": {
+ "size": "20",
+ "text": "Mastering Data handling"
+ }
+ },
+ {
+ "ID": "1440",
+ "typeID": "Arrow",
+ "zOrder": "99",
+ "w": "366",
+ "h": "1",
+ "measuredW": "150",
+ "measuredH": "100",
+ "x": "789",
+ "y": "1277",
+ "properties": {
+ "color": "2848996",
+ "curvature": "-1",
+ "direction": "bottom",
+ "leftArrow": "false",
+ "rightArrow": "false",
+ "p0": {
+ "x": 365.6128819501314,
+ "y": 0
+ },
+ "p1": {
+ "x": 0.4438624012549718,
+ "y": -0.00008403832147459163
+ },
+ "p2": {
+ "x": 0,
+ "y": 0
+ }
+ }
+ },
+ {
+ "ID": "1444",
+ "typeID": "TextArea",
+ "zOrder": "101",
+ "w": "275",
+ "h": "150",
+ "measuredW": "200",
+ "measuredH": "140",
+ "x": "798",
+ "y": "1329"
+ },
+ {
+ "ID": "1445",
+ "typeID": "Label",
+ "zOrder": "102",
+ "measuredW": "170",
+ "measuredH": "25",
+ "x": "851",
+ "y": "1344",
+ "properties": {
+ "size": "17",
+ "text": "from different Sources"
+ }
+ },
+ {
+ "ID": "1454",
+ "typeID": "Label",
+ "zOrder": "107",
+ "measuredW": "276",
+ "measuredH": "25",
+ "x": "797",
+ "y": "1492",
+ "properties": {
+ "size": "17",
+ "text": "Practice Data Collection using Each"
+ }
+ },
+ {
+ "ID": "1455",
+ "typeID": "Arrow",
+ "zOrder": "29",
+ "w": "1",
+ "h": "80",
+ "measuredW": "150",
+ "measuredH": "100",
+ "x": "934",
+ "y": "1278",
+ "properties": {
+ "color": "2848996",
+ "curvature": "-1",
+ "direction": "bottom",
+ "leftArrow": "false",
+ "rightArrow": "false",
+ "stroke": "dotted",
+ "p0": {
+ "x": 0,
+ "y": 0
+ },
+ "p1": {
+ "x": 0.44386240125497256,
+ "y": -0.00008403832147459165
+ },
+ "p2": {
+ "x": 0,
+ "y": 79.51506179303396
+ }
+ }
+ },
+ {
+ "ID": "1466",
+ "typeID": "TextArea",
+ "zOrder": "27",
+ "w": "212",
+ "h": "241",
+ "measuredW": "200",
+ "measuredH": "140",
+ "x": "1092",
+ "y": "1334"
+ },
+ {
+ "ID": "1467",
+ "typeID": "Label",
+ "zOrder": "28",
+ "measuredW": "153",
+ "measuredH": "25",
+ "x": "1115",
+ "y": "1349",
+ "properties": {
+ "size": "17",
+ "text": "different techniques"
+ }
+ },
+ {
+ "ID": "1468",
+ "typeID": "Arrow",
+ "zOrder": "26",
+ "w": "1",
+ "h": "80",
+ "measuredW": "150",
+ "measuredH": "100",
+ "x": "1183",
+ "y": "1288",
+ "properties": {
+ "color": "2848996",
+ "curvature": "-1",
+ "direction": "bottom",
+ "leftArrow": "false",
+ "rightArrow": "false",
+ "stroke": "dotted",
+ "p0": {
+ "x": 0,
+ "y": 0
+ },
+ "p1": {
+ "x": 0.44386240125497256,
+ "y": -0.00008403832147459165
+ },
+ "p2": {
+ "x": 0,
+ "y": 79.51506179303396
+ }
+ }
+ },
+ {
+ "ID": "1473",
+ "typeID": "Label",
+ "zOrder": "115",
+ "measuredW": "175",
+ "measuredH": "25",
+ "x": "1117",
+ "y": "1587",
+ "properties": {
+ "size": "17",
+ "text": "using different libraries"
+ }
+ },
+ {
+ "ID": "1474",
+ "typeID": "Arrow",
+ "zOrder": "25",
+ "w": "1",
+ "h": "444",
+ "measuredW": "150",
+ "measuredH": "100",
+ "x": "1341",
+ "y": "1288",
+ "properties": {
+ "curvature": "-1",
+ "direction": "bottom",
+ "leftArrow": "false",
+ "rightArrow": "false",
+ "color": "10027263",
+ "p0": {
+ "x": 0,
+ "y": 0
+ },
+ "p1": {
+ "x": 0.4438624012549727,
+ "y": -0.00008403832147459163
+ },
+ "p2": {
+ "x": 0,
+ "y": 443.9127867071479
+ }
+ }
+ },
+ {
+ "ID": "1475",
+ "typeID": "Arrow",
+ "zOrder": "116",
+ "w": "308",
+ "h": "1",
+ "measuredW": "150",
+ "measuredH": "100",
+ "x": "1034",
+ "y": "1732",
+ "properties": {
+ "color": "2848996",
+ "curvature": "-1",
+ "direction": "bottom",
+ "leftArrow": "false",
+ "rightArrow": "false",
+ "p0": {
+ "x": 307.6128819501314,
+ "y": 0
+ },
+ "p1": {
+ "x": 0.4438624012549717,
+ "y": -0.00008403832147459164
+ },
+ "p2": {
+ "x": 0,
+ "y": 0
+ }
+ }
+ },
+ {
+ "ID": "1476",
+ "typeID": "Label",
+ "zOrder": "117",
+ "measuredW": "230",
+ "measuredH": "28",
+ "x": "639",
+ "y": "1569",
+ "properties": {
+ "size": "20",
+ "text": "Data Analysis Techniques"
+ }
+ },
+ {
+ "ID": "1477",
+ "typeID": "Arrow",
+ "zOrder": "118",
+ "w": "1",
+ "h": "147",
+ "measuredW": "150",
+ "measuredH": "100",
+ "x": "1034",
+ "y": "1583",
+ "properties": {
+ "color": "2848996",
+ "curvature": "-1",
+ "direction": "bottom",
+ "leftArrow": "false",
+ "rightArrow": "false",
+ "p0": {
+ "x": 0.029677358783033014,
+ "y": 147.15168676237067
+ },
+ "p1": {
+ "x": 0.44386240125497145,
+ "y": -0.0000840383214745916
+ },
+ "p2": {
+ "x": 0.029677358782919327,
+ "y": 0
+ }
+ }
+ },
+ {
+ "ID": "1478",
+ "typeID": "Arrow",
+ "zOrder": "119",
+ "w": "151",
+ "h": "1",
+ "measuredW": "150",
+ "measuredH": "100",
+ "x": "883",
+ "y": "1582",
+ "properties": {
+ "color": "2848996",
+ "curvature": "-1",
+ "direction": "bottom",
+ "leftArrow": "false",
+ "rightArrow": "false",
+ "p0": {
+ "x": 150.6128819501314,
+ "y": 0
+ },
+ "p1": {
+ "x": 0.44386240125497173,
+ "y": -0.00008403832147459164
+ },
+ "p2": {
+ "x": 0,
+ "y": 0
+ }
+ }
+ },
+ {
+ "ID": "1528",
+ "typeID": "Label",
+ "zOrder": "128",
+ "measuredW": "108",
+ "measuredH": "25",
+ "x": "450",
+ "y": "1877",
+ "properties": {
+ "size": "17",
+ "text": "Charting Data"
+ }
+ },
+ {
+ "ID": "1547",
+ "typeID": "Label",
+ "zOrder": "138",
+ "measuredW": "160",
+ "measuredH": "25",
+ "x": "186",
+ "y": "1490",
+ "properties": {
+ "size": "17",
+ "text": "Generating Statistics"
+ }
+ },
+ {
+ "ID": "1548",
+ "typeID": "Arrow",
+ "zOrder": "23",
+ "w": "230",
+ "h": "1",
+ "measuredW": "150",
+ "measuredH": "100",
+ "x": "392",
+ "y": "1582",
+ "properties": {
+ "color": "2848996",
+ "curvature": "-1",
+ "direction": "bottom",
+ "leftArrow": "false",
+ "rightArrow": "false",
+ "p0": {
+ "x": 229.6128819501314,
+ "y": 0
+ },
+ "p1": {
+ "x": 0.44386240125497156,
+ "y": -0.00008403832147459164
+ },
+ "p2": {
+ "x": 0,
+ "y": 0
+ }
+ }
+ },
+ {
+ "ID": "1549",
+ "typeID": "Arrow",
+ "zOrder": "22",
+ "w": "1",
+ "h": "133",
+ "measuredW": "150",
+ "measuredH": "100",
+ "x": "265",
+ "y": "1522",
+ "properties": {
+ "color": "2848996",
+ "curvature": "-1",
+ "direction": "bottom",
+ "leftArrow": "false",
+ "rightArrow": "false",
+ "stroke": "dotted",
+ "p0": {
+ "x": 0,
+ "y": 0
+ },
+ "p1": {
+ "x": 0.4438624012549726,
+ "y": -0.00008403832147459165
+ },
+ "p2": {
+ "x": 0,
+ "y": 133
+ }
+ }
+ },
+ {
+ "ID": "1550",
+ "typeID": "Arrow",
+ "zOrder": "139",
+ "w": "387",
+ "h": "1",
+ "measuredW": "150",
+ "measuredH": "100",
+ "x": "360",
+ "y": "1502",
+ "properties": {
+ "curvature": "-1",
+ "direction": "bottom",
+ "leftArrow": "false",
+ "rightArrow": "false",
+ "color": "2848996",
+ "p0": {
+ "x": 387,
+ "y": 0
+ },
+ "p1": {
+ "x": 0.4438624012549725,
+ "y": -0.00008403832147459165
+ },
+ "p2": {
+ "x": 0,
+ "y": 0
+ },
+ "stroke": "dotted"
+ }
+ },
+ {
+ "ID": "1551",
+ "typeID": "Arrow",
+ "zOrder": "21",
+ "w": "1",
+ "h": "207",
+ "measuredW": "150",
+ "measuredH": "100",
+ "x": "440",
+ "y": "1597",
+ "properties": {
+ "curvature": "-1",
+ "direction": "bottom",
+ "leftArrow": "false",
+ "rightArrow": "false",
+ "color": "10027263",
+ "p0": {
+ "x": 0,
+ "y": 0
+ },
+ "p1": {
+ "x": 0.4438624012549729,
+ "y": -0.00008403832147459164
+ },
+ "p2": {
+ "x": 0,
+ "y": 206.5
+ }
+ }
+ },
+ {
+ "ID": "1555",
+ "typeID": "Label",
+ "zOrder": "141",
+ "measuredW": "40",
+ "measuredH": "25",
+ "x": "230",
+ "y": "1878",
+ "properties": {
+ "size": "17",
+ "text": "Tools"
+ }
+ },
+ {
+ "ID": "1561",
+ "typeID": "Label",
+ "zOrder": "144",
+ "measuredW": "125",
+ "measuredH": "25",
+ "x": "304",
+ "y": "1878",
+ "properties": {
+ "size": "17",
+ "text": "Python Libraries"
+ }
+ },
+ {
+ "ID": "1568",
+ "typeID": "Arrow",
+ "zOrder": "20",
+ "w": "1",
+ "h": "58",
+ "measuredW": "150",
+ "measuredH": "100",
+ "x": "255",
+ "y": "1805",
+ "properties": {
+ "color": "2848996",
+ "curvature": "-1",
+ "direction": "bottom",
+ "leftArrow": "false",
+ "rightArrow": "false",
+ "stroke": "dotted",
+ "p0": {
+ "x": 0,
+ "y": 0
+ },
+ "p1": {
+ "x": 0.4438624012549727,
+ "y": -0.00008403832147459165
+ },
+ "p2": {
+ "x": 0,
+ "y": 58
+ }
+ }
+ },
+ {
+ "ID": "1569",
+ "typeID": "Arrow",
+ "zOrder": "19",
+ "w": "1",
+ "h": "58",
+ "measuredW": "150",
+ "measuredH": "100",
+ "x": "366",
+ "y": "1815",
+ "properties": {
+ "color": "2848996",
+ "curvature": "-1",
+ "direction": "bottom",
+ "leftArrow": "false",
+ "rightArrow": "false",
+ "stroke": "dotted",
+ "p0": {
+ "x": 0,
+ "y": 0
+ },
+ "p1": {
+ "x": 0.4438624012549727,
+ "y": -0.00008403832147459165
+ },
+ "p2": {
+ "x": 0,
+ "y": 58
+ }
+ }
+ },
+ {
+ "ID": "1570",
+ "typeID": "Arrow",
+ "zOrder": "18",
+ "w": "1",
+ "h": "58",
+ "measuredW": "150",
+ "measuredH": "100",
+ "x": "468",
+ "y": "1811",
+ "properties": {
+ "color": "2848996",
+ "curvature": "-1",
+ "direction": "bottom",
+ "leftArrow": "false",
+ "rightArrow": "false",
+ "stroke": "dotted",
+ "p0": {
+ "x": 0,
+ "y": 0
+ },
+ "p1": {
+ "x": 0.4438624012549727,
+ "y": -0.00008403832147459165
+ },
+ "p2": {
+ "x": 0,
+ "y": 58
+ }
+ }
+ },
+ {
+ "ID": "1571",
+ "typeID": "Arrow",
+ "zOrder": "17",
+ "w": "318",
+ "h": "1",
+ "measuredW": "150",
+ "measuredH": "100",
+ "x": "459",
+ "y": "1798",
+ "properties": {
+ "color": "2848996",
+ "curvature": "-1",
+ "direction": "bottom",
+ "leftArrow": "false",
+ "rightArrow": "false",
+ "p0": {
+ "x": 317.5,
+ "y": 0
+ },
+ "p1": {
+ "x": 0.44386240125497156,
+ "y": -0.00008403832147459164
+ },
+ "p2": {
+ "x": 0,
+ "y": 0
+ }
+ }
+ },
+ {
+ "ID": "1580",
+ "typeID": "Arrow",
+ "zOrder": "16",
+ "w": "1",
+ "h": "66",
+ "measuredW": "150",
+ "measuredH": "100",
+ "x": "848",
+ "y": "1805",
+ "properties": {
+ "color": "2848996",
+ "curvature": "-1",
+ "direction": "bottom",
+ "leftArrow": "false",
+ "rightArrow": "false",
+ "stroke": "dotted",
+ "p0": {
+ "x": 0,
+ "y": 0
+ },
+ "p1": {
+ "x": 0.44386240125497284,
+ "y": -0.00008403832147459165
+ },
+ "p2": {
+ "x": 0,
+ "y": 66
+ }
+ }
+ },
+ {
+ "ID": "1581",
+ "typeID": "Label",
+ "zOrder": "152",
+ "measuredW": "202",
+ "measuredH": "25",
+ "x": "750",
+ "y": "1880",
+ "properties": {
+ "size": "17",
+ "text": "Learn different techniques"
+ }
+ },
+ {
+ "ID": "1582",
+ "typeID": "Label",
+ "zOrder": "153",
+ "measuredW": "263",
+ "measuredH": "25",
+ "x": "721",
+ "y": "1701",
+ "properties": {
+ "size": "17",
+ "text": "Learn to analyze relationships and"
+ }
+ },
+ {
+ "ID": "1583",
+ "typeID": "Label",
+ "zOrder": "154",
+ "measuredW": "212",
+ "measuredH": "25",
+ "x": "721",
+ "y": "1728",
+ "properties": {
+ "size": "17",
+ "text": "make data-driven decisions"
+ }
+ },
+ {
+ "ID": "1584",
+ "typeID": "Arrow",
+ "zOrder": "15",
+ "w": "142",
+ "h": "1",
+ "measuredW": "150",
+ "measuredH": "100",
+ "x": "959",
+ "y": "1795",
+ "properties": {
+ "color": "2848996",
+ "curvature": "-1",
+ "direction": "bottom",
+ "leftArrow": "false",
+ "rightArrow": "false",
+ "p0": {
+ "x": 141.96370477209098,
+ "y": 0
+ },
+ "p1": {
+ "x": 0.4438624012549715,
+ "y": -0.00008403832147459163
+ },
+ "p2": {
+ "x": 0,
+ "y": 0
+ }
+ }
+ },
+ {
+ "ID": "1585",
+ "typeID": "Label",
+ "zOrder": "155",
+ "measuredW": "153",
+ "measuredH": "28",
+ "x": "1123",
+ "y": "1779",
+ "properties": {
+ "size": "20",
+ "text": "Advanced Topics"
+ }
+ },
+ {
+ "ID": "1586",
+ "typeID": "Arrow",
+ "zOrder": "156",
+ "w": "47",
+ "h": "1",
+ "measuredW": "150",
+ "measuredH": "100",
+ "x": "1292",
+ "y": "1792",
+ "properties": {
+ "color": "2848996",
+ "curvature": "-1",
+ "direction": "bottom",
+ "leftArrow": "false",
+ "rightArrow": "false",
+ "p0": {
+ "x": 46.52104304164391,
+ "y": 0
+ },
+ "p1": {
+ "x": 0.44386240125497134,
+ "y": -0.00008403832147459164
+ },
+ "p2": {
+ "x": 0,
+ "y": 0
+ }
+ }
+ },
+ {
+ "ID": "1587",
+ "typeID": "Arrow",
+ "zOrder": "157",
+ "w": "1",
+ "h": "621",
+ "measuredW": "150",
+ "measuredH": "100",
+ "x": "1340",
+ "y": "1792",
+ "properties": {
+ "curvature": "-1",
+ "direction": "bottom",
+ "leftArrow": "false",
+ "rightArrow": "false",
+ "color": "10027263",
+ "p0": {
+ "x": 0,
+ "y": 0
+ },
+ "p1": {
+ "x": 0.44386240125497295,
+ "y": -0.00008403832147459165
+ },
+ "p2": {
+ "x": 0,
+ "y": 620.9555019156123
+ }
+ }
+ },
+ {
+ "ID": "1596",
+ "typeID": "Label",
+ "zOrder": "162",
+ "measuredW": "208",
+ "measuredH": "25",
+ "x": "1059",
+ "y": "2059",
+ "properties": {
+ "size": "17",
+ "text": "Types of Machine Learning"
+ }
+ },
+ {
+ "ID": "1597",
+ "typeID": "Arrow",
+ "zOrder": "14",
+ "w": "1",
+ "h": "117",
+ "measuredW": "150",
+ "measuredH": "100",
+ "x": "1176",
+ "y": "2092",
+ "properties": {
+ "color": "2848996",
+ "curvature": "-1",
+ "direction": "bottom",
+ "leftArrow": "false",
+ "rightArrow": "false",
+ "stroke": "dotted",
+ "p0": {
+ "x": 0,
+ "y": 0
+ },
+ "p1": {
+ "x": 0.4438624012549729,
+ "y": -0.00008403832147459165
+ },
+ "p2": {
+ "x": 0,
+ "y": 116.55972101871248
+ }
+ }
+ },
+ {
+ "ID": "1598",
+ "typeID": "Label",
+ "zOrder": "163",
+ "measuredW": "173",
+ "measuredH": "25",
+ "x": "764",
+ "y": "2140",
+ "properties": {
+ "size": "17",
+ "text": "Popular ML Algorithms"
+ }
+ },
+ {
+ "ID": "1611",
+ "typeID": "Arrow",
+ "zOrder": "13",
+ "w": "196",
+ "h": "1",
+ "measuredW": "150",
+ "measuredH": "100",
+ "x": "955",
+ "y": "2153",
+ "properties": {
+ "color": "2848996",
+ "curvature": "-1",
+ "direction": "bottom",
+ "leftArrow": "false",
+ "rightArrow": "false",
+ "stroke": "dotted",
+ "p0": {
+ "x": 0.05285233241625065,
+ "y": -0.44027898128751985
+ },
+ "p1": {
+ "x": 0.44386240125497295,
+ "y": -0.00008403832147459168
+ },
+ "p2": {
+ "x": 196,
+ "y": -0.44027898128751985
+ }
+ }
+ },
+ {
+ "ID": "1612",
+ "typeID": "Arrow",
+ "zOrder": "170",
+ "w": "685",
+ "h": "1",
+ "measuredW": "150",
+ "measuredH": "100",
+ "x": "652",
+ "y": "2413",
+ "properties": {
+ "color": "2848996",
+ "curvature": "-1",
+ "direction": "bottom",
+ "leftArrow": "false",
+ "rightArrow": "false",
+ "p0": {
+ "x": 684.963704772091,
+ "y": 0
+ },
+ "p1": {
+ "x": 0.44386240125497134,
+ "y": -0.00008403832147459163
+ },
+ "p2": {
+ "x": -0.22466327566792188,
+ "y": 0
+ }
+ }
+ },
+ {
+ "ID": "1628",
+ "typeID": "Arrow",
+ "zOrder": "12",
+ "w": "1",
+ "h": "235",
+ "measuredW": "150",
+ "measuredH": "100",
+ "x": "534",
+ "y": "2249",
+ "properties": {
+ "color": "2848996",
+ "curvature": "-1",
+ "direction": "bottom",
+ "leftArrow": "false",
+ "rightArrow": "false",
+ "stroke": "dotted",
+ "p0": {
+ "x": 0,
+ "y": -0.04347272732775309
+ },
+ "p1": {
+ "x": 0.4438624012549728,
+ "y": -0.00008403832147459165
+ },
+ "p2": {
+ "x": 0,
+ "y": 235.10211591512325
+ }
+ }
+ },
+ {
+ "ID": "1629",
+ "typeID": "Arrow",
+ "zOrder": "11",
+ "w": "230",
+ "h": "1",
+ "measuredW": "150",
+ "measuredH": "100",
+ "x": "361",
+ "y": "2408",
+ "properties": {
+ "color": "2848996",
+ "curvature": "-1",
+ "direction": "bottom",
+ "leftArrow": "false",
+ "rightArrow": "false",
+ "stroke": "dotted",
+ "p0": {
+ "x": 0.1303889300434662,
+ "y": 0.10211591512324958
+ },
+ "p1": {
+ "x": 0.4438624012549728,
+ "y": -0.00008403832147459164
+ },
+ "p2": {
+ "x": 230,
+ "y": 0.10211591512324958
+ }
+ }
+ },
+ {
+ "ID": "1630",
+ "typeID": "Arrow",
+ "zOrder": "10",
+ "w": "1",
+ "h": "61",
+ "measuredW": "150",
+ "measuredH": "100",
+ "x": "238",
+ "y": "2341",
+ "properties": {
+ "color": "2848996",
+ "curvature": "-1",
+ "direction": "bottom",
+ "leftArrow": "false",
+ "rightArrow": "false",
+ "stroke": "dotted",
+ "p0": {
+ "x": 0,
+ "y": -0.3969868974495512
+ },
+ "p1": {
+ "x": 0.4438624012549729,
+ "y": -0.00008403832147459165
+ },
+ "p2": {
+ "x": 0,
+ "y": 61.10211591512325
+ }
+ }
+ },
+ {
+ "ID": "1637",
+ "typeID": "Arrow",
+ "zOrder": "9",
+ "w": "1",
+ "h": "171",
+ "measuredW": "150",
+ "measuredH": "100",
+ "x": "672",
+ "y": "2421",
+ "properties": {
+ "color": "2848996",
+ "curvature": "-1",
+ "direction": "bottom",
+ "leftArrow": "false",
+ "rightArrow": "false",
+ "p0": {
+ "x": 0.029677358782919327,
+ "y": 171.17099790893508
+ },
+ "p1": {
+ "x": 0.4438624012549712,
+ "y": -0.00008403832147459165
+ },
+ "p2": {
+ "x": 0.029677358782919327,
+ "y": 0
+ }
+ }
+ },
+ {
+ "ID": "1640",
+ "typeID": "Label",
+ "zOrder": "182",
+ "measuredW": "130",
+ "measuredH": "25",
+ "x": "205",
+ "y": "2588",
+ "properties": {
+ "size": "17",
+ "text": "Learn the Basics"
+ }
+ },
+ {
+ "ID": "1647",
+ "typeID": "Arrow",
+ "zOrder": "8",
+ "w": "149",
+ "h": "1",
+ "measuredW": "150",
+ "measuredH": "100",
+ "x": "355",
+ "y": "2599",
+ "properties": {
+ "color": "2848996",
+ "curvature": "-1",
+ "direction": "bottom",
+ "leftArrow": "false",
+ "rightArrow": "false",
+ "stroke": "dotted",
+ "p0": {
+ "x": 0.1303889300434662,
+ "y": 1.1021159151232496
+ },
+ "p1": {
+ "x": 0.4438624012549728,
+ "y": -0.00008403832147459165
+ },
+ "p2": {
+ "x": 149.16646837220503,
+ "y": 0.36481196418662876
+ }
+ }
+ },
+ {
+ "ID": "1648",
+ "typeID": "Label",
+ "zOrder": "186",
+ "measuredW": "94",
+ "measuredH": "25",
+ "x": "271",
+ "y": "2652",
+ "properties": {
+ "size": "17",
+ "text": "Frameworks"
+ }
+ },
+ {
+ "ID": "1649",
+ "typeID": "Arrow",
+ "zOrder": "7",
+ "w": "121",
+ "h": "32",
+ "measuredW": "150",
+ "measuredH": "100",
+ "x": "359",
+ "y": "2610",
+ "properties": {
+ "color": "2848996",
+ "curvature": "-1",
+ "direction": "bottom",
+ "leftArrow": "false",
+ "rightArrow": "false",
+ "stroke": "dotted",
+ "p0": {
+ "x": 0.09121825796768235,
+ "y": 32.52769629569548
+ },
+ "p1": {
+ "x": 0.3456883509833585,
+ "y": 0.10703479576399379
+ },
+ "p2": {
+ "x": 121.18708818803356,
+ "y": 0.15553304706372728
+ }
+ }
+ },
+ {
+ "ID": "1654",
+ "typeID": "Arrow",
+ "zOrder": "6",
+ "w": "1",
+ "h": "50",
+ "measuredW": "150",
+ "measuredH": "100",
+ "x": "590",
+ "y": "2598",
+ "properties": {
+ "color": "2848996",
+ "curvature": "-1",
+ "direction": "bottom",
+ "leftArrow": "false",
+ "rightArrow": "false",
+ "stroke": "dotted",
+ "p0": {
+ "x": 0,
+ "y": -0.04347272732775309
+ },
+ "p1": {
+ "x": 0.4438624012549729,
+ "y": -0.00008403832147459165
+ },
+ "p2": {
+ "x": 0,
+ "y": 50.11944836936391
+ }
+ }
+ },
+ {
+ "ID": "1656",
+ "typeID": "Label",
+ "zOrder": "189",
+ "measuredW": "191",
+ "measuredH": "25",
+ "x": "503",
+ "y": "2653",
+ "properties": {
+ "size": "17",
+ "text": "Practice Training Models"
+ }
+ },
+ {
+ "ID": "1661",
+ "typeID": "Arrow",
+ "zOrder": "5",
+ "w": "149",
+ "h": "1",
+ "measuredW": "150",
+ "measuredH": "100",
+ "x": "682",
+ "y": "2600",
+ "properties": {
+ "color": "2848996",
+ "curvature": "-1",
+ "direction": "bottom",
+ "leftArrow": "false",
+ "rightArrow": "false",
+ "p0": {
+ "x": 148.5,
+ "y": 0
+ },
+ "p1": {
+ "x": 0.4438624012549713,
+ "y": -0.00008403832147459164
+ },
+ "p2": {
+ "x": -0.22466327566792188,
+ "y": 0
+ }
+ }
+ },
+ {
+ "ID": "1666",
+ "typeID": "Label",
+ "zOrder": "192",
+ "measuredW": "177",
+ "measuredH": "25",
+ "x": "874",
+ "y": "2532",
+ "properties": {
+ "size": "17",
+ "text": "Predicting sales trends"
+ }
+ },
+ {
+ "ID": "1670",
+ "typeID": "Arrow",
+ "zOrder": "193",
+ "w": "332",
+ "h": "1",
+ "measuredW": "150",
+ "measuredH": "100",
+ "x": "834",
+ "y": "2481",
+ "properties": {
+ "color": "2848996",
+ "curvature": "-1",
+ "direction": "bottom",
+ "leftArrow": "false",
+ "rightArrow": "false",
+ "p0": {
+ "x": 331.43436899668745,
+ "y": 0
+ },
+ "p1": {
+ "x": 0.4438624012549713,
+ "y": -0.00008403832147459163
+ },
+ "p2": {
+ "x": -0.22466327566792188,
+ "y": 0
+ }
+ }
+ },
+ {
+ "ID": "1671",
+ "typeID": "Arrow",
+ "zOrder": "194",
+ "w": "1",
+ "h": "516",
+ "measuredW": "150",
+ "measuredH": "100",
+ "x": "835",
+ "y": "2482",
+ "properties": {
+ "color": "2848996",
+ "curvature": "-1",
+ "direction": "bottom",
+ "leftArrow": "false",
+ "rightArrow": "false",
+ "p0": {
+ "x": 0,
+ "y": 516
+ },
+ "p1": {
+ "x": 0.443862401254973,
+ "y": -0.00007729088990482165
+ },
+ "p2": {
+ "x": 0,
+ "y": 0
+ }
+ }
+ },
+ {
+ "ID": "1672",
+ "typeID": "Arrow",
+ "zOrder": "195",
+ "w": "1",
+ "h": "516",
+ "measuredW": "150",
+ "measuredH": "100",
+ "x": "832",
+ "y": "2481",
+ "properties": {
+ "color": "2848996",
+ "curvature": "-1",
+ "direction": "bottom",
+ "leftArrow": "false",
+ "rightArrow": "false",
+ "p0": {
+ "x": 0,
+ "y": 516
+ },
+ "p1": {
+ "x": 0.443862401254973,
+ "y": -0.00007729088990482165
+ },
+ "p2": {
+ "x": 0,
+ "y": 0
+ }
+ }
+ },
+ {
+ "ID": "1673",
+ "typeID": "Label",
+ "zOrder": "196",
+ "measuredW": "326",
+ "measuredH": "25",
+ "x": "827",
+ "y": "2450",
+ "properties": {
+ "size": "17",
+ "text": "Practice / Build Projects / Networking Tips"
+ }
+ },
+ {
+ "ID": "1675",
+ "typeID": "Label",
+ "zOrder": "197",
+ "measuredW": "187",
+ "measuredH": "25",
+ "x": "874",
+ "y": "2557",
+ "properties": {
+ "size": "17",
+ "text": "Customer Segmentation"
+ }
+ },
+ {
+ "ID": "1677",
+ "typeID": "TextArea",
+ "zOrder": "198",
+ "w": "10",
+ "h": "10",
+ "measuredW": "200",
+ "measuredH": "140",
+ "x": "853",
+ "y": "2538",
+ "properties": {
+ "color": "13421772",
+ "borderColor": "13421772"
+ }
+ },
+ {
+ "ID": "1678",
+ "typeID": "TextArea",
+ "zOrder": "199",
+ "w": "10",
+ "h": "10",
+ "measuredW": "200",
+ "measuredH": "140",
+ "x": "853",
+ "y": "2563",
+ "properties": {
+ "color": "13421772",
+ "borderColor": "13421772"
+ }
+ },
+ {
+ "ID": "1680",
+ "typeID": "Label",
+ "zOrder": "200",
+ "measuredW": "397",
+ "measuredH": "25",
+ "x": "851",
+ "y": "2500",
+ "properties": {
+ "size": "17",
+ "text": "Build a portfolio of projects. Some example projects:"
+ }
+ },
+ {
+ "ID": "1681",
+ "typeID": "Arrow",
+ "zOrder": "201",
+ "w": "259",
+ "h": "1",
+ "measuredW": "150",
+ "measuredH": "100",
+ "x": "834",
+ "y": "2599",
+ "properties": {
+ "color": "2848996",
+ "curvature": "-1",
+ "direction": "bottom",
+ "leftArrow": "false",
+ "rightArrow": "false",
+ "p0": {
+ "x": 258.5,
+ "y": 0
+ },
+ "p1": {
+ "x": 0.44386240125497134,
+ "y": -0.00008403832147459163
+ },
+ "p2": {
+ "x": -0.22466327566792188,
+ "y": 0
+ }
+ }
+ },
+ {
+ "ID": "1682",
+ "typeID": "Label",
+ "zOrder": "202",
+ "measuredW": "161",
+ "measuredH": "25",
+ "x": "851",
+ "y": "2612",
+ "properties": {
+ "size": "17",
+ "text": "Kaggle Competitions"
+ }
+ },
+ {
+ "ID": "1683",
+ "typeID": "Label",
+ "zOrder": "203",
+ "measuredW": "409",
+ "measuredH": "25",
+ "x": "874",
+ "y": "2643",
+ "properties": {
+ "size": "17",
+ "text": "Participate in competitions and learn from community"
+ }
+ },
+ {
+ "ID": "1684",
+ "typeID": "TextArea",
+ "zOrder": "204",
+ "w": "10",
+ "h": "10",
+ "measuredW": "200",
+ "measuredH": "140",
+ "x": "853",
+ "y": "2650",
+ "properties": {
+ "color": "13421772",
+ "borderColor": "13421772"
+ }
+ },
+ {
+ "ID": "1685",
+ "typeID": "Label",
+ "zOrder": "205",
+ "measuredW": "497",
+ "measuredH": "25",
+ "x": "874",
+ "y": "2670",
+ "properties": {
+ "size": "17",
+ "text": "Collaborate, explore different approaches, and improve your skills"
+ }
+ },
+ {
+ "ID": "1686",
+ "typeID": "TextArea",
+ "zOrder": "206",
+ "w": "10",
+ "h": "10",
+ "measuredW": "200",
+ "measuredH": "140",
+ "x": "853",
+ "y": "2677",
+ "properties": {
+ "color": "13421772",
+ "borderColor": "13421772"
+ }
+ },
+ {
+ "ID": "1687",
+ "typeID": "Arrow",
+ "zOrder": "207",
+ "w": "259",
+ "h": "1",
+ "measuredW": "150",
+ "measuredH": "100",
+ "x": "834",
+ "y": "2717",
+ "properties": {
+ "color": "2848996",
+ "curvature": "-1",
+ "direction": "bottom",
+ "leftArrow": "false",
+ "rightArrow": "false",
+ "p0": {
+ "x": 258.5,
+ "y": 0
+ },
+ "p1": {
+ "x": 0.44386240125497134,
+ "y": -0.00008403832147459163
+ },
+ "p2": {
+ "x": -0.22466327566792188,
+ "y": 0
+ }
+ }
+ },
+ {
+ "ID": "1688",
+ "typeID": "Label",
+ "zOrder": "208",
+ "measuredW": "259",
+ "measuredH": "25",
+ "x": "851",
+ "y": "2732",
+ "properties": {
+ "size": "17",
+ "text": "Online Courses and Certifications"
+ }
+ },
+ {
+ "ID": "1689",
+ "typeID": "Label",
+ "zOrder": "209",
+ "measuredW": "418",
+ "measuredH": "25",
+ "x": "874",
+ "y": "2765",
+ "properties": {
+ "size": "17",
+ "text": "Enroll in online courses or pursue certifications to gain"
+ }
+ },
+ {
+ "ID": "1690",
+ "typeID": "TextArea",
+ "zOrder": "210",
+ "w": "10",
+ "h": "10",
+ "measuredW": "200",
+ "measuredH": "140",
+ "x": "853",
+ "y": "2772",
+ "properties": {
+ "color": "13421772",
+ "borderColor": "13421772"
+ }
+ },
+ {
+ "ID": "1691",
+ "typeID": "Label",
+ "zOrder": "211",
+ "measuredW": "242",
+ "measuredH": "25",
+ "x": "874",
+ "y": "2788",
+ "properties": {
+ "size": "17",
+ "text": "learning and validate your skills."
+ }
+ },
+ {
+ "ID": "1692",
+ "typeID": "Label",
+ "zOrder": "212",
+ "measuredW": "439",
+ "measuredH": "25",
+ "x": "874",
+ "y": "2817",
+ "properties": {
+ "size": "17",
+ "text": "Platforms like Coursera, edX, Udemy, and DataCamp offer"
+ }
+ },
+ {
+ "ID": "1693",
+ "typeID": "TextArea",
+ "zOrder": "213",
+ "w": "10",
+ "h": "10",
+ "measuredW": "200",
+ "measuredH": "140",
+ "x": "853",
+ "y": "2824",
+ "properties": {
+ "color": "13421772",
+ "borderColor": "13421772"
+ }
+ },
+ {
+ "ID": "1695",
+ "typeID": "Label",
+ "zOrder": "214",
+ "measuredW": "336",
+ "measuredH": "25",
+ "x": "874",
+ "y": "2843",
+ "properties": {
+ "size": "17",
+ "text": "courses in data analytics and related topics."
+ }
+ },
+ {
+ "ID": "1696",
+ "typeID": "Arrow",
+ "zOrder": "215",
+ "w": "259",
+ "h": "1",
+ "measuredW": "150",
+ "measuredH": "100",
+ "x": "834",
+ "y": "2889",
+ "properties": {
+ "color": "2848996",
+ "curvature": "-1",
+ "direction": "bottom",
+ "leftArrow": "false",
+ "rightArrow": "false",
+ "p0": {
+ "x": 258.5,
+ "y": 0
+ },
+ "p1": {
+ "x": 0.44386240125497134,
+ "y": -0.00008403832147459163
+ },
+ "p2": {
+ "x": -0.22466327566792188,
+ "y": 0
+ }
+ }
+ },
+ {
+ "ID": "1697",
+ "typeID": "Label",
+ "zOrder": "216",
+ "measuredW": "199",
+ "measuredH": "25",
+ "x": "851",
+ "y": "2906",
+ "properties": {
+ "size": "17",
+ "text": "Stay updated and network"
+ }
+ },
+ {
+ "ID": "1698",
+ "typeID": "Label",
+ "zOrder": "217",
+ "measuredW": "491",
+ "measuredH": "25",
+ "x": "874",
+ "y": "2940",
+ "properties": {
+ "size": "17",
+ "text": "Stay updated with the latest trends, tools, and techniques in data"
+ }
+ },
+ {
+ "ID": "1699",
+ "typeID": "TextArea",
+ "zOrder": "218",
+ "w": "10",
+ "h": "10",
+ "measuredW": "200",
+ "measuredH": "140",
+ "x": "853",
+ "y": "2947",
+ "properties": {
+ "color": "13421772",
+ "borderColor": "13421772"
+ }
+ },
+ {
+ "ID": "1701",
+ "typeID": "Label",
+ "zOrder": "219",
+ "measuredW": "453",
+ "measuredH": "25",
+ "x": "874",
+ "y": "2994",
+ "properties": {
+ "size": "17",
+ "text": "Explore advanced topics (AI ethics, data governance, cloud"
+ }
+ },
+ {
+ "ID": "1702",
+ "typeID": "TextArea",
+ "zOrder": "220",
+ "w": "10",
+ "h": "10",
+ "measuredW": "200",
+ "measuredH": "140",
+ "x": "853",
+ "y": "3001",
+ "properties": {
+ "color": "13421772",
+ "borderColor": "13421772"
+ }
+ },
+ {
+ "ID": "1703",
+ "typeID": "Label",
+ "zOrder": "221",
+ "measuredW": "309",
+ "measuredH": "25",
+ "x": "874",
+ "y": "3020",
+ "properties": {
+ "size": "17",
+ "text": " computing) to enhance your knowledge."
+ }
+ },
+ {
+ "ID": "1704",
+ "typeID": "Label",
+ "zOrder": "222",
+ "measuredW": "437",
+ "measuredH": "25",
+ "x": "874",
+ "y": "2965",
+ "properties": {
+ "size": "17",
+ "text": "analytics through blogs, forums, and industry publications."
+ }
+ },
+ {
+ "ID": "1705",
+ "typeID": "Label",
+ "zOrder": "223",
+ "measuredW": "464",
+ "measuredH": "25",
+ "x": "874",
+ "y": "3053",
+ "properties": {
+ "size": "17",
+ "text": "Connect with professionals in the data analytics field through"
+ }
+ },
+ {
+ "ID": "1706",
+ "typeID": "TextArea",
+ "zOrder": "224",
+ "w": "10",
+ "h": "10",
+ "measuredW": "200",
+ "measuredH": "140",
+ "x": "853",
+ "y": "3060",
+ "properties": {
+ "color": "13421772",
+ "borderColor": "13421772"
+ }
+ },
+ {
+ "ID": "1707",
+ "typeID": "Label",
+ "zOrder": "225",
+ "measuredW": "472",
+ "measuredH": "25",
+ "x": "874",
+ "y": "3107",
+ "properties": {
+ "size": "17",
+ "text": "Seek mentorship, attend webinars, and engage in discussions"
+ }
+ },
+ {
+ "ID": "1708",
+ "typeID": "TextArea",
+ "zOrder": "226",
+ "w": "10",
+ "h": "10",
+ "measuredW": "200",
+ "measuredH": "140",
+ "x": "853",
+ "y": "3114",
+ "properties": {
+ "color": "13421772",
+ "borderColor": "13421772"
+ }
+ },
+ {
+ "ID": "1709",
+ "typeID": "Label",
+ "zOrder": "227",
+ "measuredW": "376",
+ "measuredH": "25",
+ "x": "874",
+ "y": "3133",
+ "properties": {
+ "size": "17",
+ "text": "to expand your network and career opportunities."
+ }
+ },
+ {
+ "ID": "1710",
+ "typeID": "Label",
+ "zOrder": "228",
+ "measuredW": "459",
+ "measuredH": "25",
+ "x": "874",
+ "y": "3078",
+ "properties": {
+ "size": "17",
+ "text": "LinkedIn, networking events, and data science communities."
+ }
+ },
+ {
+ "ID": "1711",
+ "typeID": "Arrow",
+ "zOrder": "229",
+ "w": "310",
+ "h": "1",
+ "measuredW": "150",
+ "measuredH": "100",
+ "x": "518",
+ "y": "2890",
+ "properties": {
+ "color": "2848996",
+ "curvature": "-1",
+ "direction": "bottom",
+ "leftArrow": "false",
+ "rightArrow": "false",
+ "p0": {
+ "x": 309.5,
+ "y": 0
+ },
+ "p1": {
+ "x": 0.4438624012549713,
+ "y": -0.00008403832147459163
+ },
+ "p2": {
+ "x": -0.02916933480548778,
+ "y": 0
+ }
+ }
+ },
+ {
+ "ID": "1712",
+ "typeID": "Arrow",
+ "zOrder": "230",
+ "w": "2",
+ "h": "89",
+ "measuredW": "150",
+ "measuredH": "100",
+ "x": "495",
+ "y": "3088",
+ "properties": {
+ "color": "2848996",
+ "curvature": "0",
+ "leftArrow": "false",
+ "p0": {
+ "x": 1,
+ "y": 88
+ },
+ "p1": {
+ "x": 0.4072427393330943,
+ "y": 0.00953746862674794
+ },
+ "p2": {
+ "x": 1,
+ "y": 0
+ },
+ "rightArrow": "false",
+ "stroke": "dotted"
+ }
+ },
+ {
+ "ID": "1713",
+ "typeID": "TextArea",
+ "zOrder": "231",
+ "w": "350",
+ "h": "118",
+ "measuredW": "200",
+ "measuredH": "140",
+ "x": "316",
+ "y": "3001"
+ },
+ {
+ "ID": "1714",
+ "typeID": "Label",
+ "zOrder": "232",
+ "measuredW": "299",
+ "measuredH": "25",
+ "x": "338",
+ "y": "3020",
+ "properties": {
+ "size": "17",
+ "text": "Continue Learning with following tracks"
+ }
+ },
+ {
+ "ID": "1716",
+ "typeID": "__group__",
+ "zOrder": "233",
+ "measuredW": "311",
+ "measuredH": "44",
+ "w": "311",
+ "h": "44",
+ "x": "337",
+ "y": "3056",
+ "properties": {
+ "controlName": "ext_link:roadmap.sh/ai-data-scientist"
+ },
+ "children": {
+ "controls": {
+ "control": [
+ {
+ "ID": "0",
+ "typeID": "TextArea",
+ "zOrder": "0",
+ "w": "311",
+ "h": "44",
+ "measuredW": "200",
+ "measuredH": "140",
+ "x": "0",
+ "y": "0",
+ "properties": {
+ "color": "16770457"
+ }
+ },
+ {
+ "ID": "1",
+ "typeID": "Label",
+ "zOrder": "1",
+ "measuredW": "240",
+ "measuredH": "25",
+ "x": "36",
+ "y": "9",
+ "properties": {
+ "size": "17",
+ "text": "AI and Data Scientist Roadmap"
+ }
+ }
+ ]
+ }
+ }
+ },
+ {
+ "ID": "1717",
+ "typeID": "Arrow",
+ "zOrder": "234",
+ "w": "240",
+ "h": "2",
+ "measuredW": "150",
+ "measuredH": "100",
+ "x": "376",
+ "y": "3206",
+ "properties": {
+ "curvature": "0",
+ "leftArrow": "false",
+ "rightArrow": "false",
+ "stroke": "dotted",
+ "color": "16777215",
+ "p0": {
+ "x": 0,
+ "y": 2.0909090909090082
+ },
+ "p1": {
+ "x": 0.4072427393330942,
+ "y": 0.00953746862674794
+ },
+ "p2": {
+ "x": 240.29238284114695,
+ "y": 2.0909090909090082
+ }
+ }
+ },
+ {
+ "ID": "1718",
+ "typeID": "Arrow",
+ "zOrder": "4",
+ "w": "1",
+ "h": "144",
+ "measuredW": "150",
+ "measuredH": "100",
+ "x": "518",
+ "y": "2890",
+ "properties": {
+ "color": "2848996",
+ "curvature": "-1",
+ "direction": "bottom",
+ "leftArrow": "false",
+ "rightArrow": "false",
+ "p0": {
+ "x": -0.22466327566792188,
+ "y": 144.0786301580174
+ },
+ "p1": {
+ "x": 0.4438624012549712,
+ "y": -0.00008403832147459138
+ },
+ "p2": {
+ "x": -0.22466327566792188,
+ "y": 0
+ }
+ }
+ },
+ {
+ "ID": "1719",
+ "typeID": "__group__",
+ "zOrder": "48",
+ "measuredW": "238",
+ "measuredH": "50",
+ "w": "238",
+ "h": "50",
+ "x": "635",
+ "y": "507",
+ "properties": {
+ "controlName": "100-introduction"
+ },
+ "children": {
+ "controls": {
+ "control": [
+ {
+ "ID": "0",
+ "typeID": "TextArea",
+ "zOrder": "0",
+ "w": "238",
+ "h": "50",
+ "measuredW": "200",
+ "measuredH": "140",
+ "x": "0",
+ "y": "0",
+ "properties": {
+ "color": "16776960"
+ }
+ },
+ {
+ "ID": "1",
+ "typeID": "Label",
+ "zOrder": "1",
+ "measuredW": "93",
+ "measuredH": "25",
+ "x": "70",
+ "y": "13",
+ "properties": {
+ "size": "17",
+ "text": "Introduction"
+ }
+ }
+ ]
+ }
+ }
+ },
+ {
+ "ID": "1720",
+ "typeID": "__group__",
+ "zOrder": "49",
+ "measuredW": "289",
+ "measuredH": "50",
+ "w": "289",
+ "h": "50",
+ "x": "238",
+ "y": "449",
+ "properties": {
+ "controlName": "100-introduction:data-analytics"
+ },
+ "children": {
+ "controls": {
+ "control": [
+ {
+ "ID": "0",
+ "typeID": "TextArea",
+ "zOrder": "0",
+ "w": "289",
+ "h": "50",
+ "measuredW": "200",
+ "measuredH": "140",
+ "x": "0",
+ "y": "0",
+ "properties": {
+ "color": "16770457"
+ }
+ },
+ {
+ "ID": "1",
+ "typeID": "Label",
+ "zOrder": "1",
+ "measuredW": "179",
+ "measuredH": "25",
+ "x": "43",
+ "y": "13",
+ "properties": {
+ "size": "17",
+ "text": "What is Data Analytics?"
+ }
+ }
+ ]
+ }
+ }
+ },
+ {
+ "ID": "1721",
+ "typeID": "__group__",
+ "zOrder": "51",
+ "measuredW": "289",
+ "measuredH": "236",
+ "w": "289",
+ "h": "236",
+ "x": "238",
+ "y": "505",
+ "properties": {
+ "controlName": "101-introduction:types-data-analytics"
+ },
+ "children": {
+ "controls": {
+ "control": [
+ {
+ "ID": "0",
+ "typeID": "TextArea",
+ "zOrder": "0",
+ "w": "289",
+ "h": "236",
+ "measuredW": "200",
+ "measuredH": "140",
+ "x": "0",
+ "y": "0"
+ },
+ {
+ "ID": "1",
+ "typeID": "Label",
+ "zOrder": "1",
+ "measuredW": "178",
+ "measuredH": "25",
+ "x": "56",
+ "y": "14",
+ "properties": {
+ "size": "17",
+ "text": "Types of Data Analytics"
+ }
+ }
+ ]
+ }
+ }
+ },
+ {
+ "ID": "1722",
+ "typeID": "__group__",
+ "zOrder": "56",
+ "measuredW": "237",
+ "measuredH": "236",
+ "w": "237",
+ "h": "236",
+ "x": "635",
+ "y": "611",
+ "properties": {
+ "controlName": "102-introduction:keyconcepts-for-data"
+ },
+ "children": {
+ "controls": {
+ "control": [
+ {
+ "ID": "0",
+ "typeID": "TextArea",
+ "zOrder": "0",
+ "w": "237",
+ "h": "236",
+ "measuredW": "200",
+ "measuredH": "140",
+ "x": "0",
+ "y": "0"
+ },
+ {
+ "ID": "1",
+ "typeID": "Label",
+ "zOrder": "1",
+ "measuredW": "172",
+ "measuredH": "25",
+ "x": "32",
+ "y": "14",
+ "properties": {
+ "size": "17",
+ "text": "Key Concepts for Data"
+ }
+ }
+ ]
+ }
+ }
+ },
+ {
+ "ID": "1723",
+ "typeID": "__group__",
+ "zOrder": "52",
+ "measuredW": "288",
+ "measuredH": "50",
+ "w": "288",
+ "h": "50",
+ "x": "238",
+ "y": "553",
+ "properties": {
+ "controlName": "100-introduction:types-data-analytics:descriptive"
+ },
+ "children": {
+ "controls": {
+ "control": [
+ {
+ "ID": "0",
+ "typeID": "TextArea",
+ "zOrder": "0",
+ "w": "288",
+ "h": "50",
+ "measuredW": "200",
+ "measuredH": "140",
+ "x": "0",
+ "y": "0",
+ "properties": {
+ "color": "16770457"
+ }
+ },
+ {
+ "ID": "1",
+ "typeID": "Label",
+ "zOrder": "1",
+ "measuredW": "159",
+ "measuredH": "25",
+ "x": "64",
+ "y": "13",
+ "properties": {
+ "size": "17",
+ "text": "Descriptive Analytics"
+ }
+ }
+ ]
+ }
+ }
+ },
+ {
+ "ID": "1724",
+ "typeID": "__group__",
+ "zOrder": "53",
+ "measuredW": "288",
+ "measuredH": "50",
+ "w": "288",
+ "h": "50",
+ "x": "238",
+ "y": "600",
+ "properties": {
+ "controlName": "101-introduction:types-data-analytics:diagnostic"
+ },
+ "children": {
+ "controls": {
+ "control": [
+ {
+ "ID": "0",
+ "typeID": "TextArea",
+ "zOrder": "0",
+ "w": "288",
+ "h": "50",
+ "measuredW": "200",
+ "measuredH": "140",
+ "x": "0",
+ "y": "0",
+ "properties": {
+ "color": "16770457"
+ }
+ },
+ {
+ "ID": "1",
+ "typeID": "Label",
+ "zOrder": "1",
+ "measuredW": "155",
+ "measuredH": "25",
+ "x": "66",
+ "y": "13",
+ "properties": {
+ "size": "17",
+ "text": "Diagnostic Analytics"
+ }
+ }
+ ]
+ }
+ }
+ },
+ {
+ "ID": "1725",
+ "typeID": "__group__",
+ "zOrder": "54",
+ "measuredW": "288",
+ "measuredH": "50",
+ "w": "288",
+ "h": "50",
+ "x": "238",
+ "y": "646",
+ "properties": {
+ "controlName": "102-introduction:types-data-analytics:predictive"
+ },
+ "children": {
+ "controls": {
+ "control": [
+ {
+ "ID": "0",
+ "typeID": "TextArea",
+ "zOrder": "0",
+ "w": "288",
+ "h": "50",
+ "measuredW": "200",
+ "measuredH": "140",
+ "x": "0",
+ "y": "0",
+ "properties": {
+ "color": "16770457"
+ }
+ },
+ {
+ "ID": "1",
+ "typeID": "Label",
+ "zOrder": "1",
+ "measuredW": "149",
+ "measuredH": "25",
+ "x": "69",
+ "y": "13",
+ "properties": {
+ "size": "17",
+ "text": "Predictive Analytics"
+ }
+ }
+ ]
+ }
+ }
+ },
+ {
+ "ID": "1726",
+ "typeID": "__group__",
+ "zOrder": "55",
+ "measuredW": "288",
+ "measuredH": "50",
+ "w": "288",
+ "h": "50",
+ "x": "238",
+ "y": "693",
+ "properties": {
+ "controlName": "103-introduction:types-data-analytics:prescriptive"
+ },
+ "children": {
+ "controls": {
+ "control": [
+ {
+ "ID": "0",
+ "typeID": "TextArea",
+ "zOrder": "0",
+ "w": "288",
+ "h": "50",
+ "measuredW": "200",
+ "measuredH": "140",
+ "x": "0",
+ "y": "0",
+ "properties": {
+ "color": "16770457"
+ }
+ },
+ {
+ "ID": "1",
+ "typeID": "Label",
+ "zOrder": "1",
+ "measuredW": "163",
+ "measuredH": "25",
+ "x": "62",
+ "y": "13",
+ "properties": {
+ "size": "17",
+ "text": "Prescriptive Analytics"
+ }
+ }
+ ]
+ }
+ }
+ },
+ {
+ "ID": "1727",
+ "typeID": "__group__",
+ "zOrder": "57",
+ "measuredW": "119",
+ "measuredH": "50",
+ "w": "119",
+ "h": "50",
+ "x": "635",
+ "y": "659",
+ "properties": {
+ "controlName": "100-introduction:keyconcepts-for-data:collection"
+ },
+ "children": {
+ "controls": {
+ "control": [
+ {
+ "ID": "0",
+ "typeID": "TextArea",
+ "zOrder": "0",
+ "w": "119",
+ "h": "50",
+ "measuredW": "200",
+ "measuredH": "140",
+ "x": "0",
+ "y": "0",
+ "properties": {
+ "color": "16770457"
+ }
+ },
+ {
+ "ID": "1",
+ "typeID": "Label",
+ "zOrder": "1",
+ "measuredW": "77",
+ "measuredH": "25",
+ "x": "21",
+ "y": "13",
+ "properties": {
+ "size": "17",
+ "text": "Collection"
+ }
+ }
+ ]
+ }
+ }
+ },
+ {
+ "ID": "1728",
+ "typeID": "__group__",
+ "zOrder": "58",
+ "measuredW": "122",
+ "measuredH": "50",
+ "w": "122",
+ "h": "50",
+ "x": "749",
+ "y": "659",
+ "properties": {
+ "controlName": "101-introduction:keyconcepts-for-data:cleanup"
+ },
+ "children": {
+ "controls": {
+ "control": [
+ {
+ "ID": "0",
+ "typeID": "TextArea",
+ "zOrder": "0",
+ "w": "122",
+ "h": "50",
+ "measuredW": "200",
+ "measuredH": "140",
+ "x": "0",
+ "y": "0",
+ "properties": {
+ "color": "16770457"
+ }
+ },
+ {
+ "ID": "1",
+ "typeID": "Label",
+ "zOrder": "1",
+ "measuredW": "65",
+ "measuredH": "25",
+ "x": "28",
+ "y": "13",
+ "properties": {
+ "size": "17",
+ "text": "Cleanup"
+ }
+ }
+ ]
+ }
+ }
+ },
+ {
+ "ID": "1729",
+ "typeID": "__group__",
+ "zOrder": "59",
+ "measuredW": "119",
+ "measuredH": "50",
+ "w": "119",
+ "h": "50",
+ "x": "635",
+ "y": "706",
+ "properties": {
+ "controlName": "102-introduction:keyconcepts-for-data:exploration"
+ },
+ "children": {
+ "controls": {
+ "control": [
+ {
+ "ID": "0",
+ "typeID": "TextArea",
+ "zOrder": "0",
+ "w": "119",
+ "h": "50",
+ "measuredW": "200",
+ "measuredH": "140",
+ "x": "0",
+ "y": "0",
+ "properties": {
+ "color": "16770457"
+ }
+ },
+ {
+ "ID": "1",
+ "typeID": "Label",
+ "zOrder": "1",
+ "measuredW": "87",
+ "measuredH": "25",
+ "x": "16",
+ "y": "13",
+ "properties": {
+ "size": "17",
+ "text": "Exploration"
+ }
+ }
+ ]
+ }
+ }
+ },
+ {
+ "ID": "1730",
+ "typeID": "__group__",
+ "zOrder": "60",
+ "measuredW": "122",
+ "measuredH": "50",
+ "w": "122",
+ "h": "50",
+ "x": "749",
+ "y": "706",
+ "properties": {
+ "controlName": "103-introduction:keyconcepts-for-data:visualization"
+ },
+ "children": {
+ "controls": {
+ "control": [
+ {
+ "ID": "0",
+ "typeID": "TextArea",
+ "zOrder": "0",
+ "w": "122",
+ "h": "50",
+ "measuredW": "200",
+ "measuredH": "140",
+ "x": "0",
+ "y": "0",
+ "properties": {
+ "color": "16770457"
+ }
+ },
+ {
+ "ID": "1",
+ "typeID": "Label",
+ "zOrder": "1",
+ "measuredW": "96",
+ "measuredH": "25",
+ "x": "13",
+ "y": "13",
+ "properties": {
+ "size": "17",
+ "text": "Visualization"
+ }
+ }
+ ]
+ }
+ }
+ },
+ {
+ "ID": "1731",
+ "typeID": "__group__",
+ "zOrder": "61",
+ "measuredW": "237",
+ "measuredH": "50",
+ "w": "237",
+ "h": "50",
+ "x": "634",
+ "y": "753",
+ "properties": {
+ "controlName": "104-introduction:keyconcepts-for-data:statistical-analysis"
+ },
+ "children": {
+ "controls": {
+ "control": [
+ {
+ "ID": "0",
+ "typeID": "TextArea",
+ "zOrder": "0",
+ "w": "237",
+ "h": "50",
+ "measuredW": "200",
+ "measuredH": "140",
+ "x": "0",
+ "y": "0",
+ "properties": {
+ "color": "16770457"
+ }
+ },
+ {
+ "ID": "1",
+ "typeID": "Label",
+ "zOrder": "1",
+ "measuredW": "141",
+ "measuredH": "25",
+ "x": "48",
+ "y": "13",
+ "properties": {
+ "size": "17",
+ "text": "Statistical Analysis"
+ }
+ }
+ ]
+ }
+ }
+ },
+ {
+ "ID": "1732",
+ "typeID": "__group__",
+ "zOrder": "62",
+ "measuredW": "237",
+ "measuredH": "50",
+ "w": "237",
+ "h": "50",
+ "x": "634",
+ "y": "799",
+ "properties": {
+ "controlName": "105-introduction:keyconcepts-for-data:machine-learning"
+ },
+ "children": {
+ "controls": {
+ "control": [
+ {
+ "ID": "0",
+ "typeID": "TextArea",
+ "zOrder": "0",
+ "w": "237",
+ "h": "50",
+ "measuredW": "200",
+ "measuredH": "140",
+ "x": "0",
+ "y": "0",
+ "properties": {
+ "color": "16770457"
+ }
+ },
+ {
+ "ID": "1",
+ "typeID": "Label",
+ "zOrder": "1",
+ "measuredW": "140",
+ "measuredH": "25",
+ "x": "49",
+ "y": "13",
+ "properties": {
+ "size": "17",
+ "text": "Machine Learning"
+ }
+ }
+ ]
+ }
+ }
+ },
+ {
+ "ID": "1733",
+ "typeID": "__group__",
+ "zOrder": "66",
+ "measuredW": "153",
+ "measuredH": "50",
+ "w": "153",
+ "h": "50",
+ "x": "1203",
+ "y": "1026",
+ "properties": {
+ "controlName": "101-excel"
+ },
+ "children": {
+ "controls": {
+ "control": [
+ {
+ "ID": "0",
+ "typeID": "TextArea",
+ "zOrder": "0",
+ "w": "153",
+ "h": "50",
+ "measuredW": "200",
+ "measuredH": "140",
+ "x": "0",
+ "y": "0",
+ "properties": {
+ "color": "16776960"
+ }
+ },
+ {
+ "ID": "1",
+ "typeID": "Label",
+ "zOrder": "1",
+ "measuredW": "42",
+ "measuredH": "25",
+ "x": "56",
+ "y": "13",
+ "properties": {
+ "size": "17",
+ "text": "Excel"
+ }
+ }
+ ]
+ }
+ }
+ },
+ {
+ "ID": "1734",
+ "typeID": "__group__",
+ "zOrder": "67",
+ "measuredW": "255",
+ "measuredH": "377",
+ "w": "255",
+ "h": "377",
+ "x": "1023",
+ "y": "612",
+ "properties": {
+ "controlName": "100-excel:basic-functions"
+ },
+ "children": {
+ "controls": {
+ "control": [
+ {
+ "ID": "0",
+ "typeID": "TextArea",
+ "zOrder": "0",
+ "w": "255",
+ "h": "377",
+ "measuredW": "200",
+ "measuredH": "140",
+ "x": "0",
+ "y": "0"
+ },
+ {
+ "ID": "1",
+ "typeID": "Label",
+ "zOrder": "1",
+ "measuredW": "172",
+ "measuredH": "25",
+ "x": "42",
+ "y": "340",
+ "properties": {
+ "size": "17",
+ "text": "Learn Basic Functions"
+ }
+ }
+ ]
+ }
+ }
+ },
+ {
+ "ID": "1735",
+ "typeID": "__group__",
+ "zOrder": "79",
+ "measuredW": "153",
+ "measuredH": "50",
+ "w": "153",
+ "h": "50",
+ "x": "1203",
+ "y": "1105",
+ "properties": {
+ "controlName": "101-excel:pivot-tables"
+ },
+ "children": {
+ "controls": {
+ "control": [
+ {
+ "ID": "0",
+ "typeID": "TextArea",
+ "zOrder": "0",
+ "w": "153",
+ "h": "50",
+ "measuredW": "200",
+ "measuredH": "140",
+ "x": "0",
+ "y": "0",
+ "properties": {
+ "color": "16770457"
+ }
+ },
+ {
+ "ID": "1",
+ "typeID": "Label",
+ "zOrder": "1",
+ "measuredW": "91",
+ "measuredH": "25",
+ "x": "31",
+ "y": "13",
+ "properties": {
+ "size": "17",
+ "text": "Pivot Tables"
+ }
+ }
+ ]
+ }
+ }
+ },
+ {
+ "ID": "1736",
+ "typeID": "__group__",
+ "zOrder": "80",
+ "measuredW": "103",
+ "measuredH": "50",
+ "w": "103",
+ "h": "50",
+ "x": "1092",
+ "y": "1106",
+ "properties": {
+ "controlName": "102-excel:charting"
+ },
+ "children": {
+ "controls": {
+ "control": [
+ {
+ "ID": "0",
+ "typeID": "TextArea",
+ "zOrder": "0",
+ "w": "103",
+ "h": "50",
+ "measuredW": "200",
+ "measuredH": "140",
+ "x": "0",
+ "y": "0",
+ "properties": {
+ "color": "16770457"
+ }
+ },
+ {
+ "ID": "1",
+ "typeID": "Label",
+ "zOrder": "1",
+ "measuredW": "67",
+ "measuredH": "25",
+ "x": "18",
+ "y": "13",
+ "properties": {
+ "size": "17",
+ "text": "Charting"
+ }
+ }
+ ]
+ }
+ }
+ },
+ {
+ "ID": "1737",
+ "typeID": "__group__",
+ "zOrder": "68",
+ "measuredW": "124",
+ "measuredH": "50",
+ "w": "124",
+ "h": "50",
+ "x": "1024",
+ "y": "612",
+ "properties": {
+ "controlName": "100-excel:basic-functions:sum"
+ },
+ "children": {
+ "controls": {
+ "control": [
+ {
+ "ID": "0",
+ "typeID": "TextArea",
+ "zOrder": "0",
+ "w": "124",
+ "h": "50",
+ "measuredW": "200",
+ "measuredH": "140",
+ "x": "0",
+ "y": "0",
+ "properties": {
+ "color": "16770457"
+ }
+ },
+ {
+ "ID": "1",
+ "typeID": "Label",
+ "zOrder": "1",
+ "measuredW": "34",
+ "measuredH": "25",
+ "x": "45",
+ "y": "13",
+ "properties": {
+ "size": "17",
+ "text": "Sum"
+ }
+ }
+ ]
+ }
+ }
+ },
+ {
+ "ID": "1738",
+ "typeID": "__group__",
+ "zOrder": "69",
+ "measuredW": "133",
+ "measuredH": "50",
+ "w": "133",
+ "h": "50",
+ "x": "1145",
+ "y": "612",
+ "properties": {
+ "controlName": "101-excel:basic-functions:min-max"
+ },
+ "children": {
+ "controls": {
+ "control": [
+ {
+ "ID": "0",
+ "typeID": "TextArea",
+ "zOrder": "0",
+ "w": "133",
+ "h": "50",
+ "measuredW": "200",
+ "measuredH": "140",
+ "x": "0",
+ "y": "0",
+ "properties": {
+ "color": "16770457"
+ }
+ },
+ {
+ "ID": "1",
+ "typeID": "Label",
+ "zOrder": "1",
+ "measuredW": "85",
+ "measuredH": "25",
+ "x": "22",
+ "y": "13",
+ "properties": {
+ "size": "17",
+ "text": "MIN / MAX"
+ }
+ }
+ ]
+ }
+ }
+ },
+ {
+ "ID": "1739",
+ "typeID": "__group__",
+ "zOrder": "70",
+ "measuredW": "124",
+ "measuredH": "50",
+ "w": "124",
+ "h": "50",
+ "x": "1024",
+ "y": "658",
+ "properties": {
+ "controlName": "102-excel:basic-functions:average"
+ },
+ "children": {
+ "controls": {
+ "control": [
+ {
+ "ID": "0",
+ "typeID": "TextArea",
+ "zOrder": "0",
+ "w": "124",
+ "h": "50",
+ "measuredW": "200",
+ "measuredH": "140",
+ "x": "0",
+ "y": "0",
+ "properties": {
+ "color": "16770457"
+ }
+ },
+ {
+ "ID": "1",
+ "typeID": "Label",
+ "zOrder": "1",
+ "measuredW": "77",
+ "measuredH": "25",
+ "x": "23",
+ "y": "13",
+ "properties": {
+ "size": "17",
+ "text": "AVERAGE"
+ }
+ }
+ ]
+ }
+ }
+ },
+ {
+ "ID": "1740",
+ "typeID": "__group__",
+ "zOrder": "71",
+ "measuredW": "133",
+ "measuredH": "50",
+ "w": "133",
+ "h": "50",
+ "x": "1145",
+ "y": "658",
+ "properties": {
+ "controlName": "103-excel:basic-functions:count"
+ },
+ "children": {
+ "controls": {
+ "control": [
+ {
+ "ID": "0",
+ "typeID": "TextArea",
+ "zOrder": "0",
+ "w": "133",
+ "h": "50",
+ "measuredW": "200",
+ "measuredH": "140",
+ "x": "0",
+ "y": "0",
+ "properties": {
+ "color": "16770457"
+ }
+ },
+ {
+ "ID": "1",
+ "typeID": "Label",
+ "zOrder": "1",
+ "measuredW": "61",
+ "measuredH": "25",
+ "x": "34",
+ "y": "13",
+ "properties": {
+ "size": "17",
+ "text": "COUNT"
+ }
+ }
+ ]
+ }
+ }
+ },
+ {
+ "ID": "1741",
+ "typeID": "__group__",
+ "zOrder": "72",
+ "measuredW": "124",
+ "measuredH": "50",
+ "w": "124",
+ "h": "50",
+ "x": "1024",
+ "y": "705",
+ "properties": {
+ "controlName": "104-excel:basic-functions:concat"
+ },
+ "children": {
+ "controls": {
+ "control": [
+ {
+ "ID": "0",
+ "typeID": "TextArea",
+ "zOrder": "0",
+ "w": "124",
+ "h": "50",
+ "measuredW": "200",
+ "measuredH": "140",
+ "x": "0",
+ "y": "0",
+ "properties": {
+ "color": "16770457"
+ }
+ },
+ {
+ "ID": "1",
+ "typeID": "Label",
+ "zOrder": "1",
+ "measuredW": "69",
+ "measuredH": "25",
+ "x": "27",
+ "y": "13",
+ "properties": {
+ "size": "17",
+ "text": "CONCAT"
+ }
+ }
+ ]
+ }
+ }
+ },
+ {
+ "ID": "1742",
+ "typeID": "__group__",
+ "zOrder": "73",
+ "measuredW": "133",
+ "measuredH": "50",
+ "w": "133",
+ "h": "50",
+ "x": "1145",
+ "y": "705",
+ "properties": {
+ "controlName": "105-excel:basic-functions:trim"
+ },
+ "children": {
+ "controls": {
+ "control": [
+ {
+ "ID": "0",
+ "typeID": "TextArea",
+ "zOrder": "0",
+ "w": "133",
+ "h": "50",
+ "measuredW": "200",
+ "measuredH": "140",
+ "x": "0",
+ "y": "0",
+ "properties": {
+ "color": "16770457"
+ }
+ },
+ {
+ "ID": "1",
+ "typeID": "Label",
+ "zOrder": "1",
+ "measuredW": "43",
+ "measuredH": "25",
+ "x": "43",
+ "y": "13",
+ "properties": {
+ "size": "17",
+ "text": "TRIM"
+ }
+ }
+ ]
+ }
+ }
+ },
+ {
+ "ID": "1743",
+ "typeID": "__group__",
+ "zOrder": "74",
+ "measuredW": "254",
+ "measuredH": "50",
+ "w": "254",
+ "h": "50",
+ "x": "1024",
+ "y": "752",
+ "properties": {
+ "controlName": "106-excel:basic-functions:upper-lower-proper"
+ },
+ "children": {
+ "controls": {
+ "control": [
+ {
+ "ID": "0",
+ "typeID": "TextArea",
+ "zOrder": "0",
+ "w": "254",
+ "h": "50",
+ "measuredW": "200",
+ "measuredH": "140",
+ "x": "0",
+ "y": "0",
+ "properties": {
+ "color": "16770457"
+ }
+ },
+ {
+ "ID": "1",
+ "typeID": "Label",
+ "zOrder": "1",
+ "measuredW": "222",
+ "measuredH": "25",
+ "x": "15",
+ "y": "13",
+ "properties": {
+ "size": "17",
+ "text": "UPPER / LOWER / PROPER"
+ }
+ }
+ ]
+ }
+ }
+ },
+ {
+ "ID": "1744",
+ "typeID": "__group__",
+ "zOrder": "75",
+ "measuredW": "254",
+ "measuredH": "50",
+ "w": "254",
+ "h": "50",
+ "x": "1024",
+ "y": "799",
+ "properties": {
+ "controlName": "107-excel:basic-functions:replace-substitute"
+ },
+ "children": {
+ "controls": {
+ "control": [
+ {
+ "ID": "0",
+ "typeID": "TextArea",
+ "zOrder": "0",
+ "w": "254",
+ "h": "50",
+ "measuredW": "200",
+ "measuredH": "140",
+ "x": "0",
+ "y": "0",
+ "properties": {
+ "color": "16770457"
+ }
+ },
+ {
+ "ID": "1",
+ "typeID": "Label",
+ "zOrder": "1",
+ "measuredW": "198",
+ "measuredH": "25",
+ "x": "21",
+ "y": "13",
+ "properties": {
+ "size": "17",
+ "text": "REPLACE / SUBSTITUTE"
+ }
+ }
+ ]
+ }
+ }
+ },
+ {
+ "ID": "1745",
+ "typeID": "__group__",
+ "zOrder": "76",
+ "measuredW": "255",
+ "measuredH": "50",
+ "w": "255",
+ "h": "50",
+ "x": "1023",
+ "y": "845",
+ "properties": {
+ "controlName": "108-excel:basic-functions:vlookup-hlookup"
+ },
+ "children": {
+ "controls": {
+ "control": [
+ {
+ "ID": "0",
+ "typeID": "TextArea",
+ "zOrder": "0",
+ "w": "255",
+ "h": "50",
+ "measuredW": "200",
+ "measuredH": "140",
+ "x": "0",
+ "y": "0",
+ "properties": {
+ "color": "16770457"
+ }
+ },
+ {
+ "ID": "1",
+ "typeID": "Label",
+ "zOrder": "1",
+ "measuredW": "179",
+ "measuredH": "25",
+ "x": "38",
+ "y": "13",
+ "properties": {
+ "size": "17",
+ "text": "VLOOKUP / HLOOKUP"
+ }
+ }
+ ]
+ }
+ }
+ },
+ {
+ "ID": "1746",
+ "typeID": "__group__",
+ "zOrder": "77",
+ "measuredW": "125",
+ "measuredH": "50",
+ "w": "125",
+ "h": "50",
+ "x": "1023",
+ "y": "892",
+ "properties": {
+ "controlName": "109-excel:basic-functions:if"
+ },
+ "children": {
+ "controls": {
+ "control": [
+ {
+ "ID": "0",
+ "typeID": "TextArea",
+ "zOrder": "0",
+ "w": "125",
+ "h": "50",
+ "measuredW": "200",
+ "measuredH": "140",
+ "x": "0",
+ "y": "0",
+ "properties": {
+ "color": "16770457"
+ }
+ },
+ {
+ "ID": "1",
+ "typeID": "Label",
+ "zOrder": "1",
+ "measuredW": "16",
+ "measuredH": "25",
+ "x": "55",
+ "y": "13",
+ "properties": {
+ "size": "17",
+ "text": "IF"
+ }
+ }
+ ]
+ }
+ }
+ },
+ {
+ "ID": "1747",
+ "typeID": "__group__",
+ "zOrder": "78",
+ "measuredW": "133",
+ "measuredH": "50",
+ "w": "133",
+ "h": "50",
+ "x": "1145",
+ "y": "892",
+ "properties": {
+ "controlName": "110-excel:basic-functions:datedif"
+ },
+ "children": {
+ "controls": {
+ "control": [
+ {
+ "ID": "0",
+ "typeID": "TextArea",
+ "zOrder": "0",
+ "w": "133",
+ "h": "50",
+ "measuredW": "200",
+ "measuredH": "140",
+ "x": "0",
+ "y": "0",
+ "properties": {
+ "color": "16770457"
+ }
+ },
+ {
+ "ID": "1",
+ "typeID": "Label",
+ "zOrder": "1",
+ "measuredW": "70",
+ "measuredH": "25",
+ "x": "32",
+ "y": "13",
+ "properties": {
+ "size": "17",
+ "text": "DATEDIF"
+ }
+ }
+ ]
+ }
+ }
+ },
+ {
+ "ID": "1748",
+ "typeID": "__group__",
+ "zOrder": "81",
+ "measuredW": "210",
+ "measuredH": "50",
+ "w": "210",
+ "h": "50",
+ "x": "836",
+ "y": "1026",
+ "properties": {
+ "controlName": "102-sql"
+ },
+ "children": {
+ "controls": {
+ "control": [
+ {
+ "ID": "0",
+ "typeID": "TextArea",
+ "zOrder": "0",
+ "w": "210",
+ "h": "50",
+ "measuredW": "200",
+ "measuredH": "140",
+ "x": "0",
+ "y": "0",
+ "properties": {
+ "color": "16776960"
+ }
+ },
+ {
+ "ID": "1",
+ "typeID": "Label",
+ "zOrder": "1",
+ "measuredW": "34",
+ "measuredH": "25",
+ "x": "88",
+ "y": "13",
+ "properties": {
+ "size": "17",
+ "text": "SQL"
+ }
+ }
+ ]
+ }
+ }
+ },
+ {
+ "ID": "1749",
+ "typeID": "__group__",
+ "zOrder": "82",
+ "measuredW": "211",
+ "measuredH": "28",
+ "w": "211",
+ "h": "28",
+ "x": "835",
+ "y": "1089",
+ "properties": {
+ "controlName": "ext_link:roadmap.sh/sql"
+ },
+ "children": {
+ "controls": {
+ "control": [
+ {
+ "ID": "0",
+ "typeID": "Label",
+ "zOrder": "0",
+ "measuredW": "211",
+ "measuredH": "28",
+ "x": "0",
+ "y": "0",
+ "properties": {
+ "size": "20",
+ "text": "Visit the {color:purple}SQL Roadmap{color}"
+ }
+ }
+ ]
+ }
+ }
+ },
+ {
+ "ID": "1750",
+ "typeID": "__group__",
+ "zOrder": "83",
+ "measuredW": "295",
+ "measuredH": "50",
+ "w": "295",
+ "h": "50",
+ "x": "372",
+ "y": "972",
+ "properties": {
+ "controlName": "103-programming-language"
+ },
+ "children": {
+ "controls": {
+ "control": [
+ {
+ "ID": "0",
+ "typeID": "TextArea",
+ "zOrder": "0",
+ "w": "295",
+ "h": "50",
+ "measuredW": "200",
+ "measuredH": "140",
+ "x": "0",
+ "y": "0",
+ "properties": {
+ "color": "16776960"
+ }
+ },
+ {
+ "ID": "1",
+ "typeID": "Label",
+ "zOrder": "1",
+ "measuredW": "251",
+ "measuredH": "25",
+ "x": "23",
+ "y": "12",
+ "properties": {
+ "size": "17",
+ "text": "1. Pick a Programming Language"
+ }
+ }
+ ]
+ }
+ }
+ },
+ {
+ "ID": "1751",
+ "typeID": "__group__",
+ "zOrder": "86",
+ "measuredW": "296",
+ "measuredH": "50",
+ "w": "296",
+ "h": "50",
+ "x": "372",
+ "y": "1027",
+ "properties": {
+ "controlName": "104-data-manipulation-libraries"
+ },
+ "children": {
+ "controls": {
+ "control": [
+ {
+ "ID": "0",
+ "typeID": "TextArea",
+ "zOrder": "0",
+ "w": "296",
+ "h": "50",
+ "measuredW": "200",
+ "measuredH": "140",
+ "x": "0",
+ "y": "0",
+ "properties": {
+ "color": "16776960"
+ }
+ },
+ {
+ "ID": "1",
+ "typeID": "Label",
+ "zOrder": "1",
+ "measuredW": "230",
+ "measuredH": "25",
+ "x": "23",
+ "y": "13",
+ "properties": {
+ "size": "17",
+ "text": "2. Data Manipulation Libraries"
+ }
+ }
+ ]
+ }
+ }
+ },
+ {
+ "ID": "1752",
+ "typeID": "__group__",
+ "zOrder": "89",
+ "measuredW": "295",
+ "measuredH": "50",
+ "w": "295",
+ "h": "50",
+ "x": "372",
+ "y": "1081",
+ "properties": {
+ "controlName": "105-data-visualization-libraries"
+ },
+ "children": {
+ "controls": {
+ "control": [
+ {
+ "ID": "0",
+ "typeID": "TextArea",
+ "zOrder": "0",
+ "w": "295",
+ "h": "50",
+ "measuredW": "200",
+ "measuredH": "140",
+ "x": "0",
+ "y": "0",
+ "properties": {
+ "color": "16776960"
+ }
+ },
+ {
+ "ID": "1",
+ "typeID": "Label",
+ "zOrder": "1",
+ "measuredW": "228",
+ "measuredH": "25",
+ "x": "23",
+ "y": "13",
+ "properties": {
+ "size": "17",
+ "text": "3. Data Visualisation Libraries"
+ }
+ }
+ ]
+ }
+ }
+ },
+ {
+ "ID": "1753",
+ "typeID": "__group__",
+ "zOrder": "84",
+ "measuredW": "91",
+ "measuredH": "50",
+ "w": "91",
+ "h": "50",
+ "x": "373",
+ "y": "892",
+ "properties": {
+ "controlName": "100-programming-language:python"
+ },
+ "children": {
+ "controls": {
+ "control": [
+ {
+ "ID": "0",
+ "typeID": "TextArea",
+ "zOrder": "0",
+ "w": "91",
+ "h": "50",
+ "measuredW": "200",
+ "measuredH": "140",
+ "x": "0",
+ "y": "0",
+ "properties": {
+ "color": "16770457"
+ }
+ },
+ {
+ "ID": "1",
+ "typeID": "Label",
+ "zOrder": "1",
+ "measuredW": "53",
+ "measuredH": "25",
+ "x": "18",
+ "y": "12",
+ "properties": {
+ "size": "17",
+ "text": "Python"
+ }
+ }
+ ]
+ }
+ }
+ },
+ {
+ "ID": "1754",
+ "typeID": "__group__",
+ "zOrder": "85",
+ "measuredW": "81",
+ "measuredH": "50",
+ "w": "81",
+ "h": "50",
+ "x": "473",
+ "y": "892",
+ "properties": {
+ "controlName": "101-programming-language:r"
+ },
+ "children": {
+ "controls": {
+ "control": [
+ {
+ "ID": "0",
+ "typeID": "TextArea",
+ "zOrder": "0",
+ "w": "81",
+ "h": "50",
+ "measuredW": "200",
+ "measuredH": "140",
+ "x": "0",
+ "y": "0",
+ "properties": {
+ "color": "16770457"
+ }
+ },
+ {
+ "ID": "1",
+ "typeID": "Label",
+ "zOrder": "1",
+ "w": "15",
+ "measuredW": "13",
+ "measuredH": "25",
+ "x": "31",
+ "y": "12",
+ "properties": {
+ "size": "17",
+ "text": "R"
+ }
+ }
+ ]
+ }
+ }
+ },
+ {
+ "ID": "1755",
+ "typeID": "__group__",
+ "zOrder": "87",
+ "measuredW": "152",
+ "measuredH": "50",
+ "w": "152",
+ "h": "50",
+ "x": "174",
+ "y": "998",
+ "properties": {
+ "controlName": "100-data-manipulation-libraries:pandas"
+ },
+ "children": {
+ "controls": {
+ "control": [
+ {
+ "ID": "0",
+ "typeID": "TextArea",
+ "zOrder": "0",
+ "w": "152",
+ "h": "50",
+ "measuredW": "200",
+ "measuredH": "140",
+ "x": "0",
+ "y": "0",
+ "properties": {
+ "color": "16770457"
+ }
+ },
+ {
+ "ID": "1",
+ "typeID": "Label",
+ "zOrder": "1",
+ "measuredW": "127",
+ "measuredH": "25",
+ "x": "12",
+ "y": "13",
+ "properties": {
+ "size": "17",
+ "text": "Pandas (Python)"
+ }
+ }
+ ]
+ }
+ }
+ },
+ {
+ "ID": "1756",
+ "typeID": "__group__",
+ "zOrder": "88",
+ "measuredW": "150",
+ "measuredH": "50",
+ "w": "150",
+ "h": "50",
+ "x": "175",
+ "y": "1052",
+ "properties": {
+ "controlName": "101-data-manipulation-libraries:dplyr"
+ },
+ "children": {
+ "controls": {
+ "control": [
+ {
+ "ID": "0",
+ "typeID": "TextArea",
+ "zOrder": "0",
+ "w": "150",
+ "h": "50",
+ "measuredW": "200",
+ "measuredH": "140",
+ "x": "0",
+ "y": "0",
+ "properties": {
+ "color": "16770457"
+ }
+ },
+ {
+ "ID": "1",
+ "typeID": "Label",
+ "zOrder": "1",
+ "measuredW": "69",
+ "measuredH": "25",
+ "x": "40",
+ "y": "13",
+ "properties": {
+ "size": "17",
+ "text": "Dplyr (R)"
+ }
+ }
+ ]
+ }
+ }
+ },
+ {
+ "ID": "1757",
+ "typeID": "__group__",
+ "zOrder": "90",
+ "measuredW": "104",
+ "measuredH": "50",
+ "w": "104",
+ "h": "50",
+ "x": "372",
+ "y": "1151",
+ "properties": {
+ "controlName": "100-data-visualization-libraries:matplotlib"
+ },
+ "children": {
+ "controls": {
+ "control": [
+ {
+ "ID": "0",
+ "typeID": "TextArea",
+ "zOrder": "0",
+ "w": "104",
+ "h": "50",
+ "measuredW": "200",
+ "measuredH": "140",
+ "x": "0",
+ "y": "0",
+ "properties": {
+ "color": "16770457"
+ }
+ },
+ {
+ "ID": "1",
+ "typeID": "Label",
+ "zOrder": "1",
+ "measuredW": "76",
+ "measuredH": "25",
+ "x": "14",
+ "y": "13",
+ "properties": {
+ "size": "17",
+ "text": "Matplotlib"
+ }
+ }
+ ]
+ }
+ }
+ },
+ {
+ "ID": "1758",
+ "typeID": "__group__",
+ "zOrder": "91",
+ "measuredW": "87",
+ "measuredH": "50",
+ "w": "87",
+ "h": "50",
+ "x": "483",
+ "y": "1152",
+ "properties": {
+ "controlName": "101-data-visualization-libraries:ggplot2"
+ },
+ "children": {
+ "controls": {
+ "control": [
+ {
+ "ID": "0",
+ "typeID": "TextArea",
+ "zOrder": "0",
+ "w": "87",
+ "h": "50",
+ "measuredW": "200",
+ "measuredH": "140",
+ "x": "0",
+ "y": "0",
+ "properties": {
+ "color": "16770457"
+ }
+ },
+ {
+ "ID": "1",
+ "typeID": "Label",
+ "zOrder": "1",
+ "measuredW": "58",
+ "measuredH": "25",
+ "x": "15",
+ "y": "13",
+ "properties": {
+ "size": "17",
+ "text": "ggplot2"
+ }
+ }
+ ]
+ }
+ }
+ },
+ {
+ "ID": "1759",
+ "typeID": "__group__",
+ "zOrder": "100",
+ "measuredW": "178",
+ "measuredH": "50",
+ "w": "178",
+ "h": "50",
+ "x": "853",
+ "y": "1251",
+ "properties": {
+ "controlName": "106-data-collection"
+ },
+ "children": {
+ "controls": {
+ "control": [
+ {
+ "ID": "0",
+ "typeID": "TextArea",
+ "zOrder": "0",
+ "w": "178",
+ "h": "50",
+ "measuredW": "200",
+ "measuredH": "140",
+ "x": "0",
+ "y": "0",
+ "properties": {
+ "color": "16776960"
+ }
+ },
+ {
+ "ID": "1",
+ "typeID": "Label",
+ "zOrder": "1",
+ "measuredW": "118",
+ "measuredH": "25",
+ "x": "30",
+ "y": "12",
+ "properties": {
+ "size": "17",
+ "text": "Data Collection"
+ }
+ }
+ ]
+ }
+ }
+ },
+ {
+ "ID": "1760",
+ "typeID": "__group__",
+ "zOrder": "103",
+ "measuredW": "127",
+ "measuredH": "50",
+ "w": "127",
+ "h": "50",
+ "x": "798",
+ "y": "1382",
+ "properties": {
+ "controlName": "100-data-collection:databases"
+ },
+ "children": {
+ "controls": {
+ "control": [
+ {
+ "ID": "0",
+ "typeID": "TextArea",
+ "zOrder": "0",
+ "w": "127",
+ "h": "50",
+ "measuredW": "200",
+ "measuredH": "140",
+ "x": "0",
+ "y": "0",
+ "properties": {
+ "color": "16770457"
+ }
+ },
+ {
+ "ID": "1",
+ "typeID": "Label",
+ "zOrder": "1",
+ "measuredW": "83",
+ "measuredH": "25",
+ "x": "24",
+ "y": "13",
+ "properties": {
+ "size": "17",
+ "text": "Databases"
+ }
+ }
+ ]
+ }
+ }
+ },
+ {
+ "ID": "1761",
+ "typeID": "__group__",
+ "zOrder": "104",
+ "measuredW": "150",
+ "measuredH": "50",
+ "w": "150",
+ "h": "50",
+ "x": "922",
+ "y": "1383",
+ "properties": {
+ "controlName": "101-data-collection:csv-files"
+ },
+ "children": {
+ "controls": {
+ "control": [
+ {
+ "ID": "0",
+ "typeID": "TextArea",
+ "zOrder": "0",
+ "w": "150",
+ "h": "50",
+ "measuredW": "200",
+ "measuredH": "140",
+ "x": "0",
+ "y": "0",
+ "properties": {
+ "color": "16770457"
+ }
+ },
+ {
+ "ID": "1",
+ "typeID": "Label",
+ "zOrder": "1",
+ "measuredW": "74",
+ "measuredH": "25",
+ "x": "38",
+ "y": "13",
+ "properties": {
+ "size": "17",
+ "text": "CSV Files"
+ }
+ }
+ ]
+ }
+ }
+ },
+ {
+ "ID": "1762",
+ "typeID": "__group__",
+ "zOrder": "105",
+ "measuredW": "127",
+ "measuredH": "50",
+ "w": "127",
+ "h": "50",
+ "x": "798",
+ "y": "1429",
+ "properties": {
+ "controlName": "102-data-collection:apis"
+ },
+ "children": {
+ "controls": {
+ "control": [
+ {
+ "ID": "0",
+ "typeID": "TextArea",
+ "zOrder": "0",
+ "w": "127",
+ "h": "50",
+ "measuredW": "200",
+ "measuredH": "140",
+ "x": "0",
+ "y": "0",
+ "properties": {
+ "color": "16770457"
+ }
+ },
+ {
+ "ID": "1",
+ "typeID": "Label",
+ "zOrder": "1",
+ "measuredW": "35",
+ "measuredH": "25",
+ "x": "46",
+ "y": "13",
+ "properties": {
+ "size": "17",
+ "text": "APIs"
+ }
+ }
+ ]
+ }
+ }
+ },
+ {
+ "ID": "1763",
+ "typeID": "__group__",
+ "zOrder": "106",
+ "measuredW": "151",
+ "measuredH": "50",
+ "w": "151",
+ "h": "50",
+ "x": "922",
+ "y": "1430",
+ "properties": {
+ "controlName": "103-data-collection:web-scraping"
+ },
+ "children": {
+ "controls": {
+ "control": [
+ {
+ "ID": "0",
+ "typeID": "TextArea",
+ "zOrder": "0",
+ "w": "151",
+ "h": "50",
+ "measuredW": "200",
+ "measuredH": "140",
+ "x": "0",
+ "y": "0",
+ "properties": {
+ "color": "16770457"
+ }
+ },
+ {
+ "ID": "1",
+ "typeID": "Label",
+ "zOrder": "1",
+ "measuredW": "107",
+ "measuredH": "25",
+ "x": "22",
+ "y": "13",
+ "properties": {
+ "size": "17",
+ "text": "Web Scraping"
+ }
+ }
+ ]
+ }
+ }
+ },
+ {
+ "ID": "1764",
+ "typeID": "__group__",
+ "zOrder": "108",
+ "measuredW": "276",
+ "measuredH": "50",
+ "w": "276",
+ "h": "50",
+ "x": "1092",
+ "y": "1251",
+ "properties": {
+ "controlName": "107-data-cleaning"
+ },
+ "children": {
+ "controls": {
+ "control": [
+ {
+ "ID": "0",
+ "typeID": "TextArea",
+ "zOrder": "0",
+ "w": "276",
+ "h": "50",
+ "measuredW": "200",
+ "measuredH": "140",
+ "x": "0",
+ "y": "0",
+ "properties": {
+ "color": "16776960"
+ }
+ },
+ {
+ "ID": "1",
+ "typeID": "Label",
+ "zOrder": "1",
+ "measuredW": "110",
+ "measuredH": "25",
+ "x": "79",
+ "y": "12",
+ "properties": {
+ "size": "17",
+ "text": "Data Cleaning"
+ }
+ }
+ ]
+ }
+ }
+ },
+ {
+ "ID": "1765",
+ "typeID": "__group__",
+ "zOrder": "109",
+ "measuredW": "212",
+ "measuredH": "50",
+ "w": "212",
+ "h": "50",
+ "x": "1092",
+ "y": "1384",
+ "properties": {
+ "controlName": "100-data-cleaning:missing-data"
+ },
+ "children": {
+ "controls": {
+ "control": [
+ {
+ "ID": "0",
+ "typeID": "TextArea",
+ "zOrder": "0",
+ "w": "212",
+ "h": "50",
+ "measuredW": "200",
+ "measuredH": "140",
+ "x": "0",
+ "y": "0",
+ "properties": {
+ "color": "16770457"
+ }
+ },
+ {
+ "ID": "1",
+ "typeID": "Label",
+ "zOrder": "1",
+ "measuredW": "174",
+ "measuredH": "25",
+ "x": "19",
+ "y": "13",
+ "properties": {
+ "size": "17",
+ "text": "Handling Missing Data"
+ }
+ }
+ ]
+ }
+ }
+ },
+ {
+ "ID": "1766",
+ "typeID": "__group__",
+ "zOrder": "110",
+ "measuredW": "212",
+ "measuredH": "50",
+ "w": "212",
+ "h": "50",
+ "x": "1092",
+ "y": "1431",
+ "properties": {
+ "controlName": "101-data-cleaning:removing-duplicates"
+ },
+ "children": {
+ "controls": {
+ "control": [
+ {
+ "ID": "0",
+ "typeID": "TextArea",
+ "zOrder": "0",
+ "w": "212",
+ "h": "50",
+ "measuredW": "200",
+ "measuredH": "140",
+ "x": "0",
+ "y": "0",
+ "properties": {
+ "color": "16770457"
+ }
+ },
+ {
+ "ID": "1",
+ "typeID": "Label",
+ "zOrder": "1",
+ "measuredW": "164",
+ "measuredH": "25",
+ "x": "24",
+ "y": "13",
+ "properties": {
+ "size": "17",
+ "text": "Removing Duplicates"
+ }
+ }
+ ]
+ }
+ }
+ },
+ {
+ "ID": "1767",
+ "typeID": "__group__",
+ "zOrder": "111",
+ "measuredW": "212",
+ "measuredH": "50",
+ "w": "212",
+ "h": "50",
+ "x": "1092",
+ "y": "1478",
+ "properties": {
+ "controlName": "102-data-cleaning:finding-outliers"
+ },
+ "children": {
+ "controls": {
+ "control": [
+ {
+ "ID": "0",
+ "typeID": "TextArea",
+ "zOrder": "0",
+ "w": "212",
+ "h": "50",
+ "measuredW": "200",
+ "measuredH": "140",
+ "x": "0",
+ "y": "0",
+ "properties": {
+ "color": "16770457"
+ }
+ },
+ {
+ "ID": "1",
+ "typeID": "Label",
+ "zOrder": "1",
+ "measuredW": "122",
+ "measuredH": "25",
+ "x": "45",
+ "y": "13",
+ "properties": {
+ "size": "17",
+ "text": "Finding Outliers"
+ }
+ }
+ ]
+ }
+ }
+ },
+ {
+ "ID": "1768",
+ "typeID": "__group__",
+ "zOrder": "112",
+ "measuredW": "212",
+ "measuredH": "50",
+ "w": "212",
+ "h": "50",
+ "x": "1092",
+ "y": "1525",
+ "properties": {
+ "controlName": "103-data-cleaning:data-transformation"
+ },
+ "children": {
+ "controls": {
+ "control": [
+ {
+ "ID": "0",
+ "typeID": "TextArea",
+ "zOrder": "0",
+ "w": "212",
+ "h": "50",
+ "measuredW": "200",
+ "measuredH": "140",
+ "x": "0",
+ "y": "0",
+ "properties": {
+ "color": "16770457"
+ }
+ },
+ {
+ "ID": "1",
+ "typeID": "Label",
+ "zOrder": "1",
+ "measuredW": "156",
+ "measuredH": "25",
+ "x": "28",
+ "y": "13",
+ "properties": {
+ "size": "17",
+ "text": "Data Transformation"
+ }
+ }
+ ]
+ }
+ }
+ },
+ {
+ "ID": "1769",
+ "typeID": "__group__",
+ "zOrder": "113",
+ "measuredW": "106",
+ "measuredH": "50",
+ "w": "106",
+ "h": "50",
+ "x": "1094",
+ "y": "1619",
+ "properties": {
+ "controlName": "104-data-cleaning:pandas"
+ },
+ "children": {
+ "controls": {
+ "control": [
+ {
+ "ID": "0",
+ "typeID": "TextArea",
+ "zOrder": "0",
+ "w": "106",
+ "h": "50",
+ "measuredW": "200",
+ "measuredH": "140",
+ "x": "0",
+ "y": "0",
+ "properties": {
+ "color": "16770457"
+ }
+ },
+ {
+ "ID": "1",
+ "typeID": "Label",
+ "zOrder": "1",
+ "measuredW": "58",
+ "measuredH": "25",
+ "x": "24",
+ "y": "13",
+ "properties": {
+ "size": "17",
+ "text": "Pandas"
+ }
+ }
+ ]
+ }
+ }
+ },
+ {
+ "ID": "1770",
+ "typeID": "__group__",
+ "zOrder": "114",
+ "measuredW": "96",
+ "measuredH": "50",
+ "w": "96",
+ "h": "50",
+ "x": "1211",
+ "y": "1620",
+ "properties": {
+ "controlName": "105-data-cleaning:dplyr"
+ },
+ "children": {
+ "controls": {
+ "control": [
+ {
+ "ID": "0",
+ "typeID": "TextArea",
+ "zOrder": "0",
+ "w": "96",
+ "h": "50",
+ "measuredW": "200",
+ "measuredH": "140",
+ "x": "0",
+ "y": "0",
+ "properties": {
+ "color": "16770457"
+ }
+ },
+ {
+ "ID": "1",
+ "typeID": "Label",
+ "zOrder": "1",
+ "measuredW": "40",
+ "measuredH": "25",
+ "x": "28",
+ "y": "13",
+ "properties": {
+ "size": "17",
+ "text": "Dplyr"
+ }
+ }
+ ]
+ }
+ }
+ },
+ {
+ "ID": "1771",
+ "typeID": "__group__",
+ "zOrder": "120",
+ "measuredW": "259",
+ "measuredH": "50",
+ "w": "259",
+ "h": "50",
+ "x": "228",
+ "y": "1557",
+ "properties": {
+ "controlName": "108-descriptive-analysis"
+ },
+ "children": {
+ "controls": {
+ "control": [
+ {
+ "ID": "0",
+ "typeID": "TextArea",
+ "zOrder": "0",
+ "w": "259",
+ "h": "50",
+ "measuredW": "200",
+ "measuredH": "140",
+ "x": "0",
+ "y": "0",
+ "properties": {
+ "color": "16776960"
+ }
+ },
+ {
+ "ID": "1",
+ "typeID": "Label",
+ "zOrder": "1",
+ "measuredW": "153",
+ "measuredH": "25",
+ "x": "53",
+ "y": "12",
+ "properties": {
+ "size": "17",
+ "text": "Descriptive Analysis"
+ }
+ }
+ ]
+ }
+ }
+ },
+ {
+ "ID": "1772",
+ "typeID": "__group__",
+ "zOrder": "24",
+ "measuredW": "158",
+ "measuredH": "50",
+ "w": "158",
+ "h": "50",
+ "x": "187",
+ "y": "1427",
+ "properties": {
+ "controlName": "100-descriptive-analysis:central-tendency"
+ },
+ "children": {
+ "controls": {
+ "control": [
+ {
+ "ID": "0",
+ "typeID": "TextArea",
+ "zOrder": "0",
+ "w": "158",
+ "h": "50",
+ "measuredW": "200",
+ "measuredH": "140",
+ "x": "0",
+ "y": "0"
+ },
+ {
+ "ID": "1",
+ "typeID": "Label",
+ "zOrder": "1",
+ "measuredW": "127",
+ "measuredH": "24",
+ "x": "15",
+ "y": "13",
+ "properties": {
+ "size": "16",
+ "text": "Central Tendency"
+ }
+ }
+ ]
+ }
+ }
+ },
+ {
+ "ID": "1773",
+ "typeID": "__group__",
+ "zOrder": "121",
+ "measuredW": "171",
+ "measuredH": "50",
+ "w": "171",
+ "h": "50",
+ "x": "360",
+ "y": "1426",
+ "properties": {
+ "controlName": "101-descriptive-analysis:dispersion"
+ },
+ "children": {
+ "controls": {
+ "control": [
+ {
+ "ID": "0",
+ "typeID": "TextArea",
+ "zOrder": "0",
+ "w": "171",
+ "h": "50",
+ "measuredW": "200",
+ "measuredH": "140",
+ "x": "0",
+ "y": "0"
+ },
+ {
+ "ID": "1",
+ "typeID": "Label",
+ "zOrder": "1",
+ "measuredW": "83",
+ "measuredH": "25",
+ "x": "44",
+ "y": "12",
+ "properties": {
+ "size": "17",
+ "text": "Dispersion"
+ }
+ }
+ ]
+ }
+ }
+ },
+ {
+ "ID": "1775",
+ "typeID": "__group__",
+ "zOrder": "125",
+ "measuredW": "215",
+ "measuredH": "50",
+ "w": "215",
+ "h": "50",
+ "x": "538",
+ "y": "1426",
+ "properties": {
+ "controlName": "102-descriptive-analysis:distribution-shape"
+ },
+ "children": {
+ "controls": {
+ "control": [
+ {
+ "ID": "0",
+ "typeID": "TextArea",
+ "zOrder": "0",
+ "w": "215",
+ "h": "50",
+ "measuredW": "200",
+ "measuredH": "140",
+ "x": "0",
+ "y": "0"
+ },
+ {
+ "ID": "1",
+ "typeID": "Label",
+ "zOrder": "1",
+ "measuredW": "142",
+ "measuredH": "25",
+ "x": "37",
+ "y": "12",
+ "properties": {
+ "size": "17",
+ "text": "Distribution Shape"
+ }
+ }
+ ]
+ }
+ }
+ },
+ {
+ "ID": "1776",
+ "typeID": "__group__",
+ "zOrder": "0",
+ "measuredW": "74",
+ "measuredH": "50",
+ "w": "74",
+ "h": "50",
+ "x": "187",
+ "y": "1333",
+ "properties": {
+ "controlName": "100-descriptive-analysis:central-tendency:mean"
+ },
+ "children": {
+ "controls": {
+ "control": [
+ {
+ "ID": "0",
+ "typeID": "TextArea",
+ "zOrder": "0",
+ "w": "74",
+ "h": "50",
+ "measuredW": "200",
+ "measuredH": "140",
+ "x": "0",
+ "y": "0",
+ "properties": {
+ "color": "16770457"
+ }
+ },
+ {
+ "ID": "1",
+ "typeID": "Label",
+ "zOrder": "1",
+ "measuredW": "44",
+ "measuredH": "25",
+ "x": "17",
+ "y": "13",
+ "properties": {
+ "size": "17",
+ "text": "Mean"
+ }
+ }
+ ]
+ }
+ }
+ },
+ {
+ "ID": "1777",
+ "typeID": "__group__",
+ "zOrder": "2",
+ "measuredW": "88",
+ "measuredH": "50",
+ "w": "88",
+ "h": "50",
+ "x": "258",
+ "y": "1333",
+ "properties": {
+ "controlName": "101-descriptive-analysis:central-tendency:median"
+ },
+ "children": {
+ "controls": {
+ "control": [
+ {
+ "ID": "0",
+ "typeID": "TextArea",
+ "zOrder": "0",
+ "w": "88",
+ "h": "50",
+ "measuredW": "200",
+ "measuredH": "140",
+ "x": "0",
+ "y": "0",
+ "properties": {
+ "color": "16770457"
+ }
+ },
+ {
+ "ID": "1",
+ "typeID": "Label",
+ "zOrder": "1",
+ "measuredW": "58",
+ "measuredH": "25",
+ "x": "15",
+ "y": "13",
+ "properties": {
+ "size": "17",
+ "text": "Median"
+ }
+ }
+ ]
+ }
+ }
+ },
+ {
+ "ID": "1778",
+ "typeID": "__group__",
+ "zOrder": "1",
+ "measuredW": "74",
+ "measuredH": "50",
+ "w": "74",
+ "h": "50",
+ "x": "187",
+ "y": "1379",
+ "properties": {
+ "controlName": "102-descriptive-analysis:central-tendency:mode"
+ },
+ "children": {
+ "controls": {
+ "control": [
+ {
+ "ID": "0",
+ "typeID": "TextArea",
+ "zOrder": "0",
+ "w": "74",
+ "h": "50",
+ "measuredW": "200",
+ "measuredH": "140",
+ "x": "0",
+ "y": "0",
+ "properties": {
+ "color": "16770457"
+ }
+ },
+ {
+ "ID": "1",
+ "typeID": "Label",
+ "zOrder": "1",
+ "measuredW": "45",
+ "measuredH": "25",
+ "x": "16",
+ "y": "13",
+ "properties": {
+ "size": "17",
+ "text": "Mode"
+ }
+ }
+ ]
+ }
+ }
+ },
+ {
+ "ID": "1779",
+ "typeID": "__group__",
+ "zOrder": "3",
+ "measuredW": "88",
+ "measuredH": "50",
+ "w": "88",
+ "h": "50",
+ "x": "257",
+ "y": "1380",
+ "properties": {
+ "controlName": "103-descriptive-analysis:central-tendency:average"
+ },
+ "children": {
+ "controls": {
+ "control": [
+ {
+ "ID": "0",
+ "typeID": "TextArea",
+ "zOrder": "0",
+ "w": "88",
+ "h": "50",
+ "measuredW": "200",
+ "measuredH": "140",
+ "x": "0",
+ "y": "0",
+ "properties": {
+ "color": "16770457"
+ }
+ },
+ {
+ "ID": "1",
+ "typeID": "Label",
+ "zOrder": "1",
+ "measuredW": "64",
+ "measuredH": "25",
+ "x": "12",
+ "y": "13",
+ "properties": {
+ "size": "17",
+ "text": "Average"
+ }
+ }
+ ]
+ }
+ }
+ },
+ {
+ "ID": "1780",
+ "typeID": "__group__",
+ "zOrder": "122",
+ "measuredW": "85",
+ "measuredH": "50",
+ "w": "85",
+ "h": "50",
+ "x": "360",
+ "y": "1332",
+ "properties": {
+ "controlName": "100-descriptive-analysis:dispersion:range"
+ },
+ "children": {
+ "controls": {
+ "control": [
+ {
+ "ID": "0",
+ "typeID": "TextArea",
+ "zOrder": "0",
+ "w": "85",
+ "h": "50",
+ "measuredW": "200",
+ "measuredH": "140",
+ "x": "0",
+ "y": "0",
+ "properties": {
+ "color": "16770457"
+ }
+ },
+ {
+ "ID": "1",
+ "typeID": "Label",
+ "zOrder": "1",
+ "measuredW": "52",
+ "measuredH": "25",
+ "x": "17",
+ "y": "13",
+ "properties": {
+ "size": "17",
+ "text": "Range"
+ }
+ }
+ ]
+ }
+ }
+ },
+ {
+ "ID": "1781",
+ "typeID": "__group__",
+ "zOrder": "123",
+ "measuredW": "91",
+ "measuredH": "50",
+ "w": "91",
+ "h": "50",
+ "x": "440",
+ "y": "1332",
+ "properties": {
+ "controlName": "101-descriptive-analysis:dispersion:variance"
+ },
+ "children": {
+ "controls": {
+ "control": [
+ {
+ "ID": "0",
+ "typeID": "TextArea",
+ "zOrder": "0",
+ "w": "91",
+ "h": "50",
+ "measuredW": "200",
+ "measuredH": "140",
+ "x": "0",
+ "y": "0",
+ "properties": {
+ "color": "16770457"
+ }
+ },
+ {
+ "ID": "1",
+ "typeID": "Label",
+ "zOrder": "1",
+ "measuredW": "68",
+ "measuredH": "25",
+ "x": "12",
+ "y": "13",
+ "properties": {
+ "size": "17",
+ "text": "Variance"
+ }
+ }
+ ]
+ }
+ }
+ },
+ {
+ "ID": "1782",
+ "typeID": "__group__",
+ "zOrder": "124",
+ "measuredW": "171",
+ "measuredH": "50",
+ "w": "171",
+ "h": "50",
+ "x": "360",
+ "y": "1379",
+ "properties": {
+ "controlName": "102-descriptive-analysis:dispersion:standard-deviation"
+ },
+ "children": {
+ "controls": {
+ "control": [
+ {
+ "ID": "0",
+ "typeID": "TextArea",
+ "zOrder": "0",
+ "w": "171",
+ "h": "50",
+ "measuredW": "200",
+ "measuredH": "140",
+ "x": "0",
+ "y": "0",
+ "properties": {
+ "color": "16770457"
+ }
+ },
+ {
+ "ID": "1",
+ "typeID": "Label",
+ "zOrder": "1",
+ "measuredW": "147",
+ "measuredH": "25",
+ "x": "12",
+ "y": "13",
+ "properties": {
+ "size": "17",
+ "text": "Standard Deviation"
+ }
+ }
+ ]
+ }
+ }
+ },
+ {
+ "ID": "1783",
+ "typeID": "__group__",
+ "zOrder": "126",
+ "measuredW": "127",
+ "measuredH": "50",
+ "w": "127",
+ "h": "50",
+ "x": "538",
+ "y": "1380",
+ "properties": {
+ "controlName": "100-descriptive-analysis:distribution-shape:skewness"
+ },
+ "children": {
+ "controls": {
+ "control": [
+ {
+ "ID": "0",
+ "typeID": "TextArea",
+ "zOrder": "0",
+ "w": "127",
+ "h": "50",
+ "measuredW": "200",
+ "measuredH": "140",
+ "x": "0",
+ "y": "0",
+ "properties": {
+ "color": "16770457"
+ }
+ },
+ {
+ "ID": "1",
+ "typeID": "Label",
+ "zOrder": "1",
+ "measuredW": "77",
+ "measuredH": "25",
+ "x": "25",
+ "y": "12",
+ "properties": {
+ "size": "17",
+ "text": "Skewness"
+ }
+ }
+ ]
+ }
+ }
+ },
+ {
+ "ID": "1784",
+ "typeID": "__group__",
+ "zOrder": "137",
+ "measuredW": "93",
+ "measuredH": "50",
+ "w": "93",
+ "h": "50",
+ "x": "660",
+ "y": "1380",
+ "properties": {
+ "controlName": "101-descriptive-analysis:distribution-shape:kurtosis"
+ },
+ "children": {
+ "controls": {
+ "control": [
+ {
+ "ID": "0",
+ "typeID": "TextArea",
+ "zOrder": "0",
+ "w": "93",
+ "h": "50",
+ "measuredW": "200",
+ "measuredH": "140",
+ "x": "0",
+ "y": "0",
+ "properties": {
+ "color": "16770457"
+ }
+ },
+ {
+ "ID": "1",
+ "typeID": "Label",
+ "zOrder": "1",
+ "measuredW": "62",
+ "measuredH": "25",
+ "x": "16",
+ "y": "12",
+ "properties": {
+ "size": "17",
+ "text": "Kurtosis"
+ }
+ }
+ ]
+ }
+ }
+ },
+ {
+ "ID": "1785",
+ "typeID": "__group__",
+ "zOrder": "127",
+ "measuredW": "215",
+ "measuredH": "50",
+ "w": "215",
+ "h": "50",
+ "x": "187",
+ "y": "1650",
+ "properties": {
+ "controlName": "103-descriptive-analysis:visualising-distributions"
+ },
+ "children": {
+ "controls": {
+ "control": [
+ {
+ "ID": "0",
+ "typeID": "TextArea",
+ "zOrder": "0",
+ "w": "215",
+ "h": "50",
+ "measuredW": "200",
+ "measuredH": "140",
+ "x": "0",
+ "y": "0",
+ "properties": {
+ "color": "16770457"
+ }
+ },
+ {
+ "ID": "1",
+ "typeID": "Label",
+ "zOrder": "1",
+ "measuredW": "183",
+ "measuredH": "25",
+ "x": "16",
+ "y": "12",
+ "properties": {
+ "size": "17",
+ "text": "Visualising Distributions"
+ }
+ }
+ ]
+ }
+ }
+ },
+ {
+ "ID": "1786",
+ "typeID": "__group__",
+ "zOrder": "140",
+ "measuredW": "259",
+ "measuredH": "50",
+ "w": "259",
+ "h": "50",
+ "x": "228",
+ "y": "1774",
+ "properties": {
+ "controlName": "109-data-visualization"
+ },
+ "children": {
+ "controls": {
+ "control": [
+ {
+ "ID": "0",
+ "typeID": "TextArea",
+ "zOrder": "0",
+ "w": "259",
+ "h": "50",
+ "measuredW": "200",
+ "measuredH": "140",
+ "x": "0",
+ "y": "0",
+ "properties": {
+ "color": "16776960"
+ }
+ },
+ {
+ "ID": "1",
+ "typeID": "Label",
+ "zOrder": "1",
+ "measuredW": "137",
+ "measuredH": "25",
+ "x": "61",
+ "y": "12",
+ "properties": {
+ "size": "17",
+ "text": "Data Visualization"
+ }
+ }
+ ]
+ }
+ }
+ },
+ {
+ "ID": "1787",
+ "typeID": "__group__",
+ "zOrder": "142",
+ "measuredW": "98",
+ "measuredH": "50",
+ "w": "98",
+ "h": "50",
+ "x": "186",
+ "y": "1909",
+ "properties": {
+ "controlName": "100-data-visualization:tableau"
+ },
+ "children": {
+ "controls": {
+ "control": [
+ {
+ "ID": "0",
+ "typeID": "TextArea",
+ "zOrder": "0",
+ "w": "98",
+ "h": "50",
+ "measuredW": "200",
+ "measuredH": "140",
+ "x": "0",
+ "y": "0",
+ "properties": {
+ "color": "16770457"
+ }
+ },
+ {
+ "ID": "1",
+ "typeID": "Label",
+ "zOrder": "1",
+ "measuredW": "61",
+ "measuredH": "25",
+ "x": "18",
+ "y": "13",
+ "properties": {
+ "size": "17",
+ "text": "Tableau"
+ }
+ }
+ ]
+ }
+ }
+ },
+ {
+ "ID": "1788",
+ "typeID": "__group__",
+ "zOrder": "143",
+ "measuredW": "98",
+ "measuredH": "50",
+ "w": "98",
+ "h": "50",
+ "x": "186",
+ "y": "1955",
+ "properties": {
+ "controlName": "101-data-visualization:powerbi"
+ },
+ "children": {
+ "controls": {
+ "control": [
+ {
+ "ID": "0",
+ "typeID": "TextArea",
+ "zOrder": "0",
+ "w": "98",
+ "h": "50",
+ "measuredW": "200",
+ "measuredH": "140",
+ "x": "0",
+ "y": "0",
+ "properties": {
+ "color": "16770457"
+ }
+ },
+ {
+ "ID": "1",
+ "typeID": "Label",
+ "zOrder": "1",
+ "measuredW": "64",
+ "measuredH": "25",
+ "x": "17",
+ "y": "13",
+ "properties": {
+ "size": "17",
+ "text": "PowerBI"
+ }
+ }
+ ]
+ }
+ }
+ },
+ {
+ "ID": "1789",
+ "typeID": "__group__",
+ "zOrder": "145",
+ "measuredW": "153",
+ "measuredH": "50",
+ "w": "153",
+ "h": "50",
+ "x": "290",
+ "y": "1910",
+ "properties": {
+ "controlName": "102-data-visualization:matplotlib"
+ },
+ "children": {
+ "controls": {
+ "control": [
+ {
+ "ID": "0",
+ "typeID": "TextArea",
+ "zOrder": "0",
+ "w": "153",
+ "h": "50",
+ "measuredW": "200",
+ "measuredH": "140",
+ "x": "0",
+ "y": "0",
+ "properties": {
+ "color": "16770457"
+ }
+ },
+ {
+ "ID": "1",
+ "typeID": "Label",
+ "zOrder": "1",
+ "measuredW": "76",
+ "measuredH": "25",
+ "x": "39",
+ "y": "13",
+ "properties": {
+ "size": "17",
+ "text": "Matplotlib"
+ }
+ }
+ ]
+ }
+ }
+ },
+ {
+ "ID": "1790",
+ "typeID": "__group__",
+ "zOrder": "146",
+ "measuredW": "153",
+ "measuredH": "50",
+ "w": "153",
+ "h": "50",
+ "x": "290",
+ "y": "1956",
+ "properties": {
+ "controlName": "103-data-visualization:seaborn"
+ },
+ "children": {
+ "controls": {
+ "control": [
+ {
+ "ID": "0",
+ "typeID": "TextArea",
+ "zOrder": "0",
+ "w": "153",
+ "h": "50",
+ "measuredW": "200",
+ "measuredH": "140",
+ "x": "0",
+ "y": "0",
+ "properties": {
+ "color": "16770457"
+ }
+ },
+ {
+ "ID": "1",
+ "typeID": "Label",
+ "zOrder": "1",
+ "measuredW": "65",
+ "measuredH": "25",
+ "x": "44",
+ "y": "13",
+ "properties": {
+ "size": "17",
+ "text": "Seaborn"
+ }
+ }
+ ]
+ }
+ }
+ },
+ {
+ "ID": "1791",
+ "typeID": "__group__",
+ "zOrder": "147",
+ "measuredW": "153",
+ "measuredH": "50",
+ "w": "153",
+ "h": "50",
+ "x": "290",
+ "y": "2004",
+ "properties": {
+ "controlName": "104-data-visualization:ggplot2"
+ },
+ "children": {
+ "controls": {
+ "control": [
+ {
+ "ID": "0",
+ "typeID": "TextArea",
+ "zOrder": "0",
+ "w": "153",
+ "h": "50",
+ "measuredW": "200",
+ "measuredH": "140",
+ "x": "0",
+ "y": "0",
+ "properties": {
+ "color": "16770457"
+ }
+ },
+ {
+ "ID": "1",
+ "typeID": "Label",
+ "zOrder": "1",
+ "measuredW": "58",
+ "measuredH": "25",
+ "x": "48",
+ "y": "13",
+ "properties": {
+ "size": "17",
+ "text": "ggplot2"
+ }
+ }
+ ]
+ }
+ }
+ },
+ {
+ "ID": "1792",
+ "typeID": "__group__",
+ "zOrder": "129",
+ "measuredW": "125",
+ "measuredH": "50",
+ "w": "125",
+ "h": "50",
+ "x": "449",
+ "y": "1908",
+ "properties": {
+ "controlName": "105-data-visualization:bar-charts"
+ },
+ "children": {
+ "controls": {
+ "control": [
+ {
+ "ID": "0",
+ "typeID": "TextArea",
+ "zOrder": "0",
+ "w": "125",
+ "h": "50",
+ "measuredW": "200",
+ "measuredH": "140",
+ "x": "0",
+ "y": "0",
+ "properties": {
+ "color": "16770457"
+ }
+ },
+ {
+ "ID": "1",
+ "typeID": "Label",
+ "zOrder": "1",
+ "measuredW": "84",
+ "measuredH": "25",
+ "x": "21",
+ "y": "13",
+ "properties": {
+ "size": "17",
+ "text": "Bar Charts"
+ }
+ }
+ ]
+ }
+ }
+ },
+ {
+ "ID": "1793",
+ "typeID": "__group__",
+ "zOrder": "130",
+ "measuredW": "136",
+ "measuredH": "50",
+ "w": "136",
+ "h": "50",
+ "x": "571",
+ "y": "1908",
+ "properties": {
+ "controlName": "106-data-visualization:histograms"
+ },
+ "children": {
+ "controls": {
+ "control": [
+ {
+ "ID": "0",
+ "typeID": "TextArea",
+ "zOrder": "0",
+ "w": "136",
+ "h": "50",
+ "measuredW": "200",
+ "measuredH": "140",
+ "x": "0",
+ "y": "0",
+ "properties": {
+ "color": "16770457"
+ }
+ },
+ {
+ "ID": "1",
+ "typeID": "Label",
+ "zOrder": "1",
+ "measuredW": "88",
+ "measuredH": "25",
+ "x": "13",
+ "y": "13",
+ "properties": {
+ "size": "17",
+ "text": "Histograms"
+ }
+ }
+ ]
+ }
+ }
+ },
+ {
+ "ID": "1794",
+ "typeID": "__group__",
+ "zOrder": "131",
+ "measuredW": "125",
+ "measuredH": "50",
+ "w": "125",
+ "h": "50",
+ "x": "449",
+ "y": "1954",
+ "properties": {
+ "controlName": "107-data-visualization:line-chart"
+ },
+ "children": {
+ "controls": {
+ "control": [
+ {
+ "ID": "0",
+ "typeID": "TextArea",
+ "zOrder": "0",
+ "w": "125",
+ "h": "50",
+ "measuredW": "200",
+ "measuredH": "140",
+ "x": "0",
+ "y": "0",
+ "properties": {
+ "color": "16770457"
+ }
+ },
+ {
+ "ID": "1",
+ "typeID": "Label",
+ "zOrder": "1",
+ "measuredW": "81",
+ "measuredH": "25",
+ "x": "22",
+ "y": "13",
+ "properties": {
+ "size": "17",
+ "text": "Line Chart"
+ }
+ }
+ ]
+ }
+ }
+ },
+ {
+ "ID": "1795",
+ "typeID": "__group__",
+ "zOrder": "132",
+ "measuredW": "136",
+ "measuredH": "50",
+ "w": "136",
+ "h": "50",
+ "x": "571",
+ "y": "1955",
+ "properties": {
+ "controlName": "108-data-visualization:stacked-chart"
+ },
+ "children": {
+ "controls": {
+ "control": [
+ {
+ "ID": "0",
+ "typeID": "TextArea",
+ "zOrder": "0",
+ "w": "136",
+ "h": "50",
+ "measuredW": "200",
+ "measuredH": "140",
+ "x": "0",
+ "y": "0",
+ "properties": {
+ "color": "16770457"
+ }
+ },
+ {
+ "ID": "1",
+ "typeID": "Label",
+ "zOrder": "1",
+ "measuredW": "110",
+ "measuredH": "25",
+ "x": "13",
+ "y": "13",
+ "properties": {
+ "size": "17",
+ "text": "Stacked Chart"
+ }
+ }
+ ]
+ }
+ }
+ },
+ {
+ "ID": "1796",
+ "typeID": "__group__",
+ "zOrder": "133",
+ "measuredW": "125",
+ "measuredH": "50",
+ "w": "125",
+ "h": "50",
+ "x": "449",
+ "y": "2001",
+ "properties": {
+ "controlName": "109-data-visualization:scatter-plot"
+ },
+ "children": {
+ "controls": {
+ "control": [
+ {
+ "ID": "0",
+ "typeID": "TextArea",
+ "zOrder": "0",
+ "w": "125",
+ "h": "50",
+ "measuredW": "200",
+ "measuredH": "140",
+ "x": "0",
+ "y": "0",
+ "properties": {
+ "color": "16770457"
+ }
+ },
+ {
+ "ID": "1",
+ "typeID": "Label",
+ "zOrder": "1",
+ "measuredW": "90",
+ "measuredH": "25",
+ "x": "18",
+ "y": "13",
+ "properties": {
+ "size": "17",
+ "text": "Scatter Plot"
+ }
+ }
+ ]
+ }
+ }
+ },
+ {
+ "ID": "1797",
+ "typeID": "__group__",
+ "zOrder": "135",
+ "measuredW": "136",
+ "measuredH": "50",
+ "w": "136",
+ "h": "50",
+ "x": "571",
+ "y": "2002",
+ "properties": {
+ "controlName": "110-data-visualization:heatmap"
+ },
+ "children": {
+ "controls": {
+ "control": [
+ {
+ "ID": "0",
+ "typeID": "TextArea",
+ "zOrder": "0",
+ "w": "136",
+ "h": "50",
+ "measuredW": "200",
+ "measuredH": "140",
+ "x": "0",
+ "y": "0",
+ "properties": {
+ "color": "16770457"
+ }
+ },
+ {
+ "ID": "1",
+ "typeID": "Label",
+ "zOrder": "1",
+ "measuredW": "71",
+ "measuredH": "25",
+ "x": "32",
+ "y": "13",
+ "properties": {
+ "size": "17",
+ "text": "Heatmap"
+ }
+ }
+ ]
+ }
+ }
+ },
+ {
+ "ID": "1798",
+ "typeID": "__group__",
+ "zOrder": "134",
+ "measuredW": "127",
+ "measuredH": "50",
+ "w": "127",
+ "h": "50",
+ "x": "449",
+ "y": "2048",
+ "properties": {
+ "controlName": "111-data-visualization:funnel-chart"
+ },
+ "children": {
+ "controls": {
+ "control": [
+ {
+ "ID": "0",
+ "typeID": "TextArea",
+ "zOrder": "0",
+ "w": "127",
+ "h": "50",
+ "measuredW": "200",
+ "measuredH": "140",
+ "x": "0",
+ "y": "0",
+ "properties": {
+ "color": "16770457"
+ }
+ },
+ {
+ "ID": "1",
+ "typeID": "Label",
+ "zOrder": "1",
+ "measuredW": "100",
+ "measuredH": "25",
+ "x": "13",
+ "y": "13",
+ "properties": {
+ "size": "17",
+ "text": "Funnel Chart"
+ }
+ }
+ ]
+ }
+ }
+ },
+ {
+ "ID": "1799",
+ "typeID": "__group__",
+ "zOrder": "136",
+ "measuredW": "137",
+ "measuredH": "50",
+ "w": "137",
+ "h": "50",
+ "x": "571",
+ "y": "2048",
+ "properties": {
+ "controlName": "112-data-visualization:pie-chart"
+ },
+ "children": {
+ "controls": {
+ "control": [
+ {
+ "ID": "0",
+ "typeID": "TextArea",
+ "zOrder": "0",
+ "w": "137",
+ "h": "50",
+ "measuredW": "200",
+ "measuredH": "140",
+ "x": "0",
+ "y": "0",
+ "properties": {
+ "color": "16770457"
+ }
+ },
+ {
+ "ID": "1",
+ "typeID": "Label",
+ "zOrder": "1",
+ "measuredW": "72",
+ "measuredH": "25",
+ "x": "33",
+ "y": "13",
+ "properties": {
+ "size": "17",
+ "text": "Pie Chart"
+ }
+ }
+ ]
+ }
+ }
+ },
+ {
+ "ID": "1800",
+ "typeID": "__group__",
+ "zOrder": "148",
+ "measuredW": "259",
+ "measuredH": "50",
+ "w": "259",
+ "h": "50",
+ "x": "721",
+ "y": "1770",
+ "properties": {
+ "controlName": "110-statistical-analysis"
+ },
+ "children": {
+ "controls": {
+ "control": [
+ {
+ "ID": "0",
+ "typeID": "TextArea",
+ "zOrder": "0",
+ "w": "259",
+ "h": "50",
+ "measuredW": "200",
+ "measuredH": "140",
+ "x": "0",
+ "y": "0",
+ "properties": {
+ "color": "16776960"
+ }
+ },
+ {
+ "ID": "1",
+ "typeID": "Label",
+ "zOrder": "1",
+ "measuredW": "141",
+ "measuredH": "25",
+ "x": "60",
+ "y": "12",
+ "properties": {
+ "size": "17",
+ "text": "Statistical Analysis"
+ }
+ }
+ ]
+ }
+ }
+ },
+ {
+ "ID": "1801",
+ "typeID": "__group__",
+ "zOrder": "149",
+ "measuredW": "195",
+ "measuredH": "50",
+ "w": "195",
+ "h": "50",
+ "x": "751",
+ "y": "1909",
+ "properties": {
+ "controlName": "100-statistical-analysis:hypothesis-testing"
+ },
+ "children": {
+ "controls": {
+ "control": [
+ {
+ "ID": "0",
+ "typeID": "TextArea",
+ "zOrder": "0",
+ "w": "195",
+ "h": "50",
+ "measuredW": "200",
+ "measuredH": "140",
+ "x": "0",
+ "y": "0",
+ "properties": {
+ "color": "16770457"
+ }
+ },
+ {
+ "ID": "1",
+ "typeID": "Label",
+ "zOrder": "1",
+ "measuredW": "145",
+ "measuredH": "25",
+ "x": "25",
+ "y": "13",
+ "properties": {
+ "size": "17",
+ "text": "Hypothesis Testing"
+ }
+ }
+ ]
+ }
+ }
+ },
+ {
+ "ID": "1802",
+ "typeID": "__group__",
+ "zOrder": "150",
+ "measuredW": "195",
+ "measuredH": "50",
+ "w": "195",
+ "h": "50",
+ "x": "751",
+ "y": "1955",
+ "properties": {
+ "controlName": "101-statistical-analysis:correlation-analysis"
+ },
+ "children": {
+ "controls": {
+ "control": [
+ {
+ "ID": "0",
+ "typeID": "TextArea",
+ "zOrder": "0",
+ "w": "195",
+ "h": "50",
+ "measuredW": "200",
+ "measuredH": "140",
+ "x": "0",
+ "y": "0",
+ "properties": {
+ "color": "16770457"
+ }
+ },
+ {
+ "ID": "1",
+ "typeID": "Label",
+ "zOrder": "1",
+ "measuredW": "152",
+ "measuredH": "25",
+ "x": "22",
+ "y": "13",
+ "properties": {
+ "size": "17",
+ "text": "Correlation Analysis"
+ }
+ }
+ ]
+ }
+ }
+ },
+ {
+ "ID": "1803",
+ "typeID": "__group__",
+ "zOrder": "151",
+ "measuredW": "195",
+ "measuredH": "50",
+ "w": "195",
+ "h": "50",
+ "x": "751",
+ "y": "2002",
+ "properties": {
+ "controlName": "102-statistical-analysis:regression"
+ },
+ "children": {
+ "controls": {
+ "control": [
+ {
+ "ID": "0",
+ "typeID": "TextArea",
+ "zOrder": "0",
+ "w": "195",
+ "h": "50",
+ "measuredW": "200",
+ "measuredH": "140",
+ "x": "0",
+ "y": "0",
+ "properties": {
+ "color": "16770457"
+ }
+ },
+ {
+ "ID": "1",
+ "typeID": "Label",
+ "zOrder": "1",
+ "measuredW": "88",
+ "measuredH": "25",
+ "x": "54",
+ "y": "13",
+ "properties": {
+ "size": "17",
+ "text": "Regression"
+ }
+ }
+ ]
+ }
+ }
+ },
+ {
+ "ID": "1804",
+ "typeID": "__group__",
+ "zOrder": "158",
+ "measuredW": "259",
+ "measuredH": "50",
+ "w": "259",
+ "h": "50",
+ "x": "1111",
+ "y": "2128",
+ "properties": {
+ "controlName": "111-machine-learning-basics"
+ },
+ "children": {
+ "controls": {
+ "control": [
+ {
+ "ID": "0",
+ "typeID": "TextArea",
+ "zOrder": "0",
+ "w": "259",
+ "h": "50",
+ "measuredW": "200",
+ "measuredH": "140",
+ "x": "0",
+ "y": "0",
+ "properties": {
+ "color": "16776960"
+ }
+ },
+ {
+ "ID": "1",
+ "typeID": "Label",
+ "zOrder": "1",
+ "measuredW": "195",
+ "measuredH": "25",
+ "x": "32",
+ "y": "12",
+ "properties": {
+ "size": "17",
+ "text": "Machine Learning Basics"
+ }
+ }
+ ]
+ }
+ }
+ },
+ {
+ "ID": "1805",
+ "typeID": "__group__",
+ "zOrder": "159",
+ "measuredW": "222",
+ "measuredH": "50",
+ "w": "222",
+ "h": "50",
+ "x": "1049",
+ "y": "2001",
+ "properties": {
+ "controlName": "100-machine-learning-basics:supervised"
+ },
+ "children": {
+ "controls": {
+ "control": [
+ {
+ "ID": "0",
+ "typeID": "TextArea",
+ "zOrder": "0",
+ "w": "222",
+ "h": "50",
+ "measuredW": "200",
+ "measuredH": "140",
+ "x": "0",
+ "y": "0",
+ "properties": {
+ "color": "16770457"
+ }
+ },
+ {
+ "ID": "1",
+ "typeID": "Label",
+ "zOrder": "1",
+ "measuredW": "159",
+ "measuredH": "25",
+ "x": "31",
+ "y": "13",
+ "properties": {
+ "size": "17",
+ "text": "Supervised Learning"
+ }
+ }
+ ]
+ }
+ }
+ },
+ {
+ "ID": "1806",
+ "typeID": "__group__",
+ "zOrder": "160",
+ "measuredW": "222",
+ "measuredH": "50",
+ "w": "222",
+ "h": "50",
+ "x": "1049",
+ "y": "1949",
+ "properties": {
+ "controlName": "101-machine-learning-basics:unsupervised"
+ },
+ "children": {
+ "controls": {
+ "control": [
+ {
+ "ID": "0",
+ "typeID": "TextArea",
+ "zOrder": "0",
+ "w": "222",
+ "h": "50",
+ "measuredW": "200",
+ "measuredH": "140",
+ "x": "0",
+ "y": "0",
+ "properties": {
+ "color": "16770457"
+ }
+ },
+ {
+ "ID": "1",
+ "typeID": "Label",
+ "zOrder": "1",
+ "measuredW": "180",
+ "measuredH": "25",
+ "x": "21",
+ "y": "13",
+ "properties": {
+ "size": "17",
+ "text": "Unsupervised Learning"
+ }
+ }
+ ]
+ }
+ }
+ },
+ {
+ "ID": "1807",
+ "typeID": "__group__",
+ "zOrder": "161",
+ "measuredW": "222",
+ "measuredH": "50",
+ "w": "222",
+ "h": "50",
+ "x": "1049",
+ "y": "1897",
+ "properties": {
+ "controlName": "102-machine-learning-basics:reinforcement"
+ },
+ "children": {
+ "controls": {
+ "control": [
+ {
+ "ID": "0",
+ "typeID": "TextArea",
+ "zOrder": "0",
+ "w": "222",
+ "h": "50",
+ "measuredW": "200",
+ "measuredH": "140",
+ "x": "0",
+ "y": "0",
+ "properties": {
+ "color": "16770457"
+ }
+ },
+ {
+ "ID": "1",
+ "typeID": "Label",
+ "zOrder": "1",
+ "measuredW": "187",
+ "measuredH": "25",
+ "x": "17",
+ "y": "13",
+ "properties": {
+ "size": "17",
+ "text": "Reinforcement Learning"
+ }
+ }
+ ]
+ }
+ }
+ },
+ {
+ "ID": "1808",
+ "typeID": "__group__",
+ "zOrder": "164",
+ "measuredW": "195",
+ "measuredH": "50",
+ "w": "195",
+ "h": "50",
+ "x": "753",
+ "y": "2172",
+ "properties": {
+ "controlName": "103-machine-learning-basics:decision-trees"
+ },
+ "children": {
+ "controls": {
+ "control": [
+ {
+ "ID": "0",
+ "typeID": "TextArea",
+ "zOrder": "0",
+ "w": "195",
+ "h": "50",
+ "measuredW": "200",
+ "measuredH": "140",
+ "x": "0",
+ "y": "0",
+ "properties": {
+ "color": "16770457"
+ }
+ },
+ {
+ "ID": "1",
+ "typeID": "Label",
+ "zOrder": "1",
+ "measuredW": "115",
+ "measuredH": "25",
+ "x": "44",
+ "y": "13",
+ "properties": {
+ "size": "17",
+ "text": "Decision Trees"
+ }
+ }
+ ]
+ }
+ }
+ },
+ {
+ "ID": "1809",
+ "typeID": "__group__",
+ "zOrder": "167",
+ "measuredW": "122",
+ "measuredH": "50",
+ "w": "122",
+ "h": "50",
+ "x": "753",
+ "y": "2226",
+ "properties": {
+ "controlName": "104-machine-learning-basics:naive-bayes"
+ },
+ "children": {
+ "controls": {
+ "control": [
+ {
+ "ID": "0",
+ "typeID": "TextArea",
+ "zOrder": "0",
+ "w": "122",
+ "h": "50",
+ "measuredW": "200",
+ "measuredH": "140",
+ "x": "0",
+ "y": "0",
+ "properties": {
+ "color": "16770457"
+ }
+ },
+ {
+ "ID": "1",
+ "typeID": "Label",
+ "zOrder": "1",
+ "measuredW": "95",
+ "measuredH": "25",
+ "x": "13",
+ "y": "13",
+ "properties": {
+ "size": "17",
+ "text": "Naive Bayes"
+ }
+ }
+ ]
+ }
+ }
+ },
+ {
+ "ID": "1810",
+ "typeID": "__group__",
+ "zOrder": "168",
+ "measuredW": "69",
+ "measuredH": "50",
+ "w": "69",
+ "h": "50",
+ "x": "879",
+ "y": "2226",
+ "properties": {
+ "controlName": "105-machine-learning-basics:knn"
+ },
+ "children": {
+ "controls": {
+ "control": [
+ {
+ "ID": "0",
+ "typeID": "TextArea",
+ "zOrder": "0",
+ "w": "69",
+ "h": "50",
+ "measuredW": "200",
+ "measuredH": "140",
+ "x": "0",
+ "y": "0",
+ "properties": {
+ "color": "16770457"
+ }
+ },
+ {
+ "ID": "1",
+ "typeID": "Label",
+ "zOrder": "1",
+ "measuredW": "37",
+ "measuredH": "25",
+ "x": "16",
+ "y": "13",
+ "properties": {
+ "size": "17",
+ "text": "KNN"
+ }
+ }
+ ]
+ }
+ }
+ },
+ {
+ "ID": "1811",
+ "typeID": "__group__",
+ "zOrder": "166",
+ "measuredW": "195",
+ "measuredH": "50",
+ "w": "195",
+ "h": "50",
+ "x": "753",
+ "y": "2280",
+ "properties": {
+ "controlName": "106-machine-learning-basics:kmeans"
+ },
+ "children": {
+ "controls": {
+ "control": [
+ {
+ "ID": "0",
+ "typeID": "TextArea",
+ "zOrder": "0",
+ "w": "195",
+ "h": "50",
+ "measuredW": "200",
+ "measuredH": "140",
+ "x": "0",
+ "y": "0",
+ "properties": {
+ "color": "16770457"
+ }
+ },
+ {
+ "ID": "1",
+ "typeID": "Label",
+ "zOrder": "1",
+ "measuredW": "153",
+ "measuredH": "25",
+ "x": "24",
+ "y": "13",
+ "properties": {
+ "size": "17",
+ "text": "K-Means Clustering"
+ }
+ }
+ ]
+ }
+ }
+ },
+ {
+ "ID": "1812",
+ "typeID": "__group__",
+ "zOrder": "165",
+ "measuredW": "195",
+ "measuredH": "50",
+ "w": "195",
+ "h": "50",
+ "x": "753",
+ "y": "2333",
+ "properties": {
+ "controlName": "107-machine-learning-basics:logistic"
+ },
+ "children": {
+ "controls": {
+ "control": [
+ {
+ "ID": "0",
+ "typeID": "TextArea",
+ "zOrder": "0",
+ "w": "195",
+ "h": "50",
+ "measuredW": "200",
+ "measuredH": "140",
+ "x": "0",
+ "y": "0",
+ "properties": {
+ "color": "16770457"
+ }
+ },
+ {
+ "ID": "1",
+ "typeID": "Label",
+ "zOrder": "1",
+ "measuredW": "152",
+ "measuredH": "25",
+ "x": "24",
+ "y": "13",
+ "properties": {
+ "size": "17",
+ "text": "Logistic Regression"
+ }
+ }
+ ]
+ }
+ }
+ },
+ {
+ "ID": "1813",
+ "typeID": "__group__",
+ "zOrder": "169",
+ "measuredW": "256",
+ "measuredH": "50",
+ "w": "256",
+ "h": "50",
+ "x": "1035",
+ "y": "2203",
+ "properties": {
+ "controlName": "108-machine-learning-basics:model-evaluation-techniques"
+ },
+ "children": {
+ "controls": {
+ "control": [
+ {
+ "ID": "0",
+ "typeID": "TextArea",
+ "zOrder": "0",
+ "w": "256",
+ "h": "50",
+ "measuredW": "200",
+ "measuredH": "140",
+ "x": "0",
+ "y": "0",
+ "properties": {
+ "color": "16770457"
+ }
+ },
+ {
+ "ID": "1",
+ "typeID": "Label",
+ "zOrder": "1",
+ "measuredW": "226",
+ "measuredH": "25",
+ "x": "15",
+ "y": "13",
+ "properties": {
+ "size": "17",
+ "text": "Model Evaluation Techniques"
+ }
+ }
+ ]
+ }
+ }
+ },
+ {
+ "ID": "1814",
+ "typeID": "__group__",
+ "zOrder": "171",
+ "measuredW": "233",
+ "measuredH": "50",
+ "w": "233",
+ "h": "50",
+ "x": "479",
+ "y": "2383",
+ "properties": {
+ "controlName": "112-big-data"
+ },
+ "children": {
+ "controls": {
+ "control": [
+ {
+ "ID": "0",
+ "typeID": "TextArea",
+ "zOrder": "0",
+ "w": "233",
+ "h": "50",
+ "measuredW": "200",
+ "measuredH": "140",
+ "x": "0",
+ "y": "0",
+ "properties": {
+ "color": "16776960"
+ }
+ },
+ {
+ "ID": "1",
+ "typeID": "Label",
+ "zOrder": "1",
+ "measuredW": "173",
+ "measuredH": "25",
+ "x": "30",
+ "y": "12",
+ "properties": {
+ "size": "17",
+ "text": "Big Data Technologies"
+ }
+ }
+ ]
+ }
+ }
+ },
+ {
+ "ID": "1815",
+ "typeID": "__group__",
+ "zOrder": "172",
+ "measuredW": "260",
+ "measuredH": "50",
+ "w": "260",
+ "h": "50",
+ "x": "405",
+ "y": "2286",
+ "properties": {
+ "controlName": "100-big-data:concepts"
+ },
+ "children": {
+ "controls": {
+ "control": [
+ {
+ "ID": "0",
+ "typeID": "TextArea",
+ "zOrder": "0",
+ "w": "260",
+ "h": "50",
+ "measuredW": "200",
+ "measuredH": "140",
+ "x": "0",
+ "y": "0",
+ "properties": {
+ "color": "16770457"
+ }
+ },
+ {
+ "ID": "1",
+ "typeID": "Label",
+ "zOrder": "1",
+ "measuredW": "145",
+ "measuredH": "25",
+ "x": "57",
+ "y": "13",
+ "properties": {
+ "size": "17",
+ "text": "Big Data Concepts"
+ }
+ }
+ ]
+ }
+ }
+ },
+ {
+ "ID": "1816",
+ "typeID": "__group__",
+ "zOrder": "177",
+ "measuredW": "254",
+ "measuredH": "50",
+ "w": "254",
+ "h": "50",
+ "x": "184",
+ "y": "2383",
+ "properties": {
+ "controlName": "101-big-data:data-processing-techniques"
+ },
+ "children": {
+ "controls": {
+ "control": [
+ {
+ "ID": "0",
+ "typeID": "TextArea",
+ "zOrder": "0",
+ "w": "254",
+ "h": "50",
+ "measuredW": "200",
+ "measuredH": "140",
+ "x": "0",
+ "y": "0"
+ },
+ {
+ "ID": "1",
+ "typeID": "Label",
+ "zOrder": "1",
+ "measuredW": "220",
+ "measuredH": "25",
+ "x": "17",
+ "y": "13",
+ "properties": {
+ "size": "17",
+ "text": "Data Processing Techniques"
+ }
+ }
+ ]
+ }
+ }
+ },
+ {
+ "ID": "1817",
+ "typeID": "__group__",
+ "zOrder": "176",
+ "measuredW": "226",
+ "measuredH": "50",
+ "w": "226",
+ "h": "50",
+ "x": "408",
+ "y": "2462",
+ "properties": {
+ "controlName": "102-big-data:data-storage-solutions"
+ },
+ "children": {
+ "controls": {
+ "control": [
+ {
+ "ID": "0",
+ "typeID": "TextArea",
+ "zOrder": "0",
+ "w": "226",
+ "h": "50",
+ "measuredW": "200",
+ "measuredH": "140",
+ "x": "0",
+ "y": "0",
+ "properties": {
+ "color": "16770457"
+ }
+ },
+ {
+ "ID": "1",
+ "typeID": "Label",
+ "zOrder": "1",
+ "measuredW": "176",
+ "measuredH": "25",
+ "x": "25",
+ "y": "13",
+ "properties": {
+ "size": "17",
+ "text": "Data Storage Solutions"
+ }
+ }
+ ]
+ }
+ }
+ },
+ {
+ "ID": "1818",
+ "typeID": "__group__",
+ "zOrder": "173",
+ "measuredW": "260",
+ "measuredH": "50",
+ "w": "260",
+ "h": "50",
+ "x": "405",
+ "y": "2222",
+ "properties": {
+ "controlName": "103-big-data:data-processing-frameworks"
+ },
+ "children": {
+ "controls": {
+ "control": [
+ {
+ "ID": "0",
+ "typeID": "TextArea",
+ "zOrder": "0",
+ "w": "260",
+ "h": "50",
+ "measuredW": "200",
+ "measuredH": "140",
+ "x": "0",
+ "y": "0"
+ },
+ {
+ "ID": "1",
+ "typeID": "Label",
+ "zOrder": "1",
+ "measuredW": "225",
+ "measuredH": "25",
+ "x": "17",
+ "y": "13",
+ "properties": {
+ "size": "17",
+ "text": "Data Processing Frameworks"
+ }
+ }
+ ]
+ }
+ }
+ },
+ {
+ "ID": "1819",
+ "typeID": "__group__",
+ "zOrder": "174",
+ "measuredW": "127",
+ "measuredH": "50",
+ "w": "127",
+ "h": "50",
+ "x": "406",
+ "y": "2177",
+ "properties": {
+ "controlName": "100-big-data:data-processing-frameworks:hadoop"
+ },
+ "children": {
+ "controls": {
+ "control": [
+ {
+ "ID": "0",
+ "typeID": "TextArea",
+ "zOrder": "0",
+ "w": "127",
+ "h": "50",
+ "measuredW": "200",
+ "measuredH": "140",
+ "x": "0",
+ "y": "0",
+ "properties": {
+ "color": "16770457"
+ }
+ },
+ {
+ "ID": "1",
+ "typeID": "Label",
+ "zOrder": "1",
+ "measuredW": "61",
+ "measuredH": "25",
+ "x": "33",
+ "y": "13",
+ "properties": {
+ "size": "17",
+ "text": "Hadoop"
+ }
+ }
+ ]
+ }
+ }
+ },
+ {
+ "ID": "1820",
+ "typeID": "__group__",
+ "zOrder": "175",
+ "measuredW": "134",
+ "measuredH": "50",
+ "w": "134",
+ "h": "50",
+ "x": "530",
+ "y": "2177",
+ "properties": {
+ "controlName": "101-big-data:data-processing-frameworks:spark"
+ },
+ "children": {
+ "controls": {
+ "control": [
+ {
+ "ID": "0",
+ "typeID": "TextArea",
+ "zOrder": "0",
+ "w": "134",
+ "h": "50",
+ "measuredW": "200",
+ "measuredH": "140",
+ "x": "0",
+ "y": "0",
+ "properties": {
+ "color": "16770457"
+ }
+ },
+ {
+ "ID": "1",
+ "typeID": "Label",
+ "zOrder": "1",
+ "measuredW": "45",
+ "measuredH": "25",
+ "x": "50",
+ "y": "13",
+ "properties": {
+ "size": "17",
+ "text": "Spark"
+ }
+ }
+ ]
+ }
+ }
+ },
+ {
+ "ID": "1821",
+ "typeID": "__group__",
+ "zOrder": "179",
+ "measuredW": "177",
+ "measuredH": "50",
+ "w": "177",
+ "h": "50",
+ "x": "181",
+ "y": "2302",
+ "properties": {
+ "controlName": "100-big-data:data-processing-techniques:parallel-processing"
+ },
+ "children": {
+ "controls": {
+ "control": [
+ {
+ "ID": "0",
+ "typeID": "TextArea",
+ "zOrder": "0",
+ "w": "177",
+ "h": "50",
+ "measuredW": "200",
+ "measuredH": "140",
+ "x": "0",
+ "y": "0",
+ "properties": {
+ "color": "16770457"
+ }
+ },
+ {
+ "ID": "1",
+ "typeID": "Label",
+ "zOrder": "1",
+ "measuredW": "147",
+ "measuredH": "25",
+ "x": "14",
+ "y": "13",
+ "properties": {
+ "size": "17",
+ "text": "Parallel Processing"
+ }
+ }
+ ]
+ }
+ }
+ },
+ {
+ "ID": "1823",
+ "typeID": "__group__",
+ "zOrder": "180",
+ "measuredW": "57",
+ "measuredH": "50",
+ "w": "57",
+ "h": "50",
+ "x": "181",
+ "y": "2249",
+ "properties": {
+ "controlName": "101-big-data:data-processing-techniques:mpi"
+ },
+ "children": {
+ "controls": {
+ "control": [
+ {
+ "ID": "0",
+ "typeID": "TextArea",
+ "zOrder": "0",
+ "w": "57",
+ "h": "50",
+ "measuredW": "200",
+ "measuredH": "140",
+ "x": "0",
+ "y": "0",
+ "properties": {
+ "color": "16770457"
+ }
+ },
+ {
+ "ID": "1",
+ "typeID": "Label",
+ "zOrder": "1",
+ "measuredW": "31",
+ "measuredH": "25",
+ "x": "13",
+ "y": "13",
+ "properties": {
+ "size": "17",
+ "text": "MPI"
+ }
+ }
+ ]
+ }
+ }
+ },
+ {
+ "ID": "1824",
+ "typeID": "__group__",
+ "zOrder": "178",
+ "measuredW": "115",
+ "measuredH": "50",
+ "w": "115",
+ "h": "50",
+ "x": "242",
+ "y": "2250",
+ "properties": {
+ "controlName": "102-big-data:data-processing-techniques:map-reduce"
+ },
+ "children": {
+ "controls": {
+ "control": [
+ {
+ "ID": "0",
+ "typeID": "TextArea",
+ "zOrder": "0",
+ "w": "115",
+ "h": "50",
+ "measuredW": "200",
+ "measuredH": "140",
+ "x": "0",
+ "y": "0",
+ "properties": {
+ "color": "16770457"
+ }
+ },
+ {
+ "ID": "1",
+ "typeID": "Label",
+ "zOrder": "1",
+ "measuredW": "95",
+ "measuredH": "25",
+ "x": "10",
+ "y": "13",
+ "properties": {
+ "size": "17",
+ "text": "MapReduce"
+ }
+ }
+ ]
+ }
+ }
+ },
+ {
+ "ID": "1825",
+ "typeID": "__group__",
+ "zOrder": "181",
+ "measuredW": "241",
+ "measuredH": "50",
+ "w": "241",
+ "h": "50",
+ "x": "466",
+ "y": "2574",
+ "properties": {
+ "controlName": "113-deep-learning"
+ },
+ "children": {
+ "controls": {
+ "control": [
+ {
+ "ID": "0",
+ "typeID": "TextArea",
+ "zOrder": "0",
+ "w": "241",
+ "h": "50",
+ "measuredW": "200",
+ "measuredH": "140",
+ "x": "0",
+ "y": "0",
+ "properties": {
+ "color": "16776960"
+ }
+ },
+ {
+ "ID": "1",
+ "typeID": "Label",
+ "zOrder": "1",
+ "measuredW": "197",
+ "measuredH": "25",
+ "x": "22",
+ "y": "12",
+ "properties": {
+ "size": "17",
+ "text": "Deep Learning (Optional)"
+ }
+ }
+ ]
+ }
+ }
+ },
+ {
+ "ID": "1826",
+ "typeID": "__group__",
+ "zOrder": "183",
+ "measuredW": "177",
+ "measuredH": "50",
+ "w": "177",
+ "h": "50",
+ "x": "185",
+ "y": "2530",
+ "properties": {
+ "controlName": "100-deep-learning:neutral-networks"
+ },
+ "children": {
+ "controls": {
+ "control": [
+ {
+ "ID": "0",
+ "typeID": "TextArea",
+ "zOrder": "0",
+ "w": "177",
+ "h": "50",
+ "measuredW": "200",
+ "measuredH": "140",
+ "x": "0",
+ "y": "0",
+ "properties": {
+ "color": "16770457"
+ }
+ },
+ {
+ "ID": "1",
+ "typeID": "Label",
+ "zOrder": "1",
+ "measuredW": "134",
+ "measuredH": "25",
+ "x": "22",
+ "y": "13",
+ "properties": {
+ "size": "17",
+ "text": "Neutral Networks"
+ }
+ }
+ ]
+ }
+ }
+ },
+ {
+ "ID": "1827",
+ "typeID": "__group__",
+ "zOrder": "184",
+ "measuredW": "84",
+ "measuredH": "50",
+ "w": "84",
+ "h": "50",
+ "x": "185",
+ "y": "2476",
+ "properties": {
+ "controlName": "101-deep-learning:cnns"
+ },
+ "children": {
+ "controls": {
+ "control": [
+ {
+ "ID": "0",
+ "typeID": "TextArea",
+ "zOrder": "0",
+ "w": "84",
+ "h": "50",
+ "measuredW": "200",
+ "measuredH": "140",
+ "x": "0",
+ "y": "0",
+ "properties": {
+ "color": "16770457"
+ }
+ },
+ {
+ "ID": "1",
+ "typeID": "Label",
+ "zOrder": "1",
+ "measuredW": "47",
+ "measuredH": "25",
+ "x": "18",
+ "y": "13",
+ "properties": {
+ "size": "17",
+ "text": "CNNs"
+ }
+ }
+ ]
+ }
+ }
+ },
+ {
+ "ID": "1828",
+ "typeID": "__group__",
+ "zOrder": "185",
+ "measuredW": "87",
+ "measuredH": "50",
+ "w": "87",
+ "h": "50",
+ "x": "274",
+ "y": "2476",
+ "properties": {
+ "controlName": "102-deep-learning:rnns"
+ },
+ "children": {
+ "controls": {
+ "control": [
+ {
+ "ID": "0",
+ "typeID": "TextArea",
+ "zOrder": "0",
+ "w": "87",
+ "h": "50",
+ "measuredW": "200",
+ "measuredH": "140",
+ "x": "0",
+ "y": "0",
+ "properties": {
+ "color": "16770457"
+ }
+ },
+ {
+ "ID": "1",
+ "typeID": "Label",
+ "zOrder": "1",
+ "measuredW": "47",
+ "measuredH": "25",
+ "x": "20",
+ "y": "13",
+ "properties": {
+ "size": "17",
+ "text": "RNNs"
+ }
+ }
+ ]
+ }
+ }
+ },
+ {
+ "ID": "1829",
+ "typeID": "__group__",
+ "zOrder": "187",
+ "measuredW": "128",
+ "measuredH": "50",
+ "w": "128",
+ "h": "50",
+ "x": "235",
+ "y": "2681",
+ "properties": {
+ "controlName": "103-deep-learning:tesnor-flow"
+ },
+ "children": {
+ "controls": {
+ "control": [
+ {
+ "ID": "0",
+ "typeID": "TextArea",
+ "zOrder": "0",
+ "w": "128",
+ "h": "50",
+ "measuredW": "200",
+ "measuredH": "140",
+ "x": "0",
+ "y": "0",
+ "properties": {
+ "color": "16770457"
+ }
+ },
+ {
+ "ID": "1",
+ "typeID": "Label",
+ "zOrder": "1",
+ "measuredW": "88",
+ "measuredH": "25",
+ "x": "20",
+ "y": "13",
+ "properties": {
+ "size": "17",
+ "text": "TensorFlow"
+ }
+ }
+ ]
+ }
+ }
+ },
+ {
+ "ID": "1830",
+ "typeID": "__group__",
+ "zOrder": "188",
+ "measuredW": "128",
+ "measuredH": "50",
+ "w": "128",
+ "h": "50",
+ "x": "235",
+ "y": "2735",
+ "properties": {
+ "controlName": "104-deep-learning:pytorch"
+ },
+ "children": {
+ "controls": {
+ "control": [
+ {
+ "ID": "0",
+ "typeID": "TextArea",
+ "zOrder": "0",
+ "w": "128",
+ "h": "50",
+ "measuredW": "200",
+ "measuredH": "140",
+ "x": "0",
+ "y": "0",
+ "properties": {
+ "color": "16770457"
+ }
+ },
+ {
+ "ID": "1",
+ "typeID": "Label",
+ "zOrder": "1",
+ "measuredW": "61",
+ "measuredH": "25",
+ "x": "33",
+ "y": "13",
+ "properties": {
+ "size": "17",
+ "text": "PyTorch"
+ }
+ }
+ ]
+ }
+ }
+ },
+ {
+ "ID": "1831",
+ "typeID": "__group__",
+ "zOrder": "190",
+ "measuredW": "256",
+ "measuredH": "50",
+ "w": "256",
+ "h": "50",
+ "x": "471",
+ "y": "2682",
+ "properties": {
+ "controlName": "105-deep-learning:image-recognition"
+ },
+ "children": {
+ "controls": {
+ "control": [
+ {
+ "ID": "0",
+ "typeID": "TextArea",
+ "zOrder": "0",
+ "w": "256",
+ "h": "50",
+ "measuredW": "200",
+ "measuredH": "140",
+ "x": "0",
+ "y": "0",
+ "properties": {
+ "color": "16770457"
+ }
+ },
+ {
+ "ID": "1",
+ "typeID": "Label",
+ "zOrder": "1",
+ "measuredW": "147",
+ "measuredH": "25",
+ "x": "54",
+ "y": "13",
+ "properties": {
+ "size": "17",
+ "text": "Image Recognition"
+ }
+ }
+ ]
+ }
+ }
+ },
+ {
+ "ID": "1832",
+ "typeID": "__group__",
+ "zOrder": "191",
+ "measuredW": "256",
+ "measuredH": "50",
+ "w": "256",
+ "h": "50",
+ "x": "471",
+ "y": "2735",
+ "properties": {
+ "controlName": "106-deep-learning:natural-language-processing"
+ },
+ "children": {
+ "controls": {
+ "control": [
+ {
+ "ID": "0",
+ "typeID": "TextArea",
+ "zOrder": "0",
+ "w": "256",
+ "h": "50",
+ "measuredW": "200",
+ "measuredH": "140",
+ "x": "0",
+ "y": "0",
+ "properties": {
+ "color": "16770457"
+ }
+ },
+ {
+ "ID": "1",
+ "typeID": "Label",
+ "zOrder": "1",
+ "measuredW": "229",
+ "measuredH": "25",
+ "x": "13",
+ "y": "13",
+ "properties": {
+ "size": "17",
+ "text": "Natural Language Processing"
+ }
+ }
+ ]
+ }
+ }
+ }
+ ]
+ },
+ "attributes": {
+ "name": "New Wireframe 1",
+ "order": 1000000,
+ "parentID": null,
+ "notes": ""
+ },
+ "branchID": "Master",
+ "resourceID": "1C20FF29-764D-4639-A4FE-13A9869FED74",
+ "mockupH": "3003",
+ "mockupW": "1200",
+ "measuredW": "1371",
+ "measuredH": "3208",
+ "version": "1.0"
+ },
+ "groupOffset": {
+ "x": 0,
+ "y": 0
+ },
+ "dependencies": [],
+ "projectID": "file:///Users/kamrify/Desktop/New%20Roadmaps/Android%20Roadmap.bmpr"
+}
\ No newline at end of file
diff --git a/src/data/roadmaps/data-analyst/data-analyst.md b/src/data/roadmaps/data-analyst/data-analyst.md
new file mode 100644
index 000000000..91cd5b06b
--- /dev/null
+++ b/src/data/roadmaps/data-analyst/data-analyst.md
@@ -0,0 +1,48 @@
+---
+jsonUrl: '/jsons/roadmaps/data-analyst.json'
+pdfUrl: '/pdfs/roadmaps/data-analyst.pdf'
+order: 4
+briefTitle: 'Data Analyst'
+briefDescription: 'Step by step guide to becoming an Data Analyst in 2024'
+title: 'Data Analyst Roadmap'
+description: 'Step by step guide to becoming an Data Analyst in 2024'
+hasTopics: true
+isNew: true
+dimensions:
+ width: 968
+ height: 2410.4
+schema:
+ headline: 'Data Analyst Roadmap'
+ description: 'Learn how to become an Data Analyst with this interactive step by step guide in 2023. We also have resources and short descriptions attached to the roadmap items so you can get everything you want to learn in one place.'
+ imageUrl: 'https://roadmap.sh/roadmaps/data-analyst.png'
+ datePublished: '2024-04-02'
+ dateModified: '2024-04-02'
+seo:
+ title: 'Data Analyst Roadmap'
+ description: 'Learn to become an Data Analyst using this roadmap. Community driven, articles, resources, guides, interview questions, quizzes for modern backend development.'
+ keywords:
+ - 'data analyst roadmap 2024'
+ - 'data analytics roadmap 2024'
+ - 'guide to becoming an data analyst'
+ - 'data analyst roadmap'
+ - 'data analyst'
+ - 'data analyst roadmap'
+ - 'data scientist roadmap'
+ - 'data analytics skills'
+ - 'data analyst skills'
+ - 'skills for data analyst'
+ - 'data analyst quiz'
+ - 'data analyst interview questions'
+relatedRoadmaps:
+ - 'sql'
+ - 'ai-data-scientist'
+ - 'postgresql-dba'
+ - 'python'
+sitemap:
+ priority: 1
+ changefreq: 'monthly'
+tags:
+ - 'roadmap'
+ - 'main-sitemap'
+ - 'role-roadmap'
+---
diff --git a/src/data/roadmaps/data-analyst/faqs.astro b/src/data/roadmaps/data-analyst/faqs.astro
new file mode 100644
index 000000000..e69de29bb
diff --git a/src/data/roadmaps/datastructures-and-algorithms/content/104-algorithmic-complexity/101-calculating.md b/src/data/roadmaps/datastructures-and-algorithms/content/104-algorithmic-complexity/101-calculating.md
index abe33041f..48b05c6b6 100644
--- a/src/data/roadmaps/datastructures-and-algorithms/content/104-algorithmic-complexity/101-calculating.md
+++ b/src/data/roadmaps/datastructures-and-algorithms/content/104-algorithmic-complexity/101-calculating.md
@@ -1,3 +1,5 @@
# How to Calculate Complexity?
-The process of calculating algorithmic complexity, often referred to as Big O notation, involves counting the operations or steps an algorithm takes in function of the size of its input. The aim is to identify the worst-case, average-case, and best-case complexity. Generally, the main focus is on the worst-case scenario which represents the maximum number of steps taken by an algorithm. To calculate it, you consider the highest order of size (n) in your algorithm's steps. For instance, if an algorithm performs a loop 5 times for 'n' items, and then does 3 unrelated steps, it has a complexity of O(n), because the linear steps grow faster than constant ones as n increases. Other complexities include O(1) for constant complexity, O(n) for linear complexity, O(n^2) for quadratic complexity, and so on, based on how the steps increase with size.
\ No newline at end of file
+The process of calculating algorithmic complexity, often referred to as Big O notation, involves counting the operations or steps an algorithm takes in function of the size of its input. The aim is to identify the worst-case, average-case, and best-case complexity. Generally, the main focus is on the worst-case scenario which represents the maximum number of steps taken by an algorithm. To calculate it, you consider the highest order of size (n) in your algorithm's steps. For instance, if an algorithm performs a loop 5 times for 'n' items, and then does 3 unrelated steps, it has a complexity of O(n), because the linear steps grow faster than constant ones as n increases. Other complexities include O(1) for constant complexity, O(n) for linear complexity, O(n^2) for quadratic complexity, and so on, based on how the steps increase with size.
+
+- [Time & Space Complexity](https://www.youtube.com/watch?v=Z0bH0cMY0E8)
diff --git a/src/data/roadmaps/datastructures-and-algorithms/datastructures-and-algorithms.md b/src/data/roadmaps/datastructures-and-algorithms/datastructures-and-algorithms.md
index c751d0ec7..d7d43d70a 100644
--- a/src/data/roadmaps/datastructures-and-algorithms/datastructures-and-algorithms.md
+++ b/src/data/roadmaps/datastructures-and-algorithms/datastructures-and-algorithms.md
@@ -7,7 +7,7 @@ briefDescription: 'Step by step guide to learn Data Structures and Algorithms in
title: 'Data Structures & Algorithms Roadmap'
description: 'Step by step guide to learn Data Structures and Algorithms in 2024'
hasTopics: true
-isNew: true
+isNew: false
dimensions:
width: 968
height: 1814.72
@@ -35,5 +35,5 @@ sitemap:
tags:
- 'roadmap'
- 'main-sitemap'
- - 'role-roadmap'
+ - 'skill-roadmap'
---
diff --git a/src/data/roadmaps/java/content/100-java-fundamentals/index.md b/src/data/roadmaps/java/content/100-java-fundamentals/index.md
index 2469df50b..0ee8c9993 100644
--- a/src/data/roadmaps/java/content/100-java-fundamentals/index.md
+++ b/src/data/roadmaps/java/content/100-java-fundamentals/index.md
@@ -1,6 +1,6 @@
# Java Fundamentals
-Java is a programming language and computing platform first released by Sun Microsystems in 1995. Java is a general-purpose, class-based, object-oriented programming language designed for having lesser implementation dependencies. It is a computing platform for application development. Java is fast, secure, and reliable, therefore. It is widely used for developing Java applications in laptops, data centers, game consoles, scientific supercomputers, cell phones, etc.
+Java is a programming language and computing platform first released by Sun Microsystems in 1995. Java is a general-purpose, class-based, object-oriented programming language designed for having lesser implementation dependencies. It is a computing platform for application development. Java is fast, secure, and reliable. Therefore, it is widely used for developing Java applications in laptops, data centers, game consoles, scientific supercomputers, cell phones, etc.
Learn about the fundamentals of Java such as basic syntax, data types, variables, conditionals, functions, data structures, packages, etc.
diff --git a/src/data/roadmaps/java/content/101-java-advanced-topics/107-garbage-collection.md b/src/data/roadmaps/java/content/101-java-advanced-topics/107-garbage-collection.md
index a557e6415..8e451eba2 100644
--- a/src/data/roadmaps/java/content/101-java-advanced-topics/107-garbage-collection.md
+++ b/src/data/roadmaps/java/content/101-java-advanced-topics/107-garbage-collection.md
@@ -7,4 +7,4 @@ Visit the following resources to learn more:
- [Java Garbage Collection](https://stackify.com/what-is-java-garbage-collection/)
- [Garbage Collection in Java](https://www.geeksforgeeks.org/garbage-collection-java/)
- [Java Garbage Collection](https://www.javatpoint.com/Garbage-Collection)
-- [Garbage Collection in Java - Geekific](https://www.youtube.com/watch?v=xxoacv5xm9s)
\ No newline at end of file
+- [Garbage Collection in Java - Geekific](https://www.youtube.com/watch?v=XXOaCV5xm9s)
diff --git a/src/data/roadmaps/sql/content/107-sub-queries/index.md b/src/data/roadmaps/sql/content/107-sub-queries/index.md
index b1f8e768a..07cf8a35f 100644
--- a/src/data/roadmaps/sql/content/107-sub-queries/index.md
+++ b/src/data/roadmaps/sql/content/107-sub-queries/index.md
@@ -33,7 +33,7 @@ WHERE column_name OPERATOR
WHERE roll_id = (SELECT roll_id FROM student WHERE name='John');
```
-2. **Row subquery**: It returns single row of two or more values.
+2. **Row subquery**: It returns a single row or multiple rows of two or more values.
```sql
SELECT * FROM student
@@ -57,4 +57,4 @@ WHERE column_name OPERATOR
## General Note
-Subqueries can be either correlated or uncorrelated. A correlated subquery is a subquery that uses values from the outer query. Conversely, an uncorrelated subquery is a subquery that can be run independently of the outer query.
\ No newline at end of file
+Subqueries can be either correlated or uncorrelated. A correlated subquery is a subquery that uses values from the outer query. Conversely, an uncorrelated subquery is a subquery that can be run independently of the outer query.
diff --git a/src/data/roadmaps/system-design/content/112-caching/101-cdn-caching.md b/src/data/roadmaps/system-design/content/112-caching/101-cdn-caching.md
index a0916edce..0568af197 100644
--- a/src/data/roadmaps/system-design/content/112-caching/101-cdn-caching.md
+++ b/src/data/roadmaps/system-design/content/112-caching/101-cdn-caching.md
@@ -1,6 +1,6 @@
# CDN Caching
-A Content Delivery Network (CDN) is a distributed network of servers that are strategically placed in various locations around the world. The main purpose of a CDN is to serve content to end-users with high availability and high performance by caching frequently accessed content on servers that are closer to the end-users/
+A Content Delivery Network (CDN) is a distributed network of servers that are strategically placed in various locations around the world. The main purpose of a CDN is to serve content to end-users with high availability and high performance by caching frequently accessed content on servers that are closer to the end-users.
When a user requests content from a website that is using a CDN, the CDN will first check if the requested content is available in the cache of a nearby server. If the content is found in the cache, it is served to the user from the nearby server. If the content is not found in the cache, it is requested from the origin server (the original source of the content) and then cached on the nearby server for future requests.
diff --git a/src/data/roadmaps/typescript/content/100-typescript/102-install-configure/index.md b/src/data/roadmaps/typescript/content/100-typescript/102-install-configure/index.md
index 44a3e1394..de2102a21 100644
--- a/src/data/roadmaps/typescript/content/100-typescript/102-install-configure/index.md
+++ b/src/data/roadmaps/typescript/content/100-typescript/102-install-configure/index.md
@@ -35,7 +35,7 @@ npm install --save-dev typescript
tsc
```
-Note: You can also compile individual TypeScript files by specifying the file name after the tsc command.For example:
+Note: You can also compile individual TypeScript files by specifying the file name after the tsc command. For example:
```bash
tsc index.ts
diff --git a/src/data/roadmaps/typescript/content/101-typescript-types/104-undefined.md b/src/data/roadmaps/typescript/content/101-typescript-types/104-undefined.md
index 0d2fbdfd3..57cd9c511 100644
--- a/src/data/roadmaps/typescript/content/101-typescript-types/104-undefined.md
+++ b/src/data/roadmaps/typescript/content/101-typescript-types/104-undefined.md
@@ -1,6 +1,6 @@
# undefined
-JavaScript has two primitive values used to signal absent or uninitialized value: `null` (absent) and `undefined` (unintialized).
+JavaScript has two primitive values used to signal absent or uninitialized value: `null` (absent) and `undefined` (uninitialized).
TypeScript has two corresponding _types_ by the same names. How these types behave depends on whether you have the `strictNullChecks` option on.
diff --git a/src/data/roadmaps/typescript/content/101-typescript-types/115-type-assertions/101-as-type.md b/src/data/roadmaps/typescript/content/101-typescript-types/115-type-assertions/101-as-type.md
index 85c2c5808..e446798b7 100644
--- a/src/data/roadmaps/typescript/content/101-typescript-types/115-type-assertions/101-as-type.md
+++ b/src/data/roadmaps/typescript/content/101-typescript-types/115-type-assertions/101-as-type.md
@@ -9,10 +9,10 @@ Here's a simple example:
let someValue: any = "Hello, TypeScript!";
let strLength: number = (someValue as string).length;
-console.log(strLength); // Outputs: 20
+console.log(strLength); // Outputs: 18
```
-In this example, someValue is initially of type any, and we use the as operator to assert that it is of type string before accessing its length property. It's important to note that type assertions do not change the underlying runtime representation; they are a compile-time construct used for static type checking in TypeScript.
+In this example, someValue is initially of type any, and we use the as operator to assert that it is of type string before accessing its length property.
-It's important to note that type assertions do not change the runtime type of a value, and do not cause any type of conversion. They simply provide a way for the programmer to override the type inference performed by the compiler.
+It's important to note that type assertions do not change the runtime type of a value, and do not cause any type of conversion. They are a compile-time construct used for static type checking in TypeScript.
- [Type assertions](https://www.typescriptlang.org/docs/handbook/2/everyday-types.html#type-assertions)
diff --git a/src/data/videos/acid-explained.md b/src/data/videos/acid-explained.md
index cf9097b8e..280911d18 100644
--- a/src/data/videos/acid-explained.md
+++ b/src/data/videos/acid-explained.md
@@ -4,10 +4,7 @@ description: 'Learn what it means for a database to be ACID compliant with examp
duration: '5 minutes'
isNew: false
date: 2021-09-26
-author:
- name: 'Kamran Ahmed'
- url: 'https://twitter.com/kamrify'
- imageUrl: '/authors/kamranahmedse.jpeg'
+authorId: 'kamran'
sitemap:
priority: 0.7
changefreq: 'weekly'
diff --git a/src/data/videos/all-about-http-caching.md b/src/data/videos/all-about-http-caching.md
index e749426e2..16a48f554 100644
--- a/src/data/videos/all-about-http-caching.md
+++ b/src/data/videos/all-about-http-caching.md
@@ -4,10 +4,7 @@ description: 'Learn what is HTTP caching, places for caching and different cachi
duration: '13 minutes'
isNew: false
date: 2020-10-04
-author:
- name: 'Kamran Ahmed'
- url: 'https://twitter.com/kamrify'
- imageUrl: '/authors/kamranahmedse.jpeg'
+authorId: 'kamran'
sitemap:
priority: 0.7
changefreq: 'weekly'
diff --git a/src/data/videos/array-structure.md b/src/data/videos/array-structure.md
index 99f473e7b..127a19352 100644
--- a/src/data/videos/array-structure.md
+++ b/src/data/videos/array-structure.md
@@ -4,10 +4,7 @@ description: 'Learn everything you need to know about array data structure'
duration: '10 minutes'
isNew: false
date: 2022-01-09
-author:
- name: 'Kamran Ahmed'
- url: 'https://twitter.com/kamrify'
- imageUrl: '/authors/kamranahmedse.jpeg'
+authorId: 'kamran'
sitemap:
priority: 0.7
changefreq: 'weekly'
diff --git a/src/data/videos/arrays-and-objects-in-javascript.md b/src/data/videos/arrays-and-objects-in-javascript.md
index f67c620bd..979bb4831 100644
--- a/src/data/videos/arrays-and-objects-in-javascript.md
+++ b/src/data/videos/arrays-and-objects-in-javascript.md
@@ -4,10 +4,7 @@ description: 'Learn how to manipulate arrays and objects in JavaScript.'
duration: '12 minutes'
isNew: false
date: 2020-05-09
-author:
- name: 'Kamran Ahmed'
- url: 'https://twitter.com/kamrify'
- imageUrl: '/authors/kamranahmedse.jpeg'
+authorId: 'kamran'
sitemap:
priority: 0.7
changefreq: 'weekly'
diff --git a/src/data/videos/async-javascript.md b/src/data/videos/async-javascript.md
index 12a95903d..6622b9e22 100644
--- a/src/data/videos/async-javascript.md
+++ b/src/data/videos/async-javascript.md
@@ -4,10 +4,7 @@ description: 'Learn how to write asynchronous JavaScript using Async/Await'
duration: '15 minutes'
isNew: false
date: 2021-11-14
-author:
- name: 'Kamran Ahmed'
- url: 'https://twitter.com/kamrify'
- imageUrl: '/authors/kamranahmedse.jpeg'
+authorId: 'kamran'
sitemap:
priority: 0.7
changefreq: 'weekly'
diff --git a/src/data/videos/basic-authentication.md b/src/data/videos/basic-authentication.md
index 223461fc4..6c6adc45c 100644
--- a/src/data/videos/basic-authentication.md
+++ b/src/data/videos/basic-authentication.md
@@ -4,10 +4,7 @@ description: 'Learn everything you need to know about basic authentication'
duration: '5 minutes'
isNew: false
date: 2022-10-01
-author:
- name: 'Kamran Ahmed'
- url: 'https://twitter.com/kamrify'
- imageUrl: '/authors/kamranahmedse.jpeg'
+authorId: 'kamran'
sitemap:
priority: 0.7
changefreq: 'weekly'
diff --git a/src/data/videos/basics-of-authentication.md b/src/data/videos/basics-of-authentication.md
index fd10bfc54..28e029f42 100644
--- a/src/data/videos/basics-of-authentication.md
+++ b/src/data/videos/basics-of-authentication.md
@@ -4,10 +4,7 @@ description: 'Learn everything you need to know about authentication with this A
duration: '5 minutes'
isNew: false
date: 2022-09-21
-author:
- name: 'Kamran Ahmed'
- url: 'https://twitter.com/kamrify'
- imageUrl: '/authors/kamranahmedse.jpeg'
+authorId: 'kamran'
sitemap:
priority: 0.7
changefreq: 'weekly'
diff --git a/src/data/videos/big-o-notation.md b/src/data/videos/big-o-notation.md
index 60b2b1e0f..8509e7bdc 100644
--- a/src/data/videos/big-o-notation.md
+++ b/src/data/videos/big-o-notation.md
@@ -4,10 +4,7 @@ description: 'Learn what the Big-O notation is and how to calculate the time com
duration: '8 minutes'
isNew: false
date: 2021-10-25
-author:
- name: 'Kamran Ahmed'
- url: 'https://twitter.com/kamrify'
- imageUrl: '/authors/kamranahmedse.jpeg'
+authorId: 'kamran'
sitemap:
priority: 0.7
changefreq: 'weekly'
diff --git a/src/data/videos/content-delivery-networks.md b/src/data/videos/content-delivery-networks.md
index 6a47235e8..505e853ca 100644
--- a/src/data/videos/content-delivery-networks.md
+++ b/src/data/videos/content-delivery-networks.md
@@ -4,10 +4,7 @@ description: 'Learn what the CDNs are and the difference between push CDN vs pul
duration: '4 minutes'
isNew: false
date: 2020-09-26
-author:
- name: 'Kamran Ahmed'
- url: 'https://twitter.com/kamrify'
- imageUrl: '/authors/kamranahmedse.jpeg'
+authorId: 'kamran'
sitemap:
priority: 0.7
changefreq: 'weekly'
diff --git a/src/data/videos/dns-explained.md b/src/data/videos/dns-explained.md
index b3efdf901..6ad370ed0 100644
--- a/src/data/videos/dns-explained.md
+++ b/src/data/videos/dns-explained.md
@@ -4,10 +4,7 @@ description: 'Learn what the DNS is and how a website is found on the internet.'
duration: '5 minutes'
isNew: false
date: 2020-08-17
-author:
- name: 'Kamran Ahmed'
- url: 'https://twitter.com/kamrify'
- imageUrl: '/authors/kamranahmedse.jpeg'
+authorId: 'kamran'
sitemap:
priority: 0.7
changefreq: 'weekly'
diff --git a/src/data/videos/dns-records.md b/src/data/videos/dns-records.md
index 9f8aeaea3..3aa4cb4a9 100644
--- a/src/data/videos/dns-records.md
+++ b/src/data/videos/dns-records.md
@@ -4,10 +4,7 @@ description: 'Learn what the DNS is and how a website is found on the internet.'
duration: '6 minutes'
isNew: false
date: 2020-08-31
-author:
- name: 'Kamran Ahmed'
- url: 'https://twitter.com/kamrify'
- imageUrl: '/authors/kamranahmedse.jpeg'
+authorId: 'kamran'
sitemap:
priority: 0.7
changefreq: 'weekly'
diff --git a/src/data/videos/floating-point-arithmetic.md b/src/data/videos/floating-point-arithmetic.md
index 2aab972f1..d5e3601c4 100644
--- a/src/data/videos/floating-point-arithmetic.md
+++ b/src/data/videos/floating-point-arithmetic.md
@@ -4,10 +4,7 @@ description: 'Learn how ow the arithmetic operations work on floating-point numb
duration: '4 minutes'
isNew: false
date: 2021-10-10
-author:
- name: 'Kamran Ahmed'
- url: 'https://twitter.com/kamrify'
- imageUrl: '/authors/kamranahmedse.jpeg'
+authorId: 'kamran'
sitemap:
priority: 0.7
changefreq: 'weekly'
diff --git a/src/data/videos/freeze-and-seal-objects-in-javascript.md b/src/data/videos/freeze-and-seal-objects-in-javascript.md
index 397064de3..81d100cfe 100644
--- a/src/data/videos/freeze-and-seal-objects-in-javascript.md
+++ b/src/data/videos/freeze-and-seal-objects-in-javascript.md
@@ -4,10 +4,7 @@ description: 'Learn what is object freeze and seal in JavaScript and how to use
duration: '6 minutes'
isNew: false
date: 2020-10-16
-author:
- name: 'Kamran Ahmed'
- url: 'https://twitter.com/kamrify'
- imageUrl: '/authors/kamranahmedse.jpeg'
+authorId: 'kamran'
sitemap:
priority: 0.7
changefreq: 'weekly'
diff --git a/src/data/videos/graph-data-structure.md b/src/data/videos/graph-data-structure.md
index 571b235c8..71cd08360 100644
--- a/src/data/videos/graph-data-structure.md
+++ b/src/data/videos/graph-data-structure.md
@@ -4,10 +4,7 @@ description: 'Learn everything you need to know about the graph data structure'
duration: '13 minutes'
isNew: false
date: 2022-09-08
-author:
- name: 'Kamran Ahmed'
- url: 'https://twitter.com/kamrify'
- imageUrl: '/authors/kamranahmedse.jpeg'
+authorId: 'kamran'
sitemap:
priority: 0.7
changefreq: 'weekly'
diff --git a/src/data/videos/hash-table-data-structure.md b/src/data/videos/hash-table-data-structure.md
index 3b8547a43..6d590206c 100644
--- a/src/data/videos/hash-table-data-structure.md
+++ b/src/data/videos/hash-table-data-structure.md
@@ -4,10 +4,7 @@ description: 'Learn everything you need to know about the hash table data struct
duration: '8 minutes'
isNew: false
date: 2022-02-21
-author:
- name: 'Kamran Ahmed'
- url: 'https://twitter.com/kamrify'
- imageUrl: '/authors/kamranahmedse.jpeg'
+authorId: 'kamran'
sitemap:
priority: 0.7
changefreq: 'weekly'
diff --git a/src/data/videos/heap-data-structure.md b/src/data/videos/heap-data-structure.md
index e78066ad7..67467adba 100644
--- a/src/data/videos/heap-data-structure.md
+++ b/src/data/videos/heap-data-structure.md
@@ -4,10 +4,7 @@ description: 'Learn everything you need to know about the heap data structure'
duration: '11 minutes'
isNew: false
date: 2022-08-24
-author:
- name: 'Kamran Ahmed'
- url: 'https://twitter.com/kamrify'
- imageUrl: '/authors/kamranahmedse.jpeg'
+authorId: 'kamran'
sitemap:
priority: 0.7
changefreq: 'weekly'
diff --git a/src/data/videos/how-to-use-css-variables.md b/src/data/videos/how-to-use-css-variables.md
index e45ae8ef4..897c1ef0a 100644
--- a/src/data/videos/how-to-use-css-variables.md
+++ b/src/data/videos/how-to-use-css-variables.md
@@ -4,10 +4,7 @@ description: 'Learn how to write scalable CSS using CSS Variables.'
duration: '5 minutes'
isNew: false
date: 2020-07-03
-author:
- name: 'Kamran Ahmed'
- url: 'https://twitter.com/kamrify'
- imageUrl: '/authors/kamranahmedse.jpeg'
+authorId: 'kamran'
sitemap:
priority: 0.7
changefreq: 'weekly'
diff --git a/src/data/videos/how-to-use-github-actions.md b/src/data/videos/how-to-use-github-actions.md
index aac637de6..96ff1c68a 100644
--- a/src/data/videos/how-to-use-github-actions.md
+++ b/src/data/videos/how-to-use-github-actions.md
@@ -4,10 +4,7 @@ description: 'Learn how to implement CI/CD with GitHub Actions'
duration: '6 minutes'
isNew: false
date: 2020-07-13
-author:
- name: 'Kamran Ahmed'
- url: 'https://twitter.com/kamrify'
- imageUrl: '/authors/kamranahmedse.jpeg'
+authorId: 'kamran'
sitemap:
priority: 0.7
changefreq: 'weekly'
diff --git a/src/data/videos/javascript-fetch-api.md b/src/data/videos/javascript-fetch-api.md
index 92a548e80..1fdc57398 100644
--- a/src/data/videos/javascript-fetch-api.md
+++ b/src/data/videos/javascript-fetch-api.md
@@ -4,10 +4,7 @@ description: "Learn how to use JavaScript's Fetch API to interact with remote AP
duration: '3 minutes'
isNew: false
date: 2020-08-02
-author:
- name: 'Kamran Ahmed'
- url: 'https://twitter.com/kamrify'
- imageUrl: '/authors/kamranahmedse.jpeg'
+authorId: 'kamran'
sitemap:
priority: 0.7
changefreq: 'weekly'
diff --git a/src/data/videos/linked-list-data-structure.md b/src/data/videos/linked-list-data-structure.md
index a6284ff62..86b282c3d 100644
--- a/src/data/videos/linked-list-data-structure.md
+++ b/src/data/videos/linked-list-data-structure.md
@@ -4,10 +4,7 @@ description: 'Learn everything you need to know about linked list data structure
duration: '11 minutes'
isNew: false
date: 2022-01-31
-author:
- name: 'Kamran Ahmed'
- url: 'https://twitter.com/kamrify'
- imageUrl: '/authors/kamranahmedse.jpeg'
+authorId: 'kamran'
sitemap:
priority: 0.7
changefreq: 'weekly'
diff --git a/src/data/videos/load-balancers-101.md b/src/data/videos/load-balancers-101.md
index 171064787..d9a54b6da 100644
--- a/src/data/videos/load-balancers-101.md
+++ b/src/data/videos/load-balancers-101.md
@@ -4,10 +4,7 @@ description: 'Learn the basics of load balancers, types and different algorithms
duration: '9 minutes'
isNew: false
date: 2020-09-18
-author:
- name: 'Kamran Ahmed'
- url: 'https://twitter.com/kamrify'
- imageUrl: '/authors/kamranahmedse.jpeg'
+authorId: 'kamran'
sitemap:
priority: 0.7
changefreq: 'weekly'
diff --git a/src/data/videos/osi-model.md b/src/data/videos/osi-model.md
index a2fce9cb6..7ae8a3b85 100644
--- a/src/data/videos/osi-model.md
+++ b/src/data/videos/osi-model.md
@@ -4,10 +4,7 @@ description: 'Learn what is OSI Model and the different layers involved.'
duration: '7 minutes'
isNew: false
date: 2020-10-24
-author:
- name: 'Kamran Ahmed'
- url: 'https://twitter.com/kamrify'
- imageUrl: '/authors/kamranahmedse.jpeg'
+authorId: 'kamran'
sitemap:
priority: 0.7
changefreq: 'weekly'
diff --git a/src/data/videos/practical-intro-to-react.md b/src/data/videos/practical-intro-to-react.md
index 6c61c3485..d84b194dd 100644
--- a/src/data/videos/practical-intro-to-react.md
+++ b/src/data/videos/practical-intro-to-react.md
@@ -4,10 +4,7 @@ description: 'Learn how to create a React Application with practical example.'
duration: '40 minutes'
isNew: false
date: 2020-07-09
-author:
- name: 'Kamran Ahmed'
- url: 'https://twitter.com/kamrify'
- imageUrl: '/authors/kamranahmedse.jpeg'
+authorId: 'kamran'
sitemap:
priority: 0.7
changefreq: 'weekly'
diff --git a/src/data/videos/promises-in-javascript.md b/src/data/videos/promises-in-javascript.md
index 2a2bcca18..9b64540c6 100644
--- a/src/data/videos/promises-in-javascript.md
+++ b/src/data/videos/promises-in-javascript.md
@@ -4,10 +4,7 @@ description: 'Learn how to write asynchronous code in JavaScript using promises.
duration: '8 minutes'
isNew: false
date: 2020-07-20
-author:
- name: 'Kamran Ahmed'
- url: 'https://twitter.com/kamrify'
- imageUrl: '/authors/kamranahmedse.jpeg'
+authorId: 'kamran'
sitemap:
priority: 0.7
changefreq: 'weekly'
diff --git a/src/data/videos/queue-data-structure.md b/src/data/videos/queue-data-structure.md
index 7d7460aa2..0ad33608a 100644
--- a/src/data/videos/queue-data-structure.md
+++ b/src/data/videos/queue-data-structure.md
@@ -4,10 +4,7 @@ description: 'Learn everything you need to know about the queue data structure'
duration: '4 minutes'
isNew: false
date: 2022-02-14
-author:
- name: 'Kamran Ahmed'
- url: 'https://twitter.com/kamrify'
- imageUrl: '/authors/kamranahmedse.jpeg'
+authorId: 'kamran'
sitemap:
priority: 0.7
changefreq: 'weekly'
diff --git a/src/data/videos/random-number-generators.md b/src/data/videos/random-number-generators.md
index e680cf50f..cce5d9f99 100644
--- a/src/data/videos/random-number-generators.md
+++ b/src/data/videos/random-number-generators.md
@@ -4,10 +4,7 @@ description: 'How do random number generators work?'
duration: '8 minutes'
isNew: false
date: 2021-11-03
-author:
- name: 'Kamran Ahmed'
- url: 'https://twitter.com/kamrify'
- imageUrl: '/authors/kamranahmedse.jpeg'
+authorId: 'kamran'
sitemap:
priority: 0.7
changefreq: 'weekly'
diff --git a/src/data/videos/scaling-the-unscalable.md b/src/data/videos/scaling-the-unscalable.md
index 31705439b..8fff50164 100644
--- a/src/data/videos/scaling-the-unscalable.md
+++ b/src/data/videos/scaling-the-unscalable.md
@@ -4,10 +4,7 @@ description: 'Learn the basics of System Design and understand how to build a sc
duration: '10 minutes'
isNew: false
date: 2020-07-26
-author:
- name: 'Kamran Ahmed'
- url: 'https://twitter.com/kamrify'
- imageUrl: '/authors/kamranahmedse.jpeg'
+authorId: 'kamran'
sitemap:
priority: 0.7
changefreq: 'weekly'
diff --git a/src/data/videos/session-based-authentication.md b/src/data/videos/session-based-authentication.md
index 12838e055..318b0a2f9 100644
--- a/src/data/videos/session-based-authentication.md
+++ b/src/data/videos/session-based-authentication.md
@@ -4,10 +4,7 @@ description: 'Learn everything you need to know about session authentication'
duration: '2 minutes'
isNew: false
date: 2022-11-02
-author:
- name: 'Kamran Ahmed'
- url: 'https://twitter.com/kamrify'
- imageUrl: '/authors/kamranahmedse.jpeg'
+authorId: 'kamran'
sitemap:
priority: 0.7
changefreq: 'weekly'
diff --git a/src/data/videos/ssh-ssl-tls.md b/src/data/videos/ssh-ssl-tls.md
index 9968a953c..12af0ffbc 100644
--- a/src/data/videos/ssh-ssl-tls.md
+++ b/src/data/videos/ssh-ssl-tls.md
@@ -4,10 +4,7 @@ description: 'Learn the difference between SSH, TLS and SSL'
duration: '3 minutes'
isNew: false
date: 2021-11-25
-author:
- name: 'Kamran Ahmed'
- url: 'https://twitter.com/kamrify'
- imageUrl: '/authors/kamranahmedse.jpeg'
+authorId: 'kamran'
sitemap:
priority: 0.7
changefreq: 'weekly'
diff --git a/src/data/videos/stack-data-structure.md b/src/data/videos/stack-data-structure.md
index 5b07d9483..c0114692f 100644
--- a/src/data/videos/stack-data-structure.md
+++ b/src/data/videos/stack-data-structure.md
@@ -4,10 +4,7 @@ description: 'Learn everything you need to know about the stack data structure'
duration: '5 minutes'
isNew: false
date: 2022-02-07
-author:
- name: 'Kamran Ahmed'
- url: 'https://twitter.com/kamrify'
- imageUrl: '/authors/kamranahmedse.jpeg'
+authorId: 'kamran'
sitemap:
priority: 0.7
changefreq: 'weekly'
diff --git a/src/data/videos/system-design-101.md b/src/data/videos/system-design-101.md
index 34483b9ac..90a1bf317 100644
--- a/src/data/videos/system-design-101.md
+++ b/src/data/videos/system-design-101.md
@@ -4,10 +4,7 @@ description: 'Learn about all the bits and pieces of system design.'
duration: '7 minutes'
isNew: false
date: 2020-08-08
-author:
- name: 'Kamran Ahmed'
- url: 'https://twitter.com/kamrify'
- imageUrl: '/authors/kamranahmedse.jpeg'
+authorId: 'kamran'
sitemap:
priority: 0.7
changefreq: 'weekly'
diff --git a/src/data/videos/tcp-ip-model.md b/src/data/videos/tcp-ip-model.md
index 08dd9a210..341fde8b1 100644
--- a/src/data/videos/tcp-ip-model.md
+++ b/src/data/videos/tcp-ip-model.md
@@ -4,10 +4,7 @@ description: 'Learn what is TCP/IP Model and the different layers involved.'
duration: '5 minutes'
isNew: false
date: 2020-11-06
-author:
- name: 'Kamran Ahmed'
- url: 'https://twitter.com/kamrify'
- imageUrl: '/authors/kamranahmedse.jpeg'
+authorId: 'kamran'
sitemap:
priority: 0.7
changefreq: 'weekly'
diff --git a/src/data/videos/transport-protocols-tcp-vs-udp.md b/src/data/videos/transport-protocols-tcp-vs-udp.md
index 928e408b1..53c6ea6e2 100644
--- a/src/data/videos/transport-protocols-tcp-vs-udp.md
+++ b/src/data/videos/transport-protocols-tcp-vs-udp.md
@@ -4,10 +4,7 @@ description: 'Learn about the Transport Layer of the TCP/IP model and different
duration: '10 minutes'
isNew: false
date: 2020-11-21
-author:
- name: 'Kamran Ahmed'
- url: 'https://twitter.com/kamrify'
- imageUrl: '/authors/kamranahmedse.jpeg'
+authorId: 'kamran'
sitemap:
priority: 0.7
changefreq: 'weekly'
diff --git a/src/data/videos/tree-data-structure.md b/src/data/videos/tree-data-structure.md
index 93e39d340..01ed0018e 100644
--- a/src/data/videos/tree-data-structure.md
+++ b/src/data/videos/tree-data-structure.md
@@ -4,10 +4,7 @@ description: 'Learn everything you need to know about the tree data structure'
duration: '8 minutes'
isNew: false
date: 2022-08-11
-author:
- name: 'Kamran Ahmed'
- url: 'https://twitter.com/kamrify'
- imageUrl: '/authors/kamranahmedse.jpeg'
+authorId: 'kamran'
sitemap:
priority: 0.7
changefreq: 'weekly'
diff --git a/src/data/videos/what-are-data-structures.md b/src/data/videos/what-are-data-structures.md
index 10b68816f..54bdffd0b 100644
--- a/src/data/videos/what-are-data-structures.md
+++ b/src/data/videos/what-are-data-structures.md
@@ -4,10 +4,7 @@ description: 'Learn about the different data structures in this illustrated seri
duration: '1 minute'
isNew: false
date: 2021-12-12
-author:
- name: 'Kamran Ahmed'
- url: 'https://twitter.com/kamrify'
- imageUrl: '/authors/kamranahmedse.jpeg'
+authorId: 'kamran'
sitemap:
priority: 0.7
changefreq: 'weekly'
diff --git a/src/data/videos/what-is-cap-theorem.md b/src/data/videos/what-is-cap-theorem.md
index da9966cf0..84693bb42 100644
--- a/src/data/videos/what-is-cap-theorem.md
+++ b/src/data/videos/what-is-cap-theorem.md
@@ -4,10 +4,7 @@ description: 'An illustrated explanation to CAP theorem with examples and proof.
duration: '8 minutes'
isNew: false
date: 2021-10-05
-author:
- name: 'Kamran Ahmed'
- url: 'https://twitter.com/kamrify'
- imageUrl: '/authors/kamranahmedse.jpeg'
+authorId: 'kamran'
sitemap:
priority: 0.7
changefreq: 'weekly'
diff --git a/src/data/videos/what-is-dependency-injection.md b/src/data/videos/what-is-dependency-injection.md
index d5c0a764a..2eb60772e 100644
--- a/src/data/videos/what-is-dependency-injection.md
+++ b/src/data/videos/what-is-dependency-injection.md
@@ -4,10 +4,7 @@ description: 'Learn what is dependency injection and how to write better code wi
duration: '3 minutes'
isNew: false
date: 2020-07-04
-author:
- name: 'Kamran Ahmed'
- url: 'https://twitter.com/kamrify'
- imageUrl: '/authors/kamranahmedse.jpeg'
+authorId: 'kamran'
sitemap:
priority: 0.7
changefreq: 'weekly'
diff --git a/src/data/videos/what-is-dom-shadow-dom-virtual-dom.md b/src/data/videos/what-is-dom-shadow-dom-virtual-dom.md
index b669eca20..6aade4a57 100644
--- a/src/data/videos/what-is-dom-shadow-dom-virtual-dom.md
+++ b/src/data/videos/what-is-dom-shadow-dom-virtual-dom.md
@@ -4,10 +4,7 @@ description: 'Learn what is DOM, Shadow DOM and Virtual DOM and how they work.'
duration: '6 minutes'
isNew: false
date: 2020-07-20
-author:
- name: 'Kamran Ahmed'
- url: 'https://twitter.com/kamrify'
- imageUrl: '/authors/kamranahmedse.jpeg'
+authorId: 'kamran'
sitemap:
priority: 0.7
changefreq: 'weekly'
diff --git a/src/data/videos/what-is-eventual-consistency.md b/src/data/videos/what-is-eventual-consistency.md
index 6cb9df11e..78ef37a77 100644
--- a/src/data/videos/what-is-eventual-consistency.md
+++ b/src/data/videos/what-is-eventual-consistency.md
@@ -4,10 +4,7 @@ description: 'Learn about the different consistency models in distributed system
duration: '5 minutes'
isNew: false
date: 2021-11-30
-author:
- name: 'Kamran Ahmed'
- url: 'https://twitter.com/kamrify'
- imageUrl: '/authors/kamranahmedse.jpeg'
+authorId: 'kamran'
sitemap:
priority: 0.7
changefreq: 'weekly'
diff --git a/src/data/videos/yaml-in-depth.md b/src/data/videos/yaml-in-depth.md
index 9967ffde6..6fc6e4a54 100644
--- a/src/data/videos/yaml-in-depth.md
+++ b/src/data/videos/yaml-in-depth.md
@@ -4,10 +4,7 @@ description: 'Everything you need to know about YAML'
duration: '8 minutes'
isNew: false
date: 2021-10-18
-author:
- name: 'Kamran Ahmed'
- url: 'https://twitter.com/kamrify'
- imageUrl: '/authors/kamranahmedse.jpeg'
+authorId: 'kamran'
sitemap:
priority: 0.7
changefreq: 'weekly'
diff --git a/src/env.d.ts b/src/env.d.ts
index 2cc9d6465..d52cd1cc6 100644
--- a/src/env.d.ts
+++ b/src/env.d.ts
@@ -1,5 +1,5 @@
+///
///
-import 'astro/client';
interface ImportMetaEnv {
GITHUB_SHA: string;
diff --git a/src/helper/download-image.ts b/src/helper/download-image.ts
index 193128cea..db598a49d 100644
--- a/src/helper/download-image.ts
+++ b/src/helper/download-image.ts
@@ -34,3 +34,35 @@ export async function downloadImage({
alert('Error downloading image');
}
}
+
+export async function downloadGeneratedRoadmapImage(
+ name: string,
+ node: HTMLElement,
+) {
+ // Append a watermark to the bottom right of the image
+ const watermark = document.createElement('div');
+ watermark.className = 'flex justify-end absolute top-4 right-4 gap-2';
+ watermark.innerHTML = `
+
+ roadmap.sh
+
+ `;
+ node.insertAdjacentElement('afterbegin', watermark);
+
+ const domtoimage = (await import('dom-to-image')).default;
+ if (!domtoimage) {
+ throw new Error('Unable to download image');
+ }
+
+ const dataUrl = await domtoimage.toJpeg(node, {
+ bgcolor: 'white',
+ quality: 1,
+ });
+ node?.removeChild(watermark);
+ const link = document.createElement('a');
+ link.download = `${name}-roadmap.jpg`;
+ link.href = dataUrl;
+ link.click();
+}
diff --git a/src/helper/read-stream.ts b/src/helper/read-stream.ts
new file mode 100644
index 000000000..2df821443
--- /dev/null
+++ b/src/helper/read-stream.ts
@@ -0,0 +1,73 @@
+const NEW_LINE = '\n'.charCodeAt(0);
+
+export async function readAIRoadmapStream(
+ reader: ReadableStreamDefaultReader
,
+ {
+ onStream,
+ onStreamEnd,
+ }: {
+ onStream?: (roadmap: string) => void;
+ onStreamEnd?: (roadmap: string) => void;
+ },
+) {
+ const decoder = new TextDecoder('utf-8');
+ let result = '';
+
+ while (true) {
+ const { value, done } = await reader.read();
+ if (done) {
+ break;
+ }
+
+ // We will call the renderRoadmap callback whenever we encounter
+ // a new line with the result until the new line
+ // otherwise, we will keep appending the result to the previous result
+ if (value) {
+ let start = 0;
+ for (let i = 0; i < value.length; i++) {
+ if (value[i] === NEW_LINE) {
+ result += decoder.decode(value.slice(start, i + 1));
+ onStream?.(result);
+ start = i + 1;
+ }
+ }
+ if (start < value.length) {
+ result += decoder.decode(value.slice(start));
+ }
+ }
+ }
+
+ onStream?.(result);
+ onStreamEnd?.(result);
+ reader.releaseLock();
+}
+
+export async function readAIRoadmapContentStream(
+ reader: ReadableStreamDefaultReader,
+ {
+ onStream,
+ onStreamEnd,
+ }: {
+ onStream?: (roadmap: string) => void;
+ onStreamEnd?: (roadmap: string) => void;
+ },
+) {
+ const decoder = new TextDecoder('utf-8');
+ let result = '';
+
+ while (true) {
+ const { value, done } = await reader.read();
+ if (done) {
+ break;
+ }
+
+ if (value) {
+ result += decoder.decode(value);
+ onStream?.(result);
+ }
+ }
+
+ onStream?.(result);
+ onStreamEnd?.(result);
+ reader.releaseLock();
+}
diff --git a/src/hooks/use-debounce.ts b/src/hooks/use-debounce.ts
new file mode 100644
index 000000000..a4cc0f2d2
--- /dev/null
+++ b/src/hooks/use-debounce.ts
@@ -0,0 +1,17 @@
+import { useEffect, useState } from 'react';
+
+export function useDebounceValue(value: T, delay: number): T {
+ const [debouncedValue, setDebouncedValue] = useState(value);
+
+ useEffect(() => {
+ const handler = setTimeout(() => {
+ setDebouncedValue(value);
+ }, delay);
+
+ return () => {
+ clearTimeout(handler);
+ };
+ }, [value, delay]);
+
+ return debouncedValue;
+}
diff --git a/src/hooks/use-pagination.ts b/src/hooks/use-pagination.ts
new file mode 100644
index 000000000..3df4ff527
--- /dev/null
+++ b/src/hooks/use-pagination.ts
@@ -0,0 +1,36 @@
+import { useMemo } from 'react';
+
+export function usePagination(
+ currentPage: number,
+ totalPages: number,
+ maxPagesToShow: number,
+) {
+ return useMemo(() => {
+ const pages: Array = [];
+ const half = Math.floor(maxPagesToShow / 2);
+ const start = Math.max(1, currentPage - half);
+ const end = Math.min(totalPages, currentPage + half);
+
+ if (start > 1) {
+ pages.push(1);
+ }
+
+ if (start > 2) {
+ pages.push('more');
+ }
+
+ for (let i = start; i <= end; i++) {
+ pages.push(i);
+ }
+
+ if (end < totalPages - 1) {
+ pages.push('more');
+ }
+
+ if (end < totalPages) {
+ pages.push(totalPages);
+ }
+
+ return pages;
+ }, [currentPage, totalPages, maxPagesToShow]);
+}
diff --git a/src/icons/github.svg b/src/icons/github.svg
index 44124c848..020512f58 100644
--- a/src/icons/github.svg
+++ b/src/icons/github.svg
@@ -1 +1 @@
-
+
diff --git a/src/icons/globe.svg b/src/icons/globe.svg
new file mode 100644
index 000000000..9c33da5df
--- /dev/null
+++ b/src/icons/globe.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/icons/linkedin-2.svg b/src/icons/linkedin-2.svg
new file mode 100644
index 000000000..7013c1e4e
--- /dev/null
+++ b/src/icons/linkedin-2.svg
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/src/layouts/BaseLayout.astro b/src/layouts/BaseLayout.astro
index 5baa80f82..03518e347 100644
--- a/src/layouts/BaseLayout.astro
+++ b/src/layouts/BaseLayout.astro
@@ -145,11 +145,14 @@ const gaPageIdentifier = Astro.url.pathname
{
jsonLd.length > 0 && (
-
+
)
}
-
+
diff --git a/src/lib/ai.ts b/src/lib/ai.ts
new file mode 100644
index 000000000..6481f0f2c
--- /dev/null
+++ b/src/lib/ai.ts
@@ -0,0 +1 @@
+export const IS_KEY_ONLY_ROADMAP_GENERATION = false;
\ No newline at end of file
diff --git a/src/lib/author.ts b/src/lib/author.ts
new file mode 100644
index 000000000..bc97ce690
--- /dev/null
+++ b/src/lib/author.ts
@@ -0,0 +1,76 @@
+import type { MarkdownFileType } from './file';
+
+export interface AuthorFrontmatter {
+ name: string;
+ imageUrl: string;
+ employment?: {
+ title: string;
+ company: string;
+ };
+ social: {
+ twitter: string;
+ github: string;
+ linkedin: string;
+ website: string;
+ };
+}
+
+export type AuthorFileType = MarkdownFileType & {
+ id: string;
+};
+
+function authorPathToId(filePath: string): string {
+ const fileName = filePath.split('/').pop() || '';
+
+ return fileName.replace('.md', '');
+}
+
+/**
+ * Gets the IDs of all the authors available on the website
+ *
+ * @returns string[] Array of author IDs
+ */
+export async function getAuthorIds() {
+ const authorFiles = import.meta.glob(
+ '/src/data/authors/*.md',
+ {
+ eager: true,
+ },
+ );
+
+ return Object.keys(authorFiles).map(authorPathToId);
+}
+
+export async function getAllAuthors(): Promise {
+ const authorFilesMap: Record =
+ import.meta.glob('/src/data/authors/*.md', {
+ eager: true,
+ });
+
+ const authorFiles = Object.values(authorFilesMap);
+
+ return authorFiles.map((authorFile) => ({
+ ...authorFile,
+ id: authorPathToId(authorFile.file),
+ }));
+}
+
+export async function getAuthorById(id: string): Promise {
+ const authorFilesMap: Record =
+ import.meta.glob('/src/data/authors/*.md', {
+ eager: true,
+ });
+
+ const authorFile = Object.values(authorFilesMap).find((authorFile) => {
+ return authorPathToId(authorFile.file) === id;
+ });
+
+ if (!authorFile) {
+ throw new Error(`Author with ID ${id} not found`);
+ }
+
+ return {
+ ...authorFile,
+ id: authorPathToId(authorFile.file),
+ };
+}
diff --git a/src/lib/best-practice.ts b/src/lib/best-practice.ts
index 7850c3770..d3186aa1e 100644
--- a/src/lib/best-practice.ts
+++ b/src/lib/best-practice.ts
@@ -78,13 +78,32 @@ export async function getAllBestPractices(): Promise {
);
}
+/**
+ * Gets the best practice file by ID
+ *
+ * @param id - Best practice file ID
+ * @returns BestPracticeFileType
+ */
+
export async function getBestPracticeById(
id: string,
-): Promise {
- const bestPracticeFile = await import(
- `../data/best-practices/${id}/${id}.md`
+): Promise {
+ const bestPracticeFilesMap = import.meta.glob(
+ '/src/data/best-practices/*/*.md',
+ {
+ eager: true,
+ },
+ );
+
+ const bestPracticeFiles = Object.values(bestPracticeFilesMap);
+ const bestPracticeFile = bestPracticeFiles.find(
+ (bestPracticeFile) => bestPracticePathToId(bestPracticeFile.file) === id,
);
+ if (!bestPracticeFile) {
+ throw new Error(`Best practice with ID ${id} not found`);
+ }
+
return {
...bestPracticeFile,
id: bestPracticePathToId(bestPracticeFile.file),
diff --git a/src/lib/browser.ts b/src/lib/browser.ts
index b8a3fa4d9..202732226 100644
--- a/src/lib/browser.ts
+++ b/src/lib/browser.ts
@@ -32,11 +32,20 @@ export function setUrlParams(params: Record) {
}
const url = new URL(window.location.href);
+ let hasUpdatedUrl = false;
for (const [key, value] of Object.entries(params)) {
+ if (url.searchParams.get(key) === String(value)) {
+ continue;
+ }
+
url.searchParams.delete(key);
url.searchParams.set(key, value);
+
+ hasUpdatedUrl = true;
}
- window.history.pushState(null, '', url.toString());
+ if (hasUpdatedUrl) {
+ window.history.pushState(null, '', url.toString());
+ }
}
diff --git a/src/lib/date.ts b/src/lib/date.ts
index e9d3ad044..5d34da249 100644
--- a/src/lib/date.ts
+++ b/src/lib/date.ts
@@ -26,6 +26,10 @@ export function getRelativeTimeString(date: string): string {
relativeTime = rtf.format(-diffInDays, 'day');
}
+ if (relativeTime === 'this minute') {
+ return 'just now';
+ }
+
return relativeTime;
}
diff --git a/src/lib/guide.ts b/src/lib/guide.ts
index 8bdfb678d..a8d139e41 100644
--- a/src/lib/guide.ts
+++ b/src/lib/guide.ts
@@ -1,13 +1,10 @@
import type { MarkdownFileType } from './file';
+import { type AuthorFileType, getAllAuthors } from './author.ts';
export interface GuideFrontmatter {
title: string;
description: string;
- author: {
- name: string;
- url: string;
- imageUrl: string;
- };
+ authorId: string;
canonicalUrl?: string;
// alternate path where this guide has been published
excludedBySlug?: string;
@@ -27,6 +24,7 @@ export interface GuideFrontmatter {
export type GuideFileType = MarkdownFileType & {
id: string;
+ author: AuthorFileType;
};
/**
@@ -41,23 +39,33 @@ function guidePathToId(filePath: string): string {
return fileName.replace('.md', '');
}
+export async function getGuidesByAuthor(
+ authorId: string,
+): Promise {
+ const allGuides = await getAllGuides();
+
+ return allGuides.filter((guide) => guide.author?.id === authorId);
+}
+
/**
* Gets all the guides sorted by the publishing date
* @returns Promisifed guide files
*/
export async function getAllGuides(): Promise {
// @ts-ignore
- const guides = await import.meta.glob(
- '/src/data/guides/*.md',
- {
- eager: true,
- },
- );
+ const guides = import.meta.glob('/src/data/guides/*.md', {
+ eager: true,
+ });
+
+ const allAuthors = await getAllAuthors();
const guideFiles = Object.values(guides) as GuideFileType[];
- const enrichedGuides = guideFiles.map((guideFile) => ({
+ const enrichedGuides: GuideFileType[] = guideFiles.map((guideFile) => ({
...guideFile,
id: guidePathToId(guideFile.file),
+ author: allAuthors.find(
+ (author) => author.id === guideFile.frontmatter.authorId,
+ )!,
}));
return enrichedGuides.sort(
@@ -79,3 +87,33 @@ export async function getGuideById(
return allGuides.find((guide) => guide.id === id);
}
+
+type HeadingType = ReturnType[number];
+export type HeadingGroupType = HeadingType & { children: HeadingType[] };
+
+const NUMBERED_LIST_REGEX = /^\d+\.\s+?/;
+
+export function getGuideTableOfContent(headings: HeadingType[]) {
+ const tableOfContents: HeadingGroupType[] = [];
+ let currentGroup: HeadingGroupType | null = null;
+
+ headings
+ .filter((heading) => heading.depth !== 1)
+ .forEach((heading) => {
+ if (heading.depth === 2) {
+ currentGroup = {
+ ...heading,
+ text: heading.text.replace(NUMBERED_LIST_REGEX, ''),
+ children: [],
+ };
+ tableOfContents.push(currentGroup);
+ } else if (currentGroup && heading.depth === 3) {
+ currentGroup.children.push({
+ ...heading,
+ text: heading.text.replace(NUMBERED_LIST_REGEX, ''),
+ });
+ }
+ });
+
+ return tableOfContents;
+}
diff --git a/src/lib/http.ts b/src/lib/http.ts
index f0d7139c2..91fc488cd 100644
--- a/src/lib/http.ts
+++ b/src/lib/http.ts
@@ -1,6 +1,6 @@
import Cookies from 'js-cookie';
import fp from '@fingerprintjs/fingerprintjs';
-import { TOKEN_COOKIE_NAME } from './jwt';
+import { TOKEN_COOKIE_NAME, removeAuthToken } from './jwt';
type HttpOptionsType = RequestInit | { headers: Record };
@@ -30,13 +30,13 @@ type ApiReturn = {
*/
export async function httpCall<
ResponseType = AppResponse,
- ErrorType = AppError
+ ErrorType = AppError,
>(
url: string,
- options?: HttpOptionsType
+ options?: HttpOptionsType,
): Promise> {
try {
- const fingerprintPromise = await fp.load({ monitoring: false });
+ const fingerprintPromise = await fp.load();
const fingerprint = await fingerprintPromise.get();
const response = await fetch(url, {
@@ -65,7 +65,7 @@ export async function httpCall<
// Logout user if token is invalid
if (data.status === 401) {
- Cookies.remove(TOKEN_COOKIE_NAME);
+ removeAuthToken();
window.location.reload();
return { response: undefined, error: data as ErrorType };
}
@@ -92,11 +92,11 @@ export async function httpCall<
export async function httpPost<
ResponseType = AppResponse,
- ErrorType = AppError
+ ErrorType = AppError,
>(
url: string,
body: Record,
- options?: HttpOptionsType
+ options?: HttpOptionsType,
): Promise> {
return httpCall(url, {
...options,
@@ -108,7 +108,7 @@ export async function httpPost<
export async function httpGet(
url: string,
queryParams?: Record,
- options?: HttpOptionsType
+ options?: HttpOptionsType,
): Promise> {
const searchParams = new URLSearchParams(queryParams).toString();
const queryUrl = searchParams ? `${url}?${searchParams}` : url;
@@ -122,11 +122,11 @@ export async function httpGet(
export async function httpPatch<
ResponseType = AppResponse,
- ErrorType = AppError
+ ErrorType = AppError,
>(
url: string,
body: Record,
- options?: HttpOptionsType
+ options?: HttpOptionsType,
): Promise> {
return httpCall(url, {
...options,
@@ -138,7 +138,7 @@ export async function httpPatch<
export async function httpPut(
url: string,
body: Record,
- options?: HttpOptionsType
+ options?: HttpOptionsType,
): Promise> {
return httpCall(url, {
...options,
@@ -149,10 +149,10 @@ export async function httpPut(
export async function httpDelete<
ResponseType = AppResponse,
- ErrorType = AppError
+ ErrorType = AppError,
>(
url: string,
- options?: HttpOptionsType
+ options?: HttpOptionsType,
): Promise> {
return httpCall(url, {
...options,
diff --git a/src/lib/image.ts b/src/lib/image.ts
new file mode 100644
index 000000000..fd211a44d
--- /dev/null
+++ b/src/lib/image.ts
@@ -0,0 +1,12 @@
+import imageSize from 'image-size';
+import { readFile } from 'node:fs/promises';
+
+export async function getLocalImageDimensions(path: string) {
+ try {
+ const imageBuffer = await readFile(path);
+ return imageSize(imageBuffer);
+ } catch (error) {
+ console.error(error, (error as Error)?.stack);
+ return null;
+ }
+}
diff --git a/src/lib/jwt.ts b/src/lib/jwt.ts
index 430774550..fac2e8f59 100644
--- a/src/lib/jwt.ts
+++ b/src/lib/jwt.ts
@@ -31,3 +31,81 @@ export function getUser() {
return decodeToken(token);
}
+
+export function setAuthToken(token: string) {
+ Cookies.set(TOKEN_COOKIE_NAME, token, {
+ path: '/',
+ expires: 30,
+ sameSite: 'lax',
+ secure: true,
+ domain: import.meta.env.DEV ? 'localhost' : '.roadmap.sh',
+ });
+ removeAIReferralCode();
+}
+
+export function removeAuthToken() {
+ Cookies.remove(TOKEN_COOKIE_NAME, {
+ path: '/',
+ domain: import.meta.env.DEV ? 'localhost' : '.roadmap.sh',
+ });
+}
+
+export function visitAIRoadmap(roadmapId: string) {
+ const isAlreadyVisited = Number(Cookies.get(`crv-${roadmapId}`) || 0) === 1;
+ if (isAlreadyVisited) {
+ return;
+ }
+
+ Cookies.set(`crv-${roadmapId}`, '1', {
+ path: '/',
+ expires: 1 / 24, // 1 hour
+ sameSite: 'lax',
+ secure: !import.meta.env.DEV,
+ domain: import.meta.env.DEV ? 'localhost' : '.roadmap.sh',
+ });
+}
+
+export function deleteOpenAIKey() {
+ Cookies.remove('oak', {
+ path: '/',
+ domain: import.meta.env.DEV ? 'localhost' : '.roadmap.sh',
+ });
+}
+
+export function saveOpenAIKey(apiKey: string) {
+ Cookies.set('oak', apiKey, {
+ path: '/',
+ expires: 365,
+ sameSite: 'lax',
+ secure: true,
+ domain: import.meta.env.DEV ? 'localhost' : '.roadmap.sh',
+ });
+}
+
+export function getOpenAIKey() {
+ return Cookies.get('oak');
+}
+
+const AI_REFERRAL_COOKIE_NAME = 'referral_code';
+
+export function setAIReferralCode(code: string) {
+ const alreadyExist = Cookies.get(AI_REFERRAL_COOKIE_NAME);
+ if (alreadyExist) {
+ return;
+ }
+
+ Cookies.set(AI_REFERRAL_COOKIE_NAME, code, {
+ path: '/',
+ expires: 365,
+ sameSite: 'lax',
+ secure: true,
+ domain: import.meta.env.DEV ? 'localhost' : '.roadmap.sh',
+ });
+}
+
+export function removeAIReferralCode() {
+ Cookies.remove(AI_REFERRAL_COOKIE_NAME, {
+ path: '/',
+ domain: import.meta.env.DEV ? 'localhost' : '.roadmap.sh',
+ });
+}
diff --git a/src/lib/markdown.ts b/src/lib/markdown.ts
index 474c08174..b7114f012 100644
--- a/src/lib/markdown.ts
+++ b/src/lib/markdown.ts
@@ -8,6 +8,27 @@ export function markdownToHtml(markdown: string, isInline = true): string {
linkify: true,
});
+ // Solution to open links in new tab in markdown
+ // otherwise default behaviour is to open in same tab
+ //
+ // SOURCE: https://github.com/markdown-it/markdown-it/blob/master/docs/architecture.md#renderer
+ //
+ const defaultRender =
+ md.renderer.rules.link_open ||
+ // @ts-ignore
+ function (tokens, idx, options, env, self) {
+ return self.renderToken(tokens, idx, options);
+ };
+
+ // @ts-ignore
+ md.renderer.rules.link_open = function (tokens, idx, options, env, self) {
+ // Add a new `target` attribute, or replace the value of the existing one.
+ tokens[idx].attrSet('target', '_blank');
+
+ // Pass the token to the default renderer.
+ return defaultRender(tokens, idx, options, env, self);
+ };
+
if (isInline) {
return md.renderInline(markdown);
} else {
diff --git a/src/lib/number.ts b/src/lib/number.ts
new file mode 100644
index 000000000..6527e13c8
--- /dev/null
+++ b/src/lib/number.ts
@@ -0,0 +1,7 @@
+export const formatter = Intl.NumberFormat('en-US', {
+ useGrouping: true,
+});
+
+export function formatCommaNumber(number: number): string {
+ return formatter.format(number);
+}
diff --git a/src/lib/open-graph.ts b/src/lib/open-graph.ts
new file mode 100644
index 000000000..17beff819
--- /dev/null
+++ b/src/lib/open-graph.ts
@@ -0,0 +1,8 @@
+type RoadmapOpenGraphQuery = {
+ group: 'roadmaps' | 'guides' | 'best-practices';
+ resourceId: string;
+};
+
+export function getOpenGraphImageUrl(params: RoadmapOpenGraphQuery) {
+ return `${import.meta.env.DEV ? 'http://localhost:3000' : 'https://roadmap.sh'}/og-images/${params.group}/${params.resourceId}.png`;
+}
diff --git a/src/lib/resource-progress.ts b/src/lib/resource-progress.ts
index ebb10841b..0b32c9236 100644
--- a/src/lib/resource-progress.ts
+++ b/src/lib/resource-progress.ts
@@ -112,11 +112,11 @@ export async function getResourceProgress(
return loadFreshProgress(resourceType, resourceId);
} else {
setResourceProgress(
- resourceType,
- resourceId,
- progress?.done || [],
- progress?.learning || [],
- progress?.skipped || [],
+ resourceType,
+ resourceId,
+ progress?.done || [],
+ progress?.learning || [],
+ progress?.skipped || [],
);
}
@@ -229,6 +229,8 @@ export function topicSelectorAll(
`[data-group-id="check:${topicId}"]`, // Matching "check:XXXX" box of the topic
`[data-node-id="${topicId}"]`, // Matching custom roadmap nodes
`[data-id="${topicId}"]`, // Matching custom roadmap nodes
+ `[data-checklist-checkbox][data-checklist-id="${topicId}"]`, // Matching checklist checkboxes
+ `[data-checklist-label][data-checklist-id="${topicId}"]`, // Matching checklist labels
],
parentElement,
).forEach((element) => {
diff --git a/src/lib/roadmap.ts b/src/lib/roadmap.ts
index ce4b0ba12..b3303c606 100644
--- a/src/lib/roadmap.ts
+++ b/src/lib/roadmap.ts
@@ -60,7 +60,7 @@ function roadmapPathToId(filePath: string): string {
* @returns string[] Array of roadmap IDs
*/
export async function getRoadmapIds() {
- const roadmapFiles = await import.meta.glob(
+ const roadmapFiles = import.meta.glob(
'/src/data/roadmaps/*/*.md',
{
eager: true,
@@ -79,14 +79,14 @@ export async function getRoadmapIds() {
export async function getRoadmapsByTag(
tag: string,
): Promise {
- const roadmapFilesMap = await import.meta.glob(
+ const roadmapFilesMap = import.meta.glob(
'/src/data/roadmaps/*/*.md',
{
eager: true,
},
);
- const roadmapFiles = Object.values(roadmapFilesMap);
+ const roadmapFiles: RoadmapFileType[] = Object.values(roadmapFilesMap);
const filteredRoadmaps = roadmapFiles
.filter((roadmapFile) => roadmapFile.frontmatter.tags.includes(tag))
.map((roadmapFile) => ({
@@ -100,12 +100,10 @@ export async function getRoadmapsByTag(
}
export async function getRoadmapById(id: string): Promise {
- const roadmapFilesMap = await import.meta.glob(
- '/src/data/roadmaps/*/*.md',
- {
+ const roadmapFilesMap: Record =
+ import.meta.glob('/src/data/roadmaps/*/*.md', {
eager: true,
- },
- );
+ });
const roadmapFile = Object.values(roadmapFilesMap).find((roadmapFile) => {
return roadmapPathToId(roadmapFile.file) === id;
diff --git a/src/lib/video.ts b/src/lib/video.ts
index 78c7b8671..d64a3a271 100644
--- a/src/lib/video.ts
+++ b/src/lib/video.ts
@@ -1,13 +1,13 @@
import type { MarkdownFileType } from './file';
+import type { AuthorFileType } from './author.ts';
+import { getAllAuthors } from './author.ts';
+import type {GuideFileType} from "./guide.ts";
+import {getAllGuides} from "./guide.ts";
export interface VideoFrontmatter {
title: string;
description: string;
- author: {
- name: string;
- url: string;
- imageUrl: string;
- };
+ authorId: string;
seo: {
title: string;
description: string;
@@ -17,13 +17,14 @@ export interface VideoFrontmatter {
date: string;
sitemap: {
priority: number;
- changefreq: 'daily' | 'weekly' | 'monthly' | 'yealry';
+ changefreq: 'daily' | 'weekly' | 'monthly' | 'yearly';
};
tags: string[];
}
export type VideoFileType = MarkdownFileType & {
id: string;
+ author: AuthorFileType;
};
/**
@@ -38,22 +39,32 @@ function videoPathToId(filePath: string): string {
return fileName.replace('.md', '');
}
+export async function getVideosByAuthor(
+ authorId: string,
+): Promise {
+ const allVideos = await getAllVideos();
+
+ return allVideos.filter((video) => video.author?.id === authorId);
+}
+
/**
* Gets all the videos sorted by the publishing date
* @returns Promisifed video files
*/
export async function getAllVideos(): Promise {
- const videos = await import.meta.glob(
- '/src/data/videos/*.md',
- {
- eager: true,
- },
- );
+ const videos = import.meta.glob('/src/data/videos/*.md', {
+ eager: true,
+ });
+
+ const allAuthors = await getAllAuthors();
const videoFiles = Object.values(videos);
const enrichedVideos = videoFiles.map((videoFile) => ({
...videoFile,
id: videoPathToId(videoFile.file),
+ author: allAuthors.find(
+ (author) => author.id === videoFile.frontmatter.authorId,
+ )!,
}));
return enrichedVideos.sort(
diff --git a/src/pages/[roadmapId]/index.astro b/src/pages/[roadmapId]/index.astro
index 21e40d499..2a71c2251 100644
--- a/src/pages/[roadmapId]/index.astro
+++ b/src/pages/[roadmapId]/index.astro
@@ -12,6 +12,7 @@ import {
generateArticleSchema,
generateFAQSchema,
} from '../../lib/jsonld-schema';
+import { getOpenGraphImageUrl } from '../../lib/open-graph';
import {
getRoadmapById,
@@ -52,14 +53,20 @@ if (roadmapData.schema) {
if (roadmapFAQs.length) {
jsonLdSchema.push(generateFAQSchema(roadmapFAQs as unknown as FAQType[]));
}
+
+const ogImageUrl =
+ roadmapData?.seo?.ogImageUrl ||
+ getOpenGraphImageUrl({
+ group: 'roadmaps',
+ resourceId: roadmapId,
+ });
---
-
+
diff --git a/src/pages/ai/explore.astro b/src/pages/ai/explore.astro
new file mode 100644
index 000000000..0c5eb0406
--- /dev/null
+++ b/src/pages/ai/explore.astro
@@ -0,0 +1,8 @@
+---
+import { ExploreAIRoadmap } from '../../components/ExploreAIRoadmap/ExploreAIRoadmap';
+import BaseLayout from '../../layouts/BaseLayout.astro';
+---
+
+
+
+
diff --git a/src/pages/ai/index.astro b/src/pages/ai/index.astro
new file mode 100644
index 000000000..78e003282
--- /dev/null
+++ b/src/pages/ai/index.astro
@@ -0,0 +1,8 @@
+---
+import { GenerateRoadmap } from '../../components/GenerateRoadmap/GenerateRoadmap';
+import BaseLayout from '../../layouts/BaseLayout.astro';
+---
+
+
+
+
diff --git a/src/pages/authors/[authorId].astro b/src/pages/authors/[authorId].astro
new file mode 100644
index 000000000..1731ec9da
--- /dev/null
+++ b/src/pages/authors/[authorId].astro
@@ -0,0 +1,136 @@
+---
+import BaseLayout from '../../layouts/BaseLayout.astro';
+import AstroIcon from '../../components/AstroIcon.astro';
+import { getGuidesByAuthor } from '../../lib/guide';
+import { getAllVideos, getVideosByAuthor } from '../../lib/video';
+import GuideListItem from '../../components/GuideListItem.astro';
+import { getAuthorById, getAuthorIds } from '../../lib/author';
+import VideoListItem from '../../components/VideoListItem.astro';
+
+interface Params extends Record {}
+
+export async function getStaticPaths() {
+ const authorIds = await getAuthorIds();
+
+ return authorIds.map((authorId) => ({
+ params: { authorId },
+ }));
+}
+
+const { authorId } = Astro.params;
+
+const author = await getAuthorById(authorId);
+const authorFrontmatter = author.frontmatter;
+
+const guides = await getGuidesByAuthor(authorId);
+const videos = await getVideosByAuthor(authorId);
+---
+
+
+
+
+
+
+
+ {authorFrontmatter.name}
+
+
+
+
+
+ {
+ authorFrontmatter.social?.github && (
+
+
+
+ )
+ }
+ {
+ authorFrontmatter.social.twitter && (
+
+
+
+ )
+ }
+ {
+ authorFrontmatter.social.linkedin && (
+
+
+
+ )
+ }
+ {
+ authorFrontmatter.social.website && (
+
+
+
+ )
+ }
+
+
+
+
+
+
+
+
+
+ {guides.map((guide) => )}
+ {videos.map((video) => )}
+
+
+
diff --git a/src/pages/authors/[authorId].json.ts b/src/pages/authors/[authorId].json.ts
new file mode 100644
index 000000000..4193292f7
--- /dev/null
+++ b/src/pages/authors/[authorId].json.ts
@@ -0,0 +1,28 @@
+import type { APIRoute } from 'astro';
+import { getAuthorById, getAuthorIds } from '../../lib/author';
+
+export async function getStaticPaths() {
+ const authorIds = await getAuthorIds();
+
+ return await Promise.all(
+ authorIds.map(async (authorId) => {
+ const authorDetails = await getAuthorById(authorId);
+
+ return {
+ params: { authorId },
+ props: {
+ authorDetails: authorDetails?.frontmatter || {},
+ },
+ };
+ }),
+ );
+}
+
+export const GET: APIRoute = async function ({ params, request, props }) {
+ return new Response(JSON.stringify(props.authorDetails), {
+ status: 200,
+ headers: {
+ 'Content-Type': 'application/json',
+ },
+ });
+};
diff --git a/src/pages/backend/developer-skills.astro b/src/pages/backend/developer-skills.astro
new file mode 100644
index 000000000..a2f23f6c5
--- /dev/null
+++ b/src/pages/backend/developer-skills.astro
@@ -0,0 +1,28 @@
+---
+import GuideContent from '../../components/Guide/GuideContent.astro';
+import GuideHeader from '../../components/GuideHeader.astro';
+import BaseLayout from '../../layouts/BaseLayout.astro';
+import { getGuideById } from '../../lib/guide';
+import { getOpenGraphImageUrl } from '../../lib/open-graph';
+
+const guideId = 'backend-developer-skills';
+const guide = await getGuideById(guideId);
+
+const { frontmatter: guideData } = guide!;
+
+const ogImageUrl = getOpenGraphImageUrl({
+ group: 'guides',
+ resourceId: guideId,
+});
+---
+
+
+
+
+
diff --git a/src/pages/backend/developer-tools.astro b/src/pages/backend/developer-tools.astro
new file mode 100644
index 000000000..f99c2392d
--- /dev/null
+++ b/src/pages/backend/developer-tools.astro
@@ -0,0 +1,28 @@
+---
+import GuideContent from '../../components/Guide/GuideContent.astro';
+import GuideHeader from '../../components/GuideHeader.astro';
+import BaseLayout from '../../layouts/BaseLayout.astro';
+import { getGuideById } from '../../lib/guide';
+import { getOpenGraphImageUrl } from '../../lib/open-graph';
+
+const guideId = 'backend-developer-tools';
+const guide = await getGuideById(guideId);
+
+const { frontmatter: guideData } = guide!;
+
+const ogImageUrl = getOpenGraphImageUrl({
+ group: 'guides',
+ resourceId: guideId,
+});
+---
+
+
+
+
+
diff --git a/src/pages/backend/languages.astro b/src/pages/backend/languages.astro
index aa07fc413..11746690f 100644
--- a/src/pages/backend/languages.astro
+++ b/src/pages/backend/languages.astro
@@ -1,8 +1,9 @@
---
+import GuideContent from '../../components/Guide/GuideContent.astro';
import GuideHeader from '../../components/GuideHeader.astro';
-import MarkdownFile from '../../components/MarkdownFile.astro';
import BaseLayout from '../../layouts/BaseLayout.astro';
import { getGuideById } from '../../lib/guide';
+import { getOpenGraphImageUrl } from '../../lib/open-graph';
const guideId = 'backend-languages';
const guide = await getGuideById(guideId).catch(() => null);
@@ -10,20 +11,21 @@ if (!guide) {
return Astro.redirect('/404');
}
-const { frontmatter: guideData } = guide;
+const { frontmatter: guideData } = guide!;
+
+const ogImageUrl = getOpenGraphImageUrl({
+ group: 'guides',
+ resourceId: guideId,
+});
---
-
-
-
-
-
-
-
+
+
diff --git a/src/pages/best-practices/[bestPracticeId]/index.astro b/src/pages/best-practices/[bestPracticeId]/index.astro
index 2405ac5f5..71f482bac 100644
--- a/src/pages/best-practices/[bestPracticeId]/index.astro
+++ b/src/pages/best-practices/[bestPracticeId]/index.astro
@@ -13,6 +13,7 @@ import {
getBestPracticeById,
} from '../../../lib/best-practice';
import { generateArticleSchema } from '../../../lib/jsonld-schema';
+import { getOpenGraphImageUrl } from '../../../lib/open-graph';
interface Params extends Record {
bestPracticeId: string;
@@ -48,12 +49,18 @@ if (bestPracticeData.schema) {
}),
);
}
+
+const ogImageUrl = getOpenGraphImageUrl({
+ group: 'best-practices',
+ resourceId: bestPracticeId,
+});
---
+
+
{
guideId: string;
@@ -18,6 +19,11 @@ if (!guide) {
}
const { frontmatter: guideData } = guide;
+
+const ogImageUrl = getOpenGraphImageUrl({
+ group: 'guides',
+ resourceId: guideId,
+});
---
-
-
-
-
-
-
+
diff --git a/src/pages/pages.json.ts b/src/pages/pages.json.ts
index a819ca2b6..90288d7e3 100644
--- a/src/pages/pages.json.ts
+++ b/src/pages/pages.json.ts
@@ -17,6 +17,7 @@ export async function GET() {
id: roadmap.id,
url: `/${roadmap.id}`,
title: roadmap.frontmatter.briefTitle,
+ description: roadmap.frontmatter.briefDescription,
group: 'Roadmaps',
metadata: {
tags: roadmap.frontmatter.tags,
@@ -26,6 +27,7 @@ export async function GET() {
id: bestPractice.id,
url: `/best-practices/${bestPractice.id}`,
title: bestPractice.frontmatter.briefTitle,
+ description: bestPractice.frontmatter.briefDescription,
group: 'Best Practices',
})),
...questionGroups.map((questionGroup) => ({
@@ -40,12 +42,14 @@ export async function GET() {
? guide.frontmatter.excludedBySlug
: `/guides/${guide.id}`,
title: guide.frontmatter.title,
+ description: guide.frontmatter.description,
+ authorId: guide.frontmatter.authorId,
group: 'Guides',
})),
- ...videos.map((guide) => ({
- id: guide.id,
- url: `/videos/${guide.id}`,
- title: guide.frontmatter.title,
+ ...videos.map((video) => ({
+ id: video.id,
+ url: `/videos/${video.id}`,
+ title: video.frontmatter.title,
group: 'Videos',
})),
]),
diff --git a/src/pages/r/index.astro b/src/pages/r/index.astro
index fae5dde79..4d719a237 100644
--- a/src/pages/r/index.astro
+++ b/src/pages/r/index.astro
@@ -6,7 +6,7 @@ import Loader from '../../components/Loader.astro';
import ProgressHelpPopup from '../../components/ProgressHelpPopup.astro';
---
-
+
diff --git a/src/pages/roadmaps.astro b/src/pages/roadmaps.astro
index 507f4a867..7d9df0145 100644
--- a/src/pages/roadmaps.astro
+++ b/src/pages/roadmaps.astro
@@ -1,11 +1,10 @@
---
+import { RoadmapsPage } from '../components/Roadmaps/RoadmapsPage';
+import { RoadmapsPageHeader } from '../components/Roadmaps/RoadmapsPageHeader';
import GridItem from '../components/GridItem.astro';
import SimplePageHeader from '../components/SimplePageHeader.astro';
import BaseLayout from '../layouts/BaseLayout.astro';
import { getRoadmapsByTag } from '../lib/roadmap';
-
-const roleRoadmaps = await getRoadmapsByTag('role-roadmap');
-const skillRoadmaps = await getRoadmapsByTag('skill-roadmap');
---
-
-
-
-
-
- {
- roleRoadmaps.map((roleRoadmap) => (
-
- ))
- }
-
- {
- skillRoadmaps.map((skillRoadmap) => (
-
- ))
- }
-
-
-
+
+
diff --git a/src/pages/verify-email.astro b/src/pages/verify-email.astro
new file mode 100644
index 000000000..17cf70a35
--- /dev/null
+++ b/src/pages/verify-email.astro
@@ -0,0 +1,10 @@
+---
+import AccountLayout from '../layouts/AccountLayout.astro';
+import { TriggerVerifyEmail } from '../components/AuthenticationFlow/TriggerVerifyEmail';
+---
+
+
+
+
+
+