├── .gitignore
├── 0-roadmap
├── contributing.md
├── images
│ ├── backend.png
│ ├── devops.png
│ ├── disclaimer.png
│ ├── frontend.png
│ ├── intro.png
│ └── split.png
└── project
│ ├── backend-map.json
│ ├── devops-map.json
│ ├── disclaimer.json
│ ├── frontend-map.json
│ └── intro-map.json
├── 1-introduction
├── 1.01-git-version-control
│ └── git-version-control.md
├── 1.02-basic-terminal-usage
│ └── basic-terminal-usage.md
├── 1.03-data-structures-and-algorithms
│ └── data-structures-and-algorithms.md
├── 1.04-solid-kiss-yagni
│ └── solid-kiss-yagni.md
├── 1.05-github
│ └── github.md
├── 1.06-licenses
│ └── licenses.md
├── 1.07-semantic-versioning
│ └── semantic-versioning.md
├── 1.08-ssh
│ └── ssh.md
├── 1.09-http-https-and-apis
│ └── http-https-and-apis.md
├── 1.10-design-patterns
│ ├── basic-js
│ │ ├── index.js
│ │ ├── inheritance.js
│ │ ├── new-class.js
│ │ └── package.json
│ ├── design-patterns.md
│ ├── implementation-cs
│ │ ├── abstract-factory-js
│ │ │ ├── Button.js
│ │ │ ├── MotifButton.js
│ │ │ ├── MotifWidgetFactory.js
│ │ │ ├── MotifWindow.js
│ │ │ ├── QtButton.js
│ │ │ ├── QtWidgetFactory.js
│ │ │ ├── QtWindow.js
│ │ │ ├── WidgetFactory.js
│ │ │ ├── Window.js
│ │ │ └── client.js
│ │ ├── builder-alt
│ │ │ ├── Address.js
│ │ │ ├── Customer.js
│ │ │ ├── Order.js
│ │ │ ├── OrderBuilder.js
│ │ │ ├── Pizza.js
│ │ │ └── client.js
│ │ ├── builder
│ │ │ ├── Car.js
│ │ │ ├── FerrariBuilder.js
│ │ │ ├── ICarBuilder.js
│ │ │ ├── SportsCarBuildDirector.js
│ │ │ └── client.js
│ │ ├── factory-method
│ │ │ ├── Champion.js
│ │ │ ├── ChampionFactory.js
│ │ │ ├── MarksmanChampion.js
│ │ │ ├── SupportChampion.js
│ │ │ └── client.js
│ │ ├── package.json
│ │ ├── prototype
│ │ │ ├── DoransBlade.js
│ │ │ ├── DoransRing.js
│ │ │ ├── DoransShield.js
│ │ │ ├── Item.js
│ │ │ ├── ItemFactory.js
│ │ │ └── client.js
│ │ └── singleton
│ │ │ ├── Singleton.js
│ │ │ └── client.js
│ └── implementation-js
│ │ ├── abstract-factory
│ │ ├── Button.js
│ │ ├── MotifButton.js
│ │ ├── MotifWidgetFactory.js
│ │ ├── MotifWindow.js
│ │ ├── QtButton.js
│ │ ├── QtWidgetFactory.js
│ │ ├── QtWindow.js
│ │ ├── WidgetFactory.js
│ │ ├── Window.js
│ │ └── client.js
│ │ ├── builder-alt
│ │ ├── Address.js
│ │ ├── Customer.js
│ │ ├── Order.js
│ │ ├── OrderBuilder.js
│ │ ├── Pizza.js
│ │ └── client.js
│ │ ├── builder
│ │ ├── Car.js
│ │ ├── FerrariBuilder.js
│ │ ├── ICarBuilder.js
│ │ ├── SportsCarBuildDirector.js
│ │ └── client.js
│ │ ├── factory-method
│ │ ├── Champion.js
│ │ ├── ChampionFactory.js
│ │ ├── MarksmanChampion.js
│ │ ├── SupportChampion.js
│ │ └── client.js
│ │ ├── package.json
│ │ ├── prototype
│ │ ├── DoransBlade.js
│ │ ├── DoransRing.js
│ │ ├── DoransShield.js
│ │ ├── Item.js
│ │ ├── ItemFactory.js
│ │ └── client.js
│ │ └── singleton
│ │ ├── Singleton.js
│ │ └── client.js
└── 1.11-character-encodings
│ └── character-encodings.md
├── developer-roadmap.code-workspace
└── readme.md
/.gitignore:
--------------------------------------------------------------------------------
1 | .DS_Store
2 | ._*
3 | Thumbs.db
4 | *.sublime-project
5 | *.sublime-workspace
6 | .idea
--------------------------------------------------------------------------------
/0-roadmap/contributing.md:
--------------------------------------------------------------------------------
1 | ## The Goal
2 | Our goal is not to have the biggest list of everything available out there.
3 | Our goal is to have a list of things that anybody would have to learn if they were to enter the field today.
4 |
5 | ## Contributing
6 |
7 | Your contributions to this repo are always welcome!
8 | Bear in mind, that this repo is *highly opinionated*, *unbiased* and *curated*.
9 | Your opinion on value of any resource may not match the opinion of curator.
10 |
11 | **No PR will be discarded without explanations!**
12 |
13 | ## How are these roadmaps made?
14 |
15 | > Roadmaps are made using [Balsamiq](https://balsamiq.com/download/)
16 |
17 | * Clone the repository
18 | * Open Balsamiq, click Project > Import > Mockup JSON,
19 | * Copy and paste the JSON for the roadmap that you want to update
20 | * Add your changes
21 | * Export the JSON file Project > Export > Mockup to JSON and put it in the project directory
22 | * Export the image Project > Export > Current Mockup to PNG and put it in the images directory
23 | * Commits your changes and open a PR
24 |
25 | ## Guidelines
26 |
27 | -
Adding everything available out there is not the goal!
28 | The roadmaps represents the skillset most valuable today i.e. if you were to enter any of the listed fields today, what would you learn! There might be things that are of-course being used today but prioritize the things that are most in demand today e.g. agreed that lots of people are using angular.js today but you wouldn't want to learn that instead of React, Angular or Vue. Use your critical thinking to filter out non-essential stuff. Give honest arguments for why the resource should be included.
29 | - One item per Pull Request
30 | There may be a discussion related to an item you want to add. Adding just a single item per pull request makes it much easier for everyone involved.
31 | - Write meaningful commit messages
32 | - Look at the existing issues/pull requests before opening new ones
33 |
--------------------------------------------------------------------------------
/0-roadmap/images/backend.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/evertonbaima/developer-roadmap/c1e807586780fed21b66ae789e46524cc4022733/0-roadmap/images/backend.png
--------------------------------------------------------------------------------
/0-roadmap/images/devops.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/evertonbaima/developer-roadmap/c1e807586780fed21b66ae789e46524cc4022733/0-roadmap/images/devops.png
--------------------------------------------------------------------------------
/0-roadmap/images/disclaimer.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/evertonbaima/developer-roadmap/c1e807586780fed21b66ae789e46524cc4022733/0-roadmap/images/disclaimer.png
--------------------------------------------------------------------------------
/0-roadmap/images/frontend.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/evertonbaima/developer-roadmap/c1e807586780fed21b66ae789e46524cc4022733/0-roadmap/images/frontend.png
--------------------------------------------------------------------------------
/0-roadmap/images/intro.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/evertonbaima/developer-roadmap/c1e807586780fed21b66ae789e46524cc4022733/0-roadmap/images/intro.png
--------------------------------------------------------------------------------
/0-roadmap/images/split.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/evertonbaima/developer-roadmap/c1e807586780fed21b66ae789e46524cc4022733/0-roadmap/images/split.png
--------------------------------------------------------------------------------
/0-roadmap/project/backend-map.json:
--------------------------------------------------------------------------------
1 | {"mockup":{"controls":{"control":[{"ID":"0","h":"109","measuredH":"108","measuredW":"124","properties":{"color":"2848996","curvature":"-1","direction":"bottom","leftArrow":"false","p0":{"x":0,"y":108},"p1":{"x":0.4770542904147545,"y":0.2455190925621266},"p2":{"x":124,"y":1},"rightArrow":"false","shape":"bezier","stroke":"solid","text":""},"typeID":"Arrow","w":"125","x":"629","y":"3227","zOrder":"0"},{"ID":"1","h":"43","measuredH":"42","measuredW":"187","properties":{"color":"2848996","curvature":"0","direction":"bottom","leftArrow":"false","p0":{"x":187,"y":0},"p1":{"x":0.45751633986928103,"y":-0.003267973856209196},"p2":{"x":0,"y":42},"rightArrow":"false","shape":"bezier","stroke":"dotted","text":""},"typeID":"Arrow","w":"188","x":"577","y":"3054","zOrder":"1"},{"ID":"2","h":"18","measuredH":"17","measuredW":"199","properties":{"color":"2848996","curvature":"0","direction":"bottom","leftArrow":"false","p0":{"length":199,"x":199,"y":0},"p1":{"length":0.4575280110556166,"x":0.4575163398692811,"y":-0.003267973856209203},"p2":{"length":17,"x":0,"y":17},"rightArrow":"false","shape":"bezier","stroke":"dotted","text":""},"typeID":"Arrow","w":"200","x":"577","y":"3042","zOrder":"2"},{"ID":"3","h":"8","measuredH":"7","measuredW":"229","properties":{"color":"2848996","curvature":"0","direction":"top","leftArrow":"false","p0":{"length":229.10696191953664,"x":229,"y":7},"p1":{"length":0.4575280110556166,"x":0.4575163398692811,"y":-0.0032679738562092003},"p2":{"length":0,"x":0,"y":0},"rightArrow":"false","shape":"bezier","stroke":"dotted","text":""},"typeID":"Arrow","w":"230","x":"569","y":"3026","zOrder":"3"},{"ID":"4","h":"32","measuredH":"31","measuredW":"212","properties":{"color":"2848996","curvature":"0","direction":"top","leftArrow":"false","p0":{"length":214.2545215392198,"x":212,"y":31},"p1":{"length":0.4575280110556167,"x":0.4575163398692812,"y":-0.003267973856209213},"p2":{"length":0,"x":0,"y":0},"rightArrow":"false","shape":"bezier","stroke":"dotted","text":""},"typeID":"Arrow","w":"213","x":"576","y":"2992","zOrder":"4"},{"ID":"5","h":"91","measuredH":"90","measuredW":"97","properties":{"color":"2848996","curvature":"-1","direction":"top","leftArrow":"false","p0":{"length":1,"x":1,"y":0},"p1":{"length":0.5311393716427282,"x":0.47054747054747054,"y":-0.24636174636174635},"p2":{"length":132.32157798333574,"x":97,"y":90},"rightArrow":"false","shape":"bezier","stroke":"solid","text":""},"typeID":"Arrow","w":"98","x":"659","y":"2855","zOrder":"5"},{"ID":"6","h":"13","measuredH":"12","measuredW":"208","properties":{"color":"2848996","curvature":"0","direction":"top","leftArrow":"false","p0":{"length":208.34586628968668,"x":208,"y":12},"p1":{"length":0.42287307048293654,"x":0.4228667507356033,"y":0.002311895754518708},"p2":{"length":0,"x":0,"y":0},"rightArrow":"false","shape":"bezier","stroke":"dotted","text":""},"typeID":"Arrow","w":"209","x":"565","y":"2491","zOrder":"6"},{"ID":"7","h":"13","measuredH":"12","measuredW":"206","properties":{"color":"2848996","curvature":"0","direction":"bottom","leftArrow":"false","p0":{"length":206,"x":206,"y":0},"p1":{"length":0.4228730704829363,"x":0.4228667507356031,"y":0.002311895754518704},"p2":{"length":12,"x":0,"y":12},"rightArrow":"false","shape":"bezier","stroke":"dotted","text":""},"typeID":"Arrow","w":"207","x":"577","y":"2513","zOrder":"7"},{"ID":"8","h":"49","measuredH":"48","measuredW":"207","properties":{"color":"2848996","curvature":"0","direction":"bottom","leftArrow":"false","p0":{"length":207,"x":207,"y":0},"p1":{"length":0.4228730704829362,"x":0.422866750735603,"y":0.0023118957545186923},"p2":{"length":48,"x":0,"y":48},"rightArrow":"false","shape":"bezier","stroke":"dotted","text":""},"typeID":"Arrow","w":"208","x":"581","y":"2515","zOrder":"8"},{"ID":"9","h":"46","measuredH":"45","measuredW":"199","properties":{"color":"2848996","curvature":"0","direction":"top","leftArrow":"false","p0":{"length":204.0245083317198,"x":199,"y":45},"p1":{"length":0.4228730704829365,"x":0.42286675073560326,"y":0.0023118957545186824},"p2":{"length":0,"x":0,"y":0},"rightArrow":"false","shape":"bezier","stroke":"dotted","text":""},"typeID":"Arrow","w":"200","x":"585","y":"2453","zOrder":"9"},{"ID":"10","h":"72","measuredH":"71","measuredW":"183","properties":{"color":"2848996","curvature":"0","direction":"top","leftArrow":"false","p0":{"length":196.29060089571277,"x":183,"y":71},"p1":{"length":0.4228730704829365,"x":0.42286675073560326,"y":0.002311895754518694},"p2":{"length":0,"x":0,"y":0},"rightArrow":"false","shape":"bezier","stroke":"dotted","text":""},"typeID":"Arrow","w":"184","x":"591","y":"2417","zOrder":"10"},{"ID":"11","h":"16","measuredH":"15","measuredW":"161","properties":{"color":"2848996","curvature":"0","direction":"top","leftArrow":"false","p0":{"length":161.69724796668618,"x":161,"y":15},"p1":{"length":0.45752801105561647,"x":0.457516339869281,"y":-0.0032679738562091465},"p2":{"length":0,"x":0,"y":0},"rightArrow":"false","shape":"bezier","stroke":"dotted","text":""},"typeID":"Arrow","w":"162","x":"747","y":"2844","zOrder":"11"},{"ID":"12","h":"10","measuredH":"9","measuredW":"161","properties":{"color":"2848996","curvature":"0","direction":"bottom","leftArrow":"false","p0":{"length":161,"x":161,"y":0},"p1":{"length":0.4575280110556166,"x":0.4575163398692811,"y":-0.003267973856209141},"p2":{"length":9,"x":0,"y":9},"rightArrow":"false","shape":"bezier","stroke":"dotted","text":""},"typeID":"Arrow","w":"162","x":"747","y":"2823","zOrder":"12"},{"ID":"13","h":"29","measuredH":"28","measuredW":"148","properties":{"color":"2848996","curvature":"0","direction":"bottom","leftArrow":"false","p0":{"length":148,"x":148,"y":0},"p1":{"length":0.4575280110556166,"x":0.4575163398692811,"y":-0.003267973856209201},"p2":{"length":28,"x":0,"y":28},"rightArrow":"false","shape":"bezier","stroke":"dotted","text":""},"typeID":"Arrow","w":"149","x":"744","y":"2789","zOrder":"13"},{"ID":"14","h":"5","measuredH":"4","measuredW":"157","properties":{"color":"2848996","curvature":"0","direction":"top","leftArrow":"false","p0":{"length":157.05094714773293,"x":157,"y":4},"p1":{"length":0.4736507882897012,"x":0.47363590855998666,"y":-0.003754380110128481},"p2":{"length":0,"x":0,"y":0},"rightArrow":"false","shape":"bezier","stroke":"dotted","text":""},"typeID":"Arrow","w":"158","x":"748","y":"2694","zOrder":"14"},{"ID":"15","h":"19","measuredH":"18","measuredW":"168","properties":{"color":"2848996","curvature":"0","direction":"bottom","leftArrow":"false","p0":{"length":168,"x":168,"y":0},"p1":{"length":0.4228730704829364,"x":0.4228667507356032,"y":0.0023118957545187053},"p2":{"length":18,"x":0,"y":18},"rightArrow":"false","shape":"bezier","stroke":"dotted","text":""},"typeID":"Arrow","w":"169","x":"728","y":"2665","zOrder":"15"},{"ID":"16","h":"45","measuredH":"44","measuredW":"373","properties":{"color":"2848996","curvature":"1","direction":"top","leftArrow":"false","p0":{"x":373,"y":10},"p1":{"x":0.5494401310071896,"y":0.10588311343182814},"p2":{"x":0,"y":0},"rightArrow":"false","shape":"bezier","stroke":"dotted","text":""},"typeID":"Arrow","w":"374","x":"387","y":"2302","zOrder":"16"},{"ID":"17","h":"14","measuredH":"13","measuredW":"142","properties":{"color":"2848996","curvature":"0","direction":"top","leftArrow":"false","p0":{"x":142,"y":13},"p1":{"x":0.535877637338317,"y":-0.007278807849309005},"p2":{"x":0,"y":0},"rightArrow":"false","shape":"bezier","stroke":"dotted","text":""},"typeID":"Arrow","w":"143","x":"622","y":"2273","zOrder":"17"},{"ID":"18","h":"12","measuredH":"11","measuredW":"162","properties":{"color":"2848996","curvature":"0","direction":"bottom","leftArrow":"false","p0":{"x":162,"y":0},"p1":{"x":0.4910385289593246,"y":0.0004292920259006189},"p2":{"x":0,"y":11},"rightArrow":"false","shape":"bezier","stroke":"dotted","text":""},"typeID":"Arrow","w":"163","x":"613","y":"2295","zOrder":"18"},{"ID":"19","h":"95","measuredH":"94","measuredW":"73","properties":{"color":"2848996","curvature":"1","direction":"bottom","leftArrow":"false","p0":{"x":0,"y":94},"p1":{"x":0.4552770914225203,"y":-0.1889869396399577},"p2":{"x":73,"y":0},"rightArrow":"false","shape":"bezier","stroke":"solid","text":""},"typeID":"Arrow","w":"74","x":"739","y":"2544","zOrder":"19"},{"ID":"20","h":"103","measuredH":"102","measuredW":"106","properties":{"color":"2848996","curvature":"-1","direction":"top","leftArrow":"false","p0":{"x":106,"y":102},"p1":{"x":0.3841414944356122,"y":-0.11426868044515104},"p2":{"x":0,"y":0},"rightArrow":"false","shape":"bezier","stroke":"solid","text":""},"typeID":"Arrow","w":"107","x":"692","y":"2155","zOrder":"20"},{"ID":"21","h":"13","measuredH":"12","measuredW":"214","properties":{"color":"2848996","curvature":"1","direction":"top","leftArrow":"false","p0":{"x":214,"y":8},"p1":{"x":0.5140765687406936,"y":0.03859053397720475},"p2":{"x":0,"y":0},"rightArrow":"false","shape":"bezier","stroke":"dotted"},"typeID":"Arrow","w":"215","x":"683","y":"2151","zOrder":"21"},{"ID":"22","h":"101","measuredH":"70","measuredW":"100","properties":{"color":"16777215"},"typeID":"Canvas","w":"591","x":"793","y":"2109","zOrder":"22"},{"ID":"23","h":"6","measuredH":"5","measuredW":"86","properties":{"color":"2848996","curvature":"-1","direction":"bottom","leftArrow":"false","p0":{"x":86,"y":0},"p1":{"x":0.5140765687406935,"y":0.03859053397720476},"p2":{"x":0,"y":4},"rightArrow":"false","shape":"bezier","stroke":"dotted"},"typeID":"Arrow","w":"87","x":"717","y":"1922","zOrder":"23"},{"ID":"24","h":"56","measuredH":"55","measuredW":"68","properties":{"color":"2848996","curvature":"-1","direction":"bottom","leftArrow":"false","p0":{"x":68,"y":0},"p1":{"x":0.4585501858736059,"y":0.14888475836431225},"p2":{"x":0,"y":55},"rightArrow":"false","shape":"bezier","stroke":"solid","text":""},"typeID":"Arrow","w":"69","x":"721","y":"1842","zOrder":"24"},{"ID":"25","h":"10","measuredH":"9","measuredW":"85","properties":{"color":"2848996","curvature":"1","direction":"top","leftArrow":"false","p0":{"x":85,"y":9},"p1":{"x":0.5140765687406935,"y":0.03859053397720475},"p2":{"x":0,"y":0},"rightArrow":"false","shape":"bezier","stroke":"dotted"},"typeID":"Arrow","w":"86","x":"715","y":"1801","zOrder":"25"},{"ID":"26","h":"59","measuredH":"58","measuredW":"86","properties":{"color":"2848996","curvature":"-1","direction":"top","leftArrow":"false","p0":{"length":0,"x":0,"y":0},"p1":{"length":0.4713955797207152,"x":0.4275092936802974,"y":-0.1986192246415295},"p2":{"length":103.73041983911952,"x":86,"y":58},"rightArrow":"false","shape":"bezier","stroke":"solid","text":""},"typeID":"Arrow","w":"87","x":"716","y":"1682","zOrder":"26"},{"ID":"27","h":"2","measuredH":"1","measuredW":"71","properties":{"color":"2848996","curvature":"0","direction":"bottom","leftArrow":"false","p0":{"x":0,"y":1},"p1":{"x":0.5210234034113447,"y":-0.007338357794525982},"p2":{"x":71,"y":0},"rightArrow":"false","shape":"bezier","stroke":"solid","text":""},"typeID":"Arrow","w":"72","x":"727","y":"1610","zOrder":"27"},{"ID":"28","h":"49","measuredH":"48","measuredW":"98","properties":{"color":"2848996","curvature":"1","direction":"top","leftArrow":"false","p0":{"x":98,"y":48},"p1":{"x":0.5140765687406935,"y":0.038590533977204765},"p2":{"x":0,"y":0},"rightArrow":"false","shape":"bezier","stroke":"dotted"},"typeID":"Arrow","w":"99","x":"698","y":"1529","zOrder":"28"},{"ID":"29","h":"75","measuredH":"74","measuredW":"8","properties":{"color":"2848996","curvature":"1","direction":"bottom","leftArrow":"false","p0":{"length":74,"x":0,"y":74},"p1":{"length":0.4140729850293062,"x":0.4104031209362818,"y":-0.05500650195058517},"p2":{"length":8,"x":8,"y":0},"rightArrow":"false","shape":"bezier","stroke":"solid","text":""},"typeID":"Arrow","w":"9","x":"975","y":"1482","zOrder":"29"},{"ID":"30","h":"84","measuredH":"83","measuredW":"8","properties":{"color":"2848996","curvature":"-1","direction":"bottom","leftArrow":"false","p0":{"length":8,"x":8,"y":0},"p1":{"length":0.5155229847842391,"x":0.5140765687406935,"y":0.038590533977204765},"p2":{"length":83,"x":0,"y":83},"rightArrow":"false","shape":"bezier","stroke":"dotted"},"typeID":"Arrow","w":"9","x":"978","y":"1310","zOrder":"30"},{"ID":"31","h":"15","measuredH":"14","measuredW":"100","properties":{"color":"2848996","curvature":"1","direction":"bottom","leftArrow":"false","p0":{"x":0,"y":9},"p1":{"x":0.45184009522864793,"y":-0.09066560857057832},"p2":{"x":100,"y":0},"rightArrow":"false","shape":"bezier","stroke":"solid"},"typeID":"Arrow","w":"101","x":"713","y":"1429","zOrder":"31"},{"ID":"32","h":"92","measuredH":"70","measuredW":"146","properties":{"color":"2848996","curvature":"1","direction":"bottom","leftArrow":"false","p0":{"x":0,"y":91,"length":91},"p1":{"x":0.2998344944382434,"y":-0.051268234479042475,"length":0.3041860547783792},"p2":{"x":133,"y":0,"length":133},"rightArrow":"false","shape":"bezier","stroke":"dotted"},"typeID":"Arrow","w":"134","x":"406","y":"442","zOrder":"32"},{"ID":"33","h":"93","measuredH":"92","measuredW":"67","properties":{"color":"2848996","curvature":"-1","direction":"bottom","leftArrow":"false","p0":{"length":92.04890004774636,"x":3,"y":92},"p1":{"length":0.42540726084496694,"x":0.3850318471337579,"y":0.18089171974522292},"p2":{"length":67,"x":67,"y":0},"rightArrow":"false","shape":"bezier","stroke":"solid"},"typeID":"Arrow","w":"68","x":"512","y":"1129","zOrder":"33"},{"ID":"34","h":"23","measuredH":"22","measuredW":"145","properties":{"color":"2848996","curvature":"1","direction":"bottom","leftArrow":"false","p0":{"x":0,"y":22},"p1":{"x":0.5177460050462573,"y":-0.033389402859545836},"p2":{"x":145,"y":0},"rightArrow":"false","shape":"bezier","stroke":"dotted"},"typeID":"Arrow","w":"146","x":"708","y":"1009","zOrder":"34"},{"ID":"35","h":"123","measuredH":"122","measuredW":"118","properties":{"color":"2848996","curvature":"-1","direction":"bottom","leftArrow":"false","p0":{"x":118,"y":0},"p1":{"x":0.5006130932798996,"y":0.15479857642731107},"p2":{"x":0,"y":122},"rightArrow":"false","shape":"bezier","stroke":"solid"},"typeID":"Arrow","w":"119","x":"686","y":"902","zOrder":"35"},{"ID":"36","h":"53","measuredH":"52","measuredW":"87","properties":{"color":"2848996","curvature":"1","direction":"bottom","leftArrow":"false","p0":{"x":87,"y":0},"p1":{"x":0.4442622950819672,"y":-0.013114754098360656},"p2":{"x":0,"y":52},"rightArrow":"false","shape":"bezier","stroke":"dotted"},"typeID":"Arrow","w":"88","x":"692","y":"883","zOrder":"36"},{"ID":"37","h":"187","measuredH":"186","measuredW":"91","properties":{"color":"2848996","curvature":"-1","direction":"top","leftArrow":"false","p0":{"x":91,"y":186},"p1":{"x":0.4750027536746258,"y":-0.12018259922407568},"p2":{"x":0,"y":0},"rightArrow":"false","shape":"bezier"},"typeID":"Arrow","w":"92","x":"720","y":"651","zOrder":"37"},{"ID":"38","h":"83","measuredH":"82","measuredW":"47","properties":{"color":"2848996","curvature":"-1","direction":"bottom","leftArrow":"false","p0":{"length":82.00609733428362,"x":1,"y":82},"p1":{"length":0.4500179451633659,"x":0.4278136688201293,"y":0.1396123767426046},"p2":{"length":47,"x":47,"y":0},"rightArrow":"false","shape":"bezier","stroke":"dotted"},"typeID":"Arrow","w":"48","x":"407","y":"657","zOrder":"38"},{"ID":"39","h":"165","measuredH":"126","measuredW":"33","properties":{"color":"2848996","curvature":"1","direction":"top","leftArrow":"false","p0":{"x":36,"y":164},"p1":{"x":0.4701515620167028,"y":0.1905351067120322},"p2":{"x":27,"y":0},"rightArrow":"false","shape":"bezier"},"typeID":"Arrow","w":"37","x":"666","y":"441","zOrder":"39"},{"ID":"40","h":"255","measuredH":"254","measuredW":"78","properties":{"color":"2848996","curvature":"-1","direction":"top","leftArrow":"false","p0":{"x":4,"y":0},"p1":{"x":0.46391752577319545,"y":-0.1030927835051546},"p2":{"x":78,"y":254},"rightArrow":"false","shape":"bezier","stroke":"dotted"},"typeID":"Arrow","w":"79","x":"819","y":"292","zOrder":"40"},{"ID":"41","h":"60","measuredH":"33","measuredW":"150","properties":{"color":"2848996","curvature":"-1","direction":"bottom","leftArrow":"false","p0":{"x":0,"y":59,"length":59},"p1":{"x":0.5349434965654775,"y":0.019632173720363407,"length":0.5353036210999189},"p2":{"x":127,"y":0,"length":127},"rightArrow":"false","shape":"bezier","stroke":"dotted"},"typeID":"Arrow","w":"128","x":"407","y":"434","zOrder":"41"},{"ID":"42","h":"61","measuredH":"60","measuredW":"88","properties":{"color":"2848996","curvature":"-1","direction":"top","leftArrow":"false","p0":{"x":88,"y":60,"length":106.50821564555478},"p1":{"x":0.6410437235543018,"y":-0.04019746121297602,"length":0.642302803509632},"p2":{"x":0,"y":0,"length":0},"rightArrow":"false","shape":"bezier","stroke":"dotted","text":""},"typeID":"Arrow","w":"89","x":"917","y":"441","zOrder":"42"},{"ID":"43","h":"20","measuredH":"19","measuredW":"84","properties":{"color":"2848996","curvature":"1","direction":"top","leftArrow":"false","p0":{"x":84,"y":19,"length":86.12200647918046},"p1":{"x":0.4935957934474855,"y":0.02831333423216934,"length":0.49440717248478033},"p2":{"x":0,"y":0,"length":0},"rightArrow":"false","shape":"bezier","stroke":"dotted"},"typeID":"Arrow","w":"85","x":"919","y":"431","zOrder":"43"},{"ID":"44","h":"138","measuredH":"137","measuredW":"140","properties":{"color":"2848996","curvature":"1","direction":"top","leftArrow":"false","p0":{"x":0,"y":2,"length":2},"p1":{"x":0.26833582265545164,"y":0.06426381573775647,"length":0.2759238150891552},"p2":{"x":140,"y":137,"length":195.88006534611938},"rightArrow":"false","shape":"bezier","stroke":"dotted"},"typeID":"Arrow","w":"141","x":"403","y":"260","zOrder":"44"},{"ID":"45","h":"16","measuredH":"15","measuredW":"152","properties":{"color":"2848996","curvature":"-1","direction":"bottom","leftArrow":"false","p0":{"x":0,"y":15,"length":15},"p1":{"x":0.2683358226554517,"y":0.0642638157377565,"length":0.27592381508915526},"p2":{"x":152,"y":2,"length":152.0131573252789},"rightArrow":"false","shape":"bezier","stroke":"dotted"},"typeID":"Arrow","w":"153","x":"392","y":"390","zOrder":"45"},{"ID":"46","h":"60","measuredH":"59","measuredW":"151","properties":{"color":"2848996","curvature":"-1","direction":"bottom","leftArrow":"false","p0":{"x":1,"y":59,"length":59.00847396772772},"p1":{"x":0.2683358226554517,"y":0.06426381573775616,"length":0.2759238150891552},"p2":{"x":151,"y":0,"length":151},"rightArrow":"false","shape":"bezier","stroke":"dotted"},"typeID":"Arrow","w":"152","x":"396","y":"392","zOrder":"46"},{"ID":"47","h":"46","measuredH":"45","measuredW":"151","properties":{"color":"2848996","curvature":"1","direction":"top","leftArrow":"false","p0":{"x":0,"y":5,"length":5},"p1":{"x":0.26833582265545164,"y":0.06426381573775647,"length":0.2759238150891552},"p2":{"x":151,"y":45,"length":157.56268593801008},"rightArrow":"false","shape":"bezier","stroke":"dotted"},"typeID":"Arrow","w":"152","x":"398","y":"351","zOrder":"47"},{"ID":"48","h":"86","measuredH":"85","measuredW":"140","properties":{"color":"2848996","curvature":"1","direction":"top","leftArrow":"false","p0":{"x":0,"y":3,"length":3},"p1":{"x":0.26833582265545164,"y":0.06426381573775647,"length":0.2759238150891552},"p2":{"x":140,"y":85,"length":163.783393541592},"rightArrow":"false","shape":"bezier","stroke":"dotted"},"typeID":"Arrow","w":"141","x":"402","y":"309","zOrder":"48"},{"ID":"49","h":"36","measuredH":"35","measuredW":"76","properties":{"color":"2848996","curvature":"-1","direction":"top","leftArrow":"false","p0":{"x":76,"y":35,"length":83.6719785830358},"p1":{"x":0.4949292958148836,"y":-0.07470361376946151,"length":0.5005353511651633},"p2":{"x":0,"y":0,"length":0},"rightArrow":"false","shape":"bezier","stroke":"dotted"},"typeID":"Arrow","w":"77","x":"924","y":"358","zOrder":"49"},{"ID":"50","h":"101","measuredH":"100","measuredW":"81","properties":{"color":"2848996","curvature":"1","direction":"bottom","leftArrow":"false","p0":{"x":81,"y":1,"length":81.00617260431454},"p1":{"x":0.266776677667767,"y":-0.05445544554455441,"length":0.2722777833333223},"p2":{"x":0,"y":100,"length":100},"rightArrow":"false","shape":"bezier","stroke":"dotted"},"typeID":"Arrow","w":"82","x":"914","y":"253","zOrder":"50"},{"ID":"51","h":"53","measuredH":"52","measuredW":"92","properties":{"color":"2848996","curvature":"1","direction":"bottom","leftArrow":"false","p0":{"x":92,"y":2,"length":92.02173656261873},"p1":{"x":0.321780372126961,"y":-0.08792411528639182,"length":0.33357646489981907},"p2":{"x":0,"y":52,"length":52},"rightArrow":"false","shape":"bezier","stroke":"dotted"},"typeID":"Arrow","w":"93","x":"915","y":"300","zOrder":"51"},{"ID":"52","h":"8","measuredH":"7","measuredW":"73","properties":{"color":"2848996","curvature":"1","direction":"bottom","leftArrow":"false","p0":{"x":73,"y":1,"length":73.00684899377592},"p1":{"x":0.3537744641192917,"y":-0.02907735321528425,"length":0.35496741249429986},"p2":{"x":0,"y":7,"length":7},"rightArrow":"false","shape":"bezier","stroke":"dotted"},"typeID":"Arrow","w":"74","x":"916","y":"345","zOrder":"52"},{"ID":"53","measuredH":"40","measuredW":"146","properties":{"bold":"true","size":"32","text":"Back-end"},"typeID":"Label","x":"598","y":"137","zOrder":"53"},{"ID":"54","h":"71","measuredH":"70","measuredW":"12","properties":{"color":"2848996","curvature":"-1","direction":"top","leftArrow":"false","p0":{"x":6,"y":0,"length":6},"p1":{"x":0.5214417744916817,"y":-0.11497227356746767,"length":0.533966429538699},"p2":{"x":12,"y":70,"length":71.02112361825881},"rightArrow":"false","shape":"bezier","stroke":"dotted"},"typeID":"Arrow","w":"13","x":"663","y":"50","zOrder":"54"},{"ID":"55","measuredH":"32","measuredW":"32","properties":{"color":"10027263","icon":{"ID":"github","size":"medium"}},"typeID":"Icon","x":"955","y":"69","zOrder":"55"},{"ID":"56","measuredH":"25","measuredW":"295","properties":{"bold":"true","color":"10027263","size":"17","text":"kamranahmedse/developer-roadmap"},"typeID":"Label","x":"994","y":"73","zOrder":"56"},{"ID":"57","measuredH":"32","measuredW":"32","properties":{"color":"10027263","icon":{"ID":"twitter","size":"medium"}},"typeID":"Icon","x":"955","y":"115","zOrder":"57"},{"ID":"58","measuredH":"25","measuredW":"133","properties":{"bold":"true","color":"10027263","size":"17","text":"kamranahmedse"},"typeID":"Label","x":"995","y":"120","zOrder":"58"},{"ID":"59","h":"79","measuredH":"78","measuredW":"13","properties":{"color":"2848996","curvature":"1","direction":"top","leftArrow":"false","p0":{"x":0,"y":0,"length":0},"p1":{"x":0.4416543574593796,"y":0.14967996061053668,"length":0.4663289204748396},"p2":{"x":3,"y":78,"length":78.05767098754612},"rightArrow":"false","shape":"bezier"},"typeID":"Arrow","w":"14","x":"702","y":"187","zOrder":"59"},{"ID":"60","h":"71","measuredH":"140","measuredW":"200","properties":{"color":"16776960"},"typeID":"TextArea","w":"400","x":"528","y":"247","zOrder":"60"},{"ID":"61","measuredH":"25","measuredW":"132","properties":{"bold":"true","size":"17","text":"Pick a Language"},"typeID":"Label","x":"576","y":"259","zOrder":"61"},{"ID":"62","measuredH":"24","measuredW":"24","properties":{"color":"10027263","icon":{"ID":"circle","size":"small"}},"typeID":"Icon","x":"542","y":"259","zOrder":"62"},{"ID":"63","measuredH":"21","measuredW":"10","properties":{"bold":"true","color":"16777215","text":"1"},"typeID":"Label","x":"550","y":"261","zOrder":"63"},{"ID":"64","h":"41","measuredH":"140","measuredW":"200","properties":{"color":"16770457"},"typeID":"TextArea","w":"400","x":"528","y":"324","zOrder":"64"},{"ID":"65","measuredH":"25","measuredW":"166","properties":{"bold":"true","size":"17","text":"Scripting Languages"},"typeID":"Label","w":"371","x":"547","y":"332","zOrder":"65"},{"ID":"66","h":"41","measuredH":"140","measuredW":"200","properties":{"color":"16770457","textColor":"16776960"},"typeID":"TextArea","w":"141","x":"989","y":"326","zOrder":"66"},{"ID":"67","measuredH":"25","measuredW":"34","properties":{"bold":"true","size":"17","text":"PHP"},"typeID":"Label","w":"45","x":"1029","y":"335","zOrder":"67"},{"ID":"68","h":"41","measuredH":"140","measuredW":"200","properties":{"color":"16770457","textColor":"16776960"},"typeID":"TextArea","w":"141","x":"989","y":"371","zOrder":"68"},{"ID":"69","measuredH":"25","measuredW":"61","properties":{"bold":"true","size":"17","text":"Node.js"},"typeID":"Label","w":"68","x":"1029","y":"380","zOrder":"69"},{"ID":"70","h":"41","measuredH":"140","measuredW":"200","properties":{"color":"16770457"},"typeID":"TextArea","w":"141","x":"989","y":"281","zOrder":"70"},{"ID":"71","measuredH":"25","measuredW":"40","properties":{"bold":"true","size":"17","text":"Ruby"},"typeID":"Label","w":"45","x":"1029","y":"290","zOrder":"71"},{"ID":"72","h":"41","measuredH":"140","measuredW":"200","properties":{"color":"16770457"},"typeID":"TextArea","w":"141","x":"989","y":"236","zOrder":"72"},{"ID":"73","measuredH":"25","measuredW":"56","properties":{"bold":"true","size":"17","text":"Python"},"typeID":"Label","w":"68","x":"1028","y":"245","zOrder":"73"},{"ID":"74","h":"41","measuredH":"140","measuredW":"200","properties":{"color":"16770457"},"typeID":"TextArea","w":"400","x":"528","y":"371","zOrder":"74"},{"ID":"75","measuredH":"25","measuredW":"177","properties":{"bold":"true","size":"17","text":"Functional Languages"},"typeID":"Label","w":"191","x":"550","y":"379","zOrder":"75"},{"ID":"76","h":"41","measuredH":"140","measuredW":"200","properties":{"color":"16770457","textColor":"16776960"},"typeID":"TextArea","w":"141","x":"272","y":"377","zOrder":"76"},{"ID":"77","measuredH":"25","measuredW":"59","properties":{"bold":"true","size":"17","text":"Clojure"},"typeID":"Label","w":"61","x":"312","y":"386","zOrder":"77"},{"ID":"78","h":"41","measuredH":"140","measuredW":"200","properties":{"color":"16770457","textColor":"16776960"},"typeID":"TextArea","w":"141","x":"272","y":"422","zOrder":"78"},{"ID":"79","measuredH":"25","measuredW":"58","properties":{"bold":"true","size":"17","text":"Haskell"},"typeID":"Label","w":"68","x":"312","y":"431","zOrder":"79"},{"ID":"80","h":"41","measuredH":"140","measuredW":"200","properties":{"color":"16770457"},"typeID":"TextArea","w":"141","x":"272","y":"332","zOrder":"80"},{"ID":"81","measuredH":"25","measuredW":"52","properties":{"bold":"true","size":"17","text":"Erlang"},"typeID":"Label","w":"61","x":"312","y":"341","zOrder":"81"},{"ID":"82","h":"41","measuredH":"140","measuredW":"200","properties":{"color":"16770457"},"typeID":"TextArea","w":"141","x":"272","y":"287","zOrder":"82"},{"ID":"83","measuredH":"25","measuredW":"46","properties":{"bold":"true","size":"17","text":"Scala"},"typeID":"Label","w":"68","x":"311","y":"296","zOrder":"83"},{"ID":"84","h":"41","measuredH":"140","measuredW":"200","properties":{"color":"16770457"},"typeID":"TextArea","w":"400","x":"528","y":"417","zOrder":"84"},{"ID":"85","measuredH":"25","measuredW":"116","properties":{"bold":"true","size":"17","text":"Other Options"},"typeID":"Label","w":"213","x":"550","y":"425","zOrder":"85"},{"ID":"86","h":"41","measuredH":"140","measuredW":"200","properties":{"color":"16770457","text":""},"typeID":"TextArea","w":"141","x":"272","y":"242","zOrder":"86"},{"ID":"87","measuredH":"25","measuredW":"40","properties":{"bold":"true","size":"17","text":"Elixir"},"typeID":"Label","w":"61","x":"312","y":"251","zOrder":"87"},{"ID":"88","h":"41","measuredH":"140","measuredW":"200","properties":{"color":"16770457","textColor":"16776960"},"typeID":"TextArea","w":"141","x":"993","y":"432","zOrder":"88"},{"ID":"89","measuredH":"25","measuredW":"57","properties":{"bold":"true","size":"17","text":"Golang"},"typeID":"Label","w":"68","x":"1033","y":"441","zOrder":"89"},{"ID":"90","h":"41","measuredH":"140","measuredW":"200","properties":{"color":"16770457","textColor":"16776960"},"typeID":"TextArea","w":"141","x":"994","y":"478","zOrder":"90"},{"ID":"91","measuredH":"25","measuredW":"38","properties":{"bold":"true","size":"17","text":"Rust"},"typeID":"Label","w":"68","x":"1034","y":"487","zOrder":"91"},{"ID":"94","h":"41","measuredH":"140","measuredW":"200","properties":{"color":"16770457","textColor":"16776960"},"typeID":"TextArea","w":"141","x":"272","y":"468","zOrder":"92"},{"ID":"95","measuredH":"25","measuredW":"37","properties":{"bold":"true","size":"17","text":"Java"},"typeID":"Label","w":"68","x":"312","y":"477","zOrder":"93"},{"ID":"96","h":"41","measuredH":"140","measuredW":"200","properties":{"color":"16770457","textColor":"16776960"},"typeID":"TextArea","w":"141","x":"273","y":"514","zOrder":"94"},{"ID":"97","measuredH":"25","measuredW":"39","properties":{"bold":"true","size":"17","text":".NET"},"typeID":"Label","w":"47","x":"313","y":"523","zOrder":"95"},{"ID":"98","h":"215","measuredH":"140","measuredW":"200","properties":{"color":"16770457"},"typeID":"TextArea","w":"465","x":"838","y":"546","zOrder":"96"},{"ID":"99","measuredH":"25","measuredW":"413","properties":{"size":"17","text":"For the beginners, if you are just getting into backend"},"typeID":"Label","x":"852","y":"557","zOrder":"97"},{"ID":"100","measuredH":"25","measuredW":"429","properties":{"size":"17","text":"development, I would recommend you to pick one of the"},"typeID":"Label","x":"852","y":"583","zOrder":"98"},{"ID":"101","measuredH":"25","measuredW":"403","properties":{"size":"17","text":"scripting languages. For the quick-and-easy, go with"},"typeID":"Label","x":"852","y":"610","zOrder":"99"},{"ID":"102","measuredH":"25","measuredW":"441","properties":{"size":"17","text":"*Node.js* or *PHP*. If you have already been doing backend,"},"typeID":"Label","x":"852","y":"637","zOrder":"100"},{"ID":"103","measuredH":"25","measuredW":"410","properties":{"size":"17","text":"with some scripting language then don't pick another"},"typeID":"Label","x":"852","y":"665","zOrder":"101"},{"ID":"104","measuredH":"25","measuredW":"416","properties":{"size":"17","text":"scripting language and have a look at Golang, Rust or"},"typeID":"Label","x":"852","y":"691","zOrder":"102"},{"ID":"105","measuredH":"25","measuredW":"393","properties":{"size":"17","text":"Clojure, it will definitely give you a new perspective."},"typeID":"Label","x":"852","y":"720","zOrder":"103"},{"ID":"106","h":"96","measuredH":"140","measuredW":"200","properties":{"color":"16776960"},"typeID":"TextArea","w":"405","x":"366","y":"583","zOrder":"104"},{"ID":"107","measuredH":"25","measuredW":"198","properties":{"bold":"true","size":"17","text":"Practice what you learnt"},"typeID":"Label","x":"412","y":"595","zOrder":"105"},{"ID":"108","measuredH":"24","measuredW":"24","properties":{"color":"10027263","icon":{"ID":"circle","size":"small"}},"typeID":"Icon","x":"378","y":"595","zOrder":"106"},{"ID":"109","measuredH":"21","measuredW":"10","properties":{"bold":"true","color":"16777215","text":"2"},"typeID":"Label","x":"386","y":"597","zOrder":"107"},{"ID":"110","measuredH":"25","measuredW":"315","properties":{"size":"17","text":"Excercise and make some command line"},"typeID":"Label","x":"412","y":"619","zOrder":"108"},{"ID":"111","measuredH":"25","measuredW":"297","properties":{"size":"17","text":"applications with your picked language"},"typeID":"Label","x":"412","y":"641","zOrder":"109"},{"ID":"112","measuredH":"25","measuredW":"292","properties":{"size":"17","text":"There are myriads of different options"},"typeID":"Label","x":"575","y":"283","zOrder":"110"},{"ID":"113","h":"187","measuredH":"140","measuredW":"200","properties":{"color":"16770457"},"typeID":"TextArea","w":"575","x":"152","y":"700","zOrder":"111"},{"ID":"114","measuredH":"25","measuredW":"111","properties":{"bold":"true","size":"17","text":"Sample Ideas"},"typeID":"Label","w":"131","x":"168","y":"714","zOrder":"112"},{"ID":"115","measuredH":"25","measuredW":"366","properties":{"size":"17","text":"Implement some command that you use e.g. `ls`"},"typeID":"Label","x":"168","y":"742","zOrder":"113"},{"ID":"116","measuredH":"25","measuredW":"507","properties":{"size":"17","text":"Command that fetches and saves reddit posts on /r/programming"},"typeID":"Label","x":"168","y":"768","zOrder":"114"},{"ID":"117","measuredH":"25","measuredW":"464","properties":{"size":"17","text":"Command that gives you directory structure in JSON format"},"typeID":"Label","x":"168","y":"794","zOrder":"115"},{"ID":"118","measuredH":"25","measuredW":"543","properties":{"size":"17","text":"Command that reads JSON from above and creates director structure"},"typeID":"Label","x":"168","y":"820","zOrder":"116"},{"ID":"119","measuredH":"25","measuredW":"511","properties":{"size":"17","text":"Think of some task that you do every day and try to automate that"},"typeID":"Label","x":"168","y":"846","zOrder":"117"},{"ID":"120","h":"133","measuredH":"140","measuredW":"200","properties":{"color":"16776960"},"typeID":"TextArea","w":"523","x":"766","y":"788","zOrder":"118"},{"ID":"121","measuredH":"25","measuredW":"195","properties":{"bold":"true","size":"17","text":"Learn Package Manager"},"typeID":"Label","x":"813","y":"803","zOrder":"119"},{"ID":"122","measuredH":"24","measuredW":"24","properties":{"color":"10027263","icon":{"ID":"circle","size":"small"}},"typeID":"Icon","x":"779","y":"803","zOrder":"120"},{"ID":"123","measuredH":"21","measuredW":"10","properties":{"bold":"true","color":"16777215","text":"3"},"typeID":"Label","x":"787","y":"805","zOrder":"121"},{"ID":"124","h":"72","measuredH":"140","measuredW":"200","properties":{"color":"16770457"},"typeID":"TextArea","w":"485","x":"241","y":"902","zOrder":"122"},{"ID":"125","measuredH":"25","measuredW":"442","properties":{"size":"17","text":"Package managers help you bring external dependencies"},"typeID":"Label","x":"254","y":"914","zOrder":"123"},{"ID":"126","measuredH":"25","measuredW":"432","properties":{"size":"17","text":"in your application and to distribute your own packages. "},"typeID":"Label","x":"254","y":"936","zOrder":"124"},{"ID":"127","measuredH":"25","measuredW":"445","properties":{"size":"17","text":"Learn how to use package manager for the language that"},"typeID":"Label","x":"813","y":"827","zOrder":"125"},{"ID":"128","measuredH":"25","measuredW":"451","properties":{"size":"17","text":"you picked, e.g. *PHP has composer, Node.js has NPM and*"},"typeID":"Label","x":"813","y":"852","zOrder":"126"},{"ID":"129","h":"153","measuredH":"140","measuredW":"200","properties":{"color":"16776960"},"typeID":"TextArea","w":"575","x":"158","y":"985","zOrder":"127"},{"ID":"130","measuredH":"25","measuredW":"245","properties":{"bold":"true","size":"17","text":"Standards and Best Practices"},"typeID":"Label","x":"204","y":"1001","zOrder":"128"},{"ID":"131","measuredH":"24","measuredW":"24","properties":{"color":"10027263","icon":{"ID":"circle","size":"small"}},"typeID":"Icon","x":"170","y":"1001","zOrder":"129"},{"ID":"132","measuredH":"21","measuredW":"10","properties":{"bold":"true","color":"16777215","text":"4"},"typeID":"Label","x":"178","y":"1003","zOrder":"130"},{"ID":"133","measuredH":"25","measuredW":"490","properties":{"size":"17","text":"Each of the language has its own standards and best practices"},"typeID":"Label","x":"204","y":"1028","zOrder":"131"},{"ID":"134","measuredH":"25","measuredW":"511","properties":{"size":"17","text":"of doing things. Study them for your picked language. For example"},"typeID":"Label","x":"204","y":"1050","zOrder":"132"},{"ID":"135","measuredH":"25","measuredW":"519","properties":{"size":"17","text":"*PHP has PHP-FIG and PSRs*, with Node.js there are many different"},"typeID":"Label","x":"204","y":"1075","zOrder":"133"},{"ID":"136","h":"110","measuredH":"140","measuredW":"200","properties":{"color":"16770457"},"typeID":"TextArea","w":"570","x":"806","y":"947","zOrder":"134"},{"ID":"137","measuredH":"25","measuredW":"504","properties":{"size":"17","text":"Make sure to read about the best practices for security. Read the"},"typeID":"Label","x":"820","y":"962","zOrder":"135"},{"ID":"138","measuredH":"25","measuredW":"531","properties":{"size":"17","text":"OWASP guidelines and understand different security issues and how"},"typeID":"Label","x":"820","y":"988","zOrder":"136"},{"ID":"139","measuredH":"25","measuredW":"311","properties":{"size":"17","text":"to avoid them in language of your choice"},"typeID":"Label","x":"823","y":"1015","zOrder":"137"},{"ID":"140","h":"323","measuredH":"140","measuredW":"200","properties":{"color":"16776960","textColor":"0"},"typeID":"TextArea","w":"576","x":"158","y":"1156","zOrder":"138"},{"ID":"141","measuredH":"25","measuredW":"350","properties":{"bold":"true","size":"17","text":"Make and Distribute Some Package/Library"},"typeID":"Label","x":"207","y":"1177","zOrder":"139"},{"ID":"142","measuredH":"24","measuredW":"24","properties":{"color":"10027263","icon":{"ID":"circle","size":"small"}},"typeID":"Icon","x":"173","y":"1177","zOrder":"140"},{"ID":"143","measuredH":"21","measuredW":"10","properties":{"bold":"true","color":"16777215","text":"5"},"typeID":"Label","x":"181","y":"1179","zOrder":"141"},{"ID":"144","measuredH":"25","measuredW":"490","properties":{"size":"17","text":"Now go ahead and create a package and distribute it for others"},"typeID":"Label","x":"207","y":"1204","zOrder":"142"},{"ID":"145","measuredH":"25","measuredW":"502","properties":{"size":"17","text":"to use, and make sure to follow the standards and best practices"},"typeID":"Label","x":"207","y":"1230","zOrder":"143"},{"ID":"146","measuredH":"25","measuredW":"211","properties":{"size":"17","text":"that you have learnt this far."},"typeID":"Label","x":"207","y":"1254","zOrder":"144"},{"ID":"147","measuredH":"25","measuredW":"322","properties":{"size":"17","text":"*yarn, Python has pip, Ruby has gems* etc"},"typeID":"Label","x":"813","y":"880","zOrder":"145"},{"ID":"148","measuredH":"25","measuredW":"329","properties":{"bold":"true","size":"17","text":"Contribute to Some Opensource Project"},"typeID":"Label","x":"207","y":"1292","zOrder":"146"},{"ID":"149","measuredH":"25","measuredW":"499","properties":{"size":"17","text":"Search for some projects on github and open some pull requests"},"typeID":"Label","x":"207","y":"1320","zOrder":"147"},{"ID":"150","measuredH":"25","measuredW":"344","properties":{"size":"17","text":"in opensource projects. Some ideas for that :"},"typeID":"Label","x":"207","y":"1345","zOrder":"148"},{"ID":"151","measuredH":"25","measuredW":"448","properties":{"size":"17","text":"Refactor and implement the best practices that you learnt"},"typeID":"Label","x":"209","y":"1385","zOrder":"149"},{"ID":"152","measuredH":"25","measuredW":"339","properties":{"size":"17","text":"Look into the open issues and try to resolve"},"typeID":"Label","x":"209","y":"1410","zOrder":"150"},{"ID":"153","measuredH":"25","measuredW":"240","properties":{"size":"17","text":"Add any additional functionality"},"typeID":"Label","x":"209","y":"1435","zOrder":"151"},{"ID":"154","h":"138","measuredH":"140","measuredW":"200","properties":{"color":"16776960","text":""},"typeID":"TextArea","w":"595","x":"782","y":"1359","zOrder":"152"},{"ID":"155","measuredH":"25","measuredW":"163","properties":{"bold":"true","size":"17","text":"Learn about Testing"},"typeID":"Label","x":"830","y":"1375","zOrder":"153"},{"ID":"156","measuredH":"24","measuredW":"24","properties":{"color":"10027263","icon":{"ID":"circle","size":"small"}},"typeID":"Icon","x":"796","y":"1375","zOrder":"154"},{"ID":"157","measuredH":"21","measuredW":"10","properties":{"bold":"true","color":"16777215","text":"6"},"typeID":"Label","x":"804","y":"1377","zOrder":"155"},{"ID":"158","measuredH":"25","measuredW":"535","properties":{"size":"17","text":"There are several different testing types, but for now learn about how"},"typeID":"Label","x":"830","y":"1402","zOrder":"156"},{"ID":"159","measuredH":"25","measuredW":"486","properties":{"size":"17","text":"to write *Unit and Integration tests* in the language you picked."},"typeID":"Label","x":"829","y":"1428","zOrder":"157"},{"ID":"160","measuredH":"25","measuredW":"529","properties":{"size":"17","text":"Understand different testing terminologies such as mocks, stubs etc"},"typeID":"Label","x":"829","y":"1454","zOrder":"158"},{"ID":"161","h":"252","measuredH":"140","measuredW":"200","properties":{"color":"16770457"},"typeID":"TextArea","w":"603","x":"774","y":"1084","zOrder":"159"},{"ID":"162","measuredH":"25","measuredW":"573","properties":{"size":"17","text":"There are several different options, each having different uses, depending "},"typeID":"Label","x":"788","y":"1099","zOrder":"160"},{"ID":"163","measuredH":"25","measuredW":"553","properties":{"size":"17","text":"upon the language of your choice. *Google* around, see different options "},"typeID":"Label","x":"791","y":"1125","zOrder":"161"},{"ID":"164","measuredH":"25","measuredW":"312","properties":{"size":"17","text":"and pick the one suitable for your needs."},"typeID":"Label","x":"791","y":"1152","zOrder":"162"},{"ID":"165","measuredH":"25","measuredW":"342","properties":{"size":"17","text":"*For PHP* – &*{color:blue}PHPUnit{color}*&, PHPSpec, Codeception"},"typeID":"Label","x":"792","y":"1193","zOrder":"163"},{"ID":"166","measuredH":"25","measuredW":"454","properties":{"size":"17","text":"*For Node.js* – &*{color:blue}Mocha{color}*&, &*{color:blue}Chai{color}*&, &*{color:blue}Sinon{color}*&, &*{color:blue}Mockery{color}*&, Ava, Jasmine"},"typeID":"Label","x":"792","y":"1221","zOrder":"164"},{"ID":"167","measuredH":"25","measuredW":"562","properties":{"size":"17","text":"For others, I don't want to start any flamewars so I am not going to make"},"typeID":"Label","x":"791","y":"1264","zOrder":"165"},{"ID":"168","measuredH":"25","measuredW":"531","properties":{"size":"17","text":"any recommendations here, so look around and find the ones suitable"},"typeID":"Label","x":"791","y":"1290","zOrder":"166"},{"ID":"169","h":"117","measuredH":"140","measuredW":"200","properties":{"color":"16776960"},"typeID":"TextArea","w":"594","x":"783","y":"1524","zOrder":"167"},{"ID":"170","measuredH":"25","measuredW":"336","properties":{"bold":"true","size":"17","text":"Write Tests for the practical steps above"},"typeID":"Label","x":"832","y":"1545","zOrder":"168"},{"ID":"171","measuredH":"24","measuredW":"24","properties":{"color":"10027263","icon":{"ID":"circle","size":"small"}},"typeID":"Icon","x":"798","y":"1545","zOrder":"169"},{"ID":"172","measuredH":"21","measuredW":"10","properties":{"bold":"true","color":"16777215","text":"7"},"typeID":"Label","x":"806","y":"1547","zOrder":"170"},{"ID":"173","measuredH":"25","measuredW":"501","properties":{"size":"17","text":"Go ahead and write the unit tests for the practical tasks that you"},"typeID":"Label","x":"832","y":"1572","zOrder":"171"},{"ID":"174","measuredH":"25","measuredW":"252","properties":{"size":"17","text":"implemented in the steps before."},"typeID":"Label","x":"832","y":"1598","zOrder":"172"},{"ID":"175","measuredH":"25","measuredW":"191","properties":{"size":"17","text":"driven by community etc."},"typeID":"Label","x":"203","y":"1099","zOrder":"173"},{"ID":"176","h":"50","measuredH":"140","measuredW":"200","properties":{"color":"16770457"},"typeID":"TextArea","w":"575","x":"158","y":"1498","zOrder":"174"},{"ID":"177","measuredH":"25","measuredW":"286","properties":{"size":"17","text":"Learn how to calculate test coverage"},"typeID":"Label","x":"208","y":"1511","zOrder":"175"},{"ID":"178","measuredH":"24","measuredW":"24","properties":{"icon":{"ID":"lightbulb-o","size":"small"}},"typeID":"Icon","x":"173","y":"1511","zOrder":"176"},{"ID":"179","h":"159","measuredH":"140","measuredW":"200","properties":{"color":"16776960"},"typeID":"TextArea","w":"371","x":"366","y":"1570","zOrder":"177"},{"ID":"180","measuredH":"25","measuredW":"224","properties":{"bold":"true","size":"17","text":"Learn Relational Databases"},"typeID":"Label","w":"226","x":"411","y":"1584","zOrder":"178"},{"ID":"181","measuredH":"24","measuredW":"24","properties":{"color":"10027263","icon":{"ID":"circle","size":"small"}},"typeID":"Icon","x":"378","y":"1582","zOrder":"179"},{"ID":"182","measuredH":"21","measuredW":"10","properties":{"bold":"true","color":"16777215","text":"8"},"typeID":"Label","w":"11","x":"386","y":"1584","zOrder":"180"},{"ID":"183","measuredH":"32","measuredW":"76","properties":{"align":"center","color":"16776960","size":"18","text":"MySQL"},"typeID":"TextInput","w":"121","x":"110","y":"1612","zOrder":"181"},{"ID":"184","measuredH":"32","measuredW":"83","properties":{"align":"center","color":"16776960","size":"18","text":"MariaDB"},"typeID":"TextInput","w":"119","x":"237","y":"1612","zOrder":"182"},{"ID":"185","measuredH":"32","measuredW":"114","properties":{"align":"center","color":"16776960","size":"18","text":"PostgreSQL"},"typeID":"TextInput","w":"246","x":"108","y":"1652","zOrder":"183"},{"ID":"186","measuredH":"32","measuredW":"67","properties":{"align":"center","color":"16770457","size":"18","text":"Oracle"},"typeID":"TextInput","w":"246","x":"109","y":"1570","zOrder":"184"},{"ID":"187","measuredH":"32","measuredW":"78","properties":{"align":"center","color":"16770457","size":"18","text":"MSSQL"},"typeID":"TextInput","w":"246","x":"108","y":"1695","zOrder":"185"},{"ID":"188","measuredH":"25","measuredW":"324","properties":{"size":"17","text":"There are several options here. However if"},"typeID":"Label","x":"382","y":"1613","zOrder":"186"},{"ID":"189","measuredH":"25","measuredW":"339","properties":{"size":"17","text":"if you learn one, others should be fairly easy."},"typeID":"Label","x":"382","y":"1637","zOrder":"187"},{"ID":"190","measuredH":"25","measuredW":"334","properties":{"size":"17","text":"Pick *MySQL* for now but learn how they are"},"typeID":"Label","x":"382","y":"1662","zOrder":"188"},{"ID":"191","measuredH":"25","measuredW":"209","properties":{"size":"17","text":"different and the usecases"},"typeID":"Label","x":"382","y":"1686","zOrder":"189"},{"ID":"192","h":"190","measuredH":"140","measuredW":"200","properties":{"color":"16776960"},"typeID":"TextArea","w":"603","x":"782","y":"1664","zOrder":"190"},{"ID":"193","measuredH":"25","measuredW":"118","properties":{"bold":"true","size":"17","text":"Practical Time"},"typeID":"Label","x":"829","y":"1681","zOrder":"191"},{"ID":"194","measuredH":"24","measuredW":"24","properties":{"color":"10027263","icon":{"ID":"circle","size":"small"}},"typeID":"Icon","x":"795","y":"1681","zOrder":"192"},{"ID":"195","measuredH":"21","measuredW":"10","properties":{"bold":"true","color":"16777215","text":"9"},"typeID":"Label","x":"803","y":"1683","zOrder":"193"},{"ID":"196","measuredH":"25","measuredW":"533","properties":{"size":"17","text":"Create a simple application using everything that you have learnt this"},"typeID":"Label","x":"829","y":"1708","zOrder":"194"},{"ID":"197","measuredH":"25","measuredW":"495","properties":{"size":"17","text":"far. It should have registration, login and CRUD. Create a blog, for"},"typeID":"Label","x":"829","y":"1734","zOrder":"195"},{"ID":"198","measuredH":"25","measuredW":"506","properties":{"size":"17","text":"example. Where anyone can register and get a public profile page"},"typeID":"Label","x":"829","y":"1760","zOrder":"196"},{"ID":"199","measuredH":"25","measuredW":"524","properties":{"size":"17","text":"create, update and delete posts and public page will show the posts"},"typeID":"Label","x":"829","y":"1788","zOrder":"197"},{"ID":"200","measuredH":"25","measuredW":"129","properties":{"size":"17","text":"created by them."},"typeID":"Label","x":"829","y":"1813","zOrder":"198"},{"ID":"201","h":"108","measuredH":"140","measuredW":"200","properties":{"color":"16770457"},"typeID":"TextArea","w":"585","x":"142","y":"1754","zOrder":"199"},{"ID":"202","measuredH":"25","measuredW":"505","properties":{"size":"17","text":"Make sure to write tests, follow the standards and best practices."},"typeID":"Label","x":"155","y":"1767","zOrder":"200"},{"ID":"203","measuredH":"25","measuredW":"551","properties":{"size":"17","text":"Also for the database, add the indexes, use proper storage engines and"},"typeID":"Label","x":"155","y":"1793","zOrder":"201"},{"ID":"204","measuredH":"25","measuredW":"540","properties":{"size":"17","text":"make sure to analyze the queries before using them in the application."},"typeID":"Label","x":"155","y":"1820","zOrder":"202"},{"ID":"205","h":"41","measuredH":"140","measuredW":"200","properties":{"color":"16770457","textColor":"16776960"},"typeID":"TextArea","w":"205","x":"1135","y":"371","zOrder":"203"},{"ID":"206","measuredH":"25","measuredW":"174","properties":{"bold":"true","size":"17","text":"TypeScript (Optional)"},"typeID":"Label","w":"175","x":"1151","y":"380","zOrder":"204"},{"ID":"207","h":"66","measuredH":"140","measuredW":"200","properties":{"color":"16776960"},"typeID":"TextArea","w":"638","x":"116","y":"1878","zOrder":"205"},{"ID":"208","measuredH":"25","measuredW":"154","properties":{"bold":"true","size":"17","text":"Learn a Framework"},"typeID":"Label","x":"165","y":"1899","zOrder":"206"},{"ID":"209","measuredH":"24","measuredW":"24","properties":{"color":"10027263","icon":{"ID":"circle","size":"small"}},"typeID":"Icon","x":"131","y":"1899","zOrder":"207"},{"ID":"210","measuredH":"21","measuredW":"14","properties":{"bold":"true","color":"16777215","text":"10"},"typeID":"Label","x":"136","y":"1901","zOrder":"208"},{"ID":"211","h":"220","measuredH":"140","measuredW":"200","properties":{"color":"16770457"},"typeID":"TextArea","w":"594","x":"791","y":"1871","zOrder":"209"},{"ID":"212","measuredH":"25","measuredW":"547","properties":{"size":"17","text":"Depending upon the project and the language you picked, you might or"},"typeID":"Label","x":"804","y":"1884","zOrder":"210"},{"ID":"213","measuredH":"25","measuredW":"491","properties":{"size":"17","text":"might not need a framework. There are several different options"},"typeID":"Label","x":"804","y":"1912","zOrder":"211"},{"ID":"214","measuredH":"25","measuredW":"558","properties":{"size":"17","text":"*For PHP* – &*{color:blue}Laravel{color}*& or &*{color:blue}Symfony{color}*& and Slim or Lumen for micro-frameworks"},"typeID":"Label","x":"804","y":"1952","zOrder":"212"},{"ID":"215","measuredH":"25","measuredW":"258","properties":{"size":"17","text":"*For Node.js* – &*{color:blue}Express.js{color}*&, Hapi.js"},"typeID":"Label","x":"804","y":"1980","zOrder":"213"},{"ID":"216","measuredH":"25","measuredW":"377","properties":{"size":"17","text":"*For Golang* – I prefer to code without framework"},"typeID":"Label","x":"804","y":"2009","zOrder":"214"},{"ID":"217","measuredH":"25","measuredW":"560","properties":{"size":"17","text":"For others, search and find the suitable ones for the language you picked"},"typeID":"Label","x":"804","y":"2048","zOrder":"215"},{"ID":"218","h":"80","measuredH":"140","measuredW":"200","properties":{"color":"16776960"},"typeID":"TextArea","w":"637","x":"116","y":"1953","zOrder":"216"},{"ID":"219","measuredH":"25","measuredW":"114","properties":{"bold":"true","size":"17","text":"Practical time"},"typeID":"Label","x":"162","y":"1966","zOrder":"217"},{"ID":"220","measuredH":"24","measuredW":"24","properties":{"color":"10027263","icon":{"ID":"circle","size":"small"}},"typeID":"Icon","x":"129","y":"1965","zOrder":"218"},{"ID":"221","measuredH":"21","measuredW":"11","properties":{"bold":"true","color":"16777215","text":"11"},"typeID":"Label","x":"135","y":"1967","zOrder":"219"},{"ID":"222","measuredH":"25","measuredW":"576","properties":{"size":"17","text":"Make the same application you made in to the framework of your choice"},"typeID":"Label","x":"161","y":"1994","zOrder":"220"},{"ID":"223","measuredH":"24","measuredW":"24","properties":{"color":"10027263","icon":{"ID":"circle","size":"small"}},"typeID":"Icon","x":"467","y":"1994","zOrder":"221"},{"ID":"224","measuredH":"21","measuredW":"10","properties":{"bold":"true","color":"16777215","text":"9"},"typeID":"Label","x":"475","y":"1996","zOrder":"222"},{"ID":"225","h":"179","measuredH":"140","measuredW":"200","properties":{"color":"16776960"},"typeID":"TextArea","w":"638","x":"116","y":"2040","zOrder":"223"},{"ID":"226","measuredH":"25","measuredW":"207","properties":{"bold":"true","size":"17","text":"Learn a NoSQL Database"},"typeID":"Label","x":"165","y":"2058","zOrder":"224"},{"ID":"227","measuredH":"24","measuredW":"24","properties":{"color":"10027263","icon":{"ID":"circle","size":"small"}},"typeID":"Icon","x":"131","y":"2058","zOrder":"225"},{"ID":"228","measuredH":"21","measuredW":"14","properties":{"bold":"true","color":"16777215","text":"12"},"typeID":"Label","x":"136","y":"2060","zOrder":"226"},{"ID":"229","measuredH":"25","measuredW":"573","properties":{"size":"17","text":"Have a look at different options and see how they differ. If you have to pick"},"typeID":"Label","w":"574","x":"166","y":"2144","zOrder":"227"},{"ID":"230","measuredH":"25","measuredW":"149","properties":{"size":"17","text":"one, pick *MongoDB*"},"typeID":"Label","w":"574","x":"166","y":"2170","zOrder":"228"},{"ID":"231","measuredH":"25","measuredW":"527","properties":{"size":"17","text":"First understand what they are, how they are different from relational"},"typeID":"Label","w":"574","x":"166","y":"2091","zOrder":"229"},{"ID":"232","measuredH":"25","measuredW":"555","properties":{"size":"17","text":"databases and why they are needed. There are several different options"},"typeID":"Label","w":"574","x":"165","y":"2117","zOrder":"230"},{"ID":"233","measuredH":"32","measuredW":"104","properties":{"align":"center","color":"16777215","size":"18","text":"Cassandra"},"typeID":"TextInput","w":"185","x":"1023","y":"2164","zOrder":"231"},{"ID":"234","measuredH":"32","measuredW":"92","properties":{"align":"center","color":"16776960","size":"18","text":"MongoDB"},"typeID":"TextInput","w":"185","x":"1023","y":"2123","zOrder":"232"},{"ID":"235","measuredH":"32","measuredW":"99","properties":{"align":"center","color":"16777215","size":"18","text":"RethinkDB"},"typeID":"TextInput","w":"157","x":"1215","y":"2123","zOrder":"233"},{"ID":"236","measuredH":"32","measuredW":"106","properties":{"align":"center","color":"16777215","size":"18","text":"Couchbase"},"typeID":"TextInput","w":"157","x":"1215","y":"2163","zOrder":"234"},{"ID":"237","h":"86","measuredH":"140","measuredW":"200","properties":{"color":"16776960"},"typeID":"TextArea","w":"638","x":"750","y":"2246","zOrder":"235"},{"ID":"238","measuredH":"25","measuredW":"65","properties":{"bold":"true","size":"17","text":"Caching"},"typeID":"Label","w":"101","x":"799","y":"2263","zOrder":"236"},{"ID":"239","measuredH":"24","measuredW":"24","properties":{"color":"10027263","icon":{"ID":"circle","size":"small"}},"typeID":"Icon","x":"765","y":"2263","zOrder":"237"},{"ID":"240","measuredH":"21","measuredW":"14","properties":{"bold":"true","color":"16777215","text":"13"},"typeID":"Label","x":"770","y":"2265","zOrder":"238"},{"ID":"241","measuredH":"25","measuredW":"539","properties":{"size":"17","text":"Learn how to implement app level caching using Redis or Memcached"},"typeID":"Label","w":"574","x":"800","y":"2290","zOrder":"239"},{"ID":"242","measuredH":"32","measuredW":"113","properties":{"align":"center","color":"16776960","size":"18","text":"Memcached"},"typeID":"TextInput","w":"183","x":"472","y":"2255","zOrder":"240"},{"ID":"243","measuredH":"32","measuredW":"61","properties":{"align":"center","color":"16776960","size":"18","text":"Redis"},"typeID":"TextInput","w":"183","x":"472","y":"2291","zOrder":"241"},{"ID":"244","measuredH":"25","measuredW":"185","properties":{"size":"17","text":"Learn MongoDB for now"},"typeID":"Label","w":"193","x":"809","y":"2120","zOrder":"242"},{"ID":"245","measuredH":"25","measuredW":"201","properties":{"size":"17","text":"but make sure to look how"},"typeID":"Label","w":"200","x":"809","y":"2144","zOrder":"243"},{"ID":"246","measuredH":"25","measuredW":"181","properties":{"size":"17","text":"it compares with others"},"typeID":"Label","w":"190","x":"812","y":"2169","zOrder":"244"},{"ID":"247","h":"142","measuredH":"140","measuredW":"200","properties":{"color":"16776960"},"typeID":"TextArea","w":"638","x":"116","y":"2605","zOrder":"245"},{"ID":"248","measuredH":"25","measuredW":"139","properties":{"bold":"true","size":"17","text":"Message Brokers"},"typeID":"Label","w":"155","x":"165","y":"2622","zOrder":"246"},{"ID":"249","measuredH":"24","measuredW":"24","properties":{"color":"10027263","icon":{"ID":"circle","size":"small"}},"typeID":"Icon","x":"131","y":"2622","zOrder":"247"},{"ID":"250","measuredH":"21","measuredW":"14","properties":{"bold":"true","color":"16777215","text":"16"},"typeID":"Label","w":"14","x":"136","y":"2624","zOrder":"248"},{"ID":"251","measuredH":"25","measuredW":"542","properties":{"size":"17","text":"Learn about the message brokers, understand the \"Why\" and pick one."},"typeID":"Label","w":"574","x":"166","y":"2651","zOrder":"249"},{"ID":"252","h":"109","measuredH":"140","measuredW":"200","properties":{"color":"16770457"},"typeID":"TextArea","w":"299","x":"131","y":"2237","zOrder":"250"},{"ID":"253","measuredH":"25","measuredW":"254","properties":{"size":"17","text":"Once you have learnt, implement"},"typeID":"Label","w":"258","x":"148","y":"2253","zOrder":"251"},{"ID":"254","measuredH":"25","measuredW":"234","properties":{"size":"17","text":"caching strategy in application"},"typeID":"Label","w":"258","x":"148","y":"2277","zOrder":"252"},{"ID":"255","measuredH":"25","measuredW":"140","properties":{"size":"17","text":"you built in step 11"},"typeID":"Label","w":"258","x":"147","y":"2303","zOrder":"253"},{"ID":"256","measuredH":"25","measuredW":"554","properties":{"size":"17","text":"There are multiple options but I would go for *RabbitMQ* or *Kafka*. Learn"},"typeID":"Label","w":"574","x":"165","y":"2679","zOrder":"254"},{"ID":"257","measuredH":"32","measuredW":"95","properties":{"align":"center","color":"16776960","size":"18","text":"RabbitMQ"},"typeID":"TextInput","w":"183","x":"886","y":"2646","zOrder":"255"},{"ID":"258","measuredH":"32","measuredW":"63","properties":{"align":"center","color":"16770457","size":"18","text":"Kafka"},"typeID":"TextInput","w":"183","x":"886","y":"2682","zOrder":"256"},{"ID":"259","measuredH":"25","measuredW":"409","properties":{"size":"17","text":"how to use RabbitMQ for now, if you want to pick one."},"typeID":"Label","w":"574","x":"166","y":"2707","zOrder":"257"},{"ID":"260","h":"143","measuredH":"140","measuredW":"200","properties":{"color":"16776960"},"typeID":"TextArea","w":"638","x":"116","y":"2755","zOrder":"258"},{"ID":"261","measuredH":"25","measuredW":"183","properties":{"bold":"true","size":"17","text":"Learn a Search Engine"},"typeID":"Label","w":"280","x":"164","y":"2772","zOrder":"259"},{"ID":"262","measuredH":"24","measuredW":"24","properties":{"color":"10027263","icon":{"ID":"circle","size":"small"}},"typeID":"Icon","x":"131","y":"2772","zOrder":"260"},{"ID":"263","measuredH":"21","measuredW":"14","properties":{"bold":"true","color":"16777215","text":"17"},"typeID":"Label","x":"136","y":"2774","zOrder":"261"},{"ID":"264","measuredH":"32","measuredW":"127","properties":{"align":"center","color":"16776960","size":"18","text":"ElasticSearch"},"typeID":"TextInput","w":"183","x":"886","y":"2771","zOrder":"262"},{"ID":"265","measuredH":"32","measuredW":"47","properties":{"align":"center","color":"16776960","size":"18","text":"Solr"},"typeID":"TextInput","w":"183","x":"886","y":"2807","zOrder":"263"},{"ID":"266","measuredH":"32","measuredW":"69","properties":{"align":"center","color":"16770457","size":"18","text":"Sphinx"},"typeID":"TextInput","w":"183","x":"888","y":"2843","zOrder":"264"},{"ID":"267","measuredH":"25","measuredW":"564","properties":{"size":"17","text":"As the application grows, simple queries on your database aren't going to"},"typeID":"Label","w":"574","x":"165","y":"2802","zOrder":"265"},{"ID":"268","measuredH":"25","measuredW":"570","properties":{"size":"17","text":"cut it out and you will have to resort to a search engine. There are multiple"},"typeID":"Label","w":"574","x":"165","y":"2827","zOrder":"266"},{"ID":"269","measuredH":"25","measuredW":"313","properties":{"size":"17","text":"options, each having it's own differences."},"typeID":"Label","w":"574","x":"165","y":"2854","zOrder":"267"},{"ID":"270","h":"113","measuredH":"140","measuredW":"200","properties":{"color":"16776960"},"typeID":"TextArea","w":"638","x":"753","y":"2340","zOrder":"268"},{"ID":"271","measuredH":"25","measuredW":"184","properties":{"bold":"true","size":"17","text":"Creating RESTful APIs"},"typeID":"Label","w":"203","x":"802","y":"2357","zOrder":"269"},{"ID":"272","measuredH":"24","measuredW":"24","properties":{"color":"10027263","icon":{"ID":"circle","size":"small"}},"typeID":"Icon","x":"768","y":"2357","zOrder":"270"},{"ID":"273","measuredH":"21","measuredW":"14","properties":{"bold":"true","color":"16777215","text":"14"},"typeID":"Label","x":"773","y":"2359","zOrder":"271"},{"ID":"274","measuredH":"25","measuredW":"571","properties":{"size":"17","text":"Understand REST and learn how to make RESTful APIs and make sure to"},"typeID":"Label","w":"574","x":"803","y":"2386","zOrder":"272"},{"ID":"275","measuredH":"25","measuredW":"503","properties":{"size":"17","text":"read the part about REST from the original paper of *Roy Fielding*"},"typeID":"Label","w":"574","x":"803","y":"2410","zOrder":"273"},{"ID":"276","h":"87","measuredH":"140","measuredW":"200","properties":{"color":"16776960"},"typeID":"TextArea","w":"638","x":"754","y":"2460","zOrder":"274"},{"ID":"277","measuredH":"25","measuredW":"354","properties":{"bold":"true","size":"17","text":"Authentication/Authorization Methodologies"},"typeID":"Label","w":"377","x":"805","y":"2477","zOrder":"275"},{"ID":"278","measuredH":"24","measuredW":"24","properties":{"color":"10027263","icon":{"ID":"circle","size":"small"}},"typeID":"Icon","x":"771","y":"2477","zOrder":"276"},{"ID":"279","measuredH":"21","measuredW":"14","properties":{"bold":"true","color":"16777215","text":"15"},"typeID":"Label","x":"776","y":"2479","zOrder":"277"},{"ID":"280","measuredH":"25","measuredW":"431","properties":{"size":"17","text":"Learn about the differences and how to implement them"},"typeID":"Label","w":"495","x":"804","y":"2508","zOrder":"278"},{"ID":"281","measuredH":"32","measuredW":"63","properties":{"align":"center","color":"16776960","size":"18","text":"OAuth"},"typeID":"TextInput","w":"210","x":"386","y":"2400","zOrder":"279"},{"ID":"282","measuredH":"32","measuredW":"180","properties":{"align":"center","color":"16776960","size":"18","text":"Basic Authentication"},"typeID":"TextInput","w":"210","x":"386","y":"2436","zOrder":"280"},{"ID":"283","measuredH":"32","measuredW":"183","properties":{"align":"center","color":"16776960","size":"18","text":"Token Authentication"},"typeID":"TextInput","w":"210","x":"386","y":"2472","zOrder":"281"},{"ID":"284","measuredH":"32","measuredW":"55","properties":{"align":"center","color":"16776960","size":"18","text":"JWT"},"typeID":"TextInput","w":"210","x":"386","y":"2508","zOrder":"282"},{"ID":"285","measuredH":"32","measuredW":"77","properties":{"align":"center","color":"16776960","size":"18","text":"OpenID"},"typeID":"TextInput","w":"210","x":"387","y":"2545","zOrder":"283"},{"ID":"286","h":"60","measuredH":"140","measuredW":"200","properties":{"color":"16776960"},"typeID":"TextArea","w":"638","x":"738","y":"2914","zOrder":"284"},{"ID":"287","measuredH":"25","measuredW":"207","properties":{"bold":"true","size":"17","text":"Learn How to Use Docker"},"typeID":"Label","w":"280","x":"788","y":"2930","zOrder":"285"},{"ID":"288","measuredH":"24","measuredW":"24","properties":{"color":"10027263","icon":{"ID":"circle","size":"small"}},"typeID":"Icon","x":"755","y":"2929","zOrder":"286"},{"ID":"289","measuredH":"21","measuredW":"14","properties":{"bold":"true","color":"16777215","text":"18"},"typeID":"Label","w":"14","x":"760","y":"2931","zOrder":"287"},{"ID":"290","h":"112","measuredH":"140","measuredW":"200","properties":{"color":"16776960"},"typeID":"TextArea","w":"638","x":"738","y":"3170","zOrder":"288"},{"ID":"291","measuredH":"25","measuredW":"124","properties":{"bold":"true","size":"17","text":"Learn GraphQL"},"typeID":"Label","w":"153","x":"788","y":"3185","zOrder":"289"},{"ID":"292","measuredH":"24","measuredW":"24","properties":{"color":"10027263","icon":{"ID":"circle","size":"small"}},"typeID":"Icon","x":"755","y":"3184","zOrder":"290"},{"ID":"293","measuredH":"21","measuredW":"14","properties":{"bold":"true","color":"16777215","text":"21"},"typeID":"Label","w":"14","x":"760","y":"3186","zOrder":"291"},{"ID":"294","measuredH":"25","measuredW":"556","properties":{"size":"17","text":"While it is not required, feel free to have a look at it and see what it is all"},"typeID":"Label","w":"574","x":"789","y":"3213","zOrder":"292"},{"ID":"295","measuredH":"25","measuredW":"367","properties":{"size":"17","text":"about and why they are calling it the new REST"},"typeID":"Label","w":"574","x":"789","y":"3240","zOrder":"293"},{"ID":"296","h":"114","measuredH":"140","measuredW":"200","properties":{"color":"16776960","text":""},"typeID":"TextArea","w":"638","x":"738","y":"2981","zOrder":"294"},{"ID":"297","measuredH":"25","measuredW":"219","properties":{"bold":"true","size":"17","text":"Knowledge of Web Servers"},"typeID":"Label","w":"280","x":"789","y":"2998","zOrder":"295"},{"ID":"298","measuredH":"24","measuredW":"24","properties":{"color":"10027263","icon":{"ID":"circle","size":"small"}},"typeID":"Icon","x":"755","y":"2996","zOrder":"296"},{"ID":"299","measuredH":"21","measuredW":"13","properties":{"bold":"true","color":"16777215","text":"19"},"typeID":"Label","w":"14","x":"760","y":"2998","zOrder":"297"},{"ID":"300","measuredH":"25","measuredW":"526","properties":{"size":"17","text":"There are several different options here, look at the different options,"},"typeID":"Label","w":"566","x":"789","y":"3026","zOrder":"298"},{"ID":"301","measuredH":"25","measuredW":"336","properties":{"size":"17","text":"understand their differences and limitations"},"typeID":"Label","w":"566","x":"790","y":"3053","zOrder":"299"},{"ID":"302","measuredH":"32","measuredW":"76","properties":{"align":"center","color":"16776960","size":"18","text":"Apache"},"typeID":"TextInput","w":"183","x":"403","y":"2971","zOrder":"300"},{"ID":"303","measuredH":"32","measuredW":"60","properties":{"align":"center","color":"16776960","size":"18","text":"Nginx"},"typeID":"TextInput","w":"183","x":"403","y":"3007","zOrder":"301"},{"ID":"304","measuredH":"32","measuredW":"67","properties":{"align":"center","color":"16770457","size":"18","text":"Caddy"},"typeID":"TextInput","w":"183","x":"405","y":"3043","zOrder":"302"},{"ID":"305","measuredH":"32","measuredW":"70","properties":{"align":"center","color":"16770457","size":"18","text":"MS IIS"},"typeID":"TextInput","w":"183","x":"405","y":"3080","zOrder":"303"},{"ID":"306","h":"60","measuredH":"140","measuredW":"200","properties":{"color":"16776960"},"typeID":"TextArea","w":"638","x":"739","y":"3102","zOrder":"304"},{"ID":"307","measuredH":"25","measuredW":"250","properties":{"bold":"true","size":"17","text":"Learn how to use Web Sockets"},"typeID":"Label","w":"282","x":"787","y":"3119","zOrder":"305"},{"ID":"308","measuredH":"24","measuredW":"24","properties":{"color":"10027263","icon":{"ID":"circle","size":"small"}},"typeID":"Icon","x":"754","y":"3118","zOrder":"306"},{"ID":"309","measuredH":"21","measuredW":"17","properties":{"bold":"true","color":"16777215","text":"20"},"typeID":"Label","w":"21","x":"758","y":"3120","zOrder":"307"},{"ID":"310","h":"112","measuredH":"140","measuredW":"200","properties":{"color":"16776960"},"typeID":"TextArea","w":"638","x":"216","y":"3313","zOrder":"308"},{"ID":"311","measuredH":"25","measuredW":"219","properties":{"bold":"true","size":"17","text":"Look into Graph Databases"},"typeID":"Label","w":"231","x":"266","y":"3328","zOrder":"309"},{"ID":"312","measuredH":"24","measuredW":"24","properties":{"color":"10027263","icon":{"ID":"circle","size":"small"}},"typeID":"Icon","x":"233","y":"3327","zOrder":"310"},{"ID":"313","measuredH":"21","measuredW":"17","properties":{"bold":"true","color":"16777215","text":"22"},"typeID":"Label","w":"29","x":"237","y":"3329","zOrder":"311"},{"ID":"314","measuredH":"25","measuredW":"529","properties":{"size":"17","text":"Again not required but you should have a little understanding of what"},"typeID":"Label","w":"574","x":"267","y":"3356","zOrder":"312"},{"ID":"315","measuredH":"25","measuredW":"136","properties":{"size":"17","text":"they have to offer"},"typeID":"Label","w":"574","x":"267","y":"3383","zOrder":"313"},{"ID":"316","h":"147","measuredH":"146","measuredW":"14","properties":{"color":"2848996","curvature":"0","direction":"bottom","leftArrow":"false","p0":{"length":14,"x":14,"y":0},"p1":{"length":0.5865162746954035,"x":0.5864611260053622,"y":0.008042895442359291},"p2":{"length":146,"x":0,"y":146},"rightArrow":"false","shape":"bezier"},"typeID":"Arrow","w":"15","x":"537","y":"3448","zOrder":"314"},{"ID":"317","measuredH":"32","measuredW":"170","properties":{"bold":"true","size":"24","text":"Keep Exploring"},"typeID":"Label","x":"449","y":"3618","zOrder":"315"},{"ID":"318","h":"87","measuredH":"140","measuredW":"200","properties":{"color":"16776960"},"typeID":"TextArea","w":"637","x":"216","y":"3436","zOrder":"316"},{"ID":"319","measuredH":"24","measuredW":"24","properties":{"color":"10027263","icon":{"ID":"circle","size":"small"}},"typeID":"Icon","x":"230","y":"3450","zOrder":"317"},{"ID":"320","measuredH":"22","measuredW":"18","properties":{"bold":"true","color":"16777215","size":"14","text":"23"},"typeID":"Label","w":"16","x":"234","y":"3452","zOrder":"318"},{"ID":"321","measuredH":"26","measuredW":"371","properties":{"bold":"true","size":"18","text":"All the things that weren't mentioned above"},"typeID":"Label","w":"391","x":"261","y":"3449","zOrder":"319"},{"ID":"322","measuredH":"25","measuredW":"367","properties":{"size":"17","text":"Profiling, Static Analysis, DDD, SOAP. Go Figure!"},"typeID":"Label","x":"262","y":"3476","zOrder":"320"}]},"measuredH":"3650","measuredW":"1392","mockupH":"3600","mockupW":"1284","version":"1.0"}}
--------------------------------------------------------------------------------
/0-roadmap/project/disclaimer.json:
--------------------------------------------------------------------------------
1 | {"mockup":{"controls":{"control":[{"ID":"119","h":"274","measuredH":"140","measuredW":"200","properties":{"color":"16777215"},"typeID":"TextArea","w":"911","x":"223","y":"170","zOrder":"0"},{"ID":"120","measuredH":"40","measuredW":"170","properties":{"bold":"true","size":"32","text":"Disclaimer!"},"typeID":"Label","x":"245","y":"190","zOrder":"1"},{"ID":"121","measuredH":"32","measuredW":"856","properties":{"size":"24","text":"The purpose of this roadmap is to give you an idea about the landscape and to"},"typeID":"Label","x":"245","y":"246","zOrder":"2"},{"ID":"123","measuredH":"32","measuredW":"833","properties":{"size":"24","text":"guide you if you are confused about what to learn next and not to encourage"},"typeID":"Label","x":"245","y":"282","zOrder":"3"},{"ID":"124","measuredH":"32","measuredW":"825","properties":{"size":"24","text":"you to learn what is hip and trendy. You should *grow some understanding* of"},"typeID":"Label","x":"245","y":"317","zOrder":"4"},{"ID":"125","measuredH":"32","measuredW":"816","properties":{"size":"24","text":"*why one tool would be better suited for some cases than the other and*"},"typeID":"Label","x":"245","y":"353","zOrder":"5"},{"ID":"126","measuredH":"32","measuredW":"710","properties":{"size":"24","text":"*remember hip and trendy never means best suited for the job*"},"typeID":"Label","x":"245","y":"389","zOrder":"6"}]},"measuredH":"444","measuredW":"1134","mockupH":"274","mockupW":"911","version":"1.0"}}
--------------------------------------------------------------------------------
/0-roadmap/project/frontend-map.json:
--------------------------------------------------------------------------------
1 | {"mockup":{"controls":{"control":[{"ID":"38","h":"67","measuredH":"66","measuredW":"14","properties":{"color":"2848996","curvature":"1","direction":"top","leftArrow":"false","p0":{"x":0,"y":0},"p1":{"x":0.510715363718684,"y":0.13884696649562314},"p2":{"x":9,"y":66},"rightArrow":"false","shape":"bezier"},"typeID":"Arrow","w":"15","x":"658","y":"277","zOrder":"80"},{"ID":"49","h":"59","measuredH":"58","measuredW":"110","properties":{"color":"2848996","curvature":"-1","direction":"top","leftArrow":"false","p0":{"x":110,"y":58,"length":124.35433245367851},"p1":{"x":0.45522128005575574,"y":-0.054942502032756434,"length":0.45852490918729844},"p2":{"x":0,"y":0,"length":0},"rightArrow":"false","shape":"bezier","stroke":"dotted"},"typeID":"Arrow","w":"111","x":"432","y":"289","zOrder":"76"},{"ID":"53","h":"55","measuredH":"140","measuredW":"200","properties":{"color":"16776960"},"typeID":"TextArea","w":"250","x":"543","y":"329","zOrder":"81"},{"ID":"54","measuredH":"40","measuredW":"149","properties":{"bold":"true","size":"32","text":"Front-end"},"typeID":"Label","x":"563","y":"121","zOrder":"82"},{"ID":"55","h":"74","measuredH":"73","measuredW":"18","properties":{"color":"2848996","curvature":"-1","direction":"bottom","leftArrow":"false","p0":{"length":8,"x":8,"y":0},"p1":{"length":0.4979530082684307,"x":0.45894941634241254,"y":0.19319066147859923},"p2":{"length":73,"x":0,"y":73},"rightArrow":"false","shape":"bezier","stroke":"dotted"},"typeID":"Arrow","w":"19","x":"637","y":"47","zOrder":"83"},{"ID":"56","h":"61","measuredH":"60","measuredW":"15","properties":{"color":"2848996","curvature":"-1","direction":"top","leftArrow":"false","p0":{"length":2,"x":2,"y":0},"p1":{"length":0.4752342503759216,"x":0.46391752577319545,"y":-0.1030927835051546},"p2":{"length":61.84658438426491,"x":15,"y":60},"rightArrow":"false","shape":"bezier"},"typeID":"Arrow","w":"16","x":"626","y":"177","zOrder":"84"},{"ID":"57","measuredH":"26","measuredW":"147","properties":{"bold":"true","size":"18","text":"Learn the Basics"},"typeID":"Label","x":"589","y":"244","zOrder":"85"},{"ID":"91","measuredH":"32","measuredW":"32","properties":{"color":"10027263","icon":{"ID":"github","size":"medium"}},"typeID":"Icon","x":"920","y":"81","zOrder":"87"},{"ID":"92","measuredH":"25","measuredW":"295","properties":{"bold":"true","color":"10027263","size":"17","text":"kamranahmedse/developer-roadmap"},"typeID":"Label","x":"959","y":"85","zOrder":"88"},{"ID":"191","measuredH":"32","measuredW":"32","properties":{"color":"10027263","icon":{"ID":"twitter","size":"medium"}},"typeID":"Icon","x":"920","y":"127","zOrder":"89"},{"ID":"192","measuredH":"25","measuredW":"133","properties":{"bold":"true","color":"10027263","size":"17","text":"kamranahmedse"},"typeID":"Label","x":"960","y":"132","zOrder":"90"},{"ID":"328","h":"14","measuredH":"13","measuredW":"114","properties":{"color":"2848996","curvature":"0","direction":"top","leftArrow":"false","p0":{"x":114,"y":13,"length":114.73883387938018},"p1":{"x":0.46527893422148237,"y":-0.0013322231473772803,"length":0.4652808414804901},"p2":{"x":0,"y":0,"length":0},"rightArrow":"false","shape":"bezier","stroke":"dotted"},"typeID":"Arrow","w":"115","x":"431","y":"338","zOrder":"79"},{"ID":"329","h":"23","measuredH":"22","measuredW":"111","properties":{"color":"2848996","curvature":"-1","direction":"bottom","leftArrow":"false","p0":{"x":111,"y":0,"length":111},"p1":{"x":0.4453729012104649,"y":0.01983600156188987,"length":0.44581440991806204},"p2":{"x":0,"y":22,"length":22},"rightArrow":"false","shape":"bezier","stroke":"dotted"},"typeID":"Arrow","w":"112","x":"434","y":"361","zOrder":"78"},{"ID":"332","h":"58","measuredH":"57","measuredW":"111","properties":{"color":"2848996","curvature":"-1","direction":"bottom","leftArrow":"false","p0":{"x":111,"y":0,"length":111},"p1":{"x":0.47938350680544434,"y":0.06064851881505207,"length":0.48320470758421347},"p2":{"x":0,"y":57,"length":57},"rightArrow":"false","shape":"bezier","stroke":"dotted"},"typeID":"Arrow","w":"112","x":"430","y":"371","zOrder":"77"},{"ID":"341","h":"50","measuredH":"140","measuredW":"200","properties":{"color":"16776960"},"typeID":"TextArea","w":"250","x":"543","y":"391","zOrder":"99"},{"ID":"342","measuredH":"25","measuredW":"35","properties":{"bold":"true","size":"17","text":"CSS"},"typeID":"Label","x":"651","y":"404","zOrder":"100"},{"ID":"355","measuredH":"25","measuredW":"131","properties":{"size":"17","text":"Learn the basics"},"typeID":"Label","w":"134","x":"241","y":"277","zOrder":"92"},{"ID":"356","h":"40","measuredH":"140","measuredW":"200","properties":{"color":"16770457"},"typeID":"TextArea","w":"270","x":"173","y":"316","zOrder":"93"},{"ID":"357","measuredH":"25","measuredW":"186","properties":{"size":"17","text":"Writing Semantic HTML"},"typeID":"Label","w":"189","x":"214","y":"324","zOrder":"94"},{"ID":"358","h":"40","measuredH":"140","measuredW":"200","properties":{"color":"16770457"},"typeID":"TextArea","w":"270","x":"173","y":"362","zOrder":"95"},{"ID":"359","measuredH":"25","measuredW":"83","properties":{"size":"17","text":"Basic SEO"},"typeID":"Label","w":"84","x":"266","y":"370","zOrder":"96"},{"ID":"360","h":"40","measuredH":"140","measuredW":"200","properties":{"color":"16770457"},"typeID":"TextArea","w":"270","x":"173","y":"409","zOrder":"97"},{"ID":"361","measuredH":"25","measuredW":"97","properties":{"size":"17","text":"Accessibility"},"typeID":"Label","w":"100","x":"258","y":"417","zOrder":"98"},{"ID":"437","measuredH":"25","measuredW":"48","properties":{"bold":"true","size":"17","text":"HTML"},"typeID":"Label","x":"644","y":"344","zOrder":"86"},{"ID":"498","h":"50","measuredH":"140","measuredW":"200","properties":{"color":"16776960"},"typeID":"TextArea","w":"250","x":"543","y":"450","zOrder":"117"},{"ID":"499","measuredH":"25","measuredW":"168","properties":{"bold":"true","size":"17","text":"Basics of JavaScript"},"typeID":"Label","x":"584","y":"463","zOrder":"118"},{"ID":"504","h":"58","measuredH":"57","measuredW":"97","properties":{"color":"2848996","curvature":"0","direction":"bottom","leftArrow":"false","p0":{"x":97,"y":0},"p1":{"x":0.4929203539823005,"y":-0.0061946902654867846},"p2":{"x":0,"y":57},"rightArrow":"false","shape":"bezier","stroke":"dotted"},"typeID":"Arrow","w":"98","x":"787","y":"352","zOrder":"75"},{"ID":"505","h":"15","measuredH":"14","measuredW":"108","properties":{"color":"2848996","curvature":"0","direction":"bottom","leftArrow":"false","p0":{"x":108,"y":0},"p1":{"x":0.4532883642495784,"y":-0.0032040472175379428},"p2":{"x":0,"y":14},"rightArrow":"false","shape":"bezier","stroke":"dotted"},"typeID":"Arrow","w":"109","x":"788","y":"401","zOrder":"74"},{"ID":"506","h":"38","measuredH":"37","measuredW":"96","properties":{"color":"2848996","curvature":"-1","direction":"top","leftArrow":"false","p0":{"x":96,"y":37},"p1":{"x":0.48822006197733175,"y":-0.011249310183809523},"p2":{"x":0,"y":0},"rightArrow":"false","shape":"bezier","stroke":"dotted"},"typeID":"Arrow","w":"97","x":"787","y":"417","zOrder":"73"},{"ID":"507","h":"84","measuredH":"83","measuredW":"107","properties":{"color":"2848996","curvature":"1","direction":"top","leftArrow":"false","p0":{"x":107,"y":83},"p1":{"x":0.5177263969171484,"y":0.015221579961464355},"p2":{"x":0,"y":0},"rightArrow":"false","shape":"bezier","stroke":"dotted"},"typeID":"Arrow","w":"108","x":"787","y":"420","zOrder":"72"},{"ID":"508","h":"40","measuredH":"140","measuredW":"200","properties":{"color":"16770457"},"typeID":"TextArea","w":"270","x":"173","y":"473","zOrder":"119"},{"ID":"509","measuredH":"25","measuredW":"228","properties":{"size":"17","text":"Syntax and Basic Constructs"},"typeID":"Label","w":"228","x":"194","y":"481","zOrder":"120"},{"ID":"510","h":"40","measuredH":"140","measuredW":"200","properties":{"color":"16770457"},"typeID":"TextArea","w":"270","x":"173","y":"519","zOrder":"121"},{"ID":"511","measuredH":"25","measuredW":"190","properties":{"size":"17","text":"Learn DOM Manipulation"},"typeID":"Label","w":"197","x":"210","y":"527","zOrder":"122"},{"ID":"517","h":"40","measuredH":"140","measuredW":"200","properties":{"color":"16770457"},"typeID":"TextArea","w":"270","x":"174","y":"566","zOrder":"127"},{"ID":"518","measuredH":"25","measuredW":"230","properties":{"size":"17","text":"Learn Fetch API / Ajax (XHR)"},"typeID":"Label","w":"234","x":"192","y":"574","zOrder":"128"},{"ID":"519","h":"40","measuredH":"140","measuredW":"200","properties":{"color":"16770457"},"typeID":"TextArea","w":"270","x":"174","y":"614","zOrder":"129"},{"ID":"520","measuredH":"25","measuredW":"232","properties":{"size":"17","text":"ES6+ and modular JavaScript"},"typeID":"Label","w":"234","x":"192","y":"622","zOrder":"130"},{"ID":"521","h":"34","measuredH":"33","measuredW":"122","properties":{"color":"2848996","curvature":"0","direction":"bottom","leftArrow":"false","p0":{"x":122,"y":0},"p1":{"x":0.4501850789844117,"y":0.00928001668317606},"p2":{"x":0,"y":33},"rightArrow":"false","shape":"bezier","stroke":"dotted"},"typeID":"Arrow","w":"123","x":"429","y":"465","zOrder":"71"},{"ID":"522","h":"82","measuredH":"81","measuredW":"127","properties":{"color":"2848996","curvature":"0","direction":"bottom","leftArrow":"false","p0":{"x":127,"y":0},"p1":{"x":0.4682571775171856,"y":0.0018196522442377678},"p2":{"x":0,"y":81},"rightArrow":"false","shape":"bezier","stroke":"dotted"},"typeID":"Arrow","w":"128","x":"429","y":"463","zOrder":"70"},{"ID":"523","h":"120","measuredH":"119","measuredW":"118","properties":{"color":"2848996","curvature":"0","direction":"bottom","leftArrow":"false","p0":{"x":118,"y":0},"p1":{"x":0.46376334167874556,"y":-0.00612728949795757},"p2":{"x":0,"y":119},"rightArrow":"false","shape":"bezier","stroke":"dotted"},"typeID":"Arrow","w":"119","x":"434","y":"469","zOrder":"69"},{"ID":"526","h":"158","measuredH":"157","measuredW":"120","properties":{"color":"2848996","curvature":"0","direction":"bottom","leftArrow":"false","p0":{"x":120,"y":0},"p1":{"x":0.4668678363711581,"y":0.0018494634122599956},"p2":{"x":0,"y":157},"rightArrow":"false","shape":"bezier","stroke":"dotted"},"typeID":"Arrow","w":"121","x":"431","y":"481","zOrder":"68"},{"ID":"527","h":"213","measuredH":"212","measuredW":"129","properties":{"color":"2848996","curvature":"0","direction":"bottom","leftArrow":"false","p0":{"x":129,"y":0},"p1":{"x":0.4758909351829711,"y":0.002176512795981883},"p2":{"x":0,"y":212},"rightArrow":"false","shape":"bezier","stroke":"dotted"},"typeID":"Arrow","w":"130","x":"428","y":"488","zOrder":"67"},{"ID":"530","h":"251","measuredH":"250","measuredW":"50","properties":{"color":"2848996","curvature":"-1","direction":"top","leftArrow":"false","p0":{"x":33,"y":0},"p1":{"x":0.4890347035308732,"y":-0.16125435984009936},"p2":{"x":50,"y":250},"rightArrow":"false","shape":"bezier"},"typeID":"Arrow","w":"51","x":"595","y":"499","zOrder":"66"},{"ID":"531","h":"50","measuredH":"140","measuredW":"200","properties":{"color":"16776960"},"typeID":"TextArea","w":"250","x":"540","y":"734","zOrder":"131"},{"ID":"532","measuredH":"25","measuredW":"150","properties":{"bold":"true","size":"17","text":"Package Managers"},"typeID":"Label","x":"590","y":"747","zOrder":"132"},{"ID":"533","h":"40","measuredH":"140","measuredW":"200","properties":{"color":"16776960"},"typeID":"TextArea","w":"106","x":"767","y":"575","zOrder":"133"},{"ID":"534","measuredH":"25","measuredW":"33","properties":{"size":"17","text":"npm"},"typeID":"Label","w":"33","x":"804","y":"583","zOrder":"134"},{"ID":"535","h":"40","measuredH":"140","measuredW":"200","properties":{"color":"16776960"},"typeID":"TextArea","w":"106","x":"767","y":"620","zOrder":"135"},{"ID":"536","measuredH":"25","measuredW":"33","properties":{"size":"17","text":"yarn"},"typeID":"Label","w":"33","x":"804","y":"628","zOrder":"136"},{"ID":"548","h":"88","measuredH":"140","measuredW":"200","properties":{"color":"3355443"},"typeID":"TextArea","w":"439","x":"885","y":"574","zOrder":"137"},{"ID":"549","measuredH":"25","measuredW":"402","properties":{"color":"15658734","size":"17","text":"{color:yellow}npm{color} improved a lot, post v5+, but is still behind yarn"},"typeID":"Label","w":"403","x":"905","y":"589","zOrder":"138"},{"ID":"550","measuredH":"25","measuredW":"390","properties":{"color":"15658734","size":"17","text":"in some features; nothing serious though. Pick any!"},"typeID":"Label","w":"395","x":"905","y":"619","zOrder":"139"},{"ID":"554","h":"124","measuredH":"123","measuredW":"33","properties":{"color":"2848996","curvature":"-1","direction":"bottom","leftArrow":"false","p0":{"x":20,"y":0},"p1":{"x":0.47600574536258394,"y":0.18099119780988743},"p2":{"x":0,"y":123},"rightArrow":"false","shape":"bezier"},"typeID":"Arrow","w":"34","x":"634","y":"765","zOrder":"65"},{"ID":"555","h":"50","measuredH":"140","measuredW":"200","properties":{"color":"16776960"},"typeID":"TextArea","w":"250","x":"465","y":"876","zOrder":"140"},{"ID":"556","measuredH":"25","measuredW":"165","properties":{"bold":"true","size":"17","text":"CSS Pre-processors"},"typeID":"Label","x":"508","y":"889","zOrder":"141"},{"ID":"563","h":"49","measuredH":"48","measuredW":"149","properties":{"color":"2848996","curvature":"-1","direction":"top","leftArrow":"false","p0":{"x":149,"y":48,"length":156.54072952429985},"p1":{"x":0.5145547945205479,"y":-0.017979452054794468,"length":0.5148688155834201},"p2":{"x":0,"y":0,"length":0},"rightArrow":"false","shape":"bezier","stroke":"dotted"},"typeID":"Arrow","w":"150","x":"333","y":"853","zOrder":"63"},{"ID":"564","h":"5","measuredH":"4","measuredW":"159","properties":{"color":"2848996","curvature":"0","direction":"top","leftArrow":"false","p0":{"x":159,"y":4,"length":159.05030650709227},"p1":{"x":0.4501850789844111,"y":0.009280016683176075,"length":0.4502807169420433},"p2":{"x":0,"y":0,"length":0},"rightArrow":"false","shape":"bezier","stroke":"dotted"},"typeID":"Arrow","w":"160","x":"320","y":"898","zOrder":"64"},{"ID":"565","h":"34","measuredH":"33","measuredW":"148","properties":{"color":"2848996","curvature":"-1","direction":"bottom","leftArrow":"false","p0":{"x":148,"y":0,"length":148},"p1":{"x":0.45079101868865695,"y":0.021400080670461157,"length":0.4512986882133154},"p2":{"x":0,"y":33,"length":33},"rightArrow":"false","shape":"bezier","stroke":"dotted"},"typeID":"Arrow","w":"149","x":"333","y":"906","zOrder":"62"},{"ID":"574","children":{"controls":{"control":[{"ID":"0","h":"40","measuredH":"140","measuredW":"200","properties":{"color":"16776960"},"typeID":"TextArea","w":"146","x":"0","y":"0","zOrder":"0"},{"ID":"1","measuredH":"25","measuredW":"46","properties":{"size":"17","text":"SASS"},"typeID":"Label","w":"46","x":"50","y":"8","zOrder":"1"}]}},"h":"40","measuredH":"40","measuredW":"146","typeID":"__group__","w":"146","x":"201","y":"832","zOrder":"142"},{"ID":"576","children":{"controls":{"control":[{"ID":"0","h":"40","measuredH":"140","measuredW":"200","properties":{"color":"15658734"},"typeID":"TextArea","w":"146","x":"0","y":"0","zOrder":"0"},{"ID":"1","measuredH":"25","measuredW":"38","properties":{"size":"17","text":"Less"},"typeID":"Label","w":"42","x":"52","y":"8","zOrder":"1"}]}},"h":"40","measuredH":"40","measuredW":"146","typeID":"__group__","w":"146","x":"201","y":"923","zOrder":"145"},{"ID":"577","h":"50","measuredH":"140","measuredW":"200","properties":{"color":"16776960"},"typeID":"TextArea","w":"250","x":"557","y":"1009","zOrder":"151"},{"ID":"578","measuredH":"25","measuredW":"136","properties":{"bold":"true","size":"17","text":"CSS Frameworks"},"typeID":"Label","x":"614","y":"1022","zOrder":"152"},{"ID":"579","h":"107","measuredH":"106","measuredW":"33","properties":{"color":"2848996","curvature":"-1","direction":"top","leftArrow":"false","p0":{"x":22,"y":0},"p1":{"x":0.5204368174726989,"y":-0.25273010920436817},"p2":{"x":33,"y":106},"rightArrow":"false","shape":"bezier"},"typeID":"Arrow","w":"34","x":"596","y":"909","zOrder":"61"},{"ID":"598","h":"71","measuredH":"70","measuredW":"201","properties":{"color":"2848996","curvature":"0","direction":"bottom","leftArrow":"false","p0":{"x":201,"y":0,"length":201},"p1":{"x":0.4540175149248531,"y":-0.0022997049873399802,"length":0.4540233391595282},"p2":{"x":0,"y":70,"length":70},"rightArrow":"false","shape":"bezier","stroke":"dotted"},"typeID":"Arrow","w":"202","x":"797","y":"960","zOrder":"60"},{"ID":"599","children":{"controls":{"control":[{"ID":"0","children":{"controls":{"control":[{"ID":"0","h":"41","measuredH":"140","measuredW":"200","properties":{"color":"16776960"},"typeID":"TextArea","w":"196","x":"0","y":"0","zOrder":"0"},{"ID":"1","measuredH":"25","measuredW":"74","properties":{"size":"17","text":"Bootstrap"},"typeID":"Label","w":"72","x":"62","y":"8","zOrder":"1"}]}},"h":"41","measuredH":"41","measuredW":"196","typeID":"__group__","w":"196","x":"0","y":"0","zOrder":"0"},{"ID":"1","children":{"controls":{"control":[{"ID":"0","h":"41","measuredH":"140","measuredW":"200","properties":{"color":"16770457"},"typeID":"TextArea","w":"196","x":"0","y":"0","zOrder":"0"},{"ID":"1","measuredH":"25","measuredW":"124","properties":{"size":"17","text":"Materialize CSS"},"typeID":"Label","w":"128","x":"34","y":"8","zOrder":"1"}]}},"h":"41","measuredH":"41","measuredW":"196","typeID":"__group__","w":"196","x":"0","y":"48","zOrder":"1"},{"ID":"2","children":{"controls":{"control":[{"ID":"0","h":"41","measuredH":"140","measuredW":"200","properties":{"color":"16770457"},"typeID":"TextArea","w":"196","x":"0","y":"0","zOrder":"0"},{"ID":"1","measuredH":"25","measuredW":"47","properties":{"size":"17","text":"Bulma"},"typeID":"Label","w":"48","x":"74","y":"8","zOrder":"1"}]}},"h":"41","measuredH":"41","measuredW":"196","typeID":"__group__","w":"196","x":"0","y":"95","zOrder":"2"},{"ID":"3","children":{"controls":{"control":[{"ID":"0","h":"41","measuredH":"140","measuredW":"200","properties":{"color":"16770457"},"typeID":"TextArea","w":"196","x":"0","y":"0","zOrder":"0"},{"ID":"1","measuredH":"25","measuredW":"96","properties":{"size":"17","text":"Semantic UI"},"typeID":"Label","w":"97","x":"50","y":"8","zOrder":"1"}]}},"h":"41","measuredH":"41","measuredW":"196","typeID":"__group__","w":"196","x":"0","y":"143","zOrder":"3"}]}},"h":"184","measuredH":"184","measuredW":"196","typeID":"__group__","w":"196","x":"982","y":"942","zOrder":"153"},{"ID":"601","h":"162","measuredH":"161","measuredW":"92","properties":{"color":"2848996","curvature":"1","direction":"bottom","leftArrow":"false","p0":{"x":92,"y":0},"p1":{"x":0.4879820026048862,"y":-0.11370722658562568},"p2":{"x":0,"y":161},"rightArrow":"false","shape":"bezier","stroke":"dotted"},"typeID":"Arrow","w":"93","x":"686","y":"592","zOrder":"59"},{"ID":"602","h":"107","measuredH":"106","measuredW":"80","properties":{"color":"2848996","curvature":"1","direction":"bottom","leftArrow":"false","p0":{"x":80,"y":0},"p1":{"x":0.4879820026048862,"y":-0.11370722658562568},"p2":{"x":0,"y":106},"rightArrow":"false","shape":"bezier","stroke":"dotted"},"typeID":"Arrow","w":"81","x":"710","y":"638","zOrder":"58"},{"ID":"603","h":"87","measuredH":"86","measuredW":"233","properties":{"color":"10027263","curvature":"1","direction":"bottom","leftArrow":"false","p0":{"x":233,"y":0},"p1":{"x":0.5070114290346114,"y":-0.07984112831320418},"p2":{"x":0,"y":86},"rightArrow":"false","shape":"bezier","stroke":"dotted"},"typeID":"Arrow","w":"234","x":"702","y":"808","zOrder":"57"},{"ID":"604","h":"27","measuredH":"26","measuredW":"212","properties":{"color":"2848996","curvature":"0","direction":"bottom","leftArrow":"false","p0":{"x":212,"y":0,"length":212},"p1":{"x":0.4540175149248532,"y":-0.002299704987339999,"length":0.4540233391595283},"p2":{"x":0,"y":26,"length":26},"rightArrow":"false","shape":"bezier","stroke":"dotted"},"typeID":"Arrow","w":"213","x":"793","y":"1011","zOrder":"56"},{"ID":"605","h":"15","measuredH":"14","measuredW":"221","properties":{"color":"2848996","curvature":"0","direction":"top","leftArrow":"false","p0":{"x":221,"y":14},"p1":{"x":0.45401751492485337,"y":-0.002299704987340005},"p2":{"x":0,"y":0},"rightArrow":"false","shape":"bezier","stroke":"dotted"},"typeID":"Arrow","w":"222","x":"791","y":"1041","zOrder":"54"},{"ID":"606","h":"60","measuredH":"59","measuredW":"221","properties":{"color":"2848996","curvature":"0","direction":"top","leftArrow":"false","p0":{"x":221,"y":59,"length":228.74002710500844},"p1":{"x":0.45401751492485287,"y":-0.0022997049873399265,"length":0.45402333915952797},"p2":{"x":0,"y":0,"length":0},"rightArrow":"false","shape":"bezier","stroke":"dotted"},"typeID":"Arrow","w":"222","x":"785","y":"1045","zOrder":"55"},{"ID":"607","h":"50","measuredH":"140","measuredW":"200","properties":{"color":"16776960"},"typeID":"TextArea","w":"250","x":"445","y":"1111","zOrder":"154"},{"ID":"608","measuredH":"25","measuredW":"142","properties":{"bold":"true","size":"17","text":"CSS Architecture"},"typeID":"Label","x":"499","y":"1124","zOrder":"155"},{"ID":"609","h":"80","measuredH":"79","measuredW":"23","properties":{"color":"2848996","curvature":"1","direction":"bottom","leftArrow":"false","p0":{"x":0,"y":79},"p1":{"x":0.468398677373642,"y":-0.21530467642890883},"p2":{"x":13,"y":0},"rightArrow":"false","shape":"bezier","text":""},"typeID":"Arrow","w":"24","x":"634","y":"1047","zOrder":"53"},{"ID":"613","h":"40","measuredH":"140","measuredW":"200","properties":{"color":"16776960"},"typeID":"TextArea","w":"146","x":"168","y":"1071","zOrder":"156"},{"ID":"614","measuredH":"25","measuredW":"35","properties":{"size":"17","text":"BEM"},"typeID":"Label","w":"35","x":"224","y":"1079","zOrder":"157"},{"ID":"615","h":"40","measuredH":"140","measuredW":"200","properties":{"color":"16770457"},"typeID":"TextArea","w":"146","x":"168","y":"1162","zOrder":"158"},{"ID":"616","measuredH":"25","measuredW":"70","properties":{"size":"17","text":"SMACSS"},"typeID":"Label","w":"69","x":"207","y":"1170","zOrder":"159"},{"ID":"617","h":"40","measuredH":"140","measuredW":"200","properties":{"color":"16770457"},"typeID":"TextArea","w":"146","x":"168","y":"1116","zOrder":"160"},{"ID":"618","measuredH":"25","measuredW":"62","properties":{"size":"17","text":"OOCSS"},"typeID":"Label","w":"65","x":"209","y":"1124","zOrder":"161"},{"ID":"627","h":"44","measuredH":"43","measuredW":"165","properties":{"color":"2848996","curvature":"-1","direction":"top","leftArrow":"false","p0":{"x":165,"y":43,"length":170.51099671282202},"p1":{"x":0.5145547945205479,"y":-0.017979452054794544,"length":0.5148688155834201},"p2":{"x":0,"y":0,"length":0},"rightArrow":"false","shape":"bezier","stroke":"dotted"},"typeID":"Arrow","w":"166","x":"287","y":"1090","zOrder":"52"},{"ID":"628","h":"6","measuredH":"5","measuredW":"170","properties":{"color":"2848996","curvature":"-1","direction":"top","leftArrow":"false","p0":{"x":170,"y":5,"length":170.07351351694948},"p1":{"x":0.514554794520548,"y":-0.017979452054794513,"length":0.5148688155834202},"p2":{"x":0,"y":2,"length":2},"rightArrow":"false","shape":"bezier","stroke":"dotted"},"typeID":"Arrow","w":"171","x":"281","y":"1138","zOrder":"51"},{"ID":"629","h":"37","measuredH":"36","measuredW":"169","properties":{"color":"2848996","curvature":"1","direction":"bottom","leftArrow":"false","p0":{"x":169,"y":0,"length":169},"p1":{"x":0.5145547945205478,"y":-0.01797945205479484,"length":0.51486881558342},"p2":{"x":0,"y":36,"length":36},"rightArrow":"false","shape":"bezier","stroke":"dotted"},"typeID":"Arrow","w":"170","x":"288","y":"1148","zOrder":"50"},{"ID":"635","h":"40","measuredH":"140","measuredW":"200","properties":{"color":"16770457"},"typeID":"TextArea","w":"270","x":"173","y":"269","zOrder":"91"},{"ID":"636","measuredH":"10","measuredW":"100","properties":{"color":"10027263"},"typeID":"HRule","x":"1126","y":"398","zOrder":"101"},{"ID":"637","h":"185","measuredH":"140","measuredW":"200","properties":{"color":"16770457"},"typeID":"TextArea","w":"116","x":"1195","y":"336","zOrder":"102"},{"ID":"640","h":"42","measuredH":"140","measuredW":"200","properties":{"color":"16770457"},"typeID":"TextArea","w":"297","x":"875","y":"480","zOrder":"107"},{"ID":"641","measuredH":"25","measuredW":"101","properties":{"size":"17","text":"Learn CSS 3"},"typeID":"Label","w":"106","x":"971","y":"489","zOrder":"108"},{"ID":"642","measuredH":"25","measuredW":"46","properties":{"size":"17","text":"Floats"},"typeID":"Label","x":"1230","y":"349","zOrder":"109"},{"ID":"644","measuredH":"25","measuredW":"84","properties":{"size":"17","text":"Positioning"},"typeID":"Label","x":"1211","y":"376","zOrder":"112"},{"ID":"645","measuredH":"25","measuredW":"56","properties":{"size":"17","text":"Display"},"typeID":"Label","x":"1225","y":"403","zOrder":"113"},{"ID":"646","measuredH":"25","measuredW":"79","properties":{"size":"17","text":"Box Model"},"typeID":"Label","x":"1214","y":"430","zOrder":"114"},{"ID":"647","measuredH":"25","measuredW":"73","properties":{"size":"17","text":"CSS Grid"},"typeID":"Label","x":"1217","y":"457","zOrder":"115"},{"ID":"648","measuredH":"25","measuredW":"65","properties":{"size":"17","text":"Flex Box"},"typeID":"Label","x":"1221","y":"484","zOrder":"116"},{"ID":"649","h":"43","measuredH":"140","measuredW":"200","properties":{"color":"16770457"},"typeID":"TextArea","w":"297","x":"875","y":"333","zOrder":"103"},{"ID":"650","measuredH":"25","measuredW":"131","properties":{"size":"17","text":"Learn the basics"},"typeID":"Label","w":"140","x":"954","y":"342","zOrder":"104"},{"ID":"651","h":"47","measuredH":"140","measuredW":"200","properties":{"color":"16770457"},"typeID":"TextArea","w":"298","x":"874","y":"381","zOrder":"105"},{"ID":"652","measuredH":"25","measuredW":"122","properties":{"size":"17","text":"Making Layouts"},"typeID":"Label","w":"130","x":"959","y":"392","zOrder":"106"},{"ID":"653","h":"43","measuredH":"140","measuredW":"200","properties":{"color":"16770457"},"typeID":"TextArea","w":"297","x":"875","y":"432","zOrder":"110"},{"ID":"654","measuredH":"25","measuredW":"113","properties":{"size":"17","text":"Media Queries"},"typeID":"Label","w":"123","x":"963","y":"441","zOrder":"111"},{"ID":"655","h":"145","measuredH":"140","measuredW":"200","properties":{"color":"16770457"},"typeID":"TextArea","w":"270","x":"174","y":"663","zOrder":"123"},{"ID":"657","h":"40","measuredH":"140","measuredW":"200","properties":{"color":"16770457"},"typeID":"TextArea","w":"146","x":"201","y":"878","zOrder":"143"},{"ID":"658","measuredH":"25","measuredW":"70","properties":{"size":"17","text":"PostCSS"},"typeID":"Label","w":"69","x":"240","y":"886","zOrder":"144"},{"ID":"660","h":"154","measuredH":"140","measuredW":"200","properties":{"color":"3355443","text":""},"typeID":"TextArea","w":"447","x":"879","y":"724","zOrder":"146"},{"ID":"662","measuredH":"25","measuredW":"401","properties":{"color":"15658734","size":"17","text":"PostCSS is not a pre-processor but can be used as"},"typeID":"Label","w":"403","x":"902","y":"744","zOrder":"147"},{"ID":"663","measuredH":"25","measuredW":"385","properties":{"color":"15658734","size":"17","text":"one. Go for SASS and revisit PostCSS later. There"},"typeID":"Label","w":"395","x":"902","y":"774","zOrder":"148"},{"ID":"664","measuredH":"25","measuredW":"390","properties":{"color":"15658734","size":"17","text":"is still some {color:yellow}Less{color} in the market but I won't go for it"},"typeID":"Label","w":"395","x":"901","y":"803","zOrder":"149"},{"ID":"665","measuredH":"25","measuredW":"188","properties":{"color":"15658734","size":"17","text":"if I was starting in 2019."},"typeID":"Label","w":"192","x":"901","y":"833","zOrder":"150"},{"ID":"666","h":"159","measuredH":"140","measuredW":"200","properties":{"color":"3355443","text":""},"typeID":"TextArea","w":"502","x":"807","y":"1161","zOrder":"162"},{"ID":"671","h":"86","measuredH":"85","measuredW":"157","properties":{"color":"10027263","curvature":"-1","direction":"top","leftArrow":"false","p0":{"x":157,"y":85},"p1":{"x":0.5048661800486618,"y":-0.06995133819951338},"p2":{"x":0,"y":0},"rightArrow":"false","shape":"bezier","stroke":"dotted"},"typeID":"Arrow","w":"158","x":"689","y":"1137","zOrder":"49"},{"ID":"673","children":{"controls":{"control":[{"ID":"0","measuredH":"25","measuredW":"419","properties":{"color":"15658734","size":"17","text":"With modern front-end frameworks, there is more push"},"typeID":"Label","w":"441","x":"1","y":"0","zOrder":"0"},{"ID":"1","measuredH":"25","measuredW":"447","properties":{"color":"15658734","size":"17","text":"push towards CSS in JS methodologies with which you are"},"typeID":"Label","w":"456","x":"1","y":"31","zOrder":"1"},{"ID":"2","measuredH":"25","measuredW":"460","properties":{"color":"15658734","size":"17","text":"not going to need these. However, you should still learn {color:yellow}BEM{color}"},"typeID":"Label","w":"464","x":"0","y":"61","zOrder":"2"},{"ID":"3","measuredH":"25","measuredW":"379","properties":{"color":"15658734","size":"17","text":"at-least, which would prove helpful in the long run"},"typeID":"Label","w":"447","x":"0","y":"92","zOrder":"3"}]}},"h":"117","measuredH":"117","measuredW":"464","typeID":"__group__","w":"464","x":"826","y":"1182","zOrder":"163"},{"ID":"674","h":"50","measuredH":"140","measuredW":"200","properties":{"color":"16776960"},"typeID":"TextArea","w":"250","x":"285","y":"1302","zOrder":"164"},{"ID":"675","measuredH":"25","measuredW":"87","properties":{"bold":"true","size":"17","text":"Build Tools"},"typeID":"Label","x":"367","y":"1315","zOrder":"165"},{"ID":"676","h":"178","measuredH":"177","measuredW":"165","properties":{"color":"2848996","curvature":"1","direction":"bottom","leftArrow":"false","p0":{"x":165,"y":0},"p1":{"x":0.5791841992271362,"y":-0.19216831258050665},"p2":{"x":1,"y":177},"rightArrow":"false","shape":"bezier"},"typeID":"Arrow","w":"166","x":"421","y":"1148","zOrder":"48"},{"ID":"678","h":"40","measuredH":"140","measuredW":"200","properties":{"color":"16776960"},"typeID":"TextArea","w":"176","x":"755","y":"1371","zOrder":"166"},{"ID":"679","measuredH":"25","measuredW":"92","properties":{"size":"17","text":"npm scripts"},"typeID":"Label","w":"97","x":"795","y":"1379","zOrder":"167"},{"ID":"680","h":"40","measuredH":"140","measuredW":"200","properties":{"color":"16770457"},"typeID":"TextArea","w":"176","x":"754","y":"1417","zOrder":"168"},{"ID":"681","measuredH":"25","measuredW":"34","properties":{"size":"17","text":"gulp"},"typeID":"Label","w":"43","x":"821","y":"1425","zOrder":"169"},{"ID":"682","h":"50","measuredH":"48","measuredW":"67","properties":{"color":"2848996","curvature":"-1","direction":"top","leftArrow":"false","p0":{"x":67,"y":48},"p1":{"x":0.4618427902134305,"y":-0.14294638209266008},"p2":{"x":0,"y":0},"rightArrow":"false","shape":"bezier","stroke":"dotted"},"typeID":"Arrow","w":"69","x":"712","y":"1327","zOrder":"47"},{"ID":"684","h":"90","measuredH":"89","measuredW":"71","properties":{"color":"2848996","curvature":"1","direction":"top","leftArrow":"false","p0":{"x":71,"y":89},"p1":{"x":0.48146182927638126,"y":0.180473569012403},"p2":{"x":0,"y":0},"rightArrow":"false","shape":"bezier","stroke":"dotted"},"typeID":"Arrow","w":"72","x":"700","y":"1347","zOrder":"46"},{"ID":"686","h":"40","measuredH":"140","measuredW":"200","properties":{"color":"16776960"},"typeID":"TextArea","w":"176","x":"710","y":"1497","zOrder":"170"},{"ID":"687","measuredH":"25","measuredW":"72","properties":{"size":"17","text":"Webpack"},"typeID":"Label","w":"72","x":"762","y":"1505","zOrder":"171"},{"ID":"688","h":"40","measuredH":"140","measuredW":"200","properties":{"color":"16770457"},"typeID":"TextArea","w":"176","x":"709","y":"1587","zOrder":"172"},{"ID":"689","measuredH":"25","measuredW":"47","properties":{"size":"17","text":"Rollup"},"typeID":"Label","w":"46","x":"774","y":"1595","zOrder":"173"},{"ID":"692","measuredH":"25","measuredW":"109","properties":{"bold":"true","size":"17","text":"Task Runners"},"typeID":"Label","x":"596","y":"1316","zOrder":"179"},{"ID":"693","h":"1","measuredH":"0","measuredW":"56","properties":{"color":"10027263","curvature":"0","direction":"top","leftArrow":"false","p0":{"x":56,"y":0},"p1":{"x":0.4710383049683653,"y":0.007504046299475207},"p2":{"x":0,"y":0},"rightArrow":"false","shape":"bezier","stroke":"dotted"},"typeID":"Arrow","w":"57","x":"526","y":"1327","zOrder":"45"},{"ID":"694","measuredH":"25","measuredW":"134","properties":{"bold":"true","size":"17","text":"Module Bundlers"},"typeID":"Label","x":"538","y":"1442","zOrder":"177"},{"ID":"695","h":"118","measuredH":"117","measuredW":"79","properties":{"color":"10027263","curvature":"0","direction":"top","leftArrow":"false","p0":{"x":79,"y":117},"p1":{"x":0.48128449573507276,"y":-0.00873055694932263},"p2":{"x":0,"y":0},"rightArrow":"false","shape":"bezier","stroke":"dotted"},"typeID":"Arrow","w":"80","x":"483","y":"1326","zOrder":"44"},{"ID":"697","h":"40","measuredH":"140","measuredW":"200","properties":{"color":"16770457"},"typeID":"TextArea","w":"176","x":"709","y":"1542","zOrder":"174"},{"ID":"698","measuredH":"25","measuredW":"47","properties":{"size":"17","text":"Parcel"},"typeID":"Label","w":"46","x":"774","y":"1550","zOrder":"175"},{"ID":"699","h":"50","measuredH":"140","measuredW":"200","properties":{"color":"16776960"},"typeID":"TextArea","w":"177","x":"515","y":"1429","zOrder":"176"},{"ID":"700","h":"50","measuredH":"140","measuredW":"200","properties":{"color":"16776960"},"typeID":"TextArea","w":"138","x":"579","y":"1302","zOrder":"178"},{"ID":"701","h":"46","measuredH":"45","measuredW":"75","properties":{"color":"10027263","curvature":"1","direction":"top","leftArrow":"false","p0":{"x":75,"y":45},"p1":{"x":0.5980392156862746,"y":0.2254901960784314},"p2":{"x":0,"y":0},"rightArrow":"false","shape":"bezier","stroke":"dotted"},"typeID":"Arrow","w":"76","x":"649","y":"1473","zOrder":"43"},{"ID":"702","h":"93","measuredH":"92","measuredW":"106","properties":{"color":"10027263","curvature":"1","direction":"top","leftArrow":"false","p0":{"x":106,"y":92,"length":140.356688476182},"p1":{"x":0.5242639593908629,"y":0.20030456852791878,"length":0.5612259966264392},"p2":{"x":0,"y":0,"length":0},"rightArrow":"false","shape":"bezier","stroke":"dotted"},"typeID":"Arrow","w":"107","x":"620","y":"1471","zOrder":"42"},{"ID":"703","h":"133","measuredH":"132","measuredW":"123","properties":{"color":"10027263","curvature":"1","direction":"top","leftArrow":"false","p0":{"x":123,"y":132},"p1":{"x":0.4752557367984518,"y":0.20108745737720027},"p2":{"x":0,"y":0},"rightArrow":"false","shape":"bezier","stroke":"dotted"},"typeID":"Arrow","w":"124","x":"598","y":"1475","zOrder":"41"},{"ID":"704","h":"50","measuredH":"140","measuredW":"200","properties":{"color":"16776960"},"typeID":"TextArea","w":"225","x":"169","y":"1401","zOrder":"180"},{"ID":"705","measuredH":"25","measuredW":"187","properties":{"bold":"true","size":"17","text":"Linters and Formatters"},"typeID":"Label","x":"188","y":"1414","zOrder":"181"},{"ID":"706","h":"94","measuredH":"93","measuredW":"74","properties":{"color":"10027263","curvature":"-1","direction":"bottom","leftArrow":"false","p0":{"x":0,"y":93},"p1":{"x":0.6083656396653744,"y":0.21440522342379104},"p2":{"x":74,"y":1},"rightArrow":"false","shape":"bezier","stroke":"dotted"},"typeID":"Arrow","w":"75","x":"231","y":"1324","zOrder":"40"},{"ID":"713","h":"40","measuredH":"140","measuredW":"200","properties":{"color":"16776960"},"typeID":"TextArea","w":"176","x":"710","y":"1497","zOrder":"185"},{"ID":"714","measuredH":"25","measuredW":"72","properties":{"size":"17","text":"Webpack"},"typeID":"Label","w":"72","x":"762","y":"1505","zOrder":"186"},{"ID":"715","h":"40","measuredH":"140","measuredW":"200","properties":{"color":"16770457"},"typeID":"TextArea","w":"176","x":"709","y":"1587","zOrder":"187"},{"ID":"716","measuredH":"25","measuredW":"47","properties":{"size":"17","text":"Rollup"},"typeID":"Label","w":"46","x":"774","y":"1595","zOrder":"188"},{"ID":"717","h":"40","measuredH":"140","measuredW":"200","properties":{"color":"16770457"},"typeID":"TextArea","w":"176","x":"709","y":"1542","zOrder":"189"},{"ID":"718","measuredH":"25","measuredW":"47","properties":{"size":"17","text":"Parcel"},"typeID":"Label","w":"46","x":"774","y":"1550","zOrder":"190"},{"ID":"729","children":{"controls":{"control":[{"ID":"0","h":"40","measuredH":"140","measuredW":"200","properties":{"color":"16770457"},"typeID":"TextArea","w":"176","x":"0","y":"0","zOrder":"0"},{"ID":"1","measuredH":"25","measuredW":"46","properties":{"size":"17","text":"JSCS"},"typeID":"Label","w":"45","x":"66","y":"8","zOrder":"1"}]}},"h":"40","measuredH":"40","measuredW":"176","typeID":"__group__","w":"176","x":"172","y":"1676","zOrder":"192"},{"ID":"730","children":{"controls":{"control":[{"ID":"0","h":"40","measuredH":"140","measuredW":"200","properties":{"color":"16770457"},"typeID":"TextArea","w":"176","x":"0","y":"0","zOrder":"0"},{"ID":"1","measuredH":"25","measuredW":"51","properties":{"size":"17","text":"JSLint"},"typeID":"Label","w":"55","x":"61","y":"8","zOrder":"1"}]}},"h":"40","measuredH":"40","measuredW":"176","typeID":"__group__","w":"176","x":"172","y":"1631","zOrder":"191"},{"ID":"731","children":{"controls":{"control":[{"ID":"0","h":"40","measuredH":"140","measuredW":"200","properties":{"color":"16770457"},"typeID":"TextArea","w":"176","x":"0","y":"0","zOrder":"0"},{"ID":"1","measuredH":"25","measuredW":"53","properties":{"size":"17","text":"JSHint"},"typeID":"Label","w":"55","x":"65","y":"8","zOrder":"1"}]}},"h":"40","measuredH":"40","measuredW":"176","typeID":"__group__","w":"176","x":"172","y":"1586","zOrder":"183"},{"ID":"732","children":{"controls":{"control":[{"ID":"0","h":"40","measuredH":"140","measuredW":"200","properties":{"color":"16776960"},"typeID":"TextArea","w":"176","x":"0","y":"0","zOrder":"0"},{"ID":"1","measuredH":"25","measuredW":"52","properties":{"size":"17","text":"ESLint"},"typeID":"Label","w":"52","x":"62","y":"8","zOrder":"1"}]}},"h":"40","measuredH":"40","measuredW":"176","typeID":"__group__","w":"176","x":"172","y":"1540","zOrder":"184"},{"ID":"733","children":{"controls":{"control":[{"ID":"0","h":"40","measuredH":"140","measuredW":"200","properties":{"color":"16776960"},"typeID":"TextArea","w":"176","x":"0","y":"0","zOrder":"0"},{"ID":"1","measuredH":"25","measuredW":"59","properties":{"size":"17","text":"Prettier"},"typeID":"Label","w":"58","x":"59","y":"8","zOrder":"1"}]}},"h":"40","measuredH":"40","measuredW":"176","typeID":"__group__","w":"176","x":"172","y":"1495","zOrder":"182"},{"ID":"734","h":"71","measuredH":"70","measuredW":"1","properties":{"color":"10027263","curvature":"0","direction":"top","leftArrow":"false","p0":{"x":1,"y":70,"length":70.00714249274856},"p1":{"x":0.4684719913970086,"y":0.002835076742594586,"length":0.468480569910445},"p2":{"x":1,"y":0,"length":1},"rightArrow":"false","shape":"bezier","stroke":"dotted"},"typeID":"Arrow","w":"2","x":"260","y":"1444","zOrder":"39"},{"ID":"735","h":"366","measuredH":"365","measuredW":"210","properties":{"color":"2848996","curvature":"-1","direction":"top","leftArrow":"false","p0":{"x":0,"y":0},"p1":{"x":0.5220922035809953,"y":-0.1496968842520795},"p2":{"x":210,"y":365},"rightArrow":"false","shape":"bezier"},"typeID":"Arrow","w":"211","x":"421","y":"1347","zOrder":"38"},{"ID":"737","h":"92","measuredH":"91","measuredW":"61","properties":{"color":"2848996","curvature":"1","direction":"top","leftArrow":"false","p0":{"x":61,"y":90,"length":108.72442227944924},"p1":{"x":0.3707257501744591,"y":0.3166434054431262,"length":0.4875455138272071},"p2":{"x":3,"y":0,"length":3},"rightArrow":"false","shape":"bezier","stroke":"dotted"},"typeID":"Arrow","w":"62","x":"958","y":"1750","zOrder":"193"},{"ID":"738","h":"22","measuredH":"21","measuredW":"170","properties":{"color":"2848996","curvature":"0","direction":"top","leftArrow":"false","p0":{"x":170,"y":21,"length":171.29214809792072},"p1":{"x":0.473885155772755,"y":0.0022907758094073884,"length":0.4738906925817147},"p2":{"x":0,"y":0,"length":0},"rightArrow":"false","shape":"bezier","stroke":"dotted"},"typeID":"Arrow","w":"171","x":"780","y":"1732","zOrder":"194"},{"ID":"739","h":"3","measuredH":"2","measuredW":"145","properties":{"color":"2848996","curvature":"0","direction":"bottom","leftArrow":"false","p0":{"x":145,"y":0,"length":145},"p1":{"x":0.4738851557727549,"y":0.002290775809407207,"length":0.4738906925817146},"p2":{"x":0,"y":2,"length":2},"rightArrow":"false","shape":"bezier","stroke":"dotted"},"typeID":"Arrow","w":"146","x":"785","y":"1716","zOrder":"195"},{"ID":"740","h":"115","measuredH":"114","measuredW":"96","properties":{"color":"2848996","curvature":"1","direction":"bottom","leftArrow":"false","p0":{"x":0,"y":113},"p1":{"x":0.4250070996795001,"y":-0.2717757312669885},"p2":{"x":96,"y":0},"rightArrow":"false","shape":"bezier","stroke":"dotted"},"typeID":"Arrow","w":"97","x":"1008","y":"1563","zOrder":"196"},{"ID":"741","h":"208","measuredH":"140","measuredW":"200","properties":{"color":"16777215"},"typeID":"TextArea","w":"205","x":"999","y":"1359","zOrder":"197"},{"ID":"742","h":"32","measuredH":"31","measuredW":"146","properties":{"color":"2848996","curvature":"0","direction":"bottom","leftArrow":"false","p0":{"x":0,"y":31},"p1":{"x":0.473885155772755,"y":0.002290775809407396},"p2":{"x":146,"y":0},"rightArrow":"false","shape":"bezier","stroke":"dotted"},"typeID":"Arrow","w":"147","x":"778","y":"1676","zOrder":"198"},{"ID":"743","h":"51","measuredH":"140","measuredW":"200","properties":{"color":"16776960"},"typeID":"TextArea","w":"224","x":"561","y":"1694","zOrder":"199"},{"ID":"744","measuredH":"26","measuredW":"149","properties":{"bold":"true","size":"18","text":"Pick a Framework"},"typeID":"Label","w":"148","x":"599","y":"1707","zOrder":"200"},{"ID":"746","measuredH":"32","measuredW":"82","properties":{"align":"center","color":"16776960","size":"18","text":"React.js"},"typeID":"TextInput","w":"147","x":"886","y":"1661","zOrder":"201"},{"ID":"747","measuredH":"32","measuredW":"67","properties":{"align":"center","color":"16776960","size":"18","text":"Redux"},"typeID":"TextInput","w":"176","x":"1013","y":"1376","zOrder":"202"},{"ID":"748","measuredH":"32","measuredW":"60","properties":{"align":"center","color":"16776960","size":"18","text":"MobX"},"typeID":"TextInput","w":"176","x":"1013","y":"1415","zOrder":"203"},{"ID":"749","measuredH":"25","measuredW":"173","properties":{"size":"17","text":"These are not specific"},"typeID":"Label","x":"1013","y":"1457","zOrder":"204"},{"ID":"750","measuredH":"25","measuredW":"166","properties":{"size":"17","text":"to React though, you "},"typeID":"Label","x":"1013","y":"1480","zOrder":"205"},{"ID":"751","measuredH":"25","measuredW":"161","properties":{"size":"17","text":"can use them in any "},"typeID":"Label","x":"1013","y":"1504","zOrder":"206"},{"ID":"752","measuredH":"25","measuredW":"136","properties":{"size":"17","text":"framework or app"},"typeID":"Label","x":"1013","y":"1528","zOrder":"207"},{"ID":"753","measuredH":"32","measuredW":"63","properties":{"align":"center","color":"16770457","size":"18","text":"Vue.js"},"typeID":"TextInput","w":"147","x":"886","y":"1736","zOrder":"208"},{"ID":"754","measuredH":"32","measuredW":"80","properties":{"align":"center","color":"16770457","size":"18","text":"Angular"},"typeID":"TextInput","w":"147","x":"886","y":"1699","zOrder":"209"},{"ID":"755","measuredH":"32","measuredW":"60","properties":{"align":"center","color":"16776960","size":"18","text":"RxJS"},"typeID":"TextInput","w":"176","x":"1118","y":"1680","zOrder":"210"},{"ID":"756","measuredH":"32","measuredW":"52","properties":{"align":"center","color":"16776960","size":"18","text":"ngrx"},"typeID":"TextInput","w":"176","x":"1118","y":"1716","zOrder":"211"},{"ID":"757","measuredH":"32","measuredW":"55","properties":{"align":"center","color":"16776960","size":"18","text":"Vuex"},"typeID":"TextInput","w":"176","x":"1003","y":"1826","zOrder":"212"},{"ID":"758","h":"21","measuredH":"20","measuredW":"123","properties":{"color":"2848996","curvature":"0","direction":"bottom","leftArrow":"false","p0":{"x":123,"y":0,"length":123},"p1":{"x":0.473885155772755,"y":0.00229077580940721,"length":0.4738906925817147},"p2":{"x":0,"y":20,"length":20},"rightArrow":"false","shape":"bezier","stroke":"dotted"},"typeID":"Arrow","w":"124","x":"1011","y":"1694","zOrder":"37"},{"ID":"759","h":"16","measuredH":"15","measuredW":"123","properties":{"color":"2848996","curvature":"0","direction":"top","leftArrow":"false","p0":{"x":123,"y":15,"length":123.9112585683803},"p1":{"x":0.4738851557727549,"y":0.0022907758094072007,"length":0.4738906925817146},"p2":{"x":0,"y":0,"length":0},"rightArrow":"false","shape":"bezier","stroke":"dotted"},"typeID":"Arrow","w":"124","x":"1017","y":"1718","zOrder":"36"},{"ID":"760","h":"202","measuredH":"201","measuredW":"97","properties":{"color":"2848996","curvature":"1","direction":"top","leftArrow":"false","p0":{"x":0,"y":0},"p1":{"x":0.5495265293852397,"y":0.24395009770028558},"p2":{"x":76,"y":201},"rightArrow":"false","shape":"bezier"},"typeID":"Arrow","w":"98","x":"664","y":"1727","zOrder":"35"},{"ID":"761","h":"50","measuredH":"140","measuredW":"200","properties":{"color":"16776960"},"typeID":"TextArea","w":"191","x":"613","y":"2065","zOrder":"213"},{"ID":"762","measuredH":"25","measuredW":"146","properties":{"bold":"true","size":"17","text":"Testing your Apps"},"typeID":"Label","x":"636","y":"2078","zOrder":"214"},{"ID":"787","h":"4","measuredH":"3","measuredW":"149","properties":{"color":"2848996","curvature":"1","direction":"top","leftArrow":"false","p0":{"x":149,"y":3},"p1":{"x":0.5424177701836822,"y":0.010081161896625373},"p2":{"x":0,"y":0},"rightArrow":"false","shape":"bezier","stroke":"dotted"},"typeID":"Arrow","w":"150","x":"481","y":"2089","zOrder":"34"},{"ID":"796","h":"203","measuredH":"202","measuredW":"186","properties":{"color":"2848996","curvature":"-1","direction":"bottom","leftArrow":"false","p0":{"x":186,"y":0},"p1":{"x":0.4884615384615385,"y":0.15769230769230771},"p2":{"x":0,"y":202},"rightArrow":"false","shape":"bezier","stroke":"dotted"},"typeID":"Arrow","w":"187","x":"477","y":"2096","zOrder":"33"},{"ID":"808","children":{"controls":{"control":[{"ID":"0","h":"138","measuredH":"140","measuredW":"200","properties":{"color":"3355443"},"typeID":"TextArea","w":"439","x":"0","y":"0","zOrder":"0"},{"ID":"1","children":{"controls":{"control":[{"ID":"0","measuredH":"25","measuredW":"344","properties":{"color":"15658734","size":"17","text":"Before you start this, you should have a good"},"typeID":"Label","w":"403","x":"0","y":"0","zOrder":"0"},{"ID":"1","measuredH":"25","measuredW":"395","properties":{"color":"15658734","size":"17","text":"understanding of what single page applications are"},"typeID":"Label","w":"395","x":"0","y":"29","zOrder":"1"},{"ID":"2","measuredH":"25","measuredW":"409","properties":{"color":"15658734","size":"17","text":"how they work and what are some of the positive and"},"typeID":"Label","w":"411","x":"0","y":"57","zOrder":"2"},{"ID":"3","measuredH":"25","measuredW":"347","properties":{"color":"15658734","size":"17","text":"negative aspects of single page applications."},"typeID":"Label","w":"411","x":"0","y":"86","zOrder":"3"}]}},"h":"111","measuredH":"111","measuredW":"411","typeID":"__group__","w":"411","x":"16","y":"14","zOrder":"1"}]}},"h":"138","measuredH":"138","measuredW":"439","typeID":"__group__","w":"439","x":"153","y":"1790","zOrder":"221"},{"ID":"809","h":"103","measuredH":"102","measuredW":"210","properties":{"color":"2848996","curvature":"1","direction":"bottom","leftArrow":"false","p0":{"x":210,"y":1},"p1":{"x":0.4817959153606748,"y":-0.12695898786394358},"p2":{"x":0,"y":102},"rightArrow":"false","shape":"bezier","stroke":"dotted"},"typeID":"Arrow","w":"211","x":"365","y":"1722","zOrder":"32"},{"ID":"810","measuredH":"25","measuredW":"239","properties":{"size":"17","text":"Hosting, Event Bubbling, Scope"},"typeID":"Label","w":"238","x":"191","y":"708","zOrder":"124"},{"ID":"811","measuredH":"25","measuredW":"243","properties":{"size":"17","text":"Prototype, Shadow DOM, strict,"},"typeID":"Label","w":"245","x":"187","y":"737","zOrder":"125"},{"ID":"812","measuredH":"25","measuredW":"197","properties":{"size":"17","text":"Understand the concepts"},"typeID":"Label","w":"202","x":"209","y":"678","zOrder":"126"},{"ID":"822","h":"133","measuredH":"132","measuredW":"153","properties":{"color":"2848996","curvature":"1","direction":"top","leftArrow":"false","p0":{"x":0,"y":0},"p1":{"x":0.5986334582323121,"y":0.12431121886709279},"p2":{"x":153,"y":132},"rightArrow":"false","shape":"bezier"},"typeID":"Arrow","w":"154","x":"722","y":"2104","zOrder":"31"},{"ID":"823","h":"50","measuredH":"140","measuredW":"200","properties":{"color":"16770457"},"typeID":"TextArea","w":"226","x":"771","y":"2214","zOrder":"222"},{"ID":"824","measuredH":"25","measuredW":"180","properties":{"bold":"true","size":"17","text":"Progressive Web Apps"},"typeID":"Label","x":"794","y":"2227","zOrder":"223"},{"ID":"853","h":"50","measuredH":"140","measuredW":"200","properties":{"color":"16776960"},"typeID":"TextArea","w":"226","x":"508","y":"2409","zOrder":"224"},{"ID":"854","measuredH":"25","measuredW":"120","properties":{"bold":"true","size":"17","text":"Type Checkers"},"typeID":"Label","x":"561","y":"2422","zOrder":"225"},{"ID":"861","h":"50","measuredH":"140","measuredW":"200","properties":{"color":"16770457"},"typeID":"TextArea","w":"248","x":"478","y":"2623","zOrder":"226"},{"ID":"862","measuredH":"25","measuredW":"184","properties":{"bold":"true","size":"17","text":"Server Side Rendering"},"typeID":"Label","x":"510","y":"2636","zOrder":"227"},{"ID":"864","h":"41","measuredH":"140","measuredW":"200","properties":{"color":"16776960"},"typeID":"TextArea","w":"116","x":"292","y":"2541","zOrder":"228"},{"ID":"865","measuredH":"25","measuredW":"64","properties":{"size":"17","text":"React.js"},"typeID":"Label","w":"69","x":"315","y":"2549","zOrder":"229"},{"ID":"868","h":"90","measuredH":"89","measuredW":"106","properties":{"color":"2848996","curvature":"-1","direction":"top","leftArrow":"false","p0":{"x":106,"y":89,"length":138.4088147481944},"p1":{"x":0.6104670902653149,"y":-0.01503613522820974,"length":0.6106522362684027},"p2":{"x":0,"y":0,"length":0},"rightArrow":"false","shape":"bezier","stroke":"dotted"},"typeID":"Arrow","w":"107","x":"392","y":"2559","zOrder":"8"},{"ID":"871","h":"29","measuredH":"28","measuredW":"87","properties":{"color":"2848996","curvature":"0","direction":"top","leftArrow":"false","p0":{"x":0,"y":0,"length":0},"p1":{"x":0.4835193355826628,"y":0.0072670646249675735,"length":0.48357394275391136},"p2":{"x":87,"y":28,"length":91.39474820797966},"rightArrow":"false","shape":"bezier","stroke":"dotted"},"typeID":"Arrow","w":"88","x":"226","y":"2534","zOrder":"29"},{"ID":"872","h":"11","measuredH":"10","measuredW":"92","properties":{"color":"2848996","curvature":"-1","direction":"top","leftArrow":"false","p0":{"x":92,"y":10,"length":92.5418824100742},"p1":{"x":0.6165131354486524,"y":-0.02797679972705563,"length":0.6171475897252586},"p2":{"x":0,"y":1,"length":1},"rightArrow":"false","shape":"bezier","stroke":"dotted"},"typeID":"Arrow","w":"93","x":"398","y":"2644","zOrder":"7"},{"ID":"877","h":"41","measuredH":"140","measuredW":"200","properties":{"color":"16770457"},"typeID":"TextArea","w":"115","x":"293","y":"2624","zOrder":"230"},{"ID":"878","measuredH":"25","measuredW":"62","properties":{"size":"17","text":"Angular"},"typeID":"Label","w":"62","x":"324","y":"2632","zOrder":"231"},{"ID":"880","h":"4","measuredH":"3","measuredW":"64","properties":{"color":"2848996","curvature":"1","direction":"bottom","leftArrow":"false","p0":{"x":0,"y":3,"length":3},"p1":{"x":0.4807692307692308,"y":-0.01923076923076923,"length":0.48115369243064626},"p2":{"x":64,"y":0,"length":64},"rightArrow":"false","shape":"bezier","stroke":"dotted"},"typeID":"Arrow","w":"65","x":"240","y":"2641","zOrder":"27"},{"ID":"881","h":"41","measuredH":"140","measuredW":"200","properties":{"color":"16770457"},"typeID":"TextArea","w":"97","x":"149","y":"2624","zOrder":"232"},{"ID":"882","measuredH":"25","measuredW":"72","properties":{"size":"17","text":"Universal"},"typeID":"Label","w":"73","x":"161","y":"2632","zOrder":"233"},{"ID":"883","h":"41","measuredH":"140","measuredW":"200","properties":{"color":"16776960"},"typeID":"TextArea","w":"94","x":"149","y":"2514","zOrder":"234"},{"ID":"884","measuredH":"25","measuredW":"54","properties":{"size":"17","text":"Next.js"},"typeID":"Label","w":"54","x":"169","y":"2522","zOrder":"235"},{"ID":"885","h":"41","measuredH":"140","measuredW":"200","properties":{"color":"16770457"},"typeID":"TextArea","w":"94","x":"149","y":"2561","zOrder":"236"},{"ID":"886","measuredH":"25","measuredW":"55","properties":{"size":"17","text":"After.js"},"typeID":"Label","w":"53","x":"170","y":"2569","zOrder":"237"},{"ID":"893","h":"17","measuredH":"16","measuredW":"72","properties":{"color":"2848996","curvature":"0","direction":"bottom","leftArrow":"false","p0":{"x":0,"y":16,"length":16},"p1":{"x":0.4835193355826628,"y":0.007267064624967561,"length":0.48357394275391136},"p2":{"x":72,"y":0,"length":72},"rightArrow":"false","shape":"bezier","stroke":"dotted"},"typeID":"Arrow","w":"73","x":"229","y":"2566","zOrder":"28"},{"ID":"894","h":"2","measuredH":"1","measuredW":"64","properties":{"color":"2848996","curvature":"-1","direction":"top","leftArrow":"false","p0":{"x":0,"y":0,"length":0},"p1":{"x":0.4807692307692308,"y":-0.01923076923076923,"length":0.48115369243064626},"p2":{"x":64,"y":1,"length":64.00781202322104},"rightArrow":"false","shape":"bezier","stroke":"dotted"},"typeID":"Arrow","w":"65","x":"240","y":"2697","zOrder":"238"},{"ID":"895","h":"41","measuredH":"140","measuredW":"200","properties":{"color":"16770457"},"typeID":"TextArea","w":"115","x":"293","y":"2677","zOrder":"239"},{"ID":"896","measuredH":"25","measuredW":"46","properties":{"size":"17","text":"Vue.js"},"typeID":"Label","w":"48","x":"327","y":"2685","zOrder":"240"},{"ID":"897","h":"41","measuredH":"140","measuredW":"200","properties":{"color":"16770457"},"typeID":"TextArea","w":"97","x":"149","y":"2677","zOrder":"241"},{"ID":"898","measuredH":"25","measuredW":"54","properties":{"size":"17","text":"Nuxt.js"},"typeID":"Label","w":"55","x":"170","y":"2685","zOrder":"242"},{"ID":"899","h":"38","measuredH":"37","measuredW":"107","properties":{"color":"2848996","curvature":"1","direction":"bottom","leftArrow":"false","p0":{"x":107,"y":1,"length":107.00467279516349},"p1":{"x":0.39756767359748935,"y":-0.06834052569635155,"length":0.40339866452700796},"p2":{"x":0,"y":37,"length":37},"rightArrow":"false","shape":"bezier","stroke":"dotted"},"typeID":"Arrow","w":"108","x":"393","y":"2663","zOrder":"6"},{"ID":"901","h":"39","measuredH":"38","measuredW":"192","properties":{"color":"2848996","curvature":"1","direction":"bottom","leftArrow":"false","p0":{"x":0,"y":5},"p1":{"x":0.39153412006157,"y":-0.18640328373524884},"p2":{"x":192,"y":0},"rightArrow":"false","shape":"bezier"},"typeID":"Arrow","w":"193","x":"639","y":"2665","zOrder":"26"},{"ID":"903","h":"50","measuredH":"140","measuredW":"200","properties":{"color":"16770457"},"typeID":"TextArea","w":"248","x":"821","y":"2643","zOrder":"243"},{"ID":"904","measuredH":"25","measuredW":"183","properties":{"bold":"true","size":"17","text":"Static Site Generators"},"typeID":"Label","x":"859","y":"2656","zOrder":"244"},{"ID":"905","h":"7","measuredH":"6","measuredW":"99","properties":{"color":"2848996","curvature":"1","direction":"bottom","leftArrow":"false","p0":{"x":99,"y":0,"length":99},"p1":{"x":0.5446782555657212,"y":-0.012808783165599275,"length":0.5448288419424034},"p2":{"x":0,"y":6,"length":6},"rightArrow":"false","shape":"bezier","stroke":"dotted"},"typeID":"Arrow","w":"100","x":"1056","y":"2663","zOrder":"3"},{"ID":"906","h":"41","measuredH":"140","measuredW":"200","properties":{"color":"16776960"},"typeID":"TextArea","w":"147","x":"1126","y":"2644","zOrder":"245"},{"ID":"907","measuredH":"25","measuredW":"77","properties":{"size":"17","text":"GatsbyJS"},"typeID":"Label","w":"78","x":"1161","y":"2652","zOrder":"246"},{"ID":"908","h":"50","measuredH":"140","measuredW":"200","properties":{"color":"16770457"},"typeID":"TextArea","w":"210","x":"791","y":"2757","zOrder":"247"},{"ID":"910","h":"95","measuredH":"94","measuredW":"38","properties":{"color":"2848996","curvature":"-1","direction":"bottom","leftArrow":"false","p0":{"x":36,"y":0,"length":36},"p1":{"x":0.5467857377372116,"y":0.1745354258322937,"length":0.573966251502026},"p2":{"x":0,"y":94,"length":94},"rightArrow":"false","shape":"bezier"},"typeID":"Arrow","w":"39","x":"891","y":"2674","zOrder":"25"},{"ID":"911","measuredH":"25","measuredW":"171","properties":{"bold":"true","size":"17","text":"Desktop Applications"},"typeID":"Label","x":"813","y":"2771","zOrder":"248"},{"ID":"914","h":"41","measuredH":"140","measuredW":"200","properties":{"color":"16776960"},"typeID":"TextArea","w":"188","x":"1074","y":"2720","zOrder":"249"},{"ID":"915","measuredH":"25","measuredW":"64","properties":{"size":"17","text":"Electron"},"typeID":"Label","w":"64","x":"1136","y":"2728","zOrder":"250"},{"ID":"916","h":"36","measuredH":"35","measuredW":"97","properties":{"color":"2848996","curvature":"0","direction":"bottom","leftArrow":"false","p0":{"x":0,"y":35,"length":35},"p1":{"x":0.4319942611190818,"y":-0.006169296987087552,"length":0.4320383106451745},"p2":{"x":97,"y":0,"length":97},"rightArrow":"false","shape":"bezier","stroke":"dotted"},"typeID":"Arrow","w":"98","x":"984","y":"2746","zOrder":"24"},{"ID":"917","h":"88","measuredH":"87","measuredW":"205","properties":{"color":"2848996","curvature":"1","direction":"bottom","leftArrow":"false","p0":{"x":205,"y":1,"length":205.00243900988104},"p1":{"x":0.6338600999575079,"y":-0.16347301754314972,"length":0.6546006826935066},"p2":{"x":0,"y":87,"length":87},"rightArrow":"false","shape":"bezier"},"typeID":"Arrow","w":"206","x":"618","y":"2781","zOrder":"23"},{"ID":"918","h":"50","measuredH":"140","measuredW":"200","properties":{"color":"16770457"},"typeID":"TextArea","w":"210","x":"469","y":"2840","zOrder":"251"},{"ID":"919","measuredH":"25","measuredW":"157","properties":{"bold":"true","size":"17","text":"Mobile Applications"},"typeID":"Label","w":"157","x":"496","y":"2853","zOrder":"252"},{"ID":"920","h":"11","measuredH":"10","measuredW":"174","properties":{"color":"2848996","curvature":"0","direction":"top","leftArrow":"false","p0":{"x":0,"y":0,"length":0},"p1":{"x":0.4319942611190819,"y":-0.006169296987087518,"length":0.4320383106451746},"p2":{"x":174,"y":10,"length":174.28711943227475},"rightArrow":"false","shape":"bezier","stroke":"dotted"},"typeID":"Arrow","w":"175","x":"304","y":"2847","zOrder":"22"},{"ID":"921","h":"41","measuredH":"140","measuredW":"200","properties":{"color":"16776960"},"typeID":"TextArea","w":"147","x":"169","y":"2822","zOrder":"253"},{"ID":"922","measuredH":"25","measuredW":"100","properties":{"size":"17","text":"React Native"},"typeID":"Label","w":"101","x":"192","y":"2830","zOrder":"254"},{"ID":"923","h":"80","measuredH":"79","measuredW":"269","properties":{"color":"2848996","curvature":"-1","direction":"top","leftArrow":"false","p0":{"x":269,"y":79,"length":280.36048223670895},"p1":{"x":0.3554465668559629,"y":-0.1396489416623645,"length":0.38189538986103116},"p2":{"x":0,"y":3,"length":3},"rightArrow":"false","shape":"bezier"},"typeID":"Arrow","w":"270","x":"655","y":"2866","zOrder":"21"},{"ID":"924","h":"50","measuredH":"140","measuredW":"200","properties":{"color":"16770457"},"typeID":"TextArea","w":"210","x":"825","y":"2928","zOrder":"255"},{"ID":"925","measuredH":"25","measuredW":"118","properties":{"bold":"true","size":"17","text":"Web Assembly"},"typeID":"Label","x":"871","y":"2941","zOrder":"256"},{"ID":"928","h":"50","measuredH":"140","measuredW":"200","properties":{"color":"16776960"},"typeID":"TextArea","w":"207","x":"839","y":"3104","zOrder":"257"},{"ID":"929","measuredH":"25","measuredW":"117","properties":{"bold":"true","size":"17","text":"Keep Learning"},"typeID":"Label","x":"884","y":"3117","zOrder":"258"},{"ID":"930","h":"41","measuredH":"140","measuredW":"200","properties":{"color":"16770457"},"typeID":"TextArea","w":"188","x":"1075","y":"2769","zOrder":"259"},{"ID":"931","measuredH":"25","measuredW":"104","properties":{"size":"17","text":"Proton Native"},"typeID":"Label","w":"107","x":"1116","y":"2777","zOrder":"260"},{"ID":"932","h":"8","measuredH":"7","measuredW":"103","properties":{"color":"2848996","curvature":"0","direction":"top","leftArrow":"false","p0":{"x":0,"y":0,"length":0},"p1":{"x":0.43199426111908185,"y":-0.006169296987087555,"length":0.43203831064517456},"p2":{"x":103,"y":7,"length":103.23759005323593},"rightArrow":"false","shape":"bezier","stroke":"dotted"},"typeID":"Arrow","w":"104","x":"985","y":"2782","zOrder":"20"},{"ID":"933","h":"41","measuredH":"140","measuredW":"200","properties":{"color":"16770457"},"typeID":"TextArea","w":"188","x":"1075","y":"2817","zOrder":"261"},{"ID":"934","measuredH":"25","measuredW":"42","properties":{"size":"17","text":"Carlo"},"typeID":"Label","w":"42","x":"1148","y":"2825","zOrder":"262"},{"ID":"935","h":"43","measuredH":"42","measuredW":"98","properties":{"color":"2848996","curvature":"0","direction":"top","leftArrow":"false","p0":{"x":0,"y":0,"length":0},"p1":{"x":0.43199426111908185,"y":-0.006169296987087567,"length":0.43203831064517456},"p2":{"x":98,"y":42,"length":106.62082348209472},"rightArrow":"false","shape":"bezier","stroke":"dotted"},"typeID":"Arrow","w":"99","x":"992","y":"2792","zOrder":"19"},{"ID":"936","h":"41","measuredH":"140","measuredW":"200","properties":{"color":"16770457"},"typeID":"TextArea","w":"147","x":"169","y":"2868","zOrder":"263"},{"ID":"937","measuredH":"25","measuredW":"95","properties":{"size":"17","text":"NativeScript"},"typeID":"Label","w":"101","x":"192","y":"2876","zOrder":"264"},{"ID":"938","h":"31","measuredH":"30","measuredW":"194","properties":{"color":"2848996","curvature":"0","direction":"bottom","leftArrow":"false","p0":{"x":0,"y":30,"length":30},"p1":{"x":0.4319942611190819,"y":-0.006169296987087524,"length":0.4320383106451746},"p2":{"x":194,"y":0,"length":194},"rightArrow":"false","shape":"bezier","stroke":"dotted"},"typeID":"Arrow","w":"195","x":"296","y":"2867","zOrder":"18"},{"ID":"948","h":"52","measuredH":"51","measuredW":"214","properties":{"color":"2848996","curvature":"-1","direction":"bottom","leftArrow":"false","p0":{"x":0,"y":51,"length":51},"p1":{"x":0.4003471278308693,"y":0.12609523012902282,"length":0.41973542836377015},"p2":{"x":214,"y":6,"length":214.0840956259946},"rightArrow":"false","shape":"bezier","stroke":"dotted"},"typeID":"Arrow","w":"215","x":"634","y":"2948","zOrder":"17"},{"ID":"949","children":{"controls":{"control":[{"ID":"0","h":"185","measuredH":"140","measuredW":"200","properties":{"color":"3355443","text":""},"typeID":"TextArea","w":"582","x":"0","y":"0","zOrder":"0"},{"ID":"1","measuredH":"25","measuredW":"507","properties":{"color":"15658734","size":"17","text":"Web Assembly or WASM is the binary instructions generated from"},"typeID":"Label","w":"524","x":"20","y":"21","zOrder":"1"},{"ID":"2","measuredH":"25","measuredW":"501","properties":{"color":"15658734","size":"17","text":"high level languages such as Go, C, C++ or Rust. It is faster than"},"typeID":"Label","w":"509","x":"20","y":"52","zOrder":"2"},{"ID":"3","measuredH":"25","measuredW":"530","properties":{"color":"15658734","size":"17","text":"JavaScript and WASM 1.0 has already shipped in the major browsers."},"typeID":"Label","w":"528","x":"19","y":"83","zOrder":"3"},{"ID":"4","measuredH":"25","measuredW":"495","properties":{"color":"15658734","size":"17","text":"It is being touted by some to eventually replace JavaScript but I"},"typeID":"Label","w":"525","x":"19","y":"114","zOrder":"4"},{"ID":"5","measuredH":"25","measuredW":"541","properties":{"color":"15658734","size":"17","text":"seriously doubt that it would happen or see it happening anytime soon."},"typeID":"Label","w":"538","x":"19","y":"144","zOrder":"5"}]}},"h":"185","measuredH":"185","measuredW":"582","typeID":"__group__","w":"582","x":"170","y":"2979","zOrder":"265"},{"ID":"950","h":"166","measuredH":"165","measuredW":"7","properties":{"color":"2848996","curvature":"0","direction":"top","leftArrow":"false","p0":{"x":7,"y":165,"length":165.14841809717706},"p1":{"x":0.4072427393330943,"y":0.009537468626747937,"length":0.40735440595055405},"p2":{"x":0,"y":0,"length":0},"rightArrow":"false","shape":"bezier"},"typeID":"Arrow","w":"8","x":"924","y":"2955","zOrder":"30"},{"ID":"951","h":"89","measuredH":"88","measuredW":"1","properties":{"color":"2848996","curvature":"0","direction":"top","leftArrow":"false","p0":{"x":1,"y":88,"length":88.0056816347672},"p1":{"x":0.40724273933309435,"y":0.00953746862674794,"length":0.4073544059505541},"p2":{"x":1,"y":0,"length":1},"rightArrow":"false","shape":"bezier","stroke":"dotted"},"typeID":"Arrow","w":"2","x":"934","y":"3133","zOrder":"15"},{"ID":"952","h":"50","measuredH":"140","measuredW":"200","properties":{"color":"16770457"},"typeID":"TextArea","w":"201","x":"634","y":"1916","zOrder":"266"},{"ID":"953","measuredH":"25","measuredW":"81","properties":{"bold":"true","size":"17","text":"CSS in JS"},"typeID":"Label","x":"694","y":"1929","zOrder":"267"},{"ID":"954","measuredH":"32","measuredW":"176","properties":{"align":"center","color":"16776960","size":"18","text":"Styled Components"},"typeID":"TextInput","w":"217","x":"971","y":"1903","zOrder":"268"},{"ID":"955","measuredH":"32","measuredW":"80","properties":{"align":"center","color":"16770457","size":"18","text":"Emotion"},"typeID":"TextInput","w":"218","x":"971","y":"1981","zOrder":"269"},{"ID":"956","measuredH":"32","measuredW":"125","properties":{"align":"center","color":"16776960","size":"18","text":"CSS Modules"},"typeID":"TextInput","w":"217","x":"971","y":"1942","zOrder":"270"},{"ID":"960","measuredH":"32","measuredW":"76","properties":{"align":"center","color":"16770457","size":"18","text":"Radium"},"typeID":"TextInput","w":"218","x":"971","y":"2020","zOrder":"271"},{"ID":"962","h":"11","measuredH":"10","measuredW":"155","properties":{"color":"2848996","curvature":"0","direction":"bottom","leftArrow":"false","p0":{"x":0,"y":10},"p1":{"x":0.47388515577275503,"y":0.0022907758094073837},"p2":{"x":155,"y":0},"rightArrow":"false","shape":"bezier","stroke":"dotted"},"typeID":"Arrow","w":"156","x":"827","y":"1919","zOrder":"16"},{"ID":"963","measuredH":"32","measuredW":"101","properties":{"align":"center","color":"16770457","size":"18","text":"Glamorous"},"typeID":"TextInput","w":"218","x":"972","y":"2059","zOrder":"272"},{"ID":"964","h":"26","measuredH":"25","measuredW":"171","properties":{"color":"2848996","curvature":"0","direction":"top","leftArrow":"false","p0":{"x":0,"y":0},"p1":{"x":0.47388515577275503,"y":0.0022907758094073837},"p2":{"x":171,"y":25},"rightArrow":"false","shape":"bezier","stroke":"dotted"},"typeID":"Arrow","w":"172","x":"822","y":"1934","zOrder":"14"},{"ID":"965","h":"56","measuredH":"55","measuredW":"168","properties":{"color":"2848996","curvature":"0","direction":"top","leftArrow":"false","p0":{"x":0,"y":0},"p1":{"x":0.47388515577275503,"y":0.0022907758094073837},"p2":{"x":168,"y":55},"rightArrow":"false","shape":"bezier","stroke":"dotted"},"typeID":"Arrow","w":"169","x":"822","y":"1941","zOrder":"13"},{"ID":"966","h":"92","measuredH":"91","measuredW":"160","properties":{"color":"2848996","curvature":"0","direction":"top","leftArrow":"false","p0":{"x":0,"y":0},"p1":{"x":0.47388515577275503,"y":0.0022907758094073837},"p2":{"x":160,"y":91},"rightArrow":"false","shape":"bezier","stroke":"dotted"},"typeID":"Arrow","w":"161","x":"824","y":"1945","zOrder":"12"},{"ID":"967","h":"124","measuredH":"123","measuredW":"155","properties":{"color":"2848996","curvature":"0","direction":"top","leftArrow":"false","p0":{"x":0,"y":0},"p1":{"x":0.4738851557727551,"y":0.002290775809407435},"p2":{"x":155,"y":123},"rightArrow":"false","shape":"bezier","stroke":"dotted"},"typeID":"Arrow","w":"156","x":"826","y":"1953","zOrder":"11"},{"ID":"968","h":"136","measuredH":"135","measuredW":"39","properties":{"color":"2848996","curvature":"1","direction":"bottom","leftArrow":"false","p0":{"x":39,"y":0},"p1":{"x":0.5161499405855028,"y":-0.21648482229664037},"p2":{"x":22,"y":135},"rightArrow":"false","shape":"bezier"},"typeID":"Arrow","w":"40","x":"685","y":"1949","zOrder":"10"},{"ID":"969","h":"199","measuredH":"198","measuredW":"176","properties":{"color":"2848996","curvature":"-1","direction":"bottom","leftArrow":"false","p0":{"x":22,"y":198},"p1":{"x":0.4301821712728801,"y":0.3472413443283431},"p2":{"x":176,"y":0},"rightArrow":"false","shape":"bezier"},"typeID":"Arrow","w":"177","x":"613","y":"2238","zOrder":"9"},{"ID":"977","h":"203","measuredH":"202","measuredW":"47","properties":{"color":"2848996","curvature":"-1","direction":"top","leftArrow":"false","p0":{"x":13,"y":202},"p1":{"x":0.5340419070756149,"y":-0.2047373215912542},"p2":{"x":0,"y":0},"rightArrow":"false","shape":"bezier"},"typeID":"Arrow","w":"48","x":"630","y":"2440","zOrder":"5"},{"ID":"978","measuredH":"25","measuredW":"244","properties":{"size":"17","text":"how browsers work, DNS, HTTP"},"typeID":"Label","w":"245","x":"187","y":"767","zOrder":"275"},{"ID":"979","h":"10","measuredH":"8","measuredW":"202","properties":{"color":"2848996","curvature":"-1","direction":"bottom","leftArrow":"false","p0":{"x":0,"y":8,"length":8},"p1":{"x":0.564183236848729,"y":0.021771960734960988,"length":0.5646031730475429},"p2":{"x":202,"y":3,"length":202.02227599945508},"rightArrow":"false","shape":"bezier","stroke":"dotted"},"typeID":"Arrow","w":"204","x":"920","y":"2241","zOrder":"4"},{"ID":"1011","children":{"controls":{"control":[{"ID":"0","h":"41","measuredH":"140","measuredW":"200","properties":{"color":"16776960"},"typeID":"TextArea","w":"199","x":"0","y":"0","zOrder":"0"},{"ID":"1","measuredH":"25","measuredW":"85","properties":{"size":"17","text":"TypeScript"},"typeID":"Label","w":"91","x":"54","y":"8","zOrder":"1"}]}},"h":"41","measuredH":"41","measuredW":"199","typeID":"__group__","w":"199","x":"243","y":"2387","zOrder":"273"},{"ID":"1012","children":{"controls":{"control":[{"ID":"0","h":"41","measuredH":"140","measuredW":"200","properties":{"color":"16770457"},"typeID":"TextArea","w":"199","x":"0","y":"0","zOrder":"0"},{"ID":"1","measuredH":"25","measuredW":"34","properties":{"size":"17","text":"Flow"},"typeID":"Label","w":"38","x":"81","y":"8","zOrder":"1"}]}},"h":"41","measuredH":"41","measuredW":"199","typeID":"__group__","w":"199","x":"243","y":"2435","zOrder":"274"},{"ID":"1044","children":{"controls":{"control":[{"ID":"0","h":"389","measuredH":"70","measuredW":"100","typeID":"Canvas","w":"228","x":"0","y":"0","zOrder":"0"},{"ID":"1","children":{"controls":{"control":[{"ID":"0","measuredH":"32","measuredW":"150","properties":{"align":"center","color":"16776960","size":"18","text":"Service Workers"},"typeID":"TextInput","w":"176","x":"0","y":"74","zOrder":"0"},{"ID":"1","measuredH":"32","measuredW":"78","properties":{"align":"center","color":"16776960","size":"18","text":"Storage"},"typeID":"TextInput","w":"176","x":"0","y":"0","zOrder":"1"},{"ID":"2","measuredH":"32","measuredW":"83","properties":{"align":"center","color":"16770457","size":"18","text":"Location"},"typeID":"TextInput","w":"176","x":"0","y":"111","zOrder":"2"},{"ID":"3","measuredH":"32","measuredW":"115","properties":{"align":"center","color":"16770457","size":"18","text":"Notifications"},"typeID":"TextInput","w":"176","x":"0","y":"149","zOrder":"3"},{"ID":"4","measuredH":"32","measuredW":"166","properties":{"align":"center","color":"16770457","size":"18","text":"Device Orientation"},"typeID":"TextInput","w":"176","x":"0","y":"186","zOrder":"4"},{"ID":"5","measuredH":"32","measuredW":"94","properties":{"align":"center","color":"16770457","size":"18","text":"Payments"},"typeID":"TextInput","w":"176","x":"0","y":"223","zOrder":"5"},{"ID":"6","measuredH":"32","measuredW":"109","properties":{"align":"center","color":"16770457","size":"18","text":"Credentials"},"typeID":"TextInput","w":"176","x":"0","y":"260","zOrder":"6"},{"ID":"7","measuredH":"32","measuredW":"121","properties":{"align":"center","color":"16776960","size":"18","text":"Web Sockets"},"typeID":"TextInput","w":"176","x":"0","y":"37","zOrder":"7"},{"ID":"8","measuredH":"25","measuredW":"155","properties":{"color":"0","size":"17","text":"Learn different Web"},"typeID":"Label","x":"11","y":"305","zOrder":"8"},{"ID":"9","measuredH":"25","measuredW":"147","properties":{"color":"0","size":"17","text":"APIs used in PWAs"},"typeID":"Label","x":"15","y":"331","zOrder":"9"}]}},"h":"356","measuredH":"356","measuredW":"176","typeID":"__group__","w":"176","x":"26","y":"15","zOrder":"1"}]}},"h":"389","measuredH":"389","measuredW":"228","typeID":"__group__","w":"228","x":"1088","y":"2128","zOrder":"276"},{"ID":"1045","measuredH":"32","measuredW":"67","properties":{"align":"center","color":"16770457","size":"18","text":"Mocha"},"typeID":"TextInput","w":"147","x":"153","y":"1989","zOrder":"215"},{"ID":"1046","measuredH":"32","measuredW":"51","properties":{"align":"center","color":"16770457","size":"18","text":"Chai"},"typeID":"TextInput","w":"147","x":"153","y":"2026","zOrder":"216"},{"ID":"1047","measuredH":"32","measuredW":"43","properties":{"align":"center","color":"16770457","size":"18","text":"Ava"},"typeID":"TextInput","w":"147","x":"153","y":"2064","zOrder":"217"},{"ID":"1048","measuredH":"32","measuredW":"69","properties":{"align":"center","color":"16770457","size":"18","text":"Karma"},"typeID":"TextInput","w":"147","x":"153","y":"2101","zOrder":"218"},{"ID":"1049","measuredH":"32","measuredW":"82","properties":{"align":"center","color":"16770457","size":"18","text":"Jasmine"},"typeID":"TextInput","w":"147","x":"153","y":"2139","zOrder":"219"},{"ID":"1051","measuredH":"32","measuredW":"97","properties":{"align":"center","color":"16770457","size":"18","text":"Protractor"},"typeID":"TextInput","w":"147","x":"154","y":"2178","zOrder":"220"},{"ID":"1060","children":{"controls":{"control":[{"ID":"0","h":"231","measuredH":"140","measuredW":"200","properties":{"color":"16777215"},"typeID":"TextArea","w":"194","x":"0","y":"0","zOrder":"0"},{"ID":"1","measuredH":"32","measuredW":"84","properties":{"align":"center","color":"16776960","size":"18","text":"Cypress"},"typeID":"TextInput","w":"147","x":"23","y":"92","zOrder":"1"},{"ID":"2","measuredH":"32","measuredW":"50","properties":{"align":"center","color":"16776960","size":"18","text":"Jest"},"typeID":"TextInput","w":"147","x":"23","y":"17","zOrder":"2"},{"ID":"3","measuredH":"32","measuredW":"81","properties":{"align":"center","color":"16776960","size":"18","text":"Enzyme"},"typeID":"TextInput","w":"147","x":"23","y":"54","zOrder":"3"},{"ID":"4","measuredH":"25","measuredW":"125","properties":{"size":"17","text":"You can fulfill all"},"typeID":"Label","x":"29","y":"140","zOrder":"4"},{"ID":"5","measuredH":"25","measuredW":"147","properties":{"size":"17","text":"your testing needs"},"typeID":"Label","x":"18","y":"165","zOrder":"5"},{"ID":"6","measuredH":"25","measuredW":"124","properties":{"size":"17","text":"with these three"},"typeID":"Label","x":"30","y":"190","zOrder":"6"}]}},"h":"231","measuredH":"231","measuredW":"194","typeID":"__group__","w":"194","x":"317","y":"1982","zOrder":"278"},{"ID":"1075","children":{"controls":{"control":[{"ID":"0","h":"281","measuredH":"70","measuredW":"100","typeID":"Canvas","w":"262","x":"0","y":"0","zOrder":"0"},{"ID":"1","measuredH":"32","measuredW":"124","properties":{"align":"center","color":"16776960","size":"18","text":"PRPL Pattern"},"typeID":"TextInput","w":"225","x":"20","y":"19","zOrder":"1"},{"ID":"2","measuredH":"32","measuredW":"109","properties":{"align":"center","color":"16776960","size":"18","text":"RAIL Model"},"typeID":"TextInput","w":"225","x":"20","y":"57","zOrder":"2"},{"ID":"3","measuredH":"32","measuredW":"186","properties":{"align":"center","color":"16776960","size":"18","text":"Performance Metrics"},"typeID":"TextInput","w":"225","x":"20","y":"95","zOrder":"3"},{"ID":"4","measuredH":"32","measuredW":"166","properties":{"align":"center","color":"16776960","size":"18","text":"Using Light House"},"typeID":"TextInput","w":"225","x":"20","y":"132","zOrder":"4"},{"ID":"5","measuredH":"32","measuredW":"142","properties":{"align":"center","color":"16776960","size":"18","text":"Using DevTools"},"typeID":"TextInput","w":"225","x":"20","y":"170","zOrder":"5"},{"ID":"6","children":{"controls":{"control":[{"ID":"0","measuredH":"25","measuredW":"177","properties":{"color":"0","size":"17","text":"Calculating, Measuring"},"typeID":"Label","w":"185","x":"20","y":"0","zOrder":"0"},{"ID":"1","measuredH":"25","measuredW":"214","properties":{"color":"0","size":"17","text":"and improving performance"},"typeID":"Label","w":"224","x":"0","y":"27","zOrder":"1"}]}},"h":"52","measuredH":"52","measuredW":"224","typeID":"__group__","w":"224","x":"20","y":"215","zOrder":"6"}]}},"h":"281","measuredH":"281","measuredW":"262","typeID":"__group__","w":"262","x":"789","y":"2316","zOrder":"277"},{"ID":"1076","h":"73","measuredH":"72","measuredW":"2","properties":{"color":"2848996","curvature":"1","direction":"top","leftArrow":"false","p0":{"x":0,"y":0,"length":0},"p1":{"x":0.564183236848729,"y":0.021771960734960995,"length":0.5646031730475429},"p2":{"x":1,"y":72,"length":72.00694410957877},"rightArrow":"false","shape":"bezier","stroke":"dotted"},"typeID":"Arrow","w":"3","x":"909","y":"2248","zOrder":"2"},{"ID":"1078","h":"126","measuredH":"140","measuredW":"200","properties":{"color":"16777215"},"typeID":"TextArea","w":"358","x":"153","y":"2227","zOrder":"279"},{"ID":"1079","measuredH":"32","measuredW":"98","properties":{"align":"center","color":"16776960","size":"18","text":"Functional"},"typeID":"TextInput","w":"117","x":"377","y":"2244","zOrder":"280"},{"ID":"1080","measuredH":"32","measuredW":"47","properties":{"align":"center","color":"16776960","size":"18","text":"Unit"},"typeID":"TextInput","w":"86","x":"167","y":"2244","zOrder":"281"},{"ID":"1081","measuredH":"32","measuredW":"101","properties":{"align":"center","color":"16776960","size":"18","text":"Integration"},"typeID":"TextInput","w":"113","x":"258","y":"2244","zOrder":"282"},{"ID":"1086","children":{"controls":{"control":[{"ID":"0","measuredH":"25","measuredW":"324","properties":{"size":"17","text":"Understand different types of testing and"},"typeID":"Label","w":"326","x":"0","y":"0","zOrder":"0"},{"ID":"1","measuredH":"25","measuredW":"301","properties":{"size":"17","text":"learn how to write these with the above"},"typeID":"Label","w":"302","x":"12","y":"26","zOrder":"1"}]}},"h":"51","measuredH":"51","measuredW":"326","typeID":"__group__","w":"326","x":"169","y":"2290","zOrder":"283"},{"ID":"1090","h":"17","measuredH":"16","measuredW":"72","properties":{"color":"2848996","curvature":"0","direction":"bottom","leftArrow":"false","p0":{"x":0,"y":16,"length":16},"p1":{"x":0.4835193355826628,"y":0.007267064624967561,"length":0.48357394275391136},"p2":{"x":72,"y":0,"length":72},"rightArrow":"false","shape":"bezier","stroke":"dotted"},"typeID":"Arrow","w":"73","x":"442","y":"2440","zOrder":"0"},{"ID":"1091","h":"32","measuredH":"31","measuredW":"110","properties":{"color":"2848996","curvature":"0","direction":"top","leftArrow":"false","p0":{"x":0,"y":0},"p1":{"x":0.4835193355826628,"y":0.0072670646249675735},"p2":{"x":110,"y":31},"rightArrow":"false","shape":"bezier","stroke":"dotted"},"typeID":"Arrow","w":"111","x":"416","y":"2405","zOrder":"1"}]},"measuredH":"3222","measuredW":"1326","mockupH":"3175","mockupW":"1177","version":"1.0"}}
--------------------------------------------------------------------------------
/0-roadmap/project/intro-map.json:
--------------------------------------------------------------------------------
1 | {"mockup":{"controls":{"control":[{"ID":"321","measuredH":"40","measuredW":"347","properties":{"bold":"true","size":"32","text":"Web Developer in 2019"},"typeID":"Label","x":"491","y":"74","zOrder":"0"},{"ID":"322","h":"129","measuredH":"127","measuredW":"54","properties":{"color":"2848996","curvature":"1","direction":"top","leftArrow":"false","p0":{"x":0,"y":0},"p1":{"x":0.4787915073918851,"y":0.19568921844056555},"p2":{"x":73,"y":128},"shape":"bezier"},"typeID":"Arrow","w":"75","x":"683","y":"230","zOrder":"1"},{"ID":"323","h":"131","measuredH":"129","measuredW":"131","properties":{"color":"2848996","curvature":"1","direction":"bottom","leftArrow":"false","p0":{"x":131,"y":0,"length":131},"p1":{"x":0.5684088130944218,"y":-0.21788259145523384,"length":0.6087375480965977},"p2":{"x":1,"y":129,"length":129.00387591076478},"shape":"bezier"},"typeID":"Arrow","w":"133","x":"518","y":"229","zOrder":"2"},{"ID":"324","measuredH":"32","measuredW":"93","properties":{"align":"center","color":"16767334","size":"18","text":"Front-end"},"typeID":"TextInput","w":"132","x":"441","y":"367","zOrder":"3"},{"ID":"325","measuredH":"28","measuredW":"167","properties":{"bold":"true","size":"20","text":"Choose your path"},"typeID":"Label","x":"589","y":"189","zOrder":"4"},{"ID":"326","measuredH":"32","measuredW":"179","properties":{"align":"center","color":"16776960","size":"18","text":"Git - Version Control"},"typeID":"TextInput","w":"288","x":"68","y":"81","zOrder":"5"},{"ID":"327","measuredH":"32","measuredW":"50","properties":{"align":"center","color":"16776960","size":"18","text":"SSH"},"typeID":"TextInput","w":"289","x":"67","y":"353","zOrder":"6"},{"ID":"328","measuredH":"32","measuredW":"209","properties":{"align":"center","color":"16776960","size":"18","text":"HTTP/HTTPS and APIs"},"typeID":"TextInput","w":"289","x":"67","y":"391","zOrder":"7"},{"ID":"329","measuredH":"25","measuredW":"175","properties":{"bold":"true","size":"17","text":"Required for any path"},"typeID":"Label","x":"67","y":"45","zOrder":"8"},{"ID":"330","measuredH":"32","measuredW":"192","properties":{"align":"center","color":"16776960","size":"18","text":"Basic Terminal Usage"},"typeID":"TextInput","w":"289","x":"67","y":"120","zOrder":"9"},{"ID":"331","measuredH":"25","measuredW":"69","properties":{"bold":"true","size":"17","text":"Legends"},"typeID":"Label","x":"976","y":"41","zOrder":"10"},{"ID":"332","measuredH":"32","measuredW":"234","properties":{"align":"center","color":"16776960","size":"18","text":"Personal Recommendation!"},"typeID":"TextInput","w":"240","x":"976","y":"84","zOrder":"11"},{"ID":"334","measuredH":"32","measuredW":"153","properties":{"align":"center","color":"16770457","size":"18","text":"Available Options"},"typeID":"TextInput","w":"240","x":"976","y":"124","zOrder":"12"},{"ID":"335","h":"47","measuredH":"46","measuredW":"0","properties":{"color":"6710886","curvature":"0","direction":"top","leftArrow":"false","p0":{"x":0,"y":0,"length":0},"p1":{"x":0.5,"y":0,"length":0.5},"p2":{"x":0,"y":46,"length":46},"rightArrow":"false","shape":"bezier"},"typeID":"Arrow","w":"1","x":"664","y":"135","zOrder":"13"},{"ID":"336","measuredH":"32","measuredW":"92","properties":{"align":"center","color":"16767334","size":"18","text":"Back-end"},"typeID":"TextInput","w":"121","x":"679","y":"368","zOrder":"14"},{"ID":"337","h":"71","measuredH":"69","measuredW":"0","properties":{"color":"2848996","curvature":"0","direction":"top","leftArrow":"false","p0":{"x":0,"y":0},"p1":{"x":0.5621504039776257,"y":0.004661280298321849},"p2":{"x":0,"y":69},"rightArrow":"false","shape":"bezier","stroke":"dotted"},"typeID":"Arrow","w":"2","x":"509","y":"407","zOrder":"15"},{"ID":"338","h":"12","measuredH":"11","measuredW":"122","properties":{"color":"2848996","curvature":"-1","direction":"bottom","leftArrow":"false","p0":{"x":0,"y":11,"length":11},"p1":{"x":0.45357350377687367,"y":0.059732713538640264,"length":0.4574898035968877},"p2":{"x":122,"y":4,"length":122.06555615733703},"shape":"bezier","stroke":"solid"},"typeID":"Arrow","w":"123","x":"811","y":"373","zOrder":"16"},{"ID":"339","measuredH":"32","measuredW":"81","properties":{"align":"center","color":"16767334","size":"18","text":"DevOps"},"typeID":"TextInput","w":"112","x":"946","y":"361","zOrder":"17"},{"ID":"340","h":"71","measuredH":"69","measuredW":"0","properties":{"color":"2848996","curvature":"1","direction":"top","leftArrow":"false","p0":{"x":0,"y":0},"p1":{"x":0.4608695652173913,"y":0.01304347826086956},"p2":{"x":0,"y":69},"rightArrow":"false","shape":"bezier","stroke":"dotted"},"typeID":"Arrow","w":"2","x":"729","y":"410","zOrder":"18"},{"ID":"341","h":"77","measuredH":"76","measuredW":"0","properties":{"color":"2848996","curvature":"1","direction":"top","leftArrow":"false","p0":{"x":0,"y":0,"length":0},"p1":{"x":0.4537465672812867,"y":0.01247548058061985,"length":0.4539180376844135},"p2":{"x":0,"y":76,"length":76},"rightArrow":"false","shape":"bezier","stroke":"dotted"},"typeID":"Arrow","w":"1","x":"997","y":"403","zOrder":"19"},{"ID":"345","measuredH":"32","measuredW":"255","properties":{"align":"center","color":"16776960","size":"18","text":"Data Structures & Algorithms"},"typeID":"TextInput","w":"288","x":"68","y":"159","zOrder":"21"},{"ID":"346","measuredH":"32","measuredW":"188","properties":{"align":"center","color":"16776960","size":"18","text":"Character Encodings"},"typeID":"TextInput","w":"288","x":"68","y":"469","zOrder":"22"},{"ID":"349","measuredH":"32","measuredW":"146","properties":{"align":"center","color":"16776960","size":"18","text":"Design Patterns"},"typeID":"TextInput","w":"288","x":"68","y":"430","zOrder":"23"},{"ID":"350","measuredH":"32","measuredW":"177","properties":{"align":"center","color":"16776960","size":"18","text":"SOLID, KISS, YAGNI"},"typeID":"TextInput","w":"288","x":"68","y":"197","zOrder":"24"},{"ID":"354","measuredH":"32","measuredW":"70","properties":{"align":"center","borderStyle":"rectangle","color":"16776960","size":"18","text":"GitHub"},"typeID":"TextInput","w":"288","x":"68","y":"236","zOrder":"20"},{"ID":"355","measuredH":"32","measuredW":"88","properties":{"align":"center","borderStyle":"rectangle","color":"16776960","size":"18","text":"Licenses"},"typeID":"TextInput","w":"288","x":"68","y":"275","zOrder":"25"},{"ID":"356","measuredH":"32","measuredW":"182","properties":{"align":"center","borderStyle":"rectangle","color":"16776960","size":"18","text":"Semantic Versioning"},"typeID":"TextInput","w":"288","x":"68","y":"314","zOrder":"26"}]},"measuredH":"501","measuredW":"1216","mockupH":"460","mockupW":"1149","version":"1.0"}}
--------------------------------------------------------------------------------
/1-introduction/1.01-git-version-control/git-version-control.md:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/evertonbaima/developer-roadmap/c1e807586780fed21b66ae789e46524cc4022733/1-introduction/1.01-git-version-control/git-version-control.md
--------------------------------------------------------------------------------
/1-introduction/1.02-basic-terminal-usage/basic-terminal-usage.md:
--------------------------------------------------------------------------------
1 | # Basic commands
2 |
3 | * `cls`: clear screen;
--------------------------------------------------------------------------------
/1-introduction/1.03-data-structures-and-algorithms/data-structures-and-algorithms.md:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/evertonbaima/developer-roadmap/c1e807586780fed21b66ae789e46524cc4022733/1-introduction/1.03-data-structures-and-algorithms/data-structures-and-algorithms.md
--------------------------------------------------------------------------------
/1-introduction/1.04-solid-kiss-yagni/solid-kiss-yagni.md:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/evertonbaima/developer-roadmap/c1e807586780fed21b66ae789e46524cc4022733/1-introduction/1.04-solid-kiss-yagni/solid-kiss-yagni.md
--------------------------------------------------------------------------------
/1-introduction/1.05-github/github.md:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/evertonbaima/developer-roadmap/c1e807586780fed21b66ae789e46524cc4022733/1-introduction/1.05-github/github.md
--------------------------------------------------------------------------------
/1-introduction/1.06-licenses/licenses.md:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/evertonbaima/developer-roadmap/c1e807586780fed21b66ae789e46524cc4022733/1-introduction/1.06-licenses/licenses.md
--------------------------------------------------------------------------------
/1-introduction/1.07-semantic-versioning/semantic-versioning.md:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/evertonbaima/developer-roadmap/c1e807586780fed21b66ae789e46524cc4022733/1-introduction/1.07-semantic-versioning/semantic-versioning.md
--------------------------------------------------------------------------------
/1-introduction/1.08-ssh/ssh.md:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/evertonbaima/developer-roadmap/c1e807586780fed21b66ae789e46524cc4022733/1-introduction/1.08-ssh/ssh.md
--------------------------------------------------------------------------------
/1-introduction/1.09-http-https-and-apis/http-https-and-apis.md:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/evertonbaima/developer-roadmap/c1e807586780fed21b66ae789e46524cc4022733/1-introduction/1.09-http-https-and-apis/http-https-and-apis.md
--------------------------------------------------------------------------------
/1-introduction/1.10-design-patterns/basic-js/index.js:
--------------------------------------------------------------------------------
1 | console.log('Yo!');
--------------------------------------------------------------------------------
/1-introduction/1.10-design-patterns/basic-js/inheritance.js:
--------------------------------------------------------------------------------
1 | class Person {
2 | constructor(first, last, age, gender, interests) {
3 | this.name = {
4 | first,
5 | last
6 | };
7 | this.age = age;
8 | this.gender = gender;
9 | this.interests = interests;
10 | }
11 |
12 | greeting() {
13 | console.log(`Hi! I'm ${this.name.first}`);
14 | };
15 |
16 | farewell() {
17 | console.log(`${this.name.first} has left the building. Bye for now!`);
18 | };
19 | }
20 |
21 | class Teacher extends Person {
22 | constructor(first, last, age, gender, interests, subject, grade) {
23 | super(first, last, age, gender, interests);
24 |
25 | this._subject = subject;
26 | this.grade = grade;
27 | }
28 |
29 | get subject() {
30 | return this._subject;
31 | }
32 |
33 | set subject(newSubject) {
34 | this._subject = newSubject;
35 | }
36 | }
37 |
38 | let snape = new Teacher('Severus', 'Snape', 58, 'male', ['Potions'], 'Dark arts', 5);
39 |
40 | // Check the default value
41 | console.log(snape.subject); // Returns "Dark arts"
42 |
43 | // Change the value
44 | snape.subject = "Balloon animals"; // Sets _subject to "Balloon animals"
45 |
46 | // Check it again and see if it matches the new value
47 | console.log(snape.subject); // Returns "Balloon animals"
48 |
--------------------------------------------------------------------------------
/1-introduction/1.10-design-patterns/basic-js/new-class.js:
--------------------------------------------------------------------------------
1 | function Person(first, last, age, gender, interests) {
2 | this.name = {
3 | first: first,
4 | last: last
5 | };
6 |
7 | this.age = age;
8 | this.gender = gender;
9 | this.interests = interests;
10 |
11 | this.bio = function () {
12 | console.log(this.name.first + ' ' + this.name.last + ' is ' + this.age + ' years old. He likes ' + this.interests[0] + ' and ' + this.interests[1] + '.');
13 | };
14 |
15 | this.greeting = function () {
16 | console.log('Hi! I\'m ' + this.name.first + '.');
17 | };
18 | }
19 |
20 | var person1 = new Person('Bob', 'Smith', 32, 'male', ['music', 'skiing']);
21 | var person2 = Object.create(person1);
22 |
23 | person1.bio();
24 | person2.bio();
25 |
--------------------------------------------------------------------------------
/1-introduction/1.10-design-patterns/basic-js/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "basic-js",
3 | "version": "1.0.0",
4 | "description": "",
5 | "main": "index.js",
6 | "scripts": {
7 | "start": "node index.js",
8 | "test": "echo \"Error: no test specified\" && exit 1"
9 | },
10 | "keywords": [],
11 | "author": "",
12 | "license": "ISC"
13 | }
--------------------------------------------------------------------------------
/1-introduction/1.10-design-patterns/design-patterns.md:
--------------------------------------------------------------------------------
1 | # Basic concepts
2 |
3 | ## Creational Patterns
4 |
5 | ### Abstract Factory
6 |
7 | Provide an interface for creating families of related or dependent objects without specifying their concrete classes (from [Wikipédia](https://en.wikipedia.org/wiki/Abstract_factory_pattern)).
8 |
9 | ### Builder
10 |
11 | Provide a flexible solution to various object creation problems in object-oriented programming. The intent of the Builder design pattern is to separate the construction of a complex object from its representation (from [Wikipédia](https://en.wikipedia.org/wiki/Builder_pattern)).
12 |
13 | ### Factory method
14 |
15 | Uses factory methods to deal with the problem of creating objects without having to specify the exact class of the object that will be created. This is done by creating objects by calling a factory method—either specified in an interface and implemented by child classes, or implemented in a base class and optionally overridden by derived classes—rather than by calling a constructor (from [Wikipédia](https://en.wikipedia.org/wiki/Factory_method_pattern)).
16 |
17 | ### Prototype
18 |
19 | It is used when the type of objects to create is determined by a prototypical instance, which is cloned to produce new objects (from [Wikipédia](https://en.wikipedia.org/wiki/Prototype_pattern)).
20 |
21 | ### Singleton
22 |
23 | Restricts the instantiation of a class to one "single" instance (from [Wikipédia](https://en.wikipedia.org/wiki/Singleton_pattern)).
24 |
25 | ## Structural Patterns
26 |
27 | ### ???
28 |
29 | ## Structural Patterns
30 |
31 | ### ???
32 |
33 | ## Concurrency Patterns
34 |
35 | ### ???
36 |
37 |
--------------------------------------------------------------------------------
/1-introduction/1.10-design-patterns/implementation-cs/abstract-factory-js/Button.js:
--------------------------------------------------------------------------------
1 | class Button {
2 | constructor() {
3 | if (this.constructor === Button) {
4 | throw new TypeError('Abstract class "WidgetFactory" cannot be instantiated directly.');
5 | }
6 |
7 | if (this.click === undefined) {
8 | throw new TypeError('Classes extending the widget abstract class must implement "click".');
9 | }
10 | }
11 | }
12 |
13 | module.exports = Button;
14 |
--------------------------------------------------------------------------------
/1-introduction/1.10-design-patterns/implementation-cs/abstract-factory-js/MotifButton.js:
--------------------------------------------------------------------------------
1 | const Button = require('./Button');
2 |
3 | class MotifButton extends Button {
4 | constructor() {
5 | super();
6 | }
7 |
8 | click() {
9 | console.log(`Motif Button clicked.`);
10 | }
11 | }
12 |
13 | module.exports = MotifButton;
14 |
--------------------------------------------------------------------------------
/1-introduction/1.10-design-patterns/implementation-cs/abstract-factory-js/MotifWidgetFactory.js:
--------------------------------------------------------------------------------
1 | const WidgetFactory = require('./WidgetFactory');
2 | const MotifButton = require('./MotifButton');
3 | const MotifWindow = require('./MotifWindow');
4 |
5 | class MotifWidgetFactory extends WidgetFactory {
6 | constructor() {
7 | super();
8 | }
9 |
10 | /**
11 | * @returns {MotifButton} Concrete Button class
12 | */
13 | createButton() {
14 | return new MotifButton();
15 | }
16 |
17 | /**
18 | * @returns {MotifWindow} Concrete Window class
19 | */
20 | createWindow() {
21 | return new MotifWindow();
22 | }
23 | }
24 |
25 | module.exports = MotifWidgetFactory;
26 |
--------------------------------------------------------------------------------
/1-introduction/1.10-design-patterns/implementation-cs/abstract-factory-js/MotifWindow.js:
--------------------------------------------------------------------------------
1 | const Window = require('./Window');
2 |
3 | class MotifWindow extends Window {
4 | constructor() {
5 | super();
6 | }
7 |
8 | load() {
9 | console.log(`Motif Window loaded.`);
10 | }
11 |
12 | close() {
13 | console.log(`Motif Window closed.`);
14 | }
15 | }
16 |
17 | module.exports = MotifWindow;
18 |
--------------------------------------------------------------------------------
/1-introduction/1.10-design-patterns/implementation-cs/abstract-factory-js/QtButton.js:
--------------------------------------------------------------------------------
1 | const Button = require('./Button');
2 |
3 | class QtButton extends Button {
4 | constructor() {
5 | super();
6 | }
7 |
8 | click() {
9 | console.log(`Qt Button clicked.`);
10 | }
11 | }
12 |
13 | module.exports = QtButton;
14 |
--------------------------------------------------------------------------------
/1-introduction/1.10-design-patterns/implementation-cs/abstract-factory-js/QtWidgetFactory.js:
--------------------------------------------------------------------------------
1 | const WidgetFactory = require('./WidgetFactory');
2 | const QtButton = require('./QtButton');
3 | const QtWindow = require('./QtWindow');
4 |
5 | class QtWidgetFactory extends WidgetFactory {
6 | constructor() {
7 | super();
8 | }
9 |
10 | /**
11 | * @returns {QtButton} Concrete Button class
12 | */
13 | createButton() {
14 | return new QtButton();
15 | }
16 |
17 | /**
18 | * @returns {QtWindow} Concrete Window class
19 | */
20 | createWindow() {
21 | return new QtWindow();
22 | }
23 | }
24 |
25 | module.exports = QtWidgetFactory;
26 |
--------------------------------------------------------------------------------
/1-introduction/1.10-design-patterns/implementation-cs/abstract-factory-js/QtWindow.js:
--------------------------------------------------------------------------------
1 | const Window = require('./Window');
2 |
3 | class QtWindow extends Window {
4 | constructor() {
5 | super();
6 | }
7 |
8 | load() {
9 | console.log(`Qt Window loaded.`);
10 | }
11 |
12 | close() {
13 | console.log(`Qt Window closed.`);
14 | }
15 | }
16 |
17 | module.exports = QtWindow;
18 |
--------------------------------------------------------------------------------
/1-introduction/1.10-design-patterns/implementation-cs/abstract-factory-js/WidgetFactory.js:
--------------------------------------------------------------------------------
1 | class WidgetFactory {
2 | constructor() {
3 | if (this.constructor === WidgetFactory) {
4 | throw new TypeError('Abstract class "WidgetFactory" cannot be instantiated directly.');
5 | }
6 |
7 | if (this.createButton === undefined) {
8 | throw new TypeError('Classes extending the widget abstract class must implement "createButton".');
9 | }
10 |
11 | if (this.createWindow === undefined) {
12 | throw new TypeError('Classes extending the widget abstract class must implement "createWindow".');
13 | }
14 | }
15 | }
16 |
17 | module.exports = WidgetFactory;
18 |
--------------------------------------------------------------------------------
/1-introduction/1.10-design-patterns/implementation-cs/abstract-factory-js/Window.js:
--------------------------------------------------------------------------------
1 | class Window {
2 | constructor() {
3 | if (this.constructor === Window) {
4 | throw new TypeError('Abstract class "Window" cannot be instantiated directly.');
5 | }
6 |
7 | if (this.load === undefined) {
8 | throw new TypeError('Classes extending the widget abstract class must implement "load".');
9 | }
10 |
11 | if (this.close === undefined) {
12 | throw new TypeError('Classes extending the widget abstract class must implement "close".');
13 | }
14 | }
15 | }
16 |
17 | module.exports = Window;
18 |
--------------------------------------------------------------------------------
/1-introduction/1.10-design-patterns/implementation-cs/abstract-factory-js/client.js:
--------------------------------------------------------------------------------
1 | const QtWidgetFactory = require('./QtWidgetFactory');
2 | const MotifWidgetFactory = require('./MotifWidgetFactory');
3 |
4 | var factory = null;
5 | var window = null;
6 | var button = null;
7 |
8 | console.log('-- QtWidgetFactory -------------------------------');
9 | factory = new QtWidgetFactory();
10 | window = factory.createWindow();
11 | button = factory.createButton();
12 |
13 | window.load();
14 | button.click();
15 | window.close();
16 |
17 | console.log('-- MotifWidgetFactory ----------------------------');
18 | factory = new MotifWidgetFactory();
19 | window = factory.createWindow();
20 | button = factory.createButton();
21 |
22 | window.load();
23 | button.click();
24 | window.close();
25 |
--------------------------------------------------------------------------------
/1-introduction/1.10-design-patterns/implementation-cs/builder-alt/Address.js:
--------------------------------------------------------------------------------
1 | class Address {
2 | constructor(street, number) {
3 | this.street = street;
4 | this.number = number;
5 | }
6 | }
7 |
8 | module.exports = Address;
--------------------------------------------------------------------------------
/1-introduction/1.10-design-patterns/implementation-cs/builder-alt/Customer.js:
--------------------------------------------------------------------------------
1 | const Address = require('./Address');
2 |
3 | class Customer {
4 | constructor(name) {
5 | this.name = name;
6 | this.address = new Address();
7 | this.phone = null;
8 | }
9 | }
10 |
11 | module.exports = Customer;
--------------------------------------------------------------------------------
/1-introduction/1.10-design-patterns/implementation-cs/builder-alt/Order.js:
--------------------------------------------------------------------------------
1 | const Customer = require('./Customer');
2 | const Pizza = require('./Pizza');
3 |
4 | class Order {
5 | /**
6 | *
7 | * @param {Customer} customer
8 | * @param {Pizza[]} pizzas
9 | */
10 | constructor(customer, pizzas) {
11 | this.customer = customer;
12 | this.pizzas = pizzas;
13 | }
14 |
15 | toString() {
16 | var str = `To ${this.customer.name}, at ${this.customer.address.street} ${this.customer.address.number}:`;
17 |
18 | for (var i = 0; i < this.pizzas.length; i++) {
19 | var item = this.pizzas[i];
20 | var opt = [];
21 | item.cheese && opt.push('cheese');
22 | item.tomato && opt.push('tomato');
23 | item.bacon && opt.push('bacon');
24 |
25 | str += `\n - a ${item.size} pizza ${opt.length ? `with ${opt.join(', and ')};` : 'without additionals;'}`
26 | }
27 |
28 | return str;
29 | }
30 | }
31 |
32 | module.exports = Order;
--------------------------------------------------------------------------------
/1-introduction/1.10-design-patterns/implementation-cs/builder-alt/OrderBuilder.js:
--------------------------------------------------------------------------------
1 | const Order = require('./Order');
2 | const Customer = require('./Customer');
3 | const Address = require('./Address');
4 | const Pizza = require('./Pizza');
5 |
6 | class OrderBuilder {
7 | constructor() {
8 | this.customer = new Customer();
9 | this.pizza = null;
10 | this.allPizzas = [];
11 | }
12 |
13 | /**
14 | *
15 | * @param {string} customerName
16 | * @return {OrderBuilder}
17 | */
18 | to(customerName) {
19 | this.customer.name = customerName;
20 | return this;
21 | }
22 |
23 | /**
24 | *
25 | * @param {string} street
26 | * @param {number} number
27 | */
28 | at(street, number) {
29 | this.customer.address = new Address(street, number);
30 | return this;
31 | }
32 |
33 | /**
34 | *
35 | * @param {string} size
36 | * @return {OrderBuilder}
37 | */
38 | addPizza(size) {
39 | this.pizza = new Pizza(size);
40 | this.allPizzas.push(this.pizza);
41 |
42 | return this;
43 | }
44 |
45 | /**
46 | * @param {Boolean} value
47 | * @return {OrderBuilder}
48 | */
49 | withCheese(value) {
50 | this.pizza.cheese = (typeof(value) === 'boolean' ? value : true);
51 | return this;
52 | }
53 |
54 | /**
55 | *
56 | * @return {OrderBuilder}
57 | */
58 | withoutCheese() {
59 | this.pizza.cheese = false;
60 | return this;
61 | }
62 |
63 | /**
64 | * @param {Boolean} value
65 | * @return {OrderBuilder}
66 | */
67 | withTomato(value) {
68 | this.pizza.tomato = (typeof(value) === 'boolean' ? value : true);
69 | return this;
70 | }
71 |
72 | /**
73 | *
74 | * @return {OrderBuilder}
75 | */
76 | withoutTomato() {
77 | this.pizza.tomato = false;
78 | return this;
79 | }
80 |
81 | /**
82 | * @param {Boolean} value
83 | * @return {OrderBuilder}
84 | */
85 | withBacon(value) {
86 | this.pizza.bacon = (typeof(value) === 'boolean' ? value : true);
87 | return this;
88 | }
89 |
90 | /**
91 | *
92 | * @return {OrderBuilder}
93 | */
94 | withoutBacon() {
95 | this.pizza.bacon = false;
96 | return this;
97 | }
98 |
99 | /**
100 | *
101 | */
102 | finish() {
103 | return new Order(this.customer, this.allPizzas);
104 | }
105 | }
106 |
107 | module.exports = OrderBuilder;
--------------------------------------------------------------------------------
/1-introduction/1.10-design-patterns/implementation-cs/builder-alt/Pizza.js:
--------------------------------------------------------------------------------
1 | class Pizza {
2 | /**
3 | *
4 | * @param {number} size
5 | */
6 | constructor(size) {
7 | this.size = size;
8 | this.cheese = false;
9 | this.tomato = false;
10 | this.bacon = false;
11 | }
12 | }
13 |
14 | module.exports = Pizza;
--------------------------------------------------------------------------------
/1-introduction/1.10-design-patterns/implementation-cs/builder-alt/client.js:
--------------------------------------------------------------------------------
1 | const OrderBuilder = require('./OrderBuilder');
2 |
3 | const order1 = new OrderBuilder()
4 | .to('Garen')
5 | .at('Demacia', 1325)
6 | .addPizza('large')
7 | .withCheese(true)
8 | .withTomato(true)
9 | .withBacon(false)
10 | .finish();
11 |
12 | const order2 = new OrderBuilder()
13 | .to('Sivir')
14 | .at('Shurima', 7)
15 | .addPizza('small')
16 | .withoutCheese()
17 | .withTomato()
18 | .withoutBacon()
19 | .addPizza('medium')
20 | .withCheese()
21 | .withoutTomato()
22 | .withBacon()
23 | .finish();
24 |
25 | const order3 = new OrderBuilder()
26 | .to('Taric')
27 | .at('Mt. Targon', 999999999)
28 | .addPizza('giant')
29 | .withCheese()
30 | .withTomato()
31 | .withBacon()
32 | .addPizza('small')
33 | .withoutCheese()
34 | .withTomato()
35 | .withoutBacon()
36 | .addPizza('small')
37 | .withCheese()
38 | .withoutTomato()
39 | .withBacon()
40 | .finish();
41 |
42 | console.log(order1.toString());
43 | console.log('');
44 | console.log(order2.toString());
45 | console.log('');
46 | console.log(order3.toString());
--------------------------------------------------------------------------------
/1-introduction/1.10-design-patterns/implementation-cs/builder/Car.js:
--------------------------------------------------------------------------------
1 | class Car {
2 | constructor(make, model, numDoors, colour) {
3 | this.make = make;
4 | this.model = model;
5 | this.numDoors = numDoors;
6 | this.colour = colour;
7 | }
8 | }
9 |
10 | module.exports = Car;
--------------------------------------------------------------------------------
/1-introduction/1.10-design-patterns/implementation-cs/builder/FerrariBuilder.js:
--------------------------------------------------------------------------------
1 | const ICarBuilder = require('./ICarBuilder');
2 | const Car = require('./Car');
3 |
4 | class FerrariBuilder extends ICarBuilder {
5 | constructor() {
6 | super();
7 | }
8 |
9 | getResult() {
10 | return this.numDoors === 2 ? new Car('Ferrari', '488 Spider', this.colour, this.numDoors) : null;
11 | }
12 | }
13 |
14 | module.exports = FerrariBuilder;
--------------------------------------------------------------------------------
/1-introduction/1.10-design-patterns/implementation-cs/builder/ICarBuilder.js:
--------------------------------------------------------------------------------
1 | class ICarBuilder {
2 | constructor() {
3 | this.colour = '';
4 | this.numDoors = 0;
5 |
6 | if (this.getResult === undefined) {
7 | throw new TypeError('Classes extending the widget abstract class must implement "getResult".');
8 | }
9 | }
10 | }
11 |
12 | module.exports = ICarBuilder;
--------------------------------------------------------------------------------
/1-introduction/1.10-design-patterns/implementation-cs/builder/SportsCarBuildDirector.js:
--------------------------------------------------------------------------------
1 | class SportsCarBuildDirector {
2 | constructor(builder) {
3 | this._builder = builder;
4 | }
5 |
6 | construct() {
7 | this._builder.colour = 'Red';
8 | this._builder.numDoors = 2;
9 | }
10 | }
11 |
12 | module.exports = SportsCarBuildDirector;
--------------------------------------------------------------------------------
/1-introduction/1.10-design-patterns/implementation-cs/builder/client.js:
--------------------------------------------------------------------------------
1 | const FerrariBuilder = require('./FerrariBuilder');
2 | const SportsCarBuildDirector = require('./SportsCarBuildDirector');
3 |
4 | var builder = new FerrariBuilder();
5 | var director = new SportsCarBuildDirector(builder);
6 |
7 | director.construct();
8 | var myRaceCar = builder.getResult();
9 |
10 | console.log(myRaceCar);
--------------------------------------------------------------------------------
/1-introduction/1.10-design-patterns/implementation-cs/factory-method/Champion.js:
--------------------------------------------------------------------------------
1 | class Champion {
2 | constructor() {
3 | if (this.constructor === Champion) {
4 | throw new TypeError('Abstract class "Champion" cannot be instantiated directly.');
5 | }
6 | }
7 | }
8 |
9 | module.exports = Champion;
--------------------------------------------------------------------------------
/1-introduction/1.10-design-patterns/implementation-cs/factory-method/ChampionFactory.js:
--------------------------------------------------------------------------------
1 | const Champion = require('./Champion');
2 | const SupportChampion = require('./SupportChampion');
3 | const MarksmanChampion = require('./MarksmanChampion');
4 |
5 | class ChampionFactory {
6 | constructor() {
7 | this.ROLE_SUPPORT = 'ROLE_SUPPORT';
8 | this.ROLE_MARKSMAN = 'ROLE_MARKSMAN';
9 | }
10 |
11 | /**
12 | * @param {string} role Champion's role.
13 | * @returns {Champion} New champion.
14 | */
15 | summon(role) {
16 | switch (role) {
17 | case this.ROLE_SUPPORT:
18 | return new SupportChampion();
19 | case this.ROLE_MARKSMAN:
20 | return new MarksmanChampion();
21 | default:
22 | throw new NotSupportedException();
23 | }
24 | }
25 | }
26 |
27 | module.exports = ChampionFactory;
--------------------------------------------------------------------------------
/1-introduction/1.10-design-patterns/implementation-cs/factory-method/MarksmanChampion.js:
--------------------------------------------------------------------------------
1 | const Champion = require('./Champion');
2 |
3 | class MarksmanChampion extends Champion {
4 | constructor() {
5 | super();
6 |
7 | this.name = 'Xahya';
8 | this.ap = 12;
9 | this.ad = 31;
10 | }
11 | }
12 |
13 | module.exports = MarksmanChampion;
--------------------------------------------------------------------------------
/1-introduction/1.10-design-patterns/implementation-cs/factory-method/SupportChampion.js:
--------------------------------------------------------------------------------
1 | const Champion = require('./Champion');
2 |
3 | class SupportChampion extends Champion {
4 | constructor() {
5 | super();
6 |
7 | this.name = 'Rakan';
8 | this.ap = 32;
9 | this.ad = 11;
10 | }
11 | }
12 |
13 | module.exports = SupportChampion;
--------------------------------------------------------------------------------
/1-introduction/1.10-design-patterns/implementation-cs/factory-method/client.js:
--------------------------------------------------------------------------------
1 | const ChampionFactory = require('./ChampionFactory');
2 |
3 | var factory = new ChampionFactory();
4 | var marksman = factory.summon(factory.ROLE_MARKSMAN);
5 | var support = factory.summon(factory.ROLE_SUPPORT);
6 |
7 | console.log(`The marksman is ${marksman.name}`);
8 | console.log(`The support is ${support.name}`);
--------------------------------------------------------------------------------
/1-introduction/1.10-design-patterns/implementation-cs/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "design-patterns-implementation",
3 | "version": "1.0.0",
4 | "description": "",
5 | "main": "index.js",
6 | "scripts": {
7 | "test": "echo \"Error: no test specified\" && exit 1"
8 | },
9 | "keywords": [],
10 | "author": "",
11 | "license": "ISC"
12 | }
13 |
--------------------------------------------------------------------------------
/1-introduction/1.10-design-patterns/implementation-cs/prototype/DoransBlade.js:
--------------------------------------------------------------------------------
1 | const Item = require('./Item');
2 |
3 | class DoransBlade extends Item {
4 | constructor() {
5 | super();
6 |
7 | this.name = `Doran's Blade`;
8 | // TODO
9 | }
10 |
11 | clone() {
12 | return {
13 | id: this.id,
14 | name: this.name
15 | };
16 | }
17 | }
18 |
19 | module.exports = DoransBlade;
--------------------------------------------------------------------------------
/1-introduction/1.10-design-patterns/implementation-cs/prototype/DoransRing.js:
--------------------------------------------------------------------------------
1 | const Item = require('./Item');
2 |
3 | class DoransRing extends Item {
4 | constructor() {
5 | super();
6 |
7 | this.name = `Doran's Ring`;
8 | // TODO
9 | }
10 |
11 | clone() {
12 | return {
13 | id: this.id,
14 | name: this.name
15 | };
16 | }
17 | }
18 |
19 | module.exports = DoransRing;
--------------------------------------------------------------------------------
/1-introduction/1.10-design-patterns/implementation-cs/prototype/DoransShield.js:
--------------------------------------------------------------------------------
1 | const Item = require('./Item');
2 |
3 | class DoransShield extends Item {
4 | constructor() {
5 | super();
6 |
7 | this.name = `Doran's Shield`;
8 | // TODO
9 | }
10 |
11 | clone() {
12 | return {
13 | id: this.id,
14 | name: this.name
15 | };
16 | }
17 | }
18 |
19 | module.exports = DoransShield;
--------------------------------------------------------------------------------
/1-introduction/1.10-design-patterns/implementation-cs/prototype/Item.js:
--------------------------------------------------------------------------------
1 | class Item {
2 | constructor() {
3 | this.id = new Date().getTime();
4 |
5 | if (this.constructor === Item) {
6 | throw new TypeError('Abstract class "Item" cannot be instantiated directly.');
7 | }
8 |
9 | if (this.clone === undefined) {
10 | throw new TypeError('Classes extending the Item abstract class must implement "clone".');
11 | }
12 | }
13 | }
14 |
15 | module.exports = Item;
--------------------------------------------------------------------------------
/1-introduction/1.10-design-patterns/implementation-cs/prototype/ItemFactory.js:
--------------------------------------------------------------------------------
1 | const Item = require('./Item');
2 | const DoransBlade = require('./DoransBlade');
3 | const DoransRing = require('./DoransRing');
4 | const DoransShield = require('./DoransShield');
5 |
6 | class ItemFactory {
7 | constructor() {
8 | this.ITEM_DORANS_BLADE = 'DORANS_BLADE';
9 | this.ITEM_DORANS_RING = 'DORANS_RING';
10 | this.ITEM_DORANS_SHIELD = 'DORANS_SHIELD';
11 |
12 | this._DORANS_BLADE = new DoransBlade();
13 | this._DORANS_RING = new DoransRing();
14 | this._DORANS_SHIELD = new DoransShield();
15 | }
16 |
17 | /**
18 | * @param {string} item Initial item.
19 | * @returns {Item} New champion.
20 | */
21 | buy(item) {
22 | switch (item) {
23 | case this.ITEM_DORANS_BLADE:
24 | return this._DORANS_BLADE.clone();
25 | case this.ITEM_DORANS_RING:
26 | return this._DORANS_RING.clone();
27 | case this.ITEM_DORANS_SHIELD:
28 | return this._DORANS_SHIELD.clone();
29 | default:
30 | throw new NotSupportedException();
31 | }
32 | }
33 | }
34 |
35 | module.exports = ItemFactory;
--------------------------------------------------------------------------------
/1-introduction/1.10-design-patterns/implementation-cs/prototype/client.js:
--------------------------------------------------------------------------------
1 | const ItemFactory = require('./ItemFactory');
2 |
3 | var factory = new ItemFactory();
4 |
5 | var firstDoransBlade = factory.buy(factory.ITEM_DORANS_BLADE);
6 | var firstDoransRing = factory.buy(factory.ITEM_DORANS_RING);
7 | var firstDoransShield = factory.buy(factory.ITEM_DORANS_SHIELD);
8 |
9 | var secondDoransBlade = factory.buy(factory.ITEM_DORANS_BLADE);
10 | var secondDoransRing = factory.buy(factory.ITEM_DORANS_RING);
11 | var secondDoransShield = factory.buy(factory.ITEM_DORANS_SHIELD);
12 |
13 | var thirdDoransBlade = factory.buy(factory.ITEM_DORANS_BLADE);
14 | var thirdDoransRing = factory.buy(factory.ITEM_DORANS_RING);
15 | var thirdDoransShield = factory.buy(factory.ITEM_DORANS_SHIELD);
16 |
17 | console.log({
18 | first: {
19 | firstDoransBlade,
20 | firstDoransRing,
21 | firstDoransShield
22 | }
23 | });
24 |
25 | console.log({
26 | second: {
27 | secondDoransBlade,
28 | secondDoransRing,
29 | secondDoransShield
30 | }
31 | });
32 |
33 | console.log({
34 | third: {
35 | thirdDoransBlade,
36 | thirdDoransRing,
37 | thirdDoransShield
38 | }
39 | });
--------------------------------------------------------------------------------
/1-introduction/1.10-design-patterns/implementation-cs/singleton/Singleton.js:
--------------------------------------------------------------------------------
1 | class Singleton {
2 | constructor() {
3 | this.niceProperty = `I'm a nice property :D`;
4 | }
5 |
6 | get instance() {
7 | if (!this._instance) {
8 | this._instance = new Singleton();
9 | }
10 |
11 | return this._instance;
12 | }
13 | }
14 |
15 | module.exports = Singleton;
--------------------------------------------------------------------------------
/1-introduction/1.10-design-patterns/implementation-cs/singleton/client.js:
--------------------------------------------------------------------------------
1 | const Singleton = require('./Singleton');
2 |
3 | var instanceA = Singleton.instance;
4 | var instanceB = Singleton.instance;
5 |
6 | console.log('instanceA', instanceA.niceProperty);
7 | console.log('instanceB', instanceB.niceProperty);
8 |
9 | console.log('-----');
10 |
11 | instanceB.niceProperty = `Sometimes I may change >:)`;
12 |
13 | console.log('instanceA', instanceA.niceProperty);
14 | console.log('instanceB', instanceB.niceProperty);
15 |
--------------------------------------------------------------------------------
/1-introduction/1.10-design-patterns/implementation-js/abstract-factory/Button.js:
--------------------------------------------------------------------------------
1 | class Button {
2 | constructor() {
3 | if (this.constructor === Button) {
4 | throw new TypeError('Abstract class "WidgetFactory" cannot be instantiated directly.');
5 | }
6 |
7 | if (this.click === undefined) {
8 | throw new TypeError('Classes extending the widget abstract class must implement "click".');
9 | }
10 | }
11 | }
12 |
13 | module.exports = Button;
14 |
--------------------------------------------------------------------------------
/1-introduction/1.10-design-patterns/implementation-js/abstract-factory/MotifButton.js:
--------------------------------------------------------------------------------
1 | const Button = require('./Button');
2 |
3 | class MotifButton extends Button {
4 | constructor() {
5 | super();
6 | }
7 |
8 | click() {
9 | console.log(`Motif Button clicked.`);
10 | }
11 | }
12 |
13 | module.exports = MotifButton;
14 |
--------------------------------------------------------------------------------
/1-introduction/1.10-design-patterns/implementation-js/abstract-factory/MotifWidgetFactory.js:
--------------------------------------------------------------------------------
1 | const WidgetFactory = require('./WidgetFactory');
2 | const MotifButton = require('./MotifButton');
3 | const MotifWindow = require('./MotifWindow');
4 |
5 | class MotifWidgetFactory extends WidgetFactory {
6 | constructor() {
7 | super();
8 | }
9 |
10 | /**
11 | * @returns {MotifButton} Concrete Button class
12 | */
13 | createButton() {
14 | return new MotifButton();
15 | }
16 |
17 | /**
18 | * @returns {MotifWindow} Concrete Window class
19 | */
20 | createWindow() {
21 | return new MotifWindow();
22 | }
23 | }
24 |
25 | module.exports = MotifWidgetFactory;
26 |
--------------------------------------------------------------------------------
/1-introduction/1.10-design-patterns/implementation-js/abstract-factory/MotifWindow.js:
--------------------------------------------------------------------------------
1 | const Window = require('./Window');
2 |
3 | class MotifWindow extends Window {
4 | constructor() {
5 | super();
6 | }
7 |
8 | load() {
9 | console.log(`Motif Window loaded.`);
10 | }
11 |
12 | close() {
13 | console.log(`Motif Window closed.`);
14 | }
15 | }
16 |
17 | module.exports = MotifWindow;
18 |
--------------------------------------------------------------------------------
/1-introduction/1.10-design-patterns/implementation-js/abstract-factory/QtButton.js:
--------------------------------------------------------------------------------
1 | const Button = require('./Button');
2 |
3 | class QtButton extends Button {
4 | constructor() {
5 | super();
6 | }
7 |
8 | click() {
9 | console.log(`Qt Button clicked.`);
10 | }
11 | }
12 |
13 | module.exports = QtButton;
14 |
--------------------------------------------------------------------------------
/1-introduction/1.10-design-patterns/implementation-js/abstract-factory/QtWidgetFactory.js:
--------------------------------------------------------------------------------
1 | const WidgetFactory = require('./WidgetFactory');
2 | const QtButton = require('./QtButton');
3 | const QtWindow = require('./QtWindow');
4 |
5 | class QtWidgetFactory extends WidgetFactory {
6 | constructor() {
7 | super();
8 | }
9 |
10 | /**
11 | * @returns {QtButton} Concrete Button class
12 | */
13 | createButton() {
14 | return new QtButton();
15 | }
16 |
17 | /**
18 | * @returns {QtWindow} Concrete Window class
19 | */
20 | createWindow() {
21 | return new QtWindow();
22 | }
23 | }
24 |
25 | module.exports = QtWidgetFactory;
26 |
--------------------------------------------------------------------------------
/1-introduction/1.10-design-patterns/implementation-js/abstract-factory/QtWindow.js:
--------------------------------------------------------------------------------
1 | const Window = require('./Window');
2 |
3 | class QtWindow extends Window {
4 | constructor() {
5 | super();
6 | }
7 |
8 | load() {
9 | console.log(`Qt Window loaded.`);
10 | }
11 |
12 | close() {
13 | console.log(`Qt Window closed.`);
14 | }
15 | }
16 |
17 | module.exports = QtWindow;
18 |
--------------------------------------------------------------------------------
/1-introduction/1.10-design-patterns/implementation-js/abstract-factory/WidgetFactory.js:
--------------------------------------------------------------------------------
1 | class WidgetFactory {
2 | constructor() {
3 | if (this.constructor === WidgetFactory) {
4 | throw new TypeError('Abstract class "WidgetFactory" cannot be instantiated directly.');
5 | }
6 |
7 | if (this.createButton === undefined) {
8 | throw new TypeError('Classes extending the widget abstract class must implement "createButton".');
9 | }
10 |
11 | if (this.createWindow === undefined) {
12 | throw new TypeError('Classes extending the widget abstract class must implement "createWindow".');
13 | }
14 | }
15 | }
16 |
17 | module.exports = WidgetFactory;
18 |
--------------------------------------------------------------------------------
/1-introduction/1.10-design-patterns/implementation-js/abstract-factory/Window.js:
--------------------------------------------------------------------------------
1 | class Window {
2 | constructor() {
3 | if (this.constructor === Window) {
4 | throw new TypeError('Abstract class "Window" cannot be instantiated directly.');
5 | }
6 |
7 | if (this.load === undefined) {
8 | throw new TypeError('Classes extending the widget abstract class must implement "load".');
9 | }
10 |
11 | if (this.close === undefined) {
12 | throw new TypeError('Classes extending the widget abstract class must implement "close".');
13 | }
14 | }
15 | }
16 |
17 | module.exports = Window;
18 |
--------------------------------------------------------------------------------
/1-introduction/1.10-design-patterns/implementation-js/abstract-factory/client.js:
--------------------------------------------------------------------------------
1 | const QtWidgetFactory = require('./QtWidgetFactory');
2 | const MotifWidgetFactory = require('./MotifWidgetFactory');
3 |
4 | var factory = null;
5 | var window = null;
6 | var button = null;
7 |
8 | console.log('-- QtWidgetFactory -------------------------------');
9 | factory = new QtWidgetFactory();
10 | window = factory.createWindow();
11 | button = factory.createButton();
12 |
13 | window.load();
14 | button.click();
15 | window.close();
16 |
17 | console.log('-- MotifWidgetFactory ----------------------------');
18 | factory = new MotifWidgetFactory();
19 | window = factory.createWindow();
20 | button = factory.createButton();
21 |
22 | window.load();
23 | button.click();
24 | window.close();
25 |
--------------------------------------------------------------------------------
/1-introduction/1.10-design-patterns/implementation-js/builder-alt/Address.js:
--------------------------------------------------------------------------------
1 | class Address {
2 | constructor(street, number) {
3 | this.street = street;
4 | this.number = number;
5 | }
6 | }
7 |
8 | module.exports = Address;
--------------------------------------------------------------------------------
/1-introduction/1.10-design-patterns/implementation-js/builder-alt/Customer.js:
--------------------------------------------------------------------------------
1 | const Address = require('./Address');
2 |
3 | class Customer {
4 | constructor(name) {
5 | this.name = name;
6 | this.address = new Address();
7 | this.phone = null;
8 | }
9 | }
10 |
11 | module.exports = Customer;
--------------------------------------------------------------------------------
/1-introduction/1.10-design-patterns/implementation-js/builder-alt/Order.js:
--------------------------------------------------------------------------------
1 | const Customer = require('./Customer');
2 | const Pizza = require('./Pizza');
3 |
4 | class Order {
5 | /**
6 | *
7 | * @param {Customer} customer
8 | * @param {Pizza[]} pizzas
9 | */
10 | constructor(customer, pizzas) {
11 | this.customer = customer;
12 | this.pizzas = pizzas;
13 | }
14 |
15 | toString() {
16 | var str = `To ${this.customer.name}, at ${this.customer.address.street} ${this.customer.address.number}:`;
17 |
18 | for (var i = 0; i < this.pizzas.length; i++) {
19 | var item = this.pizzas[i];
20 | var opt = [];
21 | item.cheese && opt.push('cheese');
22 | item.tomato && opt.push('tomato');
23 | item.bacon && opt.push('bacon');
24 |
25 | str += `\n - a ${item.size} pizza ${opt.length ? `with ${opt.join(', and ')};` : 'without additionals;'}`
26 | }
27 |
28 | return str;
29 | }
30 | }
31 |
32 | module.exports = Order;
--------------------------------------------------------------------------------
/1-introduction/1.10-design-patterns/implementation-js/builder-alt/OrderBuilder.js:
--------------------------------------------------------------------------------
1 | const Order = require('./Order');
2 | const Customer = require('./Customer');
3 | const Address = require('./Address');
4 | const Pizza = require('./Pizza');
5 |
6 | class OrderBuilder {
7 | constructor() {
8 | this.customer = new Customer();
9 | this.pizza = null;
10 | this.allPizzas = [];
11 | }
12 |
13 | /**
14 | *
15 | * @param {string} customerName
16 | * @return {OrderBuilder}
17 | */
18 | to(customerName) {
19 | this.customer.name = customerName;
20 | return this;
21 | }
22 |
23 | /**
24 | *
25 | * @param {string} street
26 | * @param {number} number
27 | */
28 | at(street, number) {
29 | this.customer.address = new Address(street, number);
30 | return this;
31 | }
32 |
33 | /**
34 | *
35 | * @param {string} size
36 | * @return {OrderBuilder}
37 | */
38 | addPizza(size) {
39 | this.pizza = new Pizza(size);
40 | this.allPizzas.push(this.pizza);
41 |
42 | return this;
43 | }
44 |
45 | /**
46 | * @param {Boolean} value
47 | * @return {OrderBuilder}
48 | */
49 | withCheese(value) {
50 | this.pizza.cheese = (typeof(value) === 'boolean' ? value : true);
51 | return this;
52 | }
53 |
54 | /**
55 | *
56 | * @return {OrderBuilder}
57 | */
58 | withoutCheese() {
59 | this.pizza.cheese = false;
60 | return this;
61 | }
62 |
63 | /**
64 | * @param {Boolean} value
65 | * @return {OrderBuilder}
66 | */
67 | withTomato(value) {
68 | this.pizza.tomato = (typeof(value) === 'boolean' ? value : true);
69 | return this;
70 | }
71 |
72 | /**
73 | *
74 | * @return {OrderBuilder}
75 | */
76 | withoutTomato() {
77 | this.pizza.tomato = false;
78 | return this;
79 | }
80 |
81 | /**
82 | * @param {Boolean} value
83 | * @return {OrderBuilder}
84 | */
85 | withBacon(value) {
86 | this.pizza.bacon = (typeof(value) === 'boolean' ? value : true);
87 | return this;
88 | }
89 |
90 | /**
91 | *
92 | * @return {OrderBuilder}
93 | */
94 | withoutBacon() {
95 | this.pizza.bacon = false;
96 | return this;
97 | }
98 |
99 | /**
100 | *
101 | */
102 | finish() {
103 | return new Order(this.customer, this.allPizzas);
104 | }
105 | }
106 |
107 | module.exports = OrderBuilder;
--------------------------------------------------------------------------------
/1-introduction/1.10-design-patterns/implementation-js/builder-alt/Pizza.js:
--------------------------------------------------------------------------------
1 | class Pizza {
2 | /**
3 | *
4 | * @param {number} size
5 | */
6 | constructor(size) {
7 | this.size = size;
8 | this.cheese = false;
9 | this.tomato = false;
10 | this.bacon = false;
11 | }
12 | }
13 |
14 | module.exports = Pizza;
--------------------------------------------------------------------------------
/1-introduction/1.10-design-patterns/implementation-js/builder-alt/client.js:
--------------------------------------------------------------------------------
1 | const OrderBuilder = require('./OrderBuilder');
2 |
3 | const order1 = new OrderBuilder()
4 | .to('Garen')
5 | .at('Demacia', 1325)
6 | .addPizza('large')
7 | .withCheese(true)
8 | .withTomato(true)
9 | .withBacon(false)
10 | .finish();
11 |
12 | const order2 = new OrderBuilder()
13 | .to('Sivir')
14 | .at('Shurima', 7)
15 | .addPizza('small')
16 | .withoutCheese()
17 | .withTomato()
18 | .withoutBacon()
19 | .addPizza('medium')
20 | .withCheese()
21 | .withoutTomato()
22 | .withBacon()
23 | .finish();
24 |
25 | const order3 = new OrderBuilder()
26 | .to('Taric')
27 | .at('Mt. Targon', 999999999)
28 | .addPizza('giant')
29 | .withCheese()
30 | .withTomato()
31 | .withBacon()
32 | .addPizza('small')
33 | .withoutCheese()
34 | .withTomato()
35 | .withoutBacon()
36 | .addPizza('small')
37 | .withCheese()
38 | .withoutTomato()
39 | .withBacon()
40 | .finish();
41 |
42 | console.log(order1.toString());
43 | console.log('');
44 | console.log(order2.toString());
45 | console.log('');
46 | console.log(order3.toString());
--------------------------------------------------------------------------------
/1-introduction/1.10-design-patterns/implementation-js/builder/Car.js:
--------------------------------------------------------------------------------
1 | class Car {
2 | constructor(make, model, numDoors, colour) {
3 | this.make = make;
4 | this.model = model;
5 | this.numDoors = numDoors;
6 | this.colour = colour;
7 | }
8 | }
9 |
10 | module.exports = Car;
--------------------------------------------------------------------------------
/1-introduction/1.10-design-patterns/implementation-js/builder/FerrariBuilder.js:
--------------------------------------------------------------------------------
1 | const ICarBuilder = require('./ICarBuilder');
2 | const Car = require('./Car');
3 |
4 | class FerrariBuilder extends ICarBuilder {
5 | constructor() {
6 | super();
7 | }
8 |
9 | getResult() {
10 | return this.numDoors === 2 ? new Car('Ferrari', '488 Spider', this.colour, this.numDoors) : null;
11 | }
12 | }
13 |
14 | module.exports = FerrariBuilder;
--------------------------------------------------------------------------------
/1-introduction/1.10-design-patterns/implementation-js/builder/ICarBuilder.js:
--------------------------------------------------------------------------------
1 | class ICarBuilder {
2 | constructor() {
3 | this.colour = '';
4 | this.numDoors = 0;
5 |
6 | if (this.getResult === undefined) {
7 | throw new TypeError('Classes extending the widget abstract class must implement "getResult".');
8 | }
9 | }
10 | }
11 |
12 | module.exports = ICarBuilder;
--------------------------------------------------------------------------------
/1-introduction/1.10-design-patterns/implementation-js/builder/SportsCarBuildDirector.js:
--------------------------------------------------------------------------------
1 | class SportsCarBuildDirector {
2 | constructor(builder) {
3 | this._builder = builder;
4 | }
5 |
6 | construct() {
7 | this._builder.colour = 'Red';
8 | this._builder.numDoors = 2;
9 | }
10 | }
11 |
12 | module.exports = SportsCarBuildDirector;
--------------------------------------------------------------------------------
/1-introduction/1.10-design-patterns/implementation-js/builder/client.js:
--------------------------------------------------------------------------------
1 | const FerrariBuilder = require('./FerrariBuilder');
2 | const SportsCarBuildDirector = require('./SportsCarBuildDirector');
3 |
4 | var builder = new FerrariBuilder();
5 | var director = new SportsCarBuildDirector(builder);
6 |
7 | director.construct();
8 | var myRaceCar = builder.getResult();
9 |
10 | console.log(myRaceCar);
--------------------------------------------------------------------------------
/1-introduction/1.10-design-patterns/implementation-js/factory-method/Champion.js:
--------------------------------------------------------------------------------
1 | class Champion {
2 | constructor() {
3 | if (this.constructor === Champion) {
4 | throw new TypeError('Abstract class "Champion" cannot be instantiated directly.');
5 | }
6 | }
7 | }
8 |
9 | module.exports = Champion;
--------------------------------------------------------------------------------
/1-introduction/1.10-design-patterns/implementation-js/factory-method/ChampionFactory.js:
--------------------------------------------------------------------------------
1 | const Champion = require('./Champion');
2 | const SupportChampion = require('./SupportChampion');
3 | const MarksmanChampion = require('./MarksmanChampion');
4 |
5 | class ChampionFactory {
6 | constructor() {
7 | this.ROLE_SUPPORT = 'ROLE_SUPPORT';
8 | this.ROLE_MARKSMAN = 'ROLE_MARKSMAN';
9 | }
10 |
11 | /**
12 | * @param {string} role Champion's role.
13 | * @returns {Champion} New champion.
14 | */
15 | summon(role) {
16 | switch (role) {
17 | case this.ROLE_SUPPORT:
18 | return new SupportChampion();
19 | case this.ROLE_MARKSMAN:
20 | return new MarksmanChampion();
21 | default:
22 | throw new NotSupportedException();
23 | }
24 | }
25 | }
26 |
27 | module.exports = ChampionFactory;
--------------------------------------------------------------------------------
/1-introduction/1.10-design-patterns/implementation-js/factory-method/MarksmanChampion.js:
--------------------------------------------------------------------------------
1 | const Champion = require('./Champion');
2 |
3 | class MarksmanChampion extends Champion {
4 | constructor() {
5 | super();
6 |
7 | this.name = 'Xahya';
8 | this.ap = 12;
9 | this.ad = 31;
10 | }
11 | }
12 |
13 | module.exports = MarksmanChampion;
--------------------------------------------------------------------------------
/1-introduction/1.10-design-patterns/implementation-js/factory-method/SupportChampion.js:
--------------------------------------------------------------------------------
1 | const Champion = require('./Champion');
2 |
3 | class SupportChampion extends Champion {
4 | constructor() {
5 | super();
6 |
7 | this.name = 'Rakan';
8 | this.ap = 32;
9 | this.ad = 11;
10 | }
11 | }
12 |
13 | module.exports = SupportChampion;
--------------------------------------------------------------------------------
/1-introduction/1.10-design-patterns/implementation-js/factory-method/client.js:
--------------------------------------------------------------------------------
1 | const ChampionFactory = require('./ChampionFactory');
2 |
3 | var factory = new ChampionFactory();
4 | var marksman = factory.summon(factory.ROLE_MARKSMAN);
5 | var support = factory.summon(factory.ROLE_SUPPORT);
6 |
7 | console.log(`The marksman is ${marksman.name}`);
8 | console.log(`The support is ${support.name}`);
--------------------------------------------------------------------------------
/1-introduction/1.10-design-patterns/implementation-js/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "design-patterns-implementation",
3 | "version": "1.0.0",
4 | "description": "",
5 | "main": "index.js",
6 | "scripts": {
7 | "test": "echo \"Error: no test specified\" && exit 1"
8 | },
9 | "keywords": [],
10 | "author": "",
11 | "license": "ISC"
12 | }
13 |
--------------------------------------------------------------------------------
/1-introduction/1.10-design-patterns/implementation-js/prototype/DoransBlade.js:
--------------------------------------------------------------------------------
1 | const Item = require('./Item');
2 |
3 | class DoransBlade extends Item {
4 | constructor() {
5 | super();
6 |
7 | this.name = `Doran's Blade`;
8 | // TODO
9 | }
10 |
11 | clone() {
12 | return {
13 | id: this.id,
14 | name: this.name
15 | };
16 | }
17 | }
18 |
19 | module.exports = DoransBlade;
--------------------------------------------------------------------------------
/1-introduction/1.10-design-patterns/implementation-js/prototype/DoransRing.js:
--------------------------------------------------------------------------------
1 | const Item = require('./Item');
2 |
3 | class DoransRing extends Item {
4 | constructor() {
5 | super();
6 |
7 | this.name = `Doran's Ring`;
8 | // TODO
9 | }
10 |
11 | clone() {
12 | return {
13 | id: this.id,
14 | name: this.name
15 | };
16 | }
17 | }
18 |
19 | module.exports = DoransRing;
--------------------------------------------------------------------------------
/1-introduction/1.10-design-patterns/implementation-js/prototype/DoransShield.js:
--------------------------------------------------------------------------------
1 | const Item = require('./Item');
2 |
3 | class DoransShield extends Item {
4 | constructor() {
5 | super();
6 |
7 | this.name = `Doran's Shield`;
8 | // TODO
9 | }
10 |
11 | clone() {
12 | return {
13 | id: this.id,
14 | name: this.name
15 | };
16 | }
17 | }
18 |
19 | module.exports = DoransShield;
--------------------------------------------------------------------------------
/1-introduction/1.10-design-patterns/implementation-js/prototype/Item.js:
--------------------------------------------------------------------------------
1 | class Item {
2 | constructor() {
3 | this.id = new Date().getTime();
4 |
5 | if (this.constructor === Item) {
6 | throw new TypeError('Abstract class "Item" cannot be instantiated directly.');
7 | }
8 |
9 | if (this.clone === undefined) {
10 | throw new TypeError('Classes extending the Item abstract class must implement "clone".');
11 | }
12 | }
13 | }
14 |
15 | module.exports = Item;
--------------------------------------------------------------------------------
/1-introduction/1.10-design-patterns/implementation-js/prototype/ItemFactory.js:
--------------------------------------------------------------------------------
1 | const Item = require('./Item');
2 | const DoransBlade = require('./DoransBlade');
3 | const DoransRing = require('./DoransRing');
4 | const DoransShield = require('./DoransShield');
5 |
6 | class ItemFactory {
7 | constructor() {
8 | this.ITEM_DORANS_BLADE = 'DORANS_BLADE';
9 | this.ITEM_DORANS_RING = 'DORANS_RING';
10 | this.ITEM_DORANS_SHIELD = 'DORANS_SHIELD';
11 |
12 | this._DORANS_BLADE = new DoransBlade();
13 | this._DORANS_RING = new DoransRing();
14 | this._DORANS_SHIELD = new DoransShield();
15 | }
16 |
17 | /**
18 | * @param {string} item Initial item.
19 | * @returns {Item} New champion.
20 | */
21 | buy(item) {
22 | switch (item) {
23 | case this.ITEM_DORANS_BLADE:
24 | return this._DORANS_BLADE.clone();
25 | case this.ITEM_DORANS_RING:
26 | return this._DORANS_RING.clone();
27 | case this.ITEM_DORANS_SHIELD:
28 | return this._DORANS_SHIELD.clone();
29 | default:
30 | throw new NotSupportedException();
31 | }
32 | }
33 | }
34 |
35 | module.exports = ItemFactory;
--------------------------------------------------------------------------------
/1-introduction/1.10-design-patterns/implementation-js/prototype/client.js:
--------------------------------------------------------------------------------
1 | const ItemFactory = require('./ItemFactory');
2 |
3 | var factory = new ItemFactory();
4 |
5 | var firstDoransBlade = factory.buy(factory.ITEM_DORANS_BLADE);
6 | var firstDoransRing = factory.buy(factory.ITEM_DORANS_RING);
7 | var firstDoransShield = factory.buy(factory.ITEM_DORANS_SHIELD);
8 |
9 | var secondDoransBlade = factory.buy(factory.ITEM_DORANS_BLADE);
10 | var secondDoransRing = factory.buy(factory.ITEM_DORANS_RING);
11 | var secondDoransShield = factory.buy(factory.ITEM_DORANS_SHIELD);
12 |
13 | var thirdDoransBlade = factory.buy(factory.ITEM_DORANS_BLADE);
14 | var thirdDoransRing = factory.buy(factory.ITEM_DORANS_RING);
15 | var thirdDoransShield = factory.buy(factory.ITEM_DORANS_SHIELD);
16 |
17 | console.log({
18 | first: {
19 | firstDoransBlade,
20 | firstDoransRing,
21 | firstDoransShield
22 | }
23 | });
24 |
25 | console.log({
26 | second: {
27 | secondDoransBlade,
28 | secondDoransRing,
29 | secondDoransShield
30 | }
31 | });
32 |
33 | console.log({
34 | third: {
35 | thirdDoransBlade,
36 | thirdDoransRing,
37 | thirdDoransShield
38 | }
39 | });
--------------------------------------------------------------------------------
/1-introduction/1.10-design-patterns/implementation-js/singleton/Singleton.js:
--------------------------------------------------------------------------------
1 | class Singleton {
2 | constructor() {
3 | this.niceProperty = `I'm a nice property :D`;
4 | }
5 |
6 | get instance() {
7 | if (!this._instance) {
8 | this._instance = new Singleton();
9 | }
10 |
11 | return this._instance;
12 | }
13 | }
14 |
15 | module.exports = Singleton;
--------------------------------------------------------------------------------
/1-introduction/1.10-design-patterns/implementation-js/singleton/client.js:
--------------------------------------------------------------------------------
1 | const Singleton = require('./Singleton');
2 |
3 | var instanceA = Singleton.instance;
4 | var instanceB = Singleton.instance;
5 |
6 | console.log('instanceA', instanceA.niceProperty);
7 | console.log('instanceB', instanceB.niceProperty);
8 |
9 | console.log('-----');
10 |
11 | instanceB.niceProperty = `Sometimes I may change >:)`;
12 |
13 | console.log('instanceA', instanceA.niceProperty);
14 | console.log('instanceB', instanceB.niceProperty);
15 |
--------------------------------------------------------------------------------
/1-introduction/1.11-character-encodings/character-encodings.md:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/evertonbaima/developer-roadmap/c1e807586780fed21b66ae789e46524cc4022733/1-introduction/1.11-character-encodings/character-encodings.md
--------------------------------------------------------------------------------
/developer-roadmap.code-workspace:
--------------------------------------------------------------------------------
1 | {
2 | "folders": [
3 | {
4 | "path": "."
5 | }
6 | ],
7 | "settings": {}
8 | }
--------------------------------------------------------------------------------
/readme.md:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
Developer Roadmap
6 | Roadmap to becoming a Web Developer in 2019
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 | Below you find a set of charts demonstrating the paths that you can take and the technologies that you would want to adopt in order to become a frontend, backend or a devops. I made these charts for an old professor of mine who wanted something to share with his college students to give them a perspective; sharing them here to help the community.
17 |
18 | Check out my [blog](http://kamranahmed.info) and say "hi" on [Twitter](https://twitter.com/kamranahmedse).
19 |
20 | ## Disclaimer
21 | > The purpose of these roadmaps is to give you an idea about the landscape and to guide you if you are confused about what to learn next and not to encourage you to pick what is hip and trendy. You should grow some understanding of why one tool would better suited for some cases than the other and remember hip and trendy never means best suited for the job
22 |
23 | ## Introduction
24 |
25 | 
26 |
27 | ## Frontend Roadmap
28 |
29 | 
30 |
31 | ## Back-end Roadmap
32 |
33 | 
34 |
35 | ## DevOps Roadmap
36 |
37 | 
38 |
39 | ## 🚦 Wrap Up
40 |
41 | If you think any of the roadmaps can be improved, please do open a PR with any updates and submit any issues. Also, I will continue to improve this, so you might want to watch/star this repository to revisit.
42 |
43 | ## 🙌 Contribution
44 |
45 | > Have a look at [contribution docs](./0-roadmap/contributing.md) for how to update any of the roadmaps
46 |
47 | - Open pull request with improvements
48 | - Discuss ideas in issues
49 | - Spread the word
50 | - Reach out with any feedback [](https://twitter.com/kamranahmedse)
51 |
52 | ## Sponsored By
53 |
54 | - [**Hackr.io** - Best Online Programming Courses & Tutorials Recommended by the Programming Community](https://hackr.io)
55 | - [**Noon** – Develop, Document, Test and Monitor your APIs](https://noon.sh/)
56 |
57 | ## License
58 |
59 | [](https://creativecommons.org/licenses/by-nc-sa/4.0/)
60 |
--------------------------------------------------------------------------------