Compare commits

..

1018 Commits

Author SHA1 Message Date
Kamran Ahmed
9371d8b8e9 Fix height for the react roadmapgst 2022-08-12 16:48:48 +04:00
Kamran Ahmed
aa8e8daacb Add props vs state introduction 2022-08-12 16:43:53 +04:00
Kamran Ahmed
944c38736d Add components introduction docs 2022-08-12 16:43:42 +04:00
Kamran Ahmed
d916319777 Add class components introduction 2022-08-12 16:43:35 +04:00
Kamran Ahmed
1c47773816 Add functional components resources 2022-08-12 16:43:27 +04:00
Kamran Ahmed
c52ea8d7f8 Add JSX introduction 2022-08-12 16:43:16 +04:00
Kamran Ahmed
6c4d98d6a0 Add content for create-react-app 2022-08-12 16:27:29 +04:00
Kamran Ahmed
78d94cd4b0 Add content for react fundamentals 2022-08-12 16:27:21 +04:00
Kamran Ahmed
25cf42eb47 Add content for react 2022-08-11 17:52:04 +04:00
Kamran Ahmed
7b11f49468 Add content directories for react roadmap 2022-08-11 16:53:52 +04:00
Kamran Ahmed
14f3a8b02d Make react roadmap interactive 2022-08-11 16:48:18 +04:00
Kamran Ahmed
2cadbbee28 Add video link for tree data structure 2022-08-11 16:01:59 +04:00
Archit Sharma
8879e694bf Resources added for HTTP (#1453) 2022-08-11 12:30:15 +04:00
Durrez Ahmed
875b78007d Add content for managing servers (#1457)
* Add content for managing servers

* Update content/roadmaps/102-devops/content/102-managing-servers/readme.md

Co-authored-by: Kamran Ahmed <kamranahmed.se@gmail.com>
2022-08-11 12:29:58 +04:00
andran777
a4eb636bd4 Add content for sed, cat, grep, sort and awk
* awk content with syntax and reference links

* awk content updates

* added sed content

* Added Grep Content

* Updates to Sed content

* Sort Content added

* Update 122-grep.md

* Cat Command

* Update content/roadmaps/102-devops/content/102-managing-servers/101-live-in-terminal/120-awk.md

* Update content/roadmaps/102-devops/content/102-managing-servers/101-live-in-terminal/121-sed.md

* Update content/roadmaps/102-devops/content/102-managing-servers/101-live-in-terminal/122-grep.md

* Update content/roadmaps/102-devops/content/102-managing-servers/101-live-in-terminal/123-sort.md

* Update content/roadmaps/102-devops/content/102-managing-servers/101-live-in-terminal/126-cat.md

Co-authored-by: Kamran Ahmed <kamranahmed.se@gmail.com>
2022-08-11 12:29:07 +04:00
Kamran Ahmed
37bf6713b4 Add ecosystem content for vue.js 2022-08-09 23:41:44 +04:00
Kamran Ahmed
4b1fc37946 Fix frontend content 2022-08-09 23:41:33 +04:00
Kamran Ahmed
327b93ae26 Add content for SSR 2022-08-09 23:41:05 +04:00
Kamran Ahmed
a2eec9ff51 Add routing and forms docs content 2022-08-09 23:12:28 +04:00
Kamran Ahmed
355c6f99f7 Add slot transition and transition group docs 2022-08-09 23:02:25 +04:00
Kamran Ahmed
12d5500da6 Add plugin and watcher docs 2022-08-09 23:02:14 +04:00
Kamran Ahmed
f01b8ee272 Add custom events docs 2022-08-09 23:02:04 +04:00
Kamran Ahmed
e6fea586fe Add custom directive docs 2022-08-09 23:01:56 +04:00
Kamran Ahmed
c95ed6400e Add async/teleport components and provide/inject 2022-08-09 22:35:30 +04:00
Kamran Ahmed
503a5f793c Add Composition API docs 2022-08-09 22:32:24 +04:00
Kamran Ahmed
76f33486c8 Add content for computed properties 2022-08-09 21:19:35 +04:00
Kamran Ahmed
4b7ea2cce1 Add content for events handling 2022-08-09 21:18:09 +04:00
Kamran Ahmed
6a83ab598e Add content for forms handling 2022-08-09 21:18:02 +04:00
Kamran Ahmed
960eb225e3 Add content for lifecycle hooks 2022-08-09 21:17:54 +04:00
Kamran Ahmed
095f2b083f Add content for lifecycle hooks 2022-08-09 21:11:44 +04:00
Kamran Ahmed
9b5b53d4d6 Add content for conditional rendering 2022-08-09 21:10:46 +04:00
Kamran Ahmed
5e7a52d981 Add rendering lists docs 2022-08-09 21:10:05 +04:00
Kamran Ahmed
4706a8f37e Add vue.js templates/directives and api styles docs 2022-08-09 21:06:40 +04:00
Kamran Ahmed
c208219564 Add content for components section 2022-08-09 20:53:53 +04:00
Kamran Ahmed
f8a207e8b7 Add single file component resources 2022-08-09 20:47:59 +04:00
Kamran Ahmed
8c5b9ae3ea Add component docs 2022-08-09 20:46:55 +04:00
Kamran Ahmed
229e515580 Add Vue CLI docs 2022-08-09 20:45:29 +04:00
Andrea Mihaljević
0b19be0a14 App Configurations Intro (#1452)
* App Configurations Intro

* Update content/roadmaps/105-vue/content/100-fundamental-topics/105-app-configurations.md

Co-authored-by: Kamran Ahmed <kamranahmed.se@gmail.com>
2022-08-09 20:44:32 +04:00
Kamran Ahmed
d4be159f35 Add vue introduction 2022-08-09 20:34:07 +04:00
Andrea Mihaljević
2ec14cfb48 Vue CLI Overview (#1451)
* Vue CLI Overview

* Update content/roadmaps/105-vue/content/100-fundamental-topics/100-vue-cli.md

Co-authored-by: Kamran Ahmed <kamranahmed.se@gmail.com>
2022-08-09 20:26:29 +04:00
Archit Sharma
c984691429 Resources added for LXC Container (#1448)
* Resources added for LXC Container

* Update content/roadmaps/102-devops/content/105-infrastructure-as-code/101-lxc.md

Co-authored-by: Kamran Ahmed <kamranahmed.se@gmail.com>
2022-08-09 19:12:41 +04:00
HS
01c4275315 Add prometheus resources 2022-08-09 19:11:52 +04:00
HS
608c8a2b00 Add grafana resources 2022-08-09 19:10:19 +04:00
Paul Marsicovetere
b2bb10079a Add azure devops resources
Azure DevOps documentation
2022-08-09 12:41:09 +04:00
Paul Marsicovetere
442e460b71 Add drone resources
Drone documentation
2022-08-09 12:40:47 +04:00
Paul Marsicovetere
191f71566c Add AWS CDK resources
* Update 101-aws-cdk.md

AWS CDK Documentation

* Update 101-aws-cdk.md
2022-08-09 12:40:31 +04:00
Paul Marsicovetere
49a82d073a Add cloudformation resources
CloudFormation documentation
2022-08-09 12:40:12 +04:00
Paul Marsicovetere
4a15f59a17 Add pulumi resources
Pulumi documentation
2022-08-09 12:39:48 +04:00
Paul Marsicovetere
1bbbc7d67c Add ansible resource
Ansible documentation
2022-08-09 12:39:28 +04:00
Paul Marsicovetere
5388354493 Add Salt resources
Salt documentation
2022-08-09 12:39:08 +04:00
Paul Marsicovetere
ff063bd0d2 Add puppet resources
Puppet documentation
2022-08-09 12:38:50 +04:00
Paul Marsicovetere
0feba5bed1 Add google cloud docs
Google Cloud documentation
2022-08-09 12:38:25 +04:00
Paul Marsicovetere
f6a721a4d0 Add digitalocean resources
DigitalOcean documentation
2022-08-09 12:38:05 +04:00
Paul Marsicovetere
b21e3a4aed Add azure resources
Azure documentation
2022-08-09 12:37:27 +04:00
Paul Marsicovetere
df394605e6 Update 103-heroku.md
Heroku documentation
2022-08-09 12:37:01 +04:00
Kamran Ahmed
aa3467430e Fix responsiveness flicker on interactive vue roadmap 2022-08-08 20:43:34 +04:00
Kamran Ahmed
2d591b63c4 Fix label direction for API calls section 2022-08-08 20:43:34 +04:00
Kamran Ahmed
0069be44f6 Change color for grouped nodes 2022-08-08 20:43:34 +04:00
Kamran Ahmed
079f491c0f Add interactive page for vue roadmap 2022-08-08 20:43:34 +04:00
Kamran Ahmed
780fb66c8b Add content directories for vue roadmap 2022-08-08 20:43:34 +04:00
Kamran Ahmed
3680e8f52c Add groups and names to roadmap JSON 2022-08-08 20:43:34 +04:00
HS
1676d156e7 Add nagios resources
- Add Nagios website, documentation and knowledge base
2022-08-08 20:09:54 +04:00
Kamran Ahmed
de0894c83c Add vue roadmap link to readme 2022-08-08 18:34:23 +04:00
Kamran Ahmed
d22fb3664f Add Vue developer roadmap (#1433) 2022-08-08 18:30:49 +04:00
Sergey Lanzman
a60d8f312f add ngrep (#1432) 2022-08-08 17:40:07 +04:00
Max
b070cb84bd add: Nomad description (#1431) 2022-08-08 15:49:56 +04:00
Kamran Ahmed
3676721a14 Fix broken build 2022-08-08 12:46:34 +04:00
Paul Marsicovetere
074cbddce5 Add CentOS resources
CentOS documentation
2022-08-08 12:45:23 +04:00
Paul Marsicovetere
b0e29ae801 Add Ubuntu resources
Ubuntu Documentation
2022-08-08 12:44:43 +04:00
Paul Marsicovetere
a55e94e9c6 Add RHEL resources
RHEL documentation
2022-08-08 12:43:37 +04:00
Paul Marsicovetere
beb3bbf81a Add suse linux resources
openSUSE documentation
2022-08-08 12:43:20 +04:00
Paul Marsicovetere
8b941feeab Add fedora resources 2022-08-08 12:42:57 +04:00
Paul Marsicovetere
6e9adaa50d Add debian resource
Debian documentation
2022-08-08 12:42:33 +04:00
Paul Marsicovetere
732b156588 Add FreeBSD resources
FreeBSD documentation
2022-08-08 12:42:12 +04:00
Paul Marsicovetere
de79afa645 Add OpenBSD resources
OpenBSD documentation
2022-08-08 12:41:28 +04:00
Paul Marsicovetere
66576bae01 Add NetBSD resources
NetBSD documentation
2022-08-08 12:40:55 +04:00
Paul Marsicovetere
127b9f58d2 Add jenkins resources
Jenkins Documentation
2022-08-08 12:40:28 +04:00
Paul Marsicovetere
9955095e93 Add bamboo resources
Bamboo documentation
2022-08-08 12:39:55 +04:00
Paul Marsicovetere
303a97a6c7 Add teamcity resources
TeamCity documentation
2022-08-08 12:39:27 +04:00
Archit Sharma
32e8cfafec Resources added for Docker (#1417) 2022-08-07 21:55:49 +04:00
Karan Batra
a068d14efe Suggestion to also add roadmap links for nodes (#1415) 2022-08-06 20:28:51 +04:00
Aroyan
2a076bbb0e feat: add HTML templates resource (#1414) 2022-08-06 11:20:34 +04:00
Aroyan
47f91098fd feat: add web.dev learning form course (#1408) 2022-08-06 11:19:34 +04:00
Pavan S Patil
a58b484716 corrected sentence (#1411) 2022-08-06 11:19:20 +04:00
Aroyan
48580ce0ad feat: add shadow dom resource (#1412) 2022-08-06 11:18:35 +04:00
Aroyan
afbd737496 feat: add custom elements resource (#1413) 2022-08-06 11:18:14 +04:00
Esoterydactyl
b215e2d915 Fix typo 2022-08-05 22:59:07 +04:00
Esoterydactyl
1385e6bc3d Add kubernetes resources
* Update 104-kubernetes.md

* Update content/roadmaps/102-devops/content/105-infrastructure-as-code/104-kubernetes.md

Co-authored-by: Kamran Ahmed <kamranahmed.se@gmail.com>
2022-08-05 22:58:51 +04:00
Ulises Rodriguez
74f9a812fb Add resource in JavaScript 2022-08-05 22:54:34 +04:00
ANI
28f388e5be Added Dynamo DB to the NoSQL DB
Added Dynamo DB to the NoSQL DB
2022-08-05 21:13:15 +04:00
levis8989
413934b6d4 Add bash scripting resources
Greetings friend I share with you some of the bash information that has been useful to me, I hope it will be useful for your roadmap which is great.
2022-08-05 19:57:18 +04:00
Sojin
22f20909fe A Concrete Guide to JavaScript Fetch API (#1400)
Talks about the JavaScript Fetch API and how to use it to make asynchronous HTTP requests. This post goes through Sending a Request to Handling the status codes of the Response. Extremely beginner-friendly, easy-to-understand examples.
2022-08-05 19:56:37 +04:00
Aroyan
ea3cf02ee5 feat: add GitHub Actions resources (#1401)
* Add Bootstrap CSS content

* Add Bulma CSS content

* Add Prettier content

* Add Vite content

* Add GitHub content

* Add GitHub content

* Add GitHub content

* Add GitLab content at backend roadmap

* Add Git content on Backend roadmap

* Add HTTPS content on Backend roadmap

* Add Version Control System description

* Add Jekyll content on Frontend roadmap

* Add VuePress content on Frontend roadmap

* Revert "Add VuePress content on Frontend roadmap"

This reverts commit 05625604c2.

* Add Gatsbyjs content on Frontend roadmap

* Update content/roadmaps/100-frontend/content/120-static-site-generators/101-gatsbyjs.md

* Add content for Gridsome

* Add content for NuxtJS

* Revert "Add content for NuxtJS"

This reverts commit bd533a6ba9.

* Add content for Nuxt.js in Front End roadmap

* feat: add github actions resources

Co-authored-by: Kamran Ahmed <kamranahmed.se@gmail.com>
2022-08-05 19:55:25 +04:00
Kamran Ahmed
c354fa9121 Fix#138 Ungroup certain devops groups 2022-08-05 17:08:35 +04:00
Esoterydactyl
9c0e54262f Update to Infra Provisioning Section (#1380)
* Update readme.md

* Update content/roadmaps/102-devops/content/105-infrastructure-as-code/103-infrastructure-provisioning/readme.md

Co-authored-by: Kamran Ahmed <kamranahmed.se@gmail.com>
2022-08-05 16:46:43 +04:00
Esoterydactyl
c96f05e245 Update Infrastructure Monitoring (#1381)
* Update readme.md

* Update content/roadmaps/102-devops/content/107-monitoring/100-infrastructure-monitoring/readme.md

Co-authored-by: Kamran Ahmed <kamranahmed.se@gmail.com>
2022-08-05 16:45:53 +04:00
Esoterydactyl
46333c42a4 Update Cloud Providers with stub (#1382)
* Update readme.md

* Update content/roadmaps/102-devops/content/108-cloud-providers/readme.md

Co-authored-by: Kamran Ahmed <kamranahmed.se@gmail.com>
2022-08-05 16:45:03 +04:00
Esoterydactyl
3bd446577b Update Infrastructure as Code (#1383)
* Update readme.md

* Update content/roadmaps/102-devops/content/105-infrastructure-as-code/readme.md

Co-authored-by: Kamran Ahmed <kamranahmed.se@gmail.com>
2022-08-05 16:42:30 +04:00
Esoterydactyl
85d1f33bb0 Add Chef resources
* Update 101-chef.md

* Update content/roadmaps/102-devops/content/105-infrastructure-as-code/102-configuration-management/101-chef.md

Co-authored-by: Kamran Ahmed <kamranahmed.se@gmail.com>
2022-08-05 16:40:16 +04:00
Esoterydactyl
9b68d69797 Add python resources
Please note that Python 2 is EOL and we should be directing learners exclusively to 3.
2022-08-05 16:37:26 +04:00
Esoterydactyl
ec5c6c592b Add content for containers
* Update 101-containers.md

* Update content/roadmaps/102-devops/content/105-infrastructure-as-code/101-containers.md

Co-authored-by: Kamran Ahmed <kamranahmed.se@gmail.com>
2022-08-05 16:36:39 +04:00
Paul Marsicovetere
2b425eaa5e Add nginx resources 2022-08-05 16:34:12 +04:00
Paul Marsicovetere
82faa52d8b Add apache resources
Matching content from https://github.com/kamranahmedse/developer-roadmap/blob/master/content/roadmaps/101-backend/content/122-web-servers/101-apache.md
2022-08-05 16:33:56 +04:00
Paul Marsicovetere
7a1664328b Add caddy resources
Matching content from https://github.com/kamranahmedse/developer-roadmap/blob/master/content/roadmaps/101-backend/content/122-web-servers/102-caddy.md
2022-08-05 16:33:31 +04:00
Paul Marsicovetere
9d5fe1ec76 Add IIS resources
Matching content from https://github.com/kamranahmedse/developer-roadmap/blob/master/content/roadmaps/101-backend/content/122-web-servers/103-ms-iis.md
2022-08-05 16:33:05 +04:00
Paul Marsicovetere
ef77420e8c Add GitLab CI resources
* Update 100-gitlab-ci.md

GitLab CI documentation

* Update 100-gitlab-ci.md

* Update content/roadmaps/102-devops/content/106-ci-cd/100-gitlab-ci.md

Co-authored-by: Kamran Ahmed <kamranahmed.se@gmail.com>
2022-08-05 16:32:38 +04:00
Paul Marsicovetere
b4e67232ac Add Travis CI resources
Travis CI documentation
2022-08-05 16:31:16 +04:00
Paul Marsicovetere
27f39b37cf Add Circle CI resources
CircleCI documentation
2022-08-05 16:28:54 +04:00
Kamran Ahmed
05ef7deebb Add aws resources 2022-08-05 16:28:00 +04:00
Paul Marsicovetere
c801c52dda Add terraform content
Terraform documentation
2022-08-05 16:26:21 +04:00
Paul Marsicovetere
4a4ff9c9b4 Add AWS content
* Update 100-aws.md

AWS documentation

* Update content/roadmaps/102-devops/content/108-cloud-providers/100-aws.md

Co-authored-by: Kamran Ahmed <kamranahmed.se@gmail.com>
2022-08-05 16:25:23 +04:00
Lorenzo Bloedow
c673672cdc Add content for module bundlers
* Add text and link.

* Update module bundlers

Co-authored-by: Kamran Ahmed <kamranahmed.se@gmail.com>
2022-08-05 16:23:19 +04:00
Esoterydactyl
b55772c017 Add content for application monitoring 2022-08-04 22:55:48 +04:00
Esoterydactyl
4ca06bb183 Add networking resources
Simple change to provide more guidance in the networking node.

Co-authored-by: Kamran Ahmed <kamranahmed.se@gmail.com>
2022-08-04 22:39:47 +04:00
Kamran Ahmed
bb4c8e7227 Add content for os concepts 2022-08-04 22:36:59 +04:00
Esoterydactyl
671972a5af Add linux resources 2022-08-04 22:36:24 +04:00
Kamran Ahmed
42e6f77a69 Add language content in DevOps roadmap 2022-08-04 18:49:03 +04:00
Kamran Ahmed
e3ecc5ef41 Add content for learn a language 2022-08-04 18:41:40 +04:00
Kamran Ahmed
d70d35feb7 Remove sponsors information from the roadmap pages 2022-08-04 18:34:01 +04:00
Kamran Ahmed
00d189d110 Move resource 2022-08-04 16:56:31 +04:00
Kamran Ahmed
45435ef247 Remove the thanks page 2022-08-04 16:35:36 +04:00
Jon K
259bf45b4e Add content for basic terminal commands
* Update 104-basic-terminal-commands.md

* Update 104-basic-terminal-commands.md

Co-authored-by: Kamran Ahmed <kamranahmed.se@gmail.com>
2022-08-04 16:30:44 +04:00
Jeff Gaboni
18141ac580 Add API brief description (#1196)
* Add API brief description

* Update content/roadmaps/101-backend/content/109-apis/readme.md

Co-authored-by: Kamran Ahmed <kamranahmed.se@gmail.com>
2022-08-04 16:29:22 +04:00
Max Tiessler
b981dc0ecb Add SOAP resources
* Update 102-soap.md

added soap reading

* Update content/roadmaps/101-backend/content/109-apis/102-soap.md

Co-authored-by: Kamran Ahmed <kamranahmed.se@gmail.com>
2022-08-04 16:14:08 +04:00
Wahyu Rahmana
e78a46e016 add learn restfull api tutorial (#1273) 2022-08-04 16:10:21 +04:00
Kamran Ahmed
dafaa96360 Role vs tool distinction in roadmaps 2022-08-04 15:59:52 +04:00
Pieter
a4d946964f Mention short video animation explaining Docker (#1246) 2022-08-04 13:37:12 +04:00
qrav
4fa7486b22 Update OpenID resources
Co-authored-by: Kamran Ahmed <kamranahmed.se@gmail.com>
2022-08-04 12:27:23 +04:00
Noah salor
54fbfae7cc Operating systems resources
This is a great series on operating systems in general beginner-friendly

Co-authored-by: Kamran Ahmed <kamranahmed.se@gmail.com>
2022-08-04 12:25:46 +04:00
Aroyan
85ff76021f feat: add Lighthouse blog post (#1204)
Co-authored-by: Kamran Ahmed <kamranahmed.se@gmail.com>
2022-08-04 12:10:54 +04:00
Gabriel Fernandes
5d868989fc Fixed typo in Github workflow (#1247) 2022-08-04 12:06:38 +04:00
Favour Olumese
d08eefe8c3 Update readme.md (#1376)
- Changed "represents" to "represent" because the former is used with singular nouns, while the latter is used with plural nouns (e.g., roadmaps)
- Added commas to "i.e." and "e.g."
- Changed ! to an interrobang (?!)
- Added determiners (the) to "value" and "curator"
2022-08-04 10:57:20 +04:00
Filippo Tessarotto
bfefec4e43 OWASP Security Risks: update link to official Github org (#1291) 2022-08-03 20:06:51 +04:00
Kamran Ahmed
c80a3d546b Add content for pinia 2022-08-03 20:05:35 +04:00
Marcus Vinicius Gomes
0b78983398 Add content for pinia 2022-08-03 20:02:46 +04:00
Deshan D. Abeykoon
ef4cb31517 Added a reading point (#1300)
* Added a reading point

* Update content/roadmaps/100-frontend/content/100-internet/101-what-is-http.md

Co-authored-by: Kamran Ahmed <kamranahmed.se@gmail.com>
2022-08-03 20:01:10 +04:00
Disney
2973d8c9a5 Fix typo in resource
Change Miss to Mess, typo

Co-authored-by: Kamran Ahmed <kamranahmed.se@gmail.com>
2022-08-03 20:00:11 +04:00
Archit Sharma
2f13b3ddbf Resources added for Open ID (#1316)
* Resources added for Open ID

* Update content/roadmaps/101-backend/content/109-apis/106-authentication/105-openid.md

Co-authored-by: Kamran Ahmed <kamranahmed.se@gmail.com>
2022-08-03 19:59:14 +04:00
Adrian Krzemiński
425f656433 Add content for Angular Universal
* Update 100-universal.md

* Update content/roadmaps/100-frontend/content/118-server-side-rendering/101-angular/100-universal.md

Co-authored-by: Kamran Ahmed <kamranahmed.se@gmail.com>
2022-08-03 19:58:01 +04:00
Sidra Waseem
aaaeb56dc2 Add Sass Video 2022-08-03 19:57:10 +04:00
Dev Patel
92ba7d5913 Adding Column-DBs content (#1323)
* add column-db content

* Add content to Build-Tools

* Update content/roadmaps/101-backend/content/107-nosql-databases/101-column-databases.md

* Update content/roadmaps/100-frontend/content/110-build-tools/readme.md

Co-authored-by: Kamran Ahmed <kamranahmed.se@gmail.com>
2022-08-03 19:54:49 +04:00
Jingning Zhang
29b28e224b Add Redis video (#1324)
Co-authored-by: Kamran Ahmed <kamranahmed.se@gmail.com>
2022-08-03 19:51:58 +04:00
potatoJs
e356f4e1ac Add intro to web servers
* filled it up, with most help from the mdn docs

youtube link added( gud vid ), with the mdn docs

* Update content/roadmaps/101-backend/content/122-web-servers/readme.md

Co-authored-by: CookedPotato-1428 <103060805+CookedPotato-1428@users.noreply.github.com>
Co-authored-by: Kamran Ahmed <kamranahmed.se@gmail.com>
2022-08-03 19:49:59 +04:00
Aroyan
6be452d80b feat: add resources for Database Normalization (#1327)
Co-authored-by: Kamran Ahmed <kamranahmed.se@gmail.com>
2022-08-03 19:46:56 +04:00
Touseef Ahmad
d160e1f515 Add PWA APIs content
* Update 100-apis.md

* Update content/roadmaps/100-frontend/content/117-progressive-web-apps/100-apis.md

Co-authored-by: Kamran Ahmed <kamranahmed.se@gmail.com>
2022-08-03 19:43:43 +04:00
Osman Furkan
6cc0c84956 Fix jwt website link (#1332) 2022-08-03 19:39:11 +04:00
wrongbyte
e8bba697ab Add content in 108-posix-basics (#1333)
* Add content in 108-posix-basics

* Update content/roadmaps/101-backend/content/102-os-general-knowledge/108-posix-basics.md

Co-authored-by: Kamran Ahmed <kamranahmed.se@gmail.com>
2022-08-03 19:38:18 +04:00
Evin Weissenberg
7c394ec3f8 Add cookie based authentication content
* Update 100-cookie-based.md

* Update content/roadmaps/101-backend/content/109-apis/106-authentication/100-cookie-based.md

Co-authored-by: Kamran Ahmed <kamranahmed.se@gmail.com>
2022-08-03 19:31:57 +04:00
Kamran Ahmed
f705c17523 Add tauri roadmap 2022-08-03 19:29:08 +04:00
ANI
35f844276e Add tauri to frontend roadmap
* Create 103 Tauri.md

Tauri is a great alternative for electron.js. Its super fast and small and secure. A great option every developer must consider.

* Add tauri docs

Co-authored-by: Kamran Ahmed <kamranahmed.se@gmail.com>
2022-08-03 19:27:57 +04:00
Kamran Ahmed
97cde66096 Add updated devops pdf roadmap 2022-08-03 19:24:22 +04:00
Sojin
e54a44876a Add react native course link
* A Concrete Guide to React Native basics 

I wasn't comfortable following the react native documentation when I was starting out as a web developer (even after learning javascript). this free react native course from udemy was my go-to guide to dive deep into react native basics. After playing with the basic knowledge you will acquire from this course then you'll be able to dive deep into react native documentation. This course structure follows a learn by build format. so you'll not be bored yet you'll be excited to build your first react native app ever.

* Update content/roadmaps/100-frontend/content/121-mobile-applications/100-react-native.md

Co-authored-by: Kamran Ahmed <kamranahmed.se@gmail.com>
2022-08-03 19:22:24 +04:00
Sojin
ef46632587 8 Must Know SEO Best Practices For Developers (#1374)
In these SEO guidelines, the article talks about the importance of Clean Code, Site Architecture, Correct Title Tag, Meta Description, Optimized URLs, Meta Robot Tags, Structured Data, internal linking, Page Loading Speed, Website Responsiveness, and Security. which all of these play a crucial part from an SEO perspective for a web developer.
2022-08-03 19:20:01 +04:00
Kamran Ahmed
1a9a9010e1 Adds interactivity to DevOps roadmap (#1375)
* Make devops roadmap interactive

* Add content skeleton for devops roadmap
2022-08-03 19:18:53 +04:00
Kamran Ahmed
0ef4bfa052 Remove issue templates 2022-08-03 18:51:14 +04:00
Kamran Ahmed
b41ed8726d Update browser lists 2022-08-02 21:25:42 +04:00
Archit Sharma
05f39d2492 Resources added for Server side (#1305)
* Resources added for Server side

* Update Server side caching
2022-08-01 16:39:39 +04:00
Sojin
51afe7b099 A Concrete Guide to Document Object Model (#1370)
I found this ebook 2yrs ago explaining about Document Object Model. it was very helpful in my Journey to programming. A must-read for all DOM manipulators of the web.
2022-08-01 16:37:55 +04:00
Ehsan A. Kian
5e5314707a Add Memcached description and ref (#1371)
* Add Memcached description and ref

* Update content/roadmaps/101-backend/content/110-caching/101-server-side/101-memcached.md

Co-authored-by: Kamran Ahmed <kamranahmed.se@gmail.com>
2022-08-01 16:37:15 +04:00
Mohammad Saleh
c6aa1df112 fix typo in the thanks section (#1342) 2022-08-01 13:32:43 +04:00
Robert Reinold
d112e59179 initd spelling (#1343)
Co-authored-by: Robby Reinold <robby@superconductive.com>
2022-08-01 13:31:49 +04:00
Ehsan A. Kian
5c0601db32 Add Database normalization description and ref (#1345)
* Add Database normalization description and ref

* Update content/roadmaps/101-backend/content/108-more-about-databases/104-database-normalization.md

Co-authored-by: Kamran Ahmed <kamranahmed.se@gmail.com>
2022-08-01 13:29:07 +04:00
Ikramul Murad
8f7c7d5e6b Resources added for IO management (#1346)
* Resources added for IO management

* Update content/roadmaps/101-backend/content/102-os-general-knowledge/107-io-management.md

Co-authored-by: Kamran Ahmed <kamranahmed.se@gmail.com>
2022-08-01 13:25:25 +04:00
Sophia Iroegbu
0bb2397cec Add resources for data replication
* Update 106-data-replication.md

I added a short description and video link that explains data replication within four minutes. Please take a look at it, thanks :)

* Update content/roadmaps/101-backend/content/108-more-about-databases/106-data-replication.md

Co-authored-by: Kamran Ahmed <kamranahmed.se@gmail.com>
2022-08-01 13:23:22 +04:00
jinxm
a001bfa106 doc: Server side rendering (#1349)
* Update readme.md

* Update readme.md

* Update content/roadmaps/100-frontend/content/118-server-side-rendering/readme.md

Co-authored-by: Kamran Ahmed <kamranahmed.se@gmail.com>
2022-08-01 13:22:12 +04:00
Kamran Ahmed
28df585d1a Add C++ resources 2022-08-01 13:21:52 +04:00
Jordan
7f54175531 Add Resources for Redis (#1350)
* Add Resources for Redis

* Add Resources for Redis - Official website

Co-authored-by: Kamran Ahmed <kamranahmed.se@gmail.com>
2022-08-01 13:18:11 +04:00
Parisa Khaleghi
de28ff99ef Add C++ resources 2022-08-01 13:17:08 +04:00
Jawad
60b6b997e7 Add description to the type checkers (#1356)
* adding description to the type checkers

* Update content/roadmaps/100-frontend/content/116-type-checkers/readme.md

Co-authored-by: Kamran Ahmed <kamranahmed.se@gmail.com>
2022-08-01 13:16:17 +04:00
acethical
d2b35ca191 Update 100-redis.md (#1357) 2022-08-01 13:12:46 +04:00
Emerson Castillo
e01fe4df5f Added MDN article (#1359) 2022-08-01 13:09:38 +04:00
Hossein Askari
632ecfd8ff Add timeseries database 2022-08-01 13:08:01 +04:00
Mohammed Habib
84141cc535 Add command line resource
Add command line challenge as an interactive learning tool
2022-08-01 11:32:57 +04:00
Mirodil Kamilov
95c0550e53 Add new PHP resource (video tutorial) (#1362) 2022-08-01 11:30:32 +04:00
yao-shang
e00bb9219d Fixed link to "Journey to HTTP/2" article (#1364)
I noticed a single forwardslash broke the link for the "Journey to HTTP/2" article. Same as commit 9a212dc but for the front-end roadmap.
2022-08-01 11:29:41 +04:00
Sojin
576951014c Added a New resource to Fetch API (#1365)
* Added a New resource to Fetch API

RapidAPI gives an in-depth explanation of fetch API. what it is, How to use it to process API responses, HTTP Methods with Fetch API and How can errors be handled. Suited For Beginners and the content is packed with real-time examples.

* Update content/roadmaps/100-frontend/content/103-javascript/102-learn-fetch-api-ajax-xhr.md

Co-authored-by: Kamran Ahmed <kamranahmed.se@gmail.com>
2022-08-01 11:29:17 +04:00
Julian Insua
ec2ee855d4 Update gRPC deffinition (#1368)
* Update gRPC deffinition

I thought that some high-level definition of this would be nice.

* Update content/roadmaps/101-backend/content/109-apis/103-grpc.md

Co-authored-by: Kamran Ahmed <kamranahmed.se@gmail.com>
2022-08-01 11:19:21 +04:00
AliGaygisiz
cc523dc168 Updated as 6th most starred repo (#1369) 2022-08-01 11:17:18 +04:00
Kamran Ahmed
293c287ae6 Fix broken build 2022-07-14 10:24:56 +05:00
Ehsan A. Kian
0f1ba869ea Update 101-domain-driven-design.md (#1336)
* Update 101-domain-driven-design.md

* Update content/roadmaps/101-backend/content/114-design-and-development-principles/101-domain-driven-design.md

Co-authored-by: Kamran Ahmed <kamranahmed.se@gmail.com>
2022-07-14 10:06:48 +05:00
Caleb Joshua
39fc32559e Add 'DNS Records for Newbies' (#1337)
DNS Records for Newbies - How To Manage Website Records - https://www.youtube.com/watch?v=YV5tkQYcvfg
2022-07-14 10:04:33 +05:00
Taeik Lim
b416244be9 Fix typo in journey to http2 (#1326) 2022-07-14 10:02:18 +05:00
Dava
9a212dc65a fix Journey to HTTP/2 link (#1339) 2022-07-14 10:01:57 +05:00
Leonardo Romanini
2939a7e7a1 Add resouce for cqrs and event sourcing (#1307) 2022-06-28 15:02:16 +04:00
Aroyan
fae0bef2f8 fix: remove empty badge at ChakraUI (#1308) 2022-06-28 15:01:58 +04:00
Kamran Ahmed
5d8b14e9c3 Update sponsors section 2022-06-24 01:00:00 +04:00
Taeik Lim
3b0923ce74 Change md5 wiki link to english wiki (#1306) 2022-06-23 20:59:06 +04:00
Kamran Ahmed
ed9cc647ce Remove doppler from sponsors 2022-06-22 13:59:44 +04:00
Arminder Singh
295f404d7b Adding Content and Resources for CSS Frameworks (#1287) 2022-06-22 11:39:35 +04:00
Archit Sharma
786acc072d Resources added for Database indexes (#1301) 2022-06-20 14:57:08 +04:00
Archit Sharma
9c6438726a Resources added for oracle (#1298)
* Resources added for oracle

* Update content/roadmaps/101-backend/content/106-relational-databases/104-oracle.md

Co-authored-by: Kamran Ahmed <kamranahmed.se@gmail.com>
2022-06-18 14:13:25 +04:00
Kamran Ahmed
b1fc074416 Remove sponsor 2022-06-18 14:12:28 +04:00
Kamran Ahmed
355f1e610e Update PDFs path 2022-06-14 20:21:44 +04:00
Kamran Ahmed
e5d5043bca Trigger build 2022-06-14 20:12:41 +04:00
Kamran Ahmed
01c4870a63 Update PDFs path 2022-06-14 20:10:39 +04:00
Gabriel Nunes
04b434bdcb Add content for Operating Systems
* Update 101-how-oss-work-in-general.md

* Update content/roadmaps/101-backend/content/102-os-general-knowledge/101-how-oss-work-in-general.md

Co-authored-by: Kamran Ahmed <kamranahmed.se@gmail.com>
2022-06-14 16:26:30 +04:00
Alberto Vinícius A. dos Santos
f3366d1fd3 fix: the word "compatible" is written wrong (#1297) 2022-06-14 16:25:17 +04:00
Kamran Ahmed
8eda9bb049 Remove carbon ads 2022-06-14 16:24:53 +04:00
Danil
b845ddad09 Fix wrong content description for Freeze and Seal in JavaScript (#1293) 2022-06-13 11:47:29 +04:00
Archit Sharma
4759604e14 Resources added for Graph databases (#1294) 2022-06-13 11:47:13 +04:00
Archit Sharma
eb29d5348e Resources added for Solr (#1281) 2022-06-07 11:57:28 +04:00
Nico Domino
3de4eaafec Add 'messwithdns.com' julia evans DNS playground (#1283) 2022-06-07 11:56:57 +04:00
helmut a carter
05eefc9e30 corrected grammar: it's -> its (#1284) 2022-06-07 11:56:33 +04:00
Archit Sharma
c9c5349926 Resources added for Neo4j (#1263) 2022-05-24 23:00:07 +04:00
Anu
d47bf04f9e Fixed issue #1217 - missing read label (#1272)
Fixed a typo that was causing missing "read" label on a resource link in frontend developer roadmap, pwa node.
2022-05-24 22:59:45 +04:00
Anu
cd676cacfd Add PWA resource (#1266)
#### What roadmap does this PR target?

- [ ] Code Change
- [x] Frontend Roadmap
- [ ] Backend Roadmap
- [ ] DevOps Roadmap
- [ ] All Roadmaps
- [ ] Guides

#### Please acknowledge the items listed below

- [x] I have discussed this contribution and got a go-ahead in an issue before opening this pull request.
- [x] This is not a duplicate issue. I have searched and there is no existing issue for this.
- [x] I understand that these roadmaps are highly opinionated. The purpose is to not to include everything out there in these roadmaps but to have everything that is most relevant today comparing to the other options listed.
- [x] I have read the [contribution docs](../contributing) before opening this PR.

#### Enter the details about the contribution

I am suggesting the addition of PWA tutorials from MDN Web Docs. Apart from basic introduction to PWAs, it has numerous helpful How-to's such as using client-side storage with IndexedDB and Web Storage API, making mobile-first and installable PWAs, enabling "add to home screen", using notifications and push API etc.
2022-05-21 20:57:46 +04:00
Gustavo Ribeiro
fb79348426 Add scrypt content for back-end roadmap (#1267) 2022-05-21 20:57:31 +04:00
Gustavo Ribeiro
e468763346 Add SSL/TLS content for back-end roadmap (#1268) 2022-05-21 20:57:14 +04:00
Anu
e18df2b24b Add content to PWA peformance node (#1269)
#### What roadmap does this PR target?

- [ ] Code Change
- [x] Frontend Roadmap
- [ ] Backend Roadmap
- [ ] DevOps Roadmap
- [ ] All Roadmaps
- [ ] Guides

#### Please acknowledge the items listed below

- [x] I have discussed this contribution and got a go-ahead in an issue before opening this pull request.
- [x] This is not a duplicate issue. I have searched and there is no existing issue for this.
- [x] I understand that these roadmaps are highly opinionated. The purpose is to not to include everything out there in these roadmaps but to have everything that is most relevant today comparing to the other options listed.
- [x] I have read the [contribution docs](../contributing) before opening this PR.

#### Enter the details about the contribution

I have added a description and several resources that I have used myself and found useful in learning the topic of PWA performance analysis. 
-1st link is from google web.dev and provides several articles on what is speed, how does it matter and how one can measure and optimize the performance of PWAs. 
-2nd link gives detailed explanation on what is PRPL pattern and how it works. 
-3rd resource is from google web.dev and teaches how to implement PRPL pattern to instantly load PWAs
-4th resource is from google web.dev and gives a detailed account about RAIL model and its implementation
-5th resource is from freecodecamp and gives an introduction to Chrome Lighthouse
-6th resource is from PWA training module of Google Developers (Web)
-7th resource is a 5 minute tutorial on how to use Lighthouse to audit your PWAs

I was unable to find a resource on devtools that is specifically catered to PWAs compared to general website performance analysis. Will add later if needed and this contribution gets approval!
2022-05-21 20:56:58 +04:00
Kamran Ahmed
30bc570dc7 Add missing sponsors 2022-05-19 21:51:35 +04:00
Archit Sharma
b18bee3828 Resources added for Linters formatters (#1261) 2022-05-16 19:57:42 +04:00
Nis-chal-Jain
ec6606d9d8 Added Bootstrap Documentation (#1262) 2022-05-16 19:57:20 +04:00
Aroyan
b60e1ee8e8 Add gRPC content on Backend roadmap (#1260)
* Add Bootstrap CSS content

* Add Bulma CSS content

* Add Prettier content

* Add Vite content

* Add GitHub content

* Add GitHub content

* Add GitHub content

* Add GitLab content at backend roadmap

* Add Git content on Backend roadmap

* Add HTTPS content on Backend roadmap

* Add Version Control System description

* Add Jekyll content on Frontend roadmap

* Add VuePress content on Frontend roadmap

* Revert "Add VuePress content on Frontend roadmap"

This reverts commit 05625604c2.

* Add Gatsbyjs content on Frontend roadmap

* Update content/roadmaps/100-frontend/content/120-static-site-generators/101-gatsbyjs.md

* Add content for Gridsome

* Add content for NuxtJS

* Revert "Add content for NuxtJS"

This reverts commit bd533a6ba9.

* Add content for Nuxt.js in Front End roadmap

* feat(content):add gRPC content on backend roadmap

Co-authored-by: Kamran Ahmed <kamranahmed.se@gmail.com>
2022-05-13 22:34:09 +04:00
amq
8467abf624 Fix line length issue looking as a typo (#1255) 2022-05-11 16:03:19 +04:00
Gustavo Ribeiro
ef706f700b Add SHA family content for the back-end roadmap (#1257) 2022-05-11 15:56:36 +04:00
Paul Marsicovetere
39b87fdab3 Update 104-basic-terminal-commands.md (#1205)
* Update 104-basic-terminal-commands.md

* Update content/roadmaps/101-backend/content/102-os-general-knowledge/104-basic-terminal-commands.md

* Update 104-basic-terminal-commands.md

* Update 104-basic-terminal-commands.md

Co-authored-by: Kamran Ahmed <kamranahmed.se@gmail.com>
2022-04-23 01:33:01 +04:00
Andrey Kudinov
44291d828b Remove extra empty line (#1232) 2022-04-23 01:29:35 +04:00
Andrey Kudinov
d81b56d321 Add vue content (#1233) 2022-04-23 01:29:23 +04:00
Andrey Kudinov
2f36199637 Add react content (#1234) 2022-04-23 01:28:58 +04:00
Andrey Kudinov
eff757633e Add angular content (#1235)
* Add content

* Update content/roadmaps/100-frontend/content/118-server-side-rendering/101-angular/readme.md

Co-authored-by: Kamran Ahmed <kamranahmed.se@gmail.com>
2022-04-23 01:28:22 +04:00
Max Tiessler
bc5dcee8fb Add SOA resources
added reference model for SOA
2022-04-23 01:27:45 +04:00
Paul Marsicovetere
544a530fcb Update 102-mariadb.md (#1206) 2022-04-19 13:17:22 +04:00
Archit Sharma
289d52d135 Resources added for JSON api (#1208)
* Resources added for JSON api

* Update content/roadmaps/101-backend/content/109-apis/101-json-apis.md

Co-authored-by: Kamran Ahmed <kamranahmed.se@gmail.com>
2022-04-19 13:16:40 +04:00
Mochammad Daffa Putra Karyudi
814cf7b137 Update 100-orms.md (#1231)
* Update 100-orms.md

* Update content/roadmaps/101-backend/content/108-more-about-databases/100-orms.md

Co-authored-by: Kamran Ahmed <kamranahmed.se@gmail.com>
2022-04-19 13:14:43 +04:00
Himanshu Jangid, हिमांशु जाँगिड़
87c3fb0aa8 Update 101-after-js.md added introduction and links (#1210)
* Update 101-after-js.md added introduction

* Update content/roadmaps/100-frontend/content/118-server-side-rendering/100-react-js/101-after-js.md

Co-authored-by: Kamran Ahmed <kamranahmed.se@gmail.com>
2022-04-16 16:50:25 +04:00
Saeed Farahi Mohassel
2d17f12caf updated message-borkers pages (#1219)
* updated message-borkers pages

* Update content/roadmaps/101-backend/content/117-message-brokers/100-rabbitmq.md

* Update content/roadmaps/101-backend/content/117-message-brokers/readme.md

Co-authored-by: Kamran Ahmed <kamranahmed.se@gmail.com>
2022-04-16 16:48:28 +04:00
Pieter
b6345f9de1 Add explanation of glue records in DNS (#1222) 2022-04-16 16:33:30 +04:00
Lucas Souza
ff4485a871 Add the Vox video "How Does the Internet Works?" (#1227)
* Add the Vox video "How  Does the Internet Works?"

As the article that describes how the internet works, Vox also have a very intersing video about the topic. It's a great production that covers the whole process among sending and receiving a picture between mobile phones.

* Update content/roadmaps/100-frontend/content/100-internet/100-how-does-the-internet-work.md

Co-authored-by: Kamran Ahmed <kamranahmed.se@gmail.com>
2022-04-16 16:31:01 +04:00
Aroyan
1b9d74525a fix: remove colorScheme attribute at React Native video tutorial (#1201) 2022-03-22 11:50:38 +04:00
Archit Sharma
17120b4db0 Resource add -> Containerization vs Virtualization (#1198) 2022-03-21 10:54:36 +04:00
Aroyan
39a17ec525 fix: remove colorScheme for Ionic video tutorial (#1199) 2022-03-21 10:53:48 +04:00
Archit Sharma
1c8efaf136 Resources added for Web Security Knowledge (#1195) 2022-03-19 17:44:02 +04:00
Archit Sharma
bdd9787690 Resources added for MS IIS (#1194)
* Resources added for MS IIS

* Update content/roadmaps/101-backend/content/122-web-servers/103-ms-iis.md

Co-authored-by: Kamran Ahmed <kamranahmed.se@gmail.com>
2022-03-19 11:15:28 +04:00
Archit Sharma
47542ddfa3 Resources added for CaddyServer (#1191)
* Resources added for CaddyServer

* Update content/roadmaps/101-backend/content/122-web-servers/102-caddy.md

Co-authored-by: Kamran Ahmed <kamranahmed.se@gmail.com>
2022-03-18 10:56:22 +04:00
Aroyan
9e60b1d847 Add Enzyme content on Front End roadmap (#1192) 2022-03-18 10:54:32 +04:00
Marcela Pedrini Duarte
540ec027d7 fix memory management resource type (#1193) 2022-03-18 10:54:16 +04:00
Marcela Pedrini Duarte
fbb9729d01 Update 103-threads-and-concurrency.md (#1185) 2022-03-16 15:24:23 +04:00
Aroyan
04f30d4e2b Add links to ElectronJS on Front End Roadmap (#1187)
* Add Bootstrap CSS content

* Add Bulma CSS content

* Add Prettier content

* Add Vite content

* Add GitHub content

* Add GitHub content

* Add GitHub content

* Add GitLab content at backend roadmap

* Add Git content on Backend roadmap

* Add HTTPS content on Backend roadmap

* Add Version Control System description

* Add Jekyll content on Frontend roadmap

* Add VuePress content on Frontend roadmap

* Revert "Add VuePress content on Frontend roadmap"

This reverts commit 05625604c2.

* Add Gatsbyjs content on Frontend roadmap

* Update content/roadmaps/100-frontend/content/120-static-site-generators/101-gatsbyjs.md

* Add content for Gridsome

* Add content for NuxtJS

* Revert "Add content for NuxtJS"

This reverts commit bd533a6ba9.

* Add content for Nuxt.js in Front End roadmap

* Add links for ElectronJS in Front End Roadmap

Co-authored-by: Kamran Ahmed <kamranahmed.se@gmail.com>
2022-03-16 15:23:24 +04:00
Archit Sharma
601be80bf3 Resources added for Nginx (#1188)
* Resources added for Nginx

* Update content/roadmaps/101-backend/content/122-web-servers/100-nginx.md

Co-authored-by: Kamran Ahmed <kamranahmed.se@gmail.com>
2022-03-16 15:22:36 +04:00
Jack Logan
f3565cf48a Add content - threads and concurrency (#1189) 2022-03-16 15:21:00 +04:00
narasimhauppala
f9b8b8043a update 108-owasp.md (#1161)
* update 108-owasp.md

* Update content/roadmaps/101-backend/content/111-web-security-knowledge/108-owasp.md

Co-authored-by: Kamran Ahmed <kamranahmed.se@gmail.com>
2022-03-14 21:20:11 +04:00
Aroyan
e19d202230 Add content for Nuxt.js in Front End roadmap (#1155)
* Add Bootstrap CSS content

* Add Bulma CSS content

* Add Prettier content

* Add Vite content

* Add GitHub content

* Add GitHub content

* Add GitHub content

* Add GitLab content at backend roadmap

* Add Git content on Backend roadmap

* Add HTTPS content on Backend roadmap

* Add Version Control System description

* Add Jekyll content on Frontend roadmap

* Add VuePress content on Frontend roadmap

* Revert "Add VuePress content on Frontend roadmap"

This reverts commit 05625604c2.

* Add Gatsbyjs content on Frontend roadmap

* Update content/roadmaps/100-frontend/content/120-static-site-generators/101-gatsbyjs.md

* Add content for Gridsome

* Add content for NuxtJS

* Revert "Add content for NuxtJS"

This reverts commit bd533a6ba9.

* Add content for Nuxt.js in Front End roadmap

Co-authored-by: Kamran Ahmed <kamranahmed.se@gmail.com>
2022-03-14 21:18:30 +04:00
Cedrick
cba1419163 Update devops.json - fix typo (#1168) 2022-03-14 21:17:57 +04:00
JAIHARISHAN AV
7110b35b97 Added resources for Basics of SEO in Frontend Development Roadmap (#1169)
* Added resources for Basics of SEO in Frontend Development Roadmap

* Update content/roadmaps/100-frontend/content/101-html/105-seo-basics.md

Co-authored-by: Kamran Ahmed <kamranahmed.se@gmail.com>
2022-03-14 21:17:33 +04:00
Marcela Pedrini Duarte
370e343b91 Added Process Management definition and resources (#1182)
* Update 102-process-management.md

* Update content/roadmaps/101-backend/content/102-os-general-knowledge/102-process-management.md

Co-authored-by: Kamran Ahmed <kamranahmed.se@gmail.com>
2022-03-14 19:06:49 +04:00
ncn000
9c4ccf27dc Fixed typo in Java and Go meta descriptions (#1183) 2022-03-14 19:05:27 +04:00
Archit Sharma
44f2f12dd9 Resources added for WebSockets (#1184) 2022-03-14 19:04:24 +04:00
Ameer Hamza
90204a07ff n+1 problem article link (#1160) 2022-03-12 22:53:05 +04:00
Koodies
dd1a31d577 Add MongoDB content (#1162)
Co-authored-by: kewei <tan.kewei@stengg.com>
2022-03-12 22:52:37 +04:00
Archit Sharma
9cecf34b1a Resources added for Relay Modern (#1172) 2022-03-12 22:50:51 +04:00
Archit Sharma
0ba8999121 Resources added for OWASP (#1174) 2022-03-12 22:49:28 +04:00
Archit Sharma
c4ef89be3c Resources added for Content Security policy (#1177) 2022-03-12 22:48:50 +04:00
Abhishek Jindal
c58d956224 Add Angular definition and official docs link (#1179) 2022-03-12 22:48:12 +04:00
Himanshu Hiranandani
b141f0bcc2 Adds Basic details for the Open API Spec (#1163)
* Adds Basic details for the Open API Spec

* Removes paid content and adds a free course
2022-03-03 10:11:08 +04:00
Archit Sharma
9e955a61a9 Resources added for GraphQL (#1164) 2022-03-03 10:10:40 +04:00
Archit Sharma
b105b2eb5f Resources added for Apollo (#1167) 2022-03-03 10:10:09 +04:00
Archit Sharma
17d0c3d41b Resources added for Jasmine (#1149)
* Resources added for Jasmine

* Update content/roadmaps/100-frontend/content/115-testing-your-apps/108-jasmine.md

* Update content/roadmaps/100-frontend/content/115-testing-your-apps/108-jasmine.md

Co-authored-by: Kamran Ahmed <kamranahmed.se@gmail.com>
2022-02-25 14:15:24 +04:00
Archit Sharma
a30f1ee9c9 Resources added for Hugo (#1150) 2022-02-25 14:13:15 +04:00
Aroyan
ead5e1d399 Add content for Gridsome (#1151)
* Add Bootstrap CSS content

* Add Bulma CSS content

* Add Prettier content

* Add Vite content

* Add GitHub content

* Add GitHub content

* Add GitHub content

* Add GitLab content at backend roadmap

* Add Git content on Backend roadmap

* Add HTTPS content on Backend roadmap

* Add Version Control System description

* Add Jekyll content on Frontend roadmap

* Add VuePress content on Frontend roadmap

* Revert "Add VuePress content on Frontend roadmap"

This reverts commit 05625604c2.

* Add Gatsbyjs content on Frontend roadmap

* Update content/roadmaps/100-frontend/content/120-static-site-generators/101-gatsbyjs.md

* Add content for Gridsome

* Add content for NuxtJS

* Revert "Add content for NuxtJS"

This reverts commit bd533a6ba9.

Co-authored-by: Kamran Ahmed <kamranahmed.se@gmail.com>
2022-02-25 14:12:47 +04:00
Kamran Ahmed
d3f18267a1 Update thanks 2022-02-24 15:35:14 +04:00
Masoumeh Afshar
4eec5b025f Add link to JavaScript concepts 2022-02-21 10:17:40 +04:00
Kamran Ahmed
07cb445d06 Add hash table video link 2022-02-21 03:35:57 +04:00
Archit Sharma
b2c5d6184c Resources added for Ava (#1147) 2022-02-20 14:11:41 +04:00
Archit Sharma
2a57bb91f0 Resources added for Chai js (#1146)
* Resources added for Chai js

* Update content/roadmaps/100-frontend/content/115-testing-your-apps/106-chai.md

Co-authored-by: Kamran Ahmed <kamranahmed.se@gmail.com>
2022-02-19 05:24:10 +04:00
Kamran Ahmed
69ebb08c9e Fix JSON ld response 2022-02-18 20:50:01 +04:00
Kamran Ahmed
1637ef20a6 Fix broken build 2022-02-18 14:18:26 +04:00
Kamran Ahmed
5cbc5e0fdc Update CAP theorem content 2022-02-18 13:07:03 +04:00
Kodey Thomas
8595cc56b5 CAP Theorem Resources (#1099)
* Updated HATEOAS

* Removed Colour Scheme

* CAP Theorem

* Update content/roadmaps/101-backend/content/108-more-about-databases/108-cap-theorem.md

Co-authored-by: Kamran Ahmed <kamranahmed.se@gmail.com>
2022-02-17 18:38:18 +04:00
Himanshu Soni
4199ab05a0 Add cypress content
* Update 102-cypress.md

update documentation

* Update content/roadmaps/100-frontend/content/115-testing-your-apps/102-cypress.md

Co-authored-by: Kamran Ahmed <kamranahmed.se@gmail.com>
2022-02-17 18:36:40 +04:00
Himanshu Soni
f3b6cd87f4 Add content for react testing library
* Update 101-react-testing-library.md

updated Documentation

* Update content/roadmaps/100-frontend/content/115-testing-your-apps/101-react-testing-library.md

Co-authored-by: Kamran Ahmed <kamranahmed.se@gmail.com>
2022-02-17 18:34:27 +04:00
narasimhauppala
3dc6bcd8d6 Add content for memory management
* update 105-memory-management

* Update content/roadmaps/101-backend/content/102-os-general-knowledge/105-memory-management.md

Co-authored-by: Kamran Ahmed <kamranahmed.se@gmail.com>
2022-02-17 18:30:53 +04:00
Archit Sharma
c0b19fec32 Added Resources for Mocha (#1141)
* Added Resources for Mocha

* Update content/roadmaps/100-frontend/content/115-testing-your-apps/105-mocha.md

Co-authored-by: Kamran Ahmed <kamranahmed.se@gmail.com>
2022-02-17 18:19:21 +04:00
Patrick Shushereba
ca092f69f6 [100-github] - Added course to list. (#1143) 2022-02-17 18:18:35 +04:00
Pawel Pisulski
616422b023 Update opensource-banner.tsx (#1144)
Update most starred rank
2022-02-17 16:35:51 +04:00
Kamran Ahmed
0f889af8ab Add doppler logo 2022-02-16 22:27:54 +04:00
Kamran Ahmed
462b532a94 Change doppler logo 2022-02-16 22:26:39 +04:00
Archit Sharma
83611cdbe1 Resources added for VuePress (#1139) 2022-02-15 16:05:10 +04:00
Aroyan
6dbf88d0a6 Add Gatsbyjs content on Frontend roadmap (#1140)
* Add Bootstrap CSS content

* Add Bulma CSS content

* Add Prettier content

* Add Vite content

* Add GitHub content

* Add GitHub content

* Add GitHub content

* Add GitLab content at backend roadmap

* Add Git content on Backend roadmap

* Add HTTPS content on Backend roadmap

* Add Version Control System description

* Add Jekyll content on Frontend roadmap

* Add VuePress content on Frontend roadmap

* Revert "Add VuePress content on Frontend roadmap"

This reverts commit 05625604c2.

* Add Gatsbyjs content on Frontend roadmap

* Update content/roadmaps/100-frontend/content/120-static-site-generators/101-gatsbyjs.md

Co-authored-by: Kamran Ahmed <kamranahmed.se@gmail.com>
2022-02-15 16:04:51 +04:00
Kamran Ahmed
e0c660dcff Add queue data structure video 2022-02-15 04:09:13 +04:00
Kamran Ahmed
0ac5875237 Add queue data structure video 2022-02-15 03:54:29 +04:00
Archit Sharma
35107862cb Added resources for Proton Native (#1134)
* Added resources for Proton Native

* Update content/roadmaps/100-frontend/content/122-desktop-applications/102-proton-native.md

Co-authored-by: Kamran Ahmed <kamranahmed.se@gmail.com>
2022-02-13 21:57:53 +04:00
Archit Sharma
a2a6d7f3cf Added content for Pick a Framework (#1107)
* Added content for Pick a Framework

* Update content/roadmaps/100-frontend/content/111-pick-a-framework/readme.md

Co-authored-by: Kamran Ahmed <kamranahmed.se@gmail.com>
2022-02-12 20:58:24 +04:00
narasimhauppala
6023376452 Add terminal usage resources
* update 100-terminal-usage.md

* Update content/roadmaps/101-backend/content/102-os-general-knowledge/100-terminal-usage.md

Co-authored-by: Kamran Ahmed <kamranahmed.se@gmail.com>
2022-02-12 13:58:18 +04:00
Archit Sharma
c6def19bcd Added resources for Rollup (#1130)
* Added resources for Rollup

* Update content/roadmaps/100-frontend/content/110-build-tools/101-module-bundlers/102-rollup.md

Co-authored-by: Kamran Ahmed <kamranahmed.se@gmail.com>
2022-02-12 13:56:53 +04:00
Paul Marsicovetere
a18daa7356 Add JWT resources
* Update 104-jwt.md

* Update content/roadmaps/101-backend/content/109-apis/106-authentication/104-jwt.md

Co-authored-by: Kamran Ahmed <kamranahmed.se@gmail.com>
2022-02-12 13:56:09 +04:00
Paul Marsicovetere
9ec90f6abe Add bitbucket resources 2022-02-12 13:54:54 +04:00
Archit Sharma
f4183b7174 Added resources for Parcel (#1133)
* Added resources for Parcel

* Update content/roadmaps/100-frontend/content/110-build-tools/101-module-bundlers/103-parcel.md

* Update content/roadmaps/100-frontend/content/110-build-tools/101-module-bundlers/103-parcel.md

Co-authored-by: Kamran Ahmed <kamranahmed.se@gmail.com>
2022-02-12 13:54:21 +04:00
Cabir Bayram
d82ca9b5c4 Add Esbuild to "Esbuild" (#1106)
* Add Esbuild to "Esbuild"

* Update content/roadmaps/100-frontend/content/110-build-tools/101-module-bundlers/101-esbuild.md

* Update content/roadmaps/100-frontend/content/110-build-tools/101-module-bundlers/101-esbuild.md

* Update content/roadmaps/100-frontend/content/110-build-tools/101-module-bundlers/101-esbuild.md

Co-authored-by: Kamran Ahmed <kamranahmed.se@gmail.com>
2022-02-09 20:17:24 +04:00
qrav
778d21558d Update 102-bcrypt.md (#1108)
* Update 102-bcrypt.md

* Update 102-bcrypt.md
2022-02-09 20:14:27 +04:00
Ivan Kalashnikov
d529ac3a12 HTML abbreviation – fixed typo. (#1109) 2022-02-09 20:13:52 +04:00
Archit Sharma
869716212f Added content in Standardjs (#1111)
* Added content in Standardjs

* Update content/roadmaps/100-frontend/content/110-build-tools/102-linters-formatters/102-standardjs.md

* Update content/roadmaps/100-frontend/content/110-build-tools/102-linters-formatters/102-standardjs.md

Co-authored-by: Kamran Ahmed <kamranahmed.se@gmail.com>
2022-02-09 20:13:35 +04:00
Rasyad Subandrio
aab8895998 Add design patterns information
* Update 100-gof-design-patterns.md

Add resources for design patterns.

* Update content/roadmaps/101-backend/content/114-design-and-development-principles/100-gof-design-patterns.md

* Update content/roadmaps/101-backend/content/114-design-and-development-principles/100-gof-design-patterns.md

Co-authored-by: Kamran Ahmed <kamranahmed.se@gmail.com>
2022-02-09 20:12:29 +04:00
Archit Sharma
5f302bf844 Added content for Carlo (#1120) 2022-02-09 20:02:22 +04:00
Paul Marsicovetere
b3db659a9c Update 100-cdn.md (#1123) 2022-02-09 20:01:25 +04:00
qrav
97f2583e0c Update 101-apache.md (#1124) 2022-02-09 20:01:04 +04:00
Paul Marsicovetere
e757f429dc Update 101-oauth.md (#1125) 2022-02-09 20:00:34 +04:00
Kamran Ahmed
258beade8d Add video for stack data structure 2022-02-08 18:17:42 +04:00
Josué Ayala
864c8fb57a Update 102-nuxt-js.md (#1113) 2022-02-06 18:19:05 +04:00
Archit Sharma
00f9a2f523 Added Resources for Less (#1116)
* Added Resources for Less

* Update content/roadmaps/100-frontend/content/109-css-preprocessors/102-less.md

* Update content/roadmaps/100-frontend/content/109-css-preprocessors/102-less.md

Co-authored-by: Kamran Ahmed <kamranahmed.se@gmail.com>
2022-02-06 18:17:42 +04:00
Kamran Ahmed
f32c61b690 Add new sponsors 2022-02-06 18:13:26 +04:00
Cecilia La Place
52a21ba9ac Repaired broken flexbox.io link in Backend Frontend Basics (CSS) (#1100)
* Repaired broken flexbox.io link

* Repaired broken link in CSS README
2022-02-04 10:14:26 +04:00
Kyle Thorpe
8d7911b35d Add content for Monolithic applications (#1102) 2022-02-04 10:14:08 +04:00
Kyle Thorpe
71d0218953 Add content for Microservices (#1103)
Add description and resources for Microservices pattern
2022-02-04 10:13:52 +04:00
Kyle Thorpe
dff393a20b Add content for Serverless (#1104)
Add description and resources for serverless
2022-02-04 10:13:37 +04:00
Archit Sharma
0e83a361e3 Resources added for Styled Components (#1105)
* Resources added for Styled Componenets

* Update content/roadmaps/100-frontend/content/112-modern-css/100-styled-components.md

Co-authored-by: Kamran Ahmed <kamranahmed.se@gmail.com>
2022-02-04 09:58:16 +04:00
Aroyan
6145be9d1b Add Jekyll content on Frontend roadmap (#1095)
* Add Bootstrap CSS content

* Add Bulma CSS content

* Add Prettier content

* Add Vite content

* Add GitHub content

* Add GitHub content

* Add GitHub content

* Add GitLab content at backend roadmap

* Add Git content on Backend roadmap

* Add HTTPS content on Backend roadmap

* Add Version Control System description

* Add Jekyll content on Frontend roadmap
2022-02-03 23:56:04 +04:00
marinerbob
8d25145db6 Update 117-progressive-web-apps topic (#1097) 2022-02-03 23:55:50 +04:00
marinerbob
ff212753f6 Update 102-css topic (#1096) 2022-02-03 23:55:42 +04:00
Archit Sharma
23bb1e18be Added resources for Styled jsx (#1098)
* Added resources for Styled jsx

* Update content/roadmaps/100-frontend/content/112-modern-css/102-styled-jsx.md

* Update content/roadmaps/100-frontend/content/112-modern-css/102-styled-jsx.md

Co-authored-by: Kamran Ahmed <kamranahmed.se@gmail.com>
2022-02-03 23:54:43 +04:00
Archit Sharma
ed991df832 Added Resources for Emotion css (#1094)
* Added Resources for Emotion css

* Update content/roadmaps/100-frontend/content/112-modern-css/103-emotion.md

Co-authored-by: Kamran Ahmed <kamranahmed.se@gmail.com>
2022-02-03 00:20:51 +04:00
marinerbob
26bc8c0e70 Update 102-responsive-design-and-media-queries.md (#1092) 2022-02-02 18:38:33 +04:00
Archit Sharma
0ce8e58f9f Added Resources for Material UI (#1093)
* Added Resources for Material UI

* Update content/roadmaps/100-frontend/content/114-css-frameworks/114-js-first/102-material-ui.md

Co-authored-by: Kamran Ahmed <kamranahmed.se@gmail.com>
2022-02-02 18:38:17 +04:00
Kodey Thomas
b65cf6a026 Updated HATEOAS (#1090)
* Updated HATEOAS

* Removed Colour Scheme
2022-02-02 15:38:58 +04:00
Archit Sharma
bc80ba4194 Added Resources for Radix UI (#1091)
* Added Resources for Radix UI

* Add Radix UI content

Co-authored-by: Kamran Ahmed <kamranahmed.se@gmail.com>
2022-02-02 15:38:25 +04:00
Uriell
7883875126 Added Resources for HTTP (#1088)
* Adding an extra resource on HTTP

I've recently read this 3-part series on HTTP, mostly focused on HTTP/3 and QUIC, but the first part covers basic concepts about HTTP and how it evolved to HTTP/3 (which is really HTTP/2-over-QUIC) and I find it might be a great reading resource on the topic.

I'm not recommending the 2nd and 3rd parts as they're linked through the 1st one and they diverge a little from the topic of HTTP (going into performance improvements and deployment of QUIC)

* Replicating new HTTP resource to back end roadmap
2022-02-01 10:48:55 +04:00
Archit Sharma
46d53b50eb Resources added for NativeScript framework (#1083) 2022-02-01 10:47:22 +04:00
Archit Sharma
6879b9827b Resources added for Web Assembly (#1084) 2022-02-01 10:47:09 +04:00
Kamran Ahmed
3b8144aafc Add linked list data structure video 2022-01-31 19:51:08 +04:00
Archit Sharma
82af3e2880 Resources added for static site generators (#1087)
* Resources added for static site generators

* Update readme.md

Co-authored-by: Kamran Ahmed <kamranahmed.se@gmail.com>
2022-01-31 13:36:10 +04:00
Archit Sharma
c791dbb70c Added Resources for Ionic Framework (#1081) 2022-01-30 00:26:49 +04:00
Leandro Morais Azevedo
24559a32ee Added Resources for Interprocess Communication (#1082)
* Added Resources for Interprocess Communication

* Update 106-interprocess-communication.md

Co-authored-by: Kamran Ahmed <kamranahmed.se@gmail.com>
2022-01-30 00:26:11 +04:00
Surya Vamsi
45a66feac9 Remove redundant link (#1077)
The link to the Official Relay Modern website is displayed thrice.
2022-01-29 16:48:23 +04:00
Tóth Bence
272d871d47 Fix badge text for ESLint 2022-01-29 13:24:31 +04:00
Anaxímeno Brito
7cb36ca7ff Update 101-rust.md (#1043)
Added content for the Rust programming language.
Contents: link to the official online book and the rust by example official web page.
2022-01-29 01:28:02 +04:00
Archit Sharma
d55b6927b8 Resources added for RxJS (#1044)
* Resources added for RxJS

* Update content/roadmaps/100-frontend/content/111-pick-a-framework/101-angular/100-rxjs.md

Co-authored-by: Kamran Ahmed <kamranahmed.se@gmail.com>
2022-01-29 01:27:27 +04:00
Archit Sharma
c054a3f56c Resources added for NgRx (#1045)
* Resources added for NgRx

* Update content/roadmaps/100-frontend/content/111-pick-a-framework/101-angular/101-ngrx.md

Co-authored-by: Kamran Ahmed <kamranahmed.se@gmail.com>
2022-01-29 01:25:55 +04:00
LJS
a3b7b45ef3 Update 107-eleventy.md (#1047)
* added resource

Not sure if badge text "read" is fitting. 11ty.rocks is more like a resource treasure chest for 11ty starters.
2022-01-29 01:25:19 +04:00
Nomar Gómez Cabreja
a41ee92931 Add content to Css modules (#1048)
* Add content to Css modules

Also I think you guys should change CSS Modules to Alternative Option as is not used much anymore.

* Update 101-css-modules.md

Co-authored-by: Kamran Ahmed <kamranahmed.se@gmail.com>
2022-01-29 01:24:45 +04:00
Archit Sharma
6db1e89628 Resources added for Flow (#1049) 2022-01-29 01:23:12 +04:00
Paul Marsicovetere
7c9159b5b4 Update 100-npm.md (#1052) 2022-01-29 01:22:56 +04:00
Paul Marsicovetere
c6d35aa63c Update readme.md (#1053) 2022-01-29 01:22:28 +04:00
Paul Marsicovetere
3dc11ae726 Update readme.md (#1054) 2022-01-29 01:22:05 +04:00
Paul Marsicovetere
85186c7fe6 Add HTML resource 2022-01-29 01:21:48 +04:00
Paul Marsicovetere
432c6d5ac3 Add CSS resource 2022-01-29 01:21:25 +04:00
Paul Marsicovetere
f876d2f604 Add Git resource 2022-01-29 01:20:59 +04:00
Madukoma Blessed
ba889de406 Add PostgreSQL resources
* Update 100-postgresql.md

* Update 100-postgresql.md

Co-authored-by: Kamran Ahmed <kamranahmed.se@gmail.com>
2022-01-29 01:20:19 +04:00
Tóth Bence
11e8cf4630 Add ESLint resources
* Update 101-eslint.md

* Update 101-eslint.md

Co-authored-by: Kamran Ahmed <kamranahmed.se@gmail.com>
2022-01-29 01:17:34 +04:00
Kamran Ahmed
ba211922b2 Delete slnx.sqlite 2022-01-29 01:14:06 +04:00
Kyle Zamora
50f078a884 Update 113-ci-cd.md (#1064)
* Update 113-ci-cd.md

* Update 113-ci-cd.md

Co-authored-by: Kamran Ahmed <kamranahmed.se@gmail.com>
2022-01-29 01:13:45 +04:00
Paul Marsicovetere
b8c8dfcab1 Update 100-go.md (#1066) 2022-01-29 01:10:07 +04:00
Paul Marsicovetere
a5093ef4e0 Add Ruby resources 2022-01-29 01:09:45 +04:00
Paul Marsicovetere
883c28cf39 Add MySQL Resources 2022-01-29 01:09:23 +04:00
Paul Marsicovetere
b26dbc2a62 Update 103-mssql.md (#1069) 2022-01-29 01:08:48 +04:00
qrav
bb0788e357 Update-100-md5.md (#1072)
* Update-100-md5.md

* Minor typo change

* Update content/roadmaps/101-backend/content/111-web-security-knowledge/100-md5.md

Co-authored-by: Kamran Ahmed <kamranahmed.se@gmail.com>
2022-01-28 14:41:40 +04:00
Paul Marsicovetere
684d3d9c4a Update readme.md (#1070) 2022-01-28 14:26:19 +04:00
qrav
1bdc3ebd14 Update 102-java.md (#1071) 2022-01-28 14:25:30 +04:00
Kamran Ahmed
52fa640dcf Update WorkOS logo background 2022-01-28 02:33:58 +04:00
Kamran Ahmed
2f0ee7f3ae Add WorkOS logo 2022-01-28 02:29:22 +04:00
Kamran Ahmed
178aa830f1 Add WorkOS Logo 2022-01-28 02:26:37 +04:00
Kamran Ahmed
0ca59ab032 Add workos logo 2022-01-28 02:22:31 +04:00
y8l
594ff9ab81 Add Relational Databases Content (#1034)
* Add Relational Databases Content

* Update readme.md

Co-authored-by: Kamran Ahmed <kamranahmed.se@gmail.com>
2022-01-22 21:28:33 +04:00
Archit Sharma
fd8ba60b02 Resources added for MobX (#1041) 2022-01-22 21:27:12 +04:00
Archit Sharma
ce4e5a21a0 Resources added for Recoil.js (#1042) 2022-01-22 21:26:35 +04:00
Kyle Thorpe
439d622e11 Add content for Docker (#1039)
Add a description and resources for Docker. However, Docker is a big topic and could probably use some more information.
2022-01-22 21:25:58 +04:00
Kyle Thorpe
ceffafd4ae Add content for Functional Testing (#1038)
Add a description and resources for Functional Testing
2022-01-22 21:25:14 +04:00
Kyle Thorpe
1b5900f5d7 Add content for Unit Testing (#1037)
Add a description and resources for Unit Testing
2022-01-22 21:24:52 +04:00
Kyle Thorpe
800263d195 Add content for Integration Testing (#1036)
Add a description and resources for Integration Testing
2022-01-22 21:24:11 +04:00
Kyle Thorpe
38bf960e0d Add content for Testing (#1035)
* Add content for Testing

Add a description and resources for testing

* Update readme.md

Co-authored-by: Kamran Ahmed <kamranahmed.se@gmail.com>
2022-01-22 21:23:41 +04:00
Vilmar Pavesi Junior
63ad44a90d Add resources for ACID compliance
* Update 101-acid.md

I add some content to ACID on backend roadmap

* Update 101-acid.md

Co-authored-by: Kamran Ahmed <kamranahmed.se@gmail.com>
2022-01-22 14:21:27 +04:00
Kamran Ahmed
f5f238d779 Add sponsor link — Thanks @kevin-bog 🙌 2022-01-22 13:39:30 +04:00
Archit Sharma
0b00f55238 Progressive Web Apps resources added (#1009) 2022-01-22 13:33:29 +04:00
Archit Sharma
622a6f76b0 React Native resources added (#1022)
* React Native resources added

* Update 100-react-native.md

Co-authored-by: Kamran Ahmed <kamranahmed.se@gmail.com>
2022-01-22 13:32:35 +04:00
Paul Marsicovetere
1adecfacde Add HTML resource
Add free course from Codecademy
2022-01-22 13:31:21 +04:00
Paul Marsicovetere
63f68c4b52 Update 101-css.md (#1025)
Adding codecademy CSS courses
2022-01-22 13:31:06 +04:00
Paul Marsicovetere
6064177f6f Add python resources
* Update 106-python.md

Python additions

* Update 106-python.md

Co-authored-by: Kamran Ahmed <kamranahmed.se@gmail.com>
2022-01-22 13:30:45 +04:00
Paul Marsicovetere
7bbb7979c5 Update 105-javascript.md (#1027)
Add codecademy course
2022-01-22 13:29:16 +04:00
Kyle Thorpe
f7738262ef Add content for Version Control Systems (#1028)
Add a description and resources for version control systems
2022-01-22 13:28:41 +04:00
Kyle Thorpe
2e28eebae1 Add content for Repo Hosting Services (#1029)
Add description and resources for repo hosting services
2022-01-22 13:28:06 +04:00
Kyle Thorpe
7b1d664261 Add content for Scaling (#1030)
* Add content for Scaling

- Add description and resources for vertical and horizontal scaling
- Fix typo

* Update 103-horizontal-vertial-scaling.md

Co-authored-by: Kamran Ahmed <kamranahmed.se@gmail.com>
2022-01-22 13:27:12 +04:00
Kyle Thorpe
729db8f40f Add content for Test Driven Development (#1031)
Add description and resources for TDD
2022-01-22 13:24:46 +04:00
Sachin Kotian
a0095a9b96 Update 100-elasticsearch.md (#1011)
* Update 100-elasticsearch.md

* Add elasticsearch details

Co-authored-by: Kamran Ahmed <kamranahmed.se@gmail.com>
2022-01-22 10:29:50 +04:00
Kyle Thorpe
d8b7986a6d Description and resources for SOLID (#1021)
Add a description and resources for the SOLID design principles
2022-01-21 18:08:18 +04:00
Archit Sharma
2eab2b77ac Resources added for NPM Scripts (#1012)
* Resources added for NPM Scripts

* Update 100-npm-scripts.md

Co-authored-by: Kamran Ahmed <kamranahmed.se@gmail.com>
2022-01-21 09:27:15 +04:00
Mark Rossetti
d03f91cb01 Add link to Roy Fielding's paper (#1017)
* Add link to Roy Fielding's paper

The backend diagram makes reference to Roy Fielding's dissertation. I thought it would be helpful to have a direct link to his paper for convenience.

* Update 100-rest.md

Co-authored-by: Kamran Ahmed <kamranahmed.se@gmail.com>
2022-01-21 09:24:15 +04:00
Kyle Thorpe
fbb252baf3 KISS description and resources (#1018)
Add description and resources for KISS software development/design principle
2022-01-21 09:21:39 +04:00
Kyle Thorpe
1678bb8910 YAGNI description and resources (#1019)
* YAGNI description and resources

Add description and resources for YAGNI software development/design principle

* Update 105-yagni.md

Co-authored-by: Kamran Ahmed <kamranahmed.se@gmail.com>
2022-01-21 09:21:15 +04:00
Kyle Thorpe
cdbfa8ae9a DRY description and resources (#1020)
* DRY description and resources

Add a description and resources for DRY software development/design principle

* Minor space change

Co-authored-by: Kamran Ahmed <kamranahmed.se@gmail.com>
2022-01-21 09:20:16 +04:00
tigor7
7b1f8c32af Fixed 'dns and how it works' button/node (#1014) 2022-01-19 10:25:48 +04:00
Kamran Ahmed
8899bab70d Add getform logo 2022-01-18 13:32:46 +04:00
Kamran Ahmed
d892107e6e Add getform logo 2022-01-18 13:29:52 +04:00
Amjith OS
b8247b6d77 added content in JavaScript (learn a language) in backend roadmap (#1006)
* added content in JavaScript (learn a language) in backend roadmap

* Update node.js resources

Co-authored-by: Amjith <amjithomy@gmail.com>
Co-authored-by: Kamran Ahmed <kamranahmed.se@gmail.com>
2022-01-17 14:53:39 +04:00
Archit Sharma
a912acd6d7 Added Resources for Vue.js (#1008)
* Added Resources for Vue.js

* Update content/roadmaps/100-frontend/content/111-pick-a-framework/102-vue-js/readme.md

* Update content/roadmaps/100-frontend/content/111-pick-a-framework/102-vue-js/readme.md

Co-authored-by: Kamran Ahmed <kamranahmed.se@gmail.com>
2022-01-17 14:48:05 +04:00
Archit Sharma
084a4d3569 Apollo Description and Content added (#999)
* Apollo Description and Content added

* Update content/roadmaps/100-frontend/content/119-graphql/100-apollo.md

Co-authored-by: Kamran Ahmed <kamranahmed.se@gmail.com>
2022-01-15 21:11:21 +04:00
Truncgil Technology
2f23c69323 Add PHP resources
* Update 103-php.md

* Update content/roadmaps/101-backend/content/103-learn-a-language/103-php.md

Co-authored-by: Kamran Ahmed <kamranahmed.se@gmail.com>
2022-01-15 21:05:36 +04:00
Archit Sharma
be22e8dc6b Added Description and Resources for Relay Modern (#1000)
* Added Description and Resources for Relay Modern

* Update content/roadmaps/100-frontend/content/119-graphql/101-relay-modern.md

* Update content/roadmaps/100-frontend/content/119-graphql/101-relay-modern.md

* Update content/roadmaps/100-frontend/content/119-graphql/101-relay-modern.md

* Update content/roadmaps/100-frontend/content/119-graphql/101-relay-modern.md

* Update content/roadmaps/100-frontend/content/119-graphql/101-relay-modern.md

Co-authored-by: Kamran Ahmed <kamranahmed.se@gmail.com>
2022-01-15 20:55:48 +04:00
LJS
02a0b864a5 Update 107-eleventy.md (#1004)
* Update 107-eleventy.md

* added summary

* added resource

* Update content/roadmaps/100-frontend/content/120-static-site-generators/107-eleventy.md

Co-authored-by: Kamran Ahmed <kamranahmed.se@gmail.com>
2022-01-15 20:50:15 +04:00
LJS
894eda60ad Update 104-accessibility.md (#1002)
* Update 104-accessibility.md

What I did: added new resource item
Why I chose it: Helped me several times to find a) a starting point on how to build an accessible web experience regarding a specific component and b) provides usually links with in-depth examples

* Update content/roadmaps/100-frontend/content/101-html/104-accessibility.md

Co-authored-by: Kamran Ahmed <kamranahmed.se@gmail.com>
2022-01-15 12:27:48 +04:00
Anshul Yadav
48d8086884 🎯Added a resource - (YouTube Video) (#1001)
✌️Added a youtube video as a watchable resource I found very useful and enough. I think knowing that much about how the browsers work is enough for the Front-end journey. The video covered all the important topics from User-Interface to Rendering Engine.
2022-01-15 12:25:48 +04:00
Archit Sharma
efad09de7f GraphQL free Course for Beginners added (#997) 2022-01-14 20:06:09 +04:00
Santiago Bioletto
28e92ac515 Add Os and General KnowKnowledge content at backend roadmap (#998)
* Add Os and General KnowKnowledge content at backend roadmap

* Update content/roadmaps/101-backend/content/102-os-general-knowledge/readme.md

Co-authored-by: Kamran Ahmed <kamranahmed.se@gmail.com>
2022-01-14 20:05:52 +04:00
Kamran Ahmed
a4d5c7c353 Add PostCSS content 2022-01-13 19:47:38 +04:00
Ragul
c2737d8a42 Update 106-cors.md (#995)
* Update 106-cors.md

* Update description

* Add resources for CORS

* Update content/roadmaps/101-backend/content/111-web-security-knowledge/106-cors.md

Co-authored-by: Kamran Ahmed <kamranahmed.se@gmail.com>
2022-01-13 17:40:47 +04:00
Aroyan
f7dd8e71fd Add HTTPS content on Backend roadmap (#996)
* Add Bootstrap CSS content

* Add Bulma CSS content

* Add Prettier content

* Add Vite content

* Add GitHub content

* Add GitHub content

* Add GitHub content

* Add GitLab content at backend roadmap

* Add Git content on Backend roadmap

* Add HTTPS content on Backend roadmap
2022-01-13 17:33:42 +04:00
Vijeth
791c402878 Added a new course (#994) 2022-01-12 17:37:18 +04:00
Karan Shah
8ed9d0c106 Update 100-go.md (#993)
- added a one liner explaining what Go does
- added the Go resources listed on the go.dev website
2022-01-12 10:18:00 +04:00
Aroyan
542b0ce117 Add Git content on Backend roadmap (#992)
* Add Bootstrap CSS content

* Add Bulma CSS content

* Add Prettier content

* Add Vite content

* Add GitHub content

* Add GitHub content

* Add GitHub content

* Add GitLab content at backend roadmap

* Add Git content on Backend roadmap
2022-01-11 22:26:57 +04:00
Aroyan
cacddd10f2 Add GitLab content on backend roadmap (#991)
* Add Bootstrap CSS content

* Add Bulma CSS content

* Add Prettier content

* Add Vite content

* Add GitHub content

* Add GitHub content

* Add GitHub content

* Add GitLab content at backend roadmap
2022-01-11 15:20:20 +04:00
Md. Jamal Uddin
350d160eb7 Chakra UI resources (#989)
* add react.js resources

* add css resources

* add graphql resources

* add redux resources

* add typescript resources

* add next.js resources

* add chakra-ui resources

* Remove duplicate links

Co-authored-by: Kamran Ahmed <kamranahmed.se@gmail.com>
2022-01-11 11:25:01 +04:00
Chris
f22b73bb7a Add official Jest website (#990) 2022-01-11 11:24:00 +04:00
Emmanuel Allison
874437586e Add content for C#
* Update 103-csharp.md

* Fix broken link for resource

Co-authored-by: Kamran Ahmed <kamranahmed.se@gmail.com>
2022-01-10 10:15:01 +04:00
Aroyan
40ab1f6c77 Add GitHub content (#987)
* Add Bootstrap CSS content

* Add Bulma CSS content

* Add Prettier content

* Add Vite content

* Add GitHub content

* Add GitHub content

* Add GitHub content
2022-01-10 10:13:33 +04:00
Kamran Ahmed
5dce3dd7ab Add links to resources 2022-01-09 13:54:12 +04:00
Kamran Ahmed
13f018893a Add array data structure video 2022-01-09 12:04:54 +04:00
Kamran Ahmed
0400b1d6c0 Add interactivity for the backend roadmap 2022-01-09 11:29:22 +04:00
Aroyan
a0cb4e2568 Add Vite content (#984)
* Add Bootstrap CSS content

* Add Bulma CSS content

* Add Prettier content

* Add Vite content
2022-01-08 11:23:14 +04:00
Aroyan
157dde2bfb Add Prettier content (#982)
* Add Bootstrap CSS content

* Add Bulma CSS content

* Add Prettier content
2022-01-07 10:21:58 +04:00
Aroyan
07ad7bb476 Add Bulma CSS content (#981)
* Add Bootstrap CSS content

* Add Bulma CSS content
2022-01-06 09:47:44 +04:00
Kamran Ahmed
f721af1251 Update dependencies 2022-01-05 19:29:32 +04:00
Aroyan
42ed79e117 Add Bootstrap CSS content (#979) 2022-01-05 19:28:30 +04:00
Justin Irabor
07916250f5 Suggest content to 'Testing your apps' component (#980) 2022-01-05 19:26:30 +04:00
Yankang LI
a7dd2df70e bug fix: added testing files (#978)
Co-authored-by: Loetsli <loetsli@MacBook-Pro-von-Loetsli.local>
2022-01-02 15:38:41 +04:00
Kamran Ahmed
22e0758c6e Update sponsors 2022-01-01 18:53:58 +04:00
Kamran Ahmed
b27a3abc10 Add typescript and next.js resources 2022-01-01 18:38:13 +04:00
Md. Jamal Uddin
b0e5530f24 Add Next.js Resources (#974)
* add react.js resources

* add css resources

* add graphql resources

* add redux resources

* add typescript resources

* add next.js resources
2022-01-01 18:35:24 +04:00
Kamran Ahmed
8da5180062 Update year 2022 2022-01-01 18:34:03 +04:00
Vineet Likhitkar
d82a96b693 Add CSS Preprocessor Resources (#975) 2022-01-01 18:29:32 +04:00
Kamran Ahmed
1277089793 Update typescript resources 2021-12-26 19:11:59 +04:00
Md. Jamal Uddin
623d9398f2 Add TypeScript resources (#973)
* add react.js resources

* add css resources

* add graphql resources

* add redux resources

* add typescript resources
2021-12-26 19:08:44 +04:00
Md. Jamal Uddin
09f92bf601 Redux resources (#956)
* add react.js resources

* add css resources

* add graphql resources

* add redux resources
2021-12-26 14:05:52 +04:00
Kamran Ahmed
3ae18b3d30 Add vuex resources 2021-12-26 14:05:34 +04:00
Hassan TAJIRI
c498adc530 Update 100-vuex.md (#963)
Vuex quick description
2021-12-26 14:03:13 +04:00
Kamran Ahmed
399c548570 Add typescript resources 2021-12-26 13:54:53 +04:00
sehajanand
acfca9f169 Update 100-typescript.md (#957) 2021-12-26 13:48:05 +04:00
Jody Zhou
0312a89d8c Updated the Electron section (#965)
* Updated the Electron section

Updated the Electron section in the front end road map

* Update 100-electron.md

Co-authored-by: Kamran Ahmed <kamranahmed.se@gmail.com>
2021-12-22 00:10:02 +04:00
Eihab Khan
5e441f647b Added [course] Flexbox learning resource 2021-12-22 00:09:20 +04:00
Kamran Ahmed
8be9eb6101 Add translations link 2021-12-21 14:42:02 +04:00
Kamran Ahmed
0c799cb43b Update sponsors information 2021-12-20 14:31:18 +04:00
Kamran Ahmed
6fd69d71e0 Add doppler logo 2021-12-18 12:12:48 +04:00
Kamran Ahmed
0bb93aeef0 Add data structures video link 2021-12-12 22:17:39 +01:00
Felipe Sousa
fb55ccc5cf Add content to "Webpack" 2021-12-12 20:20:42 +01:00
Kamran Ahmed
8054ac8d0e Add JS course link 2021-12-11 20:04:10 +01:00
Kamran Ahmed
6846ed12f2 Add CSS architecture resources 2021-12-11 03:05:08 +01:00
Kamran Ahmed
684b9667a4 Fix broken license link 2021-12-11 02:54:16 +01:00
Kamran Ahmed
a35c7ffaf0 Add package managers content 2021-12-11 02:49:22 +01:00
Kamran Ahmed
8127fbb4ee Add security content for cors and owasp 2021-12-11 02:25:41 +01:00
Kamran Ahmed
7afa06fc95 Add web security resources 2021-12-11 02:17:47 +01:00
Kamran Ahmed
8991d2c934 Add keywords for roadmapsg 2021-12-11 01:39:36 +01:00
Kamran Ahmed
39542ffa37 Add resources for git and version control systems 2021-12-11 01:26:31 +01:00
Kamran Ahmed
6e05d1c992 Add JavaScript concepts resources 2021-12-11 01:02:26 +01:00
Kamran Ahmed
12fc4e671e Add Modern JavaScript resources 2021-12-11 00:24:55 +01:00
Kamran Ahmed
3f7d706f04 Add Fetch API resources 2021-12-11 00:19:14 +01:00
Kamran Ahmed
712d65d0e6 Add DOM and JavaScript resources 2021-12-10 23:31:26 +01:00
Kamran Ahmed
5f44649f5e Add sass links 2021-12-10 23:06:12 +01:00
sehajanand
873be4ad85 Update 100-sass.md (#955)
* Update 100-sass.md

* Update title for link

Co-authored-by: Kamran Ahmed <kamranahmed.se@gmail.com>
2021-12-10 23:00:56 +01:00
sehajanand
8df92be9bc Update 104-accessibility.md (#953)
* Update 104-accessibility.md

* Append the resource

* Update badge text

Co-authored-by: Kamran Ahmed <kamranahmed.se@gmail.com>
2021-12-10 22:56:16 +01:00
Kamran Ahmed
38a83316b1 Add responsive web design content 2021-12-10 19:45:36 +01:00
Kamran Ahmed
02826f10d3 Add SEO content 2021-12-10 19:38:20 +01:00
Kamran Ahmed
aa7413ce7a Add pinterest domain verification 2021-12-10 19:14:08 +01:00
Kamran Ahmed
fb8f14a0db Add support for rich snippets 2021-12-10 15:15:13 +01:00
Kamran Ahmed
220efadfaa Add rel=nofollow for resource links 2021-12-10 14:39:47 +01:00
Kamran Ahmed
77a9c31c6b Fix bad CLS score for frontend roadmapg 2021-12-10 14:21:51 +01:00
Kamran Ahmed
fb5a7fb09f Add making layouts and html best practices links 2021-12-10 14:02:17 +01:00
Kamran Ahmed
6eb10b4cfd Update accessibility resources 2021-12-10 13:54:26 +01:00
Samarth Gupta
de2b672760 Added Accessibility content (#949) 2021-12-10 13:52:33 +01:00
Md. Jamal Uddin
fe716af733 add graphql resources (#950)
* add react.js resources

* add css resources

* add graphql resources
2021-12-10 13:51:25 +01:00
Kamran Ahmed
fdacc02dcf Add forms and validations resources 2021-12-10 13:50:14 +01:00
Johan Melin
867e3f2a8c Update 102-forms-and-validations.md
Added information and link.
2021-12-10 13:33:32 +01:00
Kamran Ahmed
6e451ef5cf Add JavaScript and VCS content and fix rendering issue 2021-12-10 00:52:40 +01:00
Kamran Ahmed
56816d15f8 Add OOCSS content 2021-12-10 00:28:53 +01:00
Kamran Ahmed
15669982d9 Update resource styling for BEM 2021-12-10 00:24:50 +01:00
Kamran Ahmed
88c6b47d01 Update dependencies 2021-12-10 00:21:50 +01:00
Lucas Vargas
ed84e905ed Update 100-bem.md
Add info and resources of BEM
2021-12-10 00:21:28 +01:00
Kamran Ahmed
3d0153b2fe Fix invalid marking of done nodes 2021-12-09 23:13:37 +01:00
Kamran Ahmed
a174590424 Add semantic HTML section 2021-12-09 23:07:54 +01:00
Kamran Ahmed
a155832f69 Add flutter courses 2021-12-09 22:56:25 +01:00
Lucas Vargas
75eb3a0237 Update 102-flutter.md
Add links with more information about Flutter and tutorials
2021-12-09 22:56:25 +01:00
Kamran Ahmed
a1576fd348 Fix multiple group marking as done 2021-12-09 22:42:44 +01:00
Kamran Ahmed
8a296d99c4 Add CSS resources 2021-12-09 22:38:04 +01:00
Kamran Ahmed
10f9043516 Add CSS resources 2021-12-09 22:37:27 +01:00
Kamran Ahmed
37155e7d3c Add CSS resources 2021-12-09 22:32:53 +01:00
Kamran Ahmed
ff7d24d725 Update style of resources 2021-12-09 22:32:53 +01:00
Eihab Khan
7794386573 Added CSS Flexbox learning resource 2021-12-09 22:32:53 +01:00
Md. Jamal Uddin
952884ec99 add CSS resources (#946)
* add react.js resources

* add css resources
2021-12-09 22:32:31 +01:00
Kamran Ahmed
22fa464cca Add CSS resources 2021-12-09 20:54:06 +01:00
Kamran Ahmed
66f939f361 Update style of resources 2021-12-09 20:54:06 +01:00
Kamran Ahmed
25b6700812 Bump roadmap in GitHub ranking 2021-12-09 20:54:06 +01:00
Kamran Ahmed
7c53be8892 Change finished node marking 2021-12-09 20:54:06 +01:00
Kamran Ahmed
be61c144e0 Change finished node marking 2021-12-09 20:54:06 +01:00
Kamran Ahmed
537ffc365e Marking progress on roadmap 2021-12-09 20:54:06 +01:00
Kamran Ahmed
dd7306cd6d Make edit page less attention grabbing 2021-12-09 20:54:06 +01:00
Kamran Ahmed
ed1c8e3709 Update banner colors 2021-12-09 20:54:06 +01:00
Eihab Khan
36e2e95ab9 Added CSS Flexbox learning resource 2021-12-09 18:48:45 +01:00
Kamran Ahmed
7309e9640c Fix link on the frontend roadmap 2021-12-09 18:48:45 +01:00
Kamran Ahmed
be17f594fe Bump roadmap in GitHub ranking 2021-12-09 18:17:02 +01:00
Kamran Ahmed
06329b27c1 Change finished node marking 2021-12-09 18:09:32 +01:00
Kamran Ahmed
0e05128980 Change finished node marking 2021-12-09 18:05:01 +01:00
Kamran Ahmed
9a22a457f5 Marking progress on roadmap 2021-12-09 16:39:09 +01:00
Kamran Ahmed
985da9ae30 Make edit page less attention grabbing 2021-12-09 13:30:55 +01:00
Kamran Ahmed
47e2a9b968 Update banner colors 2021-12-09 13:25:01 +01:00
Kamran Ahmed
074adee8f0 Fix link on the frontend roadmap 2021-12-08 20:05:32 +01:00
Kamran Ahmed
9f68c096a9 Add github resources 2021-12-08 19:52:14 +01:00
Kamran Ahmed
e4654022f0 Fix positioning for frontend roadmaps 2021-12-08 19:40:34 +01:00
Kamran Ahmed
c4291394fe Add react resources 2021-12-08 19:40:34 +01:00
Kamran Ahmed
9b29d240e3 Add tailwind CSS content 2021-12-08 19:40:34 +01:00
Alen Abraham
d09c91247e feat: added github learning resources 2021-12-08 19:40:24 +01:00
Md. Jamal Uddin
51895be81e add react.js resources 2021-12-08 19:27:52 +01:00
Ahmad Moghazi
a79b65a1b4 Add interactive content for tailwind-css 2021-12-08 19:12:00 +01:00
Kamran Ahmed
3fe41d2071 Change hover interactions for mobile 2021-12-08 19:10:44 +01:00
Kamran Ahmed
b25111415f Change homepage roadmap items interaction 2021-12-08 18:59:56 +01:00
Kamran Ahmed
0c3ea386f5 Update sponsors 2021-12-08 18:55:09 +01:00
Kamran Ahmed
d1f6951da2 Fix roadmap responsivness 2021-12-08 16:22:21 +01:00
Kamran Ahmed
7ac1dd9b9c Add interactive frontend roadmap version 2021-12-08 14:59:16 +01:00
Kamran Ahmed
ba21172d20 Add interactive frontend roadmap version 2021-12-08 14:47:05 +01:00
Kamran Ahmed
93b538f4e1 Add interactive frontend roadmap version 2021-12-08 14:27:39 +01:00
Kamran Ahmed
7cac02f4b4 Update resources 2021-12-08 14:06:56 +01:00
Kamran Ahmed
42e98e9cc6 Add interactive button 2021-12-08 14:00:12 +01:00
Kamran Ahmed
0221964362 Add interactive button 2021-12-08 13:48:08 +01:00
Ryan Williams
cbf0b2c496 Fix DBA Link that 404s 2021-12-07 23:35:17 +01:00
Kamran Ahmed
1ff9c11361 Refactor and add json url 2021-12-07 14:13:13 +01:00
Kamran Ahmed
b681aaa52e Refactor and add json url 2021-12-07 14:12:40 +01:00
Kamran Ahmed
8a99ecbecd Refactor and add json url 2021-12-07 14:05:13 +01:00
Kamran Ahmed
82456021ad Refactor roadmap header 2021-12-07 13:10:17 +01:00
Kamran Ahmed
6eba4a2afd Add resources for internet and http 2021-12-06 22:55:09 +01:00
Kamran Ahmed
c3704107a3 Add interactive roadmap error handling and loading 2021-12-06 22:18:57 +01:00
Kamran Ahmed
102cd8885c Add interactive roadmap error handling and loading 2021-12-06 22:18:19 +01:00
Kamran Ahmed
8259a83921 Add loader screen 2021-12-06 21:54:14 +01:00
Kamran Ahmed
c1ecf9d8a5 Add doppler logo 2021-12-06 15:24:43 +01:00
Kamran Ahmed
381801120e Add doppler logo 2021-12-06 14:46:27 +01:00
Kamran Ahmed
fe458e0790 Unbind window listeners on content drawer 2021-12-05 02:46:27 +01:00
Kamran Ahmed
a42e92781a Styling for badge links 2021-12-05 02:38:42 +01:00
Kamran Ahmed
8255f69257 Fix broken build 2021-12-05 02:04:20 +01:00
Kamran Ahmed
30e6c15ddb Add resource group 2021-12-05 02:03:07 +01:00
Kamran Ahmed
3eb13043ce Interactive frontend roadmap with contribution links 2021-12-05 01:50:05 +01:00
Kamran Ahmed
16b2019d06 Fix drawer size 2021-12-05 00:44:17 +01:00
Kamran Ahmed
a0a5e74281 Fix pinch zoom not working on resources 2021-12-04 20:27:35 +01:00
Kamran Ahmed
5881c27526 Fetch roadmap json for interactive version 2021-12-04 20:11:24 +01:00
Kamran Ahmed
c16bed02ca Fix drawer width 2021-12-04 19:53:52 +01:00
Muhammad Asad Jivani
37432582c0 fix: link to golang road map. 2021-12-04 16:05:24 +01:00
Kamran Ahmed
0d71b2b1e6 Add drawer for interactive roadmap 2021-12-04 16:04:31 +01:00
Kamran Ahmed
ff3d0489cc Group page and content loading 2021-12-04 14:04:44 +01:00
Kamran Ahmed
a94af0ec14 Add group name to content dirs 2021-12-04 14:04:23 +01:00
Kamran Ahmed
4f1d4feff6 Add breadcrump on roadmap page 2021-12-04 13:11:20 +01:00
Kamran Ahmed
7bc3b4a0f3 Fix group page 2021-12-04 12:43:29 +01:00
Kamran Ahmed
9d9a6506cc Update roadmap 2021-12-04 12:41:57 +01:00
Kamran Ahmed
3b47cd3542 Add group age 2021-12-04 12:21:06 +01:00
Kamran Ahmed
f500d49275 Refactor roadmap page logic 2021-12-03 20:44:49 +01:00
Kamran Ahmed
098303b78b Refactor roadmap page logic 2021-12-03 19:58:25 +01:00
Kamran Ahmed
bf56db60bc Add logic for content file path generation 2021-12-03 15:01:23 +01:00
Kamran Ahmed
cdc362625a Add logic for content file path generation 2021-12-03 14:36:31 +01:00
Kamran Ahmed
2ec335edc8 Rename content path to landing path 2021-12-03 14:16:41 +01:00
Kamran Ahmed
064f97108e Update repository link 2021-12-02 18:20:48 +01:00
Kamran Ahmed
7d0bc2e8a2 Add website link 2021-12-02 18:10:50 +01:00
Kamran Ahmed
ea4de11e30 Update sponsors section 2021-12-02 17:53:30 +01:00
Kamran Ahmed
4e7d8512cc Update readme 2021-12-02 17:52:13 +01:00
Kamran Ahmed
91ef32722a Update deployment workflow 2021-12-02 17:47:15 +01:00
Kamran Ahmed
87fba80759 Trigger build 2021-12-02 17:46:27 +01:00
Kamran Ahmed
0acd1d1fcd Trigger build 2021-12-02 17:42:17 +01:00
Kamran Ahmed
5228fe936f Update badges 2021-12-02 17:37:39 +01:00
Kamran Ahmed
b221016269 Remove twitter link 2021-12-02 17:36:46 +01:00
Kamran Ahmed
f7d1d61528 Add license and code of conduct 2021-12-02 17:32:51 +01:00
Kamran Ahmed
1467865e45 Update readme 2021-12-02 17:27:00 +01:00
Kamran Ahmed
17e2ffd110 Update readme 2021-12-02 17:24:31 +01:00
Kamran Ahmed
d177a13aa6 Update readme 2021-12-02 17:22:01 +01:00
Kamran Ahmed
1afe684699 Add roadmap path generation 2021-12-02 16:57:13 +01:00
Kamran Ahmed
1fbdf68573 Add interactive roadmap setup 2021-12-01 22:53:40 +01:00
Kamran Ahmed
3feea57204 Add eventual consistency video 2021-11-30 23:52:03 +01:00
Kamran Ahmed
00d8877a12 Add sponsors 2021-11-30 23:47:49 +01:00
Kamran Ahmed
67c4407d30 Add docs for roadmap content 2021-11-27 21:05:03 +01:00
Kamran Ahmed
69679addc3 Add roadmap content skeleton generation command 2021-11-27 20:44:24 +01:00
Kamran Ahmed
272eafa013 Add roadmap content skeleton generation command 2021-11-27 20:10:26 +01:00
Kamran Ahmed
a19b4da20d Add content dir setup command 2021-11-27 19:12:37 +01:00
Kamran Ahmed
47349f00c2 Update video titles 2021-11-27 15:17:36 +01:00
Kamran Ahmed
dbedae78ca Fix broken hover state on mobile 2021-11-27 12:46:24 +01:00
Kamran Ahmed
5733476fd9 Update frontend roadmap files 2021-11-27 02:13:16 +01:00
Kamran Ahmed
5c17deddf5 Add SSH, TLS, SSL video 2021-11-25 21:35:36 +01:00
Kamran Ahmed
f1b5357358 Update sticky banner color 2021-11-22 17:34:42 +01:00
Kamran Ahmed
6a319fe6cc Update roadmap block color 2021-11-22 17:30:10 +01:00
Kamran Ahmed
269e9eb90b Upcoming roadmaps design 2021-11-22 16:53:12 +01:00
Kamran Ahmed
844a38e739 Redesign homepage 2021-11-22 16:49:32 +01:00
Kamran Ahmed
6c8b899a35 Add grouping to frontend roadmap 2021-11-19 18:25:23 +01:00
Kamran Ahmed
f246b065a1 Update dependencies 2021-11-19 14:01:14 +01:00
Kamran Ahmed
97826210fa Add sponsors 2021-11-15 14:25:04 +01:00
Kamran Ahmed
ff5706c82f Add video links 2021-11-15 14:05:00 +01:00
Kamran Ahmed
609cce403a Update sitemap 2021-11-05 21:36:16 +01:00
Kamran Ahmed
87ad491b2c Fix spelling mistakes 2021-11-03 20:30:27 +01:00
Kamran Ahmed
ef25a14af1 Upgrade dependencies 2021-10-28 23:51:16 +02:00
Kamran Ahmed
3ac1de7fb0 Rearrange sections on homepage 2021-10-27 00:34:56 +02:00
Kamran Ahmed
09e8796159 Add big-o notation video 2021-10-27 00:32:15 +02:00
Kamran Ahmed
0d3c3eea11 Add java developer roadmap title 2021-10-24 12:30:43 +02:00
Kamran Ahmed
992b6990a3 Add pdf URL 2021-10-23 01:31:02 +02:00
Kamran Ahmed
ffa18538ff Add pdf URL 2021-10-23 01:30:45 +02:00
Kamran Ahmed
65307e7cc1 Add yaml video link 2021-10-23 01:26:32 +02:00
Kamran Ahmed
46d9fd66f3 Add java developer roadmap 2021-10-23 01:24:15 +02:00
Kamran Ahmed
2344e6c4c3 Add sponsor link 2021-10-10 20:02:14 +02:00
Kamran Ahmed
8899b0d196 Add video for floating point math 2021-10-10 16:01:42 +02:00
Kamran Ahmed
d4613330f4 Update sponsors list 2021-10-09 18:38:58 +02:00
Kamran Ahmed
283632713a Add sponsor link 2021-10-09 18:33:36 +02:00
Kamran Ahmed
d3b96d20cc Enable carbon ads 2021-10-09 18:31:55 +02:00
Kamran Ahmed
374e8a04fd Add cap theorem video 2021-10-05 08:05:24 +02:00
Kamran Ahmed
f1b6d13928 Add youtube header on roadmap pages 2021-10-05 07:55:44 +02:00
Kamran Ahmed
6a4af77ba8 Compress roadmaps images 2021-10-01 11:19:38 +02:00
Kamran Ahmed
a2db93873b Redirect youtube videos to youtuube 2021-10-01 10:59:46 +02:00
Kamran Ahmed
f523b077a4 Update go roadmap title 2021-09-30 23:22:21 +02:00
Kamran Ahmed
412eaa004e Add golang pdf download 2021-09-30 23:20:34 +02:00
Kamran Ahmed
8e71b3c448 Add go developer roadmap 2021-09-30 23:10:41 +02:00
Kamran Ahmed
12030deeea Add sponsor info 2021-09-29 17:47:37 +02:00
Kamran Ahmed
5a89ecf2d8 Add angular developer roadmap 2021-09-29 17:36:57 +02:00
Kamran Ahmed
991d344a77 Add python roadmap pdf 2021-09-29 14:51:58 +02:00
Kamran Ahmed
cc06819a50 Update python roadmap 2021-09-27 20:34:46 +02:00
Kamran Ahmed
eb1beecfa7 Add python roadmap 2021-09-27 11:32:20 +02:00
Kamran Ahmed
135ef6a11a Fix date for proxy-servers guideg 2021-09-27 10:52:29 +02:00
Kamran Ahmed
e902c062fc Fix z-index issue on the ad 2021-09-26 22:04:14 +02:00
Kamran Ahmed
685c402f28 Add python roadmap 2021-09-26 22:02:59 +02:00
Kamran Ahmed
c88e04f809 Update project files 2021-09-26 20:47:26 +02:00
Kamran Ahmed
d2167555da Move content/project to public 2021-09-26 20:36:57 +02:00
Kamran Ahmed
3f61854ccc Add acid video 2021-09-26 17:09:58 +02:00
Kamran Ahmed
9ca201709d Add react-query to API calls in react roadmap 2021-09-26 16:48:07 +02:00
Kamran Ahmed
0c3486df37 Remove tweet links from guides 2021-09-26 09:47:47 +02:00
Kamran Ahmed
27d3704390 Remove sysadmin roadmap 2021-09-25 23:04:31 +02:00
Kamran Ahmed
86bd47c45d Fix styling for nested lists 2021-09-24 10:34:51 +02:00
Kamran Ahmed
b8c2056557 Fix styling for nested lists 2021-09-24 10:33:46 +02:00
Kamran Ahmed
c190a94bc6 Fix styling for nested lists 2021-09-24 10:33:05 +02:00
Kamran Ahmed
eafbcd5867 Disable ugly focus 2021-09-22 20:42:51 +02:00
Kamran Ahmed
170b14df4c Sticky banner update 2021-09-22 20:39:54 +02:00
Kamran Ahmed
694315026e Add studio3t sponsor 2021-09-22 14:56:16 +02:00
Kamran Ahmed
a9183dacc7 Add sysadmin roadmap 2021-09-22 14:50:03 +02:00
Kamran Ahmed
d46b543659 Add park.io sponsor 2021-09-18 12:03:03 +02:00
Kamran Ahmed
9a63e576c7 Add click tracking on YouTube banner 2021-09-14 20:34:24 +02:00
Kamran Ahmed
69ef7615fe Add guide for render blocking JavaScript 2021-09-13 13:12:27 +02:00
Kamran Ahmed
68950ab2c9 Add helmet to thanks page 2021-09-09 22:57:34 +02:00
Kamran Ahmed
305d0a41ac Add thanks page 2021-09-09 22:41:57 +02:00
Kamran Ahmed
e43c21a01d Fix responsiveness issues 2021-09-09 22:32:12 +02:00
Kamran Ahmed
b6205af02c Change youtube banner color 2021-09-09 22:09:20 +02:00
Kamran Ahmed
6de2867d8a Disable carbon ads 2021-09-09 22:00:43 +02:00
Kamran Ahmed
13612323d7 Disable carbon ads 2021-09-09 21:55:53 +02:00
Kamran Ahmed
edd10470a7 Right align the carbon ad 2021-09-09 21:50:02 +02:00
Kamran Ahmed
d5b8d761d5 Update sponsor ads and carbon ad styling 2021-09-09 21:48:31 +02:00
Kamran Ahmed
9f7119694b Revert custom ad changes 2021-09-09 21:36:06 +02:00
Kamran Ahmed
8fbde17c22 Add carbon ads 2021-09-09 21:13:20 +02:00
Kamran Ahmed
e16947bd78 Enable custom ad 2021-09-09 16:38:30 +02:00
Kamran Ahmed
33af054161 Enable carbon ads 2021-09-08 23:33:08 +02:00
Kamran Ahmed
8913d5c5e4 Add youtube logo 2021-09-07 17:41:06 +02:00
Kamran Ahmed
0040d568b1 Add sponsor 2021-09-06 14:28:39 +02:00
Kamran Ahmed
706070e42a Add resources page 2021-09-05 22:52:18 +02:00
Kamran Ahmed
f79fb62ff9 Add sli, slo and sla guide 2021-09-05 22:38:37 +02:00
Kamran Ahmed
5c428540dc Add web vitals png 2021-09-05 22:24:38 +02:00
Kamran Ahmed
35ae0a74b3 Add keywords to frontend roadmap 2021-09-05 22:19:09 +02:00
Kamran Ahmed
a1606521d4 Fix missing title and description on video page 2021-09-05 22:13:49 +02:00
Kamran Ahmed
6545c8de36 Add youtube link to video page 2021-09-05 22:09:22 +02:00
Kamran Ahmed
0f713cbfd8 Add sticky banner for youtube 2021-09-05 21:58:44 +02:00
Kamran Ahmed
333894b75b Fix style for sponsor button 2021-09-05 21:19:51 +02:00
Kamran Ahmed
c73a500ffd Add back to roadmaps button 2021-09-05 21:17:51 +02:00
Kamran Ahmed
a489bc0fde Update dimmed button 2021-09-05 21:08:28 +02:00
Kamran Ahmed
09ef6bfbb0 Header logo fix 2021-09-05 20:55:22 +02:00
Kamran Ahmed
67d2f5cb57 Add support for environment variables 2021-09-05 20:38:08 +02:00
Kamran Ahmed
b28deab192 Update build workflow 2021-09-05 20:28:35 +02:00
Kamran Ahmed
290a73c8b0 Update dependencies 2021-09-05 20:25:48 +02:00
Kamran Ahmed
579d39e104 Merge branch 'master' of github.com:kamranahmedse/roadmap-next 2021-09-05 20:22:27 +02:00
Kamran Ahmed
e7c32958c9 Remove initial version 2021-09-05 20:22:21 +02:00
Kamran Ahmed
7c5d28b68b Add sponsor ad 2021-09-01 22:15:55 +02:00
Larah Armstrong
2f8c0c5748 Update what-is-internet.md (#190) 2021-02-02 09:36:38 +04:00
Kamran Ahmed
5e08af99b2 Update year 2021-01-08 14:41:49 +04:00
Yago Azedias
2882815313 Updating year to 2021 (#228) 2021-01-07 11:27:51 +04:00
Kamran Ahmed
e093f98a42 Add funding info 2020-11-23 01:19:34 +04:00
Kamran Ahmed
d3f8e0517b Add transport protocols video 2020-11-22 00:50:00 +04:00
Kamran Ahmed
efc874163b Add link to tcp/ip model video 2020-11-07 02:36:29 +04:00
Kamran Ahmed
3e8abbed13 Add sponsor and youtube link 2020-10-25 01:07:02 +04:00
Kamran Ahmed
244d336d8e Add link to osi model video 2020-10-24 23:34:57 +04:00
Kamran Ahmed
9d24b98f67 Add video for seal and freeze objects in JavaScript 2020-10-16 21:34:07 +04:00
Kamran Ahmed
007bd7feb0 Remove roadmaps from top nav 2020-10-16 15:17:03 +04:00
Kamran Ahmed
7619945028 Add http caching video link 2020-10-06 00:16:12 +04:00
Peter Thaleikis
3265f9729d Fixing missing 'mailto:' and broken link in Terms (#204)
* Fixing missing 'mailto:'

* Fixing broken link in Terms
2020-10-04 15:35:58 +04:00
Kamran Ahmed
4591ad2336 Add video for CDN 2020-09-26 22:01:22 +04:00
Kamran Ahmed
163e03f578 Update DBA roadmap 2020-09-21 23:42:07 +04:00
Kamran Ahmed
2215174c20 Update the DBA roadmap 2020-09-19 18:19:09 +04:00
Kamran Ahmed
aa52e08ac4 Add load balancers video link 2020-09-19 12:07:30 +04:00
lesovsky
96acb6c93e Add PostgreSQL DBA roadmap. 2020-09-09 08:36:15 +05:00
Kamran Ahmed
69ebd50a90 Add video link for dns records 2020-08-31 16:05:53 +05:00
Kamran Ahmed
e2eaf7d19c Add link to DNS video 2020-08-17 03:13:08 +04:00
Kamran Ahmed
da7ba5bf4c Add link to system design video 2020-08-09 09:18:44 +04:00
Kamran Ahmed
0d17cf145c Update URL for fetch api video 2020-08-02 22:20:27 +04:00
Kamran Ahmed
8a7f7a4a83 Update banner and new video link 2020-08-02 22:10:42 +04:00
Kamran Ahmed
7d3255576b Add video link for system design 2020-07-27 14:51:30 +04:00
Kamran Ahmed
97529cbf54 chore: trigger build 2020-07-26 13:31:58 +04:00
Kamran Ahmed
52af178a19 Update guide URL and add images 2020-07-26 12:19:16 +04:00
Ebrahim Bharmal
f0425fd964 Adding guide for forward and reverse proxy servers (#185)
* Add files via upload

* Update forward&reverse_proxy.md

* Update forward&reverse_proxy.md

* Update forward&reverse_proxy.md

Checking links

* Update forward&reverse_proxy.md

Updated all links. Now images show up properly

* Update forward&reverse_proxy.md

Updated headings. Made changes to the format.

* Update forward&reverse_proxy.md

Changes made againnnnnn

* Update forward&reverse_proxy.md

Updated structure. Added more content.

* Update forward&reverse_proxy.md

* Update forward&reverse_proxy.md

Added table of contents

* Update forward&reverse_proxy.md

Corrected some lines

* Update forward&reverse_proxy.md

Updated final version: Fixed spelling mistakes and errors

* Added picture of ebrahimbharmal007

Contributing to guides: forward&reverse_proxy.md

* Updated authors.json: add author ebrahimbharmal007

Added ebrahimbharmal007 in authors.json for submitting guide forward&reverse_proxy.md

* Updated guides.json

Added meta data for guide forward&reverse_proxy.md by ebrahimbharmal007
2020-07-26 12:06:29 +04:00
Kamran Ahmed
570d6a04b1 Add promises video link 2020-07-21 01:02:45 +04:00
Kamran Ahmed
1e677183aa Add react roadmap 2020-07-18 15:59:04 +04:00
Kamran Ahmed
14a29b4634 Add react map files 2020-07-18 04:13:19 +04:00
Kamran Ahmed
bc66a805e3 Add react roadmap 2020-07-18 04:12:33 +04:00
Kamran Ahmed
f6c10d7344 Fix invalid links for the videos 2020-07-18 00:43:47 +04:00
Kamran Ahmed
4e96943374 Add links to podcast and watch in footer 2020-07-17 15:44:47 +04:00
Kamran Ahmed
1235459d7a Add post on ci/cd 2020-07-17 15:39:48 +04:00
Kamran Ahmed
0d35fe0364 Add webstorm project history image 2020-07-17 15:26:57 +04:00
Kamran Ahmed
76d6fab581 Add guide on single sign on 2020-07-17 15:19:19 +04:00
Kamran Ahmed
da39147539 Add youtube videos page 2020-07-17 15:14:28 +04:00
lincarters
9e230a01a2 Update resources.md
Spelling fix
2020-07-16 14:58:47 +04:00
Kamran Ahmed
4c3452926a Fix image URL for oauth 2020-07-02 16:48:30 +04:00
Kamran Ahmed
b36c5b3c26 Add oauth post 2020-07-02 15:31:04 +04:00
Kamran Ahmed
95fe79a0f1 Add podcasts menu 2020-06-22 01:58:52 +04:00
Kamran Ahmed
850a9ffc9d Add podcasts page 2020-06-22 01:52:29 +04:00
Kamran Ahmed
2b8d18d880 Refactor deployment action 2020-06-22 00:25:22 +04:00
Kamran Ahmed
9b551a69a7 Fix deployment step failing 2020-06-22 00:20:21 +04:00
Kamran Ahmed
cdb9201b2f Refactor build steps 2020-06-22 00:14:16 +04:00
Kamran Ahmed
ab15d91614 Add deployment github action 2020-06-22 00:06:44 +04:00
Kamran Ahmed
9d2fdfa7cf Add support for environment variables 2020-06-21 23:38:38 +04:00
Kamran Ahmed
bcad685e27 Update contribution guides 2020-06-21 23:01:47 +04:00
Kamran Ahmed
74ae339fe1 Add JWT Authentication guide 2020-06-20 23:16:04 +04:00
Kamran Ahmed
5811fd8832 feat: add png for android roadmap 2020-06-11 19:58:34 +04:00
Kamran Ahmed
6c710a92c1 Add token authentication guide 2020-06-04 12:41:21 +04:00
Kamran Ahmed
51f068085d Update android roadmap 2020-05-30 02:46:13 +04:00
Kamran Ahmed
1795bc1495 Update twitter URL 2020-05-26 23:00:41 +04:00
Kamran Ahmed
d4ef930187 Add community badge 2020-05-26 22:39:09 +04:00
Kamran Ahmed
54fae335c2 Update twitter URL 2020-05-26 18:57:32 +04:00
Kamran Ahmed
0f886e9def Create SVG for android roadmap 2020-05-26 14:27:42 +04:00
Kamran Ahmed
3f299cdd8b Create SVG for android roadmap 2020-05-26 14:16:53 +04:00
Kamran Ahmed
7fccd6b399 Fix typos and minor alignment fixes 2020-05-26 13:28:07 +04:00
Kamran Ahmed
f75512e96a Add android developer roadmap 2020-05-26 13:23:06 +04:00
Kamran Ahmed
32ff9a700b Add android developer roadmap 2020-05-26 04:11:58 +04:00
Kamran Ahmed
6976202171 Replace homepage with roadmaps page 2020-05-25 22:34:16 +04:00
Kamran Ahmed
cf1cca7cb3 Add guide on session based authentication 2020-05-25 22:29:52 +04:00
Kamran Ahmed
2236c3f93c Add basic authentication guide 2020-05-19 01:22:07 +04:00
Kamran Ahmed
4f067504a2 Add character encodings post 2020-05-14 02:52:15 +04:00
Kamran Ahmed
42747f4f97 Add unfamiliar codebase post 2020-05-04 23:32:17 +04:00
Kamran Ahmed
1d952f75f8 Add unfamiliar codebase post 2020-05-04 23:29:26 +04:00
Peter Thaleikis
9e61ef5dd1 Add guide "Why “build it and they will come” alone won’t work anymore" 2020-05-04 23:09:40 +04:00
Kamran Ahmed
c7770cc64c Add dhcp illustration 2020-04-28 13:16:11 +04:00
Kamran Ahmed
af7e25dc92 Fix github buttons width 2020-04-28 11:13:22 +04:00
Kamran Ahmed
cf3365e778 feat: add carbon 2020-04-24 22:45:23 +04:00
Kamran Ahmed
bd69872059 feat: add guide SSL/TLS/HTTPS/SSH 2020-04-24 20:45:32 +04:00
Jefferson Ye
746ee3d548 Small grammar fix, "ambition" to "ambitious" 2020-04-22 13:37:48 +04:00
Kamran Ahmed
73c55a0eaa Add scaling databases post 2020-04-03 12:01:15 +04:00
Kamran Ahmed
299d0f3ada Add guide for asymptotic notation 2020-04-03 11:41:12 +04:00
Kamran Ahmed
98097f939a Update youtube URL 2020-03-30 01:51:09 +04:00
Kamran Ahmed
f4904da3f8 Update github link in page nav 2020-03-28 20:35:58 +04:00
Kamran Ahmed
465c00b4d5 Update dependencies and add github link in nav 2020-03-28 20:23:17 +04:00
Myles Webster
69c54e5dfe fix incorrect link for resource in FE dev roadmap 2020-03-25 18:29:44 +04:00
Kamran Ahmed
6f4898c216 Add illustrations for some topics 2020-03-23 22:33:39 +04:00
Kamran Ahmed
b8cc07c29e Update channel link 2020-03-15 16:13:36 +04:00
Kamran Ahmed
eae0ad3ecb Update alignment for share links 2020-03-14 12:49:26 +04:00
Kamran Ahmed
56bf52e641 Add hackernews share url 2020-03-14 12:48:11 +04:00
Kamran Ahmed
689f24e0f1 Add random numbers guide 2020-03-14 12:37:31 +04:00
Kamran Ahmed
63d66b3f4e Add big-o-notation guide 2020-03-14 02:40:57 +04:00
Kamran Ahmed
4930c00f78 Update roadmap pdfs 2020-03-14 01:54:46 +04:00
Kamran Ahmed
5745fc56bf Update pdfs for the roadmaps 2020-03-14 01:45:05 +04:00
Kamran Ahmed
55d5ced587 Type updates and banner change 2020-03-14 01:37:27 +04:00
Kamran Ahmed
018be76895 Add youtube banner 2020-03-14 01:02:04 +04:00
Kamran Ahmed
b268106684 Add youtube banner 2020-03-14 01:00:06 +04:00
Kamran Ahmed
56e2108be2 Add resources link in SSG 2020-03-03 00:18:32 +04:00
Kamran Ahmed
9dfbceda7c Update forntend resources 2020-03-03 00:10:33 +04:00
Kamran Ahmed
c698265f42 Add frontend resources 2020-03-03 00:06:25 +04:00
Kamran Ahmed
752d4614b8 Add resources to frontend 2020-03-02 10:52:48 +04:00
Kamran Ahmed
d73e08f8f6 Add resources setup 2020-03-01 10:27:15 +04:00
Kamran Ahmed
cf648924cf Add resources pages and new guide 2020-02-29 17:49:04 +04:00
Kamran Ahmed
2d15290566 Add menu items for resources and project ideas 2020-02-28 19:58:29 +04:00
Kamran Ahmed
06dd1934f3 Fix typo 2020-02-27 10:46:06 +04:00
Christoph Geschwind
316ada1259 Update levels-of-seniority.md
Fixes a tiny typo, at least I think it does.

Thanks for the great article!
2020-02-27 10:46:06 +04:00
Sohail Ahmad
30d2f15433 Fix typo ('compabitility' -> 'compatibility') 2020-02-26 20:27:31 +04:00
Kamran Ahmed
4ac1319d8d Update sponsor banner text 2020-02-22 21:44:05 +04:00
Andrew Petro
4e924981c1 fix: diction and typo ("its", "simplest") 2020-02-11 12:50:29 +04:00
Andrew Petro
fdf3fd050b fix: use "its" rather than "it's" when appropriate
Use "its" for the possessive, rather than "it's" (contraction of for "it is").
2020-02-11 12:50:29 +04:00
Will 保哥
79afd0a6a8 Update history-of-javascript.md
Add a space in a paragraph.
2020-02-11 12:47:13 +04:00
Will 保哥
03e35ee928 Update history-of-javascript.md
Typos: ECMASript -> ECMAScript
2020-02-11 12:44:15 +04:00
Curtis Gibby
eaaedb8034 Update name of Dunning–Kruger effect 2020-02-07 22:46:13 +04:00
Kamran Ahmed
84e87a501e Add do logo 2020-02-04 02:00:27 +04:00
Kamran Ahmed
8fca669787 Add do logo 2020-02-04 01:57:27 +04:00
Kamran Ahmed
3c1d41119f Add sponsor information 2020-02-01 18:05:57 +04:00
Kamran Ahmed
495fd37eae Add sponsor information 2020-02-01 17:55:54 +04:00
Kamran Ahmed
4cfeb1c372 Add pdfs for roadmaps 2020-02-01 17:23:53 +04:00
Kamran Ahmed
91a47faec0 Add sponsor information 2020-02-01 17:08:34 +04:00
Kamran Ahmed
8c03aedea1 Add sponsor banner 2020-02-01 13:33:14 +05:00
Kamran Ahmed
9a515f85c1 Hide sponsors nav item on mobile 2020-02-01 08:07:42 +05:00
Kamran Ahmed
0a2468aad2 Make frontend roadmap summary 2020-01-29 13:53:39 +05:00
Kamran Ahmed
fc2eb36d58 Resolve merge conflicts 2020-01-29 12:49:49 +05:00
Kamran Ahmed
3c5ea2131d Add detailed version for frontend roadmap 2020-01-29 12:48:18 +05:00
Kamran Ahmed
75e1f67ee8 Use on heading per page 2020-01-29 11:28:20 +05:00
Kamran Ahmed
b40894cfdc SEO optimization through titles/descriptions 2020-01-29 11:14:34 +05:00
Kamran Ahmed
4fb2e1f46d Fix SEO titles and keywords 2020-01-29 10:42:52 +05:00
Kamran Ahmed
8eccfd22e3 Update copy 2020-01-29 09:43:24 +05:00
Kamran Ahmed
d84800fcaf feat: detailed roadmap preparation 2020-01-28 17:48:22 +05:00
Kamran Ahmed
bb3260f4b7 Update contribution guidelines 2020-01-27 13:09:16 +05:00
Kamran Ahmed
9a2e1fd673 Add contribution guide for writing roadmap 2020-01-27 12:41:02 +05:00
Kamran Ahmed
3f599fab35 Remove gads 2020-01-22 12:13:25 +04:00
Kamran Ahmed
cdc710123f Add codefund 2020-01-22 12:11:24 +04:00
Kamran Ahmed
bb43c8eba6 Update sponsors info 2020-01-21 10:42:34 +04:00
Kamran Ahmed
c01d595546 Update sponsors info 2020-01-21 00:27:46 +04:00
Kamran Ahmed
77a66fd25d Add sponsors page 2020-01-21 00:20:25 +04:00
Kamran Ahmed
a93ac86766 Update sitemap 2020-01-20 11:24:36 +04:00
Kamran Ahmed
4044dbea91 Update sitemap path 2020-01-20 11:24:02 +04:00
Kamran Ahmed
3fc9ffe8b4 Update copy on sponsors page 2020-01-20 11:17:37 +04:00
Kamran Ahmed
880475f6de Add sponsors page 2020-01-20 10:58:39 +04:00
Kamran Ahmed
a26945288b Rename storage directory 2020-01-18 22:47:48 +04:00
Kamran Ahmed
b97ae52a1b Add PDF for devops roadmap 2020-01-18 16:56:27 +04:00
Kamran Ahmed
76ddeeedb2 Add devops roadmap 2020 update 2020-01-18 16:30:03 +04:00
Kamran Ahmed
00b7fe6e7f fix: electro misspelling and color for legend 2020-01-18 11:00:51 +04:00
Kamran Ahmed
c43442f127 Merge branch 'master' of github.com:kamranahmedse/roadmap.sh 2020-01-18 10:45:12 +04:00
Kamran Ahmed
68c62d218d feat: update 2020-01-18 10:44:58 +04:00
Kamran Ahmed
47b10a1a1a Fix broken logo in readme 2020-01-18 01:12:41 +04:00
Kamran Ahmed
1fd135d1c1 Move static to public and update paths 2020-01-18 01:08:47 +04:00
Kamran Ahmed
61bdc80f5a Update dependencies 2020-01-18 01:05:13 +04:00
Kamran Ahmed
4fbefd5ae9 Update site meta and title update for post 2020-01-18 00:56:49 +04:00
Jesse Li
835476ed31 Update PULL_REQUEST_TEMPLATE.md 2020-01-17 21:39:27 +04:00
Jesse Li
83745ae1b4 Add Guide: BitTorrent client 2020-01-17 21:39:27 +04:00
Kamran Ahmed
9465cfb5c2 feat: update author meta 2020-01-17 19:32:50 +04:00
Kamran Ahmed
4edd398770 chore: add contribution docs for writing guides 2020-01-17 19:29:04 +04:00
Kamran Ahmed
21b3b7cbdf fix: invalid canonicalization 2020-01-17 19:18:47 +04:00
Kamran Ahmed
ae6763bf83 Fix search engines section in backend 2020-01-12 10:31:22 +04:00
Kamran Ahmed
be5a61b697 Fix typo in backend roadmap 2020-01-12 00:44:15 +04:00
Kamran Ahmed
8e25dca636 Update PDF files and add 2020 version 2020-01-12 00:09:33 +04:00
Kamran Ahmed
b91d404f17 Merge branch 'master' of github.com:kamranahmedse/roadmap.sh 2020-01-10 18:55:00 +04:00
Kamran Ahmed
80f2cb8cbc Fix typos in frontend roadmap 2020-01-10 18:54:47 +04:00
Kamran Ahmed
2dc3d4fd24 Fix typos in frontend 2020-01-10 18:52:16 +04:00
Joshua Mamawag
2432ff9fd4 Fix typos and punctuations 2020-01-10 17:49:42 +04:00
Kamran Ahmed
8f1f8846c9 Update badges 2020-01-04 18:34:19 +04:00
Kamran Ahmed
7dac8665a0 Update badges 2020-01-04 18:33:21 +04:00
Kamran Ahmed
f0181ff08f Add PDFs for roadmaps 2020-01-04 18:01:21 +04:00
Kamran Ahmed
0ad95c2dd0 Update links 2020-01-04 17:57:50 +04:00
Kamran Ahmed
d184e93519 Add PDF for frontend roadmap 2020-01-04 17:41:03 +04:00
Kamran Ahmed
4ef31700a5 Update frontend and intro maps for 2020 2020-01-04 17:39:39 +04:00
Kamran Ahmed
087f4e5c25 Add license and github templates 2020-01-04 17:38:43 +04:00
Kamran Ahmed
c5ae26458a Update roadmaps for 2020 2020-01-04 17:35:41 +04:00
Kamran Ahmed
0c6de5d89b Add contribution guide 2020-01-02 09:59:41 +04:00
Kamran Ahmed
124d113162 Update sitemap and roadmaps 2020-01-02 09:54:52 +04:00
Kamran Ahmed
c88b0f3b1a Update sitemap, roadmap meta 2020-01-02 09:49:01 +04:00
Kamran Ahmed
06d72599d9 Resolve merge conflicts 2020-01-02 09:42:48 +04:00
Kamran Ahmed
eb9cd6cdcc Update dependencies 2020-01-02 09:40:55 +04:00
Kamran Ahmed
c7589b8325 Update summary pages for roadmaps 2019-12-06 18:18:33 +04:00
Kamran Ahmed
4c07ac509b Add SVG for the logo 2019-12-06 15:47:40 +04:00
Kamran Ahmed
1240b6b1bc Fix typos in guide 2019-12-04 01:02:58 +04:00
Kamran Ahmed
ad05c49570 Fix - Breaking build 2019-12-03 18:09:47 +04:00
Kamran Ahmed
c01a854a5a Fix - Duplicated meta tags on pages 2019-12-03 17:54:34 +04:00
Kamran Ahmed
7b1dde1d62 Fix Typos in Guide 2019-12-03 17:34:20 +04:00
Kamran Ahmed
56b0275b06 Update the conclusion on guide 2019-12-03 17:22:19 +04:00
Kamran Ahmed
7a0d784d81 Update twitter card image 2019-12-03 17:03:12 +04:00
Kamran Ahmed
2c9eb1f9ee Make twitter card logo square 2019-12-03 16:58:58 +04:00
Kamran Ahmed
e4ca1c9598 Add guide: Levels of Seniority 2019-12-03 16:40:31 +04:00
Kamran Ahmed
2b8e06d651 Add senior section 2019-12-03 02:55:56 +04:00
Kamran Ahmed
56088a838c Add section for mid-level developers 2019-12-03 01:30:00 +04:00
Kamran Ahmed
542d82c2dc Developer seniority junior section 2019-12-03 00:12:51 +04:00
Kamran Ahmed
980322bae0 Add Guide: Developer seniority 2019-12-02 17:08:49 +04:00
Kamran Ahmed
56fbe9a685 Add Guide: history of JavaScript 2019-12-02 13:06:35 +04:00
Kamran Ahmed
6939240d59 Add junior frontend landscape 2019-12-02 12:20:06 +04:00
Kamran Ahmed
4caaee3da5 Update badges 2019-12-02 03:31:25 +04:00
Kamran Ahmed
e829af3e62 Update summary 2019-12-02 02:13:21 +04:00
Kamran Ahmed
7ba0fa9004 Update meta 2019-12-02 02:12:26 +04:00
Kamran Ahmed
74433cd0d3 Sticky sidebar 2019-12-02 02:11:49 +04:00
Kamran Ahmed
dec3e992b3 Update frontend roadmap summary 2019-12-02 01:58:31 +04:00
Kamran Ahmed
7a4c27460f Add summary details for frontend developer 2019-12-02 00:28:10 +04:00
Kamran Ahmed
5553b411eb Add summary 2019-12-02 00:00:57 +04:00
Kamran Ahmed
98cc968ed1 Add roadmap summary for frontend 2019-12-01 23:51:23 +04:00
Kamran Ahmed
3de37468a6 Render page markdown 2019-12-01 17:06:53 +04:00
Kamran Ahmed
3364eae0a6 Change sitemap priority for hidden pages 2019-12-01 16:17:29 +04:00
Kamran Ahmed
a06eaec5d4 Add summary pages to landscape 2019-12-01 16:16:45 +04:00
Kamran Ahmed
10e433f538 Do not display hidden pages 2019-12-01 15:49:13 +04:00
Kamran Ahmed
129deed6a9 Roadmap author and contributors page 2019-12-01 15:46:13 +04:00
Kamran Ahmed
ce35a8112f Remove utm params from share URLs 2019-12-01 15:11:28 +04:00
Kamran Ahmed
35f6070133 Relevant page loading on detail page 2019-12-01 15:01:22 +04:00
Kamran Ahmed
629f1058f2 Make mobile sidebar responsive 2019-11-30 18:12:07 +04:00
Kamran Ahmed
199310df93 Add share icons on roadmap detail page 2019-11-30 17:15:56 +04:00
Kamran Ahmed
0d45fcbf79 Add share icons to roadmap header 2019-11-30 17:07:50 +04:00
Kamran Ahmed
47cbcde5dc Add detailed roadmap 2019-11-30 14:33:22 +04:00
Kamran Ahmed
5b12eb9e02 Split roadmap summaries and detailed roadmap 2019-11-30 14:27:37 +04:00
Kamran Ahmed
6632b46d98 Fix - Guide having space on top 2019-11-30 14:27:21 +04:00
Kamran Ahmed
25e009a63f Update roadmaps summaries 2019-11-30 14:26:03 +04:00
Kamran Ahmed
9ae7eed1e3 Remove static images 2019-11-30 14:25:31 +04:00
Kamran Ahmed
8db62cb19f Update badges 2019-11-30 11:21:14 +04:00
Kamran Ahmed
d1a991b18c Add badges 2019-11-30 11:14:42 +04:00
Kamran Ahmed
8107e008ff Overflowing scroll on page 2019-11-30 10:28:37 +04:00
Kamran Ahmed
944858bbb1 Make upcoming badge take to signup 2019-11-30 10:27:39 +04:00
Kamran Ahmed
b864c60ea3 Upcoming roadmap page 2019-11-30 10:00:44 +04:00
Kamran Ahmed
618b55f601 Split roadmap header to separate component 2019-11-30 09:06:06 +04:00
Kamran Ahmed
b5c65b408b Update meta script 2019-11-30 00:43:29 +04:00
Kamran Ahmed
21f2ef80ba Upcoming roadmap UI 2019-11-30 00:20:24 +04:00
Kamran Ahmed
ebd351e133 Refactor markdown rendering 2019-11-29 18:36:49 +04:00
Kamran Ahmed
77dab81b92 Add padding around container 2019-11-29 18:13:19 +04:00
Kamran Ahmed
0350da2929 Split markdown rendering 2019-11-29 18:13:07 +04:00
Kamran Ahmed
59c07c9000 Minor update 2019-11-29 11:51:43 +04:00
Kamran Ahmed
79ab31dec7 Update sitemap generation for roadmap pages 2019-11-29 11:49:50 +04:00
Kamran Ahmed
16983cb950 Update path-map generation 2019-11-29 11:23:48 +04:00
Mazhar Zandsalimi
e29fe52cb1 minor modification: max-age=3600 means 60 minutes 2019-11-29 10:48:40 +04:00
Kamran Ahmed
7921acb666 Add roadmaps meta generator 2019-11-28 00:19:03 +04:00
Kamran Ahmed
b53f8c982c Update pathmap generation for roadmap routes 2019-11-27 20:53:29 +04:00
Kamran Ahmed
0b72a07147 Add roadmap pathmap generator 2019-11-25 21:00:37 +04:00
Konstantinos Psychas
5155a0c358 Update design-patterns-for-humans.md
A typo that may cause confusion.
2019-11-24 11:26:49 +04:00
Kamran Ahmed
bd5663ab26 Add roadmap text 2019-11-23 16:30:48 +04:00
Kamran Ahmed
af3ccd5bb5 Fix broken build 2019-11-21 18:22:57 +04:00
B3nnyL
035eaa47e8 [fix]canonical url and og:url 2019-11-21 11:57:21 +04:00
Pat Laundy
3541d4e717 Adding missed word in opening paragraph 2019-11-19 09:33:25 +04:00
Kamran Ahmed
e8dcfe97f2 Fix - Subscription form throws warning 2019-11-16 16:16:50 +04:00
Kamran Ahmed
8f3307e53e Update sitemap and build 2019-11-16 16:15:05 +04:00
Kamran Ahmed
dcc825416d Push dev configuration 2019-11-16 16:13:37 +04:00
Kamran Ahmed
f8fcb8d600 Update build script 2019-11-16 16:12:18 +04:00
Kamran Ahmed
40919dec14 Add configuration and build changes 2019-11-16 16:11:08 +04:00
Kamran Ahmed
f3592155bf Add build check for .env file 2019-11-16 15:35:37 +04:00
Kamran Ahmed
927ee73be7 Add dotenv file loading 2019-11-16 15:21:40 +04:00
Kamran Ahmed
4f81d5374e Fix - Analytics not working 2019-11-16 15:07:10 +04:00
Kamran Ahmed
e95fd69886 Update subscribe button in top nav 2019-11-16 14:18:43 +04:00
Kamran Ahmed
11d9da5afb Update FAQ page 2019-11-16 14:06:31 +04:00
Kamran Ahmed
cea8abc5ef Update build script 2019-11-16 14:02:16 +04:00
Kamran Ahmed
7169d3bb8f Add FAQ page in top nav 2019-11-16 13:54:36 +04:00
Kamran Ahmed
ae9c1c4992 Add about page 2019-11-16 13:51:10 +04:00
Kamran Ahmed
58e560af7d Do not send analytics for dev mode 2019-11-16 13:50:30 +04:00
Kamran Ahmed
09fa166f56 Delete .nojekyll 2019-11-15 02:12:02 +04:00
Kamran Ahmed
6ed7d9c25f Create .nojekyll 2019-11-15 02:11:24 +04:00
Kamran Ahmed
e59fc5e4e9 Update canonical URL 2019-11-15 02:09:54 +04:00
Kamran Ahmed
f5da05c3ec Update canonical URL 2019-11-15 02:08:45 +04:00
Kamran Ahmed
07b200b878 Update readme.md 2019-11-14 22:31:12 +04:00
Kamran Ahmed
ccca782f25 Update readme 2019-11-14 22:30:49 +04:00
Kamran Ahmed
77d9846d9b Update readme 2019-11-14 22:22:04 +04:00
Kamran Ahmed
8da175e9d8 Update readme 2019-11-14 21:32:28 +04:00
Kamran Ahmed
467634889b Update repository URL 2019-11-14 21:29:30 +04:00
Kamran Ahmed
b46b425b41 Fix twitter share URL issue 2019-11-14 21:26:01 +04:00
Kamran Ahmed
9e23439f0c Add sitemap generation and remove extra files 2019-11-14 21:21:56 +04:00
Kamran Ahmed
c6db625e35 Update license 2019-11-14 12:09:51 +04:00
Kamran Ahmed
672245e4e4 Fix invalid URL being generated 2019-11-13 23:44:45 +04:00
Kamran Ahmed
e4ce3475c6 Update repository URLs 2019-11-13 23:38:29 +04:00
Kamran Ahmed
d15b97db73 Update bundle application 2019-11-13 23:29:52 +04:00
Kamran Ahmed
8f040e5e8a Add gh-pages deployment 2019-11-13 23:13:45 +04:00
Kamran Ahmed
888800d2a0 Update contribution docs 2019-11-13 23:07:29 +04:00
Kamran Ahmed
51b2c70586 Restructure and update imports 2019-11-13 23:06:07 +04:00
Kamran Ahmed
5b4cc86f61 Restructure and update readme 2019-11-13 22:59:27 +04:00
Kamran Ahmed
9952ee5805 Resolve merge conflicts 2019-11-13 22:48:43 +04:00
Stéphane Klein
dacbf09f55 Remove JSCS (deprecated) and add StandardJS linter (#605) 2019-07-10 10:26:35 +04:00
Kamran Ahmed
a16787ab58 Remove myself from github sponsors 2019-07-07 15:59:19 +04:00
Rahul Madhav Upakare
7d45c8e462 Corrected language name for Go programming language (#601) 2019-07-05 18:05:06 +04:00
Kamran Ahmed
796bde76c9 Update copy 2019-07-01 13:33:06 +04:00
Kamran Ahmed
22d5622e1e Add funding.yml 2019-05-23 16:30:44 +04:00
Eric Jeker
2312fdd608 Duplicated word in the CSS Architecture comment box. Removed 'push'. 2019-05-17 16:59:23 +04:00
Kamran Ahmed
bc2ecea03b Update license 2019-05-13 02:47:20 +04:00
Kamran Ahmed
84a551f906 Fix transparency of roadmaps 2019-05-06 13:04:27 +04:00
Kamran Ahmed
9fab5c7134 Update devops map 2019-05-06 12:21:47 +04:00
Kamran Ahmed
c61f4a845d Fix some typos and update banner 2019-05-06 12:07:28 +04:00
Kamran Ahmed
025753b279 Fix spelling mistake 2019-05-06 11:17:24 +04:00
Kamran Ahmed
6b9901db28 Update the banner 2019-05-05 01:18:22 +04:00
Kamran Ahmed
34f0e483ec Update repo banneer 2019-05-05 00:44:15 +04:00
Kamran Ahmed
0ae9bc0e3e Update repo banner 2019-05-05 00:40:46 +04:00
Kamran Ahmed
3f17f60daf Update headeer 2019-05-05 00:30:36 +04:00
Kamran Ahmed
7f2acba352 Add sponsor 2019-03-18 00:44:13 +04:00
johnoct
907fb9915f fix the cut off names teamcity, LXC, and puppet 2019-03-17 10:06:19 +04:00
Kamran Ahmed
fd2e64ec50 Update sponsors 2019-03-12 10:29:23 +04:00
Kamran Ahmed
3fd5b9e744 Update sponsor text 2019-02-06 10:11:16 +04:00
Kamran Ahmed
edff9156ff Update sponsor link 2019-02-05 15:20:32 +04:00
Kamran Ahmed
e1c89585e9 Add sponsor link 2019-02-05 15:05:15 +04:00
Kamran Ahmed
abaa839b26 Fix transparency for backend roadmap 2019-01-26 14:55:41 +04:00
Kamran Ahmed
1bc7384929 Minor markdown change 2019-01-04 10:10:55 +04:00
Kamran Ahmed
6a148295f7 Update sponsors section 2019-01-04 10:10:30 +04:00
Kamran Ahmed
ea25f2d99b Update readme 2019-01-02 21:48:30 +04:00
Kamran Ahmed
08303c0623 Update badge 2019-01-01 14:26:33 +04:00
Kamran Ahmed
f18f9fb5b3 Fix tweet URL 2018-12-30 21:10:46 +04:00
Kamran Ahmed
dfc07e0753 Remove emojis 2018-12-29 23:32:52 +04:00
Kamran Ahmed
64a19fdc3c Update badge 2018-12-29 23:23:39 +04:00
Kamran Ahmed
1b3e8712ff Rearrange badges 2018-12-29 22:51:56 +04:00
Kamran Ahmed
f242c6e358 Update badges and intro section 2018-12-29 22:51:10 +04:00
Kamran Ahmed
7e2121bed9 Merge branch 'master' of github.com:kamranahmedse/developer-roadmap 2018-12-29 22:48:26 +04:00
Kamran Ahmed
bb80ceb7ba Update intro map 2018-12-29 22:48:19 +04:00
Kamran Ahmed
25dfb28368 Update badge 2018-12-29 22:32:58 +04:00
Kamran Ahmed
a1c75bb9f8 Update badges 2018-12-29 22:32:37 +04:00
Kamran Ahmed
efdb628120 Update badges 2018-12-29 22:31:20 +04:00
Kamran Ahmed
ac23dddeb9 Update header 2018-12-29 21:44:43 +04:00
Kamran Ahmed
b208eaa1bd Update frontend roadmap for 2019 2018-12-29 20:39:20 +04:00
Kamran Ahmed
8ebf97277c Add updated frontend roadmap 2018-12-29 20:37:25 +04:00
Kamran Ahmed
928d79e3fb Update frontend roadmap image 2018-12-29 17:27:52 +04:00
Kamran Ahmed
9b95218eb8 Update frontend roadmap image 2018-12-29 17:20:02 +04:00
Kamran Ahmed
8bcdd84f0f Update frontend developer roadmap 2018-12-29 17:17:46 +04:00
Asad Mansoor
67a72aab11 added container orchestration to devops roadmap (#518)
* added container orchestration to devops roadmap

* Added kubernetes as preferred
2018-11-29 10:25:13 +04:00
Kamran Ahmed
771f3a9cb7 Merge branch 'bekicot-fetch-api-for-frontend' 2018-10-16 12:19:23 +04:00
Kamran Ahmed
38b6b34437 Resolve merge conflicts 2018-10-16 12:19:10 +04:00
Kamran Ahmed
548dfd85e7 Add Fetch API 2018-10-16 12:14:43 +04:00
Kamran Ahmed
971d23c43a Contribution docs update 2018-10-16 12:11:07 +04:00
Kamran Ahmed
3aac8de849 Add contribution docs 2018-10-16 12:00:49 +04:00
Ahmad Awais ⚡️
8d605735b2 👌 IMPROVE: Contribution Docs + Fix Frontend RoadMap (#498)
* 📦 NEW: No auto formatting for JSON in VSCode

* 👌 IMPROVE: lingo for several libraries/software

* 👌 IMPROVE: alt text for Web Developer Roadmap Introduction

* 👌 IMPROVE: alt text for Frontend Roadmap

* 👌 IMPROVE: alt text for Back-end Roadmap

* 👌 IMPROVE: alt text for DevOps Roadmap

*  📖 DOC: make contribution fun again with more details

* 🐛 FIX: names of several libraries/software
2018-10-16 11:21:44 +04:00
Yana Agun Siswanto
7debdb90c1 frontend-map.json: add Fetch API as recomendation
Fetch API should be added instead of XMLHttpRequest(XHR) API
as fetch uses promises which enables a simpler and cleaner API.
However, understanding both Fetch/XHR is required for frontend.

Closes #475
2018-10-16 05:28:00 +07:00
Andre Christoga Pramaditya Sion
f6f5c821b3 Emoji for both genders (#502)
Because the tech isn't for males only.
2018-10-12 00:48:08 +04:00
Kamran Ahmed
227e08b7c4 Don't need coffee 2018-09-09 22:18:27 +04:00
Kamran Ahmed
16651606fb Add badge 2018-09-08 20:11:23 +04:00
Kamran Ahmed
0ea67f695d Remove sponsor 2018-07-02 14:44:32 +04:00
Kamran Ahmed
6c4386ed7d Update license 2018-06-09 17:56:23 +04:00
Kamran Ahmed
e65ba9365b Add license 2018-06-09 17:53:56 +04:00
Kamran Ahmed
e5843568dd Add License 2018-06-09 17:52:57 +04:00
Kamran Ahmed
7968151c44 Update backend map 2018-06-09 04:35:03 +04:00
Kamran Ahmed
9f0753f098 Add devops map 2018-06-09 04:24:11 +04:00
Kamran Ahmed
98d0aa5103 Update backend roadmap 2018-06-08 18:14:13 +04:00
Kamran Ahmed
c1706e2c18 Remove banner 2018-06-06 21:28:24 +04:00
Kamran Ahmed
84e74096b7 Update readme 2018-05-05 23:02:07 +02:00
Kamran Ahmed
3d96fdf1df Update weekly 2018-04-08 00:24:35 +02:00
Kamran Ahmed
a157605b2b Update readme.md 2018-04-07 23:34:34 +02:00
Kamran Ahmed
ec83830577 Update readme 2018-04-07 02:49:19 +02:00
Kamran Ahmed
6babeb3f21 Add esguy link 2018-04-07 02:48:03 +02:00
Kamran Ahmed
0b9754c9ae Add disclaimer 2018-04-07 02:38:48 +02:00
Kamran Ahmed
c2f7754b0d Add updated backend developer roadmap 2018-04-02 18:28:52 +02:00
Kamran Ahmed
4df519845f Update roadmaps 2018-03-27 00:46:00 +02:00
Kamran Ahmed
910bd371dd Add backend and devops text files 2018-03-26 22:09:12 +02:00
Kamran Ahmed
0aa6db6007 Update textual form 2018-03-26 22:07:12 +02:00
Kamran Ahmed
01be603780 Rename readme 2018-03-26 22:04:14 +02:00
Kamran Ahmed
55a3ce4def Rename readme 2018-03-26 22:04:04 +02:00
Kamran Ahmed
a21264eb5e Remove splits 2018-03-26 22:00:43 +02:00
Kamran Ahmed
8c216782e5 Update markdown 2018-03-26 21:59:32 +02:00
Kamran Ahmed
ed9823245b Update structure 2018-03-26 21:56:13 +02:00
Kamran Ahmed
378e53eba4 Update frontend roadmap 2018-03-25 21:19:48 +02:00
Kamran Ahmed
66b68bc26f Add frontend map 2018-03-25 21:17:37 +02:00
Kamran Ahmed
0785d28bb4 Temp commit 2018-03-25 21:17:12 +02:00
Kamran Ahmed
f43dda522d Update frontend roadmap 2018-03-25 20:53:37 +02:00
Kamran Ahmed
ba98142d5b Remove recommendation 2018-03-25 18:16:24 +02:00
Kamran Ahmed
43160d3058 Put images in the repository 2018-03-25 18:03:57 +02:00
Kamran Ahmed
d40a858c6a Add disclaimer 2018-03-25 16:43:19 +02:00
Kamran Ahmed
4024005c4a Remove splits 2018-03-25 16:40:24 +02:00
Kamran Ahmed
91d1fc7245 Add massive disclaimer 2018-03-25 16:39:28 +02:00
Kamran Ahmed
328efa6ff6 Update frontend roadmap 2018-03-25 16:13:40 +02:00
Kamran Ahmed
cb352aba68 Add fancy splits 2018-02-27 21:31:39 +01:00
Kamran Ahmed
625ca5dcf4 Update youtube link 2018-02-27 13:53:02 +01:00
Kamran Ahmed
25d686ae5c Fix blog URL 2018-02-27 12:57:46 +01:00
Kamran Ahmed
0ab94faa95 Update README.md 2018-02-27 12:55:35 +01:00
Kamran Ahmed
5299a04acd Update README.md 2018-02-27 12:49:37 +01:00
Kamran Ahmed
f326a58bee Update readme 2018-02-27 12:49:07 +01:00
Kamran Ahmed
d8d52a6e86 Update readme 2018-02-27 12:42:05 +01:00
Kamran Ahmed
ba09cc4b86 Update readme 2018-02-27 12:22:14 +01:00
andrea
5804deb8ac Added a list of Linux & Unix server distributions, and Emacs as text editor (#328)
* Added a list of Linux & Unix server distributions, and Emacs as text editor

* Updated Linux server list personal preference and possibilities

* Added OpenBSD and NetBSD as unix suitable OS's
2018-02-27 09:57:27 +01:00
Zeeshan Ahmad
63b3f0199b Update README.md (#418) 2018-02-26 15:10:25 +01:00
Kamran Ahmed
0b0addaee4 Update readme 2018-02-24 20:44:01 +01:00
Kamran Ahmed
aab6d380aa Update project files 2018-01-06 17:16:47 +04:00
Ricardo N Feliciano
79b5c09a06 Add CircleCI, Packer, remove TeamCity, fix SaltStack. (#308) 2018-01-05 22:40:04 +04:00
Kamran Ahmed
3bd4ad5874 Update devops 2018-01-05 11:25:25 +04:00
Kamran Ahmed
79887dc7d5 Update intro 2018-01-05 03:16:54 +04:00
Kamran Ahmed
dc8cb8e777 Update charts for 2018 2018-01-05 03:14:25 +04:00
Kamran Ahmed
a8059e73c0 Update header image 2018-01-05 01:57:58 +04:00
PlanB
ee2b3e5de0 Change Flask's color to '16770457' (#292) 2017-11-28 09:21:36 +05:00
Kamran Ahmed
807e5ea2c1 Add sponsor link 2017-11-16 00:18:53 +04:00
Kamran Ahmed
f7b42203a4 Remove sponsor link 2017-11-03 12:27:26 +04:00
8705 changed files with 192611 additions and 558869 deletions

View File

@@ -1,8 +0,0 @@
{
"devToolbar": {
"enabled": false
},
"_variables": {
"lastUpdateCheck": 1728296475293
}
}

1
.astro/types.d.ts vendored
View File

@@ -1 +0,0 @@
/// <reference types="astro/client" />

View File

@@ -1,3 +0,0 @@
PUBLIC_API_URL=https://api.roadmap.sh
PUBLIC_AVATAR_BASE_URL=https://dodrc8eu8m09s.cloudfront.net/avatars
PUBLIC_EDITOR_APP_URL=https://draw.roadmap.sh

18
.eslintrc Normal file
View File

@@ -0,0 +1,18 @@
{
"extends": [
"next",
"next/core-web-vitals",
"prettier"
],
"rules": {
"@next/next/no-img-element": [
"off"
],
"react/display-name": [
"off"
],
"react/jsx-no-target-blank": [
"off"
]
}
}

View File

@@ -1,25 +0,0 @@
name: "✍️ Missing or Deprecated Roadmap Topics"
description: Help us improve the roadmaps by suggesting changes
labels: [topic-change]
assignees: []
body:
- type: markdown
attributes:
value: |
Thanks for taking the time to help us improve the roadmaps with your suggestions.
- type: input
id: url
attributes:
label: Roadmap URL
description: Please provide the URL of the roadmap you are suggesting changes to.
placeholder: https://roadmap.sh
validations:
required: true
- type: textarea
id: roadmap-suggestions
attributes:
label: Suggestions
description: What changes would you like to suggest?
placeholder: Enter your suggestions here.
validations:
required: true

View File

@@ -1,42 +0,0 @@
name: "🐛 Bug Report"
description: Report an issue or possible bug
labels: [bug]
assignees: []
body:
- type: input
id: url
attributes:
label: What is the URL where the issue is happening
placeholder: https://roadmap.sh
validations:
required: true
- type: dropdown
id: browsers
attributes:
label: What browsers are you seeing the problem on?
multiple: true
options:
- Firefox
- Chrome
- Safari
- Microsoft Edge
- Other
- type: textarea
id: bug-description
attributes:
label: Describe the Bug
description: A clear and concise description of what the bug is.
validations:
required: true
- type: textarea
id: logs
attributes:
label: Output from browser console (if any)
description: Please copy and paste any relevant log output.
- type: checkboxes
id: will-pr
attributes:
label: Participation
options:
- label: I am willing to submit a pull request for this issue.
required: false

View File

@@ -1,12 +0,0 @@
name: "✨ Feature Suggestion"
description: Is there a feature you'd like to see on Roadmap.sh? Let us know!
labels: [feature request]
assignees: []
body:
- type: textarea
id: feature-description
attributes:
label: Feature Description
description: Please provide a detailed description of the feature you are suggesting and how it would help you/others.
validations:
required: true

View File

@@ -1,25 +0,0 @@
name: "🙏 Submit a Roadmap"
description: Help us launch a new roadmap with your expertise.
labels: [roadmap contribution]
assignees: []
body:
- type: markdown
attributes:
value: |
Thanks for taking the time to submit a roadmap! Please fill out the information below and we'll get back to you as soon as we can.
- type: input
id: roadmap-title
attributes:
label: What is the title of the roadmap you are submitting?
placeholder: e.g. Roadmap to learn Data Science
validations:
required: true
- type: textarea
id: roadmap-description
attributes:
label: Roadmap Link
description: Please create the roadmap [using our roadmap editor](https://twitter.com/kamrify/status/1708293162693767426) and submit the roadmap link.
placeholder: |
https://roadmap.sh/xyz
validations:
required: true

View File

@@ -1,35 +0,0 @@
name: "🙏 Submit a Project Idea"
description: Help us add project ideas to roadmaps.
labels: [project contribution]
assignees: []
body:
- type: markdown
attributes:
value: |
Thanks for taking the time to submit a project idea! Please fill out the information below and we'll get back to you as soon as we can.
- type: input
id: roadmap-title
attributes:
label: What Roadmap is this project for?
placeholder: e.g. Backend Roadmap
validations:
required: true
- type: dropdown
id: project-difficulty
attributes:
label: Project Difficulty
options:
- Beginner
- Intermediate
- Advanced
validations:
required: true
- type: textarea
id: roadmap-description
attributes:
label: Add Project Details
description: Please write a detailed description of the project in 3rd person e.g. "You are required to build a..."
placeholder: |
e.g. You are required to build a RESTful API...
validations:
required: true

View File

@@ -1,12 +0,0 @@
name: "🤷‍♂️ Something else"
description: If none of the above templates fit your needs, please use this template to submit your issue.
labels: []
assignees: []
body:
- type: textarea
id: issue-description
attributes:
label: Detailed Description
description: Please provide a detailed description of the issue.
validations:
required: true

View File

@@ -1,14 +0,0 @@
blank_issues_enabled: false
contact_links:
- name: Roadmap Request
url: https://roadmap.sh/discord
about: Please do not open issues with roadmap requests, hop onto the discord server for that.
- name: 📝 Typo or Grammatical Mistake
url: https://github.com/kamranahmedse/developer-roadmap/tree/master/src/data
about: Please submit a pull request instead of reporting it as an issue.
- name: 💬 Chat on Discord
url: https://roadmap.sh/discord
about: Join the community on our Discord server.
- name: 🤝 Guidance
url: https://roadmap.sh/discord
about: Join the community in our Discord server.

BIN
.github/images/banner.png vendored Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 39 KiB

1
.github/sponsors/doppler-logo.svg vendored Normal file
View File

@@ -0,0 +1 @@
<svg id="Layer_1" data-name="Layer 1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 3473 1069"><defs><style>.cls-1{fill:#fff;}.cls-2{fill:#111;}.cls-3{fill-rule:evenodd;fill:url(#linear-gradient);}</style><linearGradient id="linear-gradient" x1="658.73" y1="777.7" x2="341.45" y2="352.06" gradientTransform="matrix(1, 0, 0, -1, 0, 1070)" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#33a9ff"/><stop offset="1" stop-color="#1673ff"/></linearGradient></defs><rect class="cls-1" width="3473" height="1069"/><path class="cls-2" d="M1054.06,633.32q4.93.45,11.23.9H1081q52.55,0,77.7-26.5,25.59-26.49,25.59-73.18,0-48.94-24.25-74.09t-76.79-25.14q-7.18,0-14.82.45-5.78,0-11,.51a3.73,3.73,0,0,0-3.33,3.74Zm202.54-98.78Q1256.6,575,1244,605t-35.92,49.84q-22.9,19.75-56.14,29.63t-74.55,9.88q-18.86,0-44-1.79A338.32,338.32,0,0,1,984,686.3V386.41a3.8,3.8,0,0,1,3.13-3.75,386.34,386.34,0,0,1,47.17-5.27q26.49-1.8,45.36-1.8,40,0,72.3,9,32.79,9,56.14,28.29T1244,462.25Q1256.61,492.33,1256.6,534.54Z"/><path class="cls-2" d="M1397.52,534.54q0,22.89,5.39,41.31a103.13,103.13,0,0,0,16.17,31.87,74.66,74.66,0,0,0,26.05,20.21q15.27,7.19,35,7.18,19.3,0,34.58-7.18a69.47,69.47,0,0,0,26-20.21A91.41,91.41,0,0,0,1557,575.85q5.83-18.42,5.84-41.31T1557,493.23q-5.39-18.86-16.17-31.88a67.73,67.73,0,0,0-26-20.65q-15.27-7.18-34.58-7.19-19.77,0-35,7.64a72.5,72.5,0,0,0-26.05,20.65q-10.33,13-16.17,31.88A145.23,145.23,0,0,0,1397.52,534.54Zm237.57,0q0,40-12.12,70.49-11.68,30.09-32.34,50.74a134.89,134.89,0,0,1-49.4,30.53,176.88,176.88,0,0,1-61.07,10.33A174.23,174.23,0,0,1,1420,686.3a140,140,0,0,1-49.4-30.53q-21.11-20.65-33.23-50.74-12.13-30.53-12.13-70.49t12.58-70q12.57-30.53,33.68-51.18a142,142,0,0,1,49.4-31A171.39,171.39,0,0,1,1480.16,372a174.08,174.08,0,0,1,60.18,10.33,136.87,136.87,0,0,1,49.4,31q21.1,20.65,33.23,51.18Q1635.09,494.58,1635.09,534.54Z"/><path class="cls-2" d="M1810.48,375.59q69.62,0,106.88,24.7,37.28,24.24,37.28,79.92,0,56.13-37.72,81.27-37.73,24.69-107.79,24.69H1791a3.83,3.83,0,0,0-3.83,3.83v96.51a3.83,3.83,0,0,1-3.83,3.83h-66.23V386.83a3.81,3.81,0,0,1,3.1-3.75,400.76,400.76,0,0,1,45.4-5.69Q1791.18,375.59,1810.48,375.59Zm4.49,59.72q-7.63,0-15.27.45-5,.3-9.06.62a3.8,3.8,0,0,0-3.51,3.8v86.28h22q36.38,0,54.79-9.88t18.42-36.82q0-13-4.94-21.55a32.47,32.47,0,0,0-13.48-13.47q-8.54-5.39-21.1-7.19A159.75,159.75,0,0,0,1815,435.31Z"/><path class="cls-2" d="M2123.07,375.59q69.61,0,106.89,24.7,37.27,24.24,37.27,79.92,0,56.13-37.72,81.27-37.73,24.69-107.78,24.69h-18.18a3.83,3.83,0,0,0-3.83,3.83v96.51a3.83,3.83,0,0,1-3.83,3.83h-66.23V386.82a3.8,3.8,0,0,1,3.1-3.74,400.76,400.76,0,0,1,45.4-5.69Q2103.77,375.59,2123.07,375.59Zm4.49,59.72q-7.64,0-15.27.45-5,.3-9.06.62a3.81,3.81,0,0,0-3.51,3.8v86.28h22q36.38,0,54.78-9.88t18.42-36.82q0-13-4.94-21.55a32.47,32.47,0,0,0-13.48-13.47q-8.52-5.39-21.1-7.19A159.75,159.75,0,0,0,2127.56,435.31Z"/><path class="cls-2" d="M2540.5,630.17a1.29,1.29,0,0,1,1.28,1.28v57.62a1.28,1.28,0,0,1-1.28,1.27H2342.25V401.41a3.83,3.83,0,0,1,2.81-3.69l67.25-18.54v251Z"/><path class="cls-2" d="M2618.88,690.34V383a3.84,3.84,0,0,1,3.83-3.83h215a1.28,1.28,0,0,1,1.23,1.64l-16.44,56.26a1.26,1.26,0,0,1-1.22.92H2692.77a3.83,3.83,0,0,0-3.83,3.83v57.24H2803.1a1.27,1.27,0,0,1,1.23,1.63l-16,54.92a1.28,1.28,0,0,1-1.22.92h-94.34a3.82,3.82,0,0,0-3.83,3.83v71.15h154.72a1.28,1.28,0,0,1,1.23,1.63l-16.34,56.27a1.27,1.27,0,0,1-1.22.92Z"/><path class="cls-2" d="M3006,375.59q70.07,0,107.34,25.15,37.28,24.69,37.27,77.22,0,32.79-15.27,53.44-14.82,20.19-43.11,31.87,9.43,11.68,19.76,26.94,10.34,14.82,20.21,31.43,10.32,16.17,19.76,34.13,8.93,16.58,16.65,32.75a1.28,1.28,0,0,1-1.16,1.82H3091.6a1.27,1.27,0,0,1-1.11-.65q-8.37-15-17.15-30.33-8.53-15.72-18-30.53-9-14.82-18-27.84a286.92,286.92,0,0,0-18-24.25h-30.76a3.83,3.83,0,0,0-3.82,3.83V686.51a3.83,3.83,0,0,1-3.83,3.83h-66.23V386.82a3.8,3.8,0,0,1,3.09-3.74,400,400,0,0,1,44.06-5.69Q2986.67,375.59,3006,375.59Zm4.05,59.72q-7.64,0-13.93.45-4,.3-7.71.61a3.82,3.82,0,0,0-3.51,3.81v80.89h19.76q39.51,0,56.58-9.88t17.07-33.67q0-22.9-17.52-32.33Q3043.71,435.31,3010,435.31Z"/><path class="cls-3" d="M307.26,310a1.79,1.79,0,0,0-1.5,2.75l89.7,140.38a14.19,14.19,0,0,0,12,6.58H528.38c39.92,0,64.87,35.28,64.72,74.79s-26.74,74.44-64.72,74.44H404.77a4.71,4.71,0,0,0-4.71,4.75V754.25a4.72,4.72,0,0,0,4.72,4.75H560.62C689.12,759,753,637.1,753.09,534.5S690,310,560.62,310ZM367,609.29H336.16C318.4,609.29,304,626,304,646.71V757.66a1.28,1.28,0,0,0,1.28,1.28h30.88c17.76,0,32.15-16.75,32.15-37.41v-111A1.27,1.27,0,0,0,367,609.29Z"/></svg>

After

Width:  |  Height:  |  Size: 4.4 KiB

59
.github/sponsors/oss-logo.svg vendored Normal file
View File

@@ -0,0 +1,59 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 25.2.1, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
viewBox="0 0 646.6 105.7" style="enable-background:new 0 0 646.6 105.7;" xml:space="preserve">
<style type="text/css">
.st0{fill:#104366;}
.st1{fill:#4086C6;}
</style>
<g>
<path class="st0" d="M21.1,79.8c-6.6-3.5-11.7-8.4-15.5-14.6C1.9,59,0,52,0,44.3c0-7.8,1.9-14.7,5.6-20.9
c3.7-6.2,8.9-11.1,15.5-14.6c6.6-3.5,14-5.3,22.2-5.3c8.2,0,15.6,1.8,22.1,5.3c6.6,3.5,11.7,8.4,15.5,14.6
c3.8,6.2,5.6,13.2,5.6,20.9c0,7.8-1.9,14.7-5.6,20.9c-3.8,6.2-8.9,11.1-15.5,14.6c-6.5,3.5-13.9,5.3-22.1,5.3
C35,85.1,27.6,83.4,21.1,79.8z M55.9,66.3c3.8-2.1,6.7-5.1,8.9-9c2.1-3.8,3.2-8.2,3.2-13.1c0-4.9-1.1-9.3-3.2-13.1
c-2.1-3.8-5.1-6.8-8.9-9c-3.8-2.1-8-3.2-12.6-3.2c-4.7,0-8.9,1.1-12.6,3.2s-6.7,5.1-8.9,9c-2.1,3.8-3.2,8.2-3.2,13.1
c0,4.9,1.1,9.3,3.2,13.1c2.1,3.8,5.1,6.8,8.9,9c3.8,2.1,8,3.2,12.6,3.2C47.9,69.5,52.1,68.5,55.9,66.3z"/>
<path class="st0" d="M108.1,82.6c-5.8-1.7-10.5-3.9-14.1-6.6l6.2-13.8c3.4,2.5,7.4,4.5,12.1,6c4.7,1.5,9.3,2.3,14,2.3
c5.2,0,9-0.8,11.5-2.3c2.5-1.5,3.7-3.6,3.7-6.2c0-1.9-0.7-3.4-2.2-4.7c-1.5-1.2-3.3-2.2-5.6-3c-2.3-0.8-5.4-1.6-9.3-2.5
c-6-1.4-11-2.9-14.8-4.3c-3.8-1.4-7.1-3.7-9.9-6.9c-2.7-3.2-4.1-7.4-4.1-12.6c0-4.6,1.2-8.7,3.7-12.5c2.5-3.7,6.2-6.7,11.2-8.9
c5-2.2,11.1-3.3,18.3-3.3c5,0,10,0.6,14.8,1.8c4.8,1.2,9,2.9,12.6,5.2l-5.6,13.9c-7.3-4.1-14.6-6.2-21.9-6.2
c-5.1,0-8.9,0.8-11.3,2.5c-2.4,1.7-3.7,3.8-3.7,6.5c0,2.7,1.4,4.7,4.2,6c2.8,1.3,7.1,2.6,12.9,3.9c6,1.4,11,2.9,14.8,4.3
c3.8,1.4,7.1,3.7,9.9,6.8c2.7,3.1,4.1,7.3,4.1,12.5c0,4.5-1.3,8.6-3.8,12.4c-2.5,3.7-6.3,6.7-11.3,8.9c-5,2.2-11.2,3.3-18.4,3.3
C120,85.1,113.9,84.3,108.1,82.6z"/>
<path class="st0" d="M180.1,82.6c-5.8-1.7-10.5-3.9-14.1-6.6l6.2-13.8c3.4,2.5,7.4,4.5,12.1,6c4.7,1.5,9.3,2.3,14,2.3
c5.2,0,9-0.8,11.5-2.3c2.5-1.5,3.7-3.6,3.7-6.2c0-1.9-0.7-3.4-2.2-4.7c-1.5-1.2-3.3-2.2-5.6-3c-2.3-0.8-5.4-1.6-9.3-2.5
c-6-1.4-10.9-2.9-14.8-4.3c-3.8-1.4-7.1-3.7-9.9-6.9c-2.7-3.2-4.1-7.4-4.1-12.6c0-4.6,1.2-8.7,3.7-12.5c2.5-3.7,6.2-6.7,11.2-8.9
s11.1-3.3,18.3-3.3c5,0,10,0.6,14.8,1.8c4.8,1.2,9,2.9,12.6,5.2l-5.6,13.9c-7.3-4.1-14.6-6.2-21.9-6.2c-5.1,0-8.9,0.8-11.3,2.5
c-2.4,1.7-3.7,3.8-3.7,6.5c0,2.7,1.4,4.7,4.2,6c2.8,1.3,7.1,2.6,12.9,3.9c6,1.4,10.9,2.9,14.8,4.3s7.1,3.7,9.9,6.8
c2.7,3.1,4.1,7.3,4.1,12.5c0,4.5-1.3,8.6-3.8,12.4c-2.5,3.7-6.3,6.7-11.3,8.9c-5,2.2-11.2,3.3-18.4,3.3
C192,85.1,186,84.3,180.1,82.6z"/>
<path class="st1" d="M293.2,79.1c-6.2-3.5-11.1-8.2-14.7-14.3c-3.6-6.1-5.4-12.9-5.4-20.5c0-7.6,1.8-14.5,5.4-20.5
c3.6-6.1,8.5-10.9,14.7-14.3c6.2-3.5,13.2-5.2,20.9-5.2c5.7,0,11,0.9,15.8,2.8c4.8,1.8,8.9,4.6,12.3,8.2l-3.6,3.7
c-6.3-6.2-14.4-9.4-24.3-9.4c-6.6,0-12.6,1.5-18.1,4.5c-5.4,3-9.7,7.2-12.8,12.5s-4.6,11.2-4.6,17.8s1.5,12.5,4.6,17.8
c3.1,5.3,7.3,9.5,12.8,12.5c5.4,3,11.4,4.5,18.1,4.5c9.8,0,17.9-3.2,24.3-9.5l3.6,3.7c-3.4,3.6-7.5,6.4-12.4,8.2
c-4.9,1.9-10.1,2.8-15.7,2.8C306.3,84.3,299.4,82.6,293.2,79.1z"/>
<path class="st1" d="M395.4,30c3.9,3.7,5.9,9.2,5.9,16.4v37.4h-5.4V73.3c-1.9,3.5-4.6,6.2-8.2,8.1c-3.6,1.9-7.9,2.9-13,2.9
c-6.5,0-11.7-1.5-15.5-4.6c-3.8-3.1-5.7-7.1-5.7-12.2c0-4.9,1.8-8.9,5.2-11.9c3.5-3,9.1-4.6,16.8-4.6h20.2v-4.7
c0-5.5-1.5-9.7-4.5-12.5c-3-2.9-7.3-4.3-13-4.3c-3.9,0-7.7,0.7-11.2,2c-3.6,1.4-6.6,3.2-9.1,5.4l-2.8-4.1c2.9-2.6,6.5-4.7,10.6-6.2
c4.1-1.5,8.5-2.2,13-2.2C385.9,24.4,391.5,26.3,395.4,30z M387.9,76.2c3.4-2.3,6-5.5,7.7-9.8V55.3h-20.1c-5.8,0-10,1.1-12.6,3.2
c-2.6,2.1-3.9,5-3.9,8.7c0,3.8,1.4,6.9,4.3,9.1c2.9,2.2,6.9,3.3,12.1,3.3C380.3,79.6,384.5,78.5,387.9,76.2z"/>
<path class="st1" d="M469,28.2c4.4,2.6,7.9,6.1,10.4,10.6c2.5,4.5,3.8,9.7,3.8,15.5c0,5.8-1.3,11-3.8,15.5
c-2.5,4.6-6,8.1-10.4,10.6c-4.4,2.5-9.4,3.8-14.9,3.8c-5.2,0-9.9-1.2-14.1-3.7c-4.2-2.4-7.5-5.9-9.8-10.2v35.3h-5.6V24.8h5.4v13.9
c2.3-4.5,5.6-8,9.9-10.6c4.2-2.5,9-3.8,14.3-3.8C459.6,24.4,464.6,25.7,469,28.2z M465.9,76c3.6-2.1,6.5-5,8.5-8.8
c2.1-3.8,3.1-8.1,3.1-12.9c0-4.8-1-9.1-3.1-12.9c-2.1-3.8-4.9-6.7-8.5-8.8c-3.6-2.1-7.7-3.2-12.2-3.2c-4.5,0-8.6,1.1-12.1,3.2
c-3.6,2.1-6.4,5-8.5,8.8c-2.1,3.8-3.1,8.1-3.1,12.9c0,4.8,1,9.1,3.1,12.9c2.1,3.8,4.9,6.7,8.5,8.8c3.6,2.1,7.6,3.2,12.1,3.2
C458.3,79.1,462.3,78.1,465.9,76z"/>
<path class="st1" d="M500.3,9.2c-0.9-0.9-1.4-1.9-1.4-3.2c0-1.3,0.5-2.4,1.4-3.3c0.9-0.9,2-1.4,3.3-1.4c1.3,0,2.4,0.4,3.3,1.3
c0.9,0.9,1.4,1.9,1.4,3.2c0,1.3-0.5,2.4-1.4,3.3c-0.9,0.9-2,1.4-3.3,1.4C502.3,10.5,501.2,10.1,500.3,9.2z M500.7,24.8h5.6v58.9
h-5.6V24.8z"/>
<path class="st1" d="M559.4,80c-1.4,1.4-3.2,2.4-5.4,3.1c-2.1,0.7-4.4,1.1-6.7,1.1c-5.1,0-9.1-1.4-11.9-4.2
c-2.8-2.8-4.2-6.8-4.2-11.8V29.7h-10.8v-4.9h10.8V12h5.6v12.9h18.7v4.9H537v37.9c0,3.8,0.9,6.8,2.8,8.8c1.8,2,4.6,3,8.2,3
c3.7,0,6.7-1.1,9.1-3.3L559.4,80z"/>
<path class="st1" d="M611.8,30c3.9,3.7,5.9,9.2,5.9,16.4v37.4h-5.4V73.3c-1.9,3.5-4.6,6.2-8.2,8.1c-3.6,1.9-7.9,2.9-13,2.9
c-6.5,0-11.7-1.5-15.5-4.6c-3.8-3.1-5.7-7.1-5.7-12.2c0-4.9,1.8-8.9,5.2-11.9c3.5-3,9.1-4.6,16.8-4.6H612v-4.7
c0-5.5-1.5-9.7-4.5-12.5c-3-2.9-7.3-4.3-13-4.3c-3.9,0-7.7,0.7-11.2,2c-3.6,1.4-6.6,3.2-9.1,5.4l-2.8-4.1c2.9-2.6,6.5-4.7,10.6-6.2
c4.1-1.5,8.5-2.2,13-2.2C602.3,24.4,607.9,26.3,611.8,30z M604.3,76.2c3.4-2.3,6-5.5,7.7-9.8V55.3h-20.1c-5.8,0-10,1.1-12.6,3.2
c-2.6,2.1-3.9,5-3.9,8.7c0,3.8,1.4,6.9,4.3,9.1c2.9,2.2,6.9,3.3,12.1,3.3C596.7,79.6,600.9,78.5,604.3,76.2z"/>
<path class="st1" d="M640.9,0h5.6v83.8h-5.6V0z"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 5.4 KiB

View File

@@ -0,0 +1,11 @@
<svg width="1354" height="420" viewBox="0 0 1354 420" fill="none" xmlns="http://www.w3.org/2000/svg">
<rect width="1354" height="420" rx="20" fill="white"/>
<path d="M434.751 133.122H466.637L489.595 227.729C493.852 245.585 494.697 256.219 494.697 256.219H495.128C495.128 256.219 496.61 245.808 500.867 227.729L522.757 133.122H558.9L582.066 227.729C586.53 246.223 587.598 256.219 587.598 256.219H588.236C588.236 256.219 588.666 246.223 592.907 227.729L615.02 133.122H646.907L606.523 288.313H571.017L546.576 194.344C541.474 173.936 541.044 164.801 541.044 164.801H540.614C540.614 164.801 540.183 173.936 535.512 194.344L512.553 288.313H475.996L434.751 133.122Z" fill="black"/>
<path d="M641.583 231.934C641.583 196.428 664.541 173.47 699.202 173.47C733.639 173.47 756.597 196.428 756.597 231.934C756.597 267.647 733.639 290.828 699.202 290.828C664.557 290.812 641.583 267.647 641.583 231.934ZM726.832 231.934C726.832 208.976 715.783 195.998 699.202 195.998C681.346 195.998 671.349 210.458 671.349 231.934C671.349 255.323 682.398 268.284 699.202 268.284C717.058 268.284 726.832 253.824 726.832 231.934Z" fill="black"/>
<path d="M770.836 175.21H799.103V196.048H799.741C804.635 185.207 816.322 174.365 836.299 174.365C839.695 174.365 841.831 174.796 843.314 175.21V203.478H842.469C842.469 203.478 839.918 202.633 832.903 202.633C811.013 202.633 799.103 215.594 799.103 239.828V288.295H770.836V175.21Z" fill="black"/>
<path d="M856.5 133.122H884.767V182.865C884.767 212.2 884.336 217.509 884.336 217.509H884.767L926.857 175.212H962.139L912.843 224.11L970.031 288.313H936.646L895.401 241.536L884.767 251.946V288.297H856.5V133.122Z" fill="black"/>
<path d="M970.444 211.285C970.444 163.455 1000.21 131.569 1044.85 131.569C1089.49 131.569 1119.26 163.455 1119.26 211.285C1119.26 259.114 1089.49 291.001 1044.85 291.001C1000.21 291.001 970.444 259.114 970.444 211.285ZM1088.42 211.285C1088.42 178.761 1071 156.855 1044.84 156.855C1018.67 156.855 1001.26 178.761 1001.26 211.285C1001.26 243.809 1018.69 265.715 1044.84 265.715C1070.98 265.715 1088.42 243.809 1088.42 211.285Z" fill="black"/>
<path d="M1130.08 236.656H1162.4C1162.4 254.943 1174.95 265.146 1194.08 265.146C1210.23 265.146 1221.29 257.063 1221.29 245.584C1221.29 232.622 1212.79 229.21 1185.79 223.901C1161.12 219.007 1134.98 210.716 1134.98 178.399C1134.98 151.408 1157.93 131 1193.01 131C1229.57 131 1252.11 150.132 1252.11 179.037H1219.79C1219.79 165.007 1208.95 156.286 1193.01 156.286C1176.86 156.286 1166.86 164.146 1166.86 175.625C1166.86 187.742 1173.88 192.413 1195.56 196.878C1227.65 203.685 1254.02 207.288 1254.02 243.001C1254.02 271.3 1229.36 290.432 1193.01 290.432C1156.02 290.432 1130.08 268.957 1130.08 236.656Z" fill="black"/>
<path d="M100 210C100 214.824 101.269 219.647 103.723 223.793L148.231 300.878C152.8 308.747 159.739 315.178 168.369 318.055C185.377 323.724 202.977 316.447 211.354 301.893L222.1 283.278L179.708 210L224.47 132.408L235.216 113.792C238.431 108.208 242.747 103.638 247.824 100H243.17H178.777C166.677 100 155.508 106.431 149.5 116.923L103.723 196.208C101.269 200.354 100 205.177 100 210Z" fill="#6363F1"/>
<path d="M353.847 210C353.847 205.177 352.578 200.353 350.124 196.207L305.024 118.107C296.647 103.638 279.047 96.3608 262.039 101.945C253.409 104.822 246.47 111.253 241.901 119.122L231.747 136.638L274.139 210L229.378 287.592L218.632 306.208C215.416 311.708 211.101 316.362 206.024 320H210.678H275.07C287.17 320 298.34 313.569 304.347 303.077L350.124 223.792C352.578 219.646 353.847 214.823 353.847 210Z" fill="#6363F1"/>
</svg>

After

Width:  |  Height:  |  Size: 3.4 KiB

View File

@@ -1,21 +0,0 @@
name: Sends Daily AWS Costs to Slack
on:
# Allow manual Run
workflow_dispatch:
# Run at 7:00 UTC every day
schedule:
- cron: "0 7 * * *"
jobs:
aws_costs:
runs-on: ubuntu-latest
steps:
- name: Get Costs
env:
AWS_KEY: ${{ secrets.COST_AWS_ACCESS_KEY }}
AWS_SECRET: ${{ secrets.COST_AWS_SECRET_KEY }}
AWS_REGION: ${{ secrets.COST_AWS_REGION }}
SLACK_CHANNEL: ${{ secrets.SLACK_COST_CHANNEL }}
SLACK_TOKEN: ${{ secrets.SLACK_TOKEN }}
run: |
npm install -g aws-cost-cli
aws-cost -k $AWS_KEY -s $AWS_SECRET -r $AWS_REGION -S $SLACK_TOKEN -C $SLACK_CHANNEL

View File

@@ -1,50 +0,0 @@
name: Close PRs with Feedback
on:
workflow_dispatch:
schedule:
- cron: '0 0 * * *'
jobs:
close-pr:
runs-on: ubuntu-latest
steps:
- name: Close PR if it has label "feedback left" and no changes in 7 days
uses: actions/github-script@v3
with:
github-token: ${{ secrets.GITHUB_TOKEN }}
script: |
const { data: pullRequests } = await github.pulls.list({
owner: context.repo.owner,
repo: context.repo.repo,
state: 'open',
base: 'master',
});
for (const pullRequest of pullRequests) {
const { data: labels } = await github.issues.listLabelsOnIssue({
owner: context.repo.owner,
repo: context.repo.repo,
issue_number: pullRequest.number,
});
const feedbackLabel = labels.find((label) => label.name === 'feedback left');
if (feedbackLabel) {
const lastUpdated = new Date(pullRequest.updated_at);
const sevenDaysAgo = new Date();
sevenDaysAgo.setDate(sevenDaysAgo.getDate() - 7);
if (lastUpdated < sevenDaysAgo) {
await github.issues.createComment({
owner: context.repo.owner,
repo: context.repo.repo,
issue_number: pullRequest.number,
body: 'Closing this PR because there has been no activity for the past 7 days. Feel free to reopen if you have any feedback.',
});
await github.pulls.update({
owner: context.repo.owner,
repo: context.repo.repo,
pull_number: pullRequest.number,
state: 'closed',
});
}
}
}

View File

@@ -1,16 +0,0 @@
name: Clears API Cloudfront Cache
on:
workflow_dispatch:
jobs:
aws_costs:
runs-on: ubuntu-latest
steps:
- name: Clear Cloudfront Caching
run: |
curl -L \
-X POST \
-H "Accept: application/vnd.github+json" \
-H "Authorization: Bearer ${{ secrets.GH_PAT }}" \
-H "X-GitHub-Api-Version: 2022-11-28" \
https://api.github.com/repos/roadmapsh/infra-ansible/actions/workflows/playbook.yml/dispatches \
-d '{ "ref":"master", "inputs": { "playbook": "roadmap_web.yml", "tags": "cloudfront-api", "is_verbose": false } }'

View File

@@ -1,16 +0,0 @@
name: Clears Frontend Cloudfront Cache
on:
workflow_dispatch:
jobs:
aws_costs:
runs-on: ubuntu-latest
steps:
- name: Clear Cloudfront Caching
run: |
curl -L \
-X POST \
-H "Accept: application/vnd.github+json" \
-H "Authorization: Bearer ${{ secrets.GH_PAT }}" \
-H "X-GitHub-Api-Version: 2022-11-28" \
https://api.github.com/repos/roadmapsh/infra-ansible/actions/workflows/playbook.yml/dispatches \
-d '{ "ref":"master", "inputs": { "playbook": "roadmap_web.yml", "tags": "cloudfront", "is_verbose": false } }'

30
.github/workflows/deploy.yml vendored Normal file
View File

@@ -0,0 +1,30 @@
name: Deployment to GH Pages
on:
push:
branches: [ master ]
env:
ROADMAP_GA_SECRET: ${{ secrets.GA_SECRET }}
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
CI: true
NEXT_TELEMETRY_DISABLED: 1
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- uses: actions/setup-node@v1
with:
node-version: 14
- name: Setup Environment
run: |
npm install
- name: Generate meta and build
run: |
npm run meta
npm run build
- name: Deploy to GH Pages
run: |
git config user.email "kamranahmed.se@gmail.com"
git config user.name "Kamran Ahmed"
git remote set-url origin https://x-access-token:${GITHUB_TOKEN}@github.com/${GITHUB_REPOSITORY}.git
npm run deploy

View File

@@ -1,75 +0,0 @@
name: Deploy to EC2
on:
workflow_dispatch:
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- name: Checkout Repository
uses: actions/checkout@v4
with:
fetch-depth: 2
- uses: actions/setup-node@v4
with:
node-version: 20
- uses: pnpm/action-setup@v4.0.0
with:
version: 9
# -------------------
# Setup configuration
# -------------------
- name: Prepare configuration files
run: |
git clone https://${{ secrets.GH_PAT }}@github.com/roadmapsh/infra-config.git configuration --depth 1
- name: Copy configuration files
run: |
cp configuration/dist/github/developer-roadmap.env .env
# -----------------
# Prepare the Build
# -----------------
- name: Install Dependencies
run: |
pnpm install
- name: Generate Production Build
run: |
git clone https://${{ secrets.GH_PAT }}@github.com/roadmapsh/web-draw.git .temp/web-draw --depth 1
npm run generate-renderer
npm run compress:images
npm run build
# --------------------
# Deploy to EC2
# --------------------
- uses: webfactory/ssh-agent@v0.7.0
with:
ssh-private-key: ${{ secrets.EC2_PRIVATE_KEY }}
- name: Deploy Application to EC2
run: |
rsync -apvz --delete --no-times --exclude "configuration" -e "ssh -o StrictHostKeyChecking=no" -p ./ ${{ secrets.EC2_USERNAME }}@${{ secrets.EC2_HOST }}:/var/www/roadmap.sh/
- name: Restart PM2
uses: appleboy/ssh-action@master
with:
host: ${{ secrets.EC2_HOST }}
username: ${{ secrets.EC2_USERNAME }}
key: ${{ secrets.EC2_PRIVATE_KEY }}
script: |
cd /var/www/roadmap.sh
sudo pm2 restart web-roadmap
# ----------------------
# Clear cloudfront cache
# ----------------------
- name: Clear Cloudfront Caching
run: |
curl -L \
-X POST \
-H "Accept: application/vnd.github+json" \
-H "Authorization: Bearer ${{ secrets.GH_PAT }}" \
-H "X-GitHub-Api-Version: 2022-11-28" \
https://api.github.com/repos/roadmapsh/infra-ansible/actions/workflows/playbook.yml/dispatches \
-d '{ "ref":"master", "inputs": { "playbook": "roadmap_web.yml", "tags": "cloudfront", "is_verbose": false } }'

View File

@@ -1,40 +0,0 @@
name: Label Issue
on:
issues:
types: [ opened, edited ]
jobs:
label-topic-change-issue:
runs-on: ubuntu-latest
steps:
- name: Add Labels To Issue
uses: actions/github-script@v7
with:
github-token: ${{ secrets.GITHUB_TOKEN }}
script: |
const issue = context.payload.issue;
const roadmapUrl = issue.body.match(/https?:\/\/roadmap.sh\/[^ ]+/);
// if the issue is labeled as a topic-change, add the roadmap slug as a label
if (issue.labels.some(label => label.name === 'topic-change')) {
if (roadmapUrl) {
const roadmapSlug = new URL(roadmapUrl[0]).pathname.replace(/\//, '');
github.rest.issues.addLabels({
owner: context.repo.owner,
repo: context.repo.repo,
issue_number: issue.number,
labels: [roadmapSlug]
});
}
// Close the issue if it has no roadmap URL
if (!roadmapUrl) {
github.rest.issues.update({
owner: context.repo.owner,
repo: context.repo.repo,
issue_number: issue.number,
state: 'closed'
});
}
}

View File

@@ -1,52 +0,0 @@
name: Refresh Roadmap Content JSON
on:
workflow_dispatch:
schedule:
- cron: '0 0 * * *'
jobs:
refresh-content:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Setup pnpm@v9
uses: pnpm/action-setup@v4
with:
version: 9
run_install: false
- name: Setup Node.js Version 20 (LTS)
uses: actions/setup-node@v4
with:
node-version: 20
cache: 'pnpm'
- name: Install Dependencies and Generate Content JSON
run: |
pnpm install
npm run generate:roadmap-content-json
- name: Create PR
uses: peter-evans/create-pull-request@v7
with:
delete-branch: false
branch: "chore/update-content-json"
base: "master"
labels: |
dependencies
automated pr
reviewers: kamranahmedse
commit-message: "chore: update roadmap content json"
title: "Updated Roadmap Content JSON - Automated"
body: |
## Updated Roadmap Content JSON
> [!IMPORTANT]
> This PR Updates the Roadmap Content JSON files stored in the `public` directory.
>
> Commit: ${{ github.sha }}
> Workflow Path: ${{ github.workflow_ref }}
**Please Review the Changes and Merge the PR if everything is fine.**

View File

@@ -1,51 +0,0 @@
name: Upgrade Dependencies
on:
workflow_dispatch:
schedule:
- cron: '0 0 * * 0'
jobs:
upgrade-deps:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Setup Node.js Version 20 (LTS)
uses: actions/setup-node@v4
with:
node-version: 20
- name: Setup pnpm@v9
uses: pnpm/action-setup@v4
with:
version: 9
- name: Install & Upgrade Dependencies
run: |
pnpm install
npm run upgrade
pnpm install --lockfile-only
- name: Create Pull Request
uses: peter-evans/create-pull-request@v7
with:
delete-branch: false
branch: "update-deps"
base: "master"
labels: |
dependencies
automated pr
reviewers: kamranahmedse
commit-message: "chore: update dependencies to latest"
title: "Upgrade Dependencies To Latest - Automated"
body: |
## Updated all Dependencies to Latest Versions.
> [!IMPORTANT]
> This PR Upgrades the Dependencies to the Latest Their Versions.
>
> Commit: ${{ github.sha }}
> Workflow Path: ${{ github.workflow_ref }}
**Please Review the Changes and Merge the PR if everything is fine.**

53
.gitignore vendored
View File

@@ -1,35 +1,36 @@
.idea
.temp
# build output
dist/
.output/
# See https://help.github.com/articles/ignoring-files/ for more about ignoring files.
out
# dependencies
node_modules/
/node_modules
/.pnp
.pnp.js
scripts/developer-roadmap
# testing
/coverage
# logs
# next.js
/.next/
/out/
# production
/build
# misc
.idea
.DS_Store
*.pem
# debug
npm-debug.log*
yarn-debug.log*
yarn-error.log*
pnpm-debug.log*
# local env files
.env.local
.env.development.local
.env.test.local
.env.production.local
# environment variables
.env
.env.production
# macOS-specific files
.DS_Store
/test-results/
/playwright-report/
/playwright/.cache/
tests-examples
*.csv
/editor/*
!/editor/readonly-editor.tsx
!/editor/renderer/renderer.ts
!/editor/renderer/index.tsx
# vercel
.vercel

2
.npmrc
View File

@@ -1,2 +0,0 @@
auto-install-peers=true
strict-peer-dependencies=false

View File

@@ -1,7 +0,0 @@
app-dist
dist
.idea
.github
public
node_modules
pnpm-lock.yaml

5
.prettierrc Normal file
View File

@@ -0,0 +1,5 @@
{
"semi": true,
"singleQuote": true,
"tabWidth": 2
}

View File

@@ -1,18 +0,0 @@
module.exports = {
semi: true,
singleQuote: true,
overrides: [
{
files: '*.astro',
options: {
parser: 'astro',
singleQuote: true,
jsxSingleQuote: true,
},
},
],
plugins: [
require.resolve('prettier-plugin-astro'),
'prettier-plugin-tailwindcss',
],
};

View File

@@ -1,4 +0,0 @@
{
"recommendations": ["astro-build.astro-vscode"],
"unwantedRecommendations": []
}

11
.vscode/launch.json vendored
View File

@@ -1,11 +0,0 @@
{
"version": "0.2.0",
"configurations": [
{
"command": "./node_modules/.bin/astro dev",
"name": "Development server",
"request": "launch",
"type": "node-terminal"
}
]
}

View File

@@ -1,6 +0,0 @@
{
"prettier.documentSelectors": ["**/*.astro"],
"[astro]": {
"editor.defaultFormatter": "esbenp.prettier-vscode"
}
}

View File

@@ -1,60 +0,0 @@
// https://astro.build/config
import sitemap from '@astrojs/sitemap';
import tailwind from '@astrojs/tailwind';
import node from '@astrojs/node';
import { defineConfig } from 'astro/config';
import rehypeExternalLinks from 'rehype-external-links';
import { serializeSitemap, shouldIndexPage } from './sitemap.mjs';
import react from '@astrojs/react';
// https://astro.build/config
export default defineConfig({
site: 'https://roadmap.sh/',
markdown: {
shikiConfig: {
theme: 'dracula',
},
rehypePlugins: [
[
rehypeExternalLinks,
{
target: '_blank',
rel: function (element) {
const href = element.properties.href;
const whiteListedStarts = [
'/',
'#',
'mailto:',
'https://github.com/kamranahmedse',
'https://thenewstack.io',
'https://kamranahmed.info',
'https://roadmap.sh',
];
if (whiteListedStarts.some((start) => href.startsWith(start))) {
return [];
}
return 'noopener noreferrer nofollow';
},
},
],
],
},
output: 'hybrid',
adapter: node({
mode: 'standalone',
}),
trailingSlash: 'never',
integrations: [
tailwind({
config: {
applyBaseStyles: false,
},
}),
sitemap({
filter: shouldIndexPage,
serialize: serializeSitemap,
}),
react(),
],
});

View File

@@ -14,21 +14,21 @@ appearance, race, religion, or sexual identity and orientation.
Examples of behavior that contributes to creating a positive environment
include:
- Using welcoming and inclusive language
- Being respectful of differing viewpoints and experiences
- Gracefully accepting constructive criticism
- Focusing on what is best for the community
- Showing empathy towards other community members
* Using welcoming and inclusive language
* Being respectful of differing viewpoints and experiences
* Gracefully accepting constructive criticism
* Focusing on what is best for the community
* Showing empathy towards other community members
Examples of unacceptable behavior by participants include:
- The use of sexualized language or imagery and unwelcome sexual attention or
* The use of sexualized language or imagery and unwelcome sexual attention or
advances
- Trolling, insulting/derogatory comments, and personal or political attacks
- Public or private harassment
- Publishing others' private information, such as a physical or electronic
* Trolling, insulting/derogatory comments, and personal or political attacks
* Public or private harassment
* Publishing others' private information, such as a physical or electronic
address, without explicit permission
- Other conduct which could reasonably be considered inappropriate in a
* Other conduct which could reasonably be considered inappropriate in a
professional setting
## Our Responsibilities

View File

@@ -0,0 +1,60 @@
import { Box, Container, Flex, Heading, Image, Link, Text } from '@chakra-ui/react';
import React from 'react';
type ContentPageHeaderProps = {
formattedDate: string;
title: string;
subtitle: string;
author?: {
name: string;
twitter: string;
picture: string;
},
subLink?: {
text: string;
url: string;
}
};
export function ContentPageHeader(props: ContentPageHeaderProps) {
const { title, subtitle, author = null, formattedDate, subLink = null } = props;
return (
<Box pt={['35px', '35px', '70px']} pb={['35px', '35px', '55px']} borderBottomWidth={1} mb='30px'>
<Container maxW='container.md' position='relative' textAlign={['left', 'left', 'center']}>
<Flex alignItems='center' justifyContent={['flex-start', 'flex-start', 'center']}
fontSize={['12px', '12px', '14px']}>
{author?.name && (
<>
<Link
d={['none', 'flex', 'flex']}
target='_blank'
href={`https://twitter.com/${author.twitter}`}
alignItems='center'
fontWeight={600}
color='gray.500'
>
<Image alt={''} rounded={'full'} mr='7px' w='22px' src={author.picture} />
{author.name}
</Link>
<Text d={['none', 'inline', 'inline']} mx='7px' color='gray.500' as='span'>&middot;</Text>
</>
)}
<Text color='gray.500' as='span'>{formattedDate}</Text>
{subLink?.text && (
<>
<Text d={['none', 'none', 'inline']} mx='7px' color='gray.500' as='span'>&middot;</Text>
<Link d={['none', 'none', 'inline']} color='blue.500' fontWeight={500}
href={subLink.url} target={'_blank'}>{subLink.text}</Link>
</>
)}
</Flex>
<Heading as='h1' color='black' fontSize={['30px', '30px', '45px']} lineHeight={['40px', '40px', '53px']}
fontWeight={700} my={['5px', '5px', '10px']}>{title}</Heading>
<Text fontSize={['14px', '14px', '16px']} color='gray.700'>{subtitle}</Text>
</Container>
</Box>
);
}

37
components/custom-ad.tsx Normal file
View File

@@ -0,0 +1,37 @@
export const CustomAd = () => {
return (
<div id='carbonads'>
<span>
<span className='carbon-wrap'>
<a
href='https://freemote.com/strategy?sl=roadmap'
className='carbon-img'
target='_blank'
>
<img
src='/fm-img.png'
alt='Custom Logo'
height='100'
width='130'
style={{ maxWidth: '130px', border: 'none' }}
/>
</a>
<a
href='https://freemote.com/strategy?sl=roadmap'
className='carbon-text'
target='_blank'
>
He Went from ZERO TO $74,000 as a Full Time Developer in 7 Weeks
</a>
</span>
<a
href='https://github.com/sponsors/kamranahmedse'
className='carbon-poweredby'
target='_blank'
>
Sponsored by
</a>
</span>
</div>
);
};

View File

@@ -0,0 +1,46 @@
import { Box, Link, Text } from '@chakra-ui/react';
type DimmedMoreProps = {
text: string;
href: string;
};
export function DimmedMore(props: DimmedMoreProps) {
const { text, href } = props;
return (
<Box position='relative' textAlign='center' bottom='20px'>
<Box
opacity={1}
pointerEvents='none'
position='absolute'
bottom={0}
height='200px'
width='100%'
background='linear-gradient(180deg, rgb(255 255 255 / 40%), white)'
/>
<Link
rounded='20px'
display='inline'
bg='green.600'
color='white'
p='7px 20px'
href={href}
fontWeight={800}
fontSize='11px'
textTransform='uppercase'
my='25px'
position='relative'
_hover={{
textDecoration: 'none',
'& .forward-arrow': {
transform: 'translateX(3px)'
}
}}>
{text}
<Text d='inline-block' as='span' transition='200ms' ml='4px' className='forward-arrow'>&rarr;</Text>
</Link>
</Box>
);
}

67
components/footer.tsx Normal file
View File

@@ -0,0 +1,67 @@
import { Box, Container, Flex, Image, Link, Stack, Text } from '@chakra-ui/react';
import siteConfig from '../content/site.json';
import { CustomAd } from './custom-ad';
function NavigationLinks() {
return (
<>
<Stack isInline d={['none', 'none', 'flex']} color='gray.400' fontWeight={600} spacing='30px'>
<Link _hover={{ color: 'white' }} href='/roadmaps'>Roadmaps</Link>
<Link _hover={{ color: 'white' }} href='/guides'>Guides</Link>
<Link _hover={{ color: 'white' }} href='/watch'>Videos</Link>
<Link _hover={{ color: 'white' }} href='/about'>About</Link>
<Link _hover={{ color: 'white' }} href={siteConfig.url.youtube} target='_blank'>YouTube</Link>
</Stack>
<Stack d={['flex', 'flex', 'none']} color='gray.400' fontWeight={600} spacing={0}>
<Link py='7px' borderBottomWidth={1} borderBottomColor='gray.800' _hover={{ color: 'white' }}
href='/roadmaps'>Roadmaps</Link>
<Link py='7px' borderBottomWidth={1} borderBottomColor='gray.800' _hover={{ color: 'white' }}
href='/guides'>Guides</Link>
<Link py='7px' borderBottomWidth={1} borderBottomColor='gray.800' _hover={{ color: 'white' }}
href='/watch'>Videos</Link>
<Link py='7px' borderBottomWidth={1} borderBottomColor='gray.800' _hover={{ color: 'white' }}
href='/about'>About</Link>
<Link py='7px' _hover={{ color: 'white' }} target='_blank'
href={siteConfig.url.youtube}>YouTube</Link>
</Stack>
</>
);
}
export function Footer() {
return (
<Box bg='brand.hero' p={['25px 0', '25px 0', '40px 0']}>
<Container maxW='container.md'>
<NavigationLinks />
<Box mt={['40px', '40px', '50px']} mb='40px' maxW='500px'>
<Flex spacing={0} alignItems='center' color='gray.400'>
<Link d='flex' alignItems='center' fontWeight={600} _hover={{ textDecoration: 'none', color: 'white' }}
href='/'>
<Image alt='' h='25px' w='25px' src='/logo.svg' mr='6px' />
roadmap.sh
</Link>
<Text as='span' mx='7px'>by</Text>
<Link bg='blue.500' px='6px' py='2px' rounded='4px' color='white' fontWeight={600} fontSize='13px'
_hover={{ textDecoration: 'none', bg: 'blue.600' }} href={siteConfig.url.twitter}
target='_blank'>@kamranahmedse</Link>
</Flex>
<Text my='15px' fontSize='14px' color='gray.500'>Community created roadmaps, articles, resources and
journeys to help you choose your path and grow in your career.</Text>
<Text fontSize='14px' color='gray.500'>
<Text as='span' mr='10px'>&copy; roadmap.sh</Text>&middot;
<Link href='/about' _hover={{ textDecoration: 'none', color: 'white' }} color='gray.400'
mx='10px'>FAQs</Link>&middot;
<Link href='/terms' _hover={{ textDecoration: 'none', color: 'white' }} color='gray.400'
mx='10px'>Terms</Link>&middot;
<Link href='/privacy' _hover={{ textDecoration: 'none', color: 'white' }} color='gray.400'
mx='10px'>Privacy</Link>
</Text>
</Box>
</Container>
</Box>
);
}

View File

@@ -0,0 +1,117 @@
import { useState } from 'react';
import { HamburgerIcon } from '@chakra-ui/icons';
import { Box, CloseButton, Container, Flex, IconButton, Image, Link, Stack, Text } from '@chakra-ui/react';
import RoadmapLogo from '../components/icons/roadmap.svg';
import siteConfig from '../content/site.json';
type MenuLinkProps = {
text: string;
link: string;
};
function MenuLink(props: MenuLinkProps) {
const { text, link } = props;
return <Link
borderBottomWidth={0}
borderBottomColor='gray.500'
_hover={{ textDecoration: 'none', borderBottomColor: 'white' }}
fontWeight={500}
href={link}
>
{text}
</Link>;
}
function DesktopMenuLinks() {
return (
<Stack d={['none', 'flex', 'flex']} shouldWrapChildren isInline spacing='15px' alignItems='center' color='gray.50'
fontSize='15px'>
<MenuLink text={'Roadmaps'} link={'/roadmaps'} />
<MenuLink text={'Guides'} link={'/guides'} />
<MenuLink text={'Videos'} link={'/watch'} />
<Link ml='10px' bgGradient='linear(to-l, yellow.700, red.600)' p='7px 10px' rounded='4px'
_hover={{ textDecoration: 'none', bgGradient: 'linear(to-l, red.800, yellow.700)' }}
fontWeight={500} href={'/signup'}>Subscribe</Link>
</Stack>
);
}
function MobileMenuLinks() {
const [isOpen, setIsOpen] = useState(false);
return (
<>
<IconButton
rounded='5px'
padding={0}
aria-label={'Menu'}
d={['block', 'none', 'none']}
icon={<HamburgerIcon color='white' w='25px' height='25px' />}
color='white'
cursor='pointer'
h='auto'
bg='transparent'
_hover={{ bg: 'transparent' }}
_active={{ bg: 'transparent' }}
_focus={{ bg: 'transparent' }}
onClick={() => setIsOpen(true)}
/>
{isOpen && (
<Stack color='gray.100'
fontSize={['22px', '22px', '22px', '32px']}
alignItems='center'
justifyContent='center'
pos='fixed'
left={0}
right={0}
bottom={0}
top={0}
bg='gray.900'
spacing='12px'
zIndex={999}
>
<Link href='/roadmaps'>Roadmaps</Link>
<Link href='/guides'>Guides</Link>
<Link href='/watch'>Videos</Link>
<Link href='/signup'>Subscribe</Link>
<CloseButton onClick={() => setIsOpen(false)} pos='fixed' top='40px' right='15px' size='lg' />
</Stack>
)}
</>
);
}
type GlobalHeaderProps = {
variant?: 'transparent' | 'solid'
};
export function GlobalHeader(props: GlobalHeaderProps) {
const { variant = 'solid' } = props;
return (
<Box bg={variant === 'solid' ? 'gray.900' : 'transparent'} p='20px 0'>
<Container maxW='container.md'>
<Flex justifyContent='space-between' alignItems='center'>
<Box>
<Link w='100%'
d='flex'
href='/'
alignItems='center'
color='white'
fontWeight={600}
_hover={{ textDecoration: 'none' }}
fontSize='18px'>
<RoadmapLogo style={{ height: '30px', width: '30px', marginRight: '10px' }} />
<Text d={['block', 'none', 'block']} as='span'>roadmap.sh</Text>
</Link>
</Box>
<DesktopMenuLinks />
<MobileMenuLinks />
</Flex>
</Container>
</Box>
);
}

View File

@@ -0,0 +1,31 @@
import { Badge, Box, Heading, Link, Text } from '@chakra-ui/react';
type GuideGridItemProps = {
title: string;
href: string;
subtitle: string;
date: string;
isNew?: boolean;
colorIndex?: number;
};
const bgColorList = [
'gray.700',
'purple.800'
];
export function GuideGridItem(props: GuideGridItemProps) {
const { title, subtitle, date, isNew = false, colorIndex = 0, href } = props;
return (
<Box _hover={{ textDecoration: 'none', transform: 'scale(1.02)' }} as={Link} href={href} shadow='xl' p='20px'
rounded='10px' bg={bgColorList[colorIndex] ?? bgColorList[0]} flex={1}>
<Text mb='10px' fontSize='13px' color='gray.400'>
{isNew && <Badge colorScheme={'yellow'} mr='10px'>New</Badge>}
{date}
</Text>
<Heading color='white' mb={'6px'} fontSize='20px'>{title}</Heading>
<Text color='gray.300' fontSize='14px'>{subtitle}</Text>
</Box>
);
}

165
components/helmet.tsx Normal file
View File

@@ -0,0 +1,165 @@
import NextHead from 'next/head';
import siteConfig from '../content/site.json';
import { RoadmapType } from '../lib/roadmap';
import { roadmapTheme } from '../styles/theme';
type HelmetProps = {
title?: string;
keywords?: string[];
canonical?: string;
description?: string;
roadmap?: RoadmapType;
};
function getRichSnippetJson(roadmap: RoadmapType) {
return {
'@context': 'https://schema.org',
'@type': 'Article',
mainEntityOfPage: {
'@type': 'WebPage',
'@id': `https://roadmap.sh/${roadmap.id}`,
},
headline: roadmap.seo.title,
description: roadmap.seo.description,
image: roadmap.jsonUrl
? `https://roadmap.sh/roadmaps/${roadmap.id}.png`
: undefined,
author: {
'@type': 'Person',
name: 'Kamran Ahmed',
url: 'https://twitter.com/kamranahmedse',
},
publisher: {
'@type': 'Organization',
name: 'roadmap.sh',
logo: {
'@type': 'ImageObject',
url: 'https://roadmap.sh/brand-square.png',
},
},
};
}
const Helmet = (props: HelmetProps) => {
const { roadmap, title, canonical, description, keywords } = props;
return (
<NextHead>
<meta charSet="UTF-8" />
<title>{title || siteConfig.title}</title>
<meta
name="description"
content={description || siteConfig.description}
/>
<meta name="author" content={siteConfig.author} />
<meta
name="keywords"
content={keywords ? keywords.join(',') : siteConfig.keywords.join(',')}
/>
<meta
name="viewport"
content="width=device-width, user-scalable=yes, initial-scale=1.0, maximum-scale=3.0, minimum-scale=1.0"
/>
{canonical && <link rel="canonical" href={canonical} />}
<meta httpEquiv="Content-Language" content="en" />
<meta property="og:title" content={title || siteConfig.title} />
<meta
property="og:description"
content={description || siteConfig.description}
/>
<meta
property="og:image"
content={`${siteConfig.url.web}${siteConfig.logoSquare}`}
/>
<meta property="og:url" content={siteConfig.url.web} />
<meta property="og:type" content="website" />
<meta
property="article:publisher"
content={`https://facebook.com/${siteConfig.facebook}`}
/>
<meta property="og:site_name" content={siteConfig.name} />
<meta property="article:author" content={siteConfig.author} />
<meta name="twitter:card" content="summary" />
<meta name="twitter:site" content={`@${siteConfig.twitter}`} />
<meta name="twitter:title" content={title || siteConfig.title} />
<meta
name="twitter:description"
content={description || siteConfig.description}
/>
<meta
name="twitter:image"
content={`${siteConfig.url.web}${siteConfig.logoSquare}`}
/>
<meta name="twitter:image:alt" content="roadmap.sh" />
<meta name="mobile-web-app-capable" content="yes" />
<meta name="apple-mobile-web-app-capable" content="yes" />
<meta
name="apple-mobile-web-app-status-bar-style"
content="black-translucent"
/>
<link
rel="apple-touch-icon"
sizes="180x180"
href="/manifest/apple-touch-icon.png"
/>
<meta name="msapplication-TileColor" content="#101010" />
<meta name="theme-color" content="#848a9a" />
<link rel="manifest" href="/manifest/manifest.json" />
<link
rel="icon"
type="image/png"
sizes="32x32"
href="/manifest/icon32.png"
/>
<link
rel="icon"
type="image/png"
sizes="16x16"
href="/manifest/icon16.png"
/>
<link
rel="shortcut icon"
href="/manifest/favicon.ico"
type="image/x-icon"
/>
<link rel="icon" href="/manifest/favicon.ico" type="image/x-icon" />
{roadmap?.id && (
<script
type="application/ld+json"
dangerouslySetInnerHTML={{
__html: JSON.stringify(getRichSnippetJson(roadmap)),
}}
/>
)}
{/* Global Site Tag (gtag.js) - Google Analytics */}
{process.env.GA_SECRET && (
<>
<script
async
src={`https://www.googletagmanager.com/gtag/js?id=${process.env.GA_SECRET}`}
/>
<script
dangerouslySetInnerHTML={{
__html: `
window.dataLayer = window.dataLayer || [];
function gtag(){dataLayer.push(arguments);}
gtag('js', new Date());
gtag('config', '${process.env.GA_SECRET}');
`,
}}
/>
</>
)}
</NextHead>
);
};
export default Helmet;

View File

@@ -0,0 +1,3 @@
<svg width="29" height="29">
<path d="M23.2 5H5.8a.8.8 0 0 0-.8.8V23.2c0 .44.35.8.8.8h9.3v-7.13h-2.38V13.9h2.38v-2.38c0-2.45 1.55-3.66 3.74-3.66 1.05 0 1.95.08 2.2.11v2.57h-1.5c-1.2 0-1.48.57-1.48 1.4v1.96h2.97l-.6 2.97h-2.37l.05 7.12h5.1a.8.8 0 0 0 .79-.8V5.8a.8.8 0 0 0-.8-.79"></path>
</svg>

After

Width:  |  Height:  |  Size: 298 B

View File

@@ -0,0 +1,3 @@
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="currentColor">
<path d="M12 0c-6.626 0-12 5.373-12 12 0 5.302 3.438 9.8 8.207 11.387.599.111.793-.261.793-.577v-2.234c-3.338.726-4.033-1.416-4.033-1.416-.546-1.387-1.333-1.756-1.333-1.756-1.089-.745.083-.729.083-.729 1.205.084 1.839 1.237 1.839 1.237 1.07 1.834 2.807 1.304 3.492.997.107-.775.418-1.305.762-1.604-2.665-.305-5.467-1.334-5.467-5.931 0-1.311.469-2.381 1.236-3.221-.124-.303-.535-1.524.117-3.176 0 0 1.008-.322 3.301 1.23.957-.266 1.983-.399 3.003-.404 1.02.005 2.047.138 3.006.404 2.291-1.552 3.297-1.23 3.297-1.23.653 1.653.242 2.874.118 3.176.77.84 1.235 1.911 1.235 3.221 0 4.609-2.807 5.624-5.479 5.921.43.372.823 1.102.823 2.222v3.293c0 .319.192.694.801.576 4.765-1.589 8.199-6.086 8.199-11.386 0-6.627-5.373-12-12-12z"/>
</svg>

After

Width:  |  Height:  |  Size: 841 B

View File

@@ -0,0 +1,4 @@
<svg viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true">
<path fill-rule="evenodd"
d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path>
</svg>

After

Width:  |  Height:  |  Size: 474 B

View File

@@ -0,0 +1,4 @@
<svg width="30" height="30" viewBox="0 0 283 283" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M0 39C0 17.4609 17.4609 0 39 0H244C265.539 0 283 17.4609 283 39V244C283 265.539 265.539 283 244 283H39C17.4609 283 0 265.539 0 244V39Z" fill="black"></path>
<path d="M121.215 210.72C119.348 211.28 116.361 211.84 112.255 212.4C108.335 212.96 104.228 213.24 99.9347 213.24C95.828 213.24 92.0947 212.96 88.7347 212.4C85.5614 211.84 82.8547 210.72 80.6147 209.04C78.3747 207.36 76.6014 205.12 75.2947 202.32C74.1747 199.333 73.6147 195.507 73.6147 190.84V106.84C73.6147 102.547 74.3614 98.9067 75.8547 95.92C77.5347 92.7467 79.868 89.9467 82.8547 87.52C85.8414 85.0933 89.4814 82.9467 93.7747 81.08C98.2547 79.0267 103.015 77.2533 108.055 75.76C113.095 74.2667 118.321 73.1467 123.735 72.4C129.148 71.4667 134.561 71 139.975 71C148.935 71 156.028 72.7733 161.255 76.32C166.481 79.68 169.095 85.28 169.095 93.12C169.095 95.7333 168.721 98.3467 167.975 100.96C167.228 103.387 166.295 105.627 165.175 107.68C161.255 107.68 157.241 107.867 153.135 108.24C149.028 108.613 145.015 109.173 141.095 109.92C137.175 110.667 133.441 111.507 129.895 112.44C126.535 113.187 123.641 114.12 121.215 115.24V210.72ZM166.387 188.32C166.387 180.48 168.813 173.947 173.667 168.72C178.52 163.493 185.147 160.88 193.547 160.88C201.947 160.88 208.573 163.493 213.427 168.72C218.28 173.947 220.707 180.48 220.707 188.32C220.707 196.16 218.28 202.693 213.427 207.92C208.573 213.147 201.947 215.76 193.547 215.76C185.147 215.76 178.52 213.147 173.667 207.92C168.813 202.693 166.387 196.16 166.387 188.32Z" fill="white"></path>
</svg>

After

Width:  |  Height:  |  Size: 1.6 KiB

View File

@@ -0,0 +1,3 @@
<svg width="29" height="29" fill="currentColor">
<path d="M22.05 7.54a4.47 4.47 0 0 0-3.3-1.46 4.53 4.53 0 0 0-4.53 4.53c0 .35.04.7.08 1.05A12.9 12.9 0 0 1 5 6.89a5.1 5.1 0 0 0-.65 2.26c.03 1.6.83 2.99 2.02 3.79a4.3 4.3 0 0 1-2.02-.57v.08a4.55 4.55 0 0 0 3.63 4.44c-.4.08-.8.13-1.21.16l-.81-.08a4.54 4.54 0 0 0 4.2 3.15 9.56 9.56 0 0 1-5.66 1.94l-1.05-.08c2 1.27 4.38 2.02 6.94 2.02 8.3 0 12.86-6.9 12.84-12.85.02-.24 0-.43 0-.65a8.68 8.68 0 0 0 2.26-2.34c-.82.38-1.7.62-2.6.72a4.37 4.37 0 0 0 1.95-2.51c-.84.53-1.81.9-2.83 1.13z"></path>
</svg>

After

Width:  |  Height:  |  Size: 550 B

View File

@@ -0,0 +1,21 @@
export function VideoIcon(props: any) {
return (
<svg
stroke='currentColor'
fill='currentColor'
strokeWidth='0'
viewBox='0 0 24 24'
height='1em'
width='1em'
xmlns='http://www.w3.org/2000/svg'
{...props}
>
<g>
<path fill='none' d='M0 0h24v24H0z' />
<path
d='M3 3.993C3 3.445 3.445 3 3.993 3h16.014c.548 0 .993.445.993.993v16.014a.994.994 0 0 1-.993.993H3.993A.994.994 0 0 1 3 20.007V3.993zm7.622 4.422a.4.4 0 0 0-.622.332v6.506a.4.4 0 0 0 .622.332l4.879-3.252a.4.4 0 0 0 0-.666l-4.88-3.252z'
/>
</g>
</svg>
);
}

View File

@@ -0,0 +1,3 @@
<svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill='currentColor'>
<path d="M19.615 3.184c-3.604-.246-11.631-.245-15.23 0-3.897.266-4.356 2.62-4.385 8.816.029 6.185.484 8.549 4.385 8.816 3.6.245 11.626.246 15.23 0 3.897-.266 4.356-2.62 4.385-8.816-.029-6.185-.484-8.549-4.385-8.816zm-10.615 12.816v-8l8 3.993-8 4.007z"/>
</svg>

After

Width:  |  Height:  |  Size: 369 B

View File

@@ -0,0 +1,58 @@
import React from 'react';
import { Badge, Flex, Link, Text } from '@chakra-ui/react';
type LinksListItemProps = {
href: string;
title: string;
subtitle: string;
badgeText?: string;
target?: string;
icon?: React.ReactChild;
hideSubtitleOnMobile?: boolean;
};
export function LinksListItem(props: LinksListItemProps) {
const { title, subtitle, badgeText, icon, hideSubtitleOnMobile = false, href, target } = props;
return (
<Link
target={target || '_self'}
href={href}
fontSize={['14px', '14px', '15px']}
py='9px'
d='flex'
flexDirection={['column', 'row', 'row']}
fontWeight={500}
color='gray.600'
alignItems={['flex-start', 'center']}
justifyContent={'space-between'}
sx={{
'@media (hover: none)': {
'&:hover': {
'& .list-item-title': {
transform: 'none'
}
}
}
}}
_hover={{
textDecoration: 'none',
color: 'blue.400',
'& .list-item-title': {
transform: 'translateX(10px)'
}
}}
isTruncated
maxWidth='100%'
>
<Flex alignItems='center' className='list-item-title' transition={'200ms'}>
{icon}
<Text maxWidth={'345px'} isTruncated as='span'>{title}</Text>
{badgeText &&
<Badge pos='relative' top='1px' variant='subtle' colorScheme='purple' ml='10px'>{badgeText}</Badge>}
</Flex>
<Text d={[hideSubtitleOnMobile ? 'none' : 'inline', 'inline']} mt={['3px', 0]} as='span'
fontSize={['11px', '11px', '12px']} color='gray.500'>{subtitle}</Text>
</Link>
);
}

21
components/links-list.tsx Normal file
View File

@@ -0,0 +1,21 @@
import React from 'react';
import { StackDivider, VStack } from '@chakra-ui/react';
type LinksListProps = {
children: React.ReactNode
};
export function LinksList(props: LinksListProps) {
const { children } = props;
return (
<VStack
rounded='5px'
divider={<StackDivider borderColor='gray.200' />}
spacing={0}
align='stretch'
>
{children}
</VStack>
);
}

View File

@@ -0,0 +1,20 @@
import React from 'react';
// @ts-ignore
import { MDXProvider } from '@mdx-js/react';
import { ChakraProvider } from '@chakra-ui/react';
import MdxComponents from './mdx-components';
import { roadmapTheme } from '../../styles/theme';
type MdRendererType = {
children: React.ReactNode
};
export default function MdRenderer(props: MdRendererType) {
return (
<ChakraProvider theme={roadmapTheme} resetCSS>
<MDXProvider components={MdxComponents}>
{props.children}
</MDXProvider>
</ChakraProvider>
);
};

View File

@@ -0,0 +1,37 @@
import React from 'react';
import styled from 'styled-components';
type EnrichedLinkProps = {
href: string;
children: React.ReactNode;
};
const Link = styled.a`
font-weight: 600;
text-decoration: underline;
`;
const EnrichedLink = (props: EnrichedLinkProps) => {
// Is external URL or is a media URL
const isExternalUrl = /(^http(s)?:\/\/)|(\.(png|svg|jpeg|jpg)$)/.test(
props.href
);
const linkProps: Record<string, string> = {
target: '_self',
...(isExternalUrl
? {
rel: 'nofollow',
target: '_blank',
}
: {}),
};
return (
<Link href={props.href} {...linkProps}>
{props.children}
</Link>
);
};
export default EnrichedLink;

View File

@@ -0,0 +1,53 @@
import React from 'react';
import { Link, Text, Badge } from '@chakra-ui/react';
type BadgeLinkType = {
target: string;
badgeText: string;
href: string;
colorScheme?: string;
children: React.ReactNode;
};
export function BadgeLink(props: BadgeLinkType) {
const {
target = '_blank',
colorScheme = 'purple',
badgeText,
href,
children,
} = props;
// Is external URL or is a media URL
const isExternalUrl = /(^http(s)?:\/\/)|(\.(png|svg|jpeg|jpg)$)/.test(
props.href
);
const linkProps: Record<string, string> = {
...(isExternalUrl
? {
rel: 'nofollow',
}
: {}),
};
return (
<Text mb={'0px'}>
<Link
fontSize="14px"
color="blue.700"
fontWeight={500}
textDecoration="none"
href={href}
target={target}
_hover={{ textDecoration: 'none', color: 'purple.400' }}
{...linkProps}
>
<Badge fontSize="11px" mr="7px" colorScheme={colorScheme}>
{badgeText}
</Badge>
{children}
</Link>
</Text>
);
}

View File

@@ -0,0 +1,27 @@
import styled from 'styled-components';
const BlockQuote = styled.blockquote`
padding: 16px 20px;
position: relative;
background: #e8e8e8;
border-radius: 5px;
margin-bottom: 18px;
h1, h2, h3, h4, h5, h6 {
margin-top: 0;
}
p + h4 {
margin-top: 15px;
}
p {
margin: 0;
& + p {
margin-top: 10px;
}
}
`;
export default BlockQuote;

View File

@@ -0,0 +1,10 @@
import React from 'react';
import { Code as ChakraCode } from '@chakra-ui/react';
type CodeType = {
children: React.ReactNode;
}
export default function Code(props: CodeType) {
return <ChakraCode bg='blue.500'>{props.children}</ChakraCode>;
}

View File

@@ -0,0 +1,81 @@
import React from 'react';
import styled from 'styled-components';
import LinkIcon from 'components/icons/link.svg';
const linkify = (Component: React.FunctionComponent<any>) => {
return function EnrichedHeading(props: { children: string }): React.ReactNode {
const text = props.children;
const id = text?.toLowerCase && text
.toLowerCase()
.replace(/[^\x00-\x7F]/g, '')
.replace(/\s+/g, '-')
.replace(/[?!]/g, '');
return (
<Component id={id}>
<HeaderLink href={`#${id}`}>
<LinkIcon />
</HeaderLink>
{props.children}
</Component>
);
};
};
const HeaderLink = styled.a`
position: absolute;
top: 0;
left: -25px;
width: 25px;
display: none;
height: 100%;
align-items: center;
justify-content: flex-start;
`;
const H1 = styled.h1`
position: relative;
font-size: 32px;
line-height: 40px;
font-weight: 700;
margin: 20px 0 10px !important;
&:hover ${HeaderLink} {
display: flex;
}
`;
const H2 = styled(H1).attrs({ as: 'h2' })`
font-size: 30px;
`;
const H3 = styled(H1).attrs({ as: 'h3' })`
margin: 22px 0 8px;
font-size: 28px;
`;
const H4 = styled(H1).attrs({ as: 'h4' })`
margin: 18px 0 8px;
font-size: 24px;
`;
const H5 = styled(H1).attrs({ as: 'h5' })`
margin: 14px 0 8px;
font-size: 18px;
`;
const H6 = styled(H1).attrs({ as: 'h6' })`
margin: 12px 0 8px;
font-size: 18px;
`;
const Headings = {
h1: H1,
h2: H2,
h3: H3,
h4: H4,
h5: H5,
h6: H6
};
export default Headings;

View File

@@ -0,0 +1,47 @@
import styled from 'styled-components';
type IFrameProps = {
title: string;
src: string;
};
const AspectRatioBox = styled.div`
position: relative;
max-width: 100%;
margin-bottom: 18px;
&:before {
height: 0;
content: "";
display: block;
padding-bottom: 50%;
}
& > iframe {
overflow: hidden;
position: absolute;
top: 0;
right: 0;
bottom: 0;
left: 0;
display: flex;
justify-content: center;
align-items: center;
width: 100%;
height: 100%;
}
`;
export default function IFrame(props: IFrameProps) {
return (
<AspectRatioBox>
<iframe
frameBorder={0}
title={props.title}
src={props.src}
allow={'accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture'}
allowFullScreen
/>
</AspectRatioBox>
);
}

View File

@@ -0,0 +1,7 @@
import styled from 'styled-components';
export const Img = styled.img`
max-width: 100%;
margin: 25px auto;
display: block;
`;

View File

@@ -0,0 +1,32 @@
import { Code } from '@chakra-ui/react';
import { P } from './p';
import Headings from './heading';
import { Pre } from './pre';
import BlockQuote from './blockquote';
import { Table } from './table';
import IFrame from './iframe';
import { Img } from './img';
import EnrichedLink from './a';
import { BadgeLink } from './badge-link';
import { Li, Ul } from './ul';
import PremiumBlock from './premium-block';
import { ResourceGroupTitle } from './resource-group-title';
const MdxComponents = {
p: P,
...Headings,
pre: Pre,
blockquote: BlockQuote,
a: EnrichedLink,
table: Table,
iframe: IFrame,
img: Img,
code: Code,
BadgeLink: BadgeLink,
ResourceGroupTitle: ResourceGroupTitle,
PremiumBlock: PremiumBlock,
ul: Ul,
li: Li
};
export default MdxComponents;

View File

@@ -0,0 +1,14 @@
import React from 'react';
import { Text } from '@chakra-ui/react';
import styled from 'styled-components';
type EnrichedTextType = {
children: React.ReactNode;
}
export const P = styled.p`
line-height: 27px;
font-size: 16px;
color: black;
margin-bottom: 18px;
`;

View File

@@ -0,0 +1,12 @@
import styled from 'styled-components';
export const Pre = styled.pre`
margin: 25px -25px 25px -25px !important;
padding: 20px 25px !important;
border-radius: 10px;
line-height: 1.5 !important;
code {
background: transparent;
}
`;

View File

@@ -0,0 +1,19 @@
import React from 'react';
import { Box, Button, Heading, Text } from '@chakra-ui/react';
import { LockIcon } from '@chakra-ui/icons';
type PremiumBlockProps = {
title: string;
description: string;
};
export default function PremiumBlock(props: PremiumBlockProps) {
return (
<Box p='40px' textAlign='center' rounded='5px' mb='18px' bg='gray.50' borderWidth={1}>
<LockIcon color='gray.300' height='45px' w='45px' mb='18px' />
<Heading as='h3' fontSize='30px' mb='10px'>{props.title}</Heading>
<Text mb='18px'>{props.description}</Text>
<Button colorScheme='green'>Become a Member</Button>
</Box>
);
}

View File

@@ -0,0 +1,12 @@
import React from 'react';
import { Heading } from '@chakra-ui/react';
type ResourceGroupTitleProps = {
children: React.ReactNode;
};
export function ResourceGroupTitle(props: ResourceGroupTitleProps) {
const { children } = props;
return <Heading mt='20px' color='gray.800' fontSize='14px' pb='5px' borderBottomWidth={1} textTransform='uppercase' as="h2" mb={'10px'}>{children}</Heading>;
}

View File

@@ -0,0 +1,25 @@
import styled from 'styled-components';
export const Table = styled.table`
border-collapse: separate;
width: 100%;
border-spacing: 0;
margin: 20px 0;
th {
color: #666;
font-size: 12px;
font-weight: 400;
background: #FAFAFA;
text-transform: uppercase;
height: 40px;
vertical-align: middle;
padding: 5px 10px;
}
td {
font-size: 14px;
padding: 10px;
border-bottom: 1px solid #EAEAEA;
}
`;

View File

@@ -0,0 +1,16 @@
import React from 'react';
import { UnorderedList } from '@chakra-ui/react';
import styled from 'styled-components';
export const Ul = styled.ul`
margin-left: 40px;
margin-bottom: 18px;
ul {
margin-top: 18px;
}
`;
export const Li = styled.li`
margin-bottom: 7px;
`;

View File

@@ -0,0 +1,46 @@
import { Box, Container, Heading, Link, Text } from '@chakra-ui/react';
export function OpensourceBanner() {
return (
<Box bg='white' borderTopWidth={1} pt={['45px', '45px', '70px']} pb={['60px', '60px', '90px']} textAlign='center'>
<Container maxW='container.md'>
<Heading fontSize={['25px', '25px', '35px']} mb={['10px', '10px', '20px']}>Open Source</Heading>
<Text lineHeight='26px' fontSize={['15px', '15px', '16px']} mb='20px'>The project is OpenSource,&nbsp;
<Link
_hover={{ textDecoration: 'none' }}
href='https://github.com/search?o=desc&q=stars%3A%3E100000&s=stars&type=Repositories'
target='_blank'
borderBottomWidth={1}
fontWeight={600}
>6th most starred project on GitHub</Link> and is visited by hundreds of thousands of
developers every month.</Text>
<iframe
src='https://ghbtns.com/github-btn.html?user=kamranahmedse&repo=developer-roadmap&type=star&count=true&size=large'
frameBorder='0'
scrolling='0'
width='170'
height='30'
style={{ margin: 'auto', marginBottom: '30px' }}
title='GitHub'
/>
<Text lineHeight={['25px', '25px', '26px']} fontSize={['15px', '15px', '16px']} mb='15px'>A considerable amount of my time is spent doing unpaid
community work on things that I hope will help humanity in some way. Your sponsorship helps me continue to
produce more open-source and free educational material consumed by hundreds of thousands of developers every
month.</Text>
<Box>
<iframe
src='https://ghbtns.com/github-btn.html?user=kamranahmedse&type=sponsor&size=large'
frameBorder='0'
scrolling='0'
width='260'
height='30'
title='GitHub'
style={{ margin: 'auto' }}
/>
</Box>
</Container>
</Box>
);
}

View File

@@ -0,0 +1,38 @@
import { Badge, Box, Container, Heading, Link, Text } from '@chakra-ui/react';
import React from 'react';
import siteConfig from '../content/site.json';
type PageHeaderProps = {
title: string;
subtitle: string;
children?: React.ReactNode;
beforeTitle?: React.ReactNode;
};
export function PageHeader(props: PageHeaderProps) {
const { title, subtitle, children, beforeTitle = null } = props;
return (
<Box pt={['25px', '20px', '45px']} pb={['20px', '15px', '30px']} borderBottomWidth={1} mb='30px'>
<Container maxW='container.md' position='relative'>
{beforeTitle}
<Heading
as='h1'
color='black'
fontSize={['28px', '33px', '40px']}
fontWeight={700}
mb={['2px', '2px', '5px']}
>
{title}
</Heading>
<Text fontSize={['13px', '14px', '15px']}>{subtitle}</Text>
</Container>
{children && (
<Container maxW='container.md'>
{children}
</Container>
)}
</Box>
);
}

View File

@@ -0,0 +1,16 @@
import React from 'react';
import { Box } from '@chakra-ui/react';
type PageWrapperProps = {
children: React.ReactNode;
}
export function PageWrapper(props: PageWrapperProps) {
const { children } = props;
return (
<Box bgColor='brand.bg' bgImage='url(/bg.jpg)' bgRepeat='no-repeat' bgSize='100%' w='100%' minH='100vh'>
{ children }
</Box>
);
}

View File

@@ -0,0 +1,116 @@
import { Box, Button, Flex, Text } from '@chakra-ui/react';
import { RemoveScroll } from 'react-remove-scroll';
import { RoadmapType } from '../../lib/roadmap';
import RoadmapGroup from '../../pages/[roadmap]/[group]';
import { CheckIcon, CloseIcon, RepeatIcon } from '@chakra-ui/icons';
import { queryGroupElementsById } from '../../lib/renderer/utils';
type ContentDrawerProps = {
roadmap: RoadmapType;
groupId: string;
onClose?: () => void;
};
export function ContentDrawer(props: ContentDrawerProps) {
const { roadmap, groupId, onClose = () => null } = props;
if (!groupId) {
return null;
}
const isDone = localStorage.getItem(groupId) === 'done';
return (
<Box zIndex={99999} pos="relative">
<Box
onClick={onClose}
pos="fixed"
top={0}
left={0}
right={0}
bottom={0}
bg="black"
opacity={0.4}
/>
<RemoveScroll allowPinchZoom>
<Box
p="0px 30px 30px"
position="fixed"
w={['100%', '60%', '40%']}
bg="white"
top={0}
right={0}
bottom={0}
borderLeftWidth={'1px'}
overflowY="scroll"
>
<Flex
mt="20px"
justifyContent="space-between"
alignItems="center"
zIndex={1}
>
{!isDone && (
<Button
onClick={() => {
localStorage.setItem(groupId, 'done');
queryGroupElementsById(groupId).forEach((item) =>
item?.classList?.add('done')
);
onClose();
}}
colorScheme="green"
leftIcon={<CheckIcon />}
size="xs"
iconSpacing={0}
>
<Text
as="span"
d={['block', 'none', 'none', 'block']}
ml="10px"
>
Mark as Done
</Text>
</Button>
)}
{isDone && (
<Button
onClick={() => {
localStorage.removeItem(groupId);
queryGroupElementsById(groupId).forEach((item) =>
item?.classList?.remove('done')
);
onClose();
}}
colorScheme="red"
leftIcon={<RepeatIcon />}
size="xs"
iconSpacing={0}
>
<Text
as="span"
d={['block', 'none', 'none', 'block']}
ml="10px"
>
Mark as Pending
</Text>
</Button>
)}
<Button
onClick={onClose}
colorScheme="yellow"
ml="5px"
leftIcon={<CloseIcon width="8px" />}
iconSpacing={0}
size="xs"
>
<Text as="span" d={['none', 'none', 'none', 'block']} ml="10px">
Close
</Text>
</Button>
</Flex>
<RoadmapGroup isOutlet roadmap={roadmap} group={groupId} />
</Box>
</RemoveScroll>
</Box>
);
}

View File

@@ -0,0 +1,39 @@
import React from 'react';
import { Box, Button, Divider, Link, Text } from '@chakra-ui/react';
type EditContentPageLinkProps = {
href: string;
};
export function EditContentPageLink(props: EditContentPageLinkProps) {
const { href } = props;
return (
<Box my='30px'>
<Divider mb="15px" orientation="horizontal" />
<Text
lineHeight="23px"
fontWeight={500}
fontSize="14px"
color="gray.500"
mb="10px"
>
This page is a work in progress. Help us by writing a small
introduction to the topic and suggesting a few links to read more
about this topic.
</Text>
<Button
size="sm"
py="20px"
as={Link}
href={href}
target="_blank"
isFullWidth
colorScheme={'gray'}
_hover={{ textDecoration: 'none', bg: 'gray.200' }}
>
Edit this Page
</Button>
</Box>
);
}

View File

@@ -0,0 +1,114 @@
import { Box, Flex, Heading, Link, Text, Tooltip } from '@chakra-ui/react';
import { InfoIcon } from '@chakra-ui/icons';
type RoadmapGridItemProps = {
title: string;
subtitle: string;
isCommunity?: boolean;
isUpcoming?: boolean;
colorIndex?: number;
url: string;
};
const bgColorList = [
'red.100',
'yellow.100',
'green.200',
'teal.200',
'blue.200',
'red.200',
'gray.200',
'teal.200',
'yellow.100',
'green.200',
'red.200',
];
export function HomeRoadmapItem(props: RoadmapGridItemProps) {
const {
title,
subtitle,
isCommunity,
colorIndex = 0,
url,
isUpcoming,
} = props;
return (
<Box
as={Link}
href={url}
_hover={{
textDecoration: 'none',
bg: 'rgba(255,255,255,.10)',
}}
sx={{
// On mobile devices, don't change the scale
'@media (hover: none)': {
'&:hover': {
bg: 'rgba(255,255,255,.05)',
},
},
}}
flex={1}
shadow="2xl"
className={'home-roadmap-item'}
bg={'rgba(255,255,255,.05)'}
color="white"
p="15px"
rounded="10px"
pos="relative"
>
{isCommunity && (
<Tooltip label={'Community contribution'} hasArrow placement="top">
<InfoIcon opacity={0.5} position="absolute" top="10px" right="10px" />
</Tooltip>
)}
<Heading
fontSize={['17px', '17px', '22px']}
color={bgColorList[colorIndex]}
mb="5px"
>
{title}
</Heading>
<Text color="gray.200" fontSize={['13px']}>
{subtitle}
</Text>
{isUpcoming && (
<Flex
alignItems="center"
justifyContent="center"
pos="absolute"
left={0}
right={0}
top={0}
bottom={0}
rounded="10px"
>
<Text
color="white"
bg="gray.600"
zIndex={1}
fontWeight={600}
p={'5px 10px'}
rounded="10px"
>
Upcoming
</Text>
<Box
bg={'black'}
pos="absolute"
top={0}
left={0}
right={0}
bottom={0}
rounded={'10px'}
opacity={0.5}
/>
</Flex>
)}
</Box>
);
}

View File

@@ -0,0 +1,50 @@
import { Badge, Link, Text } from '@chakra-ui/react';
import siteConfig from '../../content/site.json';
import { event } from '../../lib/gtag';
import React from 'react';
export function NewAlertBanner() {
return (
<Text
_hover={{
textDecoration: 'none',
color: 'blue.700',
'& .new-badge': { bg: 'blue.700' },
}}
as={Link}
href={siteConfig.url.youtube}
d="block"
target="_blank"
color="red.700"
fontSize="sm"
mb="10px"
fontWeight={500}
onClick={() =>
event({
category: 'Subscription',
action: 'Clicked the YouTube banner',
label: 'YouTube Alert on Roadmap',
})
}
>
<Badge
transition={'all 300ms'}
className="new-badge"
mr="7px"
colorScheme="red"
variant="solid"
>
New
</Badge>
<Text textDecoration="underline" as="span" d={['none', 'inline']}>
Roadmap topics to be covered on our YouTube Channel
</Text>
<Text textDecoration="underline" as="span" d={['inline', 'none']}>
Topic videos being made on YouTube
</Text>
<Text as="span" ml="5px">
&raquo;
</Text>
</Text>
);
}

View File

@@ -0,0 +1,26 @@
import { RoadmapType } from '../../lib/roadmap';
import { Container, Heading, Link, Text } from '@chakra-ui/react';
import siteConfig from '../../content/site.json';
type RoadmapProps = {
roadmap: RoadmapType;
};
export function RoadmapError(props: RoadmapProps) {
const { roadmap } = props;
return (
<Container
bg={'red.600'}
maxW={'container.md'}
position="relative"
mt="50px"
p='20px'
rounded='5px'
color='white'
>
<Heading mb='4px' size='md'>Oops! There&apos;s an error</Heading>
<Text>Try refreshing or <Link target='_blank' fontWeight={700} textDecoration={'underline'} fontSize='14px' href={siteConfig.url.issue}>report a bug</Link> and use the <Link fontWeight={700} textDecoration={'underline'} href={`/roadmaps/${roadmap.id}.png`}>non-interactive version</Link></Text>
</Container>
);
}

View File

@@ -0,0 +1,89 @@
import { Badge, Box, Flex, Heading, Link, Text, Tooltip } from '@chakra-ui/react';
import { InfoIcon } from '@chakra-ui/icons';
type RoadmapGridItemProps = {
title: string;
subtitle: string;
href: string;
isCommunity?: boolean;
isUpcoming?: boolean;
colorIndex?: number;
};
const bgColorList = [
'gray.900',
'purple.900',
'blue.900',
'red.900',
'green.900',
'teal.900',
'yellow.900',
'cyan.900',
'pink.900',
'gray.800',
'purple.800',
'blue.800',
'red.800',
'green.800',
'teal.800',
'yellow.800',
'cyan.800',
'pink.800',
'gray.700',
'purple.700',
'blue.700',
'red.700',
'green.700',
'teal.700',
'yellow.700',
'cyan.700',
'pink.700',
'gray.600',
'purple.600',
'blue.600',
'red.600',
'green.600',
'teal.600',
'yellow.600',
'cyan.600',
'pink.600'
];
export function RoadmapGridItem(props: RoadmapGridItemProps) {
const { title, subtitle, isCommunity = false, isUpcoming = false, colorIndex = 0, href = '/' } = props;
return (
<Box _hover={{ textDecoration: 'none', transform: 'scale(1.02)' }} as={Link} href={href} shadow='xl' p='20px'
rounded='10px' bg={bgColorList[colorIndex] ?? bgColorList[0]} flex={1} pos='relative'>
{isCommunity && (
<Tooltip label={'Community contribution'} hasArrow placement='top'>
<InfoIcon opacity={0.5} color='gray.100' position='absolute' top='10px' right='10px' />
</Tooltip>
)}
<Heading color='white' mb={'6px'} fontSize='20px'>{title}</Heading>
<Text color='gray.300' fontSize='14px'>{subtitle}</Text>
{isUpcoming && (
<Flex
alignItems='center'
justifyContent='center'
pos='absolute'
left={0}
right={0}
top={0}
bottom={0}
rounded='10px'
>
<Text color='white' bg='yellow.900' zIndex={1} fontWeight={600} p={'5px 10px'}
rounded='10px'>Upcoming</Text>
<Box bg={'black'} pos='absolute' top={0} left={0} right={0} bottom={0} rounded={'10px'} opacity={0.5} />
</Flex>
)}
</Box>
);
}

View File

@@ -0,0 +1,20 @@
import { Container, Spinner } from '@chakra-ui/react';
export function RoadmapLoader() {
return (
<Container
maxW={'container.md'}
position="relative"
mt="60px"
textAlign="center"
>
<Spinner
thickness="7px"
speed="0.65s"
emptyColor="gray.200"
color="gray.500"
size="xl"
/>
</Container>
);
}

View File

@@ -0,0 +1,113 @@
import { isInteractiveRoadmap, RoadmapType } from '../../lib/roadmap';
import { NewAlertBanner } from './new-alert-banner';
import {
Badge,
Box,
Button,
Container,
Flex,
Heading,
Link,
Stack,
Text,
} from '@chakra-ui/react';
import { AtSignIcon, DownloadIcon } from '@chakra-ui/icons';
import React from 'react';
type RoadmapPageHeaderType = {
roadmap: RoadmapType;
};
export function RoadmapPageHeader(props: RoadmapPageHeaderType) {
const { roadmap } = props;
return (
<Box
pt={['25px', '20px', '45px']}
pb={['20px', '15px', '30px']}
borderBottomWidth={1}
mb="30px"
>
<Container maxW="container.md" position="relative">
<NewAlertBanner />
<Heading
as="h1"
color="black"
fontSize={['28px', '33px', '40px']}
fontWeight={700}
mb={['2px', '2px', '5px']}
>
{roadmap.title}
</Heading>
<Text fontSize={['13px', '14px', '15px']}>{roadmap.description}</Text>
<Flex justifyContent="space-between" alignItems={'center'} mt="20px">
<Stack isInline>
<Button
d={['flex', 'flex']}
as={Link}
href={'/roadmaps'}
size="xs"
py="14px"
px="10px"
colorScheme="teal"
variant="solid"
_hover={{ textDecoration: 'none' }}
>
&larr;
<Text as="span" d={['none', 'inline']} ml="5px">
All Roadmaps
</Text>
</Button>
{roadmap.pdfUrl && (
<Button
as={Link}
href={roadmap.pdfUrl}
target="_blank"
size="xs"
py="14px"
px="10px"
leftIcon={<DownloadIcon />}
colorScheme="yellow"
variant="solid"
_hover={{ textDecoration: 'none' }}
>
Download
</Button>
)}
<Button
as={Link}
href={'/signup'}
size="xs"
py="14px"
px="10px"
variant="solid"
colorScheme="yellow"
leftIcon={<AtSignIcon />}
_hover={{ textDecoration: 'none' }}
>
Subscribe
</Button>
</Stack>
</Flex>
{isInteractiveRoadmap(roadmap.id) && (
<Text
mt="30px"
mb={['-37px', '-32px', '-47px']}
fontWeight={500}
fontSize="14px"
bg="white"
borderWidth={1}
p="5px 7px"
rounded="3px"
>
<Badge pos="relative" top={'-1px'} mr="6px" colorScheme="yellow">
New
</Badge>
Resources are here, try clicking any nodes.
</Text>
)}
</Container>
</Box>
);
}

View File

@@ -0,0 +1,33 @@
import { Flex, Link, Text } from '@chakra-ui/react';
import YouTubeLogo from '../components/icons/youtube.svg';
import siteConfig from '../content/site.json';
import { event } from '../lib/gtag';
export function StickyBanner() {
return (
<Flex as={Link}
href={siteConfig.url.youtube}
bg={'yellow.200'}
color='gray.900'
alignItems='center'
position='sticky'
top={0}
zIndex={999}
justifyContent='center'
py='8px'
_hover={{ textDecoration: 'none', bg: 'yellow.400' }}
target='_blank'
onClick={() => event({
category: 'Subscription',
action: 'Clicked the YouTube banner',
label: 'Sticky YouTube banner on Top'
})}
>
<YouTubeLogo style={{ height: '20px', display: 'inline-block', marginRight: '7px' }} />
<Text as='span' fontWeight={500} fontSize='14px'>
<Text as='span'>We now have a YouTube Channel. <Text as='span' d={['none', 'inline']}>Subscribe for the video
content.</Text></Text>
</Text>
</Flex>
);
}

View File

@@ -0,0 +1,71 @@
import { Badge, Box, Heading, Link, Text } from '@chakra-ui/react';
type VideoGridItemProps = {
href: string;
title: string;
subtitle: string;
date: string;
target?: string;
isNew?: boolean;
isPro?: boolean;
colorIndex?: number;
};
const bgColorList = [
'gray.900',
'purple.900',
'blue.900',
'red.900',
'green.900',
'teal.900',
'yellow.900',
'cyan.900',
'pink.900',
'gray.800',
'purple.800',
'blue.800',
'red.800',
'green.800',
'teal.800',
'yellow.800',
'cyan.800',
'pink.800',
'gray.700',
'purple.700',
'blue.700',
'red.700',
'green.700',
'teal.700',
'yellow.700',
'cyan.700',
'pink.700',
'gray.600',
'purple.600',
'blue.600',
'red.600',
'green.600',
'teal.600',
'yellow.600',
'cyan.600',
'pink.600'
];
export function VideoGridItem(props: VideoGridItemProps) {
const { title, subtitle, date, isNew = false, isPro = false, colorIndex = 0, href, target } = props;
return (
<Box _hover={{ textDecoration: 'none', transform: 'scale(1.02)' }} as={Link} href={ href } target={target || '_self'} shadow='xl' p='20px'
rounded='10px' bg={bgColorList[colorIndex] ?? bgColorList[0]} flex={1}>
<Text mb='7px' fontSize='12px' color='gray.400'>
{isNew && <Badge colorScheme={'yellow'} mr='10px'>New</Badge>}
{isPro && <Badge colorScheme={'blue'} mr='10px'>PRO</Badge>}
{date}
</Text>
<Heading color='white' mb={'6px'} fontSize='20px' lineHeight={'28px'}>{title}</Heading>
<Text color='gray.300' fontSize='14px'>{subtitle}</Text>
</Box>
);
}

43
content/authors.json Normal file
View File

@@ -0,0 +1,43 @@
[
{
"username": "kamranahmedse",
"name": "Kamran Ahmed",
"twitter": "kamranahmedse",
"picture": "/authors/kamranahmedse.jpeg",
"bio": "Lead engineer at Tajawal. Lover of all things web and opensource. Created roadmap.sh to help the confused ones."
},
{
"username": "jesse",
"name": "Jesse Li",
"twitter": "__jesse_li",
"picture": "/authors/jesse.png",
"bio": "Software engineer."
},
{
"username": "dmytrobol",
"name": "Dmytro Bolkachov",
"twitter": "dmytrobol",
"picture": "/authors/dmytrobol.png",
"bio": "JavaScript Lad, Movie buff and coder interested in everything web related"
},
{
"username": "spekulatius",
"name": "Peter Thaleikis",
"twitter": "spekulatius1984",
"picture": "/authors/spekulatius.jpg",
"bio": "Developer building side-projects for fun, lover of the web and open source"
},
{
"username": "ebrahimbharmal007",
"name": "Ebrahim Bharmal",
"twitter": "BharmalEbrahim",
"picture": "/authors/ebrahimbharmal007.png",
"bio": "Love building projects using tools completely new to me. Python forever. Senior at University of Texas at Arlington (2021)"
},
{
"username": "lesovsky",
"name": "Alexey Lesovsky",
"bio": "Linux system administrator and PostgreSQL DBA at DataEgret.",
"picture": "/authors/lesovsky.jpeg"
}
]

256
content/guides.json Normal file
View File

@@ -0,0 +1,256 @@
[
{
"id": "avoid-render-blocking-javascript-with-async-defer",
"title": "Async and Defer Script Loading",
"description": "Learn how to avoid render blocking JavaScript using async and defer scripts.",
"isPro": false,
"authorUsername": "kamranahmedse",
"updatedAt": "2021-09-10T19:59:14.191Z",
"createdAt": "2021-09-10T19:59:14.191Z"
},
{
"id": "what-are-web-vitals",
"title": "What are Web Vitals?",
"description": "Learn what are the core web vitals and how to measure them.",
"isPro": false,
"authorUsername": "kamranahmedse",
"updatedAt": "2021-09-05T19:59:14.191Z",
"createdAt": "2021-09-05T19:59:14.191Z"
},
{
"id": "what-is-sli-slo-sla",
"title": "SLIs, SLOs and SLAs",
"description": "Learn what are different indicators for performance identification of any service.",
"isPro": false,
"authorUsername": "kamranahmedse",
"updatedAt": "2021-08-31T19:59:14.191Z",
"createdAt": "2021-08-31T19:59:14.191Z"
},
{
"id": "ci-cd",
"title": "What is CI and CD?",
"description": "Learn the basics of CI/CD and how to implement that with GitHub Actions.",
"isPro": false,
"authorUsername": "kamranahmedse",
"updatedAt": "2021-07-09T19:59:14.191Z",
"createdAt": "2021-07-09T19:59:14.191Z"
},
{
"id": "sso",
"title": "SSO — Single Sign On",
"description": "Learn the basics of SAML and understand how does Single Sign On work.",
"isPro": false,
"authorUsername": "kamranahmedse",
"updatedAt": "2021-07-01T19:59:14.191Z",
"createdAt": "2021-07-01T19:59:14.191Z"
},
{
"id": "oauth",
"title": "OAuth — Open Authorization",
"description": "Learn and understand what is OAuth and how it works",
"isPro": false,
"authorUsername": "kamranahmedse",
"updatedAt": "2021-06-28T19:59:14.191Z",
"createdAt": "2021-06-28T19:59:14.191Z"
},
{
"id": "jwt-authentication",
"title": "JWT Authentication",
"description": "Understand what is JWT authentication and how is it implemented",
"isPro": false,
"authorUsername": "kamranahmedse",
"updatedAt": "2021-06-20T19:59:14.191Z",
"createdAt": "2021-06-20T19:59:14.191Z"
},
{
"id": "token-authentication",
"title": "Token Based Authentication",
"description": "Understand what is token based authentication and how it is implemented",
"isPro": false,
"authorUsername": "kamranahmedse",
"updatedAt": "2021-06-02T20:59:14.191Z",
"createdAt": "2021-06-02T20:59:14.191Z"
},
{
"id": "session-authentication",
"title": "Session Based Authentication",
"description": "Understand what is session based authentication and how it is implemented",
"isPro": false,
"authorUsername": "kamranahmedse",
"updatedAt": "2021-05-26T20:59:14.191Z",
"createdAt": "2021-05-26T20:59:14.191Z"
},
{
"id": "basic-authentication",
"title": "Basic Authentication",
"description": "Understand what is basic authentication and how it is implemented",
"isPro": false,
"authorUsername": "kamranahmedse",
"updatedAt": "2021-05-19T20:59:14.191Z",
"createdAt": "2021-05-19T20:59:14.191Z"
},
{
"id": "character-encodings",
"title": "Character Encodings",
"description": "Covers the basics of character encodings and explains ASCII vs Unicode",
"isPro": false,
"authorUsername": "kamranahmedse",
"updatedAt": "2021-05-14T20:59:14.191Z",
"createdAt": "2021-05-14T20:59:14.191Z"
},
{
"id": "unfamiliar-codebase",
"title": "Unfamiliar Codebase",
"description": "Tips on getting getting familiar with an unfamiliar codebase",
"isPro": false,
"authorUsername": "kamranahmedse",
"updatedAt": "2021-05-04T20:59:14.191Z",
"createdAt": "2021-05-04T20:59:14.191Z"
},
{
"id": "why-build-it-and-they-will-come-wont-work-anymore",
"title": "Build it and they will come?",
"description": "Why “build it and they will come” alone wont work anymore",
"isPro": false,
"authorUsername": "spekulatius",
"updatedAt": "2021-05-04T12:59:14.191Z",
"createdAt": "2021-05-04T12:59:14.191Z"
},
{
"id": "dhcp-in-one-picture",
"title": "DHCP in One Picture",
"description": "Here is what happens when a new device joins the network.",
"isPro": false,
"authorUsername": "kamranahmedse",
"updatedAt": "2021-04-28T15:48:21.191Z",
"createdAt": "2021-04-28T15:48:21.191Z"
},
{
"id": "ssl-tls-https-ssh",
"title": "SSL vs TLS vs SSH",
"description": "Quick tidbit on the differences between SSL, TLS, HTTPS and SSH",
"isPro": false,
"authorUsername": "kamranahmedse",
"updatedAt": "2021-04-22T15:48:21.191Z",
"createdAt": "2021-04-22T15:48:21.191Z"
},
{
"id": "asymptotic-notation",
"title": "Asymptotic Notation",
"description": "Learn the basics of measuring the time and space complexity of algorithms",
"isPro": false,
"authorUsername": "kamranahmedse",
"updatedAt": "2021-04-03T15:48:21.191Z",
"createdAt": "2021-04-03T15:48:21.191Z"
},
{
"id": "big-o-notation",
"title": "Big-O Notation",
"description": "Easy to understand explanation of Big-O notation without any fancy terms",
"isPro": false,
"authorUsername": "kamranahmedse",
"updatedAt": "2021-03-15T15:48:21.191Z",
"createdAt": "2021-03-15T15:48:21.191Z"
},
{
"id": "random-numbers",
"title": "Random Numbers: Are they?",
"description": "Learn how they are generated and why they may not be truly random.",
"isPro": false,
"authorUsername": "kamranahmedse",
"updatedAt": "2021-03-14T15:48:21.191Z",
"createdAt": "2021-03-14T15:48:21.191Z"
},
{
"id": "scaling-databases",
"title": "Scaling Databases",
"description": "Learn the ups and downs of different database scaling strategies",
"isPro": false,
"authorUsername": "kamranahmedse",
"updatedAt": "2021-02-18T15:48:21.191Z",
"createdAt": "2021-02-18T15:48:21.191Z"
},
{
"id": "what-is-internet",
"title": "How does the internet work?",
"description": "Learn the basics of internet and everything involved with this short video series",
"isPro": false,
"authorUsername": "dmytrobol",
"updatedAt": "2021-02-29T15:48:21.191Z",
"createdAt": "2021-02-29T15:48:21.191Z"
},
{
"id": "torrent-client",
"title": "Building a BitTorrent Client",
"description": "Learn everything you need to know about BitTorrent by writing a client in Go",
"isPro": false,
"authorUsername": "jesse",
"updatedAt": "2021-01-17T15:48:21.191Z",
"createdAt": "2021-01-17T15:48:21.191Z",
"canonical": "https://blog.jse.li/posts/torrent/"
},
{
"id": "levels-of-seniority",
"title": "Levels of Seniority",
"description": "How to Step Up as a Junior, Mid Level or a Senior Developer?",
"isPro": false,
"authorUsername": "kamranahmedse",
"updatedAt": "2020-12-03T12:13:00.860Z",
"createdAt": "2020-12-03T12:13:00.860Z"
},
{
"id": "design-patterns-for-humans",
"title": "Design Patterns for Humans",
"description": "A language agnostic, ultra-simplified explanation to design patterns",
"isPro": false,
"authorUsername": "kamranahmedse",
"updatedAt": "2019-10-09T12:00:00.860Z",
"createdAt": "2019-01-23T17:00:00.860Z"
},
{
"id": "journey-to-http2",
"title": "Journey to HTTP/2",
"description": "The evolution of HTTP. How it all started and where we stand today",
"isPro": false,
"authorUsername": "kamranahmedse",
"createdAt": "2018-12-04T12:00:00.860Z",
"updatedAt": "2018-12-04T12:00:00.860Z",
"isDraft": true
},
{
"id": "dns-in-one-picture",
"title": "DNS in One Picture",
"description": "Quick illustrative guide on how a website is found on the internet.",
"isPro": false,
"authorUsername": "kamranahmedse",
"updatedAt": "2018-12-04T12:00:00.860Z",
"createdAt": "2018-12-04T17:00:00.860Z"
},
{
"id": "http-caching",
"title": "HTTP Caching",
"description": "Everything you need to know about web caching",
"isPro": false,
"authorUsername": "kamranahmedse",
"createdAt": "2018-11-29T17:00:00.860Z",
"updatedAt": "2018-11-29T17:00:00.860Z"
},
{
"id": "history-of-javascript",
"title": "Brief History of JavaScript",
"description": "How JavaScript was introduced and evolved over the years",
"isPro": false,
"authorUsername": "kamranahmedse",
"createdAt": "2017-10-28T17:00:00.860Z",
"updatedAt": "2017-10-28T17:00:00.860Z"
},
{
"id": "proxy-servers",
"title": "Proxy Servers",
"description": "How do proxy servers work and what are forward and reverse proxies?",
"isPro": false,
"authorUsername": "ebrahimbharmal007",
"createdAt": "2017-10-24T17:00:00.860Z",
"updatedAt": "2017-10-24T17:00:00.860Z"
}
]

View File

@@ -0,0 +1,15 @@
export const guideMeta = {
"title": "WebStorm — Project History",
"description": "Learn how to peek through the history of any git repository to learn how it grew.",
"url": "/guides/project-history",
"fileName": "project-history",
"featured": true,
"author": "kamranahmedse",
"updatedAt": "2020-07-16T19:59:14.191Z",
"createdAt": "2020-07-16T19:59:14.191Z"
};
Asymptotic notation is the standard way of measuring the time and space that an algorithm will consume as the input grows. In one of my last guides, I covered "Big-O notation" and a lot of you asked for a similar one for Asymptotic notation. You can find the [previous guide here](/guides/big-o-notation).
[![](/guides/asymptotic-notation.png)](/guides/asymptotic-notation.png)

View File

@@ -0,0 +1,2 @@
[![](/guides/avoid-render-blocking-javascript-with-async-defer.png)](/guides/avoid-render-blocking-javascript-with-async-defer.png)

View File

@@ -0,0 +1,2 @@
[![](/guides/basic-authentication.png)](/guides/basic-authentication.png)

View File

@@ -0,0 +1,4 @@
Big-O notation is the mathematical notation that helps analyse the algorithms to get an idea about how they might perform as the input grows. The image below explains Big-O in a simple way without using any fancy terminology.
[![](/guides/big-o-notation.png)](/guides/big-o-notation.png)

View File

@@ -0,0 +1,2 @@
[![](/guides/character-encodings.png)](/guides/character-encodings.png)

4
content/guides/ci-cd.md Normal file
View File

@@ -0,0 +1,4 @@
The image below details the differences between the continuous integration and continuous delivery. Also, here is the [accompanying video on implementing that with GitHub actions](https://www.youtube.com/watch?v=nyKZTKQS_EQ).
[![](/guides/ci-cd.png)](/guides/ci-cd.png)

View File

@@ -1,22 +1,3 @@
---
title: 'Design Patterns for Humans'
description: 'A language agnostic, ultra-simplified explanation to design patterns'
authorId: 'kamran'
seo:
title: 'Design Patterns for Humans - roadmap.sh'
description: 'A language agnostic, ultra-simplified explanation to design patterns'
isNew: false
type: 'textual'
date: 2019-01-23
sitemap:
priority: 0.7
changefreq: 'weekly'
tags:
- 'guide'
- 'textual-guide'
- 'guide-sitemap'
---
Design patterns are solutions to recurring problems; **guidelines on how to tackle certain problems**. They are not classes, packages or libraries that you can plug into your application and wait for the magic to happen. These are, rather, guidelines on how to tackle certain problems in certain situations.
> Design patterns are solutions to recurring problems; guidelines on how to tackle certain problems
@@ -30,7 +11,7 @@ Wikipedia describes them as
Developers, mostly beginners, make the mistake of over-thinking and forcing the design patterns which results in a horrible un-maintainable mess. The rule of thumb is to keep the codebase as simple as possible, once you start developing, you will start to see the patterns repeating in the codebase in which case you can go ahead and implement the relevant design patterns.
- Design patterns are not a silver bullet to all your problems.
- Do not try to force them; bad things are supposed to happen, if done so.
- Do not try to force them; bad things are supposed to happen, if done so.
- Keep in mind that design patterns are solutions **to** problems, not solutions **finding** problems; so don't overthink.
- If used in a correct place in a correct manner, they can prove to be a savior; or else they can result in a horrible mess of a code.
@@ -40,47 +21,41 @@ Developers, mostly beginners, make the mistake of over-thinking and forcing the
This guide is about Gang of Four (GoF) design patterns, which refers to the four authors of [the book which introduced these design patterns](https://en.wikipedia.org/wiki/Design_Patterns). There are three types of design patterns:
- [Creational](#creational-design-patterns)
- [Structural](#structural-design-patterns)
- [Behavioral](#behavioral-design-patterns)
* [Creational](#creational-design-patterns)
* [Structural](#structural-design-patterns)
* [Behavioral](#behavioral-design-patterns)
## Creational Design Patterns
In plain words
> Creational patterns are focused towards how to instantiate an object or group of related objects.
Wikipedia says
> In software engineering, creational design patterns are design patterns that deal with object creation mechanisms, trying to create objects in a manner suitable to the situation. The basic form of object creation could result in design problems or added complexity to the design. Creational design patterns solve this problem by somehow controlling this object creation.
There are 6 types of Creational patterns
- [Simple Factory](#-simple-factory)
- [Factory Method](#-factory-method)
- [Abstract Factory](#-abstract-factory)
- [Builder](#-builder)
- [Prototype](#-prototype)
- [Singleton](#-singleton)
## 🏠 Simple Factory
* [Simple Factory](#-simple-factory)
* [Factory Method](#-factory-method)
* [Abstract Factory](#-abstract-factory)
* [Builder](#-builder)
* [Prototype](#-prototype)
* [Singleton](#-singleton)
🏠 Simple Factory
--------------
Real world example
> Consider, you are building a house and you need doors. You can either put on your carpenter clothes, bring some wood, glue, nails and all the tools required to build the door and start building it in your house or you can simply call the factory and get the built door delivered to you so that you don't need to learn anything about the door making or to deal with the mess that comes with making it.
In plain words
> Simple factory simply generates an instance for client without exposing any instantiation logic to the client
Wikipedia says
> In object-oriented programming (OOP), a factory is an object for creating other objects formally a factory is a function or method that returns objects of a varying prototype or class from some method call, which is assumed to be "new".
**Programmatic Example**
First of all we have a door interface and the implementation
```php
interface Door
{
@@ -110,9 +85,7 @@ class WoodenDoor implements Door
}
}
```
Then we have our door factory that makes the door and returns it
```php
class DoorFactory
{
@@ -122,9 +95,7 @@ class DoorFactory
}
}
```
And then it can be used as
```php
// Make me a door of 100x200
$door = DoorFactory::makeDoor(100, 200);
@@ -140,21 +111,19 @@ $door2 = DoorFactory::makeDoor(50, 100);
When creating an object is not just a few assignments and involves some logic, it makes sense to put it in a dedicated factory instead of repeating the same code everywhere.
## 🏭 Factory Method
🏭 Factory Method
--------------
Real world example
> Consider the case of a hiring manager. It is impossible for one person to interview for each of the positions. Based on the job opening, she has to decide and delegate the interview steps to different people.
In plain words
> It provides a way to delegate the instantiation logic to child classes.
Wikipedia says
> In class-based programming, the factory method pattern is a creational pattern that uses factory methods to deal with the problem of creating objects without having to specify the exact class of the object that will be created. This is done by creating objects by calling a factory method—either specified in an interface and implemented by child classes, or implemented in a base class and optionally overridden by derived classes—rather than by calling a constructor.
**Programmatic Example**
**Programmatic Example**
Taking our hiring manager example above. First of all we have an interviewer interface and some implementations for it
@@ -198,9 +167,7 @@ abstract class HiringManager
}
```
Now any child can extend it and provide the required interviewer
```php
class DevelopmentManager extends HiringManager
{
@@ -218,7 +185,6 @@ class MarketingManager extends HiringManager
}
}
```
and then it can be used as
```php
@@ -233,18 +199,16 @@ $marketingManager->takeInterview(); // Output: Asking about community building.
Useful when there is some generic processing in a class but the required sub-class is dynamically decided at runtime. Or putting it in other words, when the client doesn't know what exact sub-class it might need.
## 🔨 Abstract Factory
🔨 Abstract Factory
----------------
Real world example
> Extending our door example from Simple Factory. Based on your needs you might get a wooden door from a wooden door shop, iron door from an iron shop or a PVC door from the relevant shop. Plus you might need a guy with different kind of specialities to fit the door, for example a carpenter for wooden door, welder for iron door etc. As you can see there is a dependency between the doors now, wooden door needs carpenter, iron door needs a welder etc.
In plain words
> A factory of factories; a factory that groups the individual but related/dependent factories together without specifying their concrete classes.
Wikipedia says
> The abstract factory pattern provides a way to encapsulate a group of individual factories that have a common theme without specifying their concrete classes
**Programmatic Example**
@@ -273,7 +237,6 @@ class IronDoor implements Door
}
}
```
Then we have some fitting experts for each door type
```php
@@ -300,7 +263,6 @@ class Carpenter implements DoorFittingExpert
```
Now we have our abstract factory that would let us make family of related objects i.e. wooden door factory would create a wooden door and wooden door fitting expert and iron door factory would create an iron door and iron door fitting expert
```php
interface DoorFactory
{
@@ -336,9 +298,7 @@ class IronDoorFactory implements DoorFactory
}
}
```
And then it can be used as
```php
$woodenFactory = new WoodenDoorFactory();
@@ -358,24 +318,20 @@ $door->getDescription(); // Output: I am an iron door
$expert->getDescription(); // Output: I can only fit iron doors
```
As you can see the wooden door factory has encapsulated the `carpenter` and the `wooden door` also iron door factory has encapsulated the `iron door` and `welder`. And thus it had helped us make sure that for each of the created door, we do not get a wrong fitting expert.
As you can see the wooden door factory has encapsulated the `carpenter` and the `wooden door` also iron door factory has encapsulated the `iron door` and `welder`. And thus it had helped us make sure that for each of the created door, we do not get a wrong fitting expert.
**When to use?**
When there are interrelated dependencies with not-that-simple creation logic involved
## 👷 Builder
Real world example
> Imagine you are at Hardee's and you order a specific deal, lets say, "Big Hardee" and they hand it over to you without _any questions_; this is the example of simple factory. But there are cases when the creation logic might involve more steps. For example you want a customized Subway deal, you have several options in how your burger is made e.g what bread do you want? what types of sauces would you like? What cheese would you want? etc. In such cases builder pattern comes to the rescue.
> Imagine you are at Hardee's and you order a specific deal, lets say, "Big Hardee" and they hand it over to you without *any questions*; this is the example of simple factory. But there are cases when the creation logic might involve more steps. For example you want a customized Subway deal, you have several options in how your burger is made e.g what bread do you want? what types of sauces would you like? What cheese would you want? etc. In such cases builder pattern comes to the rescue.
In plain words
> Allows you to create different flavors of an object while avoiding constructor pollution. Useful when there could be several flavors of an object. Or when there are a lot of steps involved in creation of an object.
Wikipedia says
> The builder pattern is an object creation software design pattern with the intentions of finding a solution to the telescoping constructor anti-pattern.
Having said that let me add a bit about what telescoping constructor anti-pattern is. At one point or the other we have all seen a constructor like below:
@@ -460,7 +416,6 @@ class BurgerBuilder
}
}
```
And then it can be used as:
```php
@@ -475,18 +430,15 @@ $burger = (new BurgerBuilder(14))
When there could be several flavors of an object and to avoid the constructor telescoping. The key difference from the factory pattern is that; factory pattern is to be used when the creation is a one step process while builder pattern is to be used when the creation is a multi step process.
## 🐑 Prototype
🐑 Prototype
------------
Real world example
> Remember dolly? The sheep that was cloned! Lets not get into the details but the key point here is that it is all about cloning
In plain words
> Create object based on an existing object through cloning.
Wikipedia says
> The prototype pattern is a creational design pattern in software development. It is used when the type of objects to create is determined by a prototypical instance, which is cloned to produce new objects.
In short, it allows you to create a copy of an existing object and modify it to your needs, instead of going through the trouble of creating an object from scratch and setting it up.
@@ -528,9 +480,7 @@ class Sheep
}
}
```
Then it can be cloned like below
```php
$original = new Sheep('Jolly');
echo $original->getName(); // Jolly
@@ -549,18 +499,15 @@ Also you could use the magic method `__clone` to modify the cloning behavior.
When an object is required that is similar to existing object or when the creation would be expensive as compared to cloning.
## 💍 Singleton
💍 Singleton
------------
Real world example
> There can only be one president of a country at a time. The same president has to be brought to action, whenever duty calls. President here is singleton.
In plain words
> Ensures that only one object of a particular class is ever created.
Wikipedia says
> In software engineering, the singleton pattern is a software design pattern that restricts the instantiation of a class to one object. This is useful when exactly one object is needed to coordinate actions across the system.
Singleton pattern is actually considered an anti-pattern and overuse of it should be avoided. It is not necessarily bad and could have some valid use-cases but should be used with caution because it introduces a global state in your application and change to it in one place could affect in the other areas and it could become pretty difficult to debug. The other bad thing about them is it makes your code tightly coupled plus mocking the singleton could be difficult.
@@ -568,7 +515,6 @@ Singleton pattern is actually considered an anti-pattern and overuse of it shoul
**Programmatic Example**
To create a singleton, make the constructor private, disable cloning, disable extension and create a static variable to house the instance
```php
final class President
{
@@ -599,9 +545,7 @@ final class President
}
}
```
Then in order to use
```php
$president1 = President::getInstance();
$president2 = President::getInstance();
@@ -610,39 +554,33 @@ var_dump($president1 === $president2); // true
```
## Structural Design Patterns
In plain words
> Structural patterns are mostly concerned with object composition or in other words how the entities can use each other. Or yet another explanation would be, they help in answering "How to build a software component?"
Wikipedia says
> In software engineering, structural design patterns are design patterns that ease the design by identifying a simple way to realize relationships between entities.
There are 7 types of structural patterns
- [Adapter](#-adapter)
- [Bridge](#-bridge)
- [Composite](#-composite)
- [Decorator](#-decorator)
- [Facade](#-facade)
- [Flyweight](#-flyweight)
- [Proxy](#-proxy)
## 🔌 Adapter
* [Adapter](#-adapter)
* [Bridge](#-bridge)
* [Composite](#-composite)
* [Decorator](#-decorator)
* [Facade](#-facade)
* [Flyweight](#-flyweight)
* [Proxy](#-proxy)
🔌 Adapter
-------
Real world example
> Consider that you have some pictures in your memory card and you need to transfer them to your computer. In order to transfer them you need some kind of adapter that is compatible with your computer ports so that you can attach memory card to your computer. In this case card reader is an adapter.
> Another example would be the famous power adapter; a three legged plug can't be connected to a two pronged outlet, it needs to use a power adapter that makes it compatible with the two pronged outlet.
> Yet another example would be a translator translating words spoken by one person to another
In plain words
> Adapter pattern lets you wrap an otherwise incompatible object in an adapter to make it compatible with another class.
Wikipedia says
> In software engineering, the adapter pattern is a software design pattern that allows the interface of an existing class to be used as another interface. It is often used to make existing classes work with others without modifying their source code.
**Programmatic Example**
@@ -671,9 +609,7 @@ class AsianLion implements Lion
}
}
```
And hunter expects any implementation of `Lion` interface to hunt.
```php
class Hunter
{
@@ -711,7 +647,6 @@ class WildDogAdapter implements Lion
}
}
```
And now the `WildDog` can be used in our game using `WildDogAdapter`.
```php
@@ -722,20 +657,17 @@ $hunter = new Hunter();
$hunter->hunt($wildDogAdapter);
```
## 🚡 Bridge
🚡 Bridge
------
Real world example
> Consider you have a website with different pages and you are supposed to allow the user to change the theme. What would you do? Create multiple copies of each of the pages for each of the themes or would you just create separate theme and load them based on the user's preferences? Bridge pattern allows you to do the second i.e.
![With and without the bridge pattern](https://cloud.githubusercontent.com/assets/11269635/23065293/33b7aea0-f515-11e6-983f-98823c9845ee.png)
In Plain Words
> Bridge pattern is about preferring composition over inheritance. Implementation details are pushed from a hierarchy to another object with a separate hierarchy.
Wikipedia says
> The bridge pattern is a design pattern used in software engineering that is meant to "decouple an abstraction from its implementation so that the two can vary independently"
**Programmatic Example**
@@ -779,9 +711,7 @@ class Careers implements WebPage
}
}
```
And the separate theme hierarchy
```php
interface Theme
@@ -811,9 +741,7 @@ class AquaTheme implements Theme
}
}
```
And both the hierarchies
```php
$darkTheme = new DarkTheme();
@@ -827,15 +755,12 @@ echo $careers->getContent(); // "Careers page in Dark Black";
## 🌿 Composite
Real world example
> Every organization is composed of employees. Each of the employees has the same features i.e. has a salary, has some responsibilities, may or may not report to someone, may or may not have some subordinates etc.
In plain words
> Composite pattern lets clients treat the individual objects in a uniform manner.
Wikipedia says
> In software engineering, the composite pattern is a partitioning design pattern. The composite pattern describes that a group of objects is to be treated in the same way as a single instance of an object. The intent of a composite is to "compose" objects into tree structures to represent part-whole hierarchies. Implementing the composite pattern lets clients treat individual objects and compositions uniformly.
**Programmatic Example**
@@ -857,7 +782,7 @@ class Developer implements Employee
protected $salary;
protected $name;
protected $roles;
public function __construct(string $name, float $salary)
{
$this->name = $name;
@@ -959,18 +884,17 @@ $organization->addEmployee($jane);
echo "Net salaries: " . $organization->getNetSalaries(); // Net Salaries: 27000
```
## ☕ Decorator
☕ Decorator
-------------
Real world example
> Imagine you run a car service shop offering multiple services. Now how do you calculate the bill to be charged? You pick one service and dynamically keep adding to it the prices for the provided services till you get the final cost. Here each type of service is a decorator.
In plain words
> Decorator pattern lets you dynamically change the behavior of an object at run time by wrapping them in an object of a decorator class.
Wikipedia says
> In object-oriented programming, the decorator pattern is a design pattern that allows behavior to be added to an individual object, either statically or dynamically, without affecting the behavior of other objects from the same class. The decorator pattern is often useful for adhering to the Single Responsibility Principle, as it allows functionality to be divided between classes with unique areas of concern.
**Programmatic Example**
@@ -997,9 +921,7 @@ class SimpleCoffee implements Coffee
}
}
```
We want to make the code extensible to allow options to modify it if required. Lets make some add-ons (decorators)
```php
class MilkCoffee implements Coffee
{
@@ -1082,18 +1004,16 @@ echo $someCoffee->getCost(); // 20
echo $someCoffee->getDescription(); // Simple Coffee, milk, whip, vanilla
```
## 📦 Facade
📦 Facade
----------------
Real world example
> How do you turn on the computer? "Hit the power button" you say! That is what you believe because you are using a simple interface that computer provides on the outside, internally it has to do a lot of stuff to make it happen. This simple interface to the complex subsystem is a facade.
In plain words
> Facade pattern provides a simplified interface to a complex subsystem.
Wikipedia says
> A facade is an object that provides a simplified interface to a larger body of code, such as a class library.
**Programmatic Example**
@@ -1139,9 +1059,7 @@ class Computer
}
}
```
Here we have the facade
```php
class ComputerFacade
{
@@ -1168,27 +1086,23 @@ class ComputerFacade
}
}
```
Now to use the facade
```php
$computer = new ComputerFacade(new Computer());
$computer->turnOn(); // Ouch! Beep beep! Loading.. Ready to be used!
$computer->turnOff(); // Bup bup buzzz! Haah! Zzzzz
```
## 🍃 Flyweight
🍃 Flyweight
---------
Real world example
> Did you ever have fresh tea from some stall? They often make more than one cup that you demanded and save the rest for any other customer so to save the resources e.g. gas etc. Flyweight pattern is all about that i.e. sharing.
In plain words
> It is used to minimize memory usage or computational expenses by sharing as much as possible with similar objects.
Wikipedia says
> In computer programming, flyweight is a software design pattern. A flyweight is an object that minimizes memory use by sharing as much data as possible with other similar objects; it is a way to use objects in large numbers when a simple repeated representation would use an unacceptable amount of memory.
**Programmatic example**
@@ -1244,7 +1158,6 @@ class TeaShop
}
}
```
And it can be used as below
```php
@@ -1262,17 +1175,13 @@ $shop->serve();
```
## 🎱 Proxy
Real world example
> Have you ever used an access card to go through a door? There are multiple options to open that door i.e. it can be opened either using access card or by pressing a button that bypasses the security. The door's main functionality is to open but there is a proxy added on top of it to add some functionality. Let me better explain it using the code example below.
In plain words
> Using the proxy pattern, a class represents the functionality of another class.
Wikipedia says
> A proxy, in its most general form, is a class functioning as an interface to something else. A proxy is a wrapper or agent object that is being called by the client to access the real serving object behind the scenes. Use of the proxy can simply be forwarding to the real object, or can provide additional logic. In the proxy extra functionality can be provided, for example caching when operations on the real object are resource intensive, or checking preconditions before operations on the real object are invoked.
**Programmatic Example**
@@ -1299,9 +1208,7 @@ class LabDoor implements Door
}
}
```
Then we have a proxy to secure any doors that we want
```php
class SecuredDoor
{
@@ -1332,9 +1239,7 @@ class SecuredDoor
}
}
```
And here is how it can be used
```php
$door = new SecuredDoor(new LabDoor());
$door->open('invalid'); // Big no! It ain't possible.
@@ -1342,44 +1247,38 @@ $door->open('invalid'); // Big no! It ain't possible.
$door->open('$ecr@t'); // Opening lab door
$door->close(); // Closing lab door
```
Yet another example would be some sort of data-mapper implementation. For example, I recently made an ODM (Object Data Mapper) for MongoDB using this pattern where I wrote a proxy around mongo classes while utilizing the magic method `__call()`. All the method calls were proxied to the original mongo class and result retrieved was returned as it is but in case of `find` or `findOne` data was mapped to the required class objects and the object was returned instead of `Cursor`.
## Behavioral Design Patterns
In plain words
> It is concerned with assignment of responsibilities between the objects. What makes them different from structural patterns is they don't just specify the structure but also outline the patterns for message passing/communication between them. Or in other words, they assist in answering "How to run a behavior in software component?"
Wikipedia says
> In software engineering, behavioral design patterns are design patterns that identify common communication patterns between objects and realize these patterns. By doing so, these patterns increase flexibility in carrying out this communication.
There are 10 types of behavioral design patterns
- [Chain of Responsibility](#-chain-of-responsibility)
- [Command](#-command)
- [Iterator](#-iterator)
- [Mediator](#-mediator)
- [Memento](#-memento)
- [Observer](#-observer)
- [Visitor](#-visitor)
- [Strategy](#-strategy)
- [State](#-state)
- [Template Method](#-template-method)
* [Chain of Responsibility](#-chain-of-responsibility)
* [Command](#-command)
* [Iterator](#-iterator)
* [Mediator](#-mediator)
* [Memento](#-memento)
* [Observer](#-observer)
* [Visitor](#-visitor)
* [Strategy](#-strategy)
* [State](#-state)
* [Template Method](#-template-method)
## 🔗 Chain of Responsibility
Real world example
> For example, you have three payment methods (`A`, `B` and `C`) setup in your account; each having a different amount in it. `A` has 100 USD, `B` has 300 USD and `C` having 1000 USD and the preference for payments is chosen as `A` then `B` then `C`. You try to purchase something that is worth 210 USD. Using Chain of Responsibility, first of all account `A` will be checked if it can make the purchase, if yes purchase will be made and the chain will be broken. If not, request will move forward to account `B` checking for amount if yes chain will be broken otherwise the request will keep forwarding till it finds the suitable handler. Here `A`, `B` and `C` are links of the chain and the whole phenomenon is Chain of Responsibility.
In plain words
> It helps building a chain of objects. Request enters from one end and keeps going from object to object till it finds the suitable handler.
Wikipedia says
> In object-oriented design, the chain-of-responsibility pattern is a design pattern consisting of a source of command objects and a series of processing objects. Each processing object contains logic that defines the types of command objects that it can handle; the rest are passed to the next processing object in the chain.
**Programmatic Example**
@@ -1473,25 +1372,22 @@ $bank->pay(259);
// Paid 259 using Bitcoin!
```
## 👮 Command
👮 Command
-------
Real world example
> A generic example would be you ordering food at a restaurant. You (i.e. `Client`) ask the waiter (i.e. `Invoker`) to bring some food (i.e. `Command`) and waiter simply forwards the request to Chef (i.e. `Receiver`) who has the knowledge of what and how to cook.
> Another example would be you (i.e. `Client`) switching on (i.e. `Command`) the television (i.e. `Receiver`) using a remote control (`Invoker`).
In plain words
> Allows you to encapsulate actions in objects. The key idea behind this pattern is to provide the means to decouple client from receiver.
Wikipedia says
> In object-oriented programming, the command pattern is a behavioral design pattern in which an object is used to encapsulate all information needed to perform an action or trigger an event at a later time. This information includes the method name, the object that owns the method and values for the method parameters.
**Programmatic Example**
First of all we have the receiver that has the implementation of every action that could be performed
```php
// Receiver
class Bulb
@@ -1507,9 +1403,7 @@ class Bulb
}
}
```
then we have an interface that each of the commands are going to implement and then we have a set of commands
```php
interface Command
{
@@ -1569,9 +1463,7 @@ class TurnOff implements Command
}
}
```
Then we have an `Invoker` with whom the client will interact to process any commands
```php
// Invoker
class RemoteControl
@@ -1582,9 +1474,7 @@ class RemoteControl
}
}
```
Finally let's see how we can use it in our client
```php
$bulb = new Bulb();
@@ -1598,18 +1488,16 @@ $remote->submit($turnOff); // Darkness!
Command pattern can also be used to implement a transaction based system. Where you keep maintaining the history of commands as soon as you execute them. If the final command is successfully executed, all good otherwise just iterate through the history and keep executing the `undo` on all the executed commands.
## ➿ Iterator
➿ Iterator
--------
Real world example
> An old radio set will be a good example of iterator, where user could start at some channel and then use next or previous buttons to go through the respective channels. Or take an example of MP3 player or a TV set where you could press the next and previous buttons to go through the consecutive channels or in other words they all provide an interface to iterate through the respective channels, songs or radio stations.
> An old radio set will be a good example of iterator, where user could start at some channel and then use next or previous buttons to go through the respective channels. Or take an example of MP3 player or a TV set where you could press the next and previous buttons to go through the consecutive channels or in other words they all provide an interface to iterate through the respective channels, songs or radio stations.
In plain words
> It presents a way to access the elements of an object without exposing the underlying presentation.
Wikipedia says
> In object-oriented programming, the iterator pattern is a design pattern in which an iterator is used to traverse a container and access the container's elements. The iterator pattern decouples algorithms from containers; in some cases, algorithms are necessarily container-specific and thus cannot be decoupled.
**Programmatic example**
@@ -1632,7 +1520,6 @@ class RadioStation
}
}
```
Then we have our iterator
```php
@@ -1691,9 +1578,7 @@ class StationList implements Countable, Iterator
}
}
```
And then it can be used as
```php
$stationList = new StationList();
@@ -1709,18 +1594,16 @@ foreach($stationList as $station) {
$stationList->removeStation(new RadioStation(89)); // Will remove station 89
```
## 👽 Mediator
👽 Mediator
--------
Real world example
> A general example would be when you talk to someone on your mobile phone, there is a network provider sitting between you and them and your conversation goes through it instead of being directly sent. In this case network provider is mediator.
In plain words
> Mediator pattern adds a third party object (called mediator) to control the interaction between two objects (called colleagues). It helps reduce the coupling between the classes communicating with each other. Because now they don't need to have the knowledge of each other's implementation.
Wikipedia says
> In software engineering, the mediator pattern defines an object that encapsulates how a set of objects interact. This pattern is considered to be a behavioral pattern due to the way it can alter the program's running behavior.
**Programmatic Example**
@@ -1730,7 +1613,7 @@ Here is the simplest example of a chat room (i.e. mediator) with users (i.e. col
First of all, we have the mediator i.e. the chat room
```php
interface ChatRoomMediator
interface ChatRoomMediator
{
public function showMessage(User $user, string $message);
}
@@ -1749,7 +1632,6 @@ class ChatRoom implements ChatRoomMediator
```
Then we have our users i.e. colleagues
```php
class User {
protected $name;
@@ -1769,9 +1651,7 @@ class User {
}
}
```
And the usage
```php
$mediator = new ChatRoom();
@@ -1786,18 +1666,15 @@ $jane->send('Hey!');
// Feb 14, 10:58 [Jane]: Hey!
```
## 💾 Memento
💾 Memento
-------
Real world example
> Take the example of calculator (i.e. originator), where whenever you perform some calculation the last calculation is saved in memory (i.e. memento) so that you can get back to it and maybe get it restored using some action buttons (i.e. caretaker).
In plain words
> Memento pattern is about capturing and storing the current state of an object in a manner that it can be restored later on in a smooth manner.
Wikipedia says
> The memento pattern is a software design pattern that provides the ability to restore an object to its previous state (undo via rollback).
Usually useful when you need to provide some sort of undo functionality.
@@ -1878,24 +1755,20 @@ $editor->restore($saved);
$editor->getContent(); // This is the first sentence. This is second.
```
## 😎 Observer
😎 Observer
--------
Real world example
> A good example would be the job seekers where they subscribe to some job posting site and they are notified whenever there is a matching job opportunity.
> A good example would be the job seekers where they subscribe to some job posting site and they are notified whenever there is a matching job opportunity.
In plain words
> Defines a dependency between objects so that whenever an object changes its state, all its dependents are notified.
Wikipedia says
> The observer pattern is a software design pattern in which an object, called the subject, maintains a list of its dependents, called observers, and notifies them automatically of any state changes, usually by calling one of their methods.
**Programmatic example**
Translating our example from above. First of all we have job seekers that need to be notified for a job posting
```php
class JobPost
{
@@ -1928,9 +1801,7 @@ class JobSeeker implements Observer
}
}
```
Then we have our job postings to which the job seekers will subscribe
```php
class EmploymentAgency implements Observable
{
@@ -1954,9 +1825,7 @@ class EmploymentAgency implements Observable
}
}
```
Then it can be used as
```php
// Create subscribers
$johnDoe = new JobSeeker('John Doe');
@@ -1975,18 +1844,15 @@ $jobPostings->addJob(new JobPost('Software Engineer'));
// Hi Jane Doe! New job posted: Software Engineer
```
## 🏃 Visitor
🏃 Visitor
-------
Real world example
> Consider someone visiting Dubai. They just need a way (i.e. visa) to enter Dubai. After arrival, they can come and visit any place in Dubai on their own without having to ask for permission or to do some leg work in order to visit any place here; just let them know of a place and they can visit it. Visitor pattern lets you do just that, it helps you add places to visit so that they can visit as much as they can without having to do any legwork.
In plain words
> Visitor pattern lets you add further operations to objects without having to modify them.
Wikipedia says
> In object-oriented programming and software engineering, the visitor design pattern is a way of separating an algorithm from an object structure on which it operates. A practical result of this separation is the ability to add new operations to existing object structures without modifying those structures. It is one way to follow the open/closed principle.
**Programmatic example**
@@ -2008,9 +1874,7 @@ interface AnimalOperation
public function visitDolphin(Dolphin $dolphin);
}
```
Then we have our implementations for the animals
```php
class Monkey implements Animal
{
@@ -2051,9 +1915,7 @@ class Dolphin implements Animal
}
}
```
Let's implement our visitor
```php
class Speak implements AnimalOperation
{
@@ -2075,7 +1937,6 @@ class Speak implements AnimalOperation
```
And then it can be used as
```php
$monkey = new Monkey();
$lion = new Lion();
@@ -2083,11 +1944,10 @@ $dolphin = new Dolphin();
$speak = new Speak();
$monkey->accept($speak); // Ooh oo aa aa!
$monkey->accept($speak); // Ooh oo aa aa!
$lion->accept($speak); // Roaaar!
$dolphin->accept($speak); // Tuut tutt tuutt!
```
We could have done this simply by having an inheritance hierarchy for the animals but then we would have to modify the animals whenever we would have to add new actions to animals. But now we will not have to change them. For example, let's say we are asked to add the jump behavior to the animals, we can simply add that by creating a new visitor i.e.
```php
@@ -2109,9 +1969,7 @@ class Jump implements AnimalOperation
}
}
```
And for the usage
```php
$jump = new Jump();
@@ -2125,18 +1983,16 @@ $dolphin->accept($speak); // Tuut tutt tuutt!
$dolphin->accept($jump); // Walked on water a little and disappeared
```
## 💡 Strategy
💡 Strategy
--------
Real world example
> Consider the example of sorting, we implemented bubble sort but the data started to grow and bubble sort started getting very slow. In order to tackle this we implemented Quick sort. But now although the quick sort algorithm was doing better for large datasets, it was very slow for smaller datasets. In order to handle this we implemented a strategy where for small datasets, bubble sort will be used and for larger, quick sort.
In plain words
> Strategy pattern allows you to switch the algorithm or strategy based upon the situation.
Wikipedia says
> In computer programming, the strategy pattern (also known as the policy pattern) is a behavioural software design pattern that enables an algorithm's behavior to be selected at runtime.
**Programmatic example**
@@ -2173,7 +2029,6 @@ class QuickSortStrategy implements SortStrategy
```
And then we have our client that is going to use any strategy
```php
class Sorter
{
@@ -2190,9 +2045,7 @@ class Sorter
}
}
```
And it can be used as
```php
$dataset = [1, 5, 4, 3, 2, 8];
@@ -2203,18 +2056,15 @@ $sorter = new Sorter(new QuickSortStrategy());
$sorter->sort($dataset); // Output : Sorting using quick sort
```
## 💢 State
💢 State
-----
Real world example
> Imagine you are using some drawing application, you choose the paint brush to draw. Now the brush changes its behavior based on the selected color i.e. if you have chosen red color it will draw in red, if blue then it will be in blue etc.
> Imagine you are using some drawing application, you choose the paint brush to draw. Now the brush changes its behavior based on the selected color i.e. if you have chosen red color it will draw in red, if blue then it will be in blue etc.
In plain words
> It lets you change the behavior of a class when the state changes.
Wikipedia says
> The state pattern is a behavioral software design pattern that implements a state machine in an object-oriented way. With the state pattern, a state machine is implemented by implementing each individual state as a derived class of the state pattern interface, and implementing state transitions by invoking methods defined by the pattern's superclass.
> The state pattern can be interpreted as a strategy pattern which is able to switch the current strategy through invocations of methods defined in the pattern's interface.
@@ -2254,9 +2104,7 @@ class DefaultText implements WritingState
}
}
```
Then we have our editor
```php
class TextEditor
{
@@ -2278,9 +2126,7 @@ class TextEditor
}
}
```
And then it can be used as
```php
$editor = new TextEditor(new DefaultText());
@@ -2304,12 +2150,11 @@ $editor->type('Fifth line');
// fifth line
```
## 📒 Template Method
📒 Template Method
---------------
Real world example
> Suppose we are getting some house built. The steps for building might look like
>
> - Prepare the base of house
> - Build the walls
> - Add roof
@@ -2318,11 +2163,9 @@ Real world example
> The order of these steps could never be changed i.e. you can't build the roof before building the walls etc but each of the steps could be modified for example walls can be made of wood or polyester or stone.
In plain words
> Template method defines the skeleton of how a certain algorithm could be performed, but defers the implementation of those steps to the children classes.
Wikipedia says
> In software engineering, the template method pattern is a behavioral design pattern that defines the program skeleton of an algorithm in an operation, deferring some steps to subclasses. It lets one redefine certain steps of an algorithm without changing the algorithm's structure.
**Programmatic Example**
@@ -2330,7 +2173,6 @@ Wikipedia says
Imagine we have a build tool that helps us test, lint, build, generate build reports (i.e. code coverage reports, linting report etc) and deploy our app on the test server.
First of all we have our base class that specifies the skeleton for the build algorithm
```php
abstract class Builder
{
@@ -2400,7 +2242,6 @@ class IosBuilder extends Builder
}
}
```
And then it can be used as
```php

View File

@@ -0,0 +1,2 @@
[![](/guides/dhcp.png)](/guides/dhcp.png)

View File

@@ -0,0 +1,5 @@
DNS or Domain Name System is one of the fundamental blocks of the internet. As a developer, you should have at-least the basic understanding of how it works. This article is a brief introduction to what is DNS and how it works.
DNS at its simplest is like a phonebook on your mobile phone. Whenever you have to call one of your contacts, you can either dial their number from your memory or use their name which will then be used by your mobile phone to search their number in your phone book to call them. Every time you make a new friend, or your existing friend gets a mobile phone, you have to memorize their phone number or save it in your phonebook to be able to call them later on. DNS or Domain Name System, in a similar fashion, is a mechanism that allows you to browse websites on the internet. Just like your mobile phone does not know how to call without knowing the phone number, your browser does not know how to open a website just by the domain name; it needs to know the IP Address for the website to open. You can either type the IP Address to open, or provide the domain name and press enter which will then be used by your browser to find the IP address by going through several hoops. The picture below is the illustration of how your browser finds a website on the internet.
[![](https://i.imgur.com/z9rwm5A.png)](https://i.imgur.com/z9rwm5A.png)

View File

@@ -0,0 +1,41 @@
Around 10 years ago, Jeff Atwood (the founder of stackoverflow) made a case that JavaScript is going to be the future and he coined the “Atwood Law” which states that *Any application that can be written in JavaScript will eventually be written in JavaScript*. Fast-forward to today, 10 years later, if you look at it it rings truer than ever. JavaScript is continuing to gain more and more adoption.
### JavaScript is announced
JavaScript was initially created by [Brendan Eich](https://twitter.com/BrendanEich) of NetScape and was first announced in a press release by Netscape in 1995. It has a bizarre history of naming; initally it was named `Mocha` by the creator, which was later renamed to `LiveScript`. In 1996, about a year later after the release, NetScape decided to rename it to be `JavaScript` with hopes of capitalizing on the Java community (although JavaScript did not have any relationship with Java) and released Netscape 2.0 with the official support of JavaScript.
### ES1, ES2 and ES3
In 1996, Netscape decided to submit it to [ECMA International](https://en.wikipedia.org/wiki/Ecma_International) with the hopes of getting it standardized. First edition of the standard specification was released in 1997 and the language was standardized. After the initial release, `ECMAScript` was continued to be worked upon and in no-time two more versions were released ECMAScript 2 in 1998 and ECMAScript 3 in 1999.
### Decade of Silence and ES4
After the release of ES3 in 1999, there was a complete silence for a decade and no changes were made to the official standard. There was some work on the fourth edition in the initial days; some of the features that were being discussed included classes, modules, static typings, destructuring etc. It was being targeted to be released by 2008 but was abandoned due to political differences concerning language complexity. However, the vendors kept introducing the extensions to the language and the developers were left scratching their heads — adding polyfills to battle compatibility issues between different browsers.
### From silence to ES5
Google, Microsoft, Yahoo and other disputers of ES4 came together and decided to work on a less ambitious update to ES3 tentatively named ES3.1. But the teams were still fighting about what to include from ES4 and what not. Finally, in 2009 ES5 was released mainly focusing on fixing the compatibility and security issues etc. But there wasnt much of a splash in the water — it took ages for the vendors to incorporate the standards and many developers were still using ES3 without being aware of the “modern” standards.
### Release of ES6 — ECMAScript 2015
After a few years of the release of ES5, things started to change, TC39 (the committee under ECMA international responsible for ECMAScript standardization) kept working on the next version of ECMAScript (ES6) which was originally named ES Harmony, before being eventually released with the name ES2015. ES2015 adds significant features and syntactic sugar to allow writing complex applications. Some of the features that ES6 has to offer, include Classes, Modules, Arrows, Enhanced object literals, Template strings, Destructuring, Default param values + rest + spread, Let and Const, Iterators + for..of, Generators, Maps + Sets, Proxies, Symbols, Promises, math + number + string + array + object APIs [etc](http://es6-features.org/#Constants)
Browser support for ES6 is still scarce but everything that ES6 has to offer is still available to developers by transpiling the ES6 code to ES5. With the release of 6th version of ECMAScript, TC39 decided to move to yearly model of releasing updates to ECMAScript so to make sure that the new features are added as soon as they are approved and we dont have to wait for the full specification to be drafted and approved — thus 6th version of ECMAScript was renamed as ECMAScript 2015 or ES2015 before the release in June 2015. And the next versions of ECMAScript were decided to published in June of every year.
### Release of ES7 — ECMAScript 2016
In June 2016, seventh version of ECMAScript was released. As ECMAScript has been moved to an yearly release model, ECMAScript 2016 (ES2016) comparatively did not have much to offer. ES2016 includes just two new features
* Exponentiation operator `**`
* `Array.prototype.includes`
### Release of ES8 — ECMAScript 2017
The eighth version of ECMAScript was released in June 2017. The key highlight of ES8 was the addition of async functions. Here is the list of new features in ES8
* `Object.values()` and `Object.entries()`
* String padding i.e. `String.prototype.padEnd()` and `String.prototype.padStart()`
* `Object.getOwnPropertyDescriptors`
* Trailing commas in function parameter lists and calls
* Async functions
### What is ESNext then?
ESNext is a dynamic name that refers to whatever the current version of ECMAScript is at the given time. For example, at the time of this writing `ES2017` or `ES8` is `ESNext`.
### What does the future hold?
Since the release of ES6, [TC39](https://github.com/tc39) has quite streamlined their process. TC39 operates through a Github organization now and there are [several proposals](https://github.com/tc39/proposals) for new features or syntax to be added to the next versions of ECMAScript. Any one can go ahead and [submit a proposal](https://github.com/tc39/proposals) thus resulting in increasing the participation from the community. Every proposal goes through [four stages of maturity](https://tc39.github.io/process-document/) before it makes it into the specification.
And that about wraps it up. Feel free to leave your feedback in the comments section below. Also here are the links to original language specifications [ES6](https://www.ecma-international.org/ecma-262/6.0/), [ES7](https://www.ecma-international.org/ecma-262/7.0/) and [ES8](https://www.ecma-international.org/ecma-262/8.0/).

View File

@@ -0,0 +1,251 @@
As users, we easily get frustrated by the buffering videos, the images that take seconds to load, pages that got stuck because the content is being loaded. Loading the resources from some cache is much faster than fetching the same from the originating server. It reduces latency, speeds up the loading of resources, decreases the load on server, cuts down the bandwidth costs etc.
### Introduction
What is web cache? It is something that sits somewhere between the client and the server, continuously looking at the requests and their responses, looking for any responses that can be cached. So that there is less time consumed when the same request is made again.
![Web Cache](https://i.imgur.com/mJYVvTh.png)
> Note that this image is just to give you an idea. Depending upon the type of cache, the place where it is implemented could vary. More on this later.
Before we get into further details, let me give you an overview of the terms that will be used, further in the article
- **Client** could be your browser or any application requesting the server for some resource
- **Origin Server**, the source of truth, houses all the content required by the client and is responsible for fulfilling the client requests.
- **Stale Content** is the cached but expired content
- **Fresh Content** is the content available in cache that hasn't expired yet
- **Cache Validation** is the process of contacting the server to check the validity of the cached content and get it updated for when it is going to expire
- **Cache Invalidation** is the process of removing any stale content available in the cache
![](https://i.imgur.com/9MjlzvW.png)
### Caching Locations
Web cache can be shared or private depending upon the location where it exists. Here is the list of different caching locations
- [Browser Cache](#browser-cache)
- [Proxy Cache](#proxy-cache)
- [Reverse Proxy Cache](#reverse-proxy-cache)
#### Browser Cache
You might have noticed that when you click the back button in your browser it takes less time to load the page than the time that it took during the first load; this is the browser cache in play. Browser cache is the most common location for caching and browsers usually reserve some space for it.
![Web Cache](https://i.imgur.com/mJYVvTh.png)
A browser cache is limited to just one user and unlike other caches, it can store the "private" responses. More on it later.
#### Proxy Cache
Unlike browser cache which serves a single user, proxy caches may serve hundreds of different users accessing the same content. They are usually implemented on a broader level by ISPs or any other independent entities for example.
![Proxy Cache](https://i.imgur.com/3mj6e1O.png)
#### Reverse Proxy Cache
Reverse proxy cache or surrogate cache is implemented close to the origin servers in order to reduce the load on server. Unlike proxy caches which are implemented by ISPs etc to reduce the bandwidth usage in a network, surrogates or reverse proxy caches are implemented near to the origin servers by the server administrators to reduce the load on server.
![Reverse Proxy Cache](http://i.imgur.com/Eg4Cru3.png)
Although you can control the reverse proxy caches (since it is implemented by you on your server) you can not avoid or control browser and proxy caches. And if your website is not configured to use these caches properly, it will still be cached using whatever the defaults are set on these caches.
### Caching Headers
So, how do we control the web cache? Whenever the server emits some response, it is accompanied with some HTTP headers to guide the caches whether and how to cache this response. Content provider is the one that has to make sure to return proper HTTP headers to force the caches on how to cache the content.
- [Expires](#expires)
- [Pragma](#pragma)
- [Cache-Control](#cache-control)
- [private](#private)
- [public](#public)
- [no-store](#no-store)
- [no-cache](#no-cache)
- [max-age: seconds](#max-age)
- [s-maxage: seconds](#s-maxage)
- [must-revalidate](#must-revalidate)
- [proxy-revalidate](#proxy-revalidate)
- [Mixing Values](#mixing-values)
- [Validators](#validators)
- [ETag](#etag)
- [Last-Modified](#last-modified)
#### Expires
Before HTTP/1.1 and introduction of `Cache-Control`, there was `Expires` header which is simply a timestamp telling the caches how long should some content be considered fresh. Possible value to this header is absolute expiry date; where date has to be in GMT. Below is the sample header
```html
Expires: Mon, 13 Mar 2017 12:22:00 GMT
```
It should be noted that the date cannot be more than a year and if the date format is wrong, content will be considered stale. Also, the clock on cache has to be in sync with the clock on server, otherwise the desired results might not be achieved.
Although, `Expires` header is still valid and is supported widely by the caches, preference should be given to HTTP/1.1 successor of it i.e. `Cache-Control`.
#### Pragma
Another one from the old, pre HTTP/1.1 days, is `Pragma`. Everything that it could do is now possible using the cache-control header given below. However, one thing I would like to point out about it is, you might see `Pragma: no-cache` being used here and there in hopes of stopping the response from being cached. It might not necessarily work; as HTTP specification discusses it in the request headers and there is no mention of it in the response headers. Rather `Cache-Control` header should be used to control the caching.
#### Cache-Control
Cache-Control specifies how long and in what manner should the content be cached. This family of headers was introduced in HTTP/1.1 to overcome the limitations of the `Expires` header.
Value for the `Cache-Control` header is composite i.e. it can have multiple directive/values. Let's look at the possible values that this header may contain.
##### private
Setting the cache to `private` means that the content will not be cached in any of the proxies and it will only be cached by the client (i.e. browser)
```html
Cache-Control: private
```
Having said that, don't let it fool you in to thinking that setting this header will make your data any secure; you still have to use SSL for that purpose.
##### public
If set to `public`, apart from being cached by the client, it can also be cached by the proxies; serving many other users
```html
Cache-Control: public
```
##### no-store
**`no-store`** specifies that the content is not to be cached by any of the caches
```html
Cache-Control: no-store
```
##### no-cache
**`no-cache`** indicates that the cache can be maintained but the cached content is to be re-validated (using `ETag` for example) from the server before being served. That is, there is still a request to server but for validation and not to download the cached content.
```html
Cache-Control: max-age=3600, no-cache, public
```
##### max-age: seconds
**`max-age`** specifies the number of seconds for which the content will be cached. For example, if the `cache-control` looks like below:
```html
Cache-Control: max-age=3600, public
```
it would mean that the content is publicly cacheable and will be considered stale after 60 minutes
##### s-maxage: seconds
**`s-maxage`** here `s-` prefix stands for shared. This directive specifically targets the shared caches. Like `max-age` it also gets the number of seconds for which something is to be cached. If present, it will override `max-age` and `expires` headers for shared caching.
```html
Cache-Control: s-maxage=3600, public
```
##### must-revalidate
**`must-revalidate`** it might happen sometimes that if you have network problems and the content cannot be retrieved from the server, browser may serve stale content without validation. `must-revalidate` avoids that. If this directive is present, it means that stale content cannot be served in any case and the data must be re-validated from the server before serving.
```html
Cache-Control: max-age=3600, public, must-revalidate
```
##### proxy-revalidate
**`proxy-revalidate`** is similar to `must-revalidate` but it specifies the same for shared or proxy caches. In other words `proxy-revalidate` is to `must-revalidate` as `s-maxage` is to `max-age`. But why did they not call it `s-revalidate`?. I have no idea why, if you have any clue please leave a comment below.
##### Mixing Values
You can combine these directives in different ways to achieve different caching behaviors, however `no-cache/no-store` and `public/private` are mutually exclusive.
If you specify both `no-store` and `no-cache`, `no-store` will be given precedence over `no-cache`.
```html
; If specified both
Cache-Control: no-store, no-cache
; Below will be considered
Cache-Control: no-store
```
For `private/public`, for any unauthenticated requests cache is considered `public` and for any authenticated ones cache is considered `private`.
### Validators
Up until now we only discussed how the content is cached and how long the cached content is to be considered fresh but we did not discuss how the client does the validation from the server. Below we discuss the headers used for this purpose.
#### ETag
Etag or "entity tag" was introduced in HTTP/1.1 specs. Etag is just a unique identifier that the server attaches with some resource. This ETag is later on used by the client to make conditional HTTP requests stating `"give me this resource if ETag is not same as the ETag that I have"` and the content is downloaded only if the etags do not match.
Method by which ETag is generated is not specified in the HTTP docs and usually some collision-resistant hash function is used to assign etags to each version of a resource. There could be two types of etags i.e. strong and weak
```html
ETag: "j82j8232ha7sdh0q2882" - Strong Etag
ETag: W/"j82j8232ha7sdh0q2882" - Weak Etag (prefixed with `W/`)
```
A strong validating ETag means that two resources are **exactly** same and there is no difference between them at all. While a weak ETag means that two resources are although not strictly same but could be considered same. Weak etags might be useful for dynamic content, for example.
Now you know what etags are but how does the browser make this request? by making a request to server while sending the available Etag in `If-None-Match` header.
Consider the scenario, you opened a web page which loaded a logo image with caching period of 60 seconds and ETag of `abc123xyz`. After about 30 minutes you reload the page, browser will notice that the logo which was fresh for 60 seconds is now stale; it will trigger a request to server, sending the ETag of the stale logo image in `if-none-match` header
```html
If-None-Match: "abc123xyz"
```
Server will then compare this ETag with the ETag of the current version of resource. If both etags are matched, server will send back the response of `304 Not Modified` which will tell the client that the copy that it has is still good and it will be considered fresh for another 60 seconds. If both the etags do not match i.e. the logo has likely changed and client will be sent the new logo which it will use to replace the stale logo that it has.
#### Last-Modified
Server might include the `Last-Modified` header indicating the date and time at which some content was last modified on.
```html
Last-Modified: Wed, 15 Mar 2017 12:30:26 GMT
```
When the content gets stale, client will make a conditional request including the last modified date that it has inside the header called `If-Modified-Since` to server to get the updated `Last-Modified` date; if it matches the date that the client has, `Last-Modified` date for the content is updated to be considered fresh for another `n` seconds. If the received `Last-Modified` date does not match the one that the client has, content is reloaded from the server and replaced with the content that client has.
```html
If-Modified-Since: Wed, 15 Mar 2017 12:30:26 GMT
```
You might be questioning now, what if the cached content has both the `Last-Modified` and `ETag` assigned to it? Well, in that case both are to be used i.e. there will not be any re-downloading of the resource if and only if `ETag` matches the newly retrieved one and so does the `Last-Modified` date. If either the `ETag` does not match or the `Last-Modified` is greater than the one from the server, content has to be downloaded again.
### Where do I start?
Now that we have got *everything* covered, let us put everything in perspective and see how you can use this information.
#### Utilizing Server
Before we get into the possible caching strategies , let me add the fact that most of the servers including Apache and Nginx allow you to implement your caching policy through the server so that you don't have to juggle with headers in your code.
**For example**, if you are using Apache and you have your static content placed at `/static`, you can put below `.htaccess` file in the directory to make all the content in it be cached for an year using below
```html
# Cache everything for an year
Header set Cache-Control "max-age=31536000, public"
```
You can further use `filesMatch` directive to add conditionals and use different caching strategy for different kinds of files e.g.
```html
# Cache any images for one year
<filesMatch ".(png|jpg|jpeg|gif)$">
Header set Cache-Control "max-age=31536000, public"
</filesMatch>
# Cache any CSS and JS files for a month
<filesMatch ".(css|js)$">
Header set Cache-Control "max-age=2628000, public"
</filesMatch>
```
Or if you don't want to use the `.htaccess` file you can modify Apache's configuration file `http.conf`. Same goes for Nginx, you can add the caching information in the location or server block.
#### Caching Recommendations
There is no golden rule or set standards about how your caching policy should look like, each of the application is different and you have to look and find what suits your application the best. However, just to give you a rough idea
- You can have aggressive caching (e.g. cache for an year) on any static content and use fingerprinted filenames (e.g. `style.ju2i90.css`) so that the cache is automatically rejected whenever the files are updated.
Also it should be noted that you should not cross the upper limit of one year as it [might not be honored](https://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.9)
- Look and decide do you even need caching for any dynamic content, if yes how long it should be. For example, in case of some RSS feed of a blog there could be the caching of a few hours but there couldn't be any caching for inventory items in an ERP.
- Always add the validators (preferably ETags) in your response.
- Pay attention while choosing the visibility (private or public) of the cached content. Make sure that you do not accidentally cache any user-specific or sensitive content in any public proxies. When in doubt, do not use cache at all.
- Separate the content that changes often from the content that doesn't change that often (e.g. in javascript bundles) so that when it is updated it doesn't need to make the whole cached content stale.
- Test and monitor the caching headers being served by your site. You can use the browser console or `curl -I http://some-url.com` for that purpose.
And that about wraps it up. Stay tuned for more!

View File

@@ -1,61 +1,44 @@
---
title: 'Journey to HTTP/2'
description: 'The evolution of HTTP. How it all started and where we stand today'
authorId: 'kamran'
seo:
title: 'Journey to HTTP/2 - roadmap.sh'
description: 'The evolution of HTTP. How it all started and where we stand today'
isNew: false
type: 'textual'
date: 2018-12-04
sitemap:
priority: 0.7
changefreq: 'weekly'
tags:
- 'guide'
- 'textual-guide'
- 'guide-sitemap'
---
HTTP is the protocol that every web developer should know as it powers the whole web and knowing it is definitely going to help you develop better applications. In this guide, I am going to be discussing what HTTP is, how it came to be, where it is today and how did we get here.
### What is HTTP?
First things first, what is HTTP? HTTP is the `TCP/IP` based application layer communication protocol which standardizes how the client and server communicate with each other. It defines how the content is requested and transmitted across the internet. By application layer protocol, I mean it's just an abstraction layer that standardizes how the hosts (clients and servers) communicate and itself it depends upon `TCP/IP` to get request and response between the client and server. By default TCP port `80` is used but other ports can be used as well. HTTPS, however, uses port `443`.
### HTTP/0.9 The One Liner (1991)
### HTTP/0.9 The One Liner (1991)
The first documented version of HTTP was [`HTTP/0.9`](https://www.w3.org/Protocols/HTTP/AsImplemented.html) which was put forward in 1991. It was the simplest protocol ever; having a single method called `GET`. If a client had to access some webpage on the server, it would have made the simple request like below
```html
GET /index.html
```
And the response from server would have looked as follows
```html
(response body) (connection closed)
(response body)
(connection closed)
```
That is, the server would get the request, reply with the HTML in response and as soon as the content has been transferred, the connection will be closed. There were
That is, the server would get the request, reply with the HTML in response and as soon as the content has been transferred, the connection will be closed. There were
- No headers
- `GET` was the only allowed method
- `GET` was the only allowed method
- Response had to be HTML
As you can see, the protocol really had nothing more than being a stepping stone for what was to come.
### HTTP/1.0 - 1996
In 1996, the next version of HTTP i.e. `HTTP/1.0` evolved that vastly improved over the original version.
In 1996, the next version of HTTP i.e. `HTTP/1.0` evolved that vastly improved over the original version.
Unlike `HTTP/0.9` which was only designed for HTML response, `HTTP/1.0` could now deal with other response formats i.e. images, video files, plain text or any other content type as well. It added more methods (i.e. `POST` and `HEAD`), request/response formats got changed, HTTP headers got added to both the request and responses, status codes were added to identify the response, character set support was introduced, multi-part types, authorization, caching, content encoding and more was included.
Here is how a sample `HTTP/1.0` request and response might have looked like:
```html
GET / HTTP/1.0 Host: kamranahmed.info User-Agent: Mozilla/5.0 (Macintosh; Intel
Mac OS X 10_10_5) Accept: */*
GET / HTTP/1.0
Host: kamranahmed.info
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_5)
Accept: */*
```
As you can see, alongside the request, client has also sent its personal information, required response type etc. While in `HTTP/0.9` client could never send such information because there were no headers.
@@ -63,30 +46,36 @@ As you can see, alongside the request, client has also sent its personal informa
Example response to the request above may have looked like below
```html
HTTP/1.0 200 OK Content-Type: text/plain Content-Length: 137582 Expires: Thu, 05
Dec 1997 16:00:00 GMT Last-Modified: Wed, 5 August 1996 15:55:28 GMT Server:
Apache 0.84 (response body) (connection closed)
HTTP/1.0 200 OK
Content-Type: text/plain
Content-Length: 137582
Expires: Thu, 05 Dec 1997 16:00:00 GMT
Last-Modified: Wed, 5 August 1996 15:55:28 GMT
Server: Apache 0.84
(response body)
(connection closed)
```
In the very beginning of the response there is `HTTP/1.0` (HTTP followed by the version number), then there is the status code `200` followed by the reason phrase (or description of the status code, if you will).
In the very beginning of the response there is `HTTP/1.0` (HTTP followed by the version number), then there is the status code `200` followed by the reason phrase (or description of the status code, if you will).
In this newer version, request and response headers were still kept as `ASCII` encoded, but the response body could have been of any type i.e. image, video, HTML, plain text or any other content type. So, now that server could send any content type to the client; not so long after the introduction, the term "Hyper Text" in `HTTP` became misnomer. `HMTP` or Hypermedia transfer protocol might have made more sense but, I guess, we are stuck with the name for life.
One of the major drawbacks of `HTTP/1.0` were you couldn't have multiple requests per connection. That is, whenever a client will need something from the server, it will have to open a new TCP connection and after that single request has been fulfilled, connection will be closed. And for any next requirement, it will have to be on a new connection. Why is it bad? Well, let's assume that you visit a webpage having `10` images, `5` stylesheets and `5` javascript files, totalling to `20` items that needs to fetched when request to that webpage is made. Since the server closes the connection as soon as the request has been fulfilled, there will be a series of `20` separate connections where each of the items will be served one by one on their separate connections. This large number of connections results in a serious performance hit as requiring a new `TCP` connection imposes a significant performance penalty because of three-way handshake followed by slow-start.
#### Three-way Handshake
#### Three-way Handshake
Three-way handshake in its simplest form is that all the `TCP` connections begin with a three-way handshake in which the client and the server share a series of packets before starting to share the application data.
Three-way handshake in its simplest form is that all the `TCP` connections begin with a three-way handshake in which the client and the server share a series of packets before starting to share the application data.
- `SYN` - Client picks up a random number, let's say `x`, and sends it to the server.
- `SYN ACK` - Server acknowledges the request by sending an `ACK` packet back to the client which is made up of a random number, let's say `y` picked up by server and the number `x+1` where `x` is the number that was sent by the client
- `ACK` - Client increments the number `y` received from the server and sends an `ACK` packet back with the number `y+1`
Once the three-way handshake is completed, the data sharing between the client and server may begin. It should be noted that the client may start sending the application data as soon as it dispatches the last `ACK` packet but the server will still have to wait for the `ACK` packet to be received in order to fulfill the request.
Once the three-way handshake is completed, the data sharing between the client and server may begin. It should be noted that the client may start sending the application data as soon as it dispatches the last `ACK` packet but the server will still have to wait for the `ACK` packet to be recieved in order to fulfill the request.
![Three-way Handshake](https://i.imgur.com/uERG2G2.png)
![](http://i.imgur.com/uERG2G2.png)
> Please note that there is a minor issue with the image, the last `ACK` packet sent by the client to end the handshake contains only `y+1` i.e. it should have been `ACK:y+1` instead of `ACK: x+1, y+1`
> Please note that there is a minor issue with the image, the last `ACK` packet sent by the client to end the handshake contains only `y+1` i.e. it should have been `ACK:y+1` instead of `ACK: x+1, y+1`
However, some implementations of `HTTP/1.0` tried to overcome this issue by introducing a new header called `Connection: keep-alive` which was meant to tell the server "Hey server, do not close this connection, I need it again". But still, it wasn't that widely supported and the problem still persisted.
@@ -100,11 +89,11 @@ After merely 3 years of `HTTP/1.0`, the next version i.e. `HTTP/1.1` was release
- **Hostname Identification** In `HTTP/1.0` `Host` header wasn't required but `HTTP/1.1` made it required.
- **Persistent Connections** As discussed above, in `HTTP/1.0` there was only one request per connection and the connection was closed as soon as the request was fulfilled which resulted in acute performance hit and latency problems. `HTTP/1.1` introduced the persistent connections i.e. **connections weren't closed by default** and were kept open which allowed multiple sequential requests. To close the connections, the header `Connection: close` had to be available on the request. Clients usually send this header in the last request to safely close the connection.
- **Persistent Connections** As discussed above, in `HTTP/1.0` there was only one request per connection and the connection was closed as soon as the request was fulfilled which resulted in accute performance hit and latency problems. `HTTP/1.1` introduced the persistent connections i.e. **connections weren't closed by default** and were kept open which allowed multiple sequential requests. To close the connections, the header `Connection: close` had to be available on the request. Clients usually send this header in the last request to safely close the connection.
- **Pipelining** It also introduced the support for pipelining, where the client could send multiple requests to the server without waiting for the response from server on the same connection and server had to send the response in the same sequence in which requests were received. But how does the client know that this is the point where first response download completes and the content for next response starts, you may ask! Well, to solve this, there must be `Content-Length` header present which clients can use to identify where the response ends and it can start waiting for the next response.
> It should be noted that in order to benefit from persistent connections or pipelining, `Content-Length` header must be available on the response, because this would let the client know when the transmission completes and it can send the next request (in normal sequential way of sending requests) or start waiting for the next response (when pipelining is enabled).
> It should be noted that in order to benefit from persistent connections or pipelining, `Content-Length` header must be available on the response, because this would let the client know when the transmission completes and it can send the next request (in normal sequential way of sending requests) or start waiting for the next response (when pipelining is enabled).
> But there was still an issue with this approach. And that is, what if the data is dynamic and server cannot find the content length before hand? Well in that case, you really can't benefit from persistent connections, could you?! In order to solve this `HTTP/1.1` introduced chunked encoding. In such cases server may omit content-Length in favor of chunked encoding (more to it in a moment). However, if none of them are available, then the connection must be closed at the end of request.
@@ -118,31 +107,31 @@ After merely 3 years of `HTTP/1.0`, the next version i.e. `HTTP/1.1` was release
- Client cookies
- Enhanced compression support
- New status codes
- ..and more
- ..and more
I am not going to dwell about all the `HTTP/1.1` features in this post as it is a topic in itself and you can already find a lot about it. The one such document that I would recommend you to read is [Key differences between `HTTP/1.0` and HTTP/1.1](https://www.ra.ethz.ch/cdstore/www8/data/2136/pdf/pd1.pdf) and here is the link to [original RFC](https://tools.ietf.org/html/rfc2616) for the overachievers.
I am not going to dwell about all the `HTTP/1.1` features in this post as it is a topic in itself and you can already find a lot about it. The one such document that I would recommend you to read is [Key differences between `HTTP/1.0` and HTTP/1.1](http://www.ra.ethz.ch/cdstore/www8/data/2136/pdf/pd1.pdf) and here is the link to [original RFC](https://tools.ietf.org/html/rfc2616) for the overachievers.
`HTTP/1.1` was introduced in 1999 and it had been a standard for many years. Although, it improved alot over its predecessor; with the web changing everyday, it started to show its age. Loading a web page these days is more resource-intensive than it ever was. A simple webpage these days has to open more than 30 connections. Well `HTTP/1.1` has persistent connections, then why so many connections? you say! The reason is, in `HTTP/1.1` it can only have one outstanding connection at any moment of time. `HTTP/1.1` tried to fix this by introducing pipelining but it didn't completely address the issue because of the **head-of-line blocking** where a slow or heavy request may block the requests behind and once a request gets stuck in a pipeline, it will have to wait for the next requests to be fulfilled. To overcome these shortcomings of `HTTP/1.1`, the developers started implementing the workarounds, for example use of spritesheets, encoded images in CSS, single humongous CSS/Javascript files, [domain sharding](https://www.maxcdn.com/one/visual-glossary/domain-sharding-2/) etc.
`HTTP/1.1` was introduced in 1999 and it had been a standard for many years. Although, it improved alot over its predecessor; with the web changing everyday, it started to show its age. Loading a web page these days is more resource-intensive than it ever was. A simple webpage these days has to open more than 30 connections. Well `HTTP/1.1` has persistent connections, then why so many connections? you say! The reason is, in `HTTP/1.1` it can only have one outstanding connection at any moment of time. `HTTP/1.1` tried to fix this by introducing pipelining but it didn't completely address the issue because of the **head-of-line blocking** where a slow or heavy request may block the requests behind and once a request gets stuck in a pipeline, it will have to wait for the next requests to be fulfilled. To overcome these shortcomings of `HTTP/1.1`, the developers started implementing the workarounds, for example use of spritesheets, encoded images in CSS, single humungous CSS/Javascript files, [domain sharding](https://www.maxcdn.com/one/visual-glossary/domain-sharding-2/) etc.
### SPDY - 2009
Google went ahead and started experimenting with alternative protocols to make the web faster and improving web security while reducing the latency of web pages. In 2009, they announced `SPDY`.
Google went ahead and started experimenting with alternative protocols to make the web faster and improving web security while reducing the latency of web pages. In 2009, they announced `SPDY`.
> `SPDY` is a trademark of Google and isn't an acronym.
It was seen that if we keep increasing the bandwidth, the network performance increases in the beginning but a point comes when there is not much of a performance gain. But if you do the same with latency i.e. if we keep dropping the latency, there is a constant performance gain. This was the core idea for performance gain behind `SPDY`, decrease the latency to increase the network performance.
> For those who don't know the difference, latency is the delay i.e. how long it takes for data to travel between the source and destination (measured in milliseconds) and bandwidth is the amount of data transferred per second (bits per second).
> For those who don't know the difference, latency is the delay i.e. how long it takes for data to travel between the source and destination (measured in milliseconds) and bandwidth is the amount of data transfered per second (bits per second).
The features of `SPDY` included, multiplexing, compression, prioritization, security etc. I am not going to get into the details of SPDY, as you will get the idea when we get into the nitty gritty of `HTTP/2` in the next section as I said `HTTP/2` is mostly inspired from SPDY.
`SPDY` didn't really try to replace HTTP; it was a translation layer over HTTP which existed at the application layer and modified the request before sending it over to the wire. It started to become a defacto standards and majority of browsers started implementing it.
`SPDY` didn't really try to replace HTTP; it was a translation layer over HTTP which existed at the application layer and modified the request before sending it over to the wire. It started to become a defacto standards and majority of browsers started implementing it.
In 2015, at Google, they didn't want to have two competing standards and so they decided to merge it into HTTP while giving birth to `HTTP/2` and deprecating SPDY.
In 2015, at Google, they didn't want to have two competing standards and so they decided to merge it into HTTP while giving birth to `HTTP/2` and deprecating SPDY.
### HTTP/2 - 2015
By now, you must be convinced that why we needed another revision of the HTTP protocol. `HTTP/2` was designed for low latency transport of content. The key features or differences from the old version of `HTTP/1.1` include
By now, you must be convinced that why we needed another revision of the HTTP protocol. `HTTP/2` was designed for low latency transport of content. The key features or differences from the old version of `HTTP/1.1` include
- Binary instead of Textual
- Multiplexing - Multiple asynchronous HTTP requests over a single connection
@@ -151,7 +140,8 @@ By now, you must be convinced that why we needed another revision of the HTTP pr
- Request Prioritization
- Security
![HTTP Model](https://i.imgur.com/S85j8gg.png)
![](http://i.imgur.com/S85j8gg.png)
#### 1. Binary Protocol
@@ -159,31 +149,34 @@ By now, you must be convinced that why we needed another revision of the HTTP pr
##### Frames and Streams
HTTP messages are now composed of one or more frames. There is a `HEADERS` frame for the meta data and `DATA` frame for the payload and there exist several other types of frames (`HEADERS`, `DATA`, `RST_STREAM`, `SETTINGS`, `PRIORITY` etc) that you can check through [the `HTTP/2` specs](https://httpwg.org/specs/rfc7540.html#iana-frames).
HTTP messages are now composed of one or more frames. There is a `HEADERS` frame for the meta data and `DATA` frame for the payload and there exist several other types of frames (`HEADERS`, `DATA`, `RST_STREAM`, `SETTINGS`, `PRIORITY` etc) that you can check through [the `HTTP/2` specs](https://http2.github.io/http2-spec/#FrameTypes).
Every `HTTP/2` request and response is given a unique stream ID and it is divided into frames. Frames are nothing but binary pieces of data. A collection of frames is called a Stream. Each frame has a stream id that identifies the stream to which it belongs and each frame has a common header. Also, apart from stream ID being unique, it is worth mentioning that, any request initiated by client uses odd numbers and the response from server has even numbers stream IDs.
Apart from the `HEADERS` and `DATA`, another frame type that I think worth mentioning here is `RST_STREAM` which is a special frame type that is used to abort some stream i.e. client may send this frame to let the server know that I don't need this stream anymore. In `HTTP/1.1` the only way to make the server stop sending the response to client was closing the connection which resulted in increased latency because a new connection had to be opened for any consecutive requests. While in HTTP/2, client can use `RST_STREAM` and stop receiving a specific stream while the connection will still be open and the other streams will still be in play.
#### 2. Multiplexing
Since `HTTP/2` is now a binary protocol and as I said above that it uses frames and streams for requests and responses, once a TCP connection is opened, all the streams are sent asynchronously through the same connection without opening any additional connections. And in turn, the server responds in the same asynchronous way i.e. the response has no order and the client uses the assigned stream id to identify the stream to which a specific packet belongs. This also solves the **head-of-line blocking** issue that existed in HTTP/1.x i.e. the client will not have to wait for the request that is taking time and other requests will still be getting processed.
#### 3. HPACK Header Compression
It was part of a separate RFC which was specifically aimed at optimizing the sent headers. The essence of it is that when we are constantly accessing the server from a same client there is alot of redundant data that we are sending in the headers over and over, and sometimes there might be cookies increasing the headers size which results in bandwidth usage and increased latency. To overcome this, `HTTP/2` introduced header compression.
![Header Compression](https://i.imgur.com/3IPWXvR.png)
![](http://i.imgur.com/3IPWXvR.png)
Unlike request and response, headers are not compressed in `gzip` or `compress` etc formats but there is a different mechanism in place for header compression which is literal values are encoded using Huffman code and a headers table is maintained by the client and server and both the client and server omit any repetitive headers (e.g. user agent etc) in the subsequent requests and reference them using the headers table maintained by both.
While we are talking headers, let me add here that the headers are still the same as in HTTP/1.1, except for the addition of some pseudo headers i.e. `:method`, `:scheme`, `:host` and `:path`
#### 4. Server Push
Server push is another tremendous feature of `HTTP/2` where the server, knowing that the client is going to ask for a certain resource, can push it to the client without even client asking for it. For example, let's say a browser loads a web page, it parses the whole page to find out the remote content that it has to load from the server and then sends consequent requests to the server to get that content.
Server push allows the server to decrease the round trips by pushing the data that it knows that client is going to demand. How it is done is, server sends a special frame called `PUSH_PROMISE` notifying the client that, "Hey, I am about to send this resource to you! Do not ask me for it." The `PUSH_PROMISE` frame is associated with the stream that caused the push to happen and it contains the promised stream ID i.e. the stream on which the server will send the resource to be pushed.
Server push allows the server to decrease the roundtrips by pushing the data that it knows that client is going to demand. How it is done is, server sends a special frame called `PUSH_PROMISE` notifying the client that, "Hey, I am about to send this resource to you! Do not ask me for it." The `PUSH_PROMISE` frame is associated with the stream that caused the push to happen and it contains the promised stream ID i.e. the stream on which the server will send the resource to be pushed.
#### 5. Request Prioritization
@@ -193,10 +186,10 @@ Without any priority information, server processes the requests asynchronously i
#### 6. Security
There was extensive discussion on whether security (through `TLS`) should be made mandatory for `HTTP/2` or not. In the end, it was decided not to make it mandatory. However, most vendors stated that they will only support `HTTP/2` when it is used over `TLS`. So, although `HTTP/2` doesn't require encryption by specs but it has kind of become mandatory by default anyway. With that out of the way, `HTTP/2` when implemented over `TLS` does impose some requirements i.e. `TLS` version `1.2` or higher must be used, there must be a certain level of minimum key sizes, ephemeral keys are required etc.
There was extensive discussion on whether security (through `TLS`) should be made mandatory for `HTTP/2` or not. In the end, it was decided not to make it mandatory. However, most vendors stated that they will only support `HTTP/2` when it is used over `TLS`. So, although `HTTP/2` doesn't require encryption by specs but it has kind of become mandatory by default anyway. With that out of the way, `HTTP/2` when implemented over `TLS` does impose some requirementsi.e. `TLS` version `1.2` or higher must be used, there must be a certain level of minimum keysizes, ephemeral keys are required etc.
`HTTP/2` is here and it has already [surpassed SPDY in adaption](https://caniuse.com/#search=http2) which is gradually increasing. `HTTP/2` has alot to offer in terms of performance gain and it is about time we should start using it.
`HTTP/2` is here and it has already [surpassed SPDY in adaption](http://caniuse.com/#search=http2) which is gradually increasing. `HTTP/2` has alot to offer in terms of performance gain and it is about time we should start using it.
For anyone interested in further details here is the [link to specs](https://httpwg.org/specs/rfc9113.html) and a link [demonstrating the performance benefits of `HTTP/2`](https://www.http2demo.io/).
For anyone interested in further details here is the [link to specs](https://http2.github.io/http2-spec) and a link [demonstrating the performance benefits of `HTTP/2`](http://www.http2demo.io/).
And that about wraps it up. Until next time! stay tuned.

View File

@@ -0,0 +1,2 @@
[![](/guides/jwt-authentication.png)](/guides/jwt-authentication.png)

View File

@@ -1,71 +1,49 @@
---
title: 'Levels of Seniority'
description: 'How to Step Up as a Junior, Mid Level or a Senior Developer?'
authorId: 'kamran'
seo:
title: 'Levels of Seniority - roadmap.sh'
description: 'How to Step Up as a Junior, Mid Level or a Senior Developer?'
isNew: false
type: 'textual'
date: 2020-12-03
sitemap:
priority: 0.7
changefreq: 'weekly'
tags:
- 'guide'
- 'textual-guide'
- 'guide-sitemap'
---
I have been working on redoing the [roadmaps](https://roadmap.sh) splitting the skillset based on the seniority levels to make them easier to follow and not scare the new developers away. Since the roadmaps are going to be just about the technical knowledge, I thought it would be a good idea to reiterate and have an article on what I think of different seniority roles.
I have seen many organizations decide the seniority of developers by giving more significance to the years of experience than they should. I have seen developers labeled "Junior" doing the work of Senior Developers and I have seen "Lead" developers who weren't even qualified to be called "Senior". The seniority of a developer cannot just be decided by their age, years of experience or technical knowledge that they have got. There are other factors in play here -- their perception of work, how they interact with their peers and how they approach problems. We discuss these three key factors in detail for each of the seniority levels below.
### Different Seniority Titles
Different organizations might have different seniority titles but they mainly fall into three categories:
- Junior Developer
- Mid Level Developer
- Senior Developer
* Junior Developer
* Mid Level Developer
* Senior Developer
### Junior Developer
Junior developers are normally fresh graduates and it's either they don't have or they have minimal industry experience. Not only they have weak coding skills but there are also a few other things that give Junior developers away:
- Their main mantra is "making it work" without giving much attention to how the solution is achieved. To them, a working software and good software are equivalent.
- They usually require very specific and structured directions to achieve something. They suffer from tunnel vision, need supervision and continuous guidance to be effective team members.
- Most of the Junior developers just try to live up to the role and, when stuck, they might leave work for a senior developer instead of at least trying to take a stab at something.
- They don't know about the business side of the company and don't realize how management/sales/marketing/etc think and they don't realize how much rework, wasted effort, and end-user aggravation could be saved by getting to know the business domain.
- Over-engineering is a major problem, often leading to fragility and bugs.
- When given a problem, they often try to fix just the current problem a.k.a. fixing the symptoms instead of fixing the root problem.
- You might notice the "[Somebody Else's Problem](https://en.wikipedia.org/wiki/Somebody_else%27s_problem)" behavior from them.
- They don't know what or how much they don't know, thanks to the [DunningKruger effect](https://en.wikipedia.org/wiki/Dunning%E2%80%93Kruger_effect).
- They don't take initiatives and they might be afraid to work on an unfamiliar codebase.
- They don't participate in team discussions.
* Their main mantra is "making it work" without giving much attention to how the solution is achieved. To them, a working software and good software are equivalent.
* They usually require very specific and structured directions to achieve something. They suffer from tunnel vision, need supervision and continuous guidance to be effective team members.
* Most of the Junior developers just try to live up to the role and, when stuck, they might leave work for a senior developer instead of at least trying to take a stab at something.
* They don't know about the business side of the company and don't realize how management/sales/marketing/etc think and they don't realize how much rework, wasted effort, and end-user aggravation could be saved by getting to know the business domain.
* Over-engineering is a major problem, often leading to fragility and bugs.
* When given a problem, they often try to fix just the current problem a.k.a. fixing the symptoms instead of fixing the root problem.
* You might notice the "[Somebody Else's Problem](https://en.wikipedia.org/wiki/Somebody_else%27s_problem)" behavior from them.
* They don't know what or how much they don't know, thanks to the [DunningKruger effect](https://en.wikipedia.org/wiki/Dunning%E2%80%93Kruger_effect).
* They don't take initiatives and they might be afraid to work on an unfamiliar codebase.
* They don't participate in team discussions.
Being a Junior developer in the team is not necessarily a bad thing; since you are just starting out, you are not expected to be a know-it-all person. However, it is your responsibility to learn, gain experience, not get stuck with the "Junior" title and improve yourself. Here are a few tips for Junior developers to help move up the ladder of seniority:
- All sorts of problems can be solved if you work on them long enough. Do not give up if Stack Overflow or an issue on GitHub doesn't have an answer. Saying "I am stuck, but I have tried X, Y, and Z. Do you have any pointers?" to your lead is much better than saying "This is beyond me."
- Read a lot of code, not just code in the projects that you are working on, but reference/framework source code, open-source. Ask your fellow developers, perhaps on Reddit too, about the good open-source examples for the language/tools of your choice.
- Do personal side-projects, share them with people, contribute to the open-source community. Reach out to people for help. You will be surprised how much support you can get from the community. I still remember my first open-source project on GitHub from around 6 years ago which was a small PHP script (a library) that fetched details for a given address from Google's Geocoding API. The codebase was super messy, it did not have any tests, did not have any linters or sniffers, and it did not have any CI because I didn't know about any of this at that time. I am not sure how but one kind soul somehow found the project, forked it, refactored it, "modernized" it, added linting, code sniffing, added CI and opened the pull request. This one pull request taught me so many things that I might have never learned that fast on my own because I was still in college, working for a small service-based company and doing just small websites all on my own without knowing what is right and what is not. This one PR on GitHub was my introduction to open-source and I owe everything to that.
- Avoid what is known as ["Somebody Else's Problem Field"](https://en.wikipedia.org/wiki/Somebody_else%27s_problem) behavior.
- When given a problem to solve, try to identify the root cause and fix that instead of fixing the symptoms. And remember, not being able to reproduce means not solved. It is solved when you understand why it occurred and why it no longer does.
- Have respect for the code that was written before you. Be generous when passing judgment on the architecture or the design decisions made in the codebase. Understand that code is often ugly and weird for a reason other than incompetence. Learning to live with and thrive with legacy code is a great skill. Never assume anybody is stupid. Instead, figure out how these intelligent, well-intentioned and experienced people have come to a decision that is stupid now. Approach inheriting legacy code with an "opportunity mindset" rather than a complaining one.
- It's okay to not know things. You don't need to be ashamed of not knowing things already. There are no stupid questions, ask however many questions that would allow you to work effectively.
- Don't let yourself be limited by the job title that you have. Keep working on your self-improvement.
- Do your homework. Predict whats coming down the pipe. Be involved in the team discussions. Even if you are wrong, you will learn something.
- Learn about the domain that you are working with. Understand the product end-to-end as an end-user. Do not assume things, ask questions and get things cleared when in doubt.
- Learn to communicate effectively - soft skills matter. Learn how to write good emails, how to present your work, how to phrase your questions in a thoughtful manner.
- Sit with the senior developers, watch them work, find a mentor. No one likes a know-it-all. Get hold of your ego and be humble enough to take lessons from experienced people.
- Don't just blindly follow the advice of "experts", take it with a grain of salt.
- If you are asked to provide an estimate for some work, do not give an answer unless you have all the details to make a reasonable estimate. If you are forced to do that, pad it 2x or more depending on how much you don't know about what needs to be done for the task to be marked 'done'.
- Take some time to learn how to use a debugger. Debuggers are quite beneficial when navigating new, undocumented or poorly documented codebase, or to debug weird issues.
- Avoid saying "it works on my machine" -- yes, I have heard that a lot.
- Try to turn any feelings of inadequacy or imposter syndrome into energy to push yourself forward and increase your skills and knowledge.
* All sorts of problems can be solved if you work on them long enough. Do not give up if Stack Overflow or an issue on GitHub doesn't have an answer. Saying "I am stuck, but I have tried X, Y, and Z. Do you have any pointers?" to your lead is much better than saying "This is beyond me."
* Read a lot of code, not just code in the projects that you are working on, but reference/framework source code, open-source. Ask your fellow developers, perhaps on Reddit too, about the good open-source examples for the language/tools of your choice.
* Do personal side-projects, share them with people, contribute to the open-source community. Reach out to people for help. You will be surprised how much support you can get from the community. I still remember my first open-source project on GitHub from around 6 years ago which was a small PHP script (a library) that fetched details for a given address from Google's Geocoding API. The codebase was super messy, it did not have any tests, did not have any linters or sniffers, and it did not have any CI because I didn't know about any of this at that time. I am not sure how but one kind soul somehow found the project, forked it, refactored it, "modernized" it, added linting, code sniffing, added CI and opened the pull request. This one pull request taught me so many things that I might have never learned that fast on my own because I was still in college, working for a small service-based company and doing just small websites all on my own without knowing what is right and what is not. This one PR on GitHub was my introduction to open-source and I owe everything to that.
* Avoid what is known as ["Somebody Else's Problem Field"](https://en.wikipedia.org/wiki/Somebody_else%27s_problem) behavior.
* When given a problem to solve, try to identify the root cause and fix that instead of fixing the symptoms. And remember, not being able to reproduce means not solved. It is solved when you understand why it occurred and why it no longer does.
* Have respect for the code that was written before you. Be generous when passing judgment on the architecture or the design decisions made in the codebase. Understand that code is often ugly and weird for a reason other than incompetence. Learning to live with and thrive with legacy code is a great skill. Never assume anybody is stupid. Instead, figure out how these intelligent, well-intentioned and experienced people have come to a decision that is stupid now. Approach inheriting legacy code with an "opportunity mindset" rather than a complaining one.
* It's okay to not know things. You don't need to be ashamed of not knowing things already. There are no stupid questions, ask however many questions that would allow you to work effectively.
* Don't let yourself be limited by the job title that you have. Keep working on your self-improvement.
* Do your homework. Predict whats coming down the pipe. Be involved in the team discussions. Even if you are wrong, you will learn something.
* Learn about the domain that you are working with. Understand the product end-to-end as an end-user. Do not assume things, ask questions and get things cleared when in doubt.
* Learn to communicate effectively - soft skills matter. Learn how to write good emails, how to present your work, how to phrase your questions in a thoughtful manner.
* Sit with the senior developers, watch them work, find a mentor. No one likes a know-it-all. Get hold of your ego and be humble enough to take lessons from experienced people.
* Don't just blindly follow the advice of "experts", take it with a grain of salt.
* If you are asked to provide an estimate for some work, do not give an answer unless you have all the details to make a reasonable estimate. If you are forced to do that, pad it 2x or more depending on how much you don't know about what needs to be done for the task to be marked 'done'.
* Take some time to learn how to use a debugger. Debuggers are quite beneficial when navigating new, undocumented or poorly documented codebase, or to debug weird issues.
* Avoid saying "it works on my machine" -- yes, I have heard that a lot.
* Try to turn any feelings of inadequacy or imposter syndrome into energy to push yourself forward and increase your skills and knowledge.
### Mid Level Developers
The next level after the Junior developers is Mid Level developers. They are technically stronger than the Junior developers and can work with minimal supervision. They still have some issues to address in order to jump to Senior level.
Intermediate developers are more competent than the Junior developer. They start to see the flaws in their old codebase. They gain the knowledge but they get trapped into the next chain i.e. messing things up while trying to do them "the right way" e.g. hasty abstractions, overuse or unnecessary usage of Design Patterns -- they may be able to provide solution faster than the Junior developers but the solution might put you into another rabbit-hole in the long run. Without supervision, they might delay the execution while trying to "do things properly". They don't know when to make tradeoffs and they still don't know when to be dogmatic and when to be pragmatic. They can easily become attached to their solution, become myopic, and be unable to take feedback.
@@ -73,23 +51,21 @@ Intermediate developers are more competent than the Junior developer. They start
Mid-level developers are quite common. Most of the organizations wrongly label them as "Senior Developers". However, they need further mentoring in order to become Senior Developers. The next section describes the responsibilities of a senior developer and how you can become one.
### Senior Developers
Senior developers are the next level after the Mid-level developers. They are the people who can get things done on their own without any supervision and without creating any issues down the road. They are more mature, have gained experience by delivering both good and bad software in the past and have learned from it — they know how to be pragmatic. Here is the list of things that are normally expected of a Senior Developer:
- With their past experiences, mistakes made, issues faced by over-designed or under-designed software, they can foresee the problems and persuade the direction of the codebase or the architecture.
- They don't have a "Shiny-Toy" syndrome. They are pragmatic in the execution. They can make the tradeoffs when required, and they know why. They know where to be dogmatic and where to be pragmatic.
- They have a good picture of the field, know what the best tool for the job is in most cases (even if they don't know the tool). They have the innate ability to pick up a new tool/language/paradigm/etc in order to solve a problem that requires it.
- They are aware they're on a team. They view it as a part of their responsibility to mentor others. This can range from pair programming with junior devs to taking un-glorious tasks of writing docs or tests or whatever else needs to be done.
- They have a deep understanding of the domain - they know about the business side of the company and realize how management/sales/marketing/etc think and benefit from their knowledge of the business domain during the development.
- They don't make empty complaints, they make judgments based on the empirical evidence and they have suggestions for solutions.
- They think much more than just code - they know that their job is to provide solutions to the problems and not just to write code.
- They have the ability to take on large ill-defined problems, define them, break them up, and execute the pieces. A senior developer can take something big and abstract, and run with it. They will come up with a few options, discuss them with the team and implement them.
- They have respect for the code that was written before them. They are generous when passing judgment on the architecture or the design decisions made in the codebase. They approach inheriting legacy code with an "opportunity mindset" rather than a complaining one.
- They know how to give feedback without hurting anyone.
* With their past experiences, mistakes made, issues faced by over-designed or under-designed software, they can foresee the problems and persuade the direction of the codebase or the architecture.
* They don't have a "Shiny-Toy" syndrome. They are pragmatic in the execution. They can make the tradeoffs when required, and they know why. They know where to be dogmatic and where to be pragmatic.
* They have a good picture of the field, know what the best tool for the job is in most cases (even if they don't know the tool). They have the innate ability to pick up a new tool/language/paradigm/etc in order to solve a problem that requires it.
* They are aware they're on a team. They view it as a part of their responsibility to mentor others. This can range from pair programming with junior devs to taking un-glorious tasks of writing docs or tests or whatever else needs to be done.
* They have a deep understanding of the domain - they know about the business side of the company and realize how management/sales/marketing/etc think and benefit from their knowledge of the business domain during the development.
* They don't make empty complaints, they make judgments based on the empirical evidence and they have suggestions for solutions.
* They think much more than just code - they know that their job is to provide solutions to the problems and not just to write code.
* They have the ability to take on large ill-defined problems, define them, break them up, and execute the pieces. A senior developer can take something big and abstract, and run with it. They will come up with a few options, discuss them with the team and implement them.
* They have respect for the code that was written before them. They are generous when passing judgment on the architecture or the design decisions made in the codebase. They approach inheriting legacy code with an "opportunity mindset" rather than a complaining one.
* They know how to give feedback without hurting anyone.
### Conclusion
All teams are made up of a mix of all these seniority roles. Being content with your role is a bad thing and you should always strive to improve yourself for the next step. This article is based on my beliefs and observations in the industry. Lots of companies care more for the years of experience to decide the seniority which is a crappy metric -- you don't gain experience just by spending years. You gain it by continuously solving different sorts of problems, irrespective of the number of years you spend in the industry. I have seen fresh graduates having no industry experience get up to speed quickly and producing work of a Senior Engineer and I have seen Senior developers labeled "senior" merely because of their age and "years of experience".
All teams are made up of a mix of all these seniority roles. Being content with your role is a bad thing and you should always strive to improve yourself for the next step. This article is based on my beliefs and observations in the industry. Lots of companies care more for the years of experience to decide the seniority which is a crappy metric -- you don't gain experience just by spending years. You gain it by continuously solving different sorts of problems, irrespective of the number of years you spend in the industry. I have seen fresh graduates having no industry experience get up to speed quickly and producing work of a Senior Engineer and I have seen Senior developers labeled "senior" merely because of their age and "years of experience".
The most important traits that you need to have in order to step up in your career are: not settling with mediocrity, having an open mindset, being humble, learning from your mistakes, working on the challenging problems and having an opportunity mindset rather than a complaining one.

2
content/guides/oauth.md Normal file
View File

@@ -0,0 +1,2 @@
[![](/guides/oauth.png)](/guides/oauth.png)

View File

@@ -0,0 +1,5 @@
One of my favorite pastimes is going through the history of my favorite projects to learn how they grew over time or how certain features were implemented.
The image below describes how I do that in WebStorm.
[![](/guides/project-history.png)](/guides/project-history.png)

View File

@@ -0,0 +1,47 @@
Internet has connected people across the world using social media and audio/video calling features along with providing an overabundance of knowledge and tools. All this comes with an inherent danger of security and privacy breaches. In this guide we will talk about **proxies** which play a vital role in mitigating these risks. We will cover the following topics in this guide:
- [Proxy Server](#proxy-server)
- [Forward Proxy Server](#forward-proxy-server)
- [Reverse Proxy Server](#reverse-proxy-server)
- [Summary](#summary)
## Proxy Server
***Every web request which is sent from the client to a web server goes through some type of proxy server.*** A proxy server acts as a gateway between client *(you)* and the internet and separates end-users from the websites you browse. It replaces the source IP address of the web request with the proxy server's IP address and then forwards it to the web server. The web server is unaware of the client, it only sees the proxy server.
![Proxy Server Description](/guides/proxy/proxy-example.png)
> NOTE: This is not an accurate description rather just an illustration.
Proxy servers serve as a single point of control making it easier to enforce security policies. It also provides caching mechanism which stores the requested web pages on the proxy server to improve performance. If the requested web-page is available in cache memory then instead of forwarding the request to the web-server it will send the cached webpage back to the client. This **saves big companies thousands of dollars** by reducing load on their servers as their website is visited by millions of users every day.
## Forward Proxy Server
A forward proxy is generally implemented on the client side and **sits in front of multiple clients** or client sources. Forward proxy servers are mainly used by companies to **manage internet usage** of their employees and **restrict content**. It is also used as a **firewall** to secure company's network by blocking any request which would pose threat to the companies's network. Proxy servers are also used to **bypass geo-restriction** and browse content which might be blocked in user's country. It enables users to **browse anonymously**, as the proxy server masks their details from the website's servers.
![Forward Proxy Description](/guides/proxy/forward-proxy.png)
> NOTE: This is not an accurate description rather just an illustration
## Reverse Proxy Server
Reverse proxy servers are implemented on the **server side** instead of the client side. It **sits in front of multiple webservers** and manages the incoming requests by forwarding them to the web servers. It provides anonymity for the **back-end web servers and not the client**. Reverse proxy servers are generally used to perform tasks such as **authentication, content caching, and encryption/decryption** on behalf of the web server. These tasks would **hog CPU cycles** on the web server and degrade performance of the website by introducing high amount of delay in loading the webpage. Reverse proxies are also used as **load balancers** to distribute the incoming traffic efficiently among the web servers but it is **not optimized** for this task. In essence, reverse proxy server is a gateway to a web-server or group of web-servers.
![Reverse Proxy Description](/guides/proxy/reverse-proxy.png)
> NOTE: This is not an accurate description rather just an illustration. Red lines represent server's response and black lines represent initial request from client(s).
## Summary
A proxy server acts as a gateway between client *(you)* and the internet and separates end-users from the websites you browse. ***The position of the proxy server on the network determines whether it is a forward or a reverse proxy server***. Forward proxy is implemented on the client side and **sits in front of multiple clients** or client sources and forwards requests to the web server. Reverse proxy servers are implemented on the **server side** it **sits in front of multiple webservers** and manages the incoming requests by forwarding them to the web servers.
If all this was too much to take in, I have a simple analogy for you.
At a restaurant the waiter/waitress takes your order and gives it to the kitchen head chef. The head chef then calls out the order and assigns tasks to everyone in the kitchen.
In this analogy:
* You are the client
* Your order is the web request
* Waiter/Waitress is your forward proxy server
* Kitchen head chef is the reverse proxy server
* Other chefs working in the kitchen are the web servers
With that said our guide comes to an end. Thank you for reading and feel free to submit any updates to the guide using the links below.

View File

@@ -0,0 +1,4 @@
Random numbers are everywhere from computer games to lottery systems, graphics software, statistical sampling, computer simulation and cryptography. Graphic below is a quick explanation to how the random numbers are generated and why they may not be truly random.
[![](/guides/random-numbers.png)](/guides/random-numbers.png)

View File

@@ -0,0 +1,4 @@
The chart below aims to give you a really basic understanding of how the capability of a DBMS is increased to handle a growing amount of load.
[![](/guides/scaling-databases.svg)](/guides/scaling-databases.svg)

View File

@@ -0,0 +1,2 @@
[![](/guides/session-authentication.png)](/guides/session-authentication.png)

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