From 4182571dc01b8068c8c0c1138359b1b817375ae4 Mon Sep 17 00:00:00 2001 From: Chelsea Wang <98237975+chwawa@users.noreply.github.com> Date: Thu, 2 Nov 2023 17:45:24 -0400 Subject: [PATCH 01/70] Update User_Experience.md first update -- created skeleton of what I will discuss --- Topics/User_Experience.md | 73 +++++++++++++++++++++++++++++++-------- 1 file changed, 59 insertions(+), 14 deletions(-) diff --git a/Topics/User_Experience.md b/Topics/User_Experience.md index 6ad4f96c9..777c09e47 100644 --- a/Topics/User_Experience.md +++ b/Topics/User_Experience.md @@ -1,20 +1,47 @@ -## Resources for User Experience domain +# Resources for User Experience -### Overview -User Experience (UX) is a large and broad topic. It covers the overall experience of the user and how they interact with software systems and applications. The main focus of User Experience is to make a piece of software accessible, easy to follow (ie: user-friendly) and adaptable to the user's needs. There is no set of standard rules that make up a "great" user experience, as it often differs on the product and the consumers that are using the products. User Experience is not to be confused with UI and UX Design. While these topics have similarities with User Experience, they are also different in their ways. For example, UI could be how the interface is designed whereas UX is more about how users interact with the said design. Many notable links are differentiating the two areas. Here is one of the related websites. +## Table of Contents +1. [Overview](https://learning-software-engineering.github.io/Topics/User_Experience.html#overview) +2. [Areas of User Experience](https://learning-software-engineering.github.io/Topics/User_Experience.html#areas-of-user-experience) +3. [Accessibility Features of User Experience](https://learning-software-engineering.github.io/Topics/User_Experience.html#accessibility-features-of-user-experience) +4. [Helpful Courses](https://learning-software-engineering.github.io/Topics/User_Experience.html#helpful-courses) +5. Tools Used in User Experience Design +6. User Experience-Oriented Games +## Overview +User experience (UX) is a large and broad topic. It covers the overall experience of the user and how they interact with software systems and applications. The main focus of User Experience is to make a piece of software accessible, easy to follow (i.e., user friendly) and adaptable to the user's needs. There is no set of standard rules that make up a "great" user experience, as it often differs on the product and the consumers that are using the products. + +User experience is not to be confused with UI (User Interface) and UX _design_. While these topics have similarities with user experience, they are also different in their own ways: +- **UI design** is the process of creating a interface with a focus on how the interface will _look_ like -- think of aesthetics! +- **UX design** is the process of creating an interface with a focus on a smooth, meaningful user _experience_ -- think of usability and usefulness! +- **User experience** is a user's journey when interacting with your software/application. + +There are many resources that differentiate between user experience, UI design, and UX design. Here are a few related websites: - [The Definition of User Experience](https://www.nngroup.com/articles/definition-user-experience/) +- [Differences Between UX and UI Design](https://bootcamp.cvn.columbia.edu/blog/what-is-ux-design/#:~:text=User%20experience%20(UX)%20refers%20to,usability%2C%20function%2C%20and%20design.) + + +## Areas of User Experience +As mentioned earlier, user experience is not easy to define as it is a large and broad topic. Here are a _few_ areas of UX that software engineers should pay attention to: + +### User Research +When it comes to user experience, conducting user research is very important as it lets us discover new problems and address deeper issues. -### Areas of User Experience +___User Personas___ -User Experience is not easy to define. There are many areas that contribute to User Experience but there is not one answer. The following are a few examples. +### Visual Elements of User Interface Design +___Design Principles___ ___Button Design___ - [Amazon Button](https://medium.com/@cccalibour/how-ux-design-makes-a-difference-amazons-continue-button-901618a8b00e): The design of butt ons that improves user experience by simplifying process. +___Navigation Systems___ + +___Typography___ + ___Established Norms___ - [Scrolls On Socials](https://forgeandsmith.com/blog/scrolling-vs-clicking-whats-the-preferred-user-experience/): Users are conditioned for scrolling, and now every new social media app conforms to scrolling. @@ -24,25 +51,46 @@ ___Color Theory___ ___Responsive Design___ - [Responsive Design](https://devrix.com/tutorial/important-responsive-design/): Responsive Design generally refers to a design where the software is adaptable to the consumer's device. The responsive design can be many things including screen sizes, collapsing of navbars, adjusting texts based on the screens, scrolling effects and more. The benefits of a responsive design make your software accessible across varying devices and overall improves the user experience. The article demonstrates the importance and benefits of responsive design, the flexibility they provide, and the easiblity for the consumers upon making the said software. +### User Experience Principles ___Nielsen's 10 Usability Heuristics___ - [Usability Heuristics](./User_Experience/Usability_Heuristics.md) -### Accessibility Features of User Experience +### Sitemapping, Wireframing, and Prototyping + +## Accessibility Features of User Experience There are some things that have become a crucial part in making a software: Universal Design Principles. ___The 7 Universal Design Principles___ - [Universal Design Principles](https://www.buffalo.edu/access/help-and-support/topic3/universaldesignprinciples.html): Universal Design Principles are not only used for software, but can be incorporated generally as well. These 7 principles ensure accessibility, consistency, and user-friendly software. This article provides the 7 Universal Design Principles that makes a software accessible to all users, which plays a important role in diversifying the User Experience. -### Helpful Courses +## Helpful Courses +- [The Design of Interactive Computational Media (CSC318) offered by U of T](https://artsci.calendar.utoronto.ca/course/csc318h1). CSC318 expands on the work done before coding projects. For example, the course will have you test how users would interact with your prototype of a UI and then modify it so that the UX is better for the user. +- [CalArt's UI/UX Design Specialization on Coursera](https://www.coursera.org/specializations/ui-ux-design). This is a package of 4 courses that teaches beginners the elements of UI design, fundamentals of UX design, and web design. This specialization will help you gain experience in wireframing, prototyping, and _designing_ (not coding) your own website/app. Plus, as a U of T student, you can get this specialization certificate for free once you finish the 4 courses! + +## Tools Used in User Experience Design +### Design Tools +___Figma___ -There are many courses related to User Experience. This includes the U of T Course [The Design of Interactive Computational Media](https://artsci.calendar.utoronto.ca/course/csc318h1) which is highly recommended if interested in this topic. [The Design of Interactive Computational Media](https://artsci.calendar.utoronto.ca/course/csc318h1) expands on the work done before coding projects. For example, one of the projects is testing how users would interact with a prototype of a UI and modifying it so that the UX is better for the user. +Figma is a free (for the most part) collaborative tool that lets you design and build mock-ups and prototypes of your software/applications. You may not need to build prototypes as a software developer/engineer, but you'll probably find yourself viewing Figma design files to build your frontend. So, now's a great time to start learning how to use [Figma](https://www,figma.com)! +**Helpful tip:** With just a click of a button, you can switch to "developer mode" in Figma, which helps you translate design into code! Essentially, you can click on components like a button and get its corresponding code and styling. Read about how to use this feature [here](https://www.figma.com/dev-mode/). -### Tools Can Be Used In UX Design +___Adobe XD___ -In addition to Bootstrap, Ant Design is another popular UI library and design system. It is specifically designed for React applications and other frontend frameworks like Vue, Angular and etc, providing a complete set of high-quality React components that make user interface development simpler, more consistent, and modular. Ant Design is ideal for building enterprise-level applications and dashboards with a focus on high performance, usability, and aesthetics. +[Adobe XD](https://www.adobe.com/products/xd/learn/get-started/what-is-adobe-xd-used-for.html) is another popular prototyping tool. Unfortunately, the current author of this wiki doesn't know much about it, other than it requires a monthly subscription :(. + +### UI Component Libraries +When building an application with a frontend framework (e.g., React, Vue, Angular, etc.), developers can import an UI design component library/libraries to help them easily build aesthetic, user-friendly interfaces. + +___Material UI (MUI)___ + +[MUI](https://mui.com/) is a popular library of UI design components made for React. + +___Ant Design___ + +Ant Design is another popular UI library and design system. It is specifically designed for React applications and other frontend frameworks like Vue, Angular and etc, providing a complete set of high-quality React components that make user interface development simpler, more consistent, and modular. Ant Design is ideal for building enterprise-level applications and dashboards with a focus on high performance, usability, and aesthetics. Ant Design provides a wide range of UI components, including buttons, icons, form elements, tables, and navigation menus. It also offers a consistent design language, making it easier for developers to create appealing user interfaces. The design ensures that your applications look great on different devices and screen sizes. More importantly, it is easy to use for beginners. Following steps are provided for you to start using Ant Design in your project. @@ -66,7 +114,6 @@ function App() { export default App; - Besides, Ant Design allows you to customize the default theme by modifying the less variables. For instance, you can use tools like 'craco-less' or 'react-app-rewired' to customize your theme without ejecting from Create React App. If you want to learn more about Ant Design. There are some useful documents or tutorials that can help you get started with Ant Design. @@ -80,13 +127,11 @@ If you want to learn more about Ant Design. There are some useful documents or t By following these tutorials, I hope you can gain a solid understanding of how to use Ant Design in your React projects and create attractive, user-friendly interfaces. -### User Experience Orientated Games - +## User Experience-Orientated Games User experience is unique, as practicing user experience design can be challenging. Since user experience has to do a lot with visuals, you can learn user design by playing games. User experience orientated games can be an engaging and fun way to get familiar with common UX practices. Here are unique games that can help develop better UX design skills. - [Can't Unsee](https://cantunsee.space/): The game of choice! Can't Unsee is a game that presents the user with two designs and challenges the user to pick the most correct user experience design. Feedback on each selection allows the user to learn from their mistakes. Sharpen your knowledge of common user experience design practices while testing your attention to detail. - - [Designercize](https://designercize.com/): Leetcode for designers. This unique game gives the user a unique interview-style design challenge to prepare for future interviews. Each challenge comes with a set of constraints containing a time limit, providing a realistic scenario for practicing your design and problem-solving skills. From common user experience practices to visual design, this game is a great way to improve your on-the-fly design abilities and creativity. - [Laws of UX](https://lawsofux.com/): This is an interactive website with beautiful cards Informing users of the common laws of UX. Each card provides an example of how the principle can be applied in real-world design scenarios, making this a very valuable tool for learning and practicing user experience design. From 58e6e115165c7518bfbf29dd4d0a8372cdb81ca1 Mon Sep 17 00:00:00 2001 From: Chelsea Wang <98237975+chwawa@users.noreply.github.com> Date: Fri, 3 Nov 2023 10:20:11 -0400 Subject: [PATCH 02/70] Update User_Experience.md added discussions and resources on various topics --- Topics/User_Experience.md | 123 ++++++++++++++++++++++++++++++++++---- 1 file changed, 112 insertions(+), 11 deletions(-) diff --git a/Topics/User_Experience.md b/Topics/User_Experience.md index 777c09e47..5a090fc1c 100644 --- a/Topics/User_Experience.md +++ b/Topics/User_Experience.md @@ -3,11 +3,17 @@ ## Table of Contents 1. [Overview](https://learning-software-engineering.github.io/Topics/User_Experience.html#overview) -2. [Areas of User Experience](https://learning-software-engineering.github.io/Topics/User_Experience.html#areas-of-user-experience) +2. [Fundamentals of User Experience](https://learning-software-engineering.github.io/Topics/User_Experience.html#fundamentals-of-user-experience) + - User Research + - Visual Elements of User Interface Design + - User Experience Principles + - Site mapping, Wireframing, and Prototyping 3. [Accessibility Features of User Experience](https://learning-software-engineering.github.io/Topics/User_Experience.html#accessibility-features-of-user-experience) 4. [Helpful Courses](https://learning-software-engineering.github.io/Topics/User_Experience.html#helpful-courses) -5. Tools Used in User Experience Design -6. User Experience-Oriented Games +5. [Tools Used in User Experience Design](https://learning-software-engineering.github.io/Topics/User_Experience.html#tools-used-in-user-experience-design) + - Design Tools + - UI Component Libraries +6. [User Experience-Oriented Games](https://learning-software-engineering.github.io/Topics/User_Experience.html#user-experience-oriented-games) ## Overview @@ -23,31 +29,126 @@ There are many resources that differentiate between user experience, UI design, - [Differences Between UX and UI Design](https://bootcamp.cvn.columbia.edu/blog/what-is-ux-design/#:~:text=User%20experience%20(UX)%20refers%20to,usability%2C%20function%2C%20and%20design.) -## Areas of User Experience +## Fundamentals of User Experience As mentioned earlier, user experience is not easy to define as it is a large and broad topic. Here are a _few_ areas of UX that software engineers should pay attention to: ### User Research -When it comes to user experience, conducting user research is very important as it lets us discover new problems and address deeper issues. +When it comes to user experience, conducting user research is very important as it lets us discover new problems and address deeper issues. As a software engineer, it may be extensive for you to conduct user research, but there are tools that you can use to understand your users better, such as the following: + +___Point-of-View Statements___ + +POV statements let you describe your user and their needs, and they can help you discover new problems/questions that you need to solve before creating your application. + +The structure of a POV statement is: +> [WHO] needs to [VERB] because [WHY]. + +"Who" will refer to your users. For example, let's say we're making a grocery shopping app. A possible POV statement could be: +> A senior citizen who lives alone needs help with buying groceries because they have difficulty getting out of the house and reading small text. + +Now that we've realized a possible pain point for a senior citizen, we can look into implementing our grocery shopping app such that it's accessible to this target audience. ___User Personas___ +User personas should be built from user research data, not stereotypes. In CSC301, your partner may guide you in creating personas, but in the worst case, you'll find yourself creating personas from no data since you don't have time to conduct research. Nonetheless, there are many benefits to creating personas, including, but not limited to: +- Provides you with a better understanding of your target user groups +- Helps prioritize design choices + +User personas can be written down in a document, or created with design software such as [Xtensio](https://xtensio.com/) and [Figma](https://www.figma.com/). You can find user persona templates created by other people on Xtensio, Figma, and other design software. + +If you use a template, it'll prompt you to fill in specific information about your target user. If you're writing your personas from scratch or want to consider extra information, here are some elements that a good user persona may include: +- Name, picture, target user group +- Biography +- Quote that sums up the persona +- Demographic characteristics +- Personality, habits, behaviour +- Goals, tasks, needs, motivations +- Challenges, pain points + +A quick Google image search for "User Persona" will help tie all this information together. + ### Visual Elements of User Interface Design ___Design Principles___ +UI designers achieve a visual hierarchy (i.e., the order a user processes the application's information) in their interfaces by using contrast. To create contrast, consider playing around with the following elements: + +_Scale_ +>

Larger text attracts the eye,

whereas smaller text is easier to ignore.
+ +_Weight_ +> **Bold text attracts the eye** much more than regular text. + +_Direction_ + +You want to direct your users to a call to action. For example: +>

Welcome!

+>

Please click the button.

+>
 Button 
+Your eyes easily flow from the title to the smaller message. Then, you're inclined to click the button. Now, look at this: +>
 Button 
+>

Welcome!

