Merge branch 'kamranahmedse:master' into master

pull/1931/head
Aroyan 2 years ago committed by GitHub
commit 4b57977cc9
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
  1. 2
      .github/workflows/deploy.yml
  2. 95
      components/custom-ad.tsx
  3. 3
      components/footer.tsx
  4. 6
      components/home/featured-roadmaps-list.tsx
  5. 3
      components/roadmap/home-roadmap-item.tsx
  6. 1
      content/pages/pdfs.md
  7. 50
      content/roadmaps.json
  8. 6
      content/roadmaps/101-backend/content/101-basic-frontend/102-javascript.md
  9. 14
      content/roadmaps/101-backend/content/118-containerization/101-rkt.md
  10. 10
      content/roadmaps/101-backend/content/118-containerization/102-lxc.md
  11. 39
      content/roadmaps/102-devops/content/102-managing-servers/101-live-in-terminal/105-editors.md
  12. 11
      content/roadmaps/102-devops/content/102-managing-servers/101-live-in-terminal/111-mtr.md
  13. 8
      content/roadmaps/102-devops/content/102-managing-servers/101-live-in-terminal/113-nmap.md
  14. 7
      content/roadmaps/102-devops/content/103-networking-protocols/103-emails/104-dmarc.md
  15. 1
      content/roadmaps/102-devops/content/105-infrastructure-as-code/101-containers.md
  16. 2
      content/roadmaps/106-javascript/content/100-javascript-introduction/101-history-of-javascript.md
  17. 2
      content/roadmaps/106-javascript/content/100-javascript-introduction/103-how-to-run-javascript.md
  18. 2
      content/roadmaps/106-javascript/content/101-javascript-variables/100-variable-declarations/readme.md
  19. 2
      content/roadmaps/106-javascript/content/101-javascript-variables/101-hoisting.md
  20. 2
      content/roadmaps/106-javascript/content/101-javascript-variables/readme.md
  21. 2
      content/roadmaps/106-javascript/content/102-javascript-datatypes/101-object/100-prototype.md
  22. 2
      content/roadmaps/106-javascript/content/104-javascript-data-structures/100-indexed-collections/100-arrays.md
  23. 9
      content/roadmaps/106-javascript/content/104-javascript-data-structures/101-keyed-collections/103-weak-set.md
  24. 2
      content/roadmaps/106-javascript/content/106-javascript-loops-iterations/103-for-statement.md
  25. 13
      content/roadmaps/106-javascript/content/108-javascript-expressions-and-operators/102-arithmetic-operators.md
  26. 16
      content/roadmaps/106-javascript/content/108-javascript-expressions-and-operators/103-bitwise-operators.md
  27. 2
      content/roadmaps/106-javascript/content/109-javascript-functions/105-scope-and-function-stack/100-recursion.md
  28. 2
      content/roadmaps/106-javascript/content/109-javascript-functions/105-scope-and-function-stack/101-lexical-scoping.md
  29. 2
      content/roadmaps/106-javascript/content/109-javascript-functions/105-scope-and-function-stack/102-closures.md
  30. 2
      content/roadmaps/106-javascript/content/111-javascript-this-keyword/readme.md
  31. 2
      content/roadmaps/106-javascript/content/112-javascript-asynchronous-javascript/104-promises/readme.md
  32. 2
      content/roadmaps/106-javascript/content/114-javascript-iterators-and-generators.md
  33. 8
      content/roadmaps/107-nodejs/content/104-nodejs-async-programming/101-event-emitter.md
  34. 8
      content/roadmaps/107-nodejs/content/104-nodejs-async-programming/107-set-immediate.md
  35. 8
      content/roadmaps/107-nodejs/content/107-nodejs-apis/100-http-module.md
  36. 8
      content/roadmaps/109-golang/content/100-go-basics/115-make.md
  37. 7
      content/roadmaps/109-golang/content/100-go-basics/116-structs.md
  38. 5
      content/roadmaps/110-java/content/102-java-build-tools/100-gradle.md
  39. 7
      content/roadmaps/110-java/content/103-java-web-frameworks/102-play-framework.md
  40. 11
      content/roadmaps/110-java/content/107-testing-java-apps/100-mocking.md
  41. 7
      content/roadmaps/110-java/content/107-testing-java-apps/107-jmeter.md
  42. 7
      content/roadmaps/113-qa/content/100-qa-basics/102-testing-approaches/101-gray-box-testing.md
  43. 11
      content/roadmaps/113-qa/content/100-qa-basics/106-project-management/readme.md
  44. 7
      content/roadmaps/113-qa/content/100-qa-basics/107-testing-techniques/100-functional-testing/integration-testing.md
  45. 8
      content/roadmaps/113-qa/content/100-qa-basics/107-testing-techniques/100-functional-testing/regression-testing.md
  46. 8
      content/roadmaps/113-qa/content/100-qa-basics/107-testing-techniques/100-functional-testing/unit-testing.md
  47. 8
      content/roadmaps/113-qa/content/100-qa-basics/107-testing-techniques/101-non-functional-testing/load-testing.md
  48. 6
      content/roadmaps/113-qa/content/103-qa-automated-testing/100-frontend-automation/102-automation-frameworks/selenium.md
  49. 110
      content/roadmaps/114-software-architect/content-paths.json
  50. 8
      content/roadmaps/114-software-architect/content/100-software-architect-basics/100-what-is-software-architecture.md
  51. 3
      content/roadmaps/114-software-architect/content/100-software-architect-basics/101-what-is-software-architect.md
  52. 4
      content/roadmaps/114-software-architect/content/100-software-architect-basics/102-levels-of-architecture/100-application-architecture.md
  53. 3
      content/roadmaps/114-software-architect/content/100-software-architect-basics/102-levels-of-architecture/101-solution-architecture.md
  54. 3
      content/roadmaps/114-software-architect/content/100-software-architect-basics/102-levels-of-architecture/102-enterprise-architecture.md
  55. 8
      content/roadmaps/114-software-architect/content/100-software-architect-basics/102-levels-of-architecture/readme.md
  56. 3
      content/roadmaps/114-software-architect/content/100-software-architect-basics/readme.md
  57. 17
      content/roadmaps/114-software-architect/content/101-architect-responsibilities.md
  58. 11
      content/roadmaps/114-software-architect/content/102-important-skills/100-design-and-architecture.md
  59. 10
      content/roadmaps/114-software-architect/content/102-important-skills/101-decision-making.md
  60. 8
      content/roadmaps/114-software-architect/content/102-important-skills/102-simplifying-things.md
  61. 14
      content/roadmaps/114-software-architect/content/102-important-skills/103-how-to-code.md
  62. 8
      content/roadmaps/114-software-architect/content/102-important-skills/104-documentation.md
  63. 10
      content/roadmaps/114-software-architect/content/102-important-skills/105-communication.md
  64. 8
      content/roadmaps/114-software-architect/content/102-important-skills/106-estimate-and-evaluate.md
  65. 7
      content/roadmaps/114-software-architect/content/102-important-skills/107-balance.md
  66. 7
      content/roadmaps/114-software-architect/content/102-important-skills/108-consult-and-coach.md
  67. 10
      content/roadmaps/114-software-architect/content/102-important-skills/109-marketing-skills.md
  68. 14
      content/roadmaps/114-software-architect/content/102-important-skills/readme.md
  69. 1
      content/roadmaps/114-software-architect/content/103-technical-skills.md
  70. 1
      content/roadmaps/114-software-architect/content/104-programming-languages/100-java-kotlin-scala.md
  71. 17
      content/roadmaps/114-software-architect/content/104-programming-languages/101-python.md
  72. 8
      content/roadmaps/114-software-architect/content/104-programming-languages/102-ruby.md
  73. 17
      content/roadmaps/114-software-architect/content/104-programming-languages/103-go.md
  74. 32
      content/roadmaps/114-software-architect/content/104-programming-languages/104-javascript-typescript.md
  75. 14
      content/roadmaps/114-software-architect/content/104-programming-languages/105-dotnet-framework.md
  76. 1
      content/roadmaps/114-software-architect/content/104-programming-languages/readme.md
  77. 1
      content/roadmaps/114-software-architect/content/105-patterns-and-design-principles/100-oop.md
  78. 1
      content/roadmaps/114-software-architect/content/105-patterns-and-design-principles/101-mvc-mvp-mvvm.md
  79. 1
      content/roadmaps/114-software-architect/content/105-patterns-and-design-principles/102-cqrs-eventual-consistency.md
  80. 1
      content/roadmaps/114-software-architect/content/105-patterns-and-design-principles/103-actors.md
  81. 15
      content/roadmaps/114-software-architect/content/105-patterns-and-design-principles/104-acid-cap-theorem.md
  82. 1
      content/roadmaps/114-software-architect/content/105-patterns-and-design-principles/105-solid.md
  83. 1
      content/roadmaps/114-software-architect/content/105-patterns-and-design-principles/106-ddd.md
  84. 1
      content/roadmaps/114-software-architect/content/105-patterns-and-design-principles/106-tdd.md
  85. 1
      content/roadmaps/114-software-architect/content/105-patterns-and-design-principles/readme.md
  86. 1
      content/roadmaps/114-software-architect/content/106-architect-tools/100-git.md
  87. 1
      content/roadmaps/114-software-architect/content/106-architect-tools/101-slack.md
  88. 1
      content/roadmaps/114-software-architect/content/106-architect-tools/102-trello.md
  89. 1
      content/roadmaps/114-software-architect/content/106-architect-tools/103-atlassian-tools.md
  90. 1
      content/roadmaps/114-software-architect/content/106-architect-tools/readme.md
  91. 1
      content/roadmaps/114-software-architect/content/107-architectures/100-serverless.md
  92. 1
      content/roadmaps/114-software-architect/content/107-architectures/101-microservices.md
  93. 1
      content/roadmaps/114-software-architect/content/107-architectures/102-client-server-architecture.md
  94. 1
      content/roadmaps/114-software-architect/content/107-architectures/103-layered-architecture.md
  95. 1
      content/roadmaps/114-software-architect/content/107-architectures/104-distributed-systems.md
  96. 1
      content/roadmaps/114-software-architect/content/107-architectures/105-service-oriented.md
  97. 1
      content/roadmaps/114-software-architect/content/107-architectures/readme.md
  98. 1
      content/roadmaps/114-software-architect/content/108-security/100-hashing-algorithms.md
  99. 1
      content/roadmaps/114-software-architect/content/108-security/101-pki.md
  100. 1
      content/roadmaps/114-software-architect/content/108-security/102-owasp.md
  101. Some files were not shown because too many files have changed in this diff Show More

@ -17,7 +17,7 @@ jobs:
persist-credentials: false
- uses: actions/setup-node@v1
with:
node-version: 14
node-version: 16
- name: Setup Environment
run: |
npm install