+> Please click the button. +At first, you feel confused as to why there's a button at the top. Then you read the message, and now your eyes have to flick back to the top to find the button. It's a minor detail, but it still negatively affects the flow of the application. + +_Form/shape_ + +You can combine shapes with lines to make elements like buttons. + +_Texture_ + +You can use texture to draw a user's eye to elements like titles, icons, and buttons. Keep in mind that texture and patterns are different -- patterns are small repetitive elements (like polka dots, while texture is not necessarily repetitive. Read more about texture [here](https://uxdesign.cc/web-design-theory-texture-1e07c29b10e5), and see examples of website that use texture [here](https://www.webfx.com/blog/web-design/textured-website-designs-inspiration/). + +_Space_ + +Make use of whitespace so users have an easier time reading your application's text. + +_Value/shade_ + +Value can attract the eye. For example, you can use shading to create button shadows. + +_Colour_ +```diff +- Red text seems urgent, ++ whereas green usually indicates success. +! Orange feels like a warning of some sort. +``` + +___Color Theory___ +- [Colors Influence Choice](https://usabilitygeek.com/colour-user-experience-psychology/#:~:text=Colour%20plays%20a%20crucial%20role,and%20identified%20with%20your%20industry.): Users are shown certain colors to enforce actions. For example, red is commonly linked to aggressive or bad emotions and as such can be used as a cancel to dissuade people from refunding items. + ___Button Design___ -- [Amazon Button](https://medium.com/@cccalibour/how-ux-design-makes-a-difference-amazons-continue-button-901618a8b00e): The design of butt -ons that improves user experience by simplifying process. + +Your buttons need to look clickable. Otherwise, your user may not understand that your button is interactive. Your buttons can have certain states: +- Normal: communicates that the button is interactive +- Focused: the button is highlighted in some way +- Hovered: lets the user know that their cursor is on top of the button +- Active: the button has been clicked on +- Progress/loading: lets the user know that something is happening because they clicked the button +- Disabled: lets the user know that this button can't be clicked +Learn more about button design [here](https://uxdesign.cc/button-design-user-interface-components-series-85243b6736c7). + +You may find this article on [Amazon's One-Click Button](https://medium.com/@cccalibour/how-ux-design-makes-a-difference-amazons-continue-button-901618a8b00e) interesting. It discusses how the design of buttons can drastically improve user experience... and increase your revenue! :) ___Navigation Systems___ +Your users should feel comfortable with navigating through your application. Here are some elements to consider... +- Wayfinding: this includes breadcrumbs, convenient links to take you back to the home page, and "you are here" indicators. +- Call-to-action button +- Primary navigation (e.g., the main navbar) +- Secondary navigation (e.g., a smaller navbar that pops up underneath the main one) +- Utility navigation: important parts of the application that aren't part of the main content (e.g., help sections, social media links) +- Vertical navigation +- Search bars +- Shortcuts to related content + ___Typography___ +Make sure the text on your application is **legible**! Body text should be at least 16px; on bigger screens, body text should be at least 20-24px. Your line height should also be around 1.5 times the font size for an easier reading experience. You may also want to consider using 40-70 characters per line so that your user's eyes aren't flicking back and forth all the time. + +Make sure to use a universal, legible font style, and don't use extremely contrasting colours. For example, pure black text against a pure white background is too stark for the eyes and will eventually cause eye strain. Consider dimming it down. + ___Established Norms___ - [Scrolls On Socials](https://forgeandsmith.com/blog/scrolling-vs-clicking-whats-the-preferred-user-experience/): Users are conditioned for scrolling, and now every new social media app conforms to scrolling. -___Color Theory___ -- [Colors Influence Choice](https://usabilitygeek.com/colour-user-experience-psychology/#:~:text=Colour%20plays%20a%20crucial%20role,and%20identified%20with%20your%20industry.): Users are shown certain colors to enforce actions. For example, red is commonly linked to aggressive or bad emotions and as such can be used as a cancel to dissuade people from refunding items. - ___Responsive Design___ - [Responsive Design](https://devrix.com/tutorial/important-responsive-design/): Responsive Design generally refers to a design where the software is adaptable to the consumer's device. The responsive design can be many things including screen sizes, collapsing of navbars, adjusting texts based on the screens, scrolling effects and more. The benefits of a responsive design make your software accessible across varying devices and overall improves the user experience. The article demonstrates the importance and benefits of responsive design, the flexibility they provide, and the easiblity for the consumers upon making the said software. @@ -55,7 +156,7 @@ ___Responsive Design___ ___Nielsen's 10 Usability Heuristics___ - [Usability Heuristics](./User_Experience/Usability_Heuristics.md) -### Sitemapping, Wireframing, and Prototyping +### Site mapping, Wireframing, and Prototyping ## Accessibility Features of User Experience From 2e9b0a0e693ae7448e66da01cbd40a74c7c8488d Mon Sep 17 00:00:00 2001 From: Chelsea Wang <98237975+chwawa@users.noreply.github.com> Date: Fri, 3 Nov 2023 14:11:23 -0400 Subject: [PATCH 03/70] Update User_Experience.md added more discussion --- Topics/User_Experience.md | 49 +++++++++++++++++++++++---------------- 1 file changed, 29 insertions(+), 20 deletions(-) diff --git a/Topics/User_Experience.md b/Topics/User_Experience.md index 5a090fc1c..b332505c2 100644 --- a/Topics/User_Experience.md +++ b/Topics/User_Experience.md @@ -4,23 +4,23 @@ ## Table of Contents 1. [Overview](https://learning-software-engineering.github.io/Topics/User_Experience.html#overview) 2. [Fundamentals of User Experience](https://learning-software-engineering.github.io/Topics/User_Experience.html#fundamentals-of-user-experience) - - User Research - - Visual Elements of User Interface Design - - User Experience Principles - - Site mapping, Wireframing, and Prototyping -3. [Accessibility Features of User Experience](https://learning-software-engineering.github.io/Topics/User_Experience.html#accessibility-features-of-user-experience) -4. [Helpful Courses](https://learning-software-engineering.github.io/Topics/User_Experience.html#helpful-courses) -5. [Tools Used in User Experience Design](https://learning-software-engineering.github.io/Topics/User_Experience.html#tools-used-in-user-experience-design) - - Design Tools - - UI Component Libraries -6. [User Experience-Oriented Games](https://learning-software-engineering.github.io/Topics/User_Experience.html#user-experience-oriented-games) + - [User Research](https://learning-software-engineering.github.io/Topics/User_Experience.html#user-research) + - [Visual Elements of User Interface Design](https://learning-software-engineering.github.io/Topics/User_Experience.html#visual-elements-of-user-interface-design) + - [User Experience Principles](https://learning-software-engineering.github.io/Topics/User_Experience.html#user-experience-principles) + - [Site mapping, Wireframing, and Prototyping](https://learning-software-engineering.github.io/Topics/User_Experience.html#site-mapping-wireframing-and-prototyping) + - [Accessibility](https://learning-software-engineering.github.io/Topics/User_Experience.html#accessibility) +3. [Helpful Courses](https://learning-software-engineering.github.io/Topics/User_Experience.html#helpful-courses) +4. [Tools Used in User Experience Design](https://learning-software-engineering.github.io/Topics/User_Experience.html#tools-used-in-user-experience-design) + - [Design Tools](https://learning-software-engineering.github.io/Topics/User_Experience.html#design-tools) + - [UI Component Libraries](https://learning-software-engineering.github.io/Topics/User_Experience.html#ui-component-libraries) +5. [User Experience-Oriented Games](https://learning-software-engineering.github.io/Topics/User_Experience.html#user-experience-oriented-games) ## Overview -User experience (UX) is a large and broad topic. It covers the overall experience of the user and how they interact with software systems and applications. The main focus of User Experience is to make a piece of software accessible, easy to follow (i.e., user friendly) and adaptable to the user's needs. There is no set of standard rules that make up a "great" user experience, as it often differs on the product and the consumers that are using the products. +User experience (UX) is a large and broad topic. It covers the overall experience of the user and how they interact with software systems and applications. The main focus of User Experience is to make a piece of software accessible, easy to follow (i.e., user-friendly) and adaptable to the user's needs. There is no set of standard rules that make up a "great" user experience, as it often depends on the product and the consumers who are using the products. User experience is not to be confused with UI (User Interface) and UX _design_. While these topics have similarities with user experience, they are also different in their own ways: -- **UI design** is the process of creating a interface with a focus on how the interface will _look_ like -- think of aesthetics! +- **UI design** is the process of creating an interface with a focus on how the interface will _look_ like -- think of aesthetics! - **UX design** is the process of creating an interface with a focus on a smooth, meaningful user _experience_ -- think of usability and usefulness! - **User experience** is a user's journey when interacting with your software/application. @@ -95,7 +95,7 @@ You can combine shapes with lines to make elements like buttons. _Texture_ -You can use texture to draw a user's eye to elements like titles, icons, and buttons. Keep in mind that texture and patterns are different -- patterns are small repetitive elements (like polka dots, while texture is not necessarily repetitive. Read more about texture [here](https://uxdesign.cc/web-design-theory-texture-1e07c29b10e5), and see examples of website that use texture [here](https://www.webfx.com/blog/web-design/textured-website-designs-inspiration/). +You can use texture to draw a user's eye to elements like titles, icons, and buttons. Keep in mind that texture and patterns are different -- patterns are small repetitive elements (like polka dots, while texture is not necessarily repetitive. Read more about texture [here](https://uxdesign.cc/web-design-theory-texture-1e07c29b10e5), and see examples of websites that use texture [here](https://www.webfx.com/blog/web-design/textured-website-designs-inspiration/). _Space_ @@ -113,7 +113,7 @@ _Colour_ ``` ___Color Theory___ -- [Colors Influence Choice](https://usabilitygeek.com/colour-user-experience-psychology/#:~:text=Colour%20plays%20a%20crucial%20role,and%20identified%20with%20your%20industry.): Users are shown certain colors to enforce actions. For example, red is commonly linked to aggressive or bad emotions and as such can be used as a cancel to dissuade people from refunding items. +- [Colors Influence Choice](https://usabilitygeek.com/colour-user-experience-psychology/#:~:text=Colour%20plays%20a%20crucial%20role,and%20identified%20with%20your%20industry.): Users are shown certain colours to enforce actions. For example, red is commonly linked to aggressive or bad emotions and as such can be used as a cancel to dissuade people from refunding items. ___Button Design___ @@ -154,17 +154,24 @@ ___Responsive Design___ ### User Experience Principles ___Nielsen's 10 Usability Heuristics___ -- [Usability Heuristics](./User_Experience/Usability_Heuristics.md) + +Jakob Nielsen's [10 Heuristics for Interaction Design](./User_Experience/Usability_Heuristics.md) are principles/rules of thumb to follow if you want to create a clear, intuitive user experience for your application. The principles describe scenarios and elements that your application may want to account for. ### Site mapping, Wireframing, and Prototyping +**Site mapping** is essentially creating a bare-bones diagram of the flow of your application. Your diagram should communicate how your pages connect. It should answer the question, "Which page(s) comes after this current page?" + +**Wireframing** comes before the **mock-up** process, though as a software engineer, you probably won't be making any wireframes. A **mock-up** of your application is essentially a static design of your application's pages. A benefit of creating a mock-up is that you can communicate your design ideas to your teammates and get feedback from your customer/partner, if you have one. Mock-ups are also known as **low-fidelity prototypes** +**Wireframes** are the "skeleton" of your mock-up; they communicate the general layout of your application and don't include details like specific text or colour. This is why you create wireframes before your mock-up. -## Accessibility Features of User Experience -There are some things that have become a crucial part in making a software: Universal Design Principles. +Finally, to create a **prototype**, or a **high-fidelity prototype**, you essentially make your mock-up interactive by connecting all the pages. Figma (discussed in the [Design Tools](https://learning-software-engineering.github.io/Topics/User_Experience.html#design-tools) section) is a free tool that you can use to create your mock-up and prototype. With prototyping tools like Figma, you can easily stimulate button clicks, screen swipes, etc. without any code. +### Accessibility ___The 7 Universal Design Principles___ -- [Universal Design Principles](https://www.buffalo.edu/access/help-and-support/topic3/universaldesignprinciples.html): Universal Design Principles are not only used for software, but can be incorporated generally as well. These 7 principles ensure accessibility, consistency, and user-friendly software. -This article provides the 7 Universal Design Principles that makes a software accessible to all users, which plays a important role in diversifying the User Experience. + +[Universal Design Principles](https://www.buffalo.edu/access/help-and-support/topic3/universaldesignprinciples.html) are not only used for software but can be incorporated generally as well. These 7 principles ensure accessibility, consistency, and user-friendly software. +This article provides the 7 Universal Design Principles that make software accessible to all users, which plays an important role in diversifying the User Experience. + ## Helpful Courses - [The Design of Interactive Computational Media (CSC318) offered by U of T](https://artsci.calendar.utoronto.ca/course/csc318h1). CSC318 expands on the work done before coding projects. For example, the course will have you test how users would interact with your prototype of a UI and then modify it so that the UX is better for the user. @@ -178,6 +185,8 @@ Figma is a free (for the most part) collaborative tool that lets you design and **Helpful tip:** With just a click of a button, you can switch to "developer mode" in Figma, which helps you translate design into code! Essentially, you can click on components like a button and get its corresponding code and styling. Read about how to use this feature [here](https://www.figma.com/dev-mode/). +**Figma, MUI, and React:** See the [UI Component Libraries](https://learning-software-engineering.github.io/Topics/User_Experience.html#ui-component-libraries) section for details on MUI. Note that MUI is a component library for React _only_. You can download the** MUI extension on Figma** and immediately use MUI components in your Figma design. Then, when you're ready to code, you can install MUI in your React project and easily create your frontend by entering "developer mode" on your Figma design and copying the code that Figma generated for you. + ___Adobe XD___ [Adobe XD](https://www.adobe.com/products/xd/learn/get-started/what-is-adobe-xd-used-for.html) is another popular prototyping tool. Unfortunately, the current author of this wiki doesn't know much about it, other than it requires a monthly subscription :(. @@ -187,7 +196,7 @@ When building an application with a frontend framework (e.g., React, Vue, Angula ___Material UI (MUI)___ -[MUI](https://mui.com/) is a popular library of UI design components made for React. +[MUI](https://mui.com/) is a popular library of UI design components made for React. These components are essentially pre-made "features" that you can immediately use, such as buttons, navbars, pop-ups, etc. ___Ant Design___ From eecec44f472040af77b15bae9439563ea4311851 Mon Sep 17 00:00:00 2001 From: Chelsea Wang <98237975+chwawa@users.noreply.github.com> Date: Fri, 3 Nov 2023 14:20:02 -0400 Subject: [PATCH 04/70] Update User_Experience.md format update --- Topics/User_Experience.md | 74 +++++++++++++++++++-------------------- 1 file changed, 37 insertions(+), 37 deletions(-) diff --git a/Topics/User_Experience.md b/Topics/User_Experience.md index b332505c2..94eef5aad 100644 --- a/Topics/User_Experience.md +++ b/Topics/User_Experience.md @@ -16,7 +16,7 @@ 5. [User Experience-Oriented Games](https://learning-software-engineering.github.io/Topics/User_Experience.html#user-experience-oriented-games) -## Overview +# Overview User experience (UX) is a large and broad topic. It covers the overall experience of the user and how they interact with software systems and applications. The main focus of User Experience is to make a piece of software accessible, easy to follow (i.e., user-friendly) and adaptable to the user's needs. There is no set of standard rules that make up a "great" user experience, as it often depends on the product and the consumers who are using the products. User experience is not to be confused with UI (User Interface) and UX _design_. While these topics have similarities with user experience, they are also different in their own ways: @@ -29,13 +29,13 @@ There are many resources that differentiate between user experience, UI design, - [Differences Between UX and UI Design](https://bootcamp.cvn.columbia.edu/blog/what-is-ux-design/#:~:text=User%20experience%20(UX)%20refers%20to,usability%2C%20function%2C%20and%20design.) -## Fundamentals of User Experience +# Fundamentals of User Experience As mentioned earlier, user experience is not easy to define as it is a large and broad topic. Here are a _few_ areas of UX that software engineers should pay attention to: -### User Research +## User Research When it comes to user experience, conducting user research is very important as it lets us discover new problems and address deeper issues. As a software engineer, it may be extensive for you to conduct user research, but there are tools that you can use to understand your users better, such as the following: -___Point-of-View Statements___ +### Point-of-View Statements POV statements let you describe your user and their needs, and they can help you discover new problems/questions that you need to solve before creating your application. @@ -47,7 +47,7 @@ The structure of a POV statement is: Now that we've realized a possible pain point for a senior citizen, we can look into implementing our grocery shopping app such that it's accessible to this target audience. -___User Personas___ +### User Personas User personas should be built from user research data, not stereotypes. In CSC301, your partner may guide you in creating personas, but in the worst case, you'll find yourself creating personas from no data since you don't have time to conduct research. Nonetheless, there are many benefits to creating personas, including, but not limited to: - Provides you with a better understanding of your target user groups @@ -66,18 +66,18 @@ If you use a template, it'll prompt you to fill in specific information about yo A quick Google image search for "User Persona" will help tie all this information together. -### Visual Elements of User Interface Design -___Design Principles___ +## Visual Elements of User Interface Design +### Design Principles UI designers achieve a visual hierarchy (i.e., the order a user processes the application's information) in their interfaces by using contrast. To create contrast, consider playing around with the following elements: -_Scale_ +**_Scale_** >

Larger text attracts the eye,

whereas smaller text is easier to ignore.
-_Weight_ +**_Weight_** > **Bold text attracts the eye** much more than regular text. -_Direction_ +**_Direction_** You want to direct your users to a call to action. For example: >

Welcome!

@@ -89,33 +89,33 @@ Your eyes easily flow from the title to the smaller message. Then, you're inclin > Please click the button. At first, you feel confused as to why there's a button at the top. Then you read the message, and now your eyes have to flick back to the top to find the button. It's a minor detail, but it still negatively affects the flow of the application. -_Form/shape_ +**_Form/shape_** You can combine shapes with lines to make elements like buttons. -_Texture_ +**_Texture_** You can use texture to draw a user's eye to elements like titles, icons, and buttons. Keep in mind that texture and patterns are different -- patterns are small repetitive elements (like polka dots, while texture is not necessarily repetitive. Read more about texture [here](https://uxdesign.cc/web-design-theory-texture-1e07c29b10e5), and see examples of websites that use texture [here](https://www.webfx.com/blog/web-design/textured-website-designs-inspiration/). -_Space_ +**_Space_** Make use of whitespace so users have an easier time reading your application's text. -_Value/shade_ +**_Value/shade_** Value can attract the eye. For example, you can use shading to create button shadows. -_Colour_ +**_Colour_** ```diff - Red text seems urgent, + whereas green usually indicates success. ! Orange feels like a warning of some sort. ``` -___Color Theory___ +### Color Theory - [Colors Influence Choice](https://usabilitygeek.com/colour-user-experience-psychology/#:~:text=Colour%20plays%20a%20crucial%20role,and%20identified%20with%20your%20industry.): Users are shown certain colours to enforce actions. For example, red is commonly linked to aggressive or bad emotions and as such can be used as a cancel to dissuade people from refunding items. -___Button Design___ +### Button Design Your buttons need to look clickable. Otherwise, your user may not understand that your button is interactive. Your buttons can have certain states: - Normal: communicates that the button is interactive @@ -128,7 +128,7 @@ Learn more about button design [here](https://uxdesign.cc/button-design-user-int You may find this article on [Amazon's One-Click Button](https://medium.com/@cccalibour/how-ux-design-makes-a-difference-amazons-continue-button-901618a8b00e) interesting. It discusses how the design of buttons can drastically improve user experience... and increase your revenue! :) -___Navigation Systems___ +### Navigation Systems Your users should feel comfortable with navigating through your application. Here are some elements to consider... - Wayfinding: this includes breadcrumbs, convenient links to take you back to the home page, and "you are here" indicators. @@ -140,46 +140,46 @@ Your users should feel comfortable with navigating through your application. Her - Search bars - Shortcuts to related content -___Typography___ +### Typography Make sure the text on your application is **legible**! Body text should be at least 16px; on bigger screens, body text should be at least 20-24px. Your line height should also be around 1.5 times the font size for an easier reading experience. You may also want to consider using 40-70 characters per line so that your user's eyes aren't flicking back and forth all the time. Make sure to use a universal, legible font style, and don't use extremely contrasting colours. For example, pure black text against a pure white background is too stark for the eyes and will eventually cause eye strain. Consider dimming it down. -___Established Norms___ +### Established Norms - [Scrolls On Socials](https://forgeandsmith.com/blog/scrolling-vs-clicking-whats-the-preferred-user-experience/): Users are conditioned for scrolling, and now every new social media app conforms to scrolling. -___Responsive Design___ +### Responsive Design - [Responsive Design](https://devrix.com/tutorial/important-responsive-design/): Responsive Design generally refers to a design where the software is adaptable to the consumer's device. The responsive design can be many things including screen sizes, collapsing of navbars, adjusting texts based on the screens, scrolling effects and more. The benefits of a responsive design make your software accessible across varying devices and overall improves the user experience. The article demonstrates the importance and benefits of responsive design, the flexibility they provide, and the easiblity for the consumers upon making the said software. -### User Experience Principles -___Nielsen's 10 Usability Heuristics___ +## User Experience Principles +### Nielsen's 10 Usability Heuristics Jakob Nielsen's [10 Heuristics for Interaction Design](./User_Experience/Usability_Heuristics.md) are principles/rules of thumb to follow if you want to create a clear, intuitive user experience for your application. The principles describe scenarios and elements that your application may want to account for. -### Site mapping, Wireframing, and Prototyping +## Site mapping, Wireframing, and Prototyping **Site mapping** is essentially creating a bare-bones diagram of the flow of your application. Your diagram should communicate how your pages connect. It should answer the question, "Which page(s) comes after this current page?" -**Wireframing** comes before the **mock-up** process, though as a software engineer, you probably won't be making any wireframes. A **mock-up** of your application is essentially a static design of your application's pages. A benefit of creating a mock-up is that you can communicate your design ideas to your teammates and get feedback from your customer/partner, if you have one. Mock-ups are also known as **low-fidelity prototypes** +**Wireframing** comes before the **mock-up** process, though as a software engineer, you probably won't be making any wireframes. A **mock-up** of your application is essentially a static design of your application's pages. A benefit of creating a mock-up is that you can communicate your design ideas to your teammates and get feedback from your customer/partner if you have one. Mock-ups are also known as **low-fidelity prototypes** **Wireframes** are the "skeleton" of your mock-up; they communicate the general layout of your application and don't include details like specific text or colour. This is why you create wireframes before your mock-up. -Finally, to create a **prototype**, or a **high-fidelity prototype**, you essentially make your mock-up interactive by connecting all the pages. Figma (discussed in the [Design Tools](https://learning-software-engineering.github.io/Topics/User_Experience.html#design-tools) section) is a free tool that you can use to create your mock-up and prototype. With prototyping tools like Figma, you can easily stimulate button clicks, screen swipes, etc. without any code. +Finally, to create a **prototype**, or a **high-fidelity prototype**, you essentially make your mock-up interactive by connecting all the pages. Figma (discussed in the [Design Tools](https://learning-software-engineering.github.io/Topics/User_Experience.html#figma) section) is a free tool that you can use to create your mock-up and prototype. With prototyping tools like Figma, you can easily stimulate button clicks, screen swipes, etc. without any code. -### Accessibility -___The 7 Universal Design Principles___ +## Accessibility +### The 7 Universal Design Principles [Universal Design Principles](https://www.buffalo.edu/access/help-and-support/topic3/universaldesignprinciples.html) are not only used for software but can be incorporated generally as well. These 7 principles ensure accessibility, consistency, and user-friendly software. This article provides the 7 Universal Design Principles that make software accessible to all users, which plays an important role in diversifying the User Experience. -## Helpful Courses +# Helpful Courses - [The Design of Interactive Computational Media (CSC318) offered by U of T](https://artsci.calendar.utoronto.ca/course/csc318h1). CSC318 expands on the work done before coding projects. For example, the course will have you test how users would interact with your prototype of a UI and then modify it so that the UX is better for the user. - [CalArt's UI/UX Design Specialization on Coursera](https://www.coursera.org/specializations/ui-ux-design). This is a package of 4 courses that teaches beginners the elements of UI design, fundamentals of UX design, and web design. This specialization will help you gain experience in wireframing, prototyping, and _designing_ (not coding) your own website/app. Plus, as a U of T student, you can get this specialization certificate for free once you finish the 4 courses! -## Tools Used in User Experience Design -### Design Tools -___Figma___ +# Tools Used in User Experience Design +## Design Tools +### Figma Figma is a free (for the most part) collaborative tool that lets you design and build mock-ups and prototypes of your software/applications. You may not need to build prototypes as a software developer/engineer, but you'll probably find yourself viewing Figma design files to build your frontend. So, now's a great time to start learning how to use [Figma](https://www,figma.com)! @@ -187,18 +187,18 @@ Figma is a free (for the most part) collaborative tool that lets you design and **Figma, MUI, and React:** See the [UI Component Libraries](https://learning-software-engineering.github.io/Topics/User_Experience.html#ui-component-libraries) section for details on MUI. Note that MUI is a component library for React _only_. You can download the** MUI extension on Figma** and immediately use MUI components in your Figma design. Then, when you're ready to code, you can install MUI in your React project and easily create your frontend by entering "developer mode" on your Figma design and copying the code that Figma generated for you. -___Adobe XD___ +### Adobe XD [Adobe XD](https://www.adobe.com/products/xd/learn/get-started/what-is-adobe-xd-used-for.html) is another popular prototyping tool. Unfortunately, the current author of this wiki doesn't know much about it, other than it requires a monthly subscription :(. -### UI Component Libraries +## UI Component Libraries When building an application with a frontend framework (e.g., React, Vue, Angular, etc.), developers can import an UI design component library/libraries to help them easily build aesthetic, user-friendly interfaces. -___Material UI (MUI)___ +### Material UI (MUI) [MUI](https://mui.com/) is a popular library of UI design components made for React. These components are essentially pre-made "features" that you can immediately use, such as buttons, navbars, pop-ups, etc. -___Ant Design___ +### Ant Design Ant Design is another popular UI library and design system. It is specifically designed for React applications and other frontend frameworks like Vue, Angular and etc, providing a complete set of high-quality React components that make user interface development simpler, more consistent, and modular. Ant Design is ideal for building enterprise-level applications and dashboards with a focus on high performance, usability, and aesthetics. @@ -237,7 +237,7 @@ If you want to learn more about Ant Design. There are some useful documents or t By following these tutorials, I hope you can gain a solid understanding of how to use Ant Design in your React projects and create attractive, user-friendly interfaces. -## User Experience-Orientated Games +# User Experience-Orientated Games User experience is unique, as practicing user experience design can be challenging. Since user experience has to do a lot with visuals, you can learn user design by playing games. User experience orientated games can be an engaging and fun way to get familiar with common UX practices. Here are unique games that can help develop better UX design skills. - [Can't Unsee](https://cantunsee.space/): The game of choice! Can't Unsee is a game that presents the user with two designs and challenges the user to pick the most correct user experience design. Feedback on each selection allows the user to learn from their mistakes. Sharpen your knowledge of common user experience design practices while testing your attention to detail. From 892dc304773cf2750f3e6f7eb455e66082115c07 Mon Sep 17 00:00:00 2001 From: Raazia Hashim <67606070+hashimr1@users.noreply.github.com> Date: Mon, 6 Nov 2023 19:43:26 -0500 Subject: [PATCH 05/70] Create Temporal.md --- Topics/Tech_Stacks/Temporal.md | 113 +++++++++++++++++++++++++++++++++ 1 file changed, 113 insertions(+) create mode 100644 Topics/Tech_Stacks/Temporal.md diff --git a/Topics/Tech_Stacks/Temporal.md b/Topics/Tech_Stacks/Temporal.md new file mode 100644 index 000000000..d6c28de75 --- /dev/null +++ b/Topics/Tech_Stacks/Temporal.md @@ -0,0 +1,113 @@ +# Temporal For Workflow Orchestration + +## Table of contents +### [Introduction to Temporal](#introduction-to-temporal) +### [How does Temporal work](#how-does-temporal-work) +### [Your first workflow](#your-first-workflow) +### [Additional Resources](#additional-resources) + +## Introduction to Temporal +Temporal is an open-source, stateful, distributed application orchestration platform that allows you to build scalable and resilient applications. +It simplifies the development of complex, long-running workflows and helps you manage the state and execution of various processes within your application. +Temporal is designed to handle the challenges of building mission-critical, distributed systems by providing a powerful way to model, manage, and execute your business logic. + +- Stateful Workflows: +Temporal enables the development of stateful workflows that can run for an extended period, coordinating various tasks and activities. + +- Resilience: +It helps you build highly resilient applications by managing retries, timeouts, and error handling, ensuring that your workflows can withstand failures in a distributed environment. + +- Language Agnostic: +Temporal is language-agnostic, allowing you to write workflows in the programming language of your choice. + +- Durability: +It ensures the durability of your application state by persisting it in a reliable storage system, making it possible to recover and resume workflows even after system failures. + +- Scalability: +Temporal is built to scale horizontally and handle high loads, making it suitable for applications of all sizes, from small projects to large, enterprise-grade systems. + +## How does Temporal work +Temporal operates by decoupling the application's business logic from the execution environment. It does this through the following components and principles: + +- Workflows: +Workflows are long-running, stateful processes that encapsulate the application's business logic. +They can wait for events, make decisions, and coordinate various activities. Temporal ensures that workflows continue to execute reliably, even in the face of failures. + +- Activities: +Activities are individual units of work that the workflow can execute. They can be short-lived functions or services, and Temporal manages their execution and retries. + +- Temporal Server: +The Temporal Server is responsible for managing workflow and activity execution. It maintains a history of events for each workflow and ensures that they are executed correctly. + +- Durable State: +Temporal stores the durable state of workflows and activities in a persistent storage system, allowing it to recover and resume them even after system outages. + +- Workers: +Workers are application components that interact with the Temporal Server to execute workflows and activities. They listen for tasks, execute them, and report the results back to the server. + +- Execution Semantics: +Temporal provides guarantees about the execution of workflows, ensuring that they remain deterministic and predictable, even when executed across different environments or after failures. + +## Your first workflow +To create a simple "Hello, World!" program using Temporal in TypeScript, you need to set up a basic workflow and use the Temporal API to execute it. Here's how you can do it: +#### Setup Your TypeScript Project +Before you begin, make sure you have TypeScript installed. You can create a new TypeScript project using a tool like `npm` or `yarn`. First, create a new directory for your project, navigate to it in the terminal, and then initialize a new TypeScript project: + +```bash +mkdir temporal-hello-world +cd temporal-hello-world +npm init -y +npm install --save @temporalio/sdk +npm install --save typescript +``` +#### Create a TypeScript Workflow +Create a new TypeScript file, e.g., hello-world.ts, and write your Temporal workflow code in it. + +```typescript +import { Connection, Worker } from '@temporalio/sdk'; + +// Define your workflow function +async function helloWorld(): Promise { + console.log('Hello, World!'); +} + +// Create a Temporal Connection +const connection = new Connection(); + +// Create a Worker that listens for workflow tasks +const worker = new Worker(connection, 'your-namespace'); +worker.registerWorkflow('hello-world', helloWorld); + +// Start the worker +worker.run(); +``` + +In this code, we import the necessary Temporal SDK components, define a simple workflow function helloWorld that logs "Hello, World!", create a connection to Temporal, create a worker for your specific namespace, register the hello-world workflow, and start the worker. + +#### Compile and Execute the Workflow +To compile your TypeScript code and execute the workflow, you can use the TypeScript compiler (tsc) to transpile the TypeScript code into JavaScript and then execute the JavaScript code. Run the following commands: + +```bash +tsc hello-world.ts +node hello-world.js +``` + +This will compile your TypeScript code into JavaScript and run the workflow. You should see "Hello, World!" printed to the console. + +#### Start a Temporal Server +To run Temporal workflows, you'll need a Temporal server running. You can set up a local server using the Temporal Docker image or use a hosted service. Ensure you have Docker installed using installation instructions [here](https://www.docker.com/get-started/). + +To run a local Temporal server using Docker, you can execute the following command: + +```bash +docker run --rm -p 7233:7233 --name temporal-server --network host temporalio/temporal:latest +``` + +With this setup, you have created a simple "Hello, World!" Temporal workflow using TypeScript. You can expand on this by adding more complex workflow logic and interacting with external services or resources as needed. + + +## Additional Resources +- Read more about how temporal works behind the scenes [here](https://temporal.io/how-temporal-works). +- Additional documentaion can be found [here](https://docs.temporal.io/concepts/). +- Check out the developers guide for your prefered programming language, including [Go](https://docs.temporal.io/dev-guide/go), [Java](https://docs.temporal.io/dev-guide/java), [PHP](https://docs.temporal.io/dev-guide/php), [Python](https://docs.temporal.io/dev-guide/python) and [Typescript](https://docs.temporal.io/dev-guide/typescript) here. +- [This is a great video](https://www.youtube.com/watch?v=LliBP7YMGyA) on how a company like Netflix uses temporal to build thier systems. From 7a140a659825de3c0ae1c4cae7a333cb26891362 Mon Sep 17 00:00:00 2001 From: Nada Eldin Date: Sun, 12 Nov 2023 22:13:38 -0500 Subject: [PATCH 06/70] First commit for PR review --- .../Product_Management.md | 0 ...Product_Management_vs_Product_Ownership.md | 81 +++++++++++++++++++ 2 files changed, 81 insertions(+) rename Topics/{ => Product_Management}/Product_Management.md (100%) create mode 100644 Topics/Product_Management/Product_Management_vs_Product_Ownership.md diff --git a/Topics/Product_Management.md b/Topics/Product_Management/Product_Management.md similarity index 100% rename from Topics/Product_Management.md rename to Topics/Product_Management/Product_Management.md diff --git a/Topics/Product_Management/Product_Management_vs_Product_Ownership.md b/Topics/Product_Management/Product_Management_vs_Product_Ownership.md new file mode 100644 index 000000000..3c360f39f --- /dev/null +++ b/Topics/Product_Management/Product_Management_vs_Product_Ownership.md @@ -0,0 +1,81 @@ +# Product Manager vs Product Owner + +## Table of contents +### [What is a product manager?](#what-is-a-product-manager) +### [What are a Product Manager's responsibilities?](#what-are-a-product-managers-responsibilities) +### [What is a Product Owner?](#what-is-a-product-owner) +### [What are a Product Owner's responsibilities?](#what-are-a-product-owners-responsibilities) +### [What is the difference between a product manager and a product owner?](#what-is-the-difference-between-a-product-manager-and-a-product-owner) + +### [Additional Resources](#additional-resources) + +## What is a product manager? +A product manager is the person who identifies the customer need and the larger business objectives that a product or feature will fulfill, articulates what success looks like for a product, and rallies a team to turn that vision into a reality. + +A product manager sits at the intersection of business, technology, and user experience. Product Managers need to balance all of those three needs and make hard decisions and trade-offs. Product Managers (PMs) are usually referred to as the "CEO of the product" because they set the goals, define success, help motivate teams, and are responsible for the outcome. + +## What are a Product Manager's responsibilities? + +In larger organizations, product managers are embedded within teams of specialists. Researchers, analysts, and marketers help gather input, while developers and designers manage the day-to-day execution, draw up designs, test prototypes, and find bugs. These product managers have more help, but they also spend more time aligning the stakeholders behind a specific vision. + +Product Managers at smaller organizations spend less time getting everyone to agree, but more time doing the hands-on work that comes with defining a vision and seeing it through. + +In general, a good product manager will spend their time on a handful of tasks such as: +* Understanding and representing user needs. +* Monitoring the market and developing competitive analyses. +* Defining a vision or roadmap for a product +* Aligning stakeholders around the vision for the product. +* Prioritizing product features and capabilities. +* Creating a cross-functional team to empower independent decision-making. + +## What is a Product Owner? + +A product owner is a Scrum team role that's accountable for the product's outcome and responsible for maximizing its value. + +As a member of the Scrum Team, the Product Owner provides clarity to the team about a product's vision and goal. All work is derived and prioritized based on the **Product Goal** in order to deliver value to all stakeholders including those within their organization and all users both inside and out. Product Owners (POs) identify, measure and maximize value throughout the entire product's lifecycle. + +## What are a Product Owner's responsibilities? + +The product owner is accountable for effective Product Backlog management, which includes: + +* Listening to customers and turning their problems and complaints into user stories that create actionable items. They prioritize these stories and then arrange them in the product backlog. +* Building and setting production process priorities to make sure the development team knows specifically what thing to focus on in order of importance +* The product owner is present at all team meetings with other internal stakeholders such as the scrum master to make sure that the whole development process is following the product roadmap created by the product manager +* They are the communication link between the customer and the development teams. The product owner is the embodiment of the customer's voice +* Giving constructibe feedback on the ratified roadmap. This is a communication link between the product owner and the product manager. + +The product owner may do this work or delegate the responsibility to others on the Scrum Team. Regardless of who does the work, the Product Owner remains accountable for it being accomplished and for the **value delivered**. + +It is critical for the Product Owner to earn the respect of the entire organization in order to get the support they need for the decisions they make. These decisions need to be transparent in the Product Backlog. + +The product owner is one person who represents the needs of many stakeholders in the Product Backlog. If someone in the organization wants a change in the Product Backlog, they need to discuss this with the product owner and try to convince them. Ultimately, the product owner makes that decision. The product owner should also be getting feedback from customers on the product. + +## What is the difference between a product manager and a product owner? + +A product managers is with the product from conception to launch. However, the product owner role has a narrower focus when it comes to working with the development team. + +The product manager studies the customer's wants and needs, whereas the product owner makes sure that product development is following the product roadmap. The product manager decides what is going to be built or adapted and the product owner makes sure the development team does just that. + +| Product Manager | Product Owner | +|-----------------|---------------| +| This role is all about the big picture for a product with the whole long-term project in mind. | A role that looks at the smaller details rather than the big picture. Short-term focus.| +| The vision of the product. | Making product vision into an actionable backlog. | +| Customer understanding. | Advocate for the customer's needs. | +| Prioritize features. | Highlights needs for the development of a team. | +| Product roadmap. | Backlog, epics, and user stories. | + +Basically, product managers are strategic, while product owners are more tactical. There are some similarities between both roles. For example, they guide the product through the development process and work with several of the same teams across the organization. + +In some cases, a PO might take on some of the more strategic roles of a PM, and vice versa. But in a prototypical agile organization, the team will have both product owners and product managers, each responsible for some variation of the functions listed above. + +In that sense, a product owner is a type of product manager -more tactical, more internal-facing- who helps keep the product's progress on track in an agile organization. + +## Additional Resources + +- Read more about a product manager's role [here] (https://www.heap.io/topics/what-does-a-product-manager-do). + +- Read more about a product owner's role [here] (https://www.techtarget.com/searchsoftwarequality/definition/product-owner). + +- Read more about the difference between product manager and product owner [here] (https://www.productboard.com/blog/product-owner-vs-product-manager/). + +- Check out these books about product management (https://www.amazon.ca/INSPIRED-Create-Tech-Products-Customers/dp/1119387507) and (https://www.amazon.ca/Cracking-PM-Interview-Product-Technology/dp/0984782818). \ No newline at end of file From f7eacb42e696b64e859da8aeb8f7bf31c290a626 Mon Sep 17 00:00:00 2001 From: Yasutakahi <113137606+Yasutakahi@users.noreply.github.com> Date: Mon, 13 Nov 2023 23:27:22 -0500 Subject: [PATCH 07/70] Create Nodemailer.md created a file for nodemailer --- Topics/Tech_Stacks/Nodemailer.md | 93 ++++++++++++++++++++++++++++++++ 1 file changed, 93 insertions(+) create mode 100644 Topics/Tech_Stacks/Nodemailer.md diff --git a/Topics/Tech_Stacks/Nodemailer.md b/Topics/Tech_Stacks/Nodemailer.md new file mode 100644 index 000000000..781b62039 --- /dev/null +++ b/Topics/Tech_Stacks/Nodemailer.md @@ -0,0 +1,93 @@ +# Nodemailer + +## Table of contents +### [Introduction](#introduction-1) +### [Create a Transporter object](#create-a-transporter-object-1) +### [Create a MailOptions Object](#create-a-mailoptions-object-1) +### [Use the Transporter.sendMail method](#use-the-transportersendmail-method-1) + +## Introduction + +Nodemailer is a Node.js module that allows you to send emails from your server easily. You can use this Nodemailer however you like. For example communicating with others and notifying yourself if there is any problem. As the name suggests, Nodemailer is use in Node.js, so when you want to use Nodemailer to send mail, mnake sure to use Node.js and have Node.js ready with you. + +Before I start explaning how Nodemailer can be used, we have to install and import so we can use it. You can install nodemailer by the below command: + +``` +npm install nodemailer +``` +After you installed Nodemailer, make sure you import nodemailer so you can use it + +``` JavaScript +const nodemailer = require('nodemailer'); +``` + +[This link](https://www.freecodecamp.org/news/use-nodemailer-to-send-emails-from-your-node-js-server/) provides more practical and detailed mathod of installing necessary package and examples. + +## Create a Transporter object + +Now you are ready to use nodemailer! Using nodemailer involves three steps. Here, we explain first step which is creating a transporter object. This step is basically creating an object and setting information about basic information about a mail you are sneding including service you are using to send a mail, information about senders, and so on. The example codes are shown below: + +``` JavaScript +let transporter = nodemailer.createTransport({ + service: 'gmail', + auth: { + user: YOUR_MAIL_ADDRESS, + pass: YOUR_PASSWORD + } + }); +``` +Here, it uses gmail to send email. Information about the mail address that you want the email to sent from goes to auth as the code suggested. + +[This website](https://www.freecodecamp.org/news/use-nodemailer-to-send-emails-from-your-node-js-server/) gives further explanation about credential. It might be helpful when you are actually implementing and enconter any errors. + + +## Create a MailOptions Object: + +MailOptions object contains information about the contents of the mail that you want to send. The example code is shown below: + +``` JavaScript +let mailOptions = { + from: YOUR_EMAIL, + to: WHERE_EMAIL_IS_SENT_TO, + subject: 'Nodemailer Testing', + text: 'contents of your mail goes here' + }; +``` + +As the example code above shows, you can define the contents and subject can be defined here. There are some options for the text such as using HTML to format the text by adding html in mailOption like below: + +``` JavaScript +let mailOptions = { + from: YOUR_EMAIL, + to: WHERE_EMAIL_IS_SENT_TO, + subject: 'Nodemailer Testing', + text: 'contents of your mail goes here' + html: '

Welcome

Nice work!

' + }; +``` + +## Use the Transporter.sendMail method + +The last step is to use the Transporter.sendMail method. This is simpler than earlier steps. However, there are somethings we should aware of which is error handling. It is common that the nodemailer causes error since there might be typo in mail address and so on. Therefore, make sure to check for the error. If there are errors, make sure to hadle that separately. This code below gives you an idea how the error should be handled and how the method is used. + +``` JavaScript +transporter.sendMail(mailOptions, function(err, data) { + if (err) { + console.log("Error " + err); + } else { + console.log("Email sent successfully"); + } + }); +``` +This is very common way to handle errors. If specific operations are needed when there is an error, you can edit the code as needed. + +In conclusion, nodemailer is very simple way to send email to an user using node.js. + +## Useful Links +https://mailtrap.io/blog/sending-emails-with-nodemailer/ + + +https://www.knowledgehut.com/blog/web-development/nodemailer-module-nodejs + + +These websites have full tutorial from setting up to implmenting which can be useful! From 65576ca2e8453651a17a3cb4015cf5edab7401d2 Mon Sep 17 00:00:00 2001 From: Yasutakahi <113137606+Yasutakahi@users.noreply.github.com> Date: Mon, 13 Nov 2023 23:28:45 -0500 Subject: [PATCH 08/70] Update Tech_Stacks.md fixing the page so it has my file in there --- Topics/Tech_Stacks.md | 1 + 1 file changed, 1 insertion(+) diff --git a/Topics/Tech_Stacks.md b/Topics/Tech_Stacks.md index dfd16e46e..7723c2203 100644 --- a/Topics/Tech_Stacks.md +++ b/Topics/Tech_Stacks.md @@ -12,3 +12,4 @@ ### [Learning TypeScript](./Tech_Stacks/TypeScript.md) ### [Learning JavaScript](./Tech_Stacks/JavaScript.md) ### [Learning React Native](./Tech_Stacks/ReactNative.md) +### [Learning Nodemailer](./Tech_Stacks/Nodemailer.md) From d02fed03d8bee481f1dc49702a812b7f5ce38b72 Mon Sep 17 00:00:00 2001 From: Umair-H <93732264+Umair-H@users.noreply.github.com> Date: Tue, 14 Nov 2023 13:33:34 -0500 Subject: [PATCH 09/70] Create Prioritization_Techniques.md --- Topics/Product_Management/Prioritization_Techniques.md | 1 + 1 file changed, 1 insertion(+) create mode 100644 Topics/Product_Management/Prioritization_Techniques.md diff --git a/Topics/Product_Management/Prioritization_Techniques.md b/Topics/Product_Management/Prioritization_Techniques.md new file mode 100644 index 000000000..8b1378917 --- /dev/null +++ b/Topics/Product_Management/Prioritization_Techniques.md @@ -0,0 +1 @@ + From b895ed41252545d00c9fb295eec5f594f658458c Mon Sep 17 00:00:00 2001 From: Umair-H <93732264+Umair-H@users.noreply.github.com> Date: Tue, 14 Nov 2023 13:36:29 -0500 Subject: [PATCH 10/70] Update Product_Management.md --- Topics/Product_Management.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Topics/Product_Management.md b/Topics/Product_Management.md index 8e8c6f4d7..537462f8e 100644 --- a/Topics/Product_Management.md +++ b/Topics/Product_Management.md @@ -4,7 +4,7 @@ Product management is an essential part of the software development lifecycle, as much a key part as the technical side to software engineering. The essence of product management is to be able to develop a new product, with a clearly defined roadmap and goals/milestones outlined from the requirements of the customer - keeping a clear view of the overall vision and strategy. This is different to the role of a project manager, who is responsible for the internal organization and operation of the development team, to make sure goals are achieved and timelines are met. Some key features of a successful product manager: -* Able to efficiently and clearly prioritize tasks. +* [Able to efficiently and clearly prioritize tasks](./Product_Management/Prioritization_Techniques.md). * Understand the product, people and environment that you are working with. * Guide your development team without being authoritative. * If you are making tradeoffs, be sure to explain and outline the opportunity cost. From a7d8b0fae03120caeec63b8ce8dd365b455e4f3c Mon Sep 17 00:00:00 2001 From: Umair-H <93732264+Umair-H@users.noreply.github.com> Date: Tue, 14 Nov 2023 13:44:30 -0500 Subject: [PATCH 11/70] Update Prioritization_Techniques.md --- Topics/Product_Management/Prioritization_Techniques.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/Topics/Product_Management/Prioritization_Techniques.md b/Topics/Product_Management/Prioritization_Techniques.md index 8b1378917..f7e517ab0 100644 --- a/Topics/Product_Management/Prioritization_Techniques.md +++ b/Topics/Product_Management/Prioritization_Techniques.md @@ -1 +1,7 @@ +### The MoSCoW Method +The MoSCoW method, an acronym derived from Must-haves, Should-haves, Could-haves, and Won't-haves, serves as a powerful tool in the arsenal of product managers for prioritizing tasks. This technique categorizes requirements into four distinct priority levels, helping teams streamline decision-making. Must-haves represent non-negotiable essentials, forming the backbone of a project. Should-haves are crucial but not critical, offering flexibility in scheduling. Could-haves encompass desirable but optional features. While Won't-haves, as the name implies, denote consciously deferred items. By employing the MoSCoW method, teams gain clarity, align on priorities, and efficiently allocate resources, enhancing the likelihood of delivering a product that meets both user expectations and business needs. + +### The Kano Method + +The Kano model, developed by Professor Noriaki Kano, is a nuanced technique for product development prioritization. It categorizes features into three main types: Basic Needs, Performance Needs, and Delighters. Basic Needs are fundamental requirements that, when met, prevent dissatisfaction but don't necessarily contribute to satisfaction when exceeded. Performance Needs directly correlate satisfaction with their level of fulfillment—higher performance leads to greater satisfaction. Delighters are unexpected features that, when included, can significantly elevate user satisfaction. This method not only aids in prioritizing features based on their potential to enhance user experience but also guides teams in understanding the emotional and functional aspects that shape user preferences. By integrating the Kano model into your processes, product managers empower teams to make informed decisions that resonate with user expectations and contribute to long-term customer satisfaction. From fd33c79f241ec3ff1ec8c15fc5c238071dbd80bc Mon Sep 17 00:00:00 2001 From: Umair-H <93732264+Umair-H@users.noreply.github.com> Date: Wed, 15 Nov 2023 19:42:24 -0500 Subject: [PATCH 12/70] Update Prioritization_Techniques.md Added an introduction and conclusion --- Topics/Product_Management/Prioritization_Techniques.md | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/Topics/Product_Management/Prioritization_Techniques.md b/Topics/Product_Management/Prioritization_Techniques.md index f7e517ab0..1e16425a4 100644 --- a/Topics/Product_Management/Prioritization_Techniques.md +++ b/Topics/Product_Management/Prioritization_Techniques.md @@ -1,3 +1,7 @@ +### Introduction + +Effective prioritization lies at the core of successful product management, demanding a keen understanding of which tasks deserve priority. The art of prioritization can be the difference between crafting a polished minimum viable product and merely assembling an arbitrary assortment of features. In the realm of software development, two notable techniques stand out for their efficacy: the MoSCoW method and the Kano model. These methodologies offer invaluable frameworks for product managers, guiding teams through the intricate process of determining priorities and ensuring that essential foundations are laid before delving into additional features. + ### The MoSCoW Method The MoSCoW method, an acronym derived from Must-haves, Should-haves, Could-haves, and Won't-haves, serves as a powerful tool in the arsenal of product managers for prioritizing tasks. This technique categorizes requirements into four distinct priority levels, helping teams streamline decision-making. Must-haves represent non-negotiable essentials, forming the backbone of a project. Should-haves are crucial but not critical, offering flexibility in scheduling. Could-haves encompass desirable but optional features. While Won't-haves, as the name implies, denote consciously deferred items. By employing the MoSCoW method, teams gain clarity, align on priorities, and efficiently allocate resources, enhancing the likelihood of delivering a product that meets both user expectations and business needs. @@ -5,3 +9,7 @@ The MoSCoW method, an acronym derived from Must-haves, Should-haves, Could-haves ### The Kano Method The Kano model, developed by Professor Noriaki Kano, is a nuanced technique for product development prioritization. It categorizes features into three main types: Basic Needs, Performance Needs, and Delighters. Basic Needs are fundamental requirements that, when met, prevent dissatisfaction but don't necessarily contribute to satisfaction when exceeded. Performance Needs directly correlate satisfaction with their level of fulfillment—higher performance leads to greater satisfaction. Delighters are unexpected features that, when included, can significantly elevate user satisfaction. This method not only aids in prioritizing features based on their potential to enhance user experience but also guides teams in understanding the emotional and functional aspects that shape user preferences. By integrating the Kano model into your processes, product managers empower teams to make informed decisions that resonate with user expectations and contribute to long-term customer satisfaction. + +### Conclusion + +Regardless of your chosen prioritization technique, be it MoSCoW or the Kano model, both prove undeniably valuable in guiding teams toward successful project outcomes. Whether prioritizing with categorical precision or focusing on user satisfaction, these approaches empower informed decision-making, ensuring resources are allocated judiciously and products align with user expectations. Implement these techniques to help provide structure and clarity to your projects. From 9a73c0ed933755f7aa032adb949edbb962abff70 Mon Sep 17 00:00:00 2001 From: Umair-H <93732264+Umair-H@users.noreply.github.com> Date: Thu, 16 Nov 2023 17:30:44 -0500 Subject: [PATCH 13/70] Update Prioritization_Techniques.md --- Topics/Product_Management/Prioritization_Techniques.md | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/Topics/Product_Management/Prioritization_Techniques.md b/Topics/Product_Management/Prioritization_Techniques.md index 1e16425a4..84afbb4ad 100644 --- a/Topics/Product_Management/Prioritization_Techniques.md +++ b/Topics/Product_Management/Prioritization_Techniques.md @@ -1,3 +1,11 @@ +# Prioritization Techniques + +## Table of contents +### [Introduction](#introduction-1) +### [MoSCoW Method](#the-moscow-method-1) +### [Kano Method](#the-kano-method-1) +### [Conclusion](#conclusion-1) + ### Introduction Effective prioritization lies at the core of successful product management, demanding a keen understanding of which tasks deserve priority. The art of prioritization can be the difference between crafting a polished minimum viable product and merely assembling an arbitrary assortment of features. In the realm of software development, two notable techniques stand out for their efficacy: the MoSCoW method and the Kano model. These methodologies offer invaluable frameworks for product managers, guiding teams through the intricate process of determining priorities and ensuring that essential foundations are laid before delving into additional features. From 99ea8a3977501742a8994aa1b363082dce860b0a Mon Sep 17 00:00:00 2001 From: Umair-H <93732264+Umair-H@users.noreply.github.com> Date: Thu, 16 Nov 2023 17:37:58 -0500 Subject: [PATCH 14/70] Update Prioritization_Techniques.md --- .../Prioritization_Techniques.md | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) diff --git a/Topics/Product_Management/Prioritization_Techniques.md b/Topics/Product_Management/Prioritization_Techniques.md index 84afbb4ad..4e6b6efd1 100644 --- a/Topics/Product_Management/Prioritization_Techniques.md +++ b/Topics/Product_Management/Prioritization_Techniques.md @@ -1,23 +1,22 @@ -# Prioritization Techniques +# Table of Contents -## Table of contents -### [Introduction](#introduction-1) -### [MoSCoW Method](#the-moscow-method-1) -### [Kano Method](#the-kano-method-1) -### [Conclusion](#conclusion-1) +### [Introduction](#introduction) +### [The MoSCoW Method](#the-moscow-method) +### [The Kano Method](#the-kano-method) +### [Conclusion](#conclusion) -### Introduction +## Introduction Effective prioritization lies at the core of successful product management, demanding a keen understanding of which tasks deserve priority. The art of prioritization can be the difference between crafting a polished minimum viable product and merely assembling an arbitrary assortment of features. In the realm of software development, two notable techniques stand out for their efficacy: the MoSCoW method and the Kano model. These methodologies offer invaluable frameworks for product managers, guiding teams through the intricate process of determining priorities and ensuring that essential foundations are laid before delving into additional features. -### The MoSCoW Method +## The MoSCoW Method The MoSCoW method, an acronym derived from Must-haves, Should-haves, Could-haves, and Won't-haves, serves as a powerful tool in the arsenal of product managers for prioritizing tasks. This technique categorizes requirements into four distinct priority levels, helping teams streamline decision-making. Must-haves represent non-negotiable essentials, forming the backbone of a project. Should-haves are crucial but not critical, offering flexibility in scheduling. Could-haves encompass desirable but optional features. While Won't-haves, as the name implies, denote consciously deferred items. By employing the MoSCoW method, teams gain clarity, align on priorities, and efficiently allocate resources, enhancing the likelihood of delivering a product that meets both user expectations and business needs. -### The Kano Method +## The Kano Method The Kano model, developed by Professor Noriaki Kano, is a nuanced technique for product development prioritization. It categorizes features into three main types: Basic Needs, Performance Needs, and Delighters. Basic Needs are fundamental requirements that, when met, prevent dissatisfaction but don't necessarily contribute to satisfaction when exceeded. Performance Needs directly correlate satisfaction with their level of fulfillment—higher performance leads to greater satisfaction. Delighters are unexpected features that, when included, can significantly elevate user satisfaction. This method not only aids in prioritizing features based on their potential to enhance user experience but also guides teams in understanding the emotional and functional aspects that shape user preferences. By integrating the Kano model into your processes, product managers empower teams to make informed decisions that resonate with user expectations and contribute to long-term customer satisfaction. -### Conclusion +## Conclusion Regardless of your chosen prioritization technique, be it MoSCoW or the Kano model, both prove undeniably valuable in guiding teams toward successful project outcomes. Whether prioritizing with categorical precision or focusing on user satisfaction, these approaches empower informed decision-making, ensuring resources are allocated judiciously and products align with user expectations. Implement these techniques to help provide structure and clarity to your projects. From 5a9e59aa34a142c1b0d6bb743ac28e12c13b14d9 Mon Sep 17 00:00:00 2001 From: Umair-H <93732264+Umair-H@users.noreply.github.com> Date: Fri, 17 Nov 2023 10:28:26 -0500 Subject: [PATCH 15/70] Added examples to Prioritization_Techniques.md --- Topics/Product_Management/Prioritization_Techniques.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Topics/Product_Management/Prioritization_Techniques.md b/Topics/Product_Management/Prioritization_Techniques.md index 4e6b6efd1..fc5b80294 100644 --- a/Topics/Product_Management/Prioritization_Techniques.md +++ b/Topics/Product_Management/Prioritization_Techniques.md @@ -11,11 +11,11 @@ Effective prioritization lies at the core of successful product management, dema ## The MoSCoW Method -The MoSCoW method, an acronym derived from Must-haves, Should-haves, Could-haves, and Won't-haves, serves as a powerful tool in the arsenal of product managers for prioritizing tasks. This technique categorizes requirements into four distinct priority levels, helping teams streamline decision-making. Must-haves represent non-negotiable essentials, forming the backbone of a project. Should-haves are crucial but not critical, offering flexibility in scheduling. Could-haves encompass desirable but optional features. While Won't-haves, as the name implies, denote consciously deferred items. By employing the MoSCoW method, teams gain clarity, align on priorities, and efficiently allocate resources, enhancing the likelihood of delivering a product that meets both user expectations and business needs. +Firstly, the MoSCoW method, an acronym derived from Must-haves, Should-haves, Could-haves, and Won't-haves, serves as a powerful tool in the arsenal of product managers for prioritizing tasks. This technique categorizes requirements into four distinct priority levels, helping teams streamline decision-making. Must-haves represent non-negotiable essentials, forming the backbone of a project. These would be features related to the MVP. Should-haves are crucial but not critical, offering flexibility in scheduling. Normally, tasks that the client would like, but are not included in the MVP. Could-haves encompass desirable but optional features. These could be features that the client might want, but could do without them. While Won't-haves, as the name implies, denote consciously deferred items. These either will not work for whatever reason, or do not meet the time limit. ## The Kano Method -The Kano model, developed by Professor Noriaki Kano, is a nuanced technique for product development prioritization. It categorizes features into three main types: Basic Needs, Performance Needs, and Delighters. Basic Needs are fundamental requirements that, when met, prevent dissatisfaction but don't necessarily contribute to satisfaction when exceeded. Performance Needs directly correlate satisfaction with their level of fulfillment—higher performance leads to greater satisfaction. Delighters are unexpected features that, when included, can significantly elevate user satisfaction. This method not only aids in prioritizing features based on their potential to enhance user experience but also guides teams in understanding the emotional and functional aspects that shape user preferences. By integrating the Kano model into your processes, product managers empower teams to make informed decisions that resonate with user expectations and contribute to long-term customer satisfaction. +The Kano model, developed by Professor Noriaki Kano, is a nuanced technique for product development prioritization. It categorizes features into three main types: Basic Needs, Performance Needs, and Delighters. Basic Needs are fundamental requirements that, when met, prevent dissatisfaction but don't necessarily contribute to satisfaction when exceeded. This is the perfect example of what the MVP represents, the client would expect this completed, but won’t be overly happy as its the minimum expectation. Performance Needs directly correlate satisfaction with their level of fulfillment—higher performance leads to greater satisfaction. Delighters are unexpected features that, when included, can significantly elevate user satisfaction. These include going above and beyond client expectations. Such as, implementing features that were not mentioned, but could greatly improve the product. By integrating the Kano model into your processes, product managers empower teams to make informed decisions that resonate with user expectations and contribute to long-term customer satisfaction. ## Conclusion From 0a3be28e3443c2ff9035479c1ea1fbb591484c82 Mon Sep 17 00:00:00 2001 From: Eric <37644716+ericjest@users.noreply.github.com> Date: Fri, 17 Nov 2023 11:48:45 -0500 Subject: [PATCH 16/70] Write Twitter System Design article --- Topics/System_Design.md | 3 + Topics/System_Design/Twitter_System_Design.md | 63 ++++++++++++++++++ Topics/System_Design/twitter.png | Bin 0 -> 50108 bytes index.md | 2 +- 4 files changed, 67 insertions(+), 1 deletion(-) create mode 100644 Topics/System_Design.md create mode 100644 Topics/System_Design/Twitter_System_Design.md create mode 100644 Topics/System_Design/twitter.png diff --git a/Topics/System_Design.md b/Topics/System_Design.md new file mode 100644 index 000000000..d53def5ae --- /dev/null +++ b/Topics/System_Design.md @@ -0,0 +1,3 @@ +## System Design + +### [Twitter Case Study: How to Design the Home Timeline for Massive Scale](./System_Design/Twitter_System_Design.md) \ No newline at end of file diff --git a/Topics/System_Design/Twitter_System_Design.md b/Topics/System_Design/Twitter_System_Design.md new file mode 100644 index 000000000..429275d00 --- /dev/null +++ b/Topics/System_Design/Twitter_System_Design.md @@ -0,0 +1,63 @@ +# Twitter Case Study: How to Design the Home Timeline for Massive Scale + +## Introduction +Twitter's home timeline is in theory a very simple feature. Users are in a many-to-many relationship with other users. Users can post Tweets. Each follower of the user should see every Tweet posted by the people they follow in their home feed, sorted in chronological order. + +The challenge for Twitter is building a highly-available and responsive home timeline given their massive scale. As of November 2012, Twitter had: +- 150M world wide active users +- Over 300K Queries-per-Second (QPS) for timelines + +In conjunction with this scale, Raffi Krikorian notes in his [QCon Talk](https://www.infoq.com/presentations/Twitter-Timeline-Scalability/) that when a user tweets, their followers should be updated with the new tweet in 5 seconds or under. This article will explain why this is a non-trivial task and give a high-level overview of how Twitter designed their systems to accomodate their scale (as of 2012). + +## Approach 1: Naive SQL Query +Below is a simplified SQL schema of Twitter's data model. + +**tweets** +| id | author_id | content | +|----------|:-------------:|------:| +| 38927 | 1 | "Did you ever hear the tragedy of Darth Plagueis The Wise? I thought not." | +| 38928 | 2 | "I hate sand." | +| 38929 | 3 | "You were my brother Anakin!" | + +**users** +| id | username | bio | +|----------|:-------------:|------:| +| 1 | darth-palpatine | Unlimited Power! | +| 2 | anakin-skywalker | The Jedi are Evil | +| 3 | obi-wan | Hello there | + +**follows** +| follower_id | follows_id | +|----------|:-------------:| +| 2 | 1 | +| 2 | 3 | +| 1 | 2 | + +Twitter's initial naive approach was to join the Tweet, User, and Follows tables in SQL upon a GET request from a client like so: +``` +SELECT * FROM tweets +JOIN users ON tweets.author_id = users.id +JOIN follows ON follows_id = users.id +WHERE follower_id = current_user.id; +``` + +You can quickly see how this approach became quite slow at over 300K QPS. + +## Approach 2: Caching +As a result, Twitter implemented a fan-out caching system. They stored a [Redis list](https://redis.io/docs/data-types/lists/) for each user containing the Tweets to display on each user's home timeline. Let's illustrate this with an example. Say that Darth Palpatine is followed by Anakin Skywalker, Obi-Wan, and Padme Amidala. When Darth Palpatine posts a Tweet, Twitter's fan-out service pushes the new Tweet to the Redis cache for each user that follows Darth Palpatine (Anakin, Obi-Wan, and Padme). This way, when Anakin (for example) loads his timeline page, his Tweets are cached in Redis and can be retrieved in constant runtime (in this simplified example). + +The below system diagram presents a simplified version of this architecture. Note that several things are omitted for simplicity; for example the load balancer that receives the POST request from the client. Also note that the Redis Cluster is presented as one node in the diagram. In reality, a Redis Cluster (as the word "cluster" suggests) consists of lots of distributed Redis databases. In addition, Twitter (as of 2012) stores three copies of each Tweet across different Redis nodes to ensure system resilience and availability (as in a huge system like Twitter, nodes can frequently crash and become unavailable). + +![Twitter's Caching Approach](twitter.png) +*A system diagram of Twitter's caching approach for home timelines.* + +## A Third Twist: the Hybrid Approach +The caching approach worked for accounts with a reasonable number of followers. Assuming an average follower count of 100 and 4.6k Tweets per second (based on November 2012 data), this translated to 460k writes per second to the Redis cluster. + +However, for celebrity accounts with huge numbers of followers, this was not performant. A Tweet from Lebron James, who has 50 million followers as of 2023, would result in over 50 million writes at once. In this scenario, the caching approach was not feasible given Twitter's goal of delivering Tweets within 5 seconds. As a result, Twitter implemented a hybrid approach, where most new Tweets were cached (using approach 2) while Tweets from accounts with large followings were queried at runtime (like approach 1) and merged chronologically with the Tweet cache. + +The exact implementation of this hybrid approach is beyond the scope of this article. However, this case study of Twitter illustrates some of the complexities systems encounter at massive scale. It also demonstrates how we should consider our goals (i.e. high availability) and use case (i.e. accounts with millions of followers) when designing systems. + +## Credits +This article is based on [Raffi Krikorian's November 2012 talk at QCon](https://www.infoq.com/presentations/Twitter-Timeline-Scalability/) and Martin Kleppman's book, [Designing Data-Intensive Applications](https://www.oreilly.com/library/view/designing-data-intensive-applications/9781491903063/). + diff --git a/Topics/System_Design/twitter.png b/Topics/System_Design/twitter.png new file mode 100644 index 0000000000000000000000000000000000000000..c016477a94179c87fb15cc2043aa07d9589ad08f GIT binary patch literal 50108 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%0D=TceZ~wA71{2qMXCbGp0}sbNYup2 z>G{O)OJarv7o$|o7-+4h}4y94hvhccyGJ z-MGV|!NpQt57j0S+JN;m=#n775JQEFwhm z{@JV+{uNR&(jHYF2d^Wp1?-Pkhy{L~sT{!tDpH#YvLa0Dwb^%i7!q%dy*KGU09)q4 zbz1Qu9yszqfN^iYBlDlnl@?{y(uRTq4&RPZOlhiYiC~he2qE}|UyxIpD;~hI-|(ov zJ$@1D0~&pOAlPV#!X}fx4r?SZEdKJt0_D5KIK#N!zkdic_mXV>1Yf0^bmc}J zeuhL_?_9p6v*Yib6dUl;CK8x4Lb|b8x)yivXso{1ma5wT?aA18Za{!&^+0sBm29gr zo%U`K(DN=`Yz}Bly!kA1W73Y|TxvIAv*bA2?Qtu?REm%rYsE$Z`_&5}QE?rlKtIl0 z!}?_1#?kVd%wk>2bK?4-MP93#!FLiDr0zN4r^4)cc0%+fv;Ru{??x#HROdIt+x=7_ z0ZFOuilT&Qs)GP^yo7!7xQax8HY?mwL5eezE#b5cp*+L9wSU4k;6B39kbHuQrLPN; z6T_3mAaUc*Aqjj)q$1jz7Zb_&1bz74f@LKx)W_rqvJ(ztcD@5Pych9IFj+N;QrcPm zAbN__O$ukEE8CylE@Wiqbbb7rTSt%T#0UO-@19t)6+Hw2oNr0ORB8prUeYdXM!Q6Q zM`KRiCs%!%d~5Ye1{5v^1j!7p`%p7Q_97v9(FIUC4Tza~uPGrP)Fk_K16#MPd1ew{ z*gl5X!45}+gn-z)5=e#|MpLt5b+|OOU4C<;0Uz2Ww3=#J^jU-yQLvno<1dKFziI4W zNEjAX6Y`&uoz=FfCuQE^>m0QwsGsz^y7?;WN4CeL_m#q2nwRwzFB;ER(q3Be{Q+mw z(8^9w*MnsTwVAuT^fTiYidto`o<8(lboM>|9hXpnl0es2j5cx^l{O=`LJ#TI-K(T> z$z}BW8Dsh92FB?}k>E-uKJE{Z!&xIMJ=H}uHo#`k61Yxv!rruZ+X*cG)aJMe$;Tam z?pNIGG-%z~k}CP4v&VvQr=I>W{^YxB5<_z}m@P|D^4#d0?0z1v_&BDBFK%{!R{rF# z%I195U)M|JY-M>A*KbQlqZ=Ge#@rs1@p3^Y%`U?ANsg<9`DQlC~4eD=cg!% zR;0rQ0!p>23QpiHg*@{YR&N$}U)Wq9e-kue!9OF=!Pm76T>F{)37o;>zKzLHuGL? ztp z!aZS$cS;i_ij@;|Q4U`+e&S8m(tNvHnJZ;O{D^N4NT%8|_o(rxjK3YZH^_=Mn2Bbj zcue}(E-%~;9I{nu$dV3l6I0GYq^Wd7as`Hnvk-+8&tTs?p8!GONHkmF%9_D~b*AhGs8S8Ml`TBPM0BnBxe`?N zLdJSQ8yLUuuc=SaUC4;wzQ6tXnvl+{oTs}nR4Gp+%L)5T1KJqQIufqml}q}2=T^?v zjot|*2C-i07WR+{At0$Q(0D{-eTZe!`@o?_kSc^v&Ra*#O#Z2uKrf7`ON7IeqT>bs(Pw<>d(0#^!@UvH&K(+wRjuW9O+c zY|@16CaGuZ5%%GeukxRZd?R`%{Qf#;ySt0|`qlGJmq=A|WhQY0iXX9D1yO@9VoCDT z=Oz-qKEBsn!AZN#Rz%bss*d$-PUxc`;W1+L+2{VhFRB}1BNeXCo@vvS?K#_W;n5=! z%w?<%!%$teOtc{yz&gABxDV1J0$EO(s;SEHgL15h+sg5VwHIp^XjwlVkS=5D2s0s! z!9pOjO=S$`o{?{k($amzT>K{cJErSd0WQ?t=b(&tX@_J-K*e^N<~f9QI-F0V*CX__{?{z z*k+>qPc%>1N_VvU<9XoSX;CAx)bcFC5o`^6Z$7w{I6qS-=OaeBQe`)V^OcN1%@{1Q zmK>#1GM9=kLgZWmviBQ@Lt3xwCHfAA(6citstsv>h}!q)kG&u7S8hVVI|Mv*IX+Hk zR$xj3Y3%b^GmtR#S^{pRBV^6rqWtcMh0Mek*CG^B0W4wyL47fVJ`fKT3CtvCXzbbp zm{Ei^MhFOpuu{*G8vOL~3%lb3S%R`uY~pq&h@S*h5S2WOvt-=%mULp{arf?;QYO4X zf+Ix3z@m}q<%584KDaltL@Z6hNmP39e*)8OW`4IJIFI*VTmVF#7-(Xwdp0Cq5S}))K1Yqvy2l0s*-4L*U0vM`^KGWAk~vqGdgXpUJx z&EBo@^_P@ZrbvC%82&!sYl9|f478Yp`;YP{#MKGKc2W3}K7_L$5Edog3qGWKS;Ue(gaOM@ zVp0+XLN<0gL*EXXr4#qUgwVt9EfW9JZXahj7W$OdZ(V0DpuIa4pYDhb{-xa=m2bPw zy-qYFp(v^=Sia>yijdZw2P+{OVkHLc$F(!IqR=<($dYMt@itq>YZrFYkCBtIbS0z9t}RcjSP z%tt;>Z7u3xtH?kS(dDxH#ut+Wvpia#b%;ryBv=-$A96~16FkucmJSI6)wU-WIm{KO zwS-CoD5}YnX zm~ZmliU!M;;xfXRz6nY{Iv$6u4Ug0|Z;S4jtM}mlrqM6Znqomgc)#s3W!~btY4vQF;9c z;nsatV<9kvlT%&QpML{NG${q1CT-N%k!+;I%S}#z*w5Qwl5<75f1da}`F`0;8~ z&YbmWEjZ@!5YW~6O)`R5jJ}wJ0h;#xRghS`35^l7Df<$j z{xeo})qNyy$f-Y`cwi;kfGPH8|B{^wBA3J=tR3XKi)8f>h)6*6?d}1{C4IqWNX(-1K`y8ArmD)=c-f2f)zy1Z zD+d%WKW^xUTp9Svdwdi>&ct3dyw#Kwx0uT47Tm;}hDde)R6Zko_>GCqK{B+IB6Rtn zeUn@kKkv==Gukd5Y8dENBv0{By+Wl(Rdp}yb*H)u518?%;Qhkq&SYq(I-j5-r#v4X z-=tIi`%vH7hUZClT45UzOuB(3d|P7hrmjo*tnWVEmDR;?Z(fee>w>|Y1(yC7SnyCz zm9wkUQIYEUs9?OM?(`@v3Dh?I{T@%z-Z_@F_iy)wUtGdH&h+eHsR(&fTDxeln&sH~ z-5?B0q_FjSG5q|<9g%8}%bvlem2@cfO9VX4r22kXyDsgrLJbDr$H2iX{nx>geT=U? zKL2nchD@l@)C3>PPpYuiGt^_&iv{}a=Ynr|tk@JIV$Di@g8HxgY;7L%yUwb&8apI* zyAq$rQma8agA|Pf1qc{DZO?P@wDVjE@A9?t^x=#ypTI^*+W-2hdhWn~<~CnpS-r?m+K=tu8xrkqFoOp4 z#Eod|Zk9i5qPpSume1SE>!-%r$j+NwNM#ZK6-Adb7Wv@J2+51wtA$o?EM}Q!2CjUU z0RPwa&sm=GY~pK?9eCdit#y4H>M(Cc zjz|U<-AZCyt@<<1u`p1OezyL%&39@YbuNPhxtqyUCK%}5`02`9Kkl7Z##EjhCwvXg z@NdCRZ#;?8>$}TiH$*}6X2yfb-1l%~csKYL)3ykidth9n?6rxA3E%ipY<%fj5DHWM z)Tpx6c#1{6hgI0`qo{$mAes?H5DoeAz4uw4S*tk1+MP$8{+w#ZS$bpy5^c%M(Tb}c zP=On7!Wd51{6ha1>m?)0$Yuxk%RKL}YYuZQ`g1>SRNJ)YSR}sdBiMjC@UlIM5USV_ z4G$Ar8m8q$qjY3Ic zO4Kxn^KY-okO)VRT@5w~HROjK2zfi))ah)zOV(m~2EIf&LPQo64W=22*%JQQObLUO zjz5)%`Ny2z(rycg*D+47eX>bhyJn6p*0KOK*v&B*d~5YBZ3H*Q1T5mFM2-4I`jTie z&VBG(5Etr;Yp?nxrb3DadP&7u+)Y!z}w zyL#P!?Uv@)MgnYm=P@DFBmO*`oTa)plG>KF$hZNoDB7@K0b}+M4N+OsT#G~sf)Mpl zfl5%zyQ%E8!{gZyMQHMSIRSRaq7uK+EUSNpoYn(Njg-u*1;)+ z-*(!AaIf8!iqyXmrA#_5O&z@7(tFR^A$)RNE#Nsh`Vy|9am*t-f{!e9Vq%j{vvT{U zcF(T{5D@QN*}0L90WYkqfc_0?-n7D6KCXE5v>)Imavl8TmWUk?Ao_jEmb(frmZJnz?oww4e(}A3C z|JA!Q3C3?iRa88*_lS<}me>-&Jxsip@Je(_Y4Txy4(B(L)bF;`lCef2k-MlIxuJ}f zH#ETDbwXJgA2<>JG8|8%9h30DmPEJ};h%A{TtX95_M?RfmGAXS5Aw)j^6HPhjo<7z z?R!@Cklx(NENH+ZUU^b@P_pTS@Iqjq{5Qna@W zYO38;sO#`jQ`eV!uM9}XpmSx_mmZd^vA`{InPHvYo6RKRyjPp`bq<$BS*ag+x!;?~ z#~d?$R6+TpRUWr9n#&l=vynh;L>+I&6+29&k?ZJuaF0@IV$0KbI3UA}ymkxje`hPB zHo51>{a|u~nQ-fxNgI{s_(PW?)TT=rXRocm#@U{Y;;+jk2lFj$gU{;p+d-jTelEH{wC)7M^-^masck8sNyA%uVfH!GzxvB;f zmY&fX=l%%*t(?(60Otq3wC!K@nPWw+&ZWD7kLG7{QH)?{yttJvhvECFHSa5lfnBn? zTPewP$zfvW%4AYZ&}K4=GNO7H>%NghQN}fd)7nR*zj(@Ea1nSg_e-!Y+eBEskr!7O zWrn%(e);!Y6Rj&hZy>p+_dk{t0*B7Xh;2hH_UQQiEUPyH8XVFOlqJ5=9Pg z`1;hvs~I`wfKBHsviuVgpWpv?iWcHMiR%VNEK@C92I_{rR6w4HQT!))q6?k&uf*b; zMgpHFbLERZ%u5}~6@MY(;A7XbBC4e*n>GbQJpLaHfn;To4Cj4DHDlGvL57#t9a}qL7c~77 zrk9C7PT(MMEHaSKw=#Y}a4K`oeDPfh5H7--{z15SB_xJ~OfawiX9kvsLA*%+F-y2R za&$-*-|(6FG=1n>+7j>Tv+q^=8L>ZK{uz6Wi_YlSc=3LrJ&l!UQ~)`j$V->qOGwa1 zc;f8U@{CL8kMVx2FFME-PMANCt%2rWOpV{*NJCYHOI z=p>OZ+j{2fr7gy5`R^~rT_}5TMlNAra_m6`(#i=29n57K@IS1*GqOg)uvs6(Fc3o9 z5Omlpx&is?a@(IT@aw!~Jjn_Mza!PWIxlN#D#azh?s%5;jWGH}O}dK=oe)B+qSk5* zr{&VRU})}EMbKCTvNnB;U!ZEq;Llw}T!ufvzxoI|LWSs5JZ?XFkb#m8IwtHA{nsp6 zi4R@bW&Fg6S#&C|xqnZycCL?9VW{fk%sjlvbxgV4{O9Hh3`+bHON$gw+eDs}5_|O# zc0?KFE0Pw9fOrsvmSNEKMUb0~WaZcV6e10m9b5pn?d5}RQz5XXBB)#)7vkp7gT+l_ zF2iRY2%w8lHk6Ab6h;W(%?6g`VQ?f#Av&#<++cKpq^!X-u=8{0C3DUI7M81ych5a$zZ`f; z0foYJt$!I<@zA&Z2+g}fNyE3Yqu}Xj<0Dws8OXM zUU-B^123gduBqml^Sw0oBVtCMh)w#Dt^Wfk-z zJFCh+wT%r=$3sq7gTiQy!394!yzgPdExSZ zys-V`h4OsmYujR3I(%*)lu;c=Z?-U{J$OCdz7)R(n|h|1%nP!5lP&MnhO-54^v=mm z#yu2vULqEh(nodCiytZUTqiskC!weK7+$tukrVrNAZwP+8j9#H4e~xC%&^4Qv>)j) zFi~&4#f|JT6Q1w=9$9ZG2{ReuNGNvSToI9}$1{NV3sTc5Yuf%1w^UO5F zJA%f-K)uqbl?{2%!zfNZ|NY1NZ1|Wc@uaudeQ}h}1}esz%*k%xm$!3Z{?W_*LAM^h zmU0c74#P{81Z);Jw}T8Q?!v0j3Sux`-xGs*Vqnv)l4A1DG<4&aBX4-P=|p)Jd4nST zzutg}+KjfBzcWFC1iS#KfO1+J+#%Seq03hro}6 z7Q385jCOeZG&Wra5tjdc@ST)%@OPM~V!Swb86sTL4;?%WfoyZZU_>d?`KABW- zQP;vT7^-6I(Wo+JD$=h<4)Z+}kOgMZMB z6w8cQd@@xowh$SecoGYk@YC!T)W(jSH_+f+?@{PruqrU#M4D5zf&we`{pJf$F$KXB8NYN`Pshg!hmuWc&&)kF7AI> zEmzs=?=ka&p}*uDWBmKpI~9TtTb$vtY?2cWuJmqvCSHS$6$USmO%NaSLyUmQXW7=B z6AKJs{O?xtVmC7XfN3|+qb?+Z`F90bBoQNgq_3XV*84()7FAZ4pfiT`kIwU3`LDtK zUcTh-Rw+QpCJN(Tvs3g%{z)EL7S3LFqwlPy$VO#I%tTfM1M39~OxF2Vi=xN-GU0C$ zbYP}mL?^3t0glYxk=d=usN@!s$4z*2>k7k|C|cM8;{B*>!JQ-HUC;=-SJ*|ugDnrc zNAHV03Fq-#@1soZmZ7KDBJ>Z*0n*dk`939S(UDXCeIkUPrAFZs!W(cv&S&hqv4wk{ zO8rbuNaG9#rq?)_g-qd5ht6t)h zuu5U9ggeN^B~GV<1*No70*-dG9q-5bln!Jme!pl8;WFGk>(v0SqcpjNcf6N9J?qP1 z5GuGY#n<5fze+S@I5`O{#QrwO$OEXoztD%0z{um6ux^};To)_HvQ1|4`|sXWDlAWcX#p8d$z*-{oH-g6!Gtd2p_1H-o_rORV&D7r0bfK6qTbvFv;^ULtERmEe_^=(C z0zI};9+#MmN;x7jDuL0o#6M3y-jZGyP*iq5t~&lwy76LT3r^>ol0MnV)KL3(p5hHK zZ*o@8>En4PQDLv=!+i9DMP=Vkv3NG}JUa}aIsO$@mQcUe694_T;mUS|jh=8SPR(A! zJ6>7BMq9hghm-9we16grboa2X9wys=s{TSD`;Wu=ktwu(T05(81Q7+;-(CCoOS)ET{!>mZwG9rS$nL3xb&C%)69rIhcWU?Gs_8UFdaDTS8{+;02NxAPK@^#cLYu_$&& zzE;;4F;3Hs(up70i9e~u{`UtEj;0c8hl|~Emd6&yO@smmskS1d_R{ z1sgN+4a#TyuWyhz-F2*p))D|&Y<5rU=pedJLtr+1^eCx{Wq-GjZeEHj_M1f>Q?}L1 z6HktA&hLP#&l5cl^hd7J+2rd(s|`~H>15_wvhf~}ShxJsN8}N)UH4T4hdQlFwc)o) zc>dkVT>pIrlc>IvOX4Xu4b;!jEh5^4gj&#KVTs`Rt`BIXbWx{26zvNIwAbuS#(18iUm=w@+r3qX-IY5PDxRtc!OX zep}=P4FLeMjnn}UD{x+YNIhH(tX$5$CKZokum;JA0Y0y+hIHHA(46pL{bz1y1 zm$ZRNx(#xW(d)S#l4n~CV1Gue=$G=% zR$y>CxPs7>Wt~5f#H9t*1B%aX3tA&*k~Lm;w;_c-z;n$H;vZ;4T67@dt4qM~J-0Rj zx#Vv}E;dUb3E|*;|J6Q-d}e0qxL%#JvpJj*J2FE|>aX;$AcSJj30(;sOUM1S??~p~ znB!~y8)^_gL>gbU@rCQ@RHsb~n+_Nre1G=G7)td|j zXJ;r*t4R_Ud^pk-mOWn^QMwf~uM0df^OrMAsWkjX`S7K=x=?qrA3w6d-Lw?oCh^t@ zK$>2y$j5`gLYKgXwA2qX!!JEA6$ag5osf3QzTZ51auo=za+_GjejGgs(<53SeoH)p zLOdD^ZaDvuQ$iHCyYkFAKFMe6 zhK5+|pUpXvufR1Lx%E$^f{s0#)yUuD!pELN}7gCKuk-Rce zq5GABW%tBguJ!A8(oA||^l4(_Ffb^BkLN?-0@n5P z-pPmIX(+P*k+1bpkK906sz&kfS>;AN-66uNzoNiR&(k^N-xxL8lTl5S;PZ1 zeU>V`qkOvcSd56v$Hy51%bBIaA}ouUe89;SdLTu&ne`fL>kKH+b+YB8PEl%E7Ccb@ zotb_&tO{gce5d#a7Rv^nq`%;2Qe^&o{g?Iv+;L?!6#D>^o*uE6+cnn+qo+xOl6l6=#9MJX^D+D&@9LGjZa4(y**4 z;ddoH)e@FZN`fP?P#*%G_AI93Ks-p9Bt-R&?o z~MmZMr(Ylf^?u>%xM_gY9Q*bC?Fw{B)> zIDGFrdRL#!xW%x3Q!if*OM= z*c)+u-~H3|C8Wkgd`=l$48Ig`ITa#VPBJ*h!6!;u_SiO^nAKx!NIvEx-ap;ZP9kuT z`{!nFb3^1VUiB;~+`U)`0_TydR&Txkz5tB7zNPR%X#UMvEDgeroX@{fRoav1B=ZA6 zE1Loj>-f5(8)Y3OMeE*t-l8s9t>Sq&WAdPd_<#AOEFF7{rvhh?37Sd%@0(z7$7}9_ zPJxWd?%}DW)TQowJ?%tjqgG*?lin|}RlxIC8EiP?6KH%43U z6GyeWFzP)`F4v8*f|iH&=rx?b$(fVjkM#I`3iWf?L4>kcPD*U^t$w|kc-$A0Aze@Z z^ETn%KvnE`kWw}(4D{|WOES=!JF!?n(Od)GiG`J&2>uZI^Muh z&!X$Xvd%gGA4~l2w}j^J))>Cj%;&kS3#3w1q=l9?oKL9aa8EfeJ=55G(bz6@Dxcu* z(#MF)${a#VwkNnu4r=!)%A(K$tm5sEP>v%7<(Blr5>;M#%J;9~6 zzoQh}vo_5Y3=+sgZ6LH63q?MbB~y|77JXL`Fk(7@dBsK;SX++YPLuU*&i%3kGAMm8 zXvBXU5+Fp!9~R(|GOWkeMri*1K9?|e+zk`6n^xQdZkm)f(wPtuh;)QHwACF|1ui2{ zcefK?rbP|W7!rN`xc>Q0ML4TUArwy!DGSXp-5m2J@xGJk zP!N2>+QuTk^On~F#1~`+LJ0DKi28!NX`A_UoeGgQA^KCz|J%awSQQ0S9+9>J10Y@U zsJ=Qg|K$0D??4_z6b|#ieQvEhShD^N+DE2{iw^N`4~WN} z0(NH$U^1d-^GZQIEr=_>L(;M9u5ADA+Jq&@Fybe>0n_(f_mjdy&>|^9dXE8H))i?@ zAw>;jKFea)E6}O}lt}8d8@Wqo8GuW(X8~2Lj-y_3I;v0`qLu71zj&HdxkPXAsOqR)gzU2fdT@mx@o^2M9)N~Wk;8u- z2$!sVakR1gk}}-Ff6z=^5EZj+j1Cj}TcFgw^KQCO8w_Gm<`xw4g)6@#Cb&cwK=0_EEn{;#bN$CV~4IoU)|+HjQh%?kBp9Pz2=Yr{l)h;wa3iZ zaW3pRI0wJkQ{#w@=T?d*&M*A@_{tK>#r0dudrZwMD(jpU9CnG(2&LF;PHCb2TJ2Y* zIJ3Zg&hZWx$9gC5ZU%tOOmnI5V#9oLkU#wY&lU{{API@&hYGYnaQ%d`X~8ULN*-uq&$(n|0HD=i6#;47G(2Ee0b7YY5bvJSXMz z_HwJ{{c0($XN7n#u{9LsZls7$J`=t7k;oD27hgTu6K zeEviSF*Ck>ewq_Bt$%`N4Oh_FJ+kuTqOJ8b_%~jpVM|QiA>O7FEZH%O zVQUxlnVU5SuqIqO>{$!DoUY)58Q;L?wED;ubY*K^{)X-kv2FTU4iNL{>Q5|@o5bDS z*eD!t6*}MQv9K(=pwJQp*{v%@0&PO)1zkX%+Sl-b13PUq()dwG#Uj4*D0g?bu7`y| ztnl?1&xzwnNAJZcgJ|_!=;>dGJLuu-MudIl&bc0_M+E=Q(AJzd0NQ;%=Z4ueH|z4C zE(NNBjrTEoAW9)NnLRv(_!wd35lt7v^gdaTaGbnzl;ikY-g5K)c;myD<={6=ag^>m z`82kxaIa$jz3a{#`yn64?Y(dLGh&vrT-ZYV0&KFgcbOTg2+f#KfAipp5EnWx?Q@wJ z%2D+{&FcMvxJhm@QMA^CXmr!*guh|3Dm^3$bj$9?DR-c3m^^!ZlZV}$mfnpT(0`Gh zBx4A|KEZYfSK$_7&5Ey@vfvD0q+I?nY0^S{0#%(X)Cc8i4wnkYG~A9yK6RaR*(|Y$ zzh$0V)~OcK7{c!$@Yk=Iy>vW&haayt<%winGDNr#Z)781;})f~2YH_IkK-HU&Xd2E zQ2alZ`2V>jj1XL>>tJCK2N=?lRPp%NCET08Lqp|(uit*F{Qmm+1CIax8v>W6w89RsW;N!kC1jv2&CtDj!NA~dDgYweLQ57-Le3aKq)a^c`ld>b?YatEY zD6NY1i*FWzNM2!=Pop)8z2Wbgj1wV*ax-c~&`kf&$4-Dj8o&i1({i4QAlk22xIrW% zFJ5y9@5sNKa_fcOsY>|xBgjxLU|GFT3tZuxEIBFr&UEmv`*6+2v#u7DG7KPtm>~lF zlnWt~hX@#0gCblE^h)5n)+BUj9Ga?(+86U`E)hWdc0@ezlh-a1OCU{=AwH@{q~?C% z30dm+ySZFAnKlO2bv$8cU#4I9bg?gIEI$~LS%na#aUyX)90FV9EZYrZh z(p9W(KkX;zR;0H#B8Z_BC(sF?*I7h(&JxffXd?Ez|Du+KK1khtDZ`Ymq$GX$*C@6m zh@V-5Q-wqhFhwJzAD((`71S(gWa(B|fLBupS~Gq#%`aAYo+Z-%aW9b!p7K>mLXLMfU3oO1rBPgg zh)O`lwI9*vqyeM^KLqp&ew+@Hz;OS}hOK$D*##&qZDfT~qUaFPsTYBlmeNuaa-ls$ z4+3gjxzsash09ONB;KKhCc3R0f=s#a(!c&UAqqRcOE&oyK>(GA!YU}XQ5M#m;ZR>0 zuJ9S{P0_3J7!w)75AEoDlQjRz3nTurIo8+H`%u7IbFQ4frV>ltGoOz17M088I zp-#WdMVQL3v2|2>LAd)fQr!R#2M4X>>L+5ZkZrE_GrtW8eL-j51VtCchZT1o8}b?iG=)h%-B zYYYJwe`X@RblcZhBz?iL81H4o?r-9Wud&^>(MTuisWm8W`VEK{SzRgr=Xs4Sxln{H zKE@}q;2!Zn>`q(6jVbM_`HXfBAF+y5=4((0^Yjvv8o|X_PrC5SMCh1DsdrEA9t`ZC zEUQyddM`0O>k<+;YO>ckpEFS~U*IrMWw=vCmV_xOWB;Vx)8mRFYYJy>Bf}W|Rd%hf zMLl=@T`BkKK5b4Hp~S?yafIOix{-xu4| zHRACZ?j7kSz#E_Ui&UC>qvE3X{Gr(9FeLqHu=9d#GlbJ$V;2pZA5`wTfp{c9^@%V1 zbUA478?Isel3JP5c&3(bEtOTT<}m-h^)qz(dAOR+`}t=cj`3wJa<@5+mf}g1Epa6u z-kfDl?PoMyg`(*fH-*OU%U)A^ z<$;gQ^wLPrydxVb&R(|ujPR13(pWL?U|iEZ=*TFpE63rE@OrIl9;sb^*(biaTDC?T ptDIN-%elx4KDz1WGaq9glBw8uVh5({+G4 Date: Sat, 18 Nov 2023 13:14:57 -0500 Subject: [PATCH 17/70] update react resources page --- Topics/Tech_Stacks/React.md | 58 +++++++++++++++++++++++++------------ 1 file changed, 40 insertions(+), 18 deletions(-) diff --git a/Topics/Tech_Stacks/React.md b/Topics/Tech_Stacks/React.md index adcf7989f..f2a1a3c08 100644 --- a/Topics/Tech_Stacks/React.md +++ b/Topics/Tech_Stacks/React.md @@ -1,37 +1,59 @@ ## Tech Stacks ### React Overview -React is a Javascript library used to build user interfaces. As such, you're going to have to know HTML, CSS and Javascript in order to learn React. -It's ease of use and popularity comes from how little you actually have to code. Easily applicable for any frontend interface, if you're going to use any library/framework for frontend development, React is the safest option. +React is an open-source JavaScript library for building component-based user interfaces. This component-based architecture allows engineers to quickly prototype and develop complex applications easily by modularizing common functionalities into discrete, reusable UI **s, and React boasts a large user base full of freely available components libraries. Beyond this, React utilizes a virtual DOM, JSX, React Native, and much more -- so much more that it can be [overwhelming](https://auth0.com/blog/how-to-manage-javascript-fatigue/). -### React Resources +To help ease the learning curve, below you'll find a variety of resources to reference while learning and components and libraries to use with React. -These frontend challenges for HTML, CSS and JavaScript will help you review core skills while also making interesting projects as well. \ -https://www.frontendmentor.io/ +### React Learning Resources +[Full-Stack Open](https://fullstackopen.com/) +A full, free course provided by the University of Helsinki that teaches the MERN (MongoDB, Express, React, NodeJS) stack. It also covers TypeScript, GraphQL, React Native, and some CI/CD. An excellent resource for React beginners. -Basic React tutorial provided by the official React website. This tutorial will guide you through a very basic tutorial that you can do straight from your browser. \ -https://reactjs.org/tutorial/tutorial.html +[Coursera Learn React Basics](https://www.coursera.org/learn/react-basics) +A free course provided by Coursera that covers the basics of React, including State, navigation, and taking user input via forms. +[Free Scrimba React Course](https://scrimba.com/learn/learnreact) +A free course provided by Scrimba that teaches React fundamentals through the creation of various applications including an AirBnB clone, a meme generator, and a notes app. -React tutorial by MDN Web Docs. Useful readings for if you have time, but not necessary by any means.\ -https://developer.mozilla.org/en-US/docs/Learn/Tools_and_testing/Client-side_JavaScript_frameworks/React_getting_started +[Official React Tutorial](https://reactjs.org/tutorial/tutorial.html) +Basic React tutorial provided by the official React website. This tutorial will guide you through a very basic tutorial that you can do straight from your browser. +[React JS Crash Course](https://www.youtube.com/watch?v=w7ejDZ8SWv8) +[One Hour React Tutorial](https://www.youtube.com/watch?v=b9eMGE7QtTk) +One hour in-depth tutorials about React. These Youtube crash course provides a great overview of React and various important components that you will be using often. Very useful if you are learning React under a strict time limit for whatever reason. -Javascript frameworks tutorial provided by Microsoft. Useful readings, but not necessary to learn React. \ -https://learn.microsoft.com/en-us/windows/dev-environment/javascript/ +[Front-End Mentor](https://www.frontendmentor.io/) +These frontend challenges for HTML, CSS and JavaScript will help you review core skills while also making interesting projects. +[Mozilla React Tutorial](https://developer.mozilla.org/en-US/docs/Learn/Tools_and_testing/Client-side_JavaScript_frameworks/React_getting_started) +React tutorial by MDN Web Docs. Useful readings for if you have time, but not necessary by any means. -1 hour in depth tutorials about React. These Youtube crash course provides a great in depth look at React and the various important components that you will be using most often. Very useful if you are learning React under a strict time limit for whatever reason. \ -https://www.youtube.com/watch?v=w7ejDZ8SWv8 \ -https://www.youtube.com/watch?v=b9eMGE7QtTk +[Microsoft JavaScript Tutorial](https://learn.microsoft.com/en-us/windows/dev-environment/javascript/) +Javascript frameworks tutorial provided by Microsoft. Useful readings, but not necessary to learn React. +### Useful React Tools and Libraries -Online development environment to try React out in (Among other frontend tools). Great for testing the waters with React to see if it will be something you want to learn or not. \ -https://codepen.io/ +[Create React App](https://create-react-app.dev/) +Allows you to set up your React applications using a single command without having to configure many build tools. Provides a lot of useful functionality like instant reloads and optimizations for deployment. +[usehooks-ts](https://usehooks-ts.com/) +A React library of useful hooks that go well beyond those built into React. Don't reinvent the wheel! usehooks offers over forty ready-to-use hooks such as [useEffectOnce](https://usehooks-ts.com/react-hook/use-effect-once) and [useInterval](https://usehooks-ts.com/react-hook/use-interval). -Host your React websites straight from your Github repo. Website hosting is fairly expensive, so this is here as a free alternative for website deployment. \ -https://pages.github.com/ +[Redux](https://redux.js.org/) +The official React solution for state management. Redux provides functionality for reducers, advanced debugging tools, and more that will simplify the state management for your app. +[Material UI](https://mui.com/material-ui/) +A fully-featured UI library that offers a huge range of common components that are easily styled and based on Google's Material Design. + +[Bootstrap](https://getbootstrap.com/) +Another responsive UI library that allows you to focus on development by handling the design logistics for you. + +### Miscellaneous + +[GitHub Pages](https://pages.github.com/) +Host your React websites straight from your Github repo. Website hosting is fairly expensive, so this is here as a free alternative for website deployment for simple applications. + +[Codepen](https://codepen.io/) +Online development environment to try React out in (among other frontend tools). Great for testing the waters with React and other libraries or languages. From 0af34d5ed0011abdcb9b459ad2bfc642ced0e6b0 Mon Sep 17 00:00:00 2001 From: alessandromarmii <126909660+alessandromarmii@users.noreply.github.com> Date: Sat, 18 Nov 2023 18:32:52 -0500 Subject: [PATCH 18/70] Update to Product_Management.md Added 3 case studies: 2 about remote working and one about the importance of a client-based appraoch. --- Topics/Product_Management.md | 42 ++++++++++++++++++++++++++++++++++++ 1 file changed, 42 insertions(+) diff --git a/Topics/Product_Management.md b/Topics/Product_Management.md index 8e8c6f4d7..ecabb02bd 100644 --- a/Topics/Product_Management.md +++ b/Topics/Product_Management.md @@ -12,3 +12,45 @@ Some key features of a successful product manager: The following article outlines the product manager role and responsibilities, the main points that it entails and some tools and methologies to promote successful product management practices: [Product Management: Main Stages and Product Manager Role](https://www.altexsoft.com/blog/business/product-management-main-stages-and-product-manager-role/#:~:text=Product%20management%20is%20a%20process,development%2C%20marketing%2C%20and%20sales.) This article goes into a little bit further detail from a beginner's perspective on steps to take to become a successful product manager: [Product Manager: The role and best practices for beginners](https://www.atlassian.com/agile/product-management/product-manager) + +### Case Studies: + +One of the new challenges for project managers is the new possibility of having to deal with projects on a remote setup. The inability to have face-to-face interactions with teammates often results in lack of communication between team members. This obstacle first emerged for product managers during the COVID-19 pandemic and I will now present two case studies on this issue, illustrating how product managers managed to excel despite these new challenging conditions. + +#### Case Study 1 - Working Remotely: + +Referencing this [article](https://curiouscore.com/resource/4-lessons-for-product-management-in-a-post-pandemic-world/) , Irene is a product manager in Singapore working on cybersecurity products at a B2B telecommunications company. During COVID-19, she had to adjust her style of product management to match the new working conditions. To succeed, she had some main strategies: +* To keep everyone in the loop about the project’s progress, Irene’s team held weekly 30-min calls so team members could align on the tasks they needed to complete, as well as identify any potential blockers. +* Irene’s team was able to react swiftly and effectively to the changes brought on by COVID-19 by first reviewing an existing product roadmap they had, which allowed everyone on the team to have a common document for reference as they made their decisions and reviewed timelines. + +Irene sees the pandemic as transformative, allowing unprecedented work flexibilit. She finds that the newly added option of working remotely adds value to her work and increases the potential of teams. She believes that by incorporating some of these strategies, many product managers will be able mirror her success. + + +#### Case Study 2 - Working Remotely: + +We now report the experience of several product managers working at TopTal remotely, referencing this [article](https://www.toptal.com/product-managers/remote/product-managers-shift-to-remote). Sam Nissinen and Darshan Dave, two product managers at TopTal, tell us how this transition presented challenges due to the difficulty of not being physically present with teams. This required product managers to enhance their communication skills but ultimately led to success. + +Sam and Dave, succeeded at overcoming this new challenge by: +* Established clear expectations and acknowledging diverse work cultures to build trust. +* Leveraged digital tools and adapting communication methodologies to maintain productivity and team unity. + +These product managers discovered, quite unexpectedly, that remote work — originally a necessity due to the crisis — offered unexpected advantages such as increased deep work and adaptability. This led to conversations about the sustained incorporation of remote work practices within product management. Such insights from the case study offer reassurance that thriving in a remote environment is entirely feasible for product managers. + +------ + +------ + +One of the defining qualities of a good product manager is the ability to develop and envision and client-centered product. We present a case study that underscores the significance of this skill in the realm of product management. + +#### Case Study 1 - Client-Centred Approach: + + +Jeff Bezos, the founder and former CEO of Amazon, is renowned for his unique leadership style that has been integral to creating the world's largest ecommerce and cloud computing platform. This case study explores the core tenets of Bezos’ approach, which have been pivotal in driving Amazon's consistent results over more than two decades​​. + +Bezos laid the foundation for Amazon's business and management methodology in his celebrated 1997 letter to shareholders, influencing Amazon's operations and culture to this day​​. In this letter he outlines Amazon's values, among which we can see: +* Customer Obsession: Prioritizing customer needs over competitors +* Long-Term Thinking: Bezos advocates for decision-making with a long-term perspective, focusing on market leadership and sustainable shareholder value​​. + + +These principles illustrate Amazon's customer-centric culture and highlight the vital role of forward-thinking in product management. By consistently focusing on customer satisfaction and long-term value, Amazon demonstrates the effectiveness of a client-centered approach in product development and corporate strategy. You can read more about this in this [article](https://www.hustlebadger.com/what-do-product-teams-do/jeff-bezos-leadership-principles/#its-all-about-the-long-term). + From d7eec4c779618f8471097f7c7f54aeeaa6cab173 Mon Sep 17 00:00:00 2001 From: alessandromarmii <126909660+alessandromarmii@users.noreply.github.com> Date: Sat, 18 Nov 2023 18:35:46 -0500 Subject: [PATCH 19/70] Update Product_Management.md small grammar correction --- Topics/Product_Management.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Topics/Product_Management.md b/Topics/Product_Management.md index ecabb02bd..6e8a04f90 100644 --- a/Topics/Product_Management.md +++ b/Topics/Product_Management.md @@ -40,7 +40,7 @@ These product managers discovered, quite unexpectedly, that remote work — orig ------ -One of the defining qualities of a good product manager is the ability to develop and envision and client-centered product. We present a case study that underscores the significance of this skill in the realm of product management. +One of the defining qualities of a good product manager is the ability to develop and envision a client-centered product. We present a case study that underscores the significance of this skill in the realm of product management. #### Case Study 1 - Client-Centred Approach: From 94ae855029327b0e31ad52c2e8814c7307d0f0a6 Mon Sep 17 00:00:00 2001 From: Umair-H <93732264+Umair-H@users.noreply.github.com> Date: Sat, 18 Nov 2023 18:40:05 -0500 Subject: [PATCH 20/70] Update Prioritization_Techniques.md implemented feedback --- Topics/Product_Management/Prioritization_Techniques.md | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/Topics/Product_Management/Prioritization_Techniques.md b/Topics/Product_Management/Prioritization_Techniques.md index fc5b80294..b7846a206 100644 --- a/Topics/Product_Management/Prioritization_Techniques.md +++ b/Topics/Product_Management/Prioritization_Techniques.md @@ -3,6 +3,7 @@ ### [Introduction](#introduction) ### [The MoSCoW Method](#the-moscow-method) ### [The Kano Method](#the-kano-method) +### [Which is Right For Me?](#which-is-right-for-me?) ### [Conclusion](#conclusion) ## Introduction @@ -11,11 +12,14 @@ Effective prioritization lies at the core of successful product management, dema ## The MoSCoW Method -Firstly, the MoSCoW method, an acronym derived from Must-haves, Should-haves, Could-haves, and Won't-haves, serves as a powerful tool in the arsenal of product managers for prioritizing tasks. This technique categorizes requirements into four distinct priority levels, helping teams streamline decision-making. Must-haves represent non-negotiable essentials, forming the backbone of a project. These would be features related to the MVP. Should-haves are crucial but not critical, offering flexibility in scheduling. Normally, tasks that the client would like, but are not included in the MVP. Could-haves encompass desirable but optional features. These could be features that the client might want, but could do without them. While Won't-haves, as the name implies, denote consciously deferred items. These either will not work for whatever reason, or do not meet the time limit. +Firstly, the MoSCoW method, an acronym derived from Must-haves, Should-haves, Could-haves, and Won't-haves, serves as a powerful tool in the arsenal of product managers for prioritizing tasks. This technique categorizes requirements into four distinct priority levels, helping teams streamline decision-making. Must-haves represent non-negotiable essentials, forming the backbone of a project. These would be features related to the MVP. Should-haves are crucial but not critical, offering flexibility in scheduling. Normally, tasks that the client would like, but are not included in the MVP. Could-haves encompass desirable but optional features. These could be features that the client might want, but could do without them. While Won't-haves, as the name implies, denote consciously deferred items. These either will not work for whatever reason, or do not meet the time limit. Implementing this technique is simple and involves collaborative sessions where the team collectively assigns priorities to each requirement, fostering a shared understanding of project objectives. By employing the MoSCoW method, teams gain clarity, align on priorities, and efficiently allocate resources, enhancing the likelihood of delivering a product that meets both user expectations and business needs. For more information check out this [link](https://www.techtarget.com/searchsoftwarequality/definition/MoSCoW-method). ## The Kano Method -The Kano model, developed by Professor Noriaki Kano, is a nuanced technique for product development prioritization. It categorizes features into three main types: Basic Needs, Performance Needs, and Delighters. Basic Needs are fundamental requirements that, when met, prevent dissatisfaction but don't necessarily contribute to satisfaction when exceeded. This is the perfect example of what the MVP represents, the client would expect this completed, but won’t be overly happy as its the minimum expectation. Performance Needs directly correlate satisfaction with their level of fulfillment—higher performance leads to greater satisfaction. Delighters are unexpected features that, when included, can significantly elevate user satisfaction. These include going above and beyond client expectations. Such as, implementing features that were not mentioned, but could greatly improve the product. By integrating the Kano model into your processes, product managers empower teams to make informed decisions that resonate with user expectations and contribute to long-term customer satisfaction. +The Kano model, developed by Professor Noriaki Kano, is a nuanced technique for product development prioritization. It categorizes features into three main types: Basic Needs, Performance Needs, and Delighters. Basic Needs are fundamental requirements that, when met, prevent dissatisfaction but don't necessarily contribute to satisfaction when exceeded. This is the perfect example of what the MVP represents, the client would expect this completed, but won’t be overly happy as its the minimum expectation. Performance Needs directly correlate satisfaction with their level of fulfillment—higher performance leads to greater satisfaction. Delighters are unexpected features that, when included, can significantly elevate user satisfaction. These include going above and beyond client expectations. Such as, implementing features that were not mentioned, but could greatly improve the product. Implementing the Kano model involves surveying users to categorize features and determine their impact on satisfaction. If this is not possible you could alternatively survey the client and try to gauge what he deems important. This method not only aids in prioritizing features based on their potential to enhance user experience but also guides teams in understanding the emotional and functional aspects that shape user preferences. By integrating the Kano model into your processes, product managers empower teams to make informed decisions that resonate with user expectations and contribute to long-term customer satisfaction. For a visual and more info check out this [link](https://www.qualtrics.com/experience-management/research/kano-analysis). + +## Which Is Right For ME? +Choosing between the MoSCoW method and the Kano model depends on project characteristics and priorities. The MoSCoW method is straightforward, ideal for teams requiring clear, essential features prioritization, especially for MVP development with tight deadlines or specific client needs. In contrast, the Kano model excels in projects prioritizing user satisfaction and experience. This strategy is extremely beneficial for teams seeking to determine essential minimum-threshold features for prioritization, identify performance features that should be invested early on, and recognize customer-delight features that offer the most delight for effort. The decision between these methods hinges on project goals, constraints, and the emphasis on either clear-cut prioritization or user-centric, emotionally resonant feature development. ## Conclusion From fdcdbcd22660f31fce5af31007cc9ee961ff75f2 Mon Sep 17 00:00:00 2001 From: Umair-H <93732264+Umair-H@users.noreply.github.com> Date: Sat, 18 Nov 2023 18:40:37 -0500 Subject: [PATCH 21/70] Update Prioritization_Techniques.md --- Topics/Product_Management/Prioritization_Techniques.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Topics/Product_Management/Prioritization_Techniques.md b/Topics/Product_Management/Prioritization_Techniques.md index b7846a206..aa6c91b01 100644 --- a/Topics/Product_Management/Prioritization_Techniques.md +++ b/Topics/Product_Management/Prioritization_Techniques.md @@ -3,7 +3,7 @@ ### [Introduction](#introduction) ### [The MoSCoW Method](#the-moscow-method) ### [The Kano Method](#the-kano-method) -### [Which is Right For Me?](#which-is-right-for-me?) +### [Which is Right For Me?](#which-is-right-for-me) ### [Conclusion](#conclusion) ## Introduction @@ -18,7 +18,7 @@ Firstly, the MoSCoW method, an acronym derived from Must-haves, Should-haves, Co The Kano model, developed by Professor Noriaki Kano, is a nuanced technique for product development prioritization. It categorizes features into three main types: Basic Needs, Performance Needs, and Delighters. Basic Needs are fundamental requirements that, when met, prevent dissatisfaction but don't necessarily contribute to satisfaction when exceeded. This is the perfect example of what the MVP represents, the client would expect this completed, but won’t be overly happy as its the minimum expectation. Performance Needs directly correlate satisfaction with their level of fulfillment—higher performance leads to greater satisfaction. Delighters are unexpected features that, when included, can significantly elevate user satisfaction. These include going above and beyond client expectations. Such as, implementing features that were not mentioned, but could greatly improve the product. Implementing the Kano model involves surveying users to categorize features and determine their impact on satisfaction. If this is not possible you could alternatively survey the client and try to gauge what he deems important. This method not only aids in prioritizing features based on their potential to enhance user experience but also guides teams in understanding the emotional and functional aspects that shape user preferences. By integrating the Kano model into your processes, product managers empower teams to make informed decisions that resonate with user expectations and contribute to long-term customer satisfaction. For a visual and more info check out this [link](https://www.qualtrics.com/experience-management/research/kano-analysis). -## Which Is Right For ME? +## Which Is Right For Me Choosing between the MoSCoW method and the Kano model depends on project characteristics and priorities. The MoSCoW method is straightforward, ideal for teams requiring clear, essential features prioritization, especially for MVP development with tight deadlines or specific client needs. In contrast, the Kano model excels in projects prioritizing user satisfaction and experience. This strategy is extremely beneficial for teams seeking to determine essential minimum-threshold features for prioritization, identify performance features that should be invested early on, and recognize customer-delight features that offer the most delight for effort. The decision between these methods hinges on project goals, constraints, and the emphasis on either clear-cut prioritization or user-centric, emotionally resonant feature development. ## Conclusion From aefdf468cbfe34c450a44be6631e0cf1f2f1d402 Mon Sep 17 00:00:00 2001 From: Umair-H <93732264+Umair-H@users.noreply.github.com> Date: Sat, 18 Nov 2023 18:40:51 -0500 Subject: [PATCH 22/70] Update Prioritization_Techniques.md --- Topics/Product_Management/Prioritization_Techniques.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Topics/Product_Management/Prioritization_Techniques.md b/Topics/Product_Management/Prioritization_Techniques.md index aa6c91b01..fe6dcc907 100644 --- a/Topics/Product_Management/Prioritization_Techniques.md +++ b/Topics/Product_Management/Prioritization_Techniques.md @@ -3,7 +3,7 @@ ### [Introduction](#introduction) ### [The MoSCoW Method](#the-moscow-method) ### [The Kano Method](#the-kano-method) -### [Which is Right For Me?](#which-is-right-for-me) +### [Which is Right For Me](#which-is-right-for-me) ### [Conclusion](#conclusion) ## Introduction From 778fc911f52b25645c700b5f32130cc8ac5d669c Mon Sep 17 00:00:00 2001 From: cassandratin13 <113074772+cassandratin13@users.noreply.github.com> Date: Sat, 18 Nov 2023 18:57:40 -0500 Subject: [PATCH 23/70] Create Mobile-First_Design.md Creating a new entry on the topic of mobile-first design for responsive web apps. --- Topics/User_Experience/Mobile-First_Design.md | 53 +++++++++++++++++++ 1 file changed, 53 insertions(+) create mode 100644 Topics/User_Experience/Mobile-First_Design.md diff --git a/Topics/User_Experience/Mobile-First_Design.md b/Topics/User_Experience/Mobile-First_Design.md new file mode 100644 index 000000000..9bb54d532 --- /dev/null +++ b/Topics/User_Experience/Mobile-First_Design.md @@ -0,0 +1,53 @@ +# Mobile-First Design for Responsive Web Apps + +## What is it? + +Mobile-first design is an approach that prioritizes designing the UI of web apps for mobile devices first before other larger screens. + +The reasoning behind this strategy is to promote _progressive enhancement_ — the UI’s mobile version will contain only the main functionalities required for the web app, and adding extra features that can be displayed on larger screens can come later. In contrast, using the method of desktop-first design and adding responsiveness after is called _graceful degradation _because a lot of the details and complexities incorporated in the desktop version of the UI will have to be simplified and condensed to fit on a much smaller screen. + +## Benefits + + + +* Enhanced UX for mobile users + * As accessing web apps through phones has become the dominant mode of interaction — with more than [50%](https://www.statista.com/statistics/277125/share-of-website-traffic-coming-from-mobile-devices/#:~:text=Mobile%20accounts%20for%20approximately%20half,since%20the%20beginning%20of%202017.) of web traffic coming from mobile devices since 2022 — creating UIs with the mobile-first design approach ensures that the UX for mobile devices is not compromised from graceful degradation +* Prioritized content + * With a smaller screen, the UI for mobile devices will likely have to cut out any unnecessary details or rearrange content, allowing your designs to be cleaner and more concise + * For instance, having a large block of text that spans your entire phone screen might lead you to shorten the text or break it up for an improved UX; the lengthiness of that body of text might have been overlooked initially if using the desktop-first approach +* Improved accessibility + * Mobile-first design emphasizes legible typography and text sizes, ensuring readability and navigability for your web app +* Reduced redesigning + * Adopting this approach can reduce the need for extensive redesign efforts later in the process if some critical features on the desktop version, such as hover effects, cannot be easily translated into the mobile version +* Faster page loading times + * With a reduced amount of code, images, and resources required for the web app, losing speed can also be reduced + +## Drawbacks + +* Learning curve + * Most web app developers are accustomed to the desktop-first approach, thus shifting to this new strategy that requires a different way of thinking and planning requires some effort +* Restricted design creativity and flexibility + * Mobile designs are more limited than desktop versions, which may put more restrictions on the content and features you can include + +## General Steps + +1. Content inventory + * Plan out all the content and elements you need for your web pages +2. Visual hierarchy + * Create a priority list of all the visuals you will include on the page, taking into consideration the size of images, colours, and typography, as these properties can guide the user’s eye to understand the relative significance of the elements +3. Design from smallest to largest screens + * Create designs for the mobile version first, then tablet, then finally desktop + * These designs can be made on Figma, Canva, Google Drawings/Slides, or whatever design tool that will help you plan out the exact format of your page +4. Start coding! + * Use CSS media queries to adjust the size or style of elements depending on the screen size + * Test your UI on Google Chrome using the dev tool (right click on the screen, select Inspect, at the top select your desired dimensions to see how your web app looks on different kinds of devices and screen sizes) + +## Helpful Links for Further Guidance + +* More tips for mobile-first design: [https://www.browserstack.com/guide/how-to-implement-mobile-first-design](https://www.browserstack.com/guide/how-to-implement-mobile-first-design) +* CSS media queries for mobile-first design: [https://developer.mozilla.org/en-US/docs/Learn/CSS/CSS_layout/Media_queries#active_learning_mobile_first_responsive_design](https://developer.mozilla.org/en-US/docs/Learn/CSS/CSS_layout/Media_queries#active_learning_mobile_first_responsive_design) +* Video tutorial for creating a web app using mobile-first design: [https://www.youtube.com/watch?v=NeThtWARdnY](https://www.youtube.com/watch?v=NeThtWARdnY) + +## Key Takeaway + +Given the recent prevalence of accessing web apps through mobile devices, the mobile-first design approach is recommended for enhanced UX, user accessibility, and adaptable design. This method is certainly not a one-size-fits-all solution, especially since the dominant type of device used to access the web app is dependent on the application itself. However, in the case of mobile-centric websites, this mobile-first approach fundamentally translates to a user-first approach, prioritizing the interface and convenience for the user, which is at the core of UX design. From 6edb4fdcf4f618f873f60cff0717a81942fc6224 Mon Sep 17 00:00:00 2001 From: Raazia Hashim <67606070+hashimr1@users.noreply.github.com> Date: Sat, 18 Nov 2023 23:09:17 -0500 Subject: [PATCH 24/70] Update Temporal.md --- Topics/Tech_Stacks/Temporal.md | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/Topics/Tech_Stacks/Temporal.md b/Topics/Tech_Stacks/Temporal.md index d6c28de75..74986302e 100644 --- a/Topics/Tech_Stacks/Temporal.md +++ b/Topics/Tech_Stacks/Temporal.md @@ -10,9 +10,10 @@ Temporal is an open-source, stateful, distributed application orchestration platform that allows you to build scalable and resilient applications. It simplifies the development of complex, long-running workflows and helps you manage the state and execution of various processes within your application. Temporal is designed to handle the challenges of building mission-critical, distributed systems by providing a powerful way to model, manage, and execute your business logic. +Temporal allows for parallel execution of tasks and activities, enabling efficient utilization of resources, built-in fault tolerance, ensuring that your business logic continues to execute reliably even in the face of failures or unexpected issues, and abstracts the complexities of managing distributed systems, allowing you to express your business logic as a series of workflows. - Stateful Workflows: -Temporal enables the development of stateful workflows that can run for an extended period, coordinating various tasks and activities. +Temporal enables the development of stateful workflows that can run for an extended period, coordinating various tasks and activities. In the context of Temporal, "stateful" refers to the ability of the platform to maintain and manage the state of a distributed application over time. Stateful applications, retain and manage the state of the system, allowing them to remember past events and continue from a specific point in the event sequence. - Resilience: It helps you build highly resilient applications by managing retries, timeouts, and error handling, ensuring that your workflows can withstand failures in a distributed environment. @@ -26,6 +27,8 @@ It ensures the durability of your application state by persisting it in a reliab - Scalability: Temporal is built to scale horizontally and handle high loads, making it suitable for applications of all sizes, from small projects to large, enterprise-grade systems. +Additionally, Temporal has an active open-source community, which can be beneficial for ongoing development, support, and the availability of additional tools and integrations, making it a unique choice for workflow engines on the market. + ## How does Temporal work Temporal operates by decoupling the application's business logic from the execution environment. It does this through the following components and principles: @@ -61,7 +64,7 @@ npm install --save @temporalio/sdk npm install --save typescript ``` #### Create a TypeScript Workflow -Create a new TypeScript file, e.g., hello-world.ts, and write your Temporal workflow code in it. +Create a new TypeScript file, e.g., hello-world.ts, and write your Temporal workflow code in it. Make sure to set up the project first! ```typescript import { Connection, Worker } from '@temporalio/sdk'; From fdb733be456fc423d8b7341a6ee7083c07707bea Mon Sep 17 00:00:00 2001 From: Eric <37644716+ericjest@users.noreply.github.com> Date: Sun, 19 Nov 2023 16:44:16 -0500 Subject: [PATCH 25/70] Add info about Redis --- Topics/System_Design/Twitter_System_Design.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Topics/System_Design/Twitter_System_Design.md b/Topics/System_Design/Twitter_System_Design.md index 429275d00..0f898c13e 100644 --- a/Topics/System_Design/Twitter_System_Design.md +++ b/Topics/System_Design/Twitter_System_Design.md @@ -44,7 +44,7 @@ WHERE follower_id = current_user.id; You can quickly see how this approach became quite slow at over 300K QPS. ## Approach 2: Caching -As a result, Twitter implemented a fan-out caching system. They stored a [Redis list](https://redis.io/docs/data-types/lists/) for each user containing the Tweets to display on each user's home timeline. Let's illustrate this with an example. Say that Darth Palpatine is followed by Anakin Skywalker, Obi-Wan, and Padme Amidala. When Darth Palpatine posts a Tweet, Twitter's fan-out service pushes the new Tweet to the Redis cache for each user that follows Darth Palpatine (Anakin, Obi-Wan, and Padme). This way, when Anakin (for example) loads his timeline page, his Tweets are cached in Redis and can be retrieved in constant runtime (in this simplified example). +As a result, Twitter implemented a fan-out caching system. They stored a [Redis list](https://redis.io/docs/data-types/lists/) for each user containing the Tweets to display on each user's home timeline (Redis is an in-memory data store. For more info on Twitter's use of Redis, [see here](http://highscalability.com/blog/2014/9/8/how-twitter-uses-redis-to-scale-105tb-ram-39mm-qps-10000-ins.html)). Let's illustrate this with an example. Say that Darth Palpatine is followed by Anakin Skywalker, Obi-Wan, and Padme Amidala. When Darth Palpatine posts a Tweet, Twitter's fan-out service pushes the new Tweet to the Redis cache for each user that follows Darth Palpatine (Anakin, Obi-Wan, and Padme). This way, when Anakin (for example) loads his timeline page, his Tweets are cached in Redis and can be retrieved in constant runtime (in this simplified example). The below system diagram presents a simplified version of this architecture. Note that several things are omitted for simplicity; for example the load balancer that receives the POST request from the client. Also note that the Redis Cluster is presented as one node in the diagram. In reality, a Redis Cluster (as the word "cluster" suggests) consists of lots of distributed Redis databases. In addition, Twitter (as of 2012) stores three copies of each Tweet across different Redis nodes to ensure system resilience and availability (as in a huge system like Twitter, nodes can frequently crash and become unavailable). From e1f7f641f134ac4fba22d73559f3a5225c92ff28 Mon Sep 17 00:00:00 2001 From: MalHus Date: Mon, 20 Nov 2023 11:35:09 -0500 Subject: [PATCH 26/70] added first draft of scrum-planning-meeting --- .../Scrum Planning Meeting.md | 32 +++++++++++++++++++ 1 file changed, 32 insertions(+) create mode 100644 Topics/Software_Engineering/Scrum Planning Meeting.md diff --git a/Topics/Software_Engineering/Scrum Planning Meeting.md b/Topics/Software_Engineering/Scrum Planning Meeting.md new file mode 100644 index 000000000..6300cb999 --- /dev/null +++ b/Topics/Software_Engineering/Scrum Planning Meeting.md @@ -0,0 +1,32 @@ +# Scrum Planning Meeting + +## Introduction +In the Scrum framework, sprints function as short, consistent cycles during which a set amount of work is completed. Since they are the heartbeat of the framework, ensuring sprints are well planned, or ensuring a successful Sprint Planning Meeting, is a crucial part of the framework. + + +## What does a Sprint Planning Meeting Encompass? +The meeting is held with the entire Agile team (including the ScrumMaster and Product Owner) and aims to conclude with a set of agreed upon **Product Backlog** items to be completed for the current sprint commitment. The **Product Backlog** is an ordered list of tasks essential for improving the product and satisfying the stakeholders, while the **Sprint Backlog** is a list of tasks selected from the Product Backlog to be completed during a specific sprint. + +The ScrumMaster is responsible for leading the Planning Meeting and the Product Owner is responsible for detailing the Product Backlog items and ensuring alignment with the product’s goals. The planning addresses the value the sprint can bring to the stakeholders and the team collaborates to define a *Sprint Goal* before the end of the Sprint Planning meeting. Following, upon discussion with the Product Owner, the developers select items from the Product Backlog to include in the Sprint Backlog and determine this based on their prior and future Sprint performance. Additionally, for each Sprint Backlog item that is selected, the developers on the team decide how to break down and complete tasks for the sprint based on the team’s definition of “Done”. + + +## Integrating Sprint Planning Meetings in CSC301 +*Consider an example of how a Scrum Planning Meeting can be integrated into our course’s workflow.* + +### Before the Planning Meeting: +After a Product Manager and Scrum Master are chosen in Deliverable 1, consider each deliverable (deliverable 2 to 5) equivalent to a sprint, with each sprint having one dedicated Sprint Planning Meeting. As a ScrumMaster and Product Manager, organize an hour long meeting within the next week after the Deliverable handout is released. Prior to the Scrum Planning Meeting, you both should also read through the handout and identify features/Product Backlog items for the upcoming sprint and add them to the Product Backlog list on Jira (or the team’s chosen product management tool). + +### During the Planning Meeting: +Start by reminding the team of the upcoming Deliverable and review the definition of “Done”, which in this case would be meeting both the rubric and your partner's requirements. As a team, take this opportunity to brainstorm more tasks that need to be completed based on what your partner has asked and add them into the Product Backlog list. + +Discuss how much time would be needed for each Product Backlog item listed on Jira and based on this estimate, determine items for the Sprint Backlog. Following, select items from the Product Backlog and add them into the Sprint Backlog, allow team members to assign themselves to sprint tasks (including yourself) and discuss any further action items as a team. + +Once the Sprint Backlog items are finalized, as the ScrumMaster, call for a group consensus on the plan and conclude the meeting. + +## Key Takeaway +The Sprint Planning Meeting lays the foundation for the sprint, helps the team understand their tasks and sets the stage for effective Scrum meetings in the weeks ahead. This meeting ensures everyone is aligned and ready for the work to come, making future collaborations smoother and more productive. + +## Resources +- [What is Sprint Planning](https://www.atlassian.com/agile/project-management/project-management-intro) +- [Sprint Planning Learning Series](https://www.scrum.org/learning-series/sprint-planning) +- [Sprint Planning Meeting: A Simple Cheat Sheet](https://www.wrike.com/blog/set-up-your-waterfall-workflow/) \ No newline at end of file From d437d0d85e61d9cbe2b2b8d9453794cd484e93cc Mon Sep 17 00:00:00 2001 From: Charlie Tao Date: Mon, 20 Nov 2023 13:33:33 -0500 Subject: [PATCH 27/70] Added Bootstrap.md to Tech_stacks.md --- Topics/Tech_Stacks.md | 1 + 1 file changed, 1 insertion(+) diff --git a/Topics/Tech_Stacks.md b/Topics/Tech_Stacks.md index 5c9431135..f59f534f7 100644 --- a/Topics/Tech_Stacks.md +++ b/Topics/Tech_Stacks.md @@ -10,6 +10,7 @@ ### [Angular Resources](./Tech_Stacks/Angular.md) ### [Learning PostgreSQL and psycopg2](./Tech_Stacks/PostgreSQL_psycopg2.md) ### [CSS](./Tech_Stacks/CSS.md) +### [Learning Bootstrap](./Tech_Stacks/Bootstrap.md) ### [Learning TypeScript](./Tech_Stacks/TypeScript.md) ### [Learning JavaScript](./Tech_Stacks/JavaScript.md) ### [Learning React Native](./Tech_Stacks/ReactNative.md) From 7919a321e0d7d025025cc947f18e517fa2bf7cd8 Mon Sep 17 00:00:00 2001 From: cassandratin13 <113074772+cassandratin13@users.noreply.github.com> Date: Mon, 20 Nov 2023 14:38:37 -0500 Subject: [PATCH 28/70] Add detail to drawbacks on Mobile-First_Design.md Elaborate more on how mobile design can be more restrictive than desktop design, as suggested by Malaikah Hussain --- Topics/User_Experience/Mobile-First_Design.md | 1 + 1 file changed, 1 insertion(+) diff --git a/Topics/User_Experience/Mobile-First_Design.md b/Topics/User_Experience/Mobile-First_Design.md index 9bb54d532..785a051fb 100644 --- a/Topics/User_Experience/Mobile-First_Design.md +++ b/Topics/User_Experience/Mobile-First_Design.md @@ -28,6 +28,7 @@ The reasoning behind this strategy is to promote _progressive enhancement_ — t * Most web app developers are accustomed to the desktop-first approach, thus shifting to this new strategy that requires a different way of thinking and planning requires some effort * Restricted design creativity and flexibility * Mobile designs are more limited than desktop versions, which may put more restrictions on the content and features you can include + * These constraints stem from the limited screen size and reliance on touch interactions, as designing the mobile version requires meticulous consideration to arrange the content in a touch-friendly and legible manner; this involves ensuring the buttons are sized appropriately for touch, accommodating all text within the narrow screen, and also minimizing the need for excessive scrolling ## General Steps From 97beddbab61649e180473103ffd4bbeb438fb34e Mon Sep 17 00:00:00 2001 From: Yasutakahi <113137606+Yasutakahi@users.noreply.github.com> Date: Mon, 20 Nov 2023 14:47:52 -0500 Subject: [PATCH 29/70] Update Nodemailer.md --- Topics/Tech_Stacks/Nodemailer.md | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/Topics/Tech_Stacks/Nodemailer.md b/Topics/Tech_Stacks/Nodemailer.md index 781b62039..c95969ce4 100644 --- a/Topics/Tech_Stacks/Nodemailer.md +++ b/Topics/Tech_Stacks/Nodemailer.md @@ -8,7 +8,7 @@ ## Introduction -Nodemailer is a Node.js module that allows you to send emails from your server easily. You can use this Nodemailer however you like. For example communicating with others and notifying yourself if there is any problem. As the name suggests, Nodemailer is use in Node.js, so when you want to use Nodemailer to send mail, mnake sure to use Node.js and have Node.js ready with you. +Nodemailer is a Node.js module that allows you to send emails from your server easily. You can use Nodemailer. For example, you can communicate with others or notify yourself via email. As the name suggests, Nodemailer is used in Node.js, so when you want to use Nodemailer to send mail, make sure to use Node.js and have Node.js ready with you. Before I start explaning how Nodemailer can be used, we have to install and import so we can use it. You can install nodemailer by the below command: @@ -21,11 +21,11 @@ After you installed Nodemailer, make sure you import nodemailer so you can use i const nodemailer = require('nodemailer'); ``` -[This link](https://www.freecodecamp.org/news/use-nodemailer-to-send-emails-from-your-node-js-server/) provides more practical and detailed mathod of installing necessary package and examples. +[This link](https://www.freecodecamp.org/news/use-nodemailer-to-send-emails-from-your-node-js-server/) provides a more practical and detailed method of installing the necessary packages, as well as nodemailer examples. ## Create a Transporter object -Now you are ready to use nodemailer! Using nodemailer involves three steps. Here, we explain first step which is creating a transporter object. This step is basically creating an object and setting information about basic information about a mail you are sneding including service you are using to send a mail, information about senders, and so on. The example codes are shown below: +Now you are ready to use nodemailer! Using nodemailer involves three steps. Here, we explain first step which is creating a transporter object. This step is basically creating an object and setting information about basic information about a mail you are sending, such as the service you are using to send a mail, information about senders, and so on. The example codes are shown below: ``` JavaScript let transporter = nodemailer.createTransport({ @@ -36,9 +36,9 @@ let transporter = nodemailer.createTransport({ } }); ``` -Here, it uses gmail to send email. Information about the mail address that you want the email to sent from goes to auth as the code suggested. +Here, it uses gmail to send email. Information about the mail address that you want the email to be sent from goes to auth as the code suggested. -[This website](https://www.freecodecamp.org/news/use-nodemailer-to-send-emails-from-your-node-js-server/) gives further explanation about credential. It might be helpful when you are actually implementing and enconter any errors. +[This website](https://www.freecodecamp.org/news/use-nodemailer-to-send-emails-from-your-node-js-server/) gives further explanation about credentials. It might be helpful when you are actually implementing and encounter any errors. ## Create a MailOptions Object: @@ -54,7 +54,7 @@ let mailOptions = { }; ``` -As the example code above shows, you can define the contents and subject can be defined here. There are some options for the text such as using HTML to format the text by adding html in mailOption like below: +As the example code above shows, you can define the contents and subject in this object. There are some options for the text such as using HTML to format the text by adding html in mailOption like below: ``` JavaScript let mailOptions = { @@ -62,13 +62,13 @@ let mailOptions = { to: WHERE_EMAIL_IS_SENT_TO, subject: 'Nodemailer Testing', text: 'contents of your mail goes here' - html: '

Welcome

Nice work!

' + html: '' }; ``` ## Use the Transporter.sendMail method -The last step is to use the Transporter.sendMail method. This is simpler than earlier steps. However, there are somethings we should aware of which is error handling. It is common that the nodemailer causes error since there might be typo in mail address and so on. Therefore, make sure to check for the error. If there are errors, make sure to hadle that separately. This code below gives you an idea how the error should be handled and how the method is used. +The last step is to use the Transporter.sendMail method. This is simpler than earlier steps. However, there are some things we should aware of which is error handling. It is common that the nodemailer causes errors since there might be a typo in the mail address and so on. Therefore, make sure to check for the error. If there are errors, make sure to hadle them separately. This code below gives you an idea how the error should be handled and how the method is used. ``` JavaScript transporter.sendMail(mailOptions, function(err, data) { @@ -81,7 +81,7 @@ transporter.sendMail(mailOptions, function(err, data) { ``` This is very common way to handle errors. If specific operations are needed when there is an error, you can edit the code as needed. -In conclusion, nodemailer is very simple way to send email to an user using node.js. +In conclusion, nodemailer is a very simple way to send emails to a user. ## Useful Links https://mailtrap.io/blog/sending-emails-with-nodemailer/ @@ -90,4 +90,4 @@ https://mailtrap.io/blog/sending-emails-with-nodemailer/ https://www.knowledgehut.com/blog/web-development/nodemailer-module-nodejs -These websites have full tutorial from setting up to implmenting which can be useful! +These websites have full tutorials from setting up to implementing which can be useful! From b9143d7096055e0721f12f4b61349345c615d6fd Mon Sep 17 00:00:00 2001 From: Charlie Tao Date: Mon, 20 Nov 2023 15:47:59 -0500 Subject: [PATCH 30/70] Created Bootstrap.md --- Topics/Tech_Stacks/Bootstrap.md | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 Topics/Tech_Stacks/Bootstrap.md diff --git a/Topics/Tech_Stacks/Bootstrap.md b/Topics/Tech_Stacks/Bootstrap.md new file mode 100644 index 000000000..e69de29bb From c28e59c7a2ae1999ca433cb8a4c4868f56aa1a2c Mon Sep 17 00:00:00 2001 From: Charlie Tao Date: Mon, 20 Nov 2023 15:48:11 -0500 Subject: [PATCH 31/70] Wrote introduction and Bootstrap Basics --- Topics/Tech_Stacks/Bootstrap.md | 92 +++++++++++++++++++++++++++++++++ 1 file changed, 92 insertions(+) diff --git a/Topics/Tech_Stacks/Bootstrap.md b/Topics/Tech_Stacks/Bootstrap.md index e69de29bb..2f60b68bd 100644 --- a/Topics/Tech_Stacks/Bootstrap.md +++ b/Topics/Tech_Stacks/Bootstrap.md @@ -0,0 +1,92 @@ +# Learning Bootstrap, a CSS Framework + +## Table of contents +### [Introduction](#what-is-bootstrap?-1) +### [References](#references-and-resources-1) + +## Preface +Here you will learn the basics of how to incorporate Bootstrap into your website-building workflow. This should not serve as an in-depth guide, but rather one that should help you get your foot in the door to begin understanding and using Bootstrap components. Before you start, it is recommended that you have working knowledge of both HTML and CSS. This could be as little as a simple styled website. Although not required, it will be helpful in understanding why Bootstrap is such a widely-used and useful framework when working with CSS. At the end of this guide, you should be able to apply some simple Bootstrap components or formatting into your website. + +## What is Bootstrap? +Bootstrap is a CSS Framework that simplifies and standardizes much of the styling process. It does this by including much of the common styling choices as an optional pre-built class that can be attached to HTML elements, most commonly divs or spans. In a typical workflow, you would need to create the CSS for these class yourself in a .css file and import those styles. Over a large project, you might begin to realize that the styles can get messy and/or redundnant. Using Bootstrap's built-in styles would instead allow you to rely on their basic foundational stylistic building blocks, requiring less custom CSS from you. + +## Where to begin +The most extensive guide in getting started with Bootstrap is undoubtedly from the official documentation. Everything here will have its corresponding reference on [their website here](https://getbootstrap.com/docs/5.3/getting-started/introduction/). + +For starters, you will need to add Bootstrap to your website's HTML files. Following the guide in the link above: + +1. For responsive design, insert `` inside your ` ` element. +2. For Bootstrap's CSS, insert `` inside your ` ` element. +3. For Bootstrap's JavaScript, insert `` inside your ` ` element, at the bottom. This allows the use of certain Bootstrap elements that rely on JavaScript. + +For the sake of this tutorial, insert all the above and it should look something like: +``` + + + + + + <-- Reponsive design --> + + + Bootstrap demo + + <-- Bootstrap CSS --> + + + + +

Hello, world!

+ + <-- Bootstrap JavaScript --> + + + +``` + +## Bootstrap Basics +At the heart of Bootstrap is the inclusion of Bootstrap classes into your HTML elements. At the start, you will find yourself constantly looking at documentation to refer to which available class options are available. These classes are used to add styling into your elements as either a Bootstrap component, or a simple shorthand for common CSS adjustments. Some commonly used classes include the adjustment of margins and padding. Here is an example of how each of them can be used in code, along with their corresponding reference. + +[Margins / Padding](https://getbootstrap.com/docs/5.3/utilities/spacing/) +``` +
+
+
+ +
+
+
+``` + +These class names may look foreign, but essentially they follow the format of `[margin / padding][side]-[scale]`. What they do is change the margins or paddings of the HTML elements without the need for custom CSS styling or classes, since it is common to want to adjust spacing conveniently on the fly. The specific selections can be found in the documentation, but a summary is: + +``` +# Types +m = margin, p = padding + +# Sides +t = top, b = bottom, s = start (typically left), e = end (typically right) +x = x-axis (left and right), y = y-axis (top and bottom) +Using m or p alone = all sides + +# Values +auto = CSS auto +0, 1, 2, 3, 4, 5 = Relative sizes from 0 to 3 rem +``` + +### Buttons +[Bootstrap Buttons Resource](https://getbootstrap.com/docs/5.3/components/buttons/) + +### Cards +[Bootstrap Cards Resource](https://getbootstrap.com/docs/5.3/components/card/) + +### Grid Layout +[Bootstrap Grid Resource](https://getbootstrap.com/docs/5.3/layout/grid/) + +## Closing statements +As seen above, Bootstrap styling can speed up the creation of clean and simple designs in your HTML elements. The usage of Bootstrap extends into React, which has slightly different implementation details which can be found [on their official website here](https://react-bootstrap.netlify.app/docs/getting-started/introduction). Hopefully you have a better understanding of what Bootstrap is, how a component can be used in a website, and how to use Bootstrap layouts to format your elements. + +## References and Resources +[] + + From 8cb02154bec3cb3c9911294105a8ac45fcb01f72 Mon Sep 17 00:00:00 2001 From: Yasutakahi <113137606+Yasutakahi@users.noreply.github.com> Date: Mon, 20 Nov 2023 16:28:28 -0500 Subject: [PATCH 32/70] improved based on reviews I added some further explanations about the securities and what the data attribute is for --- Topics/Tech_Stacks/Nodemailer.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Topics/Tech_Stacks/Nodemailer.md b/Topics/Tech_Stacks/Nodemailer.md index c95969ce4..15a226286 100644 --- a/Topics/Tech_Stacks/Nodemailer.md +++ b/Topics/Tech_Stacks/Nodemailer.md @@ -36,7 +36,7 @@ let transporter = nodemailer.createTransport({ } }); ``` -Here, it uses gmail to send email. Information about the mail address that you want the email to be sent from goes to auth as the code suggested. +Here, it uses gmail to send email. Information about the mail address that you want the email to be sent from goes to auth as the code suggested. Note that you usually want to define your mail address and password in different file such as .env so that it is not visible by others. [This website](https://www.freecodecamp.org/news/use-nodemailer-to-send-emails-from-your-node-js-server/) gives further explanation about credentials. It might be helpful when you are actually implementing and encounter any errors. @@ -79,7 +79,7 @@ transporter.sendMail(mailOptions, function(err, data) { } }); ``` -This is very common way to handle errors. If specific operations are needed when there is an error, you can edit the code as needed. +This is very common way to handle errors. If specific operations are needed when there is an error, you can edit the code as needed. This data attribute for errors can be used to notify what the error or problem is. In conclusion, nodemailer is a very simple way to send emails to a user. From fc5498161cabae24ab82cb2c2c5e6b7993939334 Mon Sep 17 00:00:00 2001 From: Charlie Tao Date: Mon, 20 Nov 2023 17:16:21 -0500 Subject: [PATCH 33/70] Bootstrap.md Cards and Grids --- Topics/Tech_Stacks/Bootstrap.md | 89 +++++++++++++++++++++++++++++---- 1 file changed, 80 insertions(+), 9 deletions(-) diff --git a/Topics/Tech_Stacks/Bootstrap.md b/Topics/Tech_Stacks/Bootstrap.md index 2f60b68bd..7b083ce23 100644 --- a/Topics/Tech_Stacks/Bootstrap.md +++ b/Topics/Tech_Stacks/Bootstrap.md @@ -2,7 +2,10 @@ ## Table of contents ### [Introduction](#what-is-bootstrap?-1) -### [References](#references-and-resources-1) +### [What is Bootstrap](#what-is-bootstrap-1) +### [Where to begin](#where-to-begin-1) +### [Bootstrap Basics](#bootstrap-basics-1) +### [References](#references-1) ## Preface Here you will learn the basics of how to incorporate Bootstrap into your website-building workflow. This should not serve as an in-depth guide, but rather one that should help you get your foot in the door to begin understanding and using Bootstrap components. Before you start, it is recommended that you have working knowledge of both HTML and CSS. This could be as little as a simple styled website. Although not required, it will be helpful in understanding why Bootstrap is such a widely-used and useful framework when working with CSS. At the end of this guide, you should be able to apply some simple Bootstrap components or formatting into your website. @@ -20,7 +23,7 @@ For starters, you will need to add Bootstrap to your website's HTML files. Follo 3. For Bootstrap's JavaScript, insert `` inside your ` ` element, at the bottom. This allows the use of certain Bootstrap elements that rely on JavaScript. For the sake of this tutorial, insert all the above and it should look something like: -``` +```html @@ -48,7 +51,7 @@ For the sake of this tutorial, insert all the above and it should look something At the heart of Bootstrap is the inclusion of Bootstrap classes into your HTML elements. At the start, you will find yourself constantly looking at documentation to refer to which available class options are available. These classes are used to add styling into your elements as either a Bootstrap component, or a simple shorthand for common CSS adjustments. Some commonly used classes include the adjustment of margins and padding. Here is an example of how each of them can be used in code, along with their corresponding reference. [Margins / Padding](https://getbootstrap.com/docs/5.3/utilities/spacing/) -``` +```html
@@ -58,7 +61,7 @@ At the heart of Bootstrap is the inclusion of Bootstrap classes into your HTML e
``` -These class names may look foreign, but essentially they follow the format of `[margin / padding][side]-[scale]`. What they do is change the margins or paddings of the HTML elements without the need for custom CSS styling or classes, since it is common to want to adjust spacing conveniently on the fly. The specific selections can be found in the documentation, but a summary is: +These class names may look foreign, but essentially they follow the format of `[margin / padding][side]-[scale]`. What they do is change the margins or paddings of the HTML elements without the need for custom CSS styling or classes, since it is common to want to adjust spacing conveniently on the fly. Add these classes to any element, and watch the spacing change! The specific selections can be found in the documentation, but a summary is: ``` # Types @@ -74,19 +77,87 @@ auto = CSS auto 0, 1, 2, 3, 4, 5 = Relative sizes from 0 to 3 rem ``` -### Buttons -[Bootstrap Buttons Resource](https://getbootstrap.com/docs/5.3/components/buttons/) - ### Cards [Bootstrap Cards Resource](https://getbootstrap.com/docs/5.3/components/card/) +Cards are one of the best places to start to understand how Bootstrap compoments work. They are a simple way to contain a collection of information, and work like their name, as a "card". In essence, they are a rectangular container with a slight border radius to round out the corners that can contain things like an image, a header, a body, and more. Since they do not have margins, you can utilize and append the simple spacing shown in the [previous section](#bootstrap-basics-1). + +When starting out with Bootstrap, it is helpful to play around with template code such as the one below. Let's start by breaking down the example code in the reference: + + +image + +```html +
+``` + +Here, we have a sample Bootstrap card that will display as the above image. The outer-most element is a div with the `"card"` class, establishing the basic rounded rectangle of width 18rem. This allows for cards to be placed anywhere and adjusted to the appropriate sizes with your own styles. Nested within this element is where you can place other parts of a card, such as `"card-img-top"`, `"card-body"`, `"card-title"`, and `"card-text"`. There are other options you may find on the official documentation, but for now we will focus on these. + +- `"card-img-top"` is a class that can format an image to fill the top of the card. Thus, it is usually attached to an `img` element and can be paired with text in the `"card-body"` that will fill the bottom. +- `"card-body"` is a class where most of the content can be nested inside. The class allots a padded space for your content, such as text, to belong. It can be paired with `"card-title"` and `"card-text"` to format the text within. +- `"card-title"` and `"card-text"` are classes that will style your text. It can be added as a child of the `"card-body"` to utilize the premade formatting, or it can be used on its own with your own custom CSS formatting. + +Reminder that these classes do not have to be placed in this certain order, and liberties can be taken with your own custom CSS to determine the proper formatting that you desire. A lot of Bootstrap components are tools you can use as reference, and you can apply further customization to fit your needs. + ### Grid Layout [Bootstrap Grid Resource](https://getbootstrap.com/docs/5.3/layout/grid/) +The Bootstrap Grid System is a fundamental tool for creating responsive and organized layouts in web development. It revolves around a 12-column grid structure, providing a flexible framework to arrange content on your webpage. + +- **Container:** The `container` class creates a responsive wrapper for your content, adjusting its width based on the screen size. + +- **Rows and Columns:** Use the `row` class to define horizontal containers. Inside a row, you can divide the space into 12 columns using classes like `col-`, `col-sm-`, `col-md-`, etc. For example: + + ```html +
+
+
+ +
+
+ +
+
+
+ ``` + +- **Responsive Classes:** Bootstrap provides responsive classes to control column behavior on different screen sizes. Prefix classes like `col-sm-` for small screens, `col-md-` for medium screens, and so on. + +- **Offsetting and Nesting:** Offset classes add space between columns, while nesting allows you to create more intricate layouts by placing rows and columns inside existing columns. + +#### Example Implementation + +Creating a three-column layout: + +```html +
+
+
+ +
+
+ +
+
+ +
+
+
+``` + +Mastering the basics of the Bootstrap Grid System empowers you to design responsive and visually appealing web layouts efficiently. Explore different configurations to understand its flexibility and enhance your web development skills. For detailed information, refer to the [Bootstrap Grid documentation](https://getbootstrap.com/docs/5.3/layout/grid/). + ## Closing statements As seen above, Bootstrap styling can speed up the creation of clean and simple designs in your HTML elements. The usage of Bootstrap extends into React, which has slightly different implementation details which can be found [on their official website here](https://react-bootstrap.netlify.app/docs/getting-started/introduction). Hopefully you have a better understanding of what Bootstrap is, how a component can be used in a website, and how to use Bootstrap layouts to format your elements. -## References and Resources -[] +## References +[Bootstrap Tutorial and Documentation](https://getbootstrap.com/docs/5.3/getting-started/introduction/) From c9d2091a27a67cb3a4f0283b7eb2a5d490d04688 Mon Sep 17 00:00:00 2001 From: Charlie Tao Date: Mon, 20 Nov 2023 19:20:09 -0500 Subject: [PATCH 34/70] Mention other framework and CSS / Bootstrap guide --- Topics/Tech_Stacks/Bootstrap.md | 17 +++++++---------- Topics/Tech_Stacks/CSS.md | 2 +- 2 files changed, 8 insertions(+), 11 deletions(-) diff --git a/Topics/Tech_Stacks/Bootstrap.md b/Topics/Tech_Stacks/Bootstrap.md index 7b083ce23..af43dcc64 100644 --- a/Topics/Tech_Stacks/Bootstrap.md +++ b/Topics/Tech_Stacks/Bootstrap.md @@ -5,10 +5,10 @@ ### [What is Bootstrap](#what-is-bootstrap-1) ### [Where to begin](#where-to-begin-1) ### [Bootstrap Basics](#bootstrap-basics-1) -### [References](#references-1) +### [References](#references-and-links-1) ## Preface -Here you will learn the basics of how to incorporate Bootstrap into your website-building workflow. This should not serve as an in-depth guide, but rather one that should help you get your foot in the door to begin understanding and using Bootstrap components. Before you start, it is recommended that you have working knowledge of both HTML and CSS. This could be as little as a simple styled website. Although not required, it will be helpful in understanding why Bootstrap is such a widely-used and useful framework when working with CSS. At the end of this guide, you should be able to apply some simple Bootstrap components or formatting into your website. +Here you will learn the basics of how to incorporate Bootstrap into your website-building workflow. This should not serve as an in-depth guide, but rather one that should help you get your foot in the door to begin understanding and using Bootstrap components. Before you start, it is recommended that you have working knowledge of both HTML and CSS. This could be as little as a simple styled website. You can get started at [this CSS guide](./CSS.md), but it is suggested to have more practice with CSS. Although not required, it will be helpful in understanding why Bootstrap is such a widely-used and useful framework when working with CSS. At the end of this guide, you should be able to apply some simple Bootstrap components or formatting into your website. ## What is Bootstrap? Bootstrap is a CSS Framework that simplifies and standardizes much of the styling process. It does this by including much of the common styling choices as an optional pre-built class that can be attached to HTML elements, most commonly divs or spans. In a typical workflow, you would need to create the CSS for these class yourself in a .css file and import those styles. Over a large project, you might begin to realize that the styles can get messy and/or redundnant. Using Bootstrap's built-in styles would instead allow you to rely on their basic foundational stylistic building blocks, requiring less custom CSS from you. @@ -29,19 +29,19 @@ For the sake of this tutorial, insert all the above and it should look something - <-- Reponsive design --> + Bootstrap demo - <-- Bootstrap CSS --> +

Hello, world!

- <-- Bootstrap JavaScript --> + @@ -155,9 +155,6 @@ Creating a three-column layout: Mastering the basics of the Bootstrap Grid System empowers you to design responsive and visually appealing web layouts efficiently. Explore different configurations to understand its flexibility and enhance your web development skills. For detailed information, refer to the [Bootstrap Grid documentation](https://getbootstrap.com/docs/5.3/layout/grid/). ## Closing statements -As seen above, Bootstrap styling can speed up the creation of clean and simple designs in your HTML elements. The usage of Bootstrap extends into React, which has slightly different implementation details which can be found [on their official website here](https://react-bootstrap.netlify.app/docs/getting-started/introduction). Hopefully you have a better understanding of what Bootstrap is, how a component can be used in a website, and how to use Bootstrap layouts to format your elements. - -## References -[Bootstrap Tutorial and Documentation](https://getbootstrap.com/docs/5.3/getting-started/introduction/) - +As seen above, Bootstrap styling can speed up the creation of clean and simple designs in your HTML elements. The usage of Bootstrap extends into React, which has slightly different implementation details which can be found [on their official website here](https://react-bootstrap.netlify.app/docs/getting-started/introduction). There are other Frameworks out there, such as Tailwind CSS, which also aim to simplify the styling process, so you can check that out [here](https://tailwindcss.com/docs/installation) Hopefully you have a better understanding of what Bootstrap is, how a component can be used in a website, and how to use Bootstrap layouts to format your elements. +## References and Links diff --git a/Topics/Tech_Stacks/CSS.md b/Topics/Tech_Stacks/CSS.md index a74bc1721..827d57dd6 100644 --- a/Topics/Tech_Stacks/CSS.md +++ b/Topics/Tech_Stacks/CSS.md @@ -39,6 +39,6 @@ CSS grid is also a positioning alternative that provides a grid layout module, i Native CSS can be difficult to use, so CSS frameworks have been created so developers can use pre-made styles in order to create good looking website components, navigation bars, buttons, etc. in an easier and faster way without needing to know the semantics of CSS. Two popular CSS frameworks include [Tailwind CSS](https://tailwindcss.com/) and [Bootstrap CSS](https://getbootstrap.com/docs/3.4/css/). -[React-Bootstrap](https://react-bootstrap.github.io/) is a Bootstrap CSS framework specifically for use on React apps. +[React-Bootstrap](https://react-bootstrap.github.io/) is a Bootstrap CSS framework specifically for use on React apps. There is also the guide on our wiki [here](./Bootstrap.md) that can get you started on Bootstrap's basics. Generally, Bootstrap is easier to use and will produce a good looking website in a shorter amount of time, while Tailwind CSS is more customizable and can create more unique looking elements, but requires more of a time investment and is a bit harder to learn and work with compared to Bootstrap. From 5981c5b887b794b86921f106c75356971e0f834d Mon Sep 17 00:00:00 2001 From: Charlie Tao Date: Mon, 20 Nov 2023 19:20:50 -0500 Subject: [PATCH 35/70] Added more references and links --- Topics/Tech_Stacks/Bootstrap.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/Topics/Tech_Stacks/Bootstrap.md b/Topics/Tech_Stacks/Bootstrap.md index af43dcc64..c749ed53d 100644 --- a/Topics/Tech_Stacks/Bootstrap.md +++ b/Topics/Tech_Stacks/Bootstrap.md @@ -158,3 +158,9 @@ Mastering the basics of the Bootstrap Grid System empowers you to design respons As seen above, Bootstrap styling can speed up the creation of clean and simple designs in your HTML elements. The usage of Bootstrap extends into React, which has slightly different implementation details which can be found [on their official website here](https://react-bootstrap.netlify.app/docs/getting-started/introduction). There are other Frameworks out there, such as Tailwind CSS, which also aim to simplify the styling process, so you can check that out [here](https://tailwindcss.com/docs/installation) Hopefully you have a better understanding of what Bootstrap is, how a component can be used in a website, and how to use Bootstrap layouts to format your elements. ## References and Links +[Our Wiki CSS Guide](./CSS.md) +[Bootstrap Documentation and Start](https://getbootstrap.com/docs/5.3/getting-started/introduction/) +[Bootstrap Spacing (Margins, Padding, and more)](https://getbootstrap.com/docs/5.3/utilities/spacing/) +[Bootstrap Cards Resource](https://getbootstrap.com/docs/5.3/components/card/) +[Bootstrap Grid Resource](https://getbootstrap.com/docs/5.3/layout/grid/) +[React Bootstrap](https://react-bootstrap.netlify.app/docs/getting-started/introduction) \ No newline at end of file From 0cd819bb8eb2f314fb18e3be4e6b0a3e89e3c5ea Mon Sep 17 00:00:00 2001 From: Yasutakahi <113137606+Yasutakahi@users.noreply.github.com> Date: Mon, 20 Nov 2023 19:47:24 -0500 Subject: [PATCH 36/70] fixing some small mistakes finished some typos and mistakes --- Topics/Tech_Stacks/Nodemailer.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Topics/Tech_Stacks/Nodemailer.md b/Topics/Tech_Stacks/Nodemailer.md index 15a226286..2260a6f73 100644 --- a/Topics/Tech_Stacks/Nodemailer.md +++ b/Topics/Tech_Stacks/Nodemailer.md @@ -8,7 +8,7 @@ ## Introduction -Nodemailer is a Node.js module that allows you to send emails from your server easily. You can use Nodemailer. For example, you can communicate with others or notify yourself via email. As the name suggests, Nodemailer is used in Node.js, so when you want to use Nodemailer to send mail, make sure to use Node.js and have Node.js ready with you. +Nodemailer is a Node.js module that allows you to send emails from your server easily. There are many ways to use nodemailer effectively. For example, you can communicate with others or notify yourself via email. As the name suggests, Nodemailer is used in Node.js, so when you want to use Nodemailer to send mail, make sure to use Node.js and have Node.js ready with you. Before I start explaning how Nodemailer can be used, we have to install and import so we can use it. You can install nodemailer by the below command: @@ -68,7 +68,7 @@ let mailOptions = { ## Use the Transporter.sendMail method -The last step is to use the Transporter.sendMail method. This is simpler than earlier steps. However, there are some things we should aware of which is error handling. It is common that the nodemailer causes errors since there might be a typo in the mail address and so on. Therefore, make sure to check for the error. If there are errors, make sure to hadle them separately. This code below gives you an idea how the error should be handled and how the method is used. +The last step is to use the Transporter.sendMail method. This is simpler than earlier steps. However, there are some things we should aware of which is error handling. It is common that the nodemailer causes errors since there might be a typo in the mail address and so on. Therefore, make sure to check for the error. If there are errors, make sure to handle them separately. This code below gives you an idea how the error should be handled and how the method is used. ``` JavaScript transporter.sendMail(mailOptions, function(err, data) { From 934355530dea7c3204d1d50711cbbe49b088b6b5 Mon Sep 17 00:00:00 2001 From: MalHus Date: Tue, 21 Nov 2023 11:47:36 -0500 Subject: [PATCH 37/70] re-organized and fixed incorrect links --- .../Scrum Planning Meeting.md | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/Topics/Software_Engineering/Scrum Planning Meeting.md b/Topics/Software_Engineering/Scrum Planning Meeting.md index 6300cb999..1af70b2cc 100644 --- a/Topics/Software_Engineering/Scrum Planning Meeting.md +++ b/Topics/Software_Engineering/Scrum Planning Meeting.md @@ -1,13 +1,21 @@ -# Scrum Planning Meeting +# Sprint Planning Meeting ## Introduction In the Scrum framework, sprints function as short, consistent cycles during which a set amount of work is completed. Since they are the heartbeat of the framework, ensuring sprints are well planned, or ensuring a successful Sprint Planning Meeting, is a crucial part of the framework. ## What does a Sprint Planning Meeting Encompass? -The meeting is held with the entire Agile team (including the ScrumMaster and Product Owner) and aims to conclude with a set of agreed upon **Product Backlog** items to be completed for the current sprint commitment. The **Product Backlog** is an ordered list of tasks essential for improving the product and satisfying the stakeholders, while the **Sprint Backlog** is a list of tasks selected from the Product Backlog to be completed during a specific sprint. -The ScrumMaster is responsible for leading the Planning Meeting and the Product Owner is responsible for detailing the Product Backlog items and ensuring alignment with the product’s goals. The planning addresses the value the sprint can bring to the stakeholders and the team collaborates to define a *Sprint Goal* before the end of the Sprint Planning meeting. Following, upon discussion with the Product Owner, the developers select items from the Product Backlog to include in the Sprint Backlog and determine this based on their prior and future Sprint performance. Additionally, for each Sprint Backlog item that is selected, the developers on the team decide how to break down and complete tasks for the sprint based on the team’s definition of “Done”. +| Terminology | Definition | +| -------- | ------- | +| Product Backlog | an ordered list of tasks essential for improving the product and satisfying the stakeholders | +| Sprint Backlog | a list of tasks selected from the Product Backlog to be completed during a specific sprint | + +* The meeting is held with the entire Agile team (including the ScrumMaster and Product Owner) and aims to conclude with a set of agreed upon **Product Backlog** items to be completed for the current sprint commitment. +* The ScrumMaster is responsible for leading the Planning Meeting and the Product Owner is responsible for detailing the Product Backlog items and ensuring alignment with the product’s goals. +* The planning addresses the value the sprint can bring to the stakeholders and the team collaborates to define a **Sprint Goal** before the end of the Sprint Planning meeting. +* Upon discussion with the Product Owner, the developers select items from the Product Backlog to include in the Sprint Backlog and determine this based on their prior and future Sprint performance. +* For each Sprint Backlog item that is selected, the developers on the team decide how to break down and complete tasks for the sprint based on the team’s definition of “Done”. ## Integrating Sprint Planning Meetings in CSC301 @@ -27,6 +35,6 @@ Once the Sprint Backlog items are finalized, as the ScrumMaster, call for a grou The Sprint Planning Meeting lays the foundation for the sprint, helps the team understand their tasks and sets the stage for effective Scrum meetings in the weeks ahead. This meeting ensures everyone is aligned and ready for the work to come, making future collaborations smoother and more productive. ## Resources -- [What is Sprint Planning](https://www.atlassian.com/agile/project-management/project-management-intro) +- [What is Sprint Planning](https://www.scrum.org/resources/what-is-sprint-planning) - [Sprint Planning Learning Series](https://www.scrum.org/learning-series/sprint-planning) -- [Sprint Planning Meeting: A Simple Cheat Sheet](https://www.wrike.com/blog/set-up-your-waterfall-workflow/) \ No newline at end of file +- [Sprint Planning Meeting: A Simple Cheat Sheet](https://www.leadingagile.com/2012/08/simple-cheat-sheet-to-sprint-planning-meeting/) \ No newline at end of file From 5f34cdef9da9e20b23de3a74b9c52d9242a47e8f Mon Sep 17 00:00:00 2001 From: MalHus Date: Tue, 21 Nov 2023 11:49:12 -0500 Subject: [PATCH 38/70] changed title name to accurately reflect topic --- .../Sprint Planning Meeting.md | 40 +++++++++++++++++++ 1 file changed, 40 insertions(+) create mode 100644 Topics/Software_Engineering/Sprint Planning Meeting.md diff --git a/Topics/Software_Engineering/Sprint Planning Meeting.md b/Topics/Software_Engineering/Sprint Planning Meeting.md new file mode 100644 index 000000000..1af70b2cc --- /dev/null +++ b/Topics/Software_Engineering/Sprint Planning Meeting.md @@ -0,0 +1,40 @@ +# Sprint Planning Meeting + +## Introduction +In the Scrum framework, sprints function as short, consistent cycles during which a set amount of work is completed. Since they are the heartbeat of the framework, ensuring sprints are well planned, or ensuring a successful Sprint Planning Meeting, is a crucial part of the framework. + + +## What does a Sprint Planning Meeting Encompass? + +| Terminology | Definition | +| -------- | ------- | +| Product Backlog | an ordered list of tasks essential for improving the product and satisfying the stakeholders | +| Sprint Backlog | a list of tasks selected from the Product Backlog to be completed during a specific sprint | + +* The meeting is held with the entire Agile team (including the ScrumMaster and Product Owner) and aims to conclude with a set of agreed upon **Product Backlog** items to be completed for the current sprint commitment. +* The ScrumMaster is responsible for leading the Planning Meeting and the Product Owner is responsible for detailing the Product Backlog items and ensuring alignment with the product’s goals. +* The planning addresses the value the sprint can bring to the stakeholders and the team collaborates to define a **Sprint Goal** before the end of the Sprint Planning meeting. +* Upon discussion with the Product Owner, the developers select items from the Product Backlog to include in the Sprint Backlog and determine this based on their prior and future Sprint performance. +* For each Sprint Backlog item that is selected, the developers on the team decide how to break down and complete tasks for the sprint based on the team’s definition of “Done”. + + +## Integrating Sprint Planning Meetings in CSC301 +*Consider an example of how a Scrum Planning Meeting can be integrated into our course’s workflow.* + +### Before the Planning Meeting: +After a Product Manager and Scrum Master are chosen in Deliverable 1, consider each deliverable (deliverable 2 to 5) equivalent to a sprint, with each sprint having one dedicated Sprint Planning Meeting. As a ScrumMaster and Product Manager, organize an hour long meeting within the next week after the Deliverable handout is released. Prior to the Scrum Planning Meeting, you both should also read through the handout and identify features/Product Backlog items for the upcoming sprint and add them to the Product Backlog list on Jira (or the team’s chosen product management tool). + +### During the Planning Meeting: +Start by reminding the team of the upcoming Deliverable and review the definition of “Done”, which in this case would be meeting both the rubric and your partner's requirements. As a team, take this opportunity to brainstorm more tasks that need to be completed based on what your partner has asked and add them into the Product Backlog list. + +Discuss how much time would be needed for each Product Backlog item listed on Jira and based on this estimate, determine items for the Sprint Backlog. Following, select items from the Product Backlog and add them into the Sprint Backlog, allow team members to assign themselves to sprint tasks (including yourself) and discuss any further action items as a team. + +Once the Sprint Backlog items are finalized, as the ScrumMaster, call for a group consensus on the plan and conclude the meeting. + +## Key Takeaway +The Sprint Planning Meeting lays the foundation for the sprint, helps the team understand their tasks and sets the stage for effective Scrum meetings in the weeks ahead. This meeting ensures everyone is aligned and ready for the work to come, making future collaborations smoother and more productive. + +## Resources +- [What is Sprint Planning](https://www.scrum.org/resources/what-is-sprint-planning) +- [Sprint Planning Learning Series](https://www.scrum.org/learning-series/sprint-planning) +- [Sprint Planning Meeting: A Simple Cheat Sheet](https://www.leadingagile.com/2012/08/simple-cheat-sheet-to-sprint-planning-meeting/) \ No newline at end of file From d5b340467896e06f4592028e270267b5f3ae4127 Mon Sep 17 00:00:00 2001 From: MalHus Date: Tue, 21 Nov 2023 11:54:18 -0500 Subject: [PATCH 39/70] deleted old file name --- .../Scrum Planning Meeting.md | 40 ------------------- 1 file changed, 40 deletions(-) delete mode 100644 Topics/Software_Engineering/Scrum Planning Meeting.md diff --git a/Topics/Software_Engineering/Scrum Planning Meeting.md b/Topics/Software_Engineering/Scrum Planning Meeting.md deleted file mode 100644 index 1af70b2cc..000000000 --- a/Topics/Software_Engineering/Scrum Planning Meeting.md +++ /dev/null @@ -1,40 +0,0 @@ -# Sprint Planning Meeting - -## Introduction -In the Scrum framework, sprints function as short, consistent cycles during which a set amount of work is completed. Since they are the heartbeat of the framework, ensuring sprints are well planned, or ensuring a successful Sprint Planning Meeting, is a crucial part of the framework. - - -## What does a Sprint Planning Meeting Encompass? - -| Terminology | Definition | -| -------- | ------- | -| Product Backlog | an ordered list of tasks essential for improving the product and satisfying the stakeholders | -| Sprint Backlog | a list of tasks selected from the Product Backlog to be completed during a specific sprint | - -* The meeting is held with the entire Agile team (including the ScrumMaster and Product Owner) and aims to conclude with a set of agreed upon **Product Backlog** items to be completed for the current sprint commitment. -* The ScrumMaster is responsible for leading the Planning Meeting and the Product Owner is responsible for detailing the Product Backlog items and ensuring alignment with the product’s goals. -* The planning addresses the value the sprint can bring to the stakeholders and the team collaborates to define a **Sprint Goal** before the end of the Sprint Planning meeting. -* Upon discussion with the Product Owner, the developers select items from the Product Backlog to include in the Sprint Backlog and determine this based on their prior and future Sprint performance. -* For each Sprint Backlog item that is selected, the developers on the team decide how to break down and complete tasks for the sprint based on the team’s definition of “Done”. - - -## Integrating Sprint Planning Meetings in CSC301 -*Consider an example of how a Scrum Planning Meeting can be integrated into our course’s workflow.* - -### Before the Planning Meeting: -After a Product Manager and Scrum Master are chosen in Deliverable 1, consider each deliverable (deliverable 2 to 5) equivalent to a sprint, with each sprint having one dedicated Sprint Planning Meeting. As a ScrumMaster and Product Manager, organize an hour long meeting within the next week after the Deliverable handout is released. Prior to the Scrum Planning Meeting, you both should also read through the handout and identify features/Product Backlog items for the upcoming sprint and add them to the Product Backlog list on Jira (or the team’s chosen product management tool). - -### During the Planning Meeting: -Start by reminding the team of the upcoming Deliverable and review the definition of “Done”, which in this case would be meeting both the rubric and your partner's requirements. As a team, take this opportunity to brainstorm more tasks that need to be completed based on what your partner has asked and add them into the Product Backlog list. - -Discuss how much time would be needed for each Product Backlog item listed on Jira and based on this estimate, determine items for the Sprint Backlog. Following, select items from the Product Backlog and add them into the Sprint Backlog, allow team members to assign themselves to sprint tasks (including yourself) and discuss any further action items as a team. - -Once the Sprint Backlog items are finalized, as the ScrumMaster, call for a group consensus on the plan and conclude the meeting. - -## Key Takeaway -The Sprint Planning Meeting lays the foundation for the sprint, helps the team understand their tasks and sets the stage for effective Scrum meetings in the weeks ahead. This meeting ensures everyone is aligned and ready for the work to come, making future collaborations smoother and more productive. - -## Resources -- [What is Sprint Planning](https://www.scrum.org/resources/what-is-sprint-planning) -- [Sprint Planning Learning Series](https://www.scrum.org/learning-series/sprint-planning) -- [Sprint Planning Meeting: A Simple Cheat Sheet](https://www.leadingagile.com/2012/08/simple-cheat-sheet-to-sprint-planning-meeting/) \ No newline at end of file From 4656b09b47464026d6fdcacc59c883a9784e72e8 Mon Sep 17 00:00:00 2001 From: Raazia Hashim <67606070+hashimr1@users.noreply.github.com> Date: Tue, 21 Nov 2023 12:04:56 -0500 Subject: [PATCH 40/70] Update Tech_Stacks.md --- Topics/Tech_Stacks.md | 1 + 1 file changed, 1 insertion(+) diff --git a/Topics/Tech_Stacks.md b/Topics/Tech_Stacks.md index dfd16e46e..f67330089 100644 --- a/Topics/Tech_Stacks.md +++ b/Topics/Tech_Stacks.md @@ -12,3 +12,4 @@ ### [Learning TypeScript](./Tech_Stacks/TypeScript.md) ### [Learning JavaScript](./Tech_Stacks/JavaScript.md) ### [Learning React Native](./Tech_Stacks/ReactNative.md) +### [Temporal For Workflow Orchestration](./Tech_Stacks/Temporal.md) From dfd215d684a2944af86b07b45136c5cd92802647 Mon Sep 17 00:00:00 2001 From: MalHus Date: Tue, 21 Nov 2023 12:22:09 -0500 Subject: [PATCH 41/70] changed table title and bolded terms for clarity --- Topics/Software_Engineering/Sprint Planning Meeting.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Topics/Software_Engineering/Sprint Planning Meeting.md b/Topics/Software_Engineering/Sprint Planning Meeting.md index 1af70b2cc..1a8284352 100644 --- a/Topics/Software_Engineering/Sprint Planning Meeting.md +++ b/Topics/Software_Engineering/Sprint Planning Meeting.md @@ -6,7 +6,7 @@ In the Scrum framework, sprints function as short, consistent cycles during whic ## What does a Sprint Planning Meeting Encompass? -| Terminology | Definition | +| Scrum Artifacts | Definition | | -------- | ------- | | Product Backlog | an ordered list of tasks essential for improving the product and satisfying the stakeholders | | Sprint Backlog | a list of tasks selected from the Product Backlog to be completed during a specific sprint | @@ -14,7 +14,7 @@ In the Scrum framework, sprints function as short, consistent cycles during whic * The meeting is held with the entire Agile team (including the ScrumMaster and Product Owner) and aims to conclude with a set of agreed upon **Product Backlog** items to be completed for the current sprint commitment. * The ScrumMaster is responsible for leading the Planning Meeting and the Product Owner is responsible for detailing the Product Backlog items and ensuring alignment with the product’s goals. * The planning addresses the value the sprint can bring to the stakeholders and the team collaborates to define a **Sprint Goal** before the end of the Sprint Planning meeting. -* Upon discussion with the Product Owner, the developers select items from the Product Backlog to include in the Sprint Backlog and determine this based on their prior and future Sprint performance. +* Upon discussion with the Product Owner, the developers select items from the Product Backlog to include in the **Sprint Backlog** and determine this based on their prior and future Sprint performance. * For each Sprint Backlog item that is selected, the developers on the team decide how to break down and complete tasks for the sprint based on the team’s definition of “Done”. From eb99aa629eec9def273b33bd7c9ce5b225bd6381 Mon Sep 17 00:00:00 2001 From: cassandratin13 <113074772+cassandratin13@users.noreply.github.com> Date: Tue, 21 Nov 2023 14:28:47 -0500 Subject: [PATCH 42/70] Elaborate more on General Steps in Mobile-First_Design.md Added some recommended platforms to use to accomplish steps 1 and 2. Also fixed a minor format issue (graceful degredation was not properly italicized) --- Topics/User_Experience/Mobile-First_Design.md | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/Topics/User_Experience/Mobile-First_Design.md b/Topics/User_Experience/Mobile-First_Design.md index 785a051fb..b38ae0502 100644 --- a/Topics/User_Experience/Mobile-First_Design.md +++ b/Topics/User_Experience/Mobile-First_Design.md @@ -4,7 +4,7 @@ Mobile-first design is an approach that prioritizes designing the UI of web apps for mobile devices first before other larger screens. -The reasoning behind this strategy is to promote _progressive enhancement_ — the UI’s mobile version will contain only the main functionalities required for the web app, and adding extra features that can be displayed on larger screens can come later. In contrast, using the method of desktop-first design and adding responsiveness after is called _graceful degradation _because a lot of the details and complexities incorporated in the desktop version of the UI will have to be simplified and condensed to fit on a much smaller screen. +The reasoning behind this strategy is to promote _progressive enhancement_ — the UI’s mobile version will contain only the main functionalities required for the web app, and adding extra features that can be displayed on larger screens can come later. In contrast, using the method of desktop-first design and adding responsiveness after is called _graceful degradation_ because a lot of the details and complexities incorporated in the desktop version of the UI will have to be simplified and condensed to fit on a much smaller screen. ## Benefits @@ -34,8 +34,12 @@ The reasoning behind this strategy is to promote _progressive enhancement_ — t 1. Content inventory * Plan out all the content and elements you need for your web pages + * This can be written out on a spreadsheet (Microsoft Excel, Google spreadsheets, etc.), or any text editor + * The choice of which platform to use is up to you, but a spreadsheet is recommended for easy organization — here’s an example: https://maadmob.com.au/resources/content_inventory 2. Visual hierarchy * Create a priority list of all the visuals you will include on the page, taking into consideration the size of images, colours, and typography, as these properties can guide the user’s eye to understand the relative significance of the elements + * As with step 1, this can be done on a spreadsheet or any text editor — the purpose is just to help you plan out the content you’ll need and their importance, which will make designing the actual page easier and ensure most, if not all, of the content is not overlooked + * If you find that you need to visualize the content more, you could make a small prototype of some of the features using Figma, Canva, Google Drawings/Slides, etc. 3. Design from smallest to largest screens * Create designs for the mobile version first, then tablet, then finally desktop * These designs can be made on Figma, Canva, Google Drawings/Slides, or whatever design tool that will help you plan out the exact format of your page From 46b0f89a793205642fb18c4ee1e27be379d0c983 Mon Sep 17 00:00:00 2001 From: Chelsea Wang <98237975+chwawa@users.noreply.github.com> Date: Tue, 21 Nov 2023 14:49:36 -0500 Subject: [PATCH 43/70] Create Ant_Design.md Moved previous student's Ant Design section into a different file --- Topics/User_Experience/Ant_Design.md | 37 ++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) create mode 100644 Topics/User_Experience/Ant_Design.md diff --git a/Topics/User_Experience/Ant_Design.md b/Topics/User_Experience/Ant_Design.md new file mode 100644 index 000000000..afbb2d19a --- /dev/null +++ b/Topics/User_Experience/Ant_Design.md @@ -0,0 +1,37 @@ +# Ant Design + +Ant Design is another popular UI library and design system. It is specifically designed for React applications and other frontend frameworks like Vue, Angular and etc, providing a complete set of high-quality React components that make user interface development simpler, more consistent, and modular. Ant Design is ideal for building enterprise-level applications and dashboards with a focus on high performance, usability, and aesthetics. + +Ant Design provides a wide range of UI components, including buttons, icons, form elements, tables, and navigation menus. It also offers a consistent design language, making it easier for developers to create appealing user interfaces. The design ensures that your applications look great on different devices and screen sizes. More importantly, it is easy to use for beginners. Following steps are provided for you to start using Ant Design in your project. + +First, you need to install Ant Design in your React application. You can do this by running the following command (also you can use yarn command to install, here I provide method using npm): + +**npm install antd** + +Next, you may want to import the components you want to use in your application. For example, if you want to change the style for your button in a webpage, simply import Button from antd package. + +**import { Button } from 'antd';** + +Finally, you are almost done. All you need to do is use the imported components in your application. For example, below code is a example using Button from antd package: + +function App() { + return ( +
+ +
+ ); +} + +export default App; + +Besides, Ant Design allows you to customize the default theme by modifying the less variables. For instance, you can use tools like 'craco-less' or 'react-app-rewired' to customize your theme without ejecting from Create React App. + +If you want to learn more about Ant Design. There are some useful documents or tutorials that can help you get started with Ant Design. + +- [Ant Design official documentation](https://ant.design/docs/react/introduce): Actually, official documentation is always an excellent starting point for you to get started with an unfamiliar tool. It provides a comprehensive guide on installation, components, and customization. If you meet a trouble in using a component, read this guide! + +- [ANT DESIGN - THE BEST REACT LIBRARY??](https://www.youtube.com/watch?v=IEqmSROj5Uc): This tutorial video can show you every basic thing about Ant Design in 5 minutes. After watching this video, you can have an overview about Ant Design. + +- [Reactjs with AntDesign](https://www.youtube.com/playlist?list=PL-JTnqZPF5z2qTGwNkYln3m0pA0qfgHFR): This playlist contains almost every useful components that you might want to use in your project. It is good for beginners to learn the usage of components and apply them step by step. + +By following these tutorials, I hope you can gain a solid understanding of how to use Ant Design in your React projects and create attractive, user-friendly interfaces. From fc7ebc735a312714bd538a1166c97754aa943daf Mon Sep 17 00:00:00 2001 From: Chelsea Wang <98237975+chwawa@users.noreply.github.com> Date: Tue, 21 Nov 2023 14:51:09 -0500 Subject: [PATCH 44/70] Update User_Experience.md moved "Ant Design" section to a different file as suggested by Leya :) --- Topics/User_Experience.md | 36 +----------------------------------- 1 file changed, 1 insertion(+), 35 deletions(-) diff --git a/Topics/User_Experience.md b/Topics/User_Experience.md index 94eef5aad..e5173e96b 100644 --- a/Topics/User_Experience.md +++ b/Topics/User_Experience.md @@ -200,41 +200,7 @@ When building an application with a frontend framework (e.g., React, Vue, Angula ### Ant Design -Ant Design is another popular UI library and design system. It is specifically designed for React applications and other frontend frameworks like Vue, Angular and etc, providing a complete set of high-quality React components that make user interface development simpler, more consistent, and modular. Ant Design is ideal for building enterprise-level applications and dashboards with a focus on high performance, usability, and aesthetics. - -Ant Design provides a wide range of UI components, including buttons, icons, form elements, tables, and navigation menus. It also offers a consistent design language, making it easier for developers to create appealing user interfaces. The design ensures that your applications look great on different devices and screen sizes. More importantly, it is easy to use for beginners. Following steps are provided for you to start using Ant Design in your project. - -First, you need to install Ant Design in your React application. You can do this by running the following command (also you can use yarn command to install, here I provide method using npm): - -**npm install antd** - -Next, you may want to import the components you want to use in your application. For example, if you want to change the style for your button in a webpage, simply import Button from antd package. - -**import { Button } from 'antd';** - -Finally, you are almost done. All you need to do is use the imported components in your application. For example, below code is a example using Button from antd package: - -function App() { - return ( -
- -
- ); -} - -export default App; - -Besides, Ant Design allows you to customize the default theme by modifying the less variables. For instance, you can use tools like 'craco-less' or 'react-app-rewired' to customize your theme without ejecting from Create React App. - -If you want to learn more about Ant Design. There are some useful documents or tutorials that can help you get started with Ant Design. - -- [Ant Design official documentation](https://ant.design/docs/react/introduce): Actually, official documentation is always an excellent starting point for you to get started with an unfamiliar tool. It provides a comprehensive guide on installation, components, and customization. If you meet a trouble in using a component, read this guide! - -- [ANT DESIGN - THE BEST REACT LIBRARY??](https://www.youtube.com/watch?v=IEqmSROj5Uc): This tutorial video can show you every basic thing about Ant Design in 5 minutes. After watching this video, you can have an overview about Ant Design. - -- [Reactjs with AntDesign](https://www.youtube.com/playlist?list=PL-JTnqZPF5z2qTGwNkYln3m0pA0qfgHFR): This playlist contains almost every useful components that you might want to use in your project. It is good for beginners to learn the usage of components and apply them step by step. - -By following these tutorials, I hope you can gain a solid understanding of how to use Ant Design in your React projects and create attractive, user-friendly interfaces. +View an introduction to Ant Design written by a CSC301 student [here](./User_Experience/Ant_Design.md) # User Experience-Orientated Games From e75aabf622ccd219e50b192c11edd70570e7eb1a Mon Sep 17 00:00:00 2001 From: Chelsea Wang <98237975+chwawa@users.noreply.github.com> Date: Tue, 21 Nov 2023 15:00:47 -0500 Subject: [PATCH 45/70] Update User_Experience.md quick fix: added link to table of contents --- Topics/User_Experience.md | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/Topics/User_Experience.md b/Topics/User_Experience.md index 6733427ab..9afcada21 100644 --- a/Topics/User_Experience.md +++ b/Topics/User_Experience.md @@ -4,16 +4,17 @@ ## Table of Contents 1. [Overview](https://learning-software-engineering.github.io/Topics/User_Experience.html#overview) 2. [Fundamentals of User Experience](https://learning-software-engineering.github.io/Topics/User_Experience.html#fundamentals-of-user-experience) + - [User-Friendly Search Algorithms](https://learning-software-engineering.github.io/Topics/User_Experience.html#user-friendly-search-algorithms) - [User Research](https://learning-software-engineering.github.io/Topics/User_Experience.html#user-research) - [Visual Elements of User Interface Design](https://learning-software-engineering.github.io/Topics/User_Experience.html#visual-elements-of-user-interface-design) - [User Experience Principles](https://learning-software-engineering.github.io/Topics/User_Experience.html#user-experience-principles) - [Site mapping, Wireframing, and Prototyping](https://learning-software-engineering.github.io/Topics/User_Experience.html#site-mapping-wireframing-and-prototyping) - [Accessibility](https://learning-software-engineering.github.io/Topics/User_Experience.html#accessibility) -3. [Helpful Courses](https://learning-software-engineering.github.io/Topics/User_Experience.html#helpful-courses) -4. [Tools Used in User Experience Design](https://learning-software-engineering.github.io/Topics/User_Experience.html#tools-used-in-user-experience-design) +4. [Helpful Courses](https://learning-software-engineering.github.io/Topics/User_Experience.html#helpful-courses) +5. [Tools Used in User Experience Design](https://learning-software-engineering.github.io/Topics/User_Experience.html#tools-used-in-user-experience-design) - [Design Tools](https://learning-software-engineering.github.io/Topics/User_Experience.html#design-tools) - [UI Component Libraries](https://learning-software-engineering.github.io/Topics/User_Experience.html#ui-component-libraries) -5. [User Experience-Oriented Games](https://learning-software-engineering.github.io/Topics/User_Experience.html#user-experience-oriented-games) +6. [User Experience-Oriented Games](https://learning-software-engineering.github.io/Topics/User_Experience.html#user-experience-oriented-games) # Overview From 024dae5d1f830d9e5896930172ae3b772c4888e3 Mon Sep 17 00:00:00 2001 From: K M Crawford Date: Tue, 21 Nov 2023 16:55:23 -0500 Subject: [PATCH 46/70] Update React.md --- Topics/Tech_Stacks/React.md | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/Topics/Tech_Stacks/React.md b/Topics/Tech_Stacks/React.md index f2a1a3c08..7cedffa49 100644 --- a/Topics/Tech_Stacks/React.md +++ b/Topics/Tech_Stacks/React.md @@ -1,7 +1,7 @@ ## Tech Stacks ### React Overview -React is an open-source JavaScript library for building component-based user interfaces. This component-based architecture allows engineers to quickly prototype and develop complex applications easily by modularizing common functionalities into discrete, reusable UI **s, and React boasts a large user base full of freely available components libraries. Beyond this, React utilizes a virtual DOM, JSX, React Native, and much more -- so much more that it can be [overwhelming](https://auth0.com/blog/how-to-manage-javascript-fatigue/). +React is an open-source JavaScript library for building component-based user interfaces. This component-based architecture allows engineers to quickly prototype and develop complex applications easily by modularizing common functionalities into discrete, reusable UI **s, and React boasts a large user base full of freely available components libraries. Beyond this, React there's much more to learn about React, such as its virtual DOM, JSX, and full mobile framework in React Native, and much more -- so much more that it can be [overwhelming](https://auth0.com/blog/how-to-manage-javascript-fatigue/). To help ease the learning curve, below you'll find a variety of resources to reference while learning and components and libraries to use with React. @@ -10,6 +10,9 @@ To help ease the learning curve, below you'll find a variety of resources to ref [Full-Stack Open](https://fullstackopen.com/) A full, free course provided by the University of Helsinki that teaches the MERN (MongoDB, Express, React, NodeJS) stack. It also covers TypeScript, GraphQL, React Native, and some CI/CD. An excellent resource for React beginners. +[React Documentation](https://react.dev/) +The official React documentation is a great way to get started with the library, but also indispensible to have bookmarked for reference. + [Coursera Learn React Basics](https://www.coursera.org/learn/react-basics) A free course provided by Coursera that covers the basics of React, including State, navigation, and taking user input via forms. @@ -21,16 +24,16 @@ Basic React tutorial provided by the official React website. This tutorial will [React JS Crash Course](https://www.youtube.com/watch?v=w7ejDZ8SWv8) [One Hour React Tutorial](https://www.youtube.com/watch?v=b9eMGE7QtTk) -One hour in-depth tutorials about React. These Youtube crash course provides a great overview of React and various important components that you will be using often. Very useful if you are learning React under a strict time limit for whatever reason. +One hour quickstart tutorials about React. These YouTube crash course provides a great overview of React and various important components that you will be using often. Very useful if you are learning React under a strict time limit for whatever reason. [Front-End Mentor](https://www.frontendmentor.io/) These frontend challenges for HTML, CSS and JavaScript will help you review core skills while also making interesting projects. [Mozilla React Tutorial](https://developer.mozilla.org/en-US/docs/Learn/Tools_and_testing/Client-side_JavaScript_frameworks/React_getting_started) -React tutorial by MDN Web Docs. Useful readings for if you have time, but not necessary by any means. +React tutorial by MDN Web Docs. Useful readings for if you have time. [Microsoft JavaScript Tutorial](https://learn.microsoft.com/en-us/windows/dev-environment/javascript/) -Javascript frameworks tutorial provided by Microsoft. Useful readings, but not necessary to learn React. +JavaScript frameworks tutorial provided by Microsoft. Useful readings, but not necessary to learn React. ### Useful React Tools and Libraries From bac411b37000a3d0102e6fb02697cf17507f2978 Mon Sep 17 00:00:00 2001 From: K M Crawford Date: Tue, 21 Nov 2023 16:56:21 -0500 Subject: [PATCH 47/70] Update React.md --- Topics/Tech_Stacks/React.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Topics/Tech_Stacks/React.md b/Topics/Tech_Stacks/React.md index 7cedffa49..e17ad053d 100644 --- a/Topics/Tech_Stacks/React.md +++ b/Topics/Tech_Stacks/React.md @@ -1,7 +1,7 @@ ## Tech Stacks ### React Overview -React is an open-source JavaScript library for building component-based user interfaces. This component-based architecture allows engineers to quickly prototype and develop complex applications easily by modularizing common functionalities into discrete, reusable UI **s, and React boasts a large user base full of freely available components libraries. Beyond this, React there's much more to learn about React, such as its virtual DOM, JSX, and full mobile framework in React Native, and much more -- so much more that it can be [overwhelming](https://auth0.com/blog/how-to-manage-javascript-fatigue/). +React is an open-source JavaScript library for building component-based user interfaces. This component-based architecture allows engineers to quickly prototype and develop complex applications easily by modularizing common functionalities into discrete, reusable UI components, and React boasts a large user base full of freely available components libraries. Beyond this, React there's much more to learn about React, such as its virtual DOM, JSX, and full mobile framework in React Native, and much more -- so much more that it can be [overwhelming](https://auth0.com/blog/how-to-manage-javascript-fatigue/). To help ease the learning curve, below you'll find a variety of resources to reference while learning and components and libraries to use with React. From 9c4bfae060541964f15f4d143ce8ec87f503d26f Mon Sep 17 00:00:00 2001 From: K M Crawford Date: Tue, 21 Nov 2023 16:56:41 -0500 Subject: [PATCH 48/70] Update React.md --- Topics/Tech_Stacks/React.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Topics/Tech_Stacks/React.md b/Topics/Tech_Stacks/React.md index e17ad053d..4358b6135 100644 --- a/Topics/Tech_Stacks/React.md +++ b/Topics/Tech_Stacks/React.md @@ -1,7 +1,7 @@ ## Tech Stacks ### React Overview -React is an open-source JavaScript library for building component-based user interfaces. This component-based architecture allows engineers to quickly prototype and develop complex applications easily by modularizing common functionalities into discrete, reusable UI components, and React boasts a large user base full of freely available components libraries. Beyond this, React there's much more to learn about React, such as its virtual DOM, JSX, and full mobile framework in React Native, and much more -- so much more that it can be [overwhelming](https://auth0.com/blog/how-to-manage-javascript-fatigue/). +React is an open-source JavaScript library for building component-based user interfaces. This component-based architecture allows engineers to quickly prototype and develop complex applications easily by modularizing common functionalities into discrete, reusable UI components, and React boasts a large user base full of freely available components libraries. Beyond this, React there's much more to learn about React, such as its virtual DOM, JSX, and a full mobile framework in React Native, and much more -- so much more that it can be [overwhelming](https://auth0.com/blog/how-to-manage-javascript-fatigue/). To help ease the learning curve, below you'll find a variety of resources to reference while learning and components and libraries to use with React. From 0c81f554ab9c892f7f978ca071030ca610e093af Mon Sep 17 00:00:00 2001 From: ak-james1 <95581896+ak-james1@users.noreply.github.com> Date: Tue, 21 Nov 2023 18:58:15 -0500 Subject: [PATCH 49/70] Create navigation design in complex websites.md --- Topics/User_Experience/navigation design in complex websites.md | 1 + 1 file changed, 1 insertion(+) create mode 100644 Topics/User_Experience/navigation design in complex websites.md diff --git a/Topics/User_Experience/navigation design in complex websites.md b/Topics/User_Experience/navigation design in complex websites.md new file mode 100644 index 000000000..8b1378917 --- /dev/null +++ b/Topics/User_Experience/navigation design in complex websites.md @@ -0,0 +1 @@ + From 0a73109a7a0e7712b4acdcf0626e18c6892f7bac Mon Sep 17 00:00:00 2001 From: ak-james1 <95581896+ak-james1@users.noreply.github.com> Date: Tue, 21 Nov 2023 19:00:46 -0500 Subject: [PATCH 50/70] Update navigation design in complex websites.md --- .../navigation design in complex websites.md | 31 +++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/Topics/User_Experience/navigation design in complex websites.md b/Topics/User_Experience/navigation design in complex websites.md index 8b1378917..454988308 100644 --- a/Topics/User_Experience/navigation design in complex websites.md +++ b/Topics/User_Experience/navigation design in complex websites.md @@ -1 +1,32 @@ +## What is Navigation Design ? +Navigation Design, also referred to as menu design, helps users to easily move through the pages of your website. It utilizes design techniques to allow ease of navigation and provide the user a better sure experience. + +## Good vs Bad Navigation Design + + + + + + +Please see the link below for more navigation design patterns: +https://ui-patterns.com/patterns/navigation/list + + + + +## Advantages of Good Navigation Design for Complex Websites + + + + +## Key Things to Consider for Navigation Design of Complex Websites + + +## Summary/ How is this relevant to CSC301 ? + + +## Resources +https://www.uxtweak.com/ux-glossary/navigation-design/ +https://getdevdone.com/blog/the-good-the-bad-and-the-best-in-website-navigation.html +https://www.w3.org/WAI/tutorials/menus/ From 7d3f90f3d678d59962622f032c0e7d3f7dbd36ac Mon Sep 17 00:00:00 2001 From: ak-james1 <95581896+ak-james1@users.noreply.github.com> Date: Tue, 21 Nov 2023 19:04:31 -0500 Subject: [PATCH 51/70] Update navigation design in complex websites.md complete first draft o navigation design for complex websites / web apps --- .../navigation design in complex websites.md | 64 ++++++++++++++----- 1 file changed, 48 insertions(+), 16 deletions(-) diff --git a/Topics/User_Experience/navigation design in complex websites.md b/Topics/User_Experience/navigation design in complex websites.md index 454988308..4f1e38e21 100644 --- a/Topics/User_Experience/navigation design in complex websites.md +++ b/Topics/User_Experience/navigation design in complex websites.md @@ -1,32 +1,64 @@ - ## What is Navigation Design ? Navigation Design, also referred to as menu design, helps users to easily move through the pages of your website. It utilizes design techniques to allow ease of navigation and provide the user a better sure experience. -## Good vs Bad Navigation Design - - - - - - -Please see the link below for more navigation design patterns: -https://ui-patterns.com/patterns/navigation/list +## Good vs Bad Navigation Design +Good navigation design allows for ease of finding information, is intuitive and easy to use. On the other hand, bad navigation design can overwhelm the user and make finding important content difficult. As a result, it is important to keep the user in mind when designing the navigation of a website, especially complex websites with a multitude of pages. Reasoning about how the user can navigate through the many pages of a website, can help lay the foundation to good navigation design. + +Consider using the following steps to start thinking of good navigation design : + +1. Layout all the pages on your website whether on paper of through a design tool such as Figma +2. Find the relevant ways a user may navigate through those pages + 1. For example, home page to sign in back to home page +3. Determine which pages they user may need to reference most often + 2. For example, the home page / landing page, +4. Consider using dome of the following to ease navigation through the website : + * Navbars + * Usually at the top of a landing page / home page. These contain links to the website's main pages. + * Sub-navbars + * Located below a normal Navbar and consists of links that are relevant to the specific page that the user is on + * Side menus + * Usually located at the side of the page and contains links to relevant pages on the website + * Tabbed menus + * Organizes information into different tabs, where each tab contains different relevant information + * Footers containing links to all relevant pages within your website + * Usually at the bottom of a page. It can contain links to all pages on the website as well as contact information. + +* Please see the link below for more navigation design patterns: + * [https://ui-patterns.com/patterns/navigation/list](https://ui-patterns.com/patterns/navigation/list) + +## Advantages of Good Navigation Design for Complex Websites +* Good navigation design allows a clear or intuitive path for users to navigate through the web app / website +* Increases usability + * A good navigation design allows users to easily find the content that they need in a timely manner +* Increases user satisfaction + * Users are less likely to become frustrated navigating the app if there is a clear navigation system -## Advantages of Good Navigation Design for Complex Websites +* An easy/ clear path through a website to specific content, can be an advantage in encouraging users to use your product - + ## Key Things to Consider for Navigation Design of Complex Websites - +* Accessibility + * Additional tips on designing accessible menus/ navigation. + * Click Here [[https://www.w3.org/WAI/tutorials/menus/](https://www.w3.org/WAI/tutorials/menus/)] +* Important links should be kept in navigation menus / nav bars +* Different screen sizes may require varying navigation designs + * For example, desktops with navbars vs mobile devices with sidebar menus +* Is it easy to navigate through the main pages of my website ? + ## Summary/ How is this relevant to CSC301 ? +When designing a website / web app, it is important to consider how a user will navigate through the website’s main pages. Complex websites are especially hard to navigate with poorly designed navigation systems. To ensure that the user has a great experience, it is important to consider the key points above and their advantages. ## Resources -https://www.uxtweak.com/ux-glossary/navigation-design/ -https://getdevdone.com/blog/the-good-the-bad-and-the-best-in-website-navigation.html -https://www.w3.org/WAI/tutorials/menus/ + +[https://www.uxtweak.com/ux-glossary/navigation-design/](https://www.uxtweak.com/ux-glossary/navigation-design/) + +[https://getdevdone.com/blog/the-good-the-bad-and-the-best-in-website-navigation.html](https://getdevdone.com/blog/the-good-the-bad-and-the-best-in-website-navigation.html) + +[https://www.w3.org/WAI/tutorials/menus/](https://www.w3.org/WAI/tutorials/menus/) From 859d9bf846d3e8d6a259a232e33042b7e9561519 Mon Sep 17 00:00:00 2001 From: ak-james1 <95581896+ak-james1@users.noreply.github.com> Date: Tue, 21 Nov 2023 19:05:44 -0500 Subject: [PATCH 52/70] Update navigation design in complex websites.md --- Topics/User_Experience/navigation design in complex websites.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Topics/User_Experience/navigation design in complex websites.md b/Topics/User_Experience/navigation design in complex websites.md index 4f1e38e21..aa2d32ac2 100644 --- a/Topics/User_Experience/navigation design in complex websites.md +++ b/Topics/User_Experience/navigation design in complex websites.md @@ -44,7 +44,7 @@ Consider using the following steps to start thinking of good navigation design ## Key Things to Consider for Navigation Design of Complex Websites * Accessibility * Additional tips on designing accessible menus/ navigation. - * Click Here [[https://www.w3.org/WAI/tutorials/menus/](https://www.w3.org/WAI/tutorials/menus/)] + * [Click Here](https://www.w3.org/WAI/tutorials/menus/) * Important links should be kept in navigation menus / nav bars * Different screen sizes may require varying navigation designs * For example, desktops with navbars vs mobile devices with sidebar menus From 08a9f213b0854ffcd99a247cae81da7ad955aa98 Mon Sep 17 00:00:00 2001 From: cassandratin13 <113074772+cassandratin13@users.noreply.github.com> Date: Tue, 21 Nov 2023 19:13:32 -0500 Subject: [PATCH 53/70] Add more resources for General steps on Mobile-First_Design.md Added 2 links for steps 1 and 2 on how to accomplish mobile-first design. I found that these resources were sufficient in explaining how to execute each step, so I didn't include my own description, since it could've made the document a bit too drawn out and long. --- Topics/User_Experience/Mobile-First_Design.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/Topics/User_Experience/Mobile-First_Design.md b/Topics/User_Experience/Mobile-First_Design.md index b38ae0502..8cda63ab9 100644 --- a/Topics/User_Experience/Mobile-First_Design.md +++ b/Topics/User_Experience/Mobile-First_Design.md @@ -36,10 +36,12 @@ The reasoning behind this strategy is to promote _progressive enhancement_ — t * Plan out all the content and elements you need for your web pages * This can be written out on a spreadsheet (Microsoft Excel, Google spreadsheets, etc.), or any text editor * The choice of which platform to use is up to you, but a spreadsheet is recommended for easy organization — here’s an example: https://maadmob.com.au/resources/content_inventory + * Here are some more details about how to execute this step: https://www.uxpin.com/studio/blog/content-inventory/ 2. Visual hierarchy * Create a priority list of all the visuals you will include on the page, taking into consideration the size of images, colours, and typography, as these properties can guide the user’s eye to understand the relative significance of the elements * As with step 1, this can be done on a spreadsheet or any text editor — the purpose is just to help you plan out the content you’ll need and their importance, which will make designing the actual page easier and ensure most, if not all, of the content is not overlooked - * If you find that you need to visualize the content more, you could make a small prototype of some of the features using Figma, Canva, Google Drawings/Slides, etc. + * If you find that you need to visualize the content more, you could make a small prototype of some of the features using Figma, Canva, Google Drawings/Slides, etc. + * Here are some more details about how to execute this step: https://www.mockplus.com/blog/post/ui-visual-hierarchy 3. Design from smallest to largest screens * Create designs for the mobile version first, then tablet, then finally desktop * These designs can be made on Figma, Canva, Google Drawings/Slides, or whatever design tool that will help you plan out the exact format of your page From 401d72893d053de792c6f896ecda6ebf5afa67f4 Mon Sep 17 00:00:00 2001 From: Umair-H <93732264+Umair-H@users.noreply.github.com> Date: Tue, 21 Nov 2023 19:24:50 -0500 Subject: [PATCH 54/70] Rename Topics/Product_Management.md to Topics/Product_Management/Product_Management.md --- Topics/{ => Product_Management}/Product_Management.md | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename Topics/{ => Product_Management}/Product_Management.md (100%) diff --git a/Topics/Product_Management.md b/Topics/Product_Management/Product_Management.md similarity index 100% rename from Topics/Product_Management.md rename to Topics/Product_Management/Product_Management.md From 3a43d7c513d535d0956573ae0e35bc513feaddb6 Mon Sep 17 00:00:00 2001 From: Eric <37644716+ericjest@users.noreply.github.com> Date: Tue, 21 Nov 2023 20:49:28 -0500 Subject: [PATCH 55/70] Add more explanation on Approach 1 --- Topics/System_Design/Twitter_System_Design.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Topics/System_Design/Twitter_System_Design.md b/Topics/System_Design/Twitter_System_Design.md index 0f898c13e..3482c234e 100644 --- a/Topics/System_Design/Twitter_System_Design.md +++ b/Topics/System_Design/Twitter_System_Design.md @@ -41,7 +41,7 @@ JOIN follows ON follows_id = users.id WHERE follower_id = current_user.id; ``` -You can quickly see how this approach became quite slow at over 300K QPS. +You can quickly see how JOINing all Tweets with all Users and all follow relationships became quite slow at over 300K QPS. ## Approach 2: Caching As a result, Twitter implemented a fan-out caching system. They stored a [Redis list](https://redis.io/docs/data-types/lists/) for each user containing the Tweets to display on each user's home timeline (Redis is an in-memory data store. For more info on Twitter's use of Redis, [see here](http://highscalability.com/blog/2014/9/8/how-twitter-uses-redis-to-scale-105tb-ram-39mm-qps-10000-ins.html)). Let's illustrate this with an example. Say that Darth Palpatine is followed by Anakin Skywalker, Obi-Wan, and Padme Amidala. When Darth Palpatine posts a Tweet, Twitter's fan-out service pushes the new Tweet to the Redis cache for each user that follows Darth Palpatine (Anakin, Obi-Wan, and Padme). This way, when Anakin (for example) loads his timeline page, his Tweets are cached in Redis and can be retrieved in constant runtime (in this simplified example). From 83ee1597dfdbe67fc2f0bf059e76468a7dfbbe2f Mon Sep 17 00:00:00 2001 From: Eric <37644716+ericjest@users.noreply.github.com> Date: Tue, 21 Nov 2023 21:00:38 -0500 Subject: [PATCH 56/70] Add more explanation to the hybrid approach --- Topics/System_Design/Twitter_System_Design.md | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/Topics/System_Design/Twitter_System_Design.md b/Topics/System_Design/Twitter_System_Design.md index 3482c234e..567f88f5d 100644 --- a/Topics/System_Design/Twitter_System_Design.md +++ b/Topics/System_Design/Twitter_System_Design.md @@ -54,7 +54,11 @@ The below system diagram presents a simplified version of this architecture. Not ## A Third Twist: the Hybrid Approach The caching approach worked for accounts with a reasonable number of followers. Assuming an average follower count of 100 and 4.6k Tweets per second (based on November 2012 data), this translated to 460k writes per second to the Redis cluster. -However, for celebrity accounts with huge numbers of followers, this was not performant. A Tweet from Lebron James, who has 50 million followers as of 2023, would result in over 50 million writes at once. In this scenario, the caching approach was not feasible given Twitter's goal of delivering Tweets within 5 seconds. As a result, Twitter implemented a hybrid approach, where most new Tweets were cached (using approach 2) while Tweets from accounts with large followings were queried at runtime (like approach 1) and merged chronologically with the Tweet cache. +However, for celebrity accounts with huge numbers of followers, this was not performant. A Tweet from Lebron James, who has 50 million followers as of 2023, would result in over 50 million writes at once. In this scenario, the caching approach was not feasible given Twitter's goal of delivering Tweets within 5 seconds. As a result, Twitter implemented a hybrid approach, where most new Tweets were cached (using Approach 2) while Tweets from accounts with large followings were queried at runtime (like Approach 1) and merged chronologically with the Tweet cache. + +To understand why the hybrid approach is better, we can broadly think about the advantages and disadvantages of Approach 1 and 2. Approach 1's complexity increases as the size of our Users, Tweets, and Followers tables gets really large. However, the catch is that Twitter users don't really follow millions of users so we only have to consider Users and Tweets. Approach 2's complexity increases based on how many accounts follow you. We've established that Approach 2 isn't the best with celebrities. + +Now let's consider the benefits of the hybrid approach over Approach 1. We can create tables CelebrityTweets and CelebrityUsers. When a user queries their homepage, we get from the Redis cache in O(1) runtime. Then we JOIN CelebrityTweets and CelebrityUsers to get any Tweets from celebrity accounts they might follow. Note that the size of CelebrityTweets and CelebrityUsers is quite limited relatively (compared to our original approach). Of course, given the popularity of Twitter, this hybrid approach might still have scalability issues. But the point of this case study is that the hybrid approach is much better than using Approach 1. The exact implementation of this hybrid approach is beyond the scope of this article. However, this case study of Twitter illustrates some of the complexities systems encounter at massive scale. It also demonstrates how we should consider our goals (i.e. high availability) and use case (i.e. accounts with millions of followers) when designing systems. From fdbd6bb4e4e7bdf5f2c4327d49ff99476e26dc08 Mon Sep 17 00:00:00 2001 From: Eric <37644716+ericjest@users.noreply.github.com> Date: Tue, 21 Nov 2023 21:22:37 -0500 Subject: [PATCH 57/70] Use SQL schema image and create assets dir --- Topics/System_Design/Twitter_System_Design.md | 23 ++---------------- Topics/System_Design/assets/schema.png | Bin 0 -> 59407 bytes Topics/System_Design/{ => assets}/twitter.png | Bin 3 files changed, 2 insertions(+), 21 deletions(-) create mode 100644 Topics/System_Design/assets/schema.png rename Topics/System_Design/{ => assets}/twitter.png (100%) diff --git a/Topics/System_Design/Twitter_System_Design.md b/Topics/System_Design/Twitter_System_Design.md index 567f88f5d..126823133 100644 --- a/Topics/System_Design/Twitter_System_Design.md +++ b/Topics/System_Design/Twitter_System_Design.md @@ -12,26 +12,7 @@ In conjunction with this scale, Raffi Krikorian notes in his [QCon Talk](https:/ ## Approach 1: Naive SQL Query Below is a simplified SQL schema of Twitter's data model. -**tweets** -| id | author_id | content | -|----------|:-------------:|------:| -| 38927 | 1 | "Did you ever hear the tragedy of Darth Plagueis The Wise? I thought not." | -| 38928 | 2 | "I hate sand." | -| 38929 | 3 | "You were my brother Anakin!" | - -**users** -| id | username | bio | -|----------|:-------------:|------:| -| 1 | darth-palpatine | Unlimited Power! | -| 2 | anakin-skywalker | The Jedi are Evil | -| 3 | obi-wan | Hello there | - -**follows** -| follower_id | follows_id | -|----------|:-------------:| -| 2 | 1 | -| 2 | 3 | -| 1 | 2 | +![An example SQL schema for Twitter](./assets/schema.png) Twitter's initial naive approach was to join the Tweet, User, and Follows tables in SQL upon a GET request from a client like so: ``` @@ -48,7 +29,7 @@ As a result, Twitter implemented a fan-out caching system. They stored a [Redis The below system diagram presents a simplified version of this architecture. Note that several things are omitted for simplicity; for example the load balancer that receives the POST request from the client. Also note that the Redis Cluster is presented as one node in the diagram. In reality, a Redis Cluster (as the word "cluster" suggests) consists of lots of distributed Redis databases. In addition, Twitter (as of 2012) stores three copies of each Tweet across different Redis nodes to ensure system resilience and availability (as in a huge system like Twitter, nodes can frequently crash and become unavailable). -![Twitter's Caching Approach](twitter.png) +![Twitter's Caching Approach](./assets/twitter.png) *A system diagram of Twitter's caching approach for home timelines.* ## A Third Twist: the Hybrid Approach diff --git a/Topics/System_Design/assets/schema.png b/Topics/System_Design/assets/schema.png new file mode 100644 index 0000000000000000000000000000000000000000..243adbfe69b43ac180264136f8922c1412154735 GIT binary patch literal 59407 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

&~5q92ECv@3NvSkf2INu08#4OEyb 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%0Db$Vr`%rV*h?Dr8G`1TLj-UolEI4ACG$kIUu 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 literal 0 HcmV?d00001 diff --git a/Topics/System_Design/twitter.png b/Topics/System_Design/assets/twitter.png similarity index 100% rename from Topics/System_Design/twitter.png rename to Topics/System_Design/assets/twitter.png From 35e27c1bb0ab0093abec41fab07d79bb8b0507f1 Mon Sep 17 00:00:00 2001 From: MalHus Date: Tue, 21 Nov 2023 21:45:05 -0500 Subject: [PATCH 58/70] rephrased and added more information --- Topics/Software_Engineering/Sprint Planning Meeting.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Topics/Software_Engineering/Sprint Planning Meeting.md b/Topics/Software_Engineering/Sprint Planning Meeting.md index 1a8284352..a21c250ef 100644 --- a/Topics/Software_Engineering/Sprint Planning Meeting.md +++ b/Topics/Software_Engineering/Sprint Planning Meeting.md @@ -1,7 +1,7 @@ # Sprint Planning Meeting ## Introduction -In the Scrum framework, sprints function as short, consistent cycles during which a set amount of work is completed. Since they are the heartbeat of the framework, ensuring sprints are well planned, or ensuring a successful Sprint Planning Meeting, is a crucial part of the framework. +In the Scrum framework, sprints function as short, consistent cycles during which a set amount of work is completed. Since they are the heartbeat of the framework, ensuring sprints are well planned, or ensuring a successful Sprint Planning Meeting, is a crucial part of the framework especially in large teams where effective coordination and communication are key. ## What does a Sprint Planning Meeting Encompass? @@ -16,7 +16,7 @@ In the Scrum framework, sprints function as short, consistent cycles during whic * The planning addresses the value the sprint can bring to the stakeholders and the team collaborates to define a **Sprint Goal** before the end of the Sprint Planning meeting. * Upon discussion with the Product Owner, the developers select items from the Product Backlog to include in the **Sprint Backlog** and determine this based on their prior and future Sprint performance. * For each Sprint Backlog item that is selected, the developers on the team decide how to break down and complete tasks for the sprint based on the team’s definition of “Done”. - +* Disagreements are resolved through open communication and consensus-seeking and facilitated by the ScrumMaster to ensure discussions stay within the sprint's topic. ## Integrating Sprint Planning Meetings in CSC301 *Consider an example of how a Scrum Planning Meeting can be integrated into our course’s workflow.* @@ -27,12 +27,12 @@ After a Product Manager and Scrum Master are chosen in Deliverable 1, consider e ### During the Planning Meeting: Start by reminding the team of the upcoming Deliverable and review the definition of “Done”, which in this case would be meeting both the rubric and your partner's requirements. As a team, take this opportunity to brainstorm more tasks that need to be completed based on what your partner has asked and add them into the Product Backlog list. -Discuss how much time would be needed for each Product Backlog item listed on Jira and based on this estimate, determine items for the Sprint Backlog. Following, select items from the Product Backlog and add them into the Sprint Backlog, allow team members to assign themselves to sprint tasks (including yourself) and discuss any further action items as a team. +Discuss how much time would be needed for each Product Backlog item listed on Jira and based on this estimate, determine items for the Sprint Backlog. Following, select items from the Product Backlog and add them into the Sprint Backlog, allow team members to assign themselves to sprint tasks (including yourself) and discuss any further action items as a team. During this time, if any conflicts arise (for example, disagrements on which tasks to complete for the upcoming sprint or the estimated time for a particular task), the Product Manager should act as a facilitator and the ScrumMaster should encourage an inclusive environment where team members actively listen to each other's opinions. Once the Sprint Backlog items are finalized, as the ScrumMaster, call for a group consensus on the plan and conclude the meeting. ## Key Takeaway -The Sprint Planning Meeting lays the foundation for the sprint, helps the team understand their tasks and sets the stage for effective Scrum meetings in the weeks ahead. This meeting ensures everyone is aligned and ready for the work to come, making future collaborations smoother and more productive. +The Sprint Planning Meeting lays the foundation for the sprint, helps the team understand their tasks and sets the stage for effective Scrum meetings in the weeks ahead. This meeting ensures everyone is aligned on deadlines and tasks, making future collaborations smoother and more productive. ## Resources - [What is Sprint Planning](https://www.scrum.org/resources/what-is-sprint-planning) From 4e99801b8a8440d7b0ec8055a3ed392e0959dc60 Mon Sep 17 00:00:00 2001 From: ak-james1 <95581896+ak-james1@users.noreply.github.com> Date: Wed, 22 Nov 2023 00:36:29 -0500 Subject: [PATCH 59/70] Update and rename navigation design in complex websites.md to Navigation design in complex websites.md made requested changes / updates --- .../Navigation design in complex websites.md | 72 +++++++++++++++++++ .../navigation design in complex websites.md | 64 ----------------- 2 files changed, 72 insertions(+), 64 deletions(-) create mode 100644 Topics/User_Experience/Navigation design in complex websites.md delete mode 100644 Topics/User_Experience/navigation design in complex websites.md diff --git a/Topics/User_Experience/Navigation design in complex websites.md b/Topics/User_Experience/Navigation design in complex websites.md new file mode 100644 index 000000000..9944f241d --- /dev/null +++ b/Topics/User_Experience/Navigation design in complex websites.md @@ -0,0 +1,72 @@ +## What is Navigation Design ? +Navigation Design, also referred to as menu design, helps users to easily move through the pages of your website. It utilizes design techniques to allow ease of navigation and provide the user a better user experience. + + +## Good vs Bad Navigation Design +Good navigation design allows the ease of finding information and is intuitive and easy to use. On the other hand, bad navigation design can overwhelm the user and make finding important content difficult. As a result, it is important to keep the user in mind when designing the navigation of a website, especially complex websites with a multitude of pages. Reasoning about how the user can navigate through the many pages of a website, can help lay the foundation to good navigation design. + +Consider using the following steps to start thinking of good navigation design : + +1. Layout all the pages on your website .whether on paper of through a design tool such as Figma + * This can be done on paper or through a design tool such as Figma + +2. Find relevant ways a user may navigate through those pages + * For example, home page to sign in back to home page + * Additihnally, consider using prototyping or wireframing to give yourself a clearer picture on how the user may naviage through your website + +3. Determine which pages the user may need to reference most often + * For example, the home page / landing page is usually referenced a lot by the user. + +4. Consider using some of the following to ease navigation through the website : + * Navbars + * Usually at the top of a landing page / home page. These contain links to the website's main pages. + * Side menus + * Usually located at the side of the page and contains links to relevant pages on the website + * Tabbed menus + * Organizes information into different tabs, where each tab contains different relevant information + * Footers containing links to all relevant pages within your website + * Usually at the bottom of a page. It can contain links to all pages on the website as well as contact information. + +5. Consider how the user may navigate through the content on a single page. + * Sub-navbars can be utilized. + * Located below a normal Navbar and consists of links that are relevant to the specific page that the user is on + * If there is searchable / filterable content on this page, consider using icons that are easily identifiable by the user as search ( magnifying glass) or filter. + +* Please see the link below for more navigation design patterns: + * [https://ui-patterns.com/patterns/navigation/list](https://ui-patterns.com/patterns/navigation/list) + + +## Advantages of Good Navigation Design for Complex Websites + +* Good navigation design allows a clear or intuitive path for users to navigate through the web app / website + * For example, an easy/ clear path through a website to specific content, may encourage users to use your product. +* Increases usability + * A good navigation design allows users to easily find the content that they need in a timely manner . +* Increases user satisfaction + * Users are less likely to become frustrated navigating a website or webapp if there is a clear navigation system. + + + +## Key Things to Consider for Navigation Design of Complex Websites +* Accessibility + * Additional tips on designing accessible menus/ navigation. + * [Click Here](https://www.w3.org/WAI/tutorials/menus/) +* Important links should be kept in navigation menus / nav bars +* Different screen sizes may require varying navigation designs + * For example, desktops with navbars vs mobile devices with sidebar menus +* Is it easy to navigate through the main pages of my website ? + * A good way to determine this, is to run through your website before project completion. Navigate the website as a user while looking for any pitfalls that users may notice but you did not as a developer. + + +## Summary + +When designing a website / web app, it is important to consider how a user will navigate through the website’s many pages. Complex websites are especially hard to navigate with poorly designed navigation systems. To ensure that the user has a great experience, it is important to consider the key points above and their advantages. + + +## Resources + +[https://www.uxtweak.com/ux-glossary/navigation-design/](https://www.uxtweak.com/ux-glossary/navigation-design/) + +[https://getdevdone.com/blog/the-good-the-bad-and-the-best-in-website-navigation.html](https://getdevdone.com/blog/the-good-the-bad-and-the-best-in-website-navigation.html) + +[https://www.w3.org/WAI/tutorials/menus/](https://www.w3.org/WAI/tutorials/menus/) diff --git a/Topics/User_Experience/navigation design in complex websites.md b/Topics/User_Experience/navigation design in complex websites.md deleted file mode 100644 index aa2d32ac2..000000000 --- a/Topics/User_Experience/navigation design in complex websites.md +++ /dev/null @@ -1,64 +0,0 @@ -## What is Navigation Design ? -Navigation Design, also referred to as menu design, helps users to easily move through the pages of your website. It utilizes design techniques to allow ease of navigation and provide the user a better sure experience. - - -## Good vs Bad Navigation Design -Good navigation design allows for ease of finding information, is intuitive and easy to use. On the other hand, bad navigation design can overwhelm the user and make finding important content difficult. As a result, it is important to keep the user in mind when designing the navigation of a website, especially complex websites with a multitude of pages. Reasoning about how the user can navigate through the many pages of a website, can help lay the foundation to good navigation design. - -Consider using the following steps to start thinking of good navigation design : - -1. Layout all the pages on your website whether on paper of through a design tool such as Figma -2. Find the relevant ways a user may navigate through those pages - 1. For example, home page to sign in back to home page -3. Determine which pages they user may need to reference most often - 2. For example, the home page / landing page, -4. Consider using dome of the following to ease navigation through the website : - * Navbars - * Usually at the top of a landing page / home page. These contain links to the website's main pages. - * Sub-navbars - * Located below a normal Navbar and consists of links that are relevant to the specific page that the user is on - * Side menus - * Usually located at the side of the page and contains links to relevant pages on the website - * Tabbed menus - * Organizes information into different tabs, where each tab contains different relevant information - * Footers containing links to all relevant pages within your website - * Usually at the bottom of a page. It can contain links to all pages on the website as well as contact information. - -* Please see the link below for more navigation design patterns: - * [https://ui-patterns.com/patterns/navigation/list](https://ui-patterns.com/patterns/navigation/list) - - -## Advantages of Good Navigation Design for Complex Websites - -* Good navigation design allows a clear or intuitive path for users to navigate through the web app / website -* Increases usability - * A good navigation design allows users to easily find the content that they need in a timely manner -* Increases user satisfaction - * Users are less likely to become frustrated navigating the app if there is a clear navigation system - -* An easy/ clear path through a website to specific content, can be an advantage in encouraging users to use your product - - - - -## Key Things to Consider for Navigation Design of Complex Websites -* Accessibility - * Additional tips on designing accessible menus/ navigation. - * [Click Here](https://www.w3.org/WAI/tutorials/menus/) -* Important links should be kept in navigation menus / nav bars -* Different screen sizes may require varying navigation designs - * For example, desktops with navbars vs mobile devices with sidebar menus -* Is it easy to navigate through the main pages of my website ? - - -## Summary/ How is this relevant to CSC301 ? - -When designing a website / web app, it is important to consider how a user will navigate through the website’s main pages. Complex websites are especially hard to navigate with poorly designed navigation systems. To ensure that the user has a great experience, it is important to consider the key points above and their advantages. - -## Resources - -[https://www.uxtweak.com/ux-glossary/navigation-design/](https://www.uxtweak.com/ux-glossary/navigation-design/) - -[https://getdevdone.com/blog/the-good-the-bad-and-the-best-in-website-navigation.html](https://getdevdone.com/blog/the-good-the-bad-and-the-best-in-website-navigation.html) - -[https://www.w3.org/WAI/tutorials/menus/](https://www.w3.org/WAI/tutorials/menus/) From 1f3524efc8838cc09515ae2e89aecf2ab1a3ff5d Mon Sep 17 00:00:00 2001 From: alessandromarmii <126909660+alessandromarmii@users.noreply.github.com> Date: Wed, 22 Nov 2023 11:31:26 -0500 Subject: [PATCH 60/70] Update Product_Management.md fixed typo, added examples of digital tools. --- Topics/Product_Management.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Topics/Product_Management.md b/Topics/Product_Management.md index 6e8a04f90..577303de0 100644 --- a/Topics/Product_Management.md +++ b/Topics/Product_Management.md @@ -23,7 +23,7 @@ Referencing this [article](https://curiouscore.com/resource/4-lessons-for-produc * To keep everyone in the loop about the project’s progress, Irene’s team held weekly 30-min calls so team members could align on the tasks they needed to complete, as well as identify any potential blockers. * Irene’s team was able to react swiftly and effectively to the changes brought on by COVID-19 by first reviewing an existing product roadmap they had, which allowed everyone on the team to have a common document for reference as they made their decisions and reviewed timelines. -Irene sees the pandemic as transformative, allowing unprecedented work flexibilit. She finds that the newly added option of working remotely adds value to her work and increases the potential of teams. She believes that by incorporating some of these strategies, many product managers will be able mirror her success. +Irene sees the pandemic as transformative, allowing unprecedented work flexibility. She finds that the newly added option of working remotely adds value to her work and increases the potential of teams. She believes that by incorporating some of these strategies, many product managers will be able mirror her success. #### Case Study 2 - Working Remotely: @@ -32,7 +32,7 @@ We now report the experience of several product managers working at TopTal remot Sam and Dave, succeeded at overcoming this new challenge by: * Established clear expectations and acknowledging diverse work cultures to build trust. -* Leveraged digital tools and adapting communication methodologies to maintain productivity and team unity. +* Leveraged digital tools (e.g. Trello, Basecamp, Jira) and adapting communication methodologies to maintain productivity and team unity. These product managers discovered, quite unexpectedly, that remote work — originally a necessity due to the crisis — offered unexpected advantages such as increased deep work and adaptability. This led to conversations about the sustained incorporation of remote work practices within product management. Such insights from the case study offer reassurance that thriving in a remote environment is entirely feasible for product managers. From bc76e0cb5ffa64a75d46eda9e749411e04fd88a5 Mon Sep 17 00:00:00 2001 From: ak-james1 <95581896+ak-james1@users.noreply.github.com> Date: Wed, 22 Nov 2023 14:02:37 -0500 Subject: [PATCH 61/70] Update Navigation design in complex websites.md Made requested changes and fixed small typos and formatting --- .../Navigation design in complex websites.md | 20 +++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/Topics/User_Experience/Navigation design in complex websites.md b/Topics/User_Experience/Navigation design in complex websites.md index 9944f241d..68536d1fc 100644 --- a/Topics/User_Experience/Navigation design in complex websites.md +++ b/Topics/User_Experience/Navigation design in complex websites.md @@ -3,34 +3,34 @@ Navigation Design, also referred to as menu design, helps users to easily move t ## Good vs Bad Navigation Design -Good navigation design allows the ease of finding information and is intuitive and easy to use. On the other hand, bad navigation design can overwhelm the user and make finding important content difficult. As a result, it is important to keep the user in mind when designing the navigation of a website, especially complex websites with a multitude of pages. Reasoning about how the user can navigate through the many pages of a website, can help lay the foundation to good navigation design. +Good navigation design allows the ease of finding information and is intuitive and easy to use. On the other hand, bad navigation design can overwhelm the user and make finding important content difficult. As a result, it is important to keep the user in mind when designing the navigation of a website, especially complex websites with a multitude of pages. In fact, reasoning about how the user can navigate through the many pages of a website and efficiently within a large page can help lay the foundation to good navigation design. Consider using the following steps to start thinking of good navigation design : -1. Layout all the pages on your website .whether on paper of through a design tool such as Figma - * This can be done on paper or through a design tool such as Figma +1. Layout all the pages on your website + * This can be done on paper or through a design tool such as Figma[https://www.figma.com/] 2. Find relevant ways a user may navigate through those pages - * For example, home page to sign in back to home page - * Additihnally, consider using prototyping or wireframing to give yourself a clearer picture on how the user may naviage through your website + * For example, home page → sign in → back to home page + * Additionally, consider using prototyping or wireframing to give yourself a clearer picture on how the user may navigate through your website 3. Determine which pages the user may need to reference most often * For example, the home page / landing page is usually referenced a lot by the user. 4. Consider using some of the following to ease navigation through the website : * Navbars - * Usually at the top of a landing page / home page. These contain links to the website's main pages. + * Usually at the top of a landing page / home page. These contain links to the website's main pages * Side menus * Usually located at the side of the page and contains links to relevant pages on the website * Tabbed menus * Organizes information into different tabs, where each tab contains different relevant information * Footers containing links to all relevant pages within your website - * Usually at the bottom of a page. It can contain links to all pages on the website as well as contact information. + * Usually at the bottom of a page. It can contain links to all pages on the website as well as contact information 5. Consider how the user may navigate through the content on a single page. - * Sub-navbars can be utilized. + * Sub-navbars can be utilized * Located below a normal Navbar and consists of links that are relevant to the specific page that the user is on - * If there is searchable / filterable content on this page, consider using icons that are easily identifiable by the user as search ( magnifying glass) or filter. + * If there is searchable / filterable content on this page, consider using icons that are easily identifiable by the user as search ( magnifying glass) or filter * Please see the link below for more navigation design patterns: * [https://ui-patterns.com/patterns/navigation/list](https://ui-patterns.com/patterns/navigation/list) @@ -41,7 +41,7 @@ Consider using the following steps to start thinking of good navigation design * Good navigation design allows a clear or intuitive path for users to navigate through the web app / website * For example, an easy/ clear path through a website to specific content, may encourage users to use your product. * Increases usability - * A good navigation design allows users to easily find the content that they need in a timely manner . + * A good navigation design allows users to easily find the content that they need in a timely manner. * Increases user satisfaction * Users are less likely to become frustrated navigating a website or webapp if there is a clear navigation system. From 754350ddb03aad8bc4f0f278ef9c5621be0c0bdb Mon Sep 17 00:00:00 2001 From: ak-james1 <95581896+ak-james1@users.noreply.github.com> Date: Wed, 22 Nov 2023 14:07:58 -0500 Subject: [PATCH 62/70] Update Navigation design in complex websites.md More minor edits --- .../User_Experience/Navigation design in complex websites.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Topics/User_Experience/Navigation design in complex websites.md b/Topics/User_Experience/Navigation design in complex websites.md index 68536d1fc..2a37e7011 100644 --- a/Topics/User_Experience/Navigation design in complex websites.md +++ b/Topics/User_Experience/Navigation design in complex websites.md @@ -24,8 +24,8 @@ Consider using the following steps to start thinking of good navigation design * Usually located at the side of the page and contains links to relevant pages on the website * Tabbed menus * Organizes information into different tabs, where each tab contains different relevant information - * Footers containing links to all relevant pages within your website - * Usually at the bottom of a page. It can contain links to all pages on the website as well as contact information + * Footers + * Usually at the bottom of a page. It can contain links to all relevant pages on the website as well as contact information 5. Consider how the user may navigate through the content on a single page. * Sub-navbars can be utilized From 1b0175460df2647672a33b28eb85fd41e938a71f Mon Sep 17 00:00:00 2001 From: ak-james1 <95581896+ak-james1@users.noreply.github.com> Date: Wed, 22 Nov 2023 14:21:29 -0500 Subject: [PATCH 63/70] Update and rename Navigation design in complex websites.md to Intro to navigation design in complex websites.md Final changes to Intro to Navigation Design --- ... navigation design in complex websites.md} | 28 +++++++++---------- 1 file changed, 14 insertions(+), 14 deletions(-) rename Topics/User_Experience/{Navigation design in complex websites.md => Intro to navigation design in complex websites.md} (68%) diff --git a/Topics/User_Experience/Navigation design in complex websites.md b/Topics/User_Experience/Intro to navigation design in complex websites.md similarity index 68% rename from Topics/User_Experience/Navigation design in complex websites.md rename to Topics/User_Experience/Intro to navigation design in complex websites.md index 2a37e7011..c3a1a19a2 100644 --- a/Topics/User_Experience/Navigation design in complex websites.md +++ b/Topics/User_Experience/Intro to navigation design in complex websites.md @@ -1,39 +1,39 @@ ## What is Navigation Design ? -Navigation Design, also referred to as menu design, helps users to easily move through the pages of your website. It utilizes design techniques to allow ease of navigation and provide the user a better user experience. +Navigation Design, also referred to as Menu Design, helps users to easily move through the pages of your website or web app. It utilizes design techniques to allow ease of navigation and provide the user a better user experience. ## Good vs Bad Navigation Design -Good navigation design allows the ease of finding information and is intuitive and easy to use. On the other hand, bad navigation design can overwhelm the user and make finding important content difficult. As a result, it is important to keep the user in mind when designing the navigation of a website, especially complex websites with a multitude of pages. In fact, reasoning about how the user can navigate through the many pages of a website and efficiently within a large page can help lay the foundation to good navigation design. +Good navigation design allows the ease of finding information and is intuitive and easy to use. On the other hand, bad navigation design can overwhelm the user and make finding important content difficult. As a result, it is important to keep the user in mind when designing the navigation of a website or web app. This is especially important for complex websites with a multitude of pages. In fact, reasoning about how the user can navigate through the many pages of a website and efficiently within a large page can help lay the foundation to good navigation design. Consider using the following steps to start thinking of good navigation design : 1. Layout all the pages on your website - * This can be done on paper or through a design tool such as Figma[https://www.figma.com/] + * This can be done on paper or through a design tool such as [Figma](https://www.figma.com/) 2. Find relevant ways a user may navigate through those pages - * For example, home page → sign in → back to home page + * For example, home page → sign in → home page * Additionally, consider using prototyping or wireframing to give yourself a clearer picture on how the user may navigate through your website 3. Determine which pages the user may need to reference most often - * For example, the home page / landing page is usually referenced a lot by the user. + * For example, a user may navigate to the home page / landing page on many occasions -4. Consider using some of the following to ease navigation through the website : +4. Consider using some of the following to create good navigation design : * Navbars * Usually at the top of a landing page / home page. These contain links to the website's main pages * Side menus * Usually located at the side of the page and contains links to relevant pages on the website * Tabbed menus - * Organizes information into different tabs, where each tab contains different relevant information + * Organizes information into different tabs, where each tab contains information relevant to that tab only * Footers * Usually at the bottom of a page. It can contain links to all relevant pages on the website as well as contact information 5. Consider how the user may navigate through the content on a single page. * Sub-navbars can be utilized * Located below a normal Navbar and consists of links that are relevant to the specific page that the user is on - * If there is searchable / filterable content on this page, consider using icons that are easily identifiable by the user as search ( magnifying glass) or filter + * If there is searchable / filterable content on this page, consider using icons that are easily identifiable by the user as search (magnifying glass) or filter * Please see the link below for more navigation design patterns: - * [https://ui-patterns.com/patterns/navigation/list](https://ui-patterns.com/patterns/navigation/list) + * [Navigation Design Patterns](https://ui-patterns.com/patterns/navigation/list) ## Advantages of Good Navigation Design for Complex Websites @@ -41,9 +41,9 @@ Consider using the following steps to start thinking of good navigation design * Good navigation design allows a clear or intuitive path for users to navigate through the web app / website * For example, an easy/ clear path through a website to specific content, may encourage users to use your product. * Increases usability - * A good navigation design allows users to easily find the content that they need in a timely manner. -* Increases user satisfaction - * Users are less likely to become frustrated navigating a website or webapp if there is a clear navigation system. + * Allows users to easily find content in a timely manner. +* Can increases user satisfaction + * Users are less likely to become frustrated navigating a website or web app if there is a clear navigation system. @@ -59,8 +59,7 @@ Consider using the following steps to start thinking of good navigation design ## Summary - -When designing a website / web app, it is important to consider how a user will navigate through the website’s many pages. Complex websites are especially hard to navigate with poorly designed navigation systems. To ensure that the user has a great experience, it is important to consider the key points above and their advantages. +When designing a website or web app, it is important to consider how a user will navigate through the website’s many pages. Complex websites are especially hard to navigate with poorly designed navigation systems. To ensure that the user has a great experience, it is important to consider the key points above and their advantages. ## Resources @@ -70,3 +69,4 @@ When designing a website / web app, it is important to consider how a user will [https://getdevdone.com/blog/the-good-the-bad-and-the-best-in-website-navigation.html](https://getdevdone.com/blog/the-good-the-bad-and-the-best-in-website-navigation.html) [https://www.w3.org/WAI/tutorials/menus/](https://www.w3.org/WAI/tutorials/menus/) + From ec982e2789620562cdfd48f1d79462535ee017f4 Mon Sep 17 00:00:00 2001 From: ak-james1 <95581896+ak-james1@users.noreply.github.com> Date: Wed, 22 Nov 2023 14:24:35 -0500 Subject: [PATCH 64/70] Update Intro to navigation design in complex websites.md minor grammatical updates --- .../Intro to navigation design in complex websites.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Topics/User_Experience/Intro to navigation design in complex websites.md b/Topics/User_Experience/Intro to navigation design in complex websites.md index c3a1a19a2..c96f1f210 100644 --- a/Topics/User_Experience/Intro to navigation design in complex websites.md +++ b/Topics/User_Experience/Intro to navigation design in complex websites.md @@ -1,9 +1,9 @@ ## What is Navigation Design ? -Navigation Design, also referred to as Menu Design, helps users to easily move through the pages of your website or web app. It utilizes design techniques to allow ease of navigation and provide the user a better user experience. +Navigation Design, also referred to as Menu Design, helps users to easily move through the pages of your website or web app. It utilizes design techniques to allow ease of navigation and provide the user with a better user experience. ## Good vs Bad Navigation Design -Good navigation design allows the ease of finding information and is intuitive and easy to use. On the other hand, bad navigation design can overwhelm the user and make finding important content difficult. As a result, it is important to keep the user in mind when designing the navigation of a website or web app. This is especially important for complex websites with a multitude of pages. In fact, reasoning about how the user can navigate through the many pages of a website and efficiently within a large page can help lay the foundation to good navigation design. +Good navigation design allows the user to easily find relevant information and easy to use. On the other hand, bad navigation design can overwhelm the user and make finding important content difficult. As a result, it is important to keep the user in mind when designing the navigation of a website or web app. This is especially important for complex websites with a multitude of pages. In fact, reasoning about how the user can navigate through the many pages of a website and efficiently within a large page can help lay the foundation to good navigation design. Consider using the following steps to start thinking of good navigation design : From a041329b12608503a0028e08dd4433b5a4b7287f Mon Sep 17 00:00:00 2001 From: K M Crawford Date: Wed, 22 Nov 2023 14:26:36 -0500 Subject: [PATCH 65/70] Update React.md --- Topics/Tech_Stacks/React.md | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/Topics/Tech_Stacks/React.md b/Topics/Tech_Stacks/React.md index 4358b6135..233100adc 100644 --- a/Topics/Tech_Stacks/React.md +++ b/Topics/Tech_Stacks/React.md @@ -1,7 +1,7 @@ ## Tech Stacks ### React Overview -React is an open-source JavaScript library for building component-based user interfaces. This component-based architecture allows engineers to quickly prototype and develop complex applications easily by modularizing common functionalities into discrete, reusable UI components, and React boasts a large user base full of freely available components libraries. Beyond this, React there's much more to learn about React, such as its virtual DOM, JSX, and a full mobile framework in React Native, and much more -- so much more that it can be [overwhelming](https://auth0.com/blog/how-to-manage-javascript-fatigue/). +React is an open-source JavaScript library for building component-based user interfaces. This component-based architecture allows engineers to quickly prototype and develop complex applications easily by modularizing common functionalities into discrete, reusable UI components, whilst boasting a large user base full of freely available component libraries. Beyond this, React there's much more to learn about React, such as its virtual DOM, JSX, and a full mobile framework in React Native, and much more -- so much more that it can be [overwhelming](https://auth0.com/blog/how-to-manage-javascript-fatigue/). To help ease the learning curve, below you'll find a variety of resources to reference while learning and components and libraries to use with React. @@ -38,7 +38,13 @@ JavaScript frameworks tutorial provided by Microsoft. Useful readings, but not n ### Useful React Tools and Libraries [Create React App](https://create-react-app.dev/) -Allows you to set up your React applications using a single command without having to configure many build tools. Provides a lot of useful functionality like instant reloads and optimizations for deployment. +Allows you to set up your React applications using a single command without having to configure many build tools. Provides a lot of useful functionality like instant reloads and optimizations for deployment; is the "official" React solution. + +[Vite](https://vitejs.dev/) +Another quickstart build tool for setting up your environment; an alternative to Create React App, [Vite is generally faster than Create React App](https://www.dhiwise.com/post/react-build-tools-create-react-app-with-vite-vs-cra-tool). + +[Next.js](https://nextjs.org/) +A popular and robust framework that allows server-side rendering and static website generation. [usehooks-ts](https://usehooks-ts.com/) A React library of useful hooks that go well beyond those built into React. Don't reinvent the wheel! usehooks offers over forty ready-to-use hooks such as [useEffectOnce](https://usehooks-ts.com/react-hook/use-effect-once) and [useInterval](https://usehooks-ts.com/react-hook/use-interval). @@ -55,7 +61,7 @@ Another responsive UI library that allows you to focus on development by handlin ### Miscellaneous [GitHub Pages](https://pages.github.com/) -Host your React websites straight from your Github repo. Website hosting is fairly expensive, so this is here as a free alternative for website deployment for simple applications. +Host your React websites straight from your Github repo. Website hosting is fairly expensive, so this is here as a free alternative for website deployment for simple applications. Head over to the [Development Process](https://learning-software-engineering.github.io/Topics/Development_Process/) page for a tutorial on GitHub pages and more. [Codepen](https://codepen.io/) Online development environment to try React out in (among other frontend tools). Great for testing the waters with React and other libraries or languages. From d1a188d1f44a2564c83e5e94e26845118c48ee3c Mon Sep 17 00:00:00 2001 From: K M Crawford Date: Wed, 22 Nov 2023 14:28:23 -0500 Subject: [PATCH 66/70] Update React.md --- Topics/Tech_Stacks/React.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Topics/Tech_Stacks/React.md b/Topics/Tech_Stacks/React.md index 233100adc..9ea320eeb 100644 --- a/Topics/Tech_Stacks/React.md +++ b/Topics/Tech_Stacks/React.md @@ -66,3 +66,5 @@ Host your React websites straight from your Github repo. Website hosting is fair [Codepen](https://codepen.io/) Online development environment to try React out in (among other frontend tools). Great for testing the waters with React and other libraries or languages. +[Stackblitz](https://stackblitz.com/) +An online development environment for frontend, Node.js, and JavaScript. From 43d7f0a082aafa14496566f27291060a89f706dc Mon Sep 17 00:00:00 2001 From: K M Crawford Date: Wed, 22 Nov 2023 14:28:44 -0500 Subject: [PATCH 67/70] Update React.md --- Topics/Tech_Stacks/React.md | 1 + 1 file changed, 1 insertion(+) diff --git a/Topics/Tech_Stacks/React.md b/Topics/Tech_Stacks/React.md index 9ea320eeb..fa3fe9fbd 100644 --- a/Topics/Tech_Stacks/React.md +++ b/Topics/Tech_Stacks/React.md @@ -23,6 +23,7 @@ A free course provided by Scrimba that teaches React fundamentals through the cr Basic React tutorial provided by the official React website. This tutorial will guide you through a very basic tutorial that you can do straight from your browser. [React JS Crash Course](https://www.youtube.com/watch?v=w7ejDZ8SWv8) + [One Hour React Tutorial](https://www.youtube.com/watch?v=b9eMGE7QtTk) One hour quickstart tutorials about React. These YouTube crash course provides a great overview of React and various important components that you will be using often. Very useful if you are learning React under a strict time limit for whatever reason. From 244e56c881935db1f0c9c542e0efe9f97e8abce5 Mon Sep 17 00:00:00 2001 From: K M Crawford Date: Wed, 22 Nov 2023 14:29:02 -0500 Subject: [PATCH 68/70] Update React.md --- Topics/Tech_Stacks/React.md | 1 - 1 file changed, 1 deletion(-) diff --git a/Topics/Tech_Stacks/React.md b/Topics/Tech_Stacks/React.md index fa3fe9fbd..9ea320eeb 100644 --- a/Topics/Tech_Stacks/React.md +++ b/Topics/Tech_Stacks/React.md @@ -23,7 +23,6 @@ A free course provided by Scrimba that teaches React fundamentals through the cr Basic React tutorial provided by the official React website. This tutorial will guide you through a very basic tutorial that you can do straight from your browser. [React JS Crash Course](https://www.youtube.com/watch?v=w7ejDZ8SWv8) - [One Hour React Tutorial](https://www.youtube.com/watch?v=b9eMGE7QtTk) One hour quickstart tutorials about React. These YouTube crash course provides a great overview of React and various important components that you will be using often. Very useful if you are learning React under a strict time limit for whatever reason. From 9b7c5341e5023fcffcd823a9bbad74b3ecd5bf73 Mon Sep 17 00:00:00 2001 From: K M Crawford Date: Wed, 22 Nov 2023 14:30:00 -0500 Subject: [PATCH 69/70] Update React.md --- Topics/Tech_Stacks/React.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Topics/Tech_Stacks/React.md b/Topics/Tech_Stacks/React.md index 9ea320eeb..e3ba35d76 100644 --- a/Topics/Tech_Stacks/React.md +++ b/Topics/Tech_Stacks/React.md @@ -61,7 +61,7 @@ Another responsive UI library that allows you to focus on development by handlin ### Miscellaneous [GitHub Pages](https://pages.github.com/) -Host your React websites straight from your Github repo. Website hosting is fairly expensive, so this is here as a free alternative for website deployment for simple applications. Head over to the [Development Process](https://learning-software-engineering.github.io/Topics/Development_Process/) page for a tutorial on GitHub pages and more. +Host your React websites straight from your Github repo. Website hosting is fairly expensive, so this is here as a free alternative for website deployment for simple applications. Head over to the [Development Process](https://learning-software-engineering.github.io/Topics/Development_Process.html#resources-for-development-process) page for a tutorial on GitHub pages and more. [Codepen](https://codepen.io/) Online development environment to try React out in (among other frontend tools). Great for testing the waters with React and other libraries or languages. From c30587a9fa15d668e1186ca86d0e508dddcb5d61 Mon Sep 17 00:00:00 2001 From: ak-james1 <95581896+ak-james1@users.noreply.github.com> Date: Wed, 22 Nov 2023 14:31:21 -0500 Subject: [PATCH 70/70] Update Intro to navigation design in complex websites.md fixed period --- .../Intro to navigation design in complex websites.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Topics/User_Experience/Intro to navigation design in complex websites.md b/Topics/User_Experience/Intro to navigation design in complex websites.md index c96f1f210..a0f83045b 100644 --- a/Topics/User_Experience/Intro to navigation design in complex websites.md +++ b/Topics/User_Experience/Intro to navigation design in complex websites.md @@ -27,7 +27,7 @@ Consider using the following steps to start thinking of good navigation design * Footers * Usually at the bottom of a page. It can contain links to all relevant pages on the website as well as contact information -5. Consider how the user may navigate through the content on a single page. +5. Consider how the user may navigate through the content on a single page * Sub-navbars can be utilized * Located below a normal Navbar and consists of links that are relevant to the specific page that the user is on * If there is searchable / filterable content on this page, consider using icons that are easily identifiable by the user as search (magnifying glass) or filter