@ -1,37 +1,68 @@
import { Box, Flex, Heading, Image, Link } from '@chakra-ui/react';
import { event } from '../lib/gtag';
function getPageSlug() {
const pathname = (typeof window !== 'undefined' ? window : {} as any)?.location?.pathname || '';
return pathname?.replace(/\//g, '');
}
export const CustomAd = () => {
const slug = getPageSlug();
if (slug !== 'devops') {
return null;
}
return (
<div id='carbonads'>
<span>
<span className='carbon-wrap'>
<a
href='https://freemote.com/strategy?sl=roadmap'
className='carbon-img'
target='_blank'
>
<img
src='/fm-img.png'
alt='Custom Logo'
height='100'
width='130'
style={{ maxWidth: '130px', border: 'none' }}
/>
</a>
<a
href='https://freemote.com/strategy?sl=roadmap'
className='carbon-text'
target='_blank'
>
He Went from ZERO TO $74,000 as a Full Time Developer in 7 Weeks
</a>
</span>
<a
href='https://github.com/sponsors/kamranahmedse'
className='carbon-poweredby'
target='_blank'
<Link
href='https://thenewstack.io/ebooks/devops/cloud-native-devops-2019/?utm_source=Roadmap.sh&utm_medium=Banner&utm_campaign=Roadmap+DevOps+Ebook'
id='custom-ad'
pos='fixed'
bottom='15px'
right='20px'
zIndex={999}
display='flex'
maxWidth='330px'
bg='white'
boxShadow='0 1px 4px 1px hsla(0, 0%, 0%, .1)'
_hover={{ textDecoration: 'none' }}
rel="noopener sponsored"
target={'_blank'}
onClick={() => {
event({
category: 'SponsorClick',
action: `TNS EBook Redirect`,
label: `Clicked TNS EBook Link`
});
}}
>
<Image
src='https://i.imgur.com/fEKq19S.png'
alt='Custom Logo'
height={['100px', '100px', '100px', 'auto']}
width='130'
style={{ maxWidth: '130px', border: 'none' }}
/>
<Flex as='span' flexDirection='column' justifyContent='space-between'>
<Box as='span' p='10px'>
<Heading as='span' fontSize='14px' mb='5px' display='block'>Free DevOps eBook</Heading>
<Box display='block' as='span' fontSize='13px' lineHeight={1.5} fontWeight={500} color='gray.500'>
Learn all about doing DevOps the Cloud Native way with this free ebook from our partner, The New Stack
</Box>
</Box>
<Box as='span'
textAlign='center'
fontWeight={600}
fontSize='9px'
letterSpacing='0.5px'
textTransform='uppercase'
padding='5px 10px'
display={'block'}
background='repeating-linear-gradient(-45deg, transparent, transparent 5px, hsla(0, 0%, 0%, .025) 5px, hsla(0, 0%, 0%, .025) 10px) hsla(203, 11%, 95%, .4)'
>
Sponsored by
</a>
</span>
</div>
Partner Content
</Box>
</Flex>
</Link>
);
};

@ -1,6 +1,7 @@
import { Box, Container, Flex, Image, Link, Stack, Text } from '@chakra-ui/react';
import siteConfig from '../content/site.json';
import { CustomAd } from './custom-ad';
import React from 'react';
function NavigationLinks() {
return (
@ -62,6 +63,8 @@ export function Footer() {
</Text>
</Box>
</Container>
<CustomAd />
</Box>
);
}

@ -8,12 +8,6 @@ type FeaturedRoadmapsListProps = {
};
export const upcomingRoadmaps = [
{
type: 'Role Based',
title: 'Software Architect',
description: 'Roadmap to become a modern Software Architect',
id: 'software-architect'
},
{
type: 'Role Based',
title: 'React Native',

@ -38,6 +38,7 @@ export function HomeRoadmapItem(props: RoadmapGridItemProps) {
return (
<Box
position='relative'
as={Link}
href={url}
_hover={{
@ -76,7 +77,7 @@ export function HomeRoadmapItem(props: RoadmapGridItemProps) {
>
{title}
{ isNew && <Badge colorScheme='yellow' ml='10px'>New</Badge> }
{ isNew && <Badge position='absolute' bottom={0} right={0} colorScheme='yellow' ml='10px'>New</Badge> }
</Heading>
<Text color='gray.200' fontSize={['13px']}>
{subtitle}

@ -9,6 +9,7 @@ Here is the list of PDF links for each of the roadmaps.
* **Backend Roadmap** - [Roadmap Link](https://roadmap.sh/backend) / [PDF Link](https://roadmap.sh/pdfs/backend.pdf)
* **DevOps Roadmap** - [Roadmap Link](https://roadmap.sh/devops) / [PDF Link](https://roadmap.sh/pdfs/devops.pdf)
* **QA Roadmap** - [Roadmap Link](https://roadmap.sh/qa) / [PDF Link](https://roadmap.sh/pdfs/qa.pdf)
* **Software Architect Roadmap** - [Roadmap Link](https://roadmap.sh/software-architect) / [PDF Link](https://roadmap.sh/pdfs/software-architect.pdf)
* **JavaScript Roadmap** - [Roadmap Link](https://roadmap.sh/javascript) / [PDF Link](https://roadmap.sh/pdfs/javascript.pdf)
* **Node.js Roadmap** - [Roadmap Link](https://roadmap.sh/nodejs) / [PDF Link](https://roadmap.sh/pdfs/nodejs.pdf)
* **Angular Roadmap** - [Roadmap Link](https://roadmap.sh/angular) / [PDF Link](https://roadmap.sh/pdfs/angular.pdf)

@ -903,5 +903,55 @@
"id": "qa",
"metaPath": "/roadmaps/113-qa/meta.json",
"isUpcoming": false
},
{
"seo": {
"title": "Software Architect Roadmap: Learn to become a modern Software Architect",
"description": "Community driven, articles, resources, guides, interview questions, quizzes for DevOps. Learn to become a modern DevOps engineer by following the steps, skills, resources and guides listed in this roadmap.",
"keywords": [
"solution architect roadmap",
"enterprise architect roadmap",
"guide to becoming a software architect",
"guide to becoming a Software Architect",
"software architect roadmap",
"db administrator roadmap",
"software architect roadmap",
"software architect skills",
"db administrator skills",
"become software architect",
"modern software architect skills",
"software architect skills test",
"skills for software architect",
"skills for software architect",
"learn software architect",
"what is software architect",
"software architect quiz",
"software architect interview questions"
]
},
"title": "Software Architect",
"description": "Step by step guide to becoming a Software Architect in 2022",
"featuredTitle": "Software Architect",
"isNew": true,
"type": "role",
"jsonUrl": "/project/software-architect.json",
"featuredDescription": "Step by step guide to become a Software Architect in 2022",
"isCommunity": false,
"featured": true,
"detailed": false,
"versions": [],
"relatedRoadmaps": [
"backend",
"python",
"python",
"nodejs",
"golang",
"java",
"devops"
],
"contentPathsFilePath": "/roadmaps/114-software-architect/content-paths.json",
"id": "software-architect",
"metaPath": "/roadmaps/114-software-architect/meta.json",
"isUpcoming": false
}
]

@ -1,3 +1,9 @@
<DedicatedRoadmap
href='/javascript'
title='JavaScript Roadmap'
description='Click to check the detailed JavaScript Roadmap.'
/>
# JavaScript
JavaScript allows you to add interactivity to your pages. Common examples that you may have seen on the websites are sliders, click interactions, popups and so on.

@ -1 +1,13 @@
# Rkt
# RKT
RKT(pronounced like a "rocket") is an application container engine developed for modern production cloud-native environments. It features a pod-native approach, a pluggable execution environment, and a well-defined surface area that makes it ideal for integration with other systems.
RKT project was ended in 2018.
<ResourceGroupTitle>Free Content</ResourceGroupTitle>
<BadgeLink colorScheme='blue' badgeText='Official Website' href='https://rocket.readthedocs.io/en/latest/Documentation/trying-out-rkt/'>RKT Documentation</BadgeLink>
<BadgeLink colorScheme='yellow' badgeText='Read' href='https://www.redhat.com/en/topics/containers/what-is-rkt'>What is RKT?</BadgeLink>
<BadgeLink colorScheme='green' badgeText='Github Repo' href='https://github.com/rkt/rkt'>What is RKT?</BadgeLink>
<BadgeLink badgeText='Watch' href='https://youtu.be/JgUEXKTSVXw'>Introduction to RKT</BadgeLink>
<BadgeLink badgeText='Watch' href='https://youtu.be/mRlQC6s8IwM'>The RKT Container Runtime - Explanation & Demonstration</BadgeLink>

@ -1 +1,9 @@
# Lxc
# LXC
LXC is an abbreviation used for Linux Containers which is an operating system that is used for running multiple Linux systems virtually on a controlled host via a single Linux kernel. LXC is a userspace interface for the Linux kernel containment features. Through a powerful API and simple tools, it lets Linux users easily create and manage system or application containers.
<ResourceGroupTitle>Free Content</ResourceGroupTitle>
<BadgeLink colorScheme='blue' badgeText='Official Website' href='https://linuxcontainers.org/lxc/documentation/'>LXC Documentation</BadgeLink>
<BadgeLink colorScheme='yellow' badgeText='Read' href='https://linuxcontainers.org/lxc/introduction/'>What is LXC?</BadgeLink>
<BadgeLink badgeText='Watch' href='https://youtu.be/_KnmRdK69qM'>Linux Container (LXC) Introduction</BadgeLink>
<BadgeLink badgeText='Watch' href='https://youtu.be/CWmkSj_B-wo'>Getting started with LXC containers</BadgeLink>

@ -1 +1,40 @@
# Editors
Editors are tools that allow you to create or edit files on your file system.
## Vim
Vim is a highly configurable text editor built to make creating and changing any kind of text very efficient. It is included as "vi" with most UNIX systems and with Apple OS X.
Vim ships with `vimtutor` that is a tutor designed to describe enough of the Vim commands that you will be able to easily use Vim as an all-purpose editor.
<ResourceGroupTitle>Free Content</ResourceGroupTitle>
<BadgeLink badgeText='Official Website' colorScheme='blue' href='https://www.vim.org'>Vim</BadgeLink>
<BadgeLink badgeText='Read' colorScheme='yellow' href='https://vimhelp.org/'>Vim help files</BadgeLink>
<BadgeLink badgeText='Read' colorScheme='yellow' href='https://vim.fandom.com/wiki/Vim_Tips_Wiki'>Vim Tips Wiki</BadgeLink>
<BadgeLink badgeText='Read' colorScheme='yellow' href='https://vim-adventures.com/'>Vim Adventures</BadgeLink>
## Nano
GNU nano is a small and friendly text editor.
<ResourceGroupTitle>Free Content</ResourceGroupTitle>
<BadgeLink badgeText='Official Website' colorScheme='blue' href='https://www.nano-editor.org/'>GNU Nano</BadgeLink>
<BadgeLink badgeText='Official Documentation' colorScheme='blue' href='https://www.nano-editor.org/dist/latest/nano.html'>GNU Nano Manual</BadgeLink>
## PowerShell
PowerShell is a cross-platform task automation solution made up of a command-line shell, a scripting language, and a configuration management framework. PowerShell runs on Windows, Linux, and macOS.
<ResourceGroupTitle>Free Content</ResourceGroupTitle>
<BadgeLink badgeText='Official Documentation' colorScheme='blue' href='https://learn.microsoft.com/en-us/powershell/'>PowerShell Documentation</BadgeLink>
## Emacs
An extensible, customizable, free/libre text editor.
At its core is an interpreter for Emacs Lisp, a dialect of the Lisp programming language with extensions to support text editing.
<ResourceGroupTitle>Free Content</ResourceGroupTitle>
<BadgeLink badgeText='Official Website' colorScheme='blue' href='https://www.gnu.org/software/emacs/'>GNU Emacs</BadgeLink>
<BadgeLink badgeText='Official Documentation' colorScheme='blue' href='https://www.gnu.org/software/emacs/documentation.html'>GNU Emacs Documentation</BadgeLink>

@ -1 +1,10 @@
# Mtr
# mtr
`mtr` combines the functionality of the traceroute and ping programs in a single network diagnostic tool.
As `mtr` starts, it investigates the network connection between the host `mtr` runs on and `HOSTNAME` by sending packets with purposely low TTLs. It continues sending packets with low TTL, noting the response time of the intervening routers. This allows `mtr` to print the internet route's response percentage and response times to HOSTNAME. A sudden packet loss or response time increase often indicates a bad (or simply overloaded) link.
<ResourceGroupTitle>Free Content</ResourceGroupTitle>
<BadgeLink colorScheme='yellow' badgeText='Read' href='https://www.javatpoint.com/linux-mtr'>Javatpoint: Linux mtr Command</BadgeLink>
<BadgeLink colorScheme='yellow' badgeText='Read' href='https://www.tutorialspoint.com/unix_commands/mtr.htm'>mtr Linux command</BadgeLink>
<BadgeLink colorScheme='yellow' badgeText='Read' href='https://www.devopsroles.com/how-to-traceroute-use-mtr-command-in-linux/'>How to traceroute use mtr command in Linux</BadgeLink>

@ -1 +1,7 @@
# Nmap
# NMAP
NMAP stands for Network Mapper and is an open-source tool used to explore and audit the network's security, such as checking firewalls and scanning ports.
<ResourceGroupTitle>Free Content</ResourceGroupTitle>
<BadgeLink colorScheme='blue' badgeText='Official Page' href='https://nmap.org/book/man.html'>NMAP Official Manual Book</BadgeLink>
<BadgeLink colorScheme='yellow' badgeText='Read' href='https://www.freecodecamp.org/news/what-is-nmap-and-how-to-use-it-a-tutorial-for-the-greatest-scanning-tool-of-all-time/'>What is Nmap and How to Use it</BadgeLink>

@ -1 +1,6 @@
# Dmarc
# DMARC
DMARC stands for Domain-based Message Authentication, Reporting, and Conformance, is an authentication method on the email that is built to protect domain email from invalid email addresses or commonly known as email spoofing, email attacks, phishing, scams, and other threat activities.
<ResourceGroupTitle>Free Content</ResourceGroupTitle>
<BadgeLink colorScheme='yellow' badgeText='Read' href='https://dmarc.org/'>DMARC Official Website</BadgeLink>

@ -8,3 +8,4 @@ These images are designed for portability, allowing for full local testing of a
<BadgeLink colorScheme='yellow' badgeText='Read' href='https://cloud.google.com/learn/what-are-containers'>What are Containers?</BadgeLink>
<BadgeLink colorScheme='yellow' badgeText='Read' href='https://www.docker.com/resources/what-container/'>What is a Container?</BadgeLink>
<BadgeLink badgeText='Watch' href='https://www.youtube.com/playlist?list=PLawsLZMfND4nz-WDBZIj8-nbzGFD4S9oz'>What are Containers?</BadgeLink>
<BadgeLink colorScheme='yellow' badgeText='Read' href='https://thenewstack.io/category/containers/'>Articles about Containers - The New Stack</BadgeLink>

@ -1,6 +1,6 @@
# History of JavaScript
JavaScript was initially created by Brendan Eich of NetScape and was first announced in a press release by Netscape in 1995. It has a bizarre history of naming; initally it was named Mocha by the creator, which was later renamed to LiveScript. In 1996, about a year later after the release, NetScape decided to rename it to be JavaScript with hopes of capitalizing on the Java community (although JavaScript did not have any relationship with Java) and released Netscape 2.0 with the official support of JavaScript.
JavaScript was initially created by Brendan Eich of NetScape and was first announced in a press release by Netscape in 1995. It has a bizarre history of naming; initially, it was named Mocha by the creator, which was later renamed LiveScript. In 1996, about a year later after the release, NetScape decided to rename it to JavaScript with hopes of capitalizing on the Java community (although JavaScript did not have any relationship with Java) and released Netscape 2.0 with the official support of JavaScript.
<ResourceGroupTitle>Free Content</ResourceGroupTitle>
<BadgeLink colorScheme='yellow' badgeText='Read' href='https://roadmap.sh/guides/history-of-javascript'>Brief History of JavaScript</BadgeLink>

@ -1,6 +1,6 @@
# How to run Javascript
JavaScript can be run in the browser by including the external script file using the `script` tag, write it within the HTML page using the `script` tag again, run it in the browser console or you can also use [REPL](https://www.digitalocean.com/community/tutorials/how-to-use-the-node-js-repl).
JavaScript can be run in the browser by including the external script file using the `script` tag, writing it within the HTML page using the `script` tag again, running it in the browser console or you can also use [REPL](https://www.digitalocean.com/community/tutorials/how-to-use-the-node-js-repl).
<ResourceGroupTitle>Free Content</ResourceGroupTitle>
<BadgeLink colorScheme='yellow' badgeText='Read' href='https://www.digitalocean.com/community/tutorials/how-to-add-javascript-to-html'>How To Add JavaScript to HTML</BadgeLink>

@ -1,6 +1,6 @@
# Variable Declarations
To use variables in JavaScript, we first need to create it i.e. declare a variable. To declare variables, we use one of the `var`, `let` or `const` keywords.
To use variables in JavaScript, we first need to create it i.e. declare a variable. To declare variables, we use one of the `var`, `let`, or `const` keywords.
<ResourceGroupTitle>Free Content</ResourceGroupTitle>
<BadgeLink colorScheme='yellow' badgeText='Read' href='https://developer.mozilla.org/en-US/docs/Learn/JavaScript/First_steps/Variables'>Storing the information you need — Variables</BadgeLink>

@ -1,6 +1,6 @@
# Hoisting
JavaScript Hoisting refers to the process whereby the interpreter appears to move the declaration of functions, variables or classes to the top of their scope, prior to execution of the code.
JavaScript Hoisting refers to the process whereby the interpreter appears to move the declaration of functions, variables, or classes to the top of their scope, prior to execution of the code.
<ResourceGroupTitle>Free Content</ResourceGroupTitle>
<BadgeLink colorScheme='yellow' badgeText='Read' href='https://developer.mozilla.org/en-US/docs/Glossary/Hoisting'>What is Hoisting - MDN Docs</BadgeLink>

@ -1,6 +1,6 @@
# Javascript Variables
Most of the time, a JavaScript application needs to work with information. To store and represent this information in JavaScript codebase, we use variables. A variable is a container for a value.
Most of the time, a JavaScript application needs to work with information. To store and represent this information in the JavaScript codebase, we use variables. A variable is a container for a value.
<ResourceGroupTitle>Free Content</ResourceGroupTitle>
<BadgeLink colorScheme='yellow' badgeText='Read' href='https://javascript.info/variables'>JavaScript Variables</BadgeLink>

@ -1,6 +1,6 @@
# Prototypes
JavaScript is an object-oriented language built around a prototype model. In JavaScript, every object inherits properties from its prototype, if there is any. A prototype is simply an object from which another object inherits properties. To create complex programs using JavaScript, one has to be proficient in working with prototypes — they form the very core of OOP in the language.
JavaScript is an object-oriented language built around a prototype model. In JavaScript, every object inherits properties from its prototype, if there are any. A prototype is simply an object from which another object inherits properties. To create complex programs using JavaScript, one has to be proficient in working with prototypes — they form the very core of OOP in the language.
<ResourceGroupTitle>Free Content</ResourceGroupTitle>
<BadgeLink colorScheme='yellow' badgeText='Read' href='https://www.codeguage.com/courses/js/objects-prototypes'>Prototypes in JavaScript - A Comprehensive Guide</BadgeLink>

@ -1,6 +1,6 @@
# Arrays
Arrays are objects that store a collection of items and can be assigned to a variable. They have their own methods that can perform operations on the array.
Arrays are objects that store a collection of items and can be assigned to a variable. They have their methods that can perform operations on the array.
<ResourceGroupTitle>Free Content</ResourceGroupTitle>
<BadgeLink colorScheme='yellow' badgeText='Read' href='https://javascript.info/array'>Working with Arrays in JavaScript</BadgeLink>

@ -1 +1,8 @@
# Weak set
# WeakSet
`WeakSet` objects are collections of objects. Just as with `Sets`, each object in a `WeakSet` may occur only once; all objects in a `WeakSet`'s collection are unique.
<ResourceGroupTitle>Free Content</ResourceGroupTitle>
<BadgeLink colorScheme='yellow' badgeText='Read' href='https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/WeakSet'>WeakSet</BadgeLink>
<BadgeLink colorScheme='yellow' badgeText='Read' href='https://javascript.info/weakmap-weakset'>WeakMap and WeakSet</BadgeLink>

@ -1,6 +1,6 @@
# The `for` loop
The `for` loop is a standard control-flow construct in many programming languages, including JavaScript. It's commonly used to iterate over given sequences or iterate a known number of times, and execute a piece of code for each iteration.
The `for` loop is a standard control-flow construct in many programming languages, including JavaScript. It's commonly used to iterate over given sequences or iterate a known number of times and execute a piece of code for each iteration.
<ResourceGroupTitle>Free Content</ResourceGroupTitle>
<BadgeLink colorScheme='yellow' badgeText='Read' href='https://www.codeguage.com/courses/js/loops-for-loop'>JavaScript `for` Loop - CodeGuage</BadgeLink>

@ -1 +1,14 @@
# Arithmetic operators
The Arithmetic operators perform addition, subtraction, multiplication, division, exponentiation, and remainder perations.
Arithmetic operators in JavaScript are as follows:
- `+` (Addition)
- `-` (Subtraction)
- `*` (Multiplication)
- `/` (Division)
- `%` (Remainder)
- `**` (Exponentiation)
<BadgeLink colorScheme='yellow' badgeText='Read' href='https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators#arithmetic_operators'>Arithmetic Operators - MDN</BadgeLink>
<BadgeLink colorScheme='yellow' badgeText='Read' href='https://javascript.info/operators#maths'>Arithmetic Operators - JavaScript.info</BadgeLink>

@ -1 +1,17 @@
# Bitwise operators
Bitwise operators treat arguments as 32-bits (zeros & ones) and work on the level of their binary representation.
Ex. Decimal number `9` has a binary representation of `1001`. Bitwise operators perform their operations on such binary representations, but they return standard JavaScript numerical values.
Bitwise operators in JavaScript are as follows:
- `&` (AND)
- `|` (OR)
- `^` (XOR)
- `~` (NOT)
- `<<` (Left SHIFT)
- `>>` (Right SHIFT)
- `>>>` (Zero-Fill Right SHIFT)
<BadgeLink colorScheme='yellow' badgeText='Read' href='https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Expressions_and_Operators#bitwise_operators'>Bitwise Operators - MDN</BadgeLink>
<BadgeLink colorScheme='yellow' badgeText='Read' href='https://javascript.info/operators#bitwise-operators'>Bitwise Operators - JavaScript.info</BadgeLink>

@ -1,6 +1,6 @@
# Recursion
One of the most powerfula and elegant concept of functions, recursion is when a function invokes itself. Such a function is called a **_recursive function_**. As recursion happens, the underlying code of the recursive function gets executed again and again until a terminating condition, called the _base case_, gets fulfilled. As you dive into the world of algorithms, you'll come across recursion in many many instances.
One of the most powerful and elegant concept of functions, recursion is when a function invokes itself. Such a function is called a **_recursive function_**. As recursion happens, the underlying code of the recursive function gets executed again and again until a terminating condition, called the _base case_, gets fulfilled. As you dive into the world of algorithms, you'll come across recursion in many many instances.
<ResourceGroupTitle>Free Content</ResourceGroupTitle>
<BadgeLink colorScheme='yellow' badgeText='Read' href='https://javascript.info/recursion'>Recursion and Stack</BadgeLink>

@ -1,6 +1,6 @@
# Lexical scoping
Before one can make intuition of closures in JavaScript, it's important to first get the hang of the term '**_lexical environment_**'. In simple words, the lexical environment for a function `f` simply refers to the environment enclosing that function's definition in the source code.
Before one can make an intuition of closures in JavaScript, it's important to first get the hang of the term '**_lexical environment_**'. In simple words, the lexical environment for a function `f` simply refers to the environment enclosing that function's definition in the source code.
<ResourceGroupTitle>Free Content</ResourceGroupTitle>
<BadgeLink colorScheme='yellow' badgeText='Read' href='https://www.codeguage.com/courses/js/functions-closures#What_is_a_lexical_environment'>What is a lexical environment? - JavaScript - CodeGuage</BadgeLink>

@ -1,6 +1,6 @@
# Closures
Function closures are one of the most powerful, yet most misunderstood, concepts of JavaScript that are actually really simple to understand. A closure refers to a function along with its lexical environment. It is essentially what allows us to return a function `A`, from another function `B`, that remembers the local variables defined in `B`, even after `B` exits. The idea of closures is employed in nearly every other JavaScript program, hence, it's paramount for a JavaScript developer to know of it really well.
Function closures are one of the most powerful, yet most misunderstood, concepts of JavaScript that are actually really simple to understand. A closure refers to a function along with its lexical environment. It is essentially what allows us to return a function `A`, from another function `B`, that remembers the local variables defined in `B`, even after `B` exits. The idea of closures is employed in nearly every other JavaScript program, hence, it's paramount for a JavaScript developer to know it really well.
<ResourceGroupTitle>Free Content</ResourceGroupTitle>
<BadgeLink colorScheme='yellow' badgeText='Read' href='https://www.codeguage.com/courses/js/functions-closures'>JavaScript Closures - The Simplest Explanation</BadgeLink>

@ -1,6 +1,6 @@
# This Keyword
In JavaScript, the `this` keyword is a little different compared to other languages. It refers to an object, but it depends on how or where its being invoked. It also has some differences between strict mode and non-strict mode.
In JavaScript, the `this` keyword is a little different compared to other languages. It refers to an object, but it depends on how or where it is being invoked. It also has some differences between strict mode and non-strict mode.
- In an object method, `this` refers to the object
- Alone, `this` refers to the global object

@ -1,6 +1,6 @@
# Promises
Promises are a much better way to work with asynchronous code in JavaScript than the old and error-prone callback approach. They were introduced into JavaScript with ECMAScript 6. Using promises, we can manage extremely complex asynchronous code with rigorous error-handling set up, write code in a more or less synchronous style, and keep ourselves from running into the so-called callback hell.
Promises are a much better way to work with asynchronous code in JavaScript than the old and error-prone callback approach. They were introduced into JavaScript with ECMAScript 6. Using promises, we can manage extremely complex asynchronous code with rigorous error-handling setup, write code in a more or less synchronous style, and keep ourselves from running into the so-called callback hell.
<ResourceGroupTitle>Free Content</ResourceGroupTitle>
<BadgeLink colorScheme='yellow' badgeText='Read' href='https://www.codeguage.com/courses/advanced-js/promises-introduction'>A Detailed Introduction to Promises</BadgeLink>

@ -1,6 +1,6 @@
# Javascript Iterators and Generators
Iterators and generators, introduced into JavaScript with ECMAScript 6, represent an extremely useful concept related to iteration in the language. Iterators are objects, abiding by the iterator protocol, that allow us to easily iterate over a given sequence in various ways, such as using the `for...of` loop. Generators, on the other hand, allow us to use functions and the `yield` keyword to easily define iterable sequences that are iterators as well.
Iterators and generators, introduced into JavaScript with ECMAScript 6, represent an extremely useful concept related to iteration in the language. Iterators are objects, abiding by the iterator protocol, that allows us to easily iterate over a given sequence in various ways, such as using the `for...of` loop. Generators, on the other hand, allow us to use functions and the `yield` keyword to easily define iterable sequences that are iterators as well.
<ResourceGroupTitle>Free Content</ResourceGroupTitle>
<BadgeLink colorScheme='yellow' badgeText='Read' href='https://www.codeguage.com/courses/advanced-js/iteration-introduction'>Introduction to Iterators - Advanced JavaScript</BadgeLink>

@ -1 +1,7 @@
# Event emitter
# Event Emitter
In Node.js, an event can be described simply as a string with a corresponding callback. An event can be "emitted" (or, in other words, the corresponding callback be called) multiple times or you can choose to only listen for the first time it is emitted.
<ResourceGroupTitle>Free Content</ResourceGroupTitle>
<BadgeLink colorScheme='blue' badgeText='Official Website' href='https://nodejs.org/en/knowledge/getting-started/control-flow/what-are-event-emitters/'>What are Event Emitters?</BadgeLink>
<BadgeLink colorScheme='yellow' badgeText='Read' href='https://www.digitalocean.com/community/tutorials/using-event-emitters-in-node-js'>Using Event Emitters in Node.js</BadgeLink>

@ -1 +1,7 @@
# Set immediate
# setImmediate
The `setImmediate` function delays the execution of a function to be called after the current event loops finish all their execution. It's very similar to calling `setTimeout` with 0 ms delay.
<ResourceGroupTitle>Free Content</ResourceGroupTitle>
<BadgeLink colorScheme='yellow' badgeText='Read' href='https://developer.mozilla.org/en-US/docs/Web/API/Window/setImmediate'>Understanding setImmediate</BadgeLink>
<BadgeLink colorScheme='yellow' badgeText='Read' href='https://nodejs.dev/en/learn/understanding-setimmediate/'>Understanding setImmediate</BadgeLink>

@ -1 +1,9 @@
# Http module
To make HTTP requests in Node.js, there is a built-in module HTTP in Node.js to transfer data over the HTTP. To use the HTTP server in node, we need to require the HTTP module using `require()` method. The HTTP module creates an HTTP server that listens to server ports and gives a response back to the client.
<ResourceGroupTitle>Free Content</ResourceGroupTitle>
<BadgeLink badgeText='Course' colorScheme='green' href='https://www.digitalocean.com/community/tutorials/how-to-create-a-web-server-in-node-js-with-the-http-module'>How To Create a Web Server in Node.js with the HTTP Modulet</BadgeLink>
<BadgeLink colorScheme='yellow' badgeText='Read' href='https://www.geeksforgeeks.org/node-js-http-module/'>Node.js Http Module</BadgeLink>
<BadgeLink colorScheme='yellow' badgeText='Read' href='https://nodejs.dev/en/learn/the-nodejs-http-module/'>The Node.js Http Module</BadgeLink>

@ -1 +1,9 @@
# Make
Golang's built-in function make, helps us create and initialize slices, maps and channels, depending on the arguments that are provided to the function.
<ResourceGroupTitle>Free Content</ResourceGroupTitle>
<BadgeLink badgeText='Read' href='https://www.golangprograms.com/how-to-create-slice-using-make-function-in-golang.html'>Create a slice with make</BadgeLink>
<BadgeLink badgeText='Read' href='https://www.golangprograms.com/golang-package-examples/how-to-create-map-using-the-make-function-in-go.html'>Create a map with make</BadgeLink>
<BadgeLink badgeText='Read' href='https://www.programiz.com/golang/channel#channel'>Create a channel with make</BadgeLink>

@ -1 +1,8 @@
# Structs
Structs are user-defined types that help us create a collection of data describing a single entity.
<ResourceGroupTitle>Free Content</ResourceGroupTitle>
<BadgeLink colorScheme='blue' badgeText='Official Website' href='https://go.dev/tour/moretypes/2'>Go Structs</BadgeLink>
<BadgeLink badgeText='Read' href='https://gobyexample.com/structs'>Go by Example: Structs</BadgeLink>
<BadgeLink badgeText='Watch' href='https://www.youtube.com/watch?v=NMTN543WVQY'>Structs in Go</BadgeLink>

@ -1 +1,6 @@
# Gradle
Gradle is an open-source build automation tool that helps software engineers to test, build, and release high-performance software products. In addition, Gradle also supports multi-language development. Currently, the supported languages for Gradle include Java, Kotlin, Groovy, Scala, C/C++, and JavaScript.
<ResourceGroupTitle>Reference Resource</ResourceGroupTitle>
<BadgeLink colorScheme='blue' badgeText='Official Website' href='https://gradle.org/'>Gradle Website</BadgeLink>

@ -1 +1,6 @@
# Play framework
# Play Framework
Play Framework is a high-productivity web application framework that allows the model-view-controller pattern. It is written in Scala but can also be used for other programming languages that are compiled and run on the JVM. e.g.Java.
<ResourceGroupTitle>Reference Resource</ResourceGroupTitle>
<BadgeLink colorScheme='blue' badgeText='Official Website' href='https://www.playframework.com/'>Play Framework Website</BadgeLink>

@ -1 +1,12 @@
# Mocking
Mocking removes external dependencies from a unit test to create a sense of an entire controlled environment. The traditional method of mocks involves mocking all other classes that interact with the class we want to test. The common targets for mocking are:
- Database connections
- Web services
- Slow Classes
- Classes with side effects
- Classes with non-deterministic behavior
<ResourceGroupTitle>Reference Resource</ResourceGroupTitle>
<BadgeLink colorScheme='purple' badgeText='Visit' href='https://site.mockito.org/'>Mockito - Mocking Framework for Java</BadgeLink>

@ -1 +1,6 @@
# Jmeter
# JMeter
Apache JMeter is an Apache project that can be used as a load testing tool for analyzing and measuring the performance of a variety of services, with a focus on web applications.
<ResourceGroupTitle>Reference Resource</ResourceGroupTitle>
<BadgeLink colorScheme='blue' badgeText='Official Website' href='https://jmeter.apache.org/'>Apache JMeter Website</BadgeLink>

@ -1 +1,6 @@
# Gray box testing
# Gray Box Testing
Gray box testing is a software testing technique to test a software product or application with partial knowledge of the internal structure of the application. The purpose of gray box testing is to search and identify the defects due to improper code structure or improper use of applications.
<ResourceGroupTitle>Free Content</ResourceGroupTitle>
<BadgeLink colorScheme='yellow' badgeText='Read' href='https://www.guru99.com/grey-box-testing.html'>What is Gray Box Testing? Techniques & Example</BadgeLink>

@ -1 +1,10 @@
# Project management
# Project Management
A project is a temporary endeavor to create a unique product, service, or result. A project is temporary because it has a defined beginning and end time, and it is unique because it has a particular set of operations designed to accomplish a goal.
Project Management is a discipline of planning, organizing, motivating, and controlling the resources to achieve specific project goals. The main objective of project management is to achieve project goals and targets while keeping in mind the project scope, time, quality, and cost. It facilitates the project workflow with team collaboration on a single project.
<ResourceGroupTitle>Free Content</ResourceGroupTitle>
<BadgeLink colorScheme='yellow' badgeText='Read' href='https://www.guru99.com/introduction-project-management-pmp-certification.html'>What are the Main Objectives of Project Management?</BadgeLink>
<BadgeLink colorScheme='yellow' badgeText='Read' href='https://huddle.eurostarsoftwaretesting.com/project-management-in-software-testing/'>Project Management in Software Testing</BadgeLink>
<BadgeLink colorScheme='yellow' badgeText='Read' href='https://www.guru99.com/initiation-phase-project-management-life-cycle.html'>Project Management Life Cycle Phases: What are the stages?</BadgeLink>

@ -1 +1,6 @@
# Integration testing
# Integration Testing
Integration Testing is a type of testing where software modules are integrated logically and tested as a group. A typical software project consists of multiple software modules coded by different programmers. This testing level aims to expose defects in the interaction between these software modules when they are integrated. Integration Testing focuses on checking data communication amongst these modules.
<ResourceGroupTitle>Free Content</ResourceGroupTitle>
<BadgeLink colorScheme='yellow' badgeText='Read' href='https://www.guru99.com/integration-testing.html'>Integration Testing Tutorial</BadgeLink>

@ -1 +1,7 @@
# Regression testing
# Regression Testing
Regression Testing is a type of software testing to confirm that a recent program or code change has not adversely affected existing features. Regression testing is a black box testing technique. Test cases are re-executed to check the previous functionality of the application is working fine and that the new changes have not produced any bugs.
<ResourceGroupTitle>Free Content</ResourceGroupTitle>
<BadgeLink colorScheme='yellow' badgeText='Read' href='https://www.javatpoint.com/regression-testing'>Regression Testing</BadgeLink>
<BadgeLink colorScheme='yellow' badgeText='Read' href='https://www.guru99.com/regression-testing.html'>What is Regression Testing with Test Cases</BadgeLink>

@ -1 +1,7 @@
# Unit testing
# Unit Testing
Unit testing is where individual __units__ (modules, functions/methods, routines, etc.) of software are tested to ensure their correctness. This low-level testing ensures smaller components are functionally sound while taking the burden off of higher-level tests. Generally, a developer writes these tests during the development process and they are run as automated tests.
<ResourceGroupTitle>Free Content</ResourceGroupTitle>
<BadgeLink colorScheme='yellow' badgeText='Read' href='https://www.guru99.com/unit-testing-guide.html'>Unit Testing Tutorial</BadgeLink>
<BadgeLink badgeText='Watch' href='https://youtu.be/3kzHmaeozDI'>What is Unit Testing?</BadgeLink>

@ -1 +1,7 @@
# Load testing
# Load Testing
Load Testing is a type of Performance Testing that determines the performance of a system, software product, or software application under real-life-based load conditions. Load testing determines the behavior of the application when multiple users use it at the same time. It is the response of the system measured under varying load conditions.
<ResourceGroupTitle>Free Content</ResourceGroupTitle>
<BadgeLink colorScheme='yellow' badgeText='Read' href='https://www.geeksforgeeks.org/software-testing-load-testing/'>Software Testing: Load Testing</BadgeLink>
<BadgeLink colorScheme='yellow' badgeText='Read' href='https://loadninja.com/load-testing/'>Load testing and Best Practises</BadgeLink>

@ -1 +1,7 @@
# Selenium
Selenium is an open-source tool that automates web browsers. It provides a single interface that lets you write test scripts in programming languages like Ruby, Java, NodeJS, PHP, Perl, Python, and C#, among others.
<ResourceGroupTitle>Free Content</ResourceGroupTitle>
<BadgeLink colorScheme='blue' badgeText='Official Website' href='https://www.selenium.dev/'>Selenium's Official Website</BadgeLink>
<BadgeLink colorScheme='yellow' badgeText='Read' href='https://www.browserstack.com/selenium'>Selenium Tutorial</BadgeLink>

@ -0,0 +1,110 @@
{
"home": "/roadmaps/114-software-architect/content/readme.md",
"patterns-and-design-principles": "/roadmaps/114-software-architect/content/105-patterns-and-design-principles/readme.md",
"patterns-and-design-principles:cqrs-eventual-consistency": "/roadmaps/114-software-architect/content/105-patterns-and-design-principles/102-cqrs-eventual-consistency.md",
"patterns-and-design-principles:acid-cap-theorem": "/roadmaps/114-software-architect/content/105-patterns-and-design-principles/104-acid-cap-theorem.md",
"patterns-and-design-principles:tdd": "/roadmaps/114-software-architect/content/105-patterns-and-design-principles/106-tdd.md",
"patterns-and-design-principles:mvc-mvp-mvvm": "/roadmaps/114-software-architect/content/105-patterns-and-design-principles/101-mvc-mvp-mvvm.md",
"patterns-and-design-principles:actors": "/roadmaps/114-software-architect/content/105-patterns-and-design-principles/103-actors.md",
"patterns-and-design-principles:solid": "/roadmaps/114-software-architect/content/105-patterns-and-design-principles/105-solid.md",
"patterns-and-design-principles:ddd": "/roadmaps/114-software-architect/content/105-patterns-and-design-principles/106-ddd.md",
"patterns-and-design-principles:oop": "/roadmaps/114-software-architect/content/105-patterns-and-design-principles/100-oop.md",
"software-architect-basics": "/roadmaps/114-software-architect/content/100-software-architect-basics/readme.md",
"software-architect-basics:what-is-software-architecture": "/roadmaps/114-software-architect/content/100-software-architect-basics/100-what-is-software-architecture.md",
"software-architect-basics:what-is-software-architect": "/roadmaps/114-software-architect/content/100-software-architect-basics/101-what-is-software-architect.md",
"software-architect-basics:levels-of-architecture": "/roadmaps/114-software-architect/content/100-software-architect-basics/102-levels-of-architecture/readme.md",
"software-architect-basics:levels-of-architecture:application-architecture": "/roadmaps/114-software-architect/content/100-software-architect-basics/102-levels-of-architecture/100-application-architecture.md",
"software-architect-basics:levels-of-architecture:solution-architecture": "/roadmaps/114-software-architect/content/100-software-architect-basics/102-levels-of-architecture/101-solution-architecture.md",
"software-architect-basics:levels-of-architecture:enterprise-architecture": "/roadmaps/114-software-architect/content/100-software-architect-basics/102-levels-of-architecture/102-enterprise-architecture.md",
"important-skills": "/roadmaps/114-software-architect/content/102-important-skills/readme.md",
"important-skills:design-and-architecture": "/roadmaps/114-software-architect/content/102-important-skills/100-design-and-architecture.md",
"important-skills:decision-making": "/roadmaps/114-software-architect/content/102-important-skills/101-decision-making.md",
"important-skills:simplifying-things": "/roadmaps/114-software-architect/content/102-important-skills/102-simplifying-things.md",
"important-skills:how-to-code": "/roadmaps/114-software-architect/content/102-important-skills/103-how-to-code.md",
"important-skills:documentation": "/roadmaps/114-software-architect/content/102-important-skills/104-documentation.md",
"important-skills:communication": "/roadmaps/114-software-architect/content/102-important-skills/105-communication.md",
"important-skills:estimate-and-evaluate": "/roadmaps/114-software-architect/content/102-important-skills/106-estimate-and-evaluate.md",
"important-skills:balance": "/roadmaps/114-software-architect/content/102-important-skills/107-balance.md",
"important-skills:consult-and-coach": "/roadmaps/114-software-architect/content/102-important-skills/108-consult-and-coach.md",
"important-skills:marketing-skills": "/roadmaps/114-software-architect/content/102-important-skills/109-marketing-skills.md",
"technical-skills": "/roadmaps/114-software-architect/content/103-technical-skills.md",
"programming-languages": "/roadmaps/114-software-architect/content/104-programming-languages/readme.md",
"programming-languages:java-kotlin-scala": "/roadmaps/114-software-architect/content/104-programming-languages/100-java-kotlin-scala.md",
"programming-languages:python": "/roadmaps/114-software-architect/content/104-programming-languages/101-python.md",
"programming-languages:ruby": "/roadmaps/114-software-architect/content/104-programming-languages/102-ruby.md",
"programming-languages:go": "/roadmaps/114-software-architect/content/104-programming-languages/103-go.md",
"programming-languages:javascript-typescript": "/roadmaps/114-software-architect/content/104-programming-languages/104-javascript-typescript.md",
"programming-languages:dotnet-framework": "/roadmaps/114-software-architect/content/104-programming-languages/105-dotnet-framework.md",
"architect-tools": "/roadmaps/114-software-architect/content/106-architect-tools/readme.md",
"architect-tools:git": "/roadmaps/114-software-architect/content/106-architect-tools/100-git.md",
"architect-tools:slack": "/roadmaps/114-software-architect/content/106-architect-tools/101-slack.md",
"architect-tools:trello": "/roadmaps/114-software-architect/content/106-architect-tools/102-trello.md",
"architect-tools:atlassian-tools": "/roadmaps/114-software-architect/content/106-architect-tools/103-atlassian-tools.md",
"architectures": "/roadmaps/114-software-architect/content/107-architectures/readme.md",
"architectures:serverless": "/roadmaps/114-software-architect/content/107-architectures/100-serverless.md",
"architectures:microservices": "/roadmaps/114-software-architect/content/107-architectures/101-microservices.md",
"architectures:client-server-architecture": "/roadmaps/114-software-architect/content/107-architectures/102-client-server-architecture.md",
"architectures:layered-architecture": "/roadmaps/114-software-architect/content/107-architectures/103-layered-architecture.md",
"architectures:distributed-systems": "/roadmaps/114-software-architect/content/107-architectures/104-distributed-systems.md",
"architectures:service-oriented": "/roadmaps/114-software-architect/content/107-architectures/105-service-oriented.md",
"security": "/roadmaps/114-software-architect/content/108-security/readme.md",
"security:hashing-algorithms": "/roadmaps/114-software-architect/content/108-security/100-hashing-algorithms.md",
"security:pki": "/roadmaps/114-software-architect/content/108-security/101-pki.md",
"security:owasp": "/roadmaps/114-software-architect/content/108-security/102-owasp.md",
"security:auth-strategies": "/roadmaps/114-software-architect/content/108-security/103-auth-strategies.md",
"working-with-data": "/roadmaps/114-software-architect/content/109-working-with-data/readme.md",
"working-with-data:hadoop-spark-mapreduce": "/roadmaps/114-software-architect/content/109-working-with-data/100-hadoop-spark-mapreduce.md",
"working-with-data:etl-datawarehouses": "/roadmaps/114-software-architect/content/109-working-with-data/101-etl-datawarehouses.md",
"working-with-data:sql-databases": "/roadmaps/114-software-architect/content/109-working-with-data/102-sql-databases.md",
"working-with-data:nosql-databases": "/roadmaps/114-software-architect/content/109-working-with-data/103-nosql-databases.md",
"working-with-data:analytics": "/roadmaps/114-software-architect/content/109-working-with-data/103-analytics/readme.md",
"working-with-data:analytics:apache-spark": "/roadmaps/114-software-architect/content/109-working-with-data/103-analytics/100-apache-spark.md",
"working-with-data:analytics:hadoop": "/roadmaps/114-software-architect/content/109-working-with-data/103-analytics/101-hadoop.md",
"working-with-data:analytics:datawarehouses-principles": "/roadmaps/114-software-architect/content/109-working-with-data/103-analytics/102-datawarehouses-principles.md",
"apis-and-integrations": "/roadmaps/114-software-architect/content/110-apis-and-integrations/readme.md",
"apis-and-integrations:grpc": "/roadmaps/114-software-architect/content/110-apis-and-integrations/100-grpc.md",
"apis-and-integrations:esb-soap": "/roadmaps/114-software-architect/content/110-apis-and-integrations/101-esb-soap.md",
"apis-and-integrations:graphql": "/roadmaps/114-software-architect/content/110-apis-and-integrations/102-graphql.md",
"apis-and-integrations:rest": "/roadmaps/114-software-architect/content/110-apis-and-integrations/103-rest.md",
"apis-and-integrations:bpm-bpel": "/roadmaps/114-software-architect/content/110-apis-and-integrations/104-bpm-bpel.md",
"apis-and-integrations:messaging-queues": "/roadmaps/114-software-architect/content/110-apis-and-integrations/105-messaging-queues.md",
"web-and-mobile": "/roadmaps/114-software-architect/content/111-web-and-mobile/readme.md",
"web-and-mobile:reactive-functional-programming": "/roadmaps/114-software-architect/content/111-web-and-mobile/100-reactive-functional-programming.md",
"web-and-mobile:react-vue-angular": "/roadmaps/114-software-architect/content/111-web-and-mobile/101-react-vue-angular.md",
"web-and-mobile:spa-ssr-ssg": "/roadmaps/114-software-architect/content/111-web-and-mobile/102-spa-ssr-ssg.md",
"web-and-mobile:pwa": "/roadmaps/114-software-architect/content/111-web-and-mobile/103-pwa.md",
"web-and-mobile:microfrontends": "/roadmaps/114-software-architect/content/111-web-and-mobile/104-microfrontends.md",
"web-and-mobile:w3c-and-whatwg-standards": "/roadmaps/114-software-architect/content/111-web-and-mobile/105-w3c-and-whatwg-standards.md",
"architect-frameworks": "/roadmaps/114-software-architect/content/112-architect-frameworks/readme.md",
"architect-frameworks:babok": "/roadmaps/114-software-architect/content/112-architect-frameworks/100-babok.md",
"architect-frameworks:iaf": "/roadmaps/114-software-architect/content/112-architect-frameworks/101-iaf.md",
"architect-frameworks:uml": "/roadmaps/114-software-architect/content/112-architect-frameworks/101-uml.md",
"architect-frameworks:togaf": "/roadmaps/114-software-architect/content/112-architect-frameworks/102-togaf.md",
"management": "/roadmaps/114-software-architect/content/113-management/readme.md",
"management:certifications": "/roadmaps/114-software-architect/content/113-management/100-certifications/readme.md",
"management:certifications:pmi-itil-prince2-rup": "/roadmaps/114-software-architect/content/113-management/100-certifications/100-pmi-itil-prince2-rup.md",
"management:agile-scrum": "/roadmaps/114-software-architect/content/113-management/101-agile-scrum/readme.md",
"management:agile-scrum:less": "/roadmaps/114-software-architect/content/113-management/101-agile-scrum/100-less.md",
"management:agile-scrum:safe": "/roadmaps/114-software-architect/content/113-management/101-agile-scrum/101-safe.md",
"networks": "/roadmaps/114-software-architect/content/114-networks/readme.md",
"networks:osi-tcp-ip-model": "/roadmaps/114-software-architect/content/114-networks/100-osi-tcp-ip-model.md",
"networks:http-https": "/roadmaps/114-software-architect/content/114-networks/101-http-https.md",
"networks:proxies": "/roadmaps/114-software-architect/content/114-networks/102-proxies.md",
"networks:firewalls": "/roadmaps/114-software-architect/content/114-networks/103-firewalls.md",
"operations-knowledge": "/roadmaps/114-software-architect/content/115-operations-knowledge/readme.md",
"operations-knowledge:infrastructure-as-code": "/roadmaps/114-software-architect/content/115-operations-knowledge/100-infrastructure-as-code.md",
"operations-knowledge:cloud-providers": "/roadmaps/114-software-architect/content/115-operations-knowledge/101-cloud-providers.md",
"operations-knowledge:serverless-concepts": "/roadmaps/114-software-architect/content/115-operations-knowledge/102-serverless-concepts.md",
"operations-knowledge:linux-unix": "/roadmaps/114-software-architect/content/115-operations-knowledge/103-linux-unix.md",
"operations-knowledge:service-mesh": "/roadmaps/114-software-architect/content/115-operations-knowledge/104-service-mesh.md",
"operations-knowledge:ci-cd": "/roadmaps/114-software-architect/content/115-operations-knowledge/105-ci-cd.md",
"operations-knowledge:containers": "/roadmaps/114-software-architect/content/115-operations-knowledge/106-containers.md",
"operations-knowledge:cloud-design-patterns": "/roadmaps/114-software-architect/content/115-operations-knowledge/107-cloud-design-patterns.md",
"enterprise-software": "/roadmaps/114-software-architect/content/116-enterprise-software/readme.md",
"enterprise-software:ms-dynamics": "/roadmaps/114-software-architect/content/116-enterprise-software/100-ms-dynamics.md",
"enterprise-software:sap-epr-hana-business-objects": "/roadmaps/114-software-architect/content/116-enterprise-software/101-sap-epr-hana-business-objects.md",
"enterprise-software:emc-dms": "/roadmaps/114-software-architect/content/116-enterprise-software/102-emc-dms.md",
"enterprise-software:ibm-bpm": "/roadmaps/114-software-architect/content/116-enterprise-software/103-ibm-bpm.md",
"enterprise-software:salesforce": "/roadmaps/114-software-architect/content/116-enterprise-software/104-salesforce.md",
"architect-responsibilities": "/roadmaps/114-software-architect/content/101-architect-responsibilities.md"
}

@ -0,0 +1,8 @@
# What is Software Architecture?
Describes how an application is built including its components, how they interact with each other, environment in which they operate and so on.
<ResourceGroupTitle>Free Content</ResourceGroupTitle>
<BadgeLink colorScheme='yellow' badgeText='Read' href='https://www.future-processing.com/blog/what-is-software-architecture-in-software-engineering/'>What is Software Architecture in Software Engineering?</BadgeLink>
<BadgeLink colorScheme='yellow' badgeText='Read' href='https://www.freecodecamp.org/news/an-introduction-to-software-architecture-patterns/'>An Introduction to Software Architecture Patterns</BadgeLink>
<BadgeLink colorScheme='yellow' badgeText='Read' href='https://www.infoq.com/articles/what-software-architecture/'>Software Architecture: It might not be what you think it is</BadgeLink>

@ -0,0 +1,3 @@
# What is Software Architect?
A software expert who makes high level design choices, including technical standards, tools, design principles, platforms to be used, etc.

@ -0,0 +1,4 @@
# Application Level Architecture
The lowest level of architecture. Focus on one single application. Very detailed, low level design. Communication is usually within one development team.

@ -0,0 +1,3 @@
# Solution Level Architecture
The mid-level of architecture. Focus on one or more applications which fulfill a business need (business solution). Some high, but mainly low-level design. Communication is between multiple development teams.

@ -0,0 +1,3 @@
# Enterprise Level Architecture
The highest level of architecture. Focus on multiple solutions. High level, abstract design, which needs to be detailed out by solution or application architects. Communication is across the organization.

@ -0,0 +1,8 @@
# Levels of Architecture
Architecture can be done on several “levels” of abstractions. The level influences the importance of necessary skills. As there are many categorizations possible my favorite segmentation includes these 3 levels:
* **Application Level:** The lowest level of architecture. Focus on one single application. Very detailed, low level design. Communication is usually within one development team.
* **Solution Level:** The mid-level of architecture. Focus on one or more applications which fulfill a business need (business solution). Some high, but mainly low-level design. Communication is between multiple development teams.
* **Enterprise Level:** The highest level of architecture. Focus on multiple solutions. High level, abstract design, which needs to be detailed out by solution or application architects. Communication is across the organization.

@ -0,0 +1,3 @@
# Software Architect Basics
Understand different concepts such as what is software architecture, software architect, different types of architects and so on.

@ -0,0 +1,17 @@
# Architect Responsibilities
To understand the necessary skills an architect needs, we first need to understand typical activities. The following list contains from my perspective the most important activities:
* Define and decide development technology and platform
* Define development standards, e.g., coding standards, tools, review processes, test approach, etc.
* Support identifying and understanding business requirements
* Design systems and take decisions based on requirements
* Document and communicate architectural definitions, design and decisions
* Check and review architecture and code, e.g., check if defined patterns and coding standards are implemented properly
* Collaborate with other architects and stakeholders
* Coach and consult developers
* Make sure that as implementation takes place, the architecture is being adhered to
* Play a key part in reviewing code
* Detail out and refine higher level design into lower level design
_Note: Architecture is a continuous activity, especially when it is applied in agile software development. Therefore, these activities are done over and over again._

@ -0,0 +1,11 @@
# Design and Architecture
What makes a good design? This is probably the most important and challenging question. I will make a distinction between theory and practice. To my experience, having a mix of both is most valuable. Let’s start with theory:
* **Know the basic design patterns**: Patterns are one of the most important tools an architect needs to have to develop maintainable systems. With patterns you can reuse designs to solve common problems with proven solutions. The book “Design Patterns: Elements of Reusable Object-Oriented Software” written by John Vlissides, Ralph Johnson, Richard Helm, Erich Gamma is a must-read to everyone who is in software development. Although the patterns were published more than 20 years ago they are still the basis of modern software architecture. For example, the Model-View-Controller (MVC) pattern was described in this book, which is applied in many areas or is the basis for newer pattern, e.g. Model-View-ViewModel (MVVM).
* **Dig deeper into patterns and anti-patterns**: If you already know all basic Gang-of-Four patterns, then extend your knowledge with more software design patterns or dig deeper into your area of interest. One of my favorite books about application integration is “Enterprise Integration Patterns” written by Gregor Hohpe. This book is applicable in various areas whenever two applications need to exchange data, whether it is an old-school file exchange from some legacy systems or a modern microservice architecture.
* **Know quality measures**: Defining architecture is not the end. There are reasons why guidelines and coding standards are defined, applied and controlled. You do this because of quality and non-functional requirements. You want to have a system which is maintainable, reliable, adaptable, secure, testable, scalable, usable, etc. And one piece to achieving all of these quality attributes is applying good architecture work. You can start to learn more about quality measures on Wikipedia.
Theory is important. Practice is equally—or even more—important if you do not want to become an Ivory Tower Architect.
* **Try out and understand different technology stacks**: I think this is the most important activity if you want to become a better architect. Try out (new) technology stacks and learn their ups and downs. Different or new technology comes with different design aspects and patterns. You most likely do not learn anything from just flipping through abstract slides but by trying it out by yourself and feeling the pain or the relief. An architect should not only have broad, but—also in some areas—deep knowledge. It is not important to master all technology stacks but to have a solid understanding of the most important in your area. Also, try out technology which is not in your area, e.g., if you are deep into SAP R/3 you should also try JavaScript and vice versa. Still, both parties will be surprised about the latest advances in SAP S/4 Hana. For example, you can try it by yourself and take a course at openSAP for free. Be curious and try out new things. Also try out stuff which you did not like some years ago.
* **Analyze and understand applied patterns**: Have a look at any current framework, e.g., Angular. You can study a lot of patterns in practice, e.g., Observables. Try to understand how it is applied in the framework, why it was done. And if you are really dedicated, have a deeper look into the code and understand how it was implemented.
* **Be curious and attend User Groups**. [Meetup](https://www.meetup.com/)

@ -0,0 +1,10 @@
# Decision Making
An architect needs to be able to take decisions and guide projects or the entire organization into the right direction.
* **Know what is important**: Do not waste time with unimportant decisions or activities. Learn what is important. To my knowledge there is not a book which has these information. My personal favorites are these 2 characteristics which I usually consider when evaluating if something is important or not:
1. Conceptional Integrity: If you decide to do it in one way, stick to it, even if it is sometimes better to do it differently. Usually, this leads to a more straightforward overall concept, eases comprehensibility and eases maintenance.
2. Uniformity: If you for example define and apply naming conventions it is not about upper- or lowercase, but to have it applied everywhere in the same way.
* **Prioritize**: Some decisions are highly critical. If they are not taken early enough workarounds are build up which are often unlikely to be removed later and are a nightmare for maintenance, or worse, developers simply stop working until a decision is taken. In such situations it is sometimes even better to go with a “bad” decision instead of having no decision. But before it comes to this situation, consider prioritizing upcoming decisions. There are different ways to do so. I suggest having a look at the Weighted Shortest Job First (WSJF) model which is widely used within agile software development. Especially the measures time criticality and risk reduction are critical to estimate the priority of architecture decisions.
* **Know your competence**: Do not decide things which are not in your competence. This is critical as it may ruin your position as architect significantly if not considered. To avoid this, clarify with your peers which responsibilities you have and what is part of your role. If there are more than one architect, then you should respect the level of architecture in which you are currently deployed. As an lower level architect you better come up with suggestions for higher level architecture instead of decisions. Further, I recommend checking critical decisions always with a peer.
* **Evaluate multiple options**: Always lay out more than one option if it comes to decisions. In the majority of the cases I was involved in, there was more than one possible (good) option. Going with only one option is bad in two respects: First, it seems that you did not do your job properly and secondly it impedes making proper decisions. By defining measures, options can be compared based on facts instead of gut feelings, e.g. license costs or maturity. This usually leads to better and more sustainable decisions. Further, it eases to sell the decision to different stakeholders. Besides, if you do not have evaluated options properly you may miss arguments when it comes to discussions.

@ -0,0 +1,8 @@
# Simplifying Things
Keep in mind the problem-solving principle Occam’s Razor which states to prefer simplicity. I interpret the principle as following: If you have too many assumptions about the problem to solve your solution will probably be wrong or lead to an unnecessary complex solution. Assumptions should be reduced (simplified) to come to a good solution.
* **Shake the solution**: To get solutions simplified, it often helps to “shake” the solution and look at them from different positions. Try to shape the solution by thinking top-down and again bottom-up. If you have a data flow or process, then first think left to right and again right to left. Ask questions such as: “What happens to your solution in a perfect world?” Or: “What would company / person X do?” (Where X is probably not your competitor, but one of the GAFA (Google, Apple, Facebook, & Amazon) companies.) Both questions force you to reduce assumptions as suggested by Occam’s Razor.
* **Take a step back**: After intense and long discussions, highly complex scribbles are often the results. You should never ever see these as the final results. Take a step back: Have a look at the big picture again (abstract level). Does it still make sense? Then go through it on the abstract level again and refactor. Sometimes it helps to stop a discussion and continue the next day. At least my brain needs some time to process and to come up with better, more elegant and simpler solutions.
* **Divide and Conquer**: Simplify the problem by dividing it into smaller pieces. Then solve them independently. Afterwards validate if the small pieces match together. Take the step back to have a look at the overall picture for this.
* **Refactoring is not evil**: It is totally ok to start with a more complex solution if no better idea can be found. If the solution is making troubles you can later rethink the solution and apply your learning. Refactoring is not evil. But before you start refactoring, keep in mind to have (1) enough automated tests in place which can ensure the proper functionality of the system and (2) the buy-in from your stakeholders. To learn more about refactoring I suggest reading “Refactoring. Improving the Design of Existing Code” by Martin Fowler.

@ -0,0 +1,14 @@
# How to Code
Even as an Enterprise Architect, the most abstract level of architecture, you should still know what developers are doing on their daily basis. And if you do not understand how this is done, you may face two major problems:
* Developers won’t accept your sayings.
* You do not understand challenges and needs of developers.
* **Have a side project**: The purpose of this is to try out new technologies and tools to find out how development is done today and in the future. Experience is the combination of observations, emotions and hypothesis (“Experience and Knowledge Management in Software Engineering” by Kurt Schneider). Reading a tutorial or some pros and cons is good. But this is just “book knowledge”. Only if you try out things by yourself you can experience emotions and can built up hypothesis about why something is good or bad. And the longer you work with a technology the better your hypothesis will get. This will help you to take better decisions in your day to day work. As I started programming I had no code completion and only some utility libraries to speed up development. Obviously, with this background I would make wrong decisions today. Today, we have tons of programming languages, frameworks, tools, processes and practices. Only if you have some experience and a rough overview in the major trends you are able to take part of the conversation and to steer development into the right direction.
* **Find the right things to try out**: You cannot try out everything. This is simply impossible. You need a more structured approach. One source I recently discovered is the [Technology Radar](https://www.thoughtworks.com/radar) from ThoughtWorks. They categorize technologies, tools, platforms, languages and frameworks into four categories:
* Adopt: “strong feeling to be ready for enterprise usage”.
* Trial: “enterprise should try it in one project that can handle the risk”.
* Assess: “explore how it affects your enterprise”
* Hold: “process with caution”.
With this categorization it is easier to get an overview of new things and their readiness to better evaluate which trend to explore next.

@ -0,0 +1,8 @@
# Documentation
Architectural documentation is sometimes more and sometimes less important. Important documents are for example architectural decisions or code guidelines. Initial documentation is often required before coding starts and need to be refined continuously. Other documentation can be automatically generated as code can also be documentation, e.g. UML class diagrams.
* **Clean Code**: Code is the best documentation if done right. A good architect should be capable to distinguish between good and bad code. A really great resource to learn more about good and bad code is the book “Clean Code” by Robert C. Martin.
* **Generate documentation where possible**: Systems are changing quickly and it is hard to update the documentation. Whether it is about APIs or system landscapes in form of CMDBs (Configuration management database): The underlying information often changes too fast to keep the corresponding documentation up to date by hand. Example: For APIs you could auto generate documentation based on the definition file if you are model driven, or directly from the source code. A lot of tools exist for that, I think Swagger and RAML are a good starting point to learn more.
* **As much as necessary, as little as possible**: Whatever you need to document, e.g., decision papers, try to focus on only one thing at a time and include only the necessary information for this one thing. Extensive documentation is hard to read and to understand. Additional information should be stored in the appendix. Especially for decision papers it is more important to tell a convincing story instead of just throwing tons of arguments. Further, this saves you and your co-workers, who have to read it, a lot of time. Have a look at some documentation you have done in the past (source code, models, decision papers, etc.) and ask yourself the following questions: “Are all necessary information included to understand it?”, “Which information are really required and which could be omitted?” and “Does the documentation has a red line?”.
* **Learn more about architecture frameworks**: This point could be applied to all other “technical” points as well. I put it here, as frameworks like TOGAF or Zachmann are providing “tools” which feel heavy on the documentation side, although their added value is not limited to documentation. Getting certified in such a framework teaches you to tackle architecture more systematically.

@ -0,0 +1,10 @@
# Communication
From my observations this is one of the most underestimated skill. If you are brilliant in design but cannot communicate your ideas, your thoughts are likely to have less impact or even fail to succeed.
* **Learn how to communicate your ideas**: When collaborating on a board or flip chart, it is essential to know how to use it properly in order to structure you and your peers’ thoughts. I found the book “UZMOThinking With Your Pen” to be a good resource to enhance my skills in this area. As an architect you usually do not only participating in a meeting, usually you need to drive the meeting and to moderate it.
* **Give talks to large groups**: Presenting your ideas to a small or large group should be doable for you. If you feel uncomfortable with this, start presenting to your best friend. Enlarge the group slowly. This is something which you can only learn by doing and by leaving your personal comfort zone. Be patient with yourself, this process may take some time.
* **Find the right level of communication**: Different stakeholders have different interests and views. They need to be addressed individually on their level. Before you communicate, step back and check if the information you want to share have the right level, regarding abstractness, content, goals, motivations, etc. Example: A developer is usually interested in the very little detail of the solution, whereas a manager prefers to know which option saves most money.
* **Communicate often**: A brilliant architecture is worthless if nobody knows about it. Distribute the target architecture and the thoughts behind it, regularly and on every organizational level. Schedule meetings with developers, architects and managers to show them the desired or defined way.
* **Be transparent**: Regular communication mitigates missing transparency only partially. You need to make the reason behind decisions transparent. Especially, if people are not involved in the decision-making process it is hard to understand and to follow the decision and rationale behind it.
* **Be always prepared to give a presentation**: There is always someone with questions and you want to give the right answers immediately. Try to always have the most important slides in a consolidated set which you can show and explain. It saves you a lot of time and it gives security to yourself.

@ -0,0 +1,8 @@
# Estimate and Evaluate
* **Know basic project management principles**: As architect or lead developer you are often asked for estimates to realize your ideas: How long, how much, how many people, which skills, etc.? Of course, if you plan to introduce new tools or frameworks you need to have an answer for these kind of “management” questions. Initially, you should be able to give a rough estimate, like days, months or years. And do not forget that it is not only about implementing, there are more activities to consider, like requirements engineering, testing and fixing bugs. Therefore, you should know the activities the used software development process. One thing you can apply to get better estimates, is to use past data and derive your prediction from that. If you do not have past data, you can also try approaches such as COCOMO by Barry W. Boehm. If you are deployed in an agile project, learn how to estimate and to plan properly: The book “Agile Estimating and Planning” by Mike Cohn provides a solid overview in this area.
* **Evaluate “unknown” architecture**: As architect you should also be able to evaluate the suitability of architectures for the current or future context(s). This is not an easy task but you can prepare for it by having a set of questions at hand which are common for every architecture. And it’s not only about architecture but also about how the system is managed, as this also gives you insights about the quality. I suggest to always have some questions prepared and ready to use. Some ideas for general questions:
* Design practices: Which patterns does the architecture follow? Are they consequently and correctly used? Does the design follow a red line or is there an uncontrolled growth? Is there a clear structure and separation of concerns?
* Development practices: Code guidelines in place and followed? How is the code versioned? Deployment practices?
* Quality assurance: Test automation coverage? Static code analysis in place and good results? Peer reviews in place?
* Security: Which security concepts are in place? Built-in security? Penetration tests or automated security analysis tools in place and regularly used?

@ -0,0 +1,7 @@
# Balance
* **Quality comes at a price**: Earlier I talked about quality and non-functional requirements. If you overdo architecture it will increase costs and probably lower speed of development. You need to balance architectural and functional requirements. Over engineering should be avoided.
* **Solve contradicting goals**: A classic example of contradicting goals are short- and long-term goals. Projects often tend to build the simplest solution whereas an architect has the long-term vision in mind. Often, the simple solution does not fit into the long-term solution and is at risk to be thrown away later (sunk costs). To avoid implementation into the wrong direction, two things need to be considered:
1. Developers and business need to understand the long term vision and their benefits in order to adapt their solution and
2. managers who are responsible for budget need to be involved to understand the financial impact. It is not necessary to have 100% of the long term vision in place directly, but the developed piece should fit into it.
* **Conflict management**: Architects are often the glue between multiple groups with different backgrounds. This may lead to conflicts on different levels of communication. To find a balanced solution which also reflect long-term, strategic goals, it is often the role of architects to help overcome the conflict. My starting point regarding communication theory was the “Four-Ears Model” of Schulze von Thun. Based on this model a lot can be shown and deducted. But this theory needs some practice, which should be experienced during communication seminars.

@ -0,0 +1,7 @@
# Consult and Coach
Being pro-active is probably the best you can do when it comes to consulting and coaching. If you are asked, it is often too late. And cleaning up on the architecture site is something which you want to avoid. You need to somehow foresee the next weeks, months or even years and prepare yourself and the organization for the next steps.
* **Have a vision**: If you are deployed in a project, whether it is a traditional waterfall like approach or agile, you always need to have a vision of your mid- and long-term goals you want to achieve. This is not a detailed concept, but more a road-map towards everyone can work. As you cannot achieve everything at once (it is a journey) I prefer to use maturity models. They give a clear structure which can be easily consumed and give the current status of progress at every time. For different aspects I use different models, e.g. development practices or continuous delivery. Every level in the maturity model has clear requirements which follow the SMART criteria in order to ease measuring if you have achieved it or not. One nice example I found is for continues delivery.
* **Build a community of practice (CoP)**: Exchanging experience and knowledge among a common interest group helps distributing ideas and standardizing approaches. For example you could gather all JavaScript developer and architects in one room, every three months or so, and discuss past and current challenges and how they were tackled or new methodologies and approaches. Architects can share, discuss and align their visions, developers can share experience and learn from their peers. Such a round can be highly beneficial for the enterprise but also for the individual itself, as it helps building a stronger network and distributes ideas. Also check out the article Communities of Practice from the SAFe Framework which explains the CoP concept in an agile setting.
* **Conduct open door sessions**: One source of misconceptions or ambiguity is lack of communication. Block a fixed time slot, e.g. 30 min every week, for exchanging hot topics with your peers. This session has no agenda everything can be discussed. Try to solve minor things on the spot. Schedule follow-ups on the more complex topics.

@ -0,0 +1,10 @@
# Marketing Skills
Your ideas are great and you have communicated them well but still nobody wants to follow? Then you probably lack marketing skills.
* **Motivate and convince**: How do companies convince you of buying a product? They demonstrate its value and benefits. But not just with 5 bullet points. They wrap it nicely and make it as easy as possible to digest.
* Prototypes: Show a prototype of your idea. There are plenty of tools for creating prototypes. In the context of enterprises who love SAP check out build.me in which you can create nice looking and clickable UI5 apps fast and easy.
* Show a video: Instead of “boring slides” you can also show a video which demonstrates your idea or at least the direction. But please, don’t overdo marketing: In the long term, content is king. If your words do not come true, this will damage your reputation in the long term.
* **Fight for your ideas and be persistent**: People sometime do not like your ideas or they are just too lazy to follow them. If you are really convinced by your ideas, you should continuously go after them and “fight”. This is sometimes necessary. Architecture decisions with long term goals are often not the easiest one’s: Developers do not like them, as they are more complex to develop. Managers do not like them, as they are more expensive in the short term. This is your job to be persistent and to negotiate.
* **Find allies**: Establishing or enforcing your ideas on your own can be hard or even impossible. Try to find allies who can support and help convincing others. Use your network. If you do not have one yet, start building it now. You could start by talking to your (open-minded) peers about your ideas. If they like it, or at least parts of it, it is likely that they support your idea if asked by others (“The idea by X was interesting.”). If they don’t like it, ask for the why: Maybe you have missed something? Or your story is not convincing enough? Next step is to find allies with decision power. Ask for an open-minded discussion. If you fear the discussion, remember that sometimes you need to leave your comfort zone.
* **Repeat It, Believe It**: “[…] studies show that repeated exposure to an opinion makes people believe the opinion is more prevalent, even if the source of that opinion is only a single person.” (Source: The Financial Brand) If you publish few messages often enough, it can help to convince people more easily. But be aware: From my perspective such a strategy should be used wisely as it could backfire as a lousy marketing trick.

@ -0,0 +1,14 @@
# Important Skills
To support the laid-out activities specific skills are required. From my experience, read books and discussions we can boil this down to these ten skills every software architect should have:
* Design
* Decide
* Simplify
* Code
* Document
* Communicate
* Estimate
* Balance
* Consult
* Market

@ -0,0 +1,17 @@
<DedicatedRoadmap
href='/python'
title='Python Roadmap'
description='Click to check the detailed Python Roadmap.'
/>
# Python
Python is a multi-paradigm language. Being an interpreted language, code is executed as soon as it is written and the Python syntax allows for writing code in functional, procedural or object-oriented programmatic ways. Python is frequently recommended as the first language new coders should learn, because of its focus on readability, consistency, and ease of use. This comes with some downsides, as the language is not especially performant in most production tasks.
<ResourceGroupTitle>Free Content</ResourceGroupTitle>
<BadgeLink colorScheme='blue' badgeText='Official Website' href='https://www.python.org/'>Python Website</BadgeLink>
<BadgeLink colorScheme='yellow' badgeText='Read' href='https://www.python.org/about/gettingstarted/'>Python Getting Started</BadgeLink>
<BadgeLink colorScheme='yellow' badgeText='Read' href='https://automatetheboringstuff.com/'>Automate the Boring Stuff</BadgeLink>
<BadgeLink badgeText='Course' colorScheme='green' href='https://www.w3schools.com/python/'>W3Schools - Python Tutorial </BadgeLink>
<BadgeLink badgeText='Course' colorScheme='green' href='https://ehmatthes.github.io/pcc/'>Python Crash Course</BadgeLink>
<BadgeLink badgeText='Course' colorScheme='green' href='https://www.codecademy.com/learn/learn-python-3'>Codecademy - Learn Python 3</BadgeLink>

@ -0,0 +1,8 @@
# Ruby
Ruby is a high-level, interpreted programming language that blends Perl, Smalltalk, Eiffel, Ada, and Lisp. Ruby focuses on simplicity and productivity along with a syntax that reads and writes naturally. Ruby supports procedural, object-oriented and functional programming and is dynamically typed.
<ResourceGroupTitle>Free Content</ResourceGroupTitle>
<BadgeLink colorScheme='blue' badgeText='Official Website' href='https://www.ruby-lang.org/en/'>Ruby Website</BadgeLink>
<BadgeLink badgeText='Course' colorScheme='green' href='https://www.ruby-lang.org/en/documentation/quickstart/'>Learn Ruby in 20 minutes</BadgeLink>
<BadgeLink badgeText='Course' colorScheme='green' href='https://www.codecademy.com/learn/learn-ruby'>Learn Ruby | Codecademy</BadgeLink>

@ -0,0 +1,17 @@
<DedicatedRoadmap
href='/golang'
title='Go Roadmap'
description='Click to check the detailed Go Roadmap.'
/>
# Go
Go is an open source programming language supported by Google. Go can be used to write cloud services, CLI tools, used for API development, and much more.
<ResourceGroupTitle>Free Content</ResourceGroupTitle>
<BadgeLink badgeText='Read' colorScheme="yellow" href='https://go.dev/tour/welcome/1'>A Tour of Go – Go Basics</BadgeLink>
<BadgeLink badgeText='Read' colorScheme="yellow" href='https://go.dev/doc/'>Go Reference Documentation</BadgeLink>
<BadgeLink badgeText='Read' colorScheme="yellow" href='https://gobyexample.com/'>Go by Example - annotated example programs</BadgeLink>
<BadgeLink colorScheme='green' badgeText='Course' href='https://www.codecademy.com/learn/learn-go'>Learn Go | Codecademy</BadgeLink>
<BadgeLink colorScheme='green' badgeText='Course' href='https://www.w3schools.com/go/'>W3Schools Go Tutorial </BadgeLink>

@ -0,0 +1,32 @@
<DedicatedRoadmap
href='/javascript'
title='JavaScript Roadmap'
description='Click to check the detailed JavaScript Roadmap.'
/>
# JavaScript
JavaScript allows you to add interactivity to your pages. Common examples that you may have seen on the websites are sliders, click interactions, popups and so on. Apart from being used on the frontend in browsers, there is Node.js which is an open-source, cross-platform, back-end JavaScript runtime environment that runs on the V8 engine and executes JavaScript code outside a web browser.
<ResourceGroupTitle>Free Content</ResourceGroupTitle>
<BadgeLink badgeText='Read' colorScheme="yellow" href='https://www.w3schools.com/js/'>W3Schools – JavaScript Tutorial</BadgeLink>
<BadgeLink badgeText='Read' colorScheme="yellow" href='https://javascript.info/'>The Modern JavaScript Tutorial</BadgeLink>
<BadgeLink badgeText='Course' colorScheme='green' href='https://www.codecademy.com/learn/introduction-to-javascript'>Codecademy - Learn JavaScript</BadgeLink>
<BadgeLink badgeText='Watch' href='https://youtu.be/hdI2bqOjy3c'>JavaScript Crash Course for Beginners</BadgeLink>
<BadgeLink badgeText='Watch' href='https://www.youtube.com/watch?v=fBNz5xF-Kx4'>Node.js Crash Course</BadgeLink>
<BadgeLink badgeText='Watch' href='https://www.youtube.com/watch?v=TlB_eWDSMt4'>Node.js Tutorial for Beginners</BadgeLink>
# TypeScript
TypeScript is a strongly typed programming language that builds on JavaScript, giving you better tooling at any scale.
<ResourceGroupTitle>Free Resources</ResourceGroupTitle>
<BadgeLink colorScheme='blue' badgeText='Official Website' href='https://www.typescriptlang.org/'>Official Website</BadgeLink>
<BadgeLink colorScheme='blue' badgeText='Official Docs' href='https://www.typescriptlang.org/docs/'>Official Docs for Deep Dives</BadgeLink>
<BadgeLink colorScheme='blue' badgeText='Official Handbook' href='https://www.typescriptlang.org/docs/handbook/intro.html'>The TypeScript Handbook</BadgeLink>
<BadgeLink colorScheme='yellow' badgeText='Read' href='https://www.tutorialspoint.com/typescript/index.htm'>TypeScript Tutorial</BadgeLink>
<BadgeLink colorScheme='green' badgeText='Course' href='https://scrimba.com/learn/typescript'>Scrimba — TypeScript Basics</BadgeLink>
<BadgeLink badgeText='Watch' href='https://www.youtube.com/watch?v=BwuLxPH8IDs'>TypeScript for Beginners</BadgeLink>

@ -0,0 +1,14 @@
# .NET Framework
.NET is an open-source platform with tools and libraries for building web, mobile, desktop, games, IoT, cloud, and microservices.
Officially supported languages in .NET: C#, F#, Visual Basic.
<ResourceGroupTitle>Free Content</ResourceGroupTitle>
<BadgeLink colorScheme='blue' badgeText='Official Website' href='https://dotnet.microsoft.com/en-us/'>.NET Website</BadgeLink>
<BadgeLink colorScheme='yellow' badgeText='Read' href='https://dotnet.microsoft.com/en-us/learn/dotnet/what-is-dotnet'>What is .NET?</BadgeLink>
<BadgeLink colorScheme='yellow' badgeText='Read' href='https://dotnet.microsoft.com/en-us/platform/why-choose-dotnet'>Why Choose .NET?</BadgeLink>
<BadgeLink colorScheme='blue' badgeText='Official Docs' href='https://learn.microsoft.com/en-us/dotnet/csharp/?WT.mc_id=dotnet-35129-website'>C# Documentation</BadgeLink>
<BadgeLink colorScheme='blue' badgeText='Official Docs' href='https://learn.microsoft.com/en-us/dotnet/fsharp/?WT.mc_id=dotnet-35129-website'>F# Documentation</BadgeLink>
<BadgeLink colorScheme='blue' badgeText='Official Docs' href='https://learn.microsoft.com/en-us/dotnet/visual-basic/?WT.mc_id=dotnet-35129-website'>Visual Basic Documentation</BadgeLink>

@ -0,0 +1,15 @@
# ACID & CAP Theorem
ACID (Atomicity, Consistency, Isolation, Durability) and CAP (Consistency, Availability, Partition Tolerance) are essential concepts in distributed systems. They are often used to explain the trade-offs between consistency and availability.
CAP is an acronym for Consistency, Availability, and Partition Tolerance. According to the CAP theorem, any distributed system can only guarantee two of the three properties at any time. You can't guarantee all three properties at once.
ACID is an acronym that stands for Atomicity, Consistency, Isolation, Durability. ACID is a set of properties of database transactions intended to guarantee validity even in the event of errors, power failures, etc.
<ResourceGroupTitle>Free Content</ResourceGroupTitle>
<BadgeLink colorScheme='yellow' badgeText='Read' href='https://www.bmc.com/blogs/cap-theorem/'>What is CAP Theorem?</BadgeLink>
<BadgeLink colorScheme='yellow' badgeText='Read' href='https://en.wikipedia.org/wiki/CAP_theorem'>CAP Theorem - Wikipedia</BadgeLink>
<BadgeLink colorScheme='yellow' badgeText='Read' href='https://mwhittaker.github.io/blog/an_illustrated_proof_of_the_cap_theorem/'>An Illustrated Proof of the CAP Theorem</BadgeLink>
<BadgeLink colorScheme='yellow' badgeText='Read' href='https://www.ibm.com/uk-en/cloud/learn/cap-theorem'>CAP Theorem and it's applications in NoSQL Databases</BadgeLink>
<BadgeLink colorScheme='purple' badgeText='Watch' href='https://www.youtube.com/watch?v=_RbsFXWRZ10'>What is CAP Theorem?</BadgeLink>
<BadgeLink colorScheme='yellow' badgeText='Read' href='https://en.wikipedia.org/wiki/ACID'>ACID - Wikipedia</BadgeLink>

Some files were not shown because too many files have changed in this diff Show More

Loading…
Cancel
Save