<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Fabian Hinsenkamp</title>
    <description>The latest articles on DEV Community by Fabian Hinsenkamp (@hinsencamp).</description>
    <link>https://dev.to/hinsencamp</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F139175%2F1746a377-2b58-4cf4-afb3-be87af27c020.png</url>
      <title>DEV Community: Fabian Hinsenkamp</title>
      <link>https://dev.to/hinsencamp</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/hinsencamp"/>
    <language>en</language>
    <item>
      <title>Personalized System Design Interview Prep for Engineering Managers</title>
      <dc:creator>Fabian Hinsenkamp</dc:creator>
      <pubDate>Sun, 05 May 2024 20:54:09 +0000</pubDate>
      <link>https://dev.to/hinsencamp/personalized-system-design-interview-prep-for-engineering-managers-447e</link>
      <guid>https://dev.to/hinsencamp/personalized-system-design-interview-prep-for-engineering-managers-447e</guid>
      <description>&lt;p&gt;90% of engineering manager candidates feel unprepared for their upcoming engineering manager interviews, at big tech companies like Netflix or Meta. System design interviews are a common component of the hiring process, yet the expectations remain unclear as they vary widely between companies, roles, and levels of seniority.&lt;/p&gt;

&lt;p&gt;That’s why reliably mastering system design interviews requires more than just technical knowledge; it demands a tailored interview prep approach, to avoid getting lost in the breadth and depth of the topic. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Through this guide, I equip you with a comprehensive system design interview preparation strategy tailored for your individual profile and the companies you are interviewing with.&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;🤔 Unsure if this article is for you? ****It looks like you haven’t yet taken our free assessment test! In just under a minute, you can discover which of our system design interview preparation strategies is the best match for you.                                                                   &lt;a href="https://bigtechcoach.outgrow.us/system-design-interview-strategy"&gt;👉 Take the Free Test Now!&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Your Assessment Results
&lt;/h2&gt;

&lt;p&gt;According to the analysis from my algorithm, it appears &lt;strong&gt;likely that you will face system design interviews&lt;/strong&gt; if you're interviewing for an engineering manager position.&lt;/p&gt;

&lt;p&gt;For someone in your position, it's reasonable to expect that you will encounter &lt;strong&gt;questions primarily centered around high-level design&lt;/strong&gt;. Such questions generally involve discussing the architectural aspects of significant systems. For instance, you may need to outline how you would construct a collaborative platform like Dropbox, a streaming service like Netflix, or a URL shortener like TinyURL.&lt;/p&gt;

&lt;p&gt;As you step into a managerial role, the expected &lt;strong&gt;technical depth&lt;/strong&gt; in these interviews tends to be &lt;strong&gt;moderately&lt;/strong&gt; &lt;strong&gt;complex&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Although you should be ready to engage in detailed discussions about specific elements of your designs, the focus on exhaustive implementation details might decrease with the increasing managerial responsibilities of the position you are targeting.&lt;/p&gt;

&lt;p&gt;Instead, interviewers will probably concentrate more on evaluating whether you can grasp the overarching structures of large systems, instead of your capacity to handle detailed technical specifics. This shift implies that you will be expected to articulate complex high-level architectures rather than discuss in-depth topics such as advanced algorithms.&lt;/p&gt;

&lt;p&gt;You may be wary of trusting a conclusion drawn from a process that might seem obscure. Let me provide some clarity on the factors that led to this determination.&lt;/p&gt;

&lt;h3&gt;
  
  
  Probability of Encountering a System Design Interview
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6gbq288e1hjzc2sls8c0.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6gbq288e1hjzc2sls8c0.png" alt="Probability of Encountering a System Design Interview" width="800" height="536"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The likelihood of encountering a standardized system design interview is primarily influenced by two factors:&lt;/p&gt;

&lt;p&gt;First, the tier of the company you are interviewing with plays a significant role. Small to mid-sized companies, including startups, are least likely to have a standardized hiring process that includes a formal system design interview. At the other end of the spectrum, large tech companies, often summarized by the acronym FAANG, frequently incorporate system design interviews into their hiring process. &lt;strong&gt;For example, Netflix engineering manager interviews are highly likely to include system design rounds.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The second factor is your level of seniority. While junior positions across various software-related roles are unlikely to require system design interviews, the probability increases significantly from mid-level positions onwards. In particular, &lt;strong&gt;technical engineering managers and those in higher positions are very likely to face system design and software architecture interviews.&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Most Common Types of System Design Interview Questions
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4cmxp39yz7lu2vlmykgy.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4cmxp39yz7lu2vlmykgy.png" alt="Most Common Types of System Design Interview Questions" width="800" height="536"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;As you’ve probably already realized, the pool of potential questions is indefinite. However, I’ve developed a methodology to categorize these questions along two axes. Questions may target either high-level or low-level designs. High-level design questions focus on the architectural aspects of large systems, while low-level design questions delve into the detailed technical specifics and component-level considerations of systems.&lt;/p&gt;

&lt;p&gt;The second axis assesses whether the systems in question are existing real-world systems or more generic, somewhat hypothetical constructs.&lt;/p&gt;

&lt;p&gt;From these two axes, four quadrants emerge, allowing us to categorize all questions and then map the likelihood of these questions appearing in system design interviews by role.&lt;/p&gt;

&lt;p&gt;Examples of system design questions in these quadrants include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;High-Level Design of a Generic System&lt;/strong&gt;: Design a Vending Machine&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Low-Level Design of a Generic System&lt;/strong&gt;: Design a CDN&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;High-Level Design of a Real-World System&lt;/strong&gt;: Design Dropbox&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Low-Level Design of a Real-World System&lt;/strong&gt;: Design a File Sync Service (as found in Dropbox)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Expected Level of System Complexity
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3tojfz5gxuzpams687g1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3tojfz5gxuzpams687g1.png" alt="Expected Level of System Complexity" width="800" height="536"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Within each quadrant where a system design interview question may fall, there's another important dimension to consider, which I want you to be aware of: &lt;strong&gt;the complexity of the systems relative to the role and seniority of candidates.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;In my methodology, questions are categorized into five levels of complexity, where 1 represents the least complex and 5 the most complex. As your seniority increases, so does the complexity of the systems you'll discuss, although this complexity tends to plateau at certain levels, particularly in leadership roles.&lt;/p&gt;

&lt;p&gt;The advantage of also clustering questions by complexity level is that &lt;strong&gt;it makes it easier to prioritize the types of questions you are most likely to encounter during your interview.&lt;/strong&gt; This approach helps in building an effective preparation strategy, where tackling the most complex questions first is not recommended.&lt;/p&gt;

&lt;p&gt;I use this knowledge to shield my coachees from frustration, ensuring a smooth learning experience and fostering personal growth.&lt;/p&gt;

&lt;h2&gt;
  
  
  Your Best Preparation Strategy
&lt;/h2&gt;

&lt;p&gt;Get actionable insights for your system design interview. I'll tailor a study plan to your background and target companies, focusing on common questions for software engineering managers. Starting from foundational design principles, we'll progress through individual components to complete system mastery. This structured approach ensures thorough preparation. Designed for busy schedules, this four-week plan keeps you effectively engaged. Here's what to focus on:&lt;/p&gt;

&lt;h3&gt;
  
  
  Study the System Design Interview Framework
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F694v9lh2lkkefd609zkd.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F694v9lh2lkkefd609zkd.png" alt="Expected Level of System Complexity" width="800" height="270"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;To effectively communicate your design, it's best to adhere to a standardized framework consisting of six key steps:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Requirements Engineering&lt;/li&gt;
&lt;li&gt;Reasonable Capacity Estimation&lt;/li&gt;
&lt;li&gt;API Design&lt;/li&gt;
&lt;li&gt;Data Model&lt;/li&gt;
&lt;li&gt;High Level Architecture&lt;/li&gt;
&lt;li&gt;Design Discussion&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Study Computer Science Fundamentals
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpfqvhahkmhgeke0unzty.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpfqvhahkmhgeke0unzty.png" alt="Study Computer Science Fundamentals" width="800" height="377"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Refresh the computer science fundamentals that commonly drive discussions.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Horizontal scalability&lt;/li&gt;
&lt;li&gt;Microservice architecture&lt;/li&gt;
&lt;li&gt;ACID properties of transactions&lt;/li&gt;
&lt;li&gt;PACELC theorem (extends CAP)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Study System Design Components
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fa7lw5u0jr8iwvgigq1dm.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fa7lw5u0jr8iwvgigq1dm.png" alt="Study System Design Components" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Deepen your understanding of the most common system components to effectively integrate them into software architectures. By thoroughly studying these components, you will be able to justify your choices based on their advantages and disadvantages.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Load Balancer&lt;/li&gt;
&lt;li&gt;API Gateway&lt;/li&gt;
&lt;li&gt;Microservice&lt;/li&gt;
&lt;li&gt;Message Queue&lt;/li&gt;
&lt;li&gt;Relational Database&lt;/li&gt;
&lt;li&gt;Non-relational Database&lt;/li&gt;
&lt;li&gt;CDN Service&lt;/li&gt;
&lt;li&gt;Caching Service&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Study Supporting Features Independently
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwekg9tbmxxwe8zsss9kq.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwekg9tbmxxwe8zsss9kq.png" alt="Supporting Features Independently" width="800" height="536"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Study how to independently draw and explain supporting features used across different systems (like a search engine in Netflix). This will enhance your agility in architecting unfamiliar systems on the spot.&lt;/p&gt;

&lt;p&gt;A good starting point for your profile would include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Search engine&lt;/li&gt;
&lt;li&gt;Recommendation engine&lt;/li&gt;
&lt;li&gt;User management&lt;/li&gt;
&lt;li&gt;Analytics&lt;/li&gt;
&lt;li&gt;Notification service&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Study Systems Type by Type
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fo4rtxs3euyhb0us1x58z.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fo4rtxs3euyhb0us1x58z.png" alt="Study Systems Type by Type" width="800" height="536"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Study types of systems rather than individual famous implementations This approach will allow you to adapt more flexibly to unexpected questions. System architectures you are very likely to encounter: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Messengers (e.g., WhatsApp, Signal)&lt;/li&gt;
&lt;li&gt;Ticketing systems (e.g., RedBus, Ticketmaster, BookMyShow)&lt;/li&gt;
&lt;li&gt;Accommodation platforms (e.g., Airbnb, Booking.com)&lt;/li&gt;
&lt;li&gt;Streaming platforms (e.g., Netflix, YouTube, Spotify)&lt;/li&gt;
&lt;li&gt;Coding platforms (e.g., Topcoder, Codechef, Hackerrank)&lt;/li&gt;
&lt;li&gt;Question-and-answer platforms (e.g., Quora)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Summary
&lt;/h2&gt;

&lt;p&gt;Navigating the complexities of engineering manager interviews at top tech companies requires more than just technical prowess; it demands a strategic preparation approach tailored to your unique profile. &lt;/p&gt;

&lt;p&gt;This guide has provided you with a structured preparation strategy, taking into account the varying expectations of system design interviews across different companies and roles. Armed with a clear understanding of what to expect and how to prepare, you can approach your interviews with confidence. &lt;/p&gt;

&lt;p&gt;Remember to start with our free assessment test to tailor your preparation effectively. Good luck, and prepare to impress at your next system design interview!&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Fast-Track Your Preparation&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fldikx2iceskzn9vrjnhe.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fldikx2iceskzn9vrjnhe.png" alt="BigTech System Design Bootcamp Udemy course" width="800" height="153"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you're short on time and eager to get started, check out my highly-rated &lt;a href="https://www.udemy.com/course/the-bigtech-system-design-interview-bootcamp/?referralCode=F15061BAF146EFB9F926"&gt;Udemy course&lt;/a&gt;. Designed based on the most common needs from my tech interview coaching clients, this course condenses the essential knowledge into less than 5 hours of video content. It's a fast track to mastering what you need to know.&lt;/p&gt;

</description>
      <category>systemdesign</category>
      <category>interview</category>
      <category>career</category>
      <category>distributedsystems</category>
    </item>
    <item>
      <title>System Design Interview Questions – Components You Should Know</title>
      <dc:creator>Fabian Hinsenkamp</dc:creator>
      <pubDate>Sun, 17 Oct 2021 18:39:00 +0000</pubDate>
      <link>https://dev.to/hinsencamp/system-design-interview-questions-components-you-should-know-3fhb</link>
      <guid>https://dev.to/hinsencamp/system-design-interview-questions-components-you-should-know-3fhb</guid>
      <description>&lt;p&gt;Let's face it - getting into big tech is hard. Especially, system design interview questions are known to be notorious. Designing a distributed system under time pressure isn't easy, especially because this isn't something we can practice in our daily jobs. So it requires dedicated practice to nail those interviews.&lt;br&gt;
If you approach this challenge systematically, it is the first step to learn the different components modern systems consist of.&lt;br&gt;&lt;br&gt;
Luckily, it's a very manageable amount of component types you need to know to sketch out the most common system design questions.&lt;/p&gt;

&lt;p&gt;This article is an introduction to these key components. To support you in practicing your system design skills, I created a&lt;br&gt;
&lt;a href="https://excalidraw.com/"&gt;Excalidraw&lt;/a&gt; component library, you can download for free at the bottom of this article.&lt;/p&gt;

&lt;p&gt;Before you start learning about concrete components it's critical to understand that you have four high-level tasks which every system needs to perform. Data needs to be transported, stored, processed, and presented. All components fall into one of those categories:&lt;/p&gt;

&lt;h2&gt;
  
  
  Contents
&lt;/h2&gt;

&lt;p&gt;Transport Data&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Message Queue&lt;/li&gt;
&lt;li&gt;Load Balancer&lt;/li&gt;
&lt;li&gt;CDN&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Store Data&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Key-value Store&lt;/li&gt;
&lt;li&gt;Wide-column Store&lt;/li&gt;
&lt;li&gt;Search Engine&lt;/li&gt;
&lt;li&gt;Relational DB&lt;/li&gt;
&lt;li&gt;Data Store&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Processing Data&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
Custom Services
Present Data
&lt;/li&gt;
&lt;li&gt;Web or Desktop Application&lt;/li&gt;
&lt;li&gt;Mobile Application&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Get Ready for your System Design Interviews&lt;/p&gt;

&lt;p&gt;In your interview, it will be crucial to sketch out the high-level categories and once you are clear about them, fill in the most suitable component.&lt;br&gt;
Let's get started to learn about transporting data.&lt;/p&gt;




&lt;h2&gt;
  
  
  Transport Data &lt;a&gt;&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;Any system needs to "transport" data from one component to another, especially in a microservice architecture.&lt;br&gt;
There are three component types, which are essential to design the data transport functionality of your system.&lt;/p&gt;

&lt;h3&gt;
  
  
  Message Queue &lt;a&gt;&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbtedr8rav9gbd4b7av1u.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbtedr8rav9gbd4b7av1u.png" alt="message-queue" width="452" height="212"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;A message queue enables asynchronous communications between services so that the sending service does not need to wait for the receiving service’s reply.&lt;br&gt;
Thereby the fault tolerance and resiliency of a system improves.&lt;br&gt;
Message queues are managed by a message broker which implements the pub/sub pattern to simplify the connection of services.&lt;br&gt;
This allows handling a growing number of services by adding them as publishers or subscribers and thereby scale the system dynamically.&lt;/p&gt;

&lt;h4&gt;
  
  
  What to use it for?
&lt;/h4&gt;

&lt;p&gt;Asynchronous workflows are great for a couple of reasons.&lt;br&gt;
All systems profit from the decoupling of the services they consist of.&lt;br&gt;
It allows for different parts to evolve independently, be written in different languages, and/or be maintained by separated teams.&lt;/p&gt;

&lt;p&gt;Use cases that heavily benefit are order and payment processing in an e-commerce or finance setting.&lt;br&gt;
Message brokers’ ability to enhance fault tolerance and guarantee that messages are consumed once and once only makes them a natural choice.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Any micro service architecture&lt;/li&gt;
&lt;li&gt;E-commerce Website (order processing)&lt;/li&gt;
&lt;li&gt;Trading System (payment processing)&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Popular Implementations
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.rabbitmq.com/"&gt;RabbitMQ&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://kafka.apache.org/"&gt;Kafka&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://redis.io/"&gt;Redis&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.microsoft.com/en-us/azure/service-bus-messaging/service-bus-messaging-overview"&gt;Azure Service Bus&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://aws.amazon.com/sqs/"&gt;AWS SQS&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://cloud.google.com/pubsub"&gt;Google Cloud Pub/Sub&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Load Balancer &lt;a&gt;&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fu63bwleanhtdddkg22jy.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fu63bwleanhtdddkg22jy.png" alt="Load Balancer" width="326" height="174"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;A load balancer is a component that acts as a reverse proxy and distributes network or application traffic across several servers. It is used to increase the capacity (concurrent users) and reliability of applications.&lt;br&gt;
Once a load of a system increases, load balancers make sure the load is efficiently distributed over the available servers, without individual servers getting jammed.&lt;br&gt;
Load Balancers are a common component required for basically every system which intends to be highly scalable.&lt;/p&gt;

&lt;h4&gt;
  
  
  What to use it for?
&lt;/h4&gt;

&lt;p&gt;Any system that has multiple instances of the same service and is under high and volatile load. Typically you add them just before any client-facing server.&lt;/p&gt;

&lt;h4&gt;
  
  
  Popular Implementations
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.cloudflare.com/en-gb/load-balancing/"&gt;Cloudflare&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.imperva.com/products/load-balancer/"&gt;Incapsula&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://m.do.co/c/19f529e8be49"&gt;DigitalOcean&lt;/a&gt; - you get 100 USD free credit&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.microsoft.com/en-us/azure/load-balancer/quickstart-load-balancer-standard-public-portal"&gt;Azure Load Balancer&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.aws.amazon.com/AmazonECS/latest/developerguide/load-balancer-types.html"&gt;AWS Load Balancer&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://cloud.google.com/load-balancing"&gt;Google Cloud&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  CDN &lt;a&gt;&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5i3fbezpfknlmhc306s0.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5i3fbezpfknlmhc306s0.png" alt="CDN" width="242" height="301"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;A content delivery network (CDN) is a geographically distributed group of servers. It caches all kinds of content at the network edge.&lt;/p&gt;

&lt;p&gt;Thanks to the distributed nature of a CDN, it can handle more traffic and withstand hardware failure better than many origin hosting servers.&lt;br&gt;
Thereby, CDNs increase the availability and redundancy of web content. This content includes HTML pages, javascript files, stylesheets, images, and videos.&lt;br&gt;
Today, the majority of web traffic is served through CDNs, as visitors are more and more inclined to click away from a slow-loading site.&lt;/p&gt;

&lt;h4&gt;
  
  
  What to use it for?
&lt;/h4&gt;

&lt;p&gt;So a CDN should be part of every high-level system diagram you are drawing, which has a client-facing website or -application.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;E-commerce Website&lt;/li&gt;
&lt;li&gt;Streaming App&lt;/li&gt;
&lt;li&gt;Social Network&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Popular implementations
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.fastly.com/"&gt;Fastly&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.cloudflare.com/en-gb/cdn/"&gt;Cloudflare CDN&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://azure.microsoft.com/en-us/services/cdn/#overview"&gt;Azure CDN&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://aws.amazon.com/cloudfront/"&gt;AWS CloudFront&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://cloud.google.com/cdn"&gt;Google Cloud CDN&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Store Data &lt;a&gt;&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;The capability of persisting data is central to any kind of system.&lt;br&gt;
However, it depends on the kind of data which database is most suitable.&lt;br&gt;
Besides the listed databases some specialized ones are out of the scope for this article.&lt;/p&gt;

&lt;h3&gt;
  
  
  Key-value Store &lt;a&gt;&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4goij15qtslibggvsbba.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4goij15qtslibggvsbba.png" alt="Key-value-store" width="352" height="318"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;A key-value store is the simplest form of a database management system.&lt;br&gt;
It allows to store pairs of keys and values in memory and retrieve values when a key is known.&lt;br&gt;
The simplicity does make these systems attractive for specific use cases.&lt;/p&gt;

&lt;h4&gt;
  
  
  What to use it for?
&lt;/h4&gt;

&lt;p&gt;Typically, key-value stores are used to cache small chunks of arbitrary data like strings or objects resulting from database calls, API calls, or page rendering.&lt;br&gt;
Thereby key-value stores help to speed up dynamic web applications by alleviating database load. The performance improvements are especially significant if the database is called very frequently or the system requires remote calls to independent services with high latency.&lt;/p&gt;

&lt;h4&gt;
  
  
  Popular Implementations
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://redis.io/"&gt;Redis&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://memcached.org/"&gt;Memchanced&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://hazelcast.com/"&gt;Hazlecast&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.microsoft.com/en-us/azure/storage/tables/table-storage-overview"&gt;Azure Table Storage&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://aws.amazon.com/dynamodb/"&gt;AWS Dynamo DB&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://cloud.google.com/memorystore/"&gt;Google Cloud Memorystore&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Wide-Column Store &lt;a&gt;&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F96q8jcs95m8evpi154ed.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F96q8jcs95m8evpi154ed.png" alt="wide-column-store" width="394" height="318"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;A wide-column store is a type of NoSQL database.&lt;br&gt;
It uses tables, rows, and columns, but unlike a relational database, the names and format of the columns can vary from row to row in the same table.&lt;br&gt;
You can think of a wide-column store as a two-dimensional key-value store. Many implementations offer advanced features to distribute data across multiple cloud availability zones and scale linearly.&lt;br&gt;
For ACID transactions better stick to relational databases.&lt;/p&gt;

&lt;h4&gt;
  
  
  What to use it for?
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;E-commerce Website (product catalogs, recommendation engine)&lt;/li&gt;
&lt;li&gt;Instant Messenger (real-time chat service)&lt;/li&gt;
&lt;li&gt;Streaming App (user preference engine)&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Popular Implementations
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://cassandra.apache.org"&gt;Cassandra&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.scylladb.com/"&gt;Scylla&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://hbase.apache.org/"&gt;Apache HBase&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.microsoft.com/en-us/azure/cosmos-db/introduction"&gt;Azure Cosmos DB&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://aws.amazon.com/keyspaces/?c=db&amp;amp;sec=srv"&gt;AWS Keyspaces&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://cloud.google.com/bigquery"&gt;Google Cloud Big Query&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Search Engine &lt;a&gt;&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Faemeeh0dpz8h0ucw8w9c.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Faemeeh0dpz8h0ucw8w9c.png" alt="search-engine" width="313" height="318"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Search engines are NoSQL database management systems leveraged to search for content in large datasets. You can use search engines for a lot of different use cases: "classical" full-text search, analytics store, auto-completer, spell checker, alerting engine, and as a general-purpose document store.&lt;br&gt;
From a system design perspective, search engine implementations that allow distributed search are especially interesting.&lt;/p&gt;

&lt;h4&gt;
  
  
  What to use it for?
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Instant Messenger (chat history search service)&lt;/li&gt;
&lt;li&gt;Social Network (user search)&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Popular Implementations
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.elastic.co/"&gt;Elastic Search&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.algolia.com/"&gt;Algolia&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://solr.apache.org/"&gt;Solr&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://typesense.org/"&gt;Typesense&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://azure.microsoft.com/en-us/services/search/"&gt;Azure Cognitive Search&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://aws.amazon.com/cloudsearch/"&gt;AWS Cloud Search&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Relational DB &lt;a&gt;&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5mm5u2ptfwzz6qhv1v4y.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5mm5u2ptfwzz6qhv1v4y.png" alt="relational-db" width="454" height="287"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Relational databases are the most common databases. They support a table-oriented data model.&lt;br&gt;
The schema of a table is defined by the table name and a fixed number of attributes with fixed data types.&lt;br&gt;
If you are storing structured information, or information that can be represented in a tabular format, a relational database is your natural choice.&lt;br&gt;
Moreover, it allows atomic, consistent, isolated, and durable (ACID) transactions.&lt;/p&gt;

&lt;h4&gt;
  
  
  What to use it for?
&lt;/h4&gt;

&lt;p&gt;Almost all kinds of high-level systems do have at least one use case for a relational DB. Some common examples are:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;E-commerce Website (User service)&lt;/li&gt;
&lt;li&gt;Ride Sharing App (Ride service)&lt;/li&gt;
&lt;li&gt;Hotel Booking App (Accommodation service)&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Popular Implementations
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.mysql.com/"&gt;MySQL&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.oracletutorial.com/getting-started/"&gt;Oracle DB&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.microsoft.com/en-us/sql-server"&gt;Azure SQL Server&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Data Store &lt;a&gt;&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Faveqnguj6tdveph1x564.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Faveqnguj6tdveph1x564.png" alt="data-store" width="292" height="317"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Classical databases are designed to store information that can be queried and probably aggregated.&lt;br&gt;
However, if you want to store distinct binary data, e.g. audio, video, or text, data storage solutions are the first choice.&lt;br&gt;
There are different implementations of a data store called blob-, file-, block- or object storage.&lt;br&gt;
Each comes with unique properties that I will cover in a separate article.&lt;/p&gt;

&lt;h4&gt;
  
  
  What to use it for?
&lt;/h4&gt;

&lt;p&gt;Typically data storage solutions are used for systems that handle media files or offer a file system, as an interface to the user.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Streaming App (video service)&lt;/li&gt;
&lt;li&gt;File Storage &amp;amp; Sharing System (file service)&lt;/li&gt;
&lt;li&gt;Image Board (image service)&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Popular Implementations
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://m.do.co/c/19f529e8be49"&gt;DigitalOcean Spaces&lt;/a&gt; - you get 100 USD free credit&lt;/li&gt;
&lt;li&gt;&lt;a href="https://wasabi.com/hot-cloud-storage/"&gt;Wasabi&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.microsoft.com/en-us/azure/storage/blobs/storage-blobs-introduction"&gt;Azure Blob Storage&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://aws.amazon.com/s3/"&gt;Amazon Simple Storage Service (S3)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://cloud.google.com/storage"&gt;Google Cloud Storage&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  - &lt;a href="https://www.alibabacloud.com/product/oss"&gt;Alibaba Object Storage Service&lt;/a&gt;
&lt;/h2&gt;

&lt;h2&gt;
  
  
  Processing Data &lt;a&gt;&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;The user value of any system is created by the unique components which are processing data.&lt;/p&gt;

&lt;h3&gt;
  
  
  Custom Services &lt;a&gt;&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frsof5voslceycuni3jov.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frsof5voslceycuni3jov.png" alt="custom-services" width="469" height="215"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Custom services are the components in your system where you implement your custom logic.&lt;br&gt;
Depending on your transport and storage components you have a couple of options to implement your custom service.&lt;/p&gt;

&lt;h4&gt;
  
  
  What to use it for?
&lt;/h4&gt;

&lt;p&gt;Custom services you find in any system.&lt;/p&gt;

&lt;h4&gt;
  
  
  Popular Implementations
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://en.wikipedia.org/wiki/Representational_state_transfer"&gt;Rest Server&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://blog.hubspot.com/website/serverless-functions"&gt;Serverless Functions&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://techdocs.broadcom.com/us/en/ca-enterprise-software/intelligent-automation/ca-workload-automation-de-web-client/12-1/scheduling/job-types/big-data-jobs/define-a-spark-job.html"&gt;Spark Job&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dzone.com/articles/kafka-consumer-overview"&gt;Kafka Consumer&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Present Data &lt;a&gt;&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;The solution sketch for any high-level system design question include some kind of component that presents the result of your efforts to the end user.&lt;br&gt;
This component also might allow a user to interact with your system and trigger a change of the presented data.&lt;/p&gt;

&lt;h3&gt;
  
  
  Web or Desktop Application &lt;a&gt;&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F08d2ygaoor8vh6wtqb8n.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F08d2ygaoor8vh6wtqb8n.png" alt="web-or-desktop-app" width="412" height="320"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Most professional software applications provide a central web or desktop interface and sometime a mobile application with an limited feature set for quick interactions commuting.&lt;br&gt;
Github is a good example for such an application.&lt;br&gt;
The typical system design question however, are mostly end-user focused so it's fair to expect web and mobile applications share the full feature set.&lt;/p&gt;

&lt;h4&gt;
  
  
  What to use it for?
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;File Storage &amp;amp; Sharing System&lt;/li&gt;
&lt;li&gt;Streaming App&lt;/li&gt;
&lt;li&gt;Social Media&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Popular Implementations
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://reactjs.org/"&gt;React&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://vuejs.org/"&gt;Vue&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://angular.io/"&gt;Angular&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.electronjs.org/"&gt;Electron&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://expressjs.com/"&gt;express.js&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://nestjs.com/"&gt;nest.js&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Mobile Application &lt;a&gt;&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3fsz7jaki6mbeqk0syx3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3fsz7jaki6mbeqk0syx3.png" alt="mobile-app" width="240" height="308"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Native Mobile applications are key for an outstanding user experience for most life-style focused products.&lt;br&gt;
However, mobile development comes with its own challenges like different platforms, limited screen size, less reliable network connectivity, etc.&lt;/p&gt;

&lt;h4&gt;
  
  
  What to use it for?
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Ride Sharing&lt;/li&gt;
&lt;li&gt;Instant Messenger Service&lt;/li&gt;
&lt;li&gt;App Store&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Popular Implementations
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://ionicframework.com/"&gt;Ionic&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://flutter.dev/"&gt;Flutter&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://reactnative.dev/"&gt;React Native&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dotnet.microsoft.com/apps/xamarin"&gt;Xamarin&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Get Ready for your System Design Interviews! &lt;a&gt;&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffwdnvv7c0vjvzxvhyih1.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffwdnvv7c0vjvzxvhyih1.gif" alt="system-design-interview-questions" width="600" height="338"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Knowing your components is great but without practice you will have a hard time in a real interview situation.&lt;br&gt;
To help you with that I created an &lt;a href="https://excalidraw.com/"&gt;Excalidraw&lt;/a&gt; system design component library!&lt;/p&gt;

&lt;p&gt;You can &lt;strong&gt;&lt;a href="https://bigtechcoach.gumroad.com/l/excalidraw-system-design-symbols"&gt;download the library HERE for free!&lt;/a&gt;&lt;/strong&gt;!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://excalidraw.com/"&gt;Excalidraw&lt;/a&gt; allows you to conveniently sketch out your system design and use excalidraw's collaborative feature for peer review and mock interviews!&lt;br&gt;
It's also free and doesn't require any sign-up.&lt;/p&gt;

&lt;p&gt;Thanks for reading this article! If you want to get in touch with me,&lt;br&gt;
just connect with me on &lt;a href="https://www.linkedin.com/in/fabianhinsenkamp/"&gt;LinkedIn&lt;/a&gt;, &lt;a href="https://twitter.com/hinsencamp"&gt;Twitter&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The article was originally post on &lt;a href="https://bigtech.coach/blog/system-design-interview-questions-components-you-should-know/"&gt;bigtech.coach&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>systemdesign</category>
      <category>faang</category>
      <category>interviewprep</category>
    </item>
    <item>
      <title>4 Habits to succeed as a Software Engineer in FAANG</title>
      <dc:creator>Fabian Hinsenkamp</dc:creator>
      <pubDate>Mon, 16 Aug 2021 15:39:59 +0000</pubDate>
      <link>https://dev.to/hinsencamp/4-habits-to-succeed-as-a-software-engineer-in-faang-2f22</link>
      <guid>https://dev.to/hinsencamp/4-habits-to-succeed-as-a-software-engineer-in-faang-2f22</guid>
      <description>&lt;p&gt;Once they have received their offer from a big tech company and see the actually salary, many software engineers start to worry. &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Will I be able to life-up to their expectations, deliver results and be successful? Am I even smart enough to achieve any of this?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Don't worry - you are! If you made it through the technical interviews, you can be sure. I’ve also seen much more people not become successful due to bad habits than due to not being smart enough.&lt;/p&gt;

&lt;p&gt;That’s why I share 4 habits which help you grow as an engineer and accelerate your career in any FAANG company.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Understand what problem you’re solving
&lt;/h2&gt;

&lt;p&gt;This is the very first thing you should become good at. As you won't be able to deliver any meaningful contribution without understanding the actual problem. &lt;/p&gt;

&lt;p&gt;You need to understand how will this thing you’re creating be used; it is almost always a part of a bigger whole.&lt;/p&gt;

&lt;p&gt;Ask these questions before you write a single line of code  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;What are we trying to achieve here?&lt;/li&gt;
&lt;li&gt;What is the user of the system (e.g. the owner of the service that will call you, the end customer) trying to achieve.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is important, because it allows you to make a judgement call which technical problems are real problems, and which are irrelevant. &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Is a risk of worse performance a problem?&lt;/li&gt;
&lt;li&gt;Do you have to have bug-for-bug backwards compatibility?&lt;/li&gt;
&lt;li&gt;How robust do you have to be in case of a dependency going down?&lt;/li&gt;
&lt;li&gt;Is it OK if you lose some small percentage of the traffic?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You shouldn’t ever guess at these things, these should follow from the reasons that you’re building whatever you’re building.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Focus, Focus, Focus
&lt;/h2&gt;

&lt;p&gt;Once you have understood the problem, you start implementing. A successful implementation is a completed one. The key is focus here, and this means to resist a lot of temptations and don't...  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Use all the shiny technologies around you&lt;/li&gt;
&lt;li&gt;Polish the code to infinity&lt;/li&gt;
&lt;li&gt;Try to fix all issues in the world at once&lt;/li&gt;
&lt;li&gt;Try to reinvent a different, much smarter solution to the problem if you’re not really sure it makes sense&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Make it your most important goal to get stuff done.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Communicate clearly
&lt;/h2&gt;

&lt;p&gt;Within a few weeks you spend on a new task, you become the local expert on the underlying problem.&lt;/p&gt;

&lt;p&gt;Most frontend dependencies are not up to date and some have massive security vulnerabilities? &lt;/p&gt;

&lt;p&gt;→ You are going to be the person discovering it. &lt;/p&gt;

&lt;p&gt;The recently introduced backend architecture will have performance repercussions unless you make major changes to it? &lt;/p&gt;

&lt;p&gt;→ You’ll notice that.&lt;/p&gt;

&lt;p&gt;It’s your job to communicate these problems clearly to the folks above you. That means two things: &lt;/p&gt;

&lt;p&gt;First, you need to communicate at all. If there’s a problem that will cause you to deliver slower, your manager and tech lead need to know. They need to know, because what you are building is a part of a larger whole, and so they might need to adjust some other work. But also, they need to know because they’ve seen a lot of stuff, and might have ideas how to solve the problem. And for that to happen, they need to know and understand the problem.    &lt;/p&gt;

&lt;p&gt;Second, you need to communicate clearly, extracting the critical parts. This, I find, is the crucial growth skill at large companies - the people who grow are the ones who can take a deep technical issue, and isolate the parts of it that are important for a more experienced person to reason about it; without requiring them to listen to a two-hour lecture.&lt;/p&gt;

&lt;p&gt;So, when you encounter an unexpected problem, spend some time (a few hours? a few days?) trying to understand it, and communicate upwards. &lt;/p&gt;

&lt;p&gt;I’ve spent a few hours trying to figure out how to do it; and so far no luck. Any ideas? How long should I dig before abandoning this effort?”&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;That includes being up-front about:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;when you think you made a mistake;&lt;/li&gt;
&lt;li&gt;when you’re having issues convincing some other team of something;&lt;/li&gt;
&lt;li&gt;when you’re unable to solve some problem.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Sure, it would be better if you were able to solve everything perfectly - but it’s muuuuch better to admit the mistake or issue than to try and hide it in a (almost always unsuccessful) attempt to look better.&lt;/p&gt;


&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  4. Don’t create problems
&lt;/h2&gt;

&lt;p&gt;Your manager, and your tech lead's goal is to make sure the team gets stuff done. When you have a strong opinion about something they want you to do, something like,  &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;No, I won’t work on this system, because it’s in Java, and I think Java is evil&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;then you’re creating a problem that didn’t exist, and that they need to solve. &lt;/p&gt;

&lt;p&gt;You opinion is valueable to them for sure, as you are much deeper in the weeds but you should always explain your concerns and provide context.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Hey, so I think that I’ll be less effective on this, because it’s in Java, and I don’t really know Java that well.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Now, you’re communicating clearly and you give all the context needed to understand the reasoning behind your statement. &lt;/p&gt;

&lt;p&gt;This allows them to reconsider their decision and let someone else work on the java tasks. Or they on their end provide a little more context on their side and come up with a solution that is better catered towards your personal needs.  &lt;/p&gt;

&lt;p&gt;Something along the lines like - &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“OK, I get it, and I expect to be less proficient - but we’ve got a lot of Java work coming up, and I think it’s more effective if you get up to speed - would you prefer to just dig in, or do you need some up-front time to do codelabs and stuff?”.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;p&gt;Thanks for reading this article! Leave a comment below if you have any questions.&lt;/p&gt;

&lt;p&gt;Recently I have become a senior software engineer at Microsoft, prior I have worked at a mid-sized startup in Berlin, Germany. From experience I know, how intimidating big tech can look from a distance. To help other engineers to make the leap into a FAANG company, I demystify the coding interview on multiple platforms.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;You can connect with me on &lt;a href="https://www.linkedin.com/in/fabianhinsenkamp/"&gt;LinkedIn&lt;/a&gt;, &lt;a href="https://twitter.com/hinsencamp"&gt;Twitter&lt;/a&gt;, or by visiting my &lt;a href="https://studio.youtube.com/channel/UCbCdMtFXZ7zy-3TFbKHEOqQ"&gt;youtube channel&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

</description>
      <category>faang</category>
      <category>carrieradvice</category>
      <category>softwareengineering</category>
    </item>
    <item>
      <title>4 Best Practices to Increase Your Smart Home IoT Security</title>
      <dc:creator>Fabian Hinsenkamp</dc:creator>
      <pubDate>Thu, 07 Jan 2021 09:50:51 +0000</pubDate>
      <link>https://dev.to/hinsencamp/5-best-practices-to-increase-your-smart-home-iot-security-1l66</link>
      <guid>https://dev.to/hinsencamp/5-best-practices-to-increase-your-smart-home-iot-security-1l66</guid>
      <description>&lt;p&gt;Most people who are interested in smart home automation start very enthusiastically into their new hobby, automating as much as they can within their home.&lt;br&gt;
Many are completely unaware of the cybersecurity risk they introduce to their homes, allowing cybercriminals to access their private space just by some clicks.&lt;/p&gt;

&lt;p&gt;In this article, you get an idea about threads in home automation and four simple &amp;amp; effective best security practices, so you can build-out your home smarter without exposing you to additional risk!&lt;/p&gt;

&lt;h2&gt;
  
  
  Security Threads in Home Automation
&lt;/h2&gt;

&lt;p&gt;Home automation has hit the mainstream market in recent years. Previously only a limited group of tech enthusiasts was enjoying the benefits of controlling their homes via their DIY automation systems. Now, we look at a young but fast-growing industry, which offers a wide range of consumer-graded devices like thermostats, televisions, smart locks, and lights. This fast evolution of the ecosystem is shaped by many new inexperienced vendors, vast user adoption and continuously changing technology. Consequently, this boom has drawn a lot of attention from cybercriminals and hackers. It's an ideal habitat for malicious intruders.&lt;/p&gt;

&lt;p&gt;Most of these virtual intruders probably wouldn't empty your home right away, but the increasing amount of connected devices already makes you vulnerable against all kinds of threads. But, once you connect your projects to the web, you are exposed to pretty much any malicious user on the planet, interested in hijacking your devices.&lt;/p&gt;

&lt;p&gt;Consequently, if you're learning about home automation and plan to build some DIY projects around the use case, you’ll want to invest some time to understand secure implications too.&lt;/p&gt;

&lt;p&gt;Hence, we're going to unpack four easy but powerful precautions you can take to defend your DIY smart home ecosystem against cyber-attacks.&lt;/p&gt;

&lt;h2&gt;
  
  
  Simple &amp;amp; Effective Defence Practices
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Secure your Router
&lt;/h3&gt;

&lt;p&gt;It's common sense that locking your front door, or at least keeping it closed is a simple way to prevent intrusion, right? In cybersecurity, not securing your router, is like leaving your front door wide open while you are on holiday.&lt;/p&gt;

&lt;p&gt;It's key to understand, that your router should be untouchable, as it connects all of your IoT devices. Here are some simple tips and tricks to get there.&lt;/p&gt;

&lt;h4&gt;
  
  
  Change the Router's Default Name
&lt;/h4&gt;

&lt;p&gt;As a first step, change your router's default name. Usually, it's the model name given by the manufacturer. Knowing which hardware you use, gives cybercriminals a great advantage to gain access to your network as this makes it easy to exploit your model's vulnerabilities. So simply give your router a unique name that can’t be traced to you or your home address.&lt;/p&gt;

&lt;h4&gt;
  
  
  Generate a Complex Password
&lt;/h4&gt;

&lt;p&gt;Another simple but powerful precaution is to generate a complex password that consists of uppercase, lowercase letters, numbers, and special characters. The longer the password, the better. To make your life easier, consider using a password generator so your password is truly random.&lt;/p&gt;

&lt;p&gt;Also, it's recommended to use a strong encryption protocol — like WPA2 instead of WPA or WEP. WPA2 encryption has the advantage to protect your Wi-Fi access points and also secures your network.&lt;/p&gt;

&lt;p&gt;If available go even for the WPA3 protocol, it is the next revolution in router protection and leverages 128-bit encryption.&lt;/p&gt;

&lt;h4&gt;
  
  
  Use Multiple Passwords
&lt;/h4&gt;

&lt;p&gt;Using different login credentials for every IoT device is another easy step to stop intruders from freely navigating through your system. With different passwords in place, even if one device is compromised, others remain unaffected.&lt;/p&gt;

&lt;p&gt;To make it easier to create and manage and securely store your passwords consider using a password manager app. The only password you must remember the main keyword to access your app.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Set Up A Separate Network for IoT Devices
&lt;/h3&gt;

&lt;p&gt;In general, it's important to keep control of your network. You always want to remain in total control over access and modification of your router and all linked smart home devices.&lt;/p&gt;

&lt;p&gt;If you got a modern router you can start implementing this idea, by creating a guest network separate from your primary network. This way, your relatives, friends, and guests will all access a separate network that doesn’t tie to your IoT devices. That way, you protect your password from unnecessary exposure.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Ensure All Devices Are Always Up-To-Date
&lt;/h3&gt;

&lt;p&gt;Keeping your devices' firmware always up-to-date helps to limit your risk of attack and ensures you got all available security patches available.&lt;br&gt;
Unfortunately, many routers and IoT devices, do not update their corresponding apps automatically.&lt;br&gt;
Best you create a list of all your devices to verify, which once you can make update automatically and which need your special care. Set yourself a reminder to check for updates for your devices that need manual updates. For the rest, always install updates right away.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Enable Two-Factor Authentication
&lt;/h3&gt;

&lt;p&gt;To verify your identity, you get a one-time password (OTP) or a verification code sent to your smartphone or email address. That way, you make it harder for intruders, as they would need to gain access to those accounts first before they could get into your IoT devices.&lt;br&gt;
Most commercial IoT devices have a built-in two-factor feature, if you build your project there are a couple of companies that offer 2FA as a service. Most of these solutions are easy to integrate and still affordable.&lt;/p&gt;

&lt;p&gt;Hopefully, the best practices outlined above sharpened your awareness of cybersecurity and encourage you to take charge of your digital as you do for your analog security.&lt;/p&gt;

</description>
      <category>challenge</category>
      <category>arduino</category>
      <category>electronics</category>
      <category>iot</category>
    </item>
    <item>
      <title>Dos and Don'ts in DIY Hardware Projects</title>
      <dc:creator>Fabian Hinsenkamp</dc:creator>
      <pubDate>Thu, 07 Jan 2021 09:44:57 +0000</pubDate>
      <link>https://dev.to/hinsencamp/dos-and-don-ts-in-diy-hardware-projects-1lkn</link>
      <guid>https://dev.to/hinsencamp/dos-and-don-ts-in-diy-hardware-projects-1lkn</guid>
      <description>&lt;p&gt;The buzz around 5G, AI, Blockchain, and IoT has enabled many new hardware use cases.&lt;/p&gt;

&lt;p&gt;Thus, hardware development experiences a surge in practicality and popularity. This makes it the most exciting time since 20 years to get into electronics and hardware!&lt;br&gt;
As a result, more and more hobbyists get excited to about the niche. Many, without putting the necessary care into their projects.&lt;br&gt;
This practice might lead to &lt;a href="https://100daysofhardware.com/blog/smart-home-security-best-practices/"&gt;self-inflicted security breaches in smart homes&lt;/a&gt; other serious flaws.&lt;/p&gt;

&lt;p&gt;To avoid such beginner's pitfalls and make your journey into electronics and hardware development a success, here are a few general Do’s and Don’ts to guide you.&lt;/p&gt;

&lt;h2&gt;
  
  
  Don’t: Cutting Cost by all Means
&lt;/h2&gt;

&lt;p&gt;Components can eat up your project budget quickly. Keeping track of expenses is important in any development scenario.&lt;/p&gt;

&lt;p&gt;However, fixating too much on the cost of your project and optimizing too early can distract you from making progress, delay or even hinder the successful completion.&lt;br&gt;
You shouldn't start buying components at cheap &amp;amp; dodgy overseas suppliers directly, just to save some bugs.&lt;br&gt;
The potential negative implications are not worth it. More about this, in the &lt;a href="https://100daysofhardware.com/hardware"&gt;100DaysOfHardware Guide: Hardware&lt;/a&gt; &lt;/p&gt;

&lt;h2&gt;
  
  
  Do: Push for prototypes
&lt;/h2&gt;

&lt;p&gt;One way to keep cost under control without sacrificing parts quality is to focus on building prototypes early on.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://blog.seebo.com/iot-prototypes/"&gt;Oren Ezra of Seebo&lt;/a&gt; writes:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“Prototypes can be used to test behaviours, software and firmware interactions in advance, that will affect the final [result]."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;A working prototype will tell you what’s easy or difficult to build and how much a fully build-out project might cost.&lt;br&gt;
You can also build independent prototypes of individual parts of your project.&lt;br&gt;
Instead of buying all components at once in the beginning, you can first only buy some components to build your prototypes.&lt;br&gt;
When you have verified the practical feasibility of your design, you can incrementally acquire the missing parts.&lt;/p&gt;

&lt;h2&gt;
  
  
  Do: Choose the right dev platform
&lt;/h2&gt;

&lt;p&gt;We are bombarded with new development platforms every day. Choosing the right hardware platform is now becoming a critical task for successful hardware development. When you build prototypes, make sure all the functionalities of the final project are validated.&lt;br&gt;
The most popular development platforms are Arduino, Raspberry Pi and Galileo. Some are scalable, whereas others are more customizable, or secure. These have a huge community and many projects are powered by them. Apart from the community support, there are so many add-on modules available for these platforms for different purposes such as display, connectivity, motors, etc.&lt;/p&gt;

&lt;p&gt;The principle of "fail fast, fail early" applies here. You should verify early on, if you work with the right platform. Otherwise, if you find out late that you have picked the wrong platform, you might spend a lot of time with design translation (both software &amp;amp; hardware).&lt;br&gt;
The latest point in time to migrate to a new platform should be after you completed prototyping and before starting the production development.&lt;/p&gt;

&lt;h2&gt;
  
  
  Don’t: Underestimate manufacturing
&lt;/h2&gt;

&lt;p&gt;Often developers get so wrapped up in the theoretical part of hardware design they forget to give proper thought to the actual printed circuit board (PCB) manufacturing process.&lt;br&gt;
Designing and making projects that physically work takes trial and error. You need to plan extra time to development and testing your PCB design and run through multiple manufacturing loops till you eliminated all layout flaws.&lt;/p&gt;

&lt;p&gt;If possible, get into contact with the PCB manufacturers early on. Find out about the specifications they recommend for your kind of project, and whether your initial design would be feasible.&lt;/p&gt;

&lt;h2&gt;
  
  
  Do: Decide on the Technology for Connectivity
&lt;/h2&gt;

&lt;p&gt;Cellular or WIFI connectivity? It might look like a straight forward decision, but it's crucial to know your use case. When your project should work outside of your own home network, WiFi can be error prone as many networks are not friendly to unknown IoT devices.&lt;/p&gt;

&lt;p&gt;As a result, you’re much better off looking at cellular connective technologies like LPWA or LTE-M1, which are low cost. use less energy and can be battery-powered.&lt;/p&gt;

&lt;h2&gt;
  
  
  Don’t: Assume you know everything
&lt;/h2&gt;

&lt;p&gt;Even if it's not your first project anymore, and you have already gained some experienced, don’t fall into the trap that you don’t have anything to learn.&lt;/p&gt;

&lt;p&gt;Electronics, hardware and IoT are complex and ever-evolving fields with strands of expertise that spread from circuit design to product interaction design and a hundred places in between.&lt;br&gt;
Thus, it's almost impossible for one individual to be considered an hardware expert, and even difficult for a whole team.&lt;/p&gt;

&lt;p&gt;Best, you actively seek out areas you are not confident in and build projects around it to improve.&lt;br&gt;
However, don’t let this dishearten you. While you may not be experts in hardware development, you are an expert on your own project. Focus on how your vision and mission and the details will fall naturally into place over time.&lt;/p&gt;

</description>
      <category>challenge</category>
      <category>arduino</category>
      <category>electronics</category>
      <category>iot</category>
    </item>
    <item>
      <title>The Survival Guide to the #100DaysOfHardware Challenge</title>
      <dc:creator>Fabian Hinsenkamp</dc:creator>
      <pubDate>Fri, 18 Dec 2020 20:51:44 +0000</pubDate>
      <link>https://dev.to/hinsencamp/the-survival-guide-to-the-100daysofhardware-challenge-1ph4</link>
      <guid>https://dev.to/hinsencamp/the-survival-guide-to-the-100daysofhardware-challenge-1ph4</guid>
      <description>&lt;p&gt;Let's be honest, starting to learning about electronics, microcontrollers and hardware can be very hard, especially with a lot of experience in Software- but none in Hardware development.  &lt;/p&gt;

&lt;p&gt;I personally never managed to get a grip on hardware topics at all, not till I started this challenge…&lt;/p&gt;

&lt;p&gt;Actually, about &lt;strong&gt;80% of people fail&lt;/strong&gt; in the attempt to pickup a meaningful new habit (&lt;a href="https://pubmed.ncbi.nlm.nih.gov/2980864/"&gt;source&lt;/a&gt;). The main reasons are, &lt;strong&gt;lack of accountability, company and a clear path to success&lt;/strong&gt;. &lt;/p&gt;

&lt;p&gt;It's most often a lonely battle we fight, trying to keep ourselves accountable for achieving a not clearly defined goal. This makes it just too easy to slip.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;To overcome the known pattern of self-deception, I created the #100DaysOfHardware challenge and this survival guide!&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The guide is builds-up on my condensed learnings from my 100 days long journey into the fascinating world of hardware! I hope to encourage you to start your own journey and to provide enough resources and guidance to help you successfully complete it.&lt;/p&gt;

&lt;h3&gt;
  
  
  Table of Content
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;How does the #100DaysOfHardware Challenge work?&lt;/li&gt;
&lt;li&gt;The Origin?&lt;/li&gt;
&lt;li&gt;Why join this public Challenge?&lt;/li&gt;
&lt;li&gt;Who should join the Challenge?&lt;/li&gt;
&lt;li&gt;How to find Time in your Daily Routine?&lt;/li&gt;
&lt;li&gt;How to join the Challenge?&lt;/li&gt;
&lt;li&gt;What hardware do I need to buy for the Challenge?&lt;/li&gt;
&lt;li&gt;How to Structure the Challenge?&lt;/li&gt;
&lt;li&gt;What to learning about Electronics? (Day 0–30)&lt;/li&gt;
&lt;li&gt;What to learning about Arduino? (Day 31–50)&lt;/li&gt;
&lt;li&gt;How to build your own Projects? (Day 51–100)&lt;/li&gt;
&lt;li&gt;Summary&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  How does the #100DaysOfHardware Challenge work? &lt;a&gt;&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;The rules of #100DaysOfHardware are very simple. Each Day for &lt;br&gt;
100 Days, you do:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Learn about electronics and hardware for at least one hour.&lt;/li&gt;
&lt;li&gt;Tweet your progress with the hashtag: &lt;a href="https://twitter.com/search?q=%23100Daysofhardware"&gt;#100DaysOfHardware&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Reach out to someone from the maker community on Twitter.&lt;/li&gt;
&lt;/ol&gt;


&lt;h1&gt;
  
  
  The Origin &lt;a&gt;&lt;/a&gt;
&lt;/h1&gt;

&lt;p&gt;The #100DaysOfHardware challenge originates from my personal desire to learn a lot about electronics and hardware, fast.&lt;br&gt;
Why?&lt;/p&gt;

&lt;p&gt;I got the opportunity to work for Microsoft at the intersection of software and hardware development. I knew taking the offer, would mean to enter a whole new world. Even though, being a software engineer by trade, I never touched any electronics or even an Arduino microcontroller before. I really had to start at zero.&lt;/p&gt;

&lt;p&gt;So, to make myself stick to the plan, I went for the battle-proven "100 days of x" challenge format, hopping for the magic of a public commit to carry me on my journey.&lt;/p&gt;

&lt;p&gt;&lt;iframe class="tweet-embed" id="tweet-1280216487265959936-447" src="https://platform.twitter.com/embed/Tweet.html?id=1280216487265959936"&gt;
&lt;/iframe&gt;

  // Detect dark theme
  var iframe = document.getElementById('tweet-1280216487265959936-447');
  if (document.body.className.includes('dark-theme')) {
    iframe.src = "https://platform.twitter.com/embed/Tweet.html?id=1280216487265959936&amp;amp;theme=dark"
  }



&lt;/p&gt;

&lt;p&gt;The format is extremely popular, since it was invented in 2016 by &lt;a href="https://twitter.com/ka11away"&gt;Alexander Kallaway&lt;/a&gt;, thousands of people have successfully learned how to code, exercise or mediate.&lt;/p&gt;




&lt;h1&gt;
  
  
  Why join this public Challenge? &lt;a&gt;&lt;/a&gt;
&lt;/h1&gt;

&lt;p&gt;To me, three main benefit of this kind of learning challenge stood out&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Increased Accountability
&lt;/h3&gt;

&lt;p&gt;Very quickly, when the number of my follows started to rise, I had a very strong feeling of being hold accountable. I wasn't only learning for myself anymore, there were other people being interested to watch me succeed. Very motivating!&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Personal Advice
&lt;/h3&gt;

&lt;p&gt;During my journey, I got to know the maker community on twitter. When I got frustrated because some circuit didn't work or I couldn't wrap my head around a complex topics, there was someone more experienced I could ask for advice. Saved me at least twice from giving up.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Inspiration
&lt;/h3&gt;

&lt;p&gt;The maker community on twitter is a global one. I drew a lot of inspiration from other people's projects and ideas. It really reassured me that, there isn't a right or wrong way to learn and apply electronics. The variety of projects is just stunning!&lt;/p&gt;

&lt;p&gt;Besides these main benefits, I started to appreciate the long time commitment. It really helped me to take my time to build a habit of in-depth learning, instead of just binging some shallow tutorials whenever I could find some free time. If you are serious about starting something new, I really can recommend the format.&lt;/p&gt;




&lt;h1&gt;
  
  
  Who should join the Challenge? &lt;a&gt;&lt;/a&gt;
&lt;/h1&gt;

&lt;p&gt;If you are unsure, if it makes sense for you to learn about hardware, electronics, Arduino and the Internet of Things, here are a couple of reasons people have to dive into this area:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You are looking for an effective way to complement your education to land a job in an electronics oriented environment like a hardware startup, wearable manufacturer or industry 4.0 consultancy.&lt;/li&gt;
&lt;li&gt;You want to refresh your knowledge and get back the joy of hands-on tinkering, as you graduated from college quite some time ago.&lt;/li&gt;
&lt;li&gt;You are a college major in electrical-, software- or a related engineering field and want to get some hands-on experience besides all the theory.
You are simply fascinated by electronics, circuits, hardware etc. and want to make tinkering with technology your new hobby.&lt;/li&gt;
&lt;li&gt;You have a dream hardware project, you feared to start building till now.&lt;/li&gt;
&lt;/ul&gt;




&lt;h1&gt;
  
  
  How to find Time in your Daily Routine? &lt;a&gt;&lt;/a&gt;
&lt;/h1&gt;

&lt;p&gt;Finding the time is probably the toughest question to answer when considering to join the challenge. Especially, when you are working full time, plus you also have a family or other responsibilities.&lt;/p&gt;

&lt;p&gt;As a general learning, it's most importantly to commit to a realistic amount of time you can put in learning on a daily bases.&lt;/p&gt;

&lt;p&gt;Don't overcommit, e.g. making yourself spend 3h a day on the challenge , while you actually don't have as much time. Exploiting yourself and letting other responsibilities slip will likely lead to frustration and endanger reaching Day 100 . Remember, the challenge is about building a healthy habit of learning and personal growth.&lt;/p&gt;

&lt;p&gt;In my case, my weekends are always pretty packed, so I had to limit my commitment to weekdays only.&lt;/p&gt;

&lt;p&gt;However, I must warn you - currently there is a bit of a problem. Researching learning material, projects and hardware components that can keep up with your constantly increasing level of knowledge will take extra time, besides the time you spend actually tinkering and learning.&lt;/p&gt;

&lt;p&gt;I hope to solve this problem soon by build-up &lt;a href="https://100daysofhardware.com/"&gt;100DaysOfHardware.com&lt;/a&gt; as a learning hub, to get you the right resources at the right time, so you can successfully participate in the challenge with only an investment of one hour a day.&lt;/p&gt;

&lt;p&gt;If you want to get notified about project updates, signup here:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://100daysofhardware.com/newsletter/"&gt;Get notified about all upcoming bite-sized challenge guides&lt;/a&gt;&lt;/p&gt;




&lt;h1&gt;
  
  
  How to join the Challenge? &lt;a&gt;&lt;/a&gt;
&lt;/h1&gt;

&lt;p&gt;Nothing is easier than this:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Order your basic hardware kit.&lt;/li&gt;
&lt;li&gt;As soon as your kit arrives &lt;a href="https://ctt.ac/C916K"&gt;tweet out your commitment.&lt;/a&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;That's it, you are all set!&lt;/p&gt;




&lt;h1&gt;
  
  
  What hardware do I need to buy for the Challenge? &lt;a&gt;&lt;/a&gt;
&lt;/h1&gt;

&lt;p&gt;First of all, let me debunked the common belief that you need tons of expensive equipment to event start learning about electronics. This is simply not true.&lt;/p&gt;

&lt;p&gt;You can get away with spending &lt;strong&gt;less than 100$&lt;/strong&gt; for all equipment and components you need for the whole challenge. It mostly depends on the complexity of your own projects and how much optional equipment you want to get.&lt;/p&gt;

&lt;p&gt;In electronics equipment there is a very wide price range. You can get a basic version of a certain item for very cheap, while there is mostly also a standard and a high end version available for 10x the price of the basic version. Therefore, I will link you an option for all price ranges. In most cases, the the basic or medium version is totally sufficient for the challenge.&lt;/p&gt;

&lt;h2&gt;
  
  
  Must Have
&lt;/h2&gt;

&lt;p&gt;The following items are absolute must haves to get through the first 50 days of the challenge. Also in the later stages, they will be a solid foundation to build upon.&lt;/p&gt;

&lt;h3&gt;
  
  
  Basic Hardware Kit (13–99$)
&lt;/h3&gt;

&lt;p&gt;To kickoff your challenge, it makes sense to get a plain electronics starter kit. These kits include a variety of basic electronics components that will fuel your initial learning phase focused on pure electronics.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;em&gt;Basic&lt;/em&gt; Electronics Basic Kit, 350pcs - 13.5$ (&lt;a href="https://www.amazon.com/REXQualis-Electronics-Breadboard-Resistor-Raspberry/dp/B078XV3RK2/ref=sr_1_2_sspa?dchild=1&amp;amp;keywords=electronics+kit&amp;amp;qid=1607418281&amp;amp;refinements=p_36%3A1253503011&amp;amp;rnid=386442011&amp;amp;s=electronics&amp;amp;sr=1-2-spons&amp;amp;psc=1&amp;amp;spLa=ZW5jcnlwdGVkUXVhbGlmaWVyPUEzTlU4S1NROEVRWDRGJmVuY3J5cHRlZElkPUEwMzkwODE3NVBRUDJZQkJYQVVUJmVuY3J5cHRlZEFkSWQ9QTAwMTQ2NjUyTUo1VjJQUzRaRzNZJndpZGdldE5hbWU9c3BfYXRmJmFjdGlvbj1jbGlja1JlZGlyZWN0JmRvTm90TG9nQ2xpY2s9dHJ1ZQ=="&gt;link&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Medium&lt;/em&gt; Electronics Component Fun Kit, 500pcs - 16$ (&lt;a href="https://www.amazon.com/REXQualis-Electronics-tie-Points-Breadboard-Potentiometer/dp/B073ZC68QG/ref=pd_sbs_328_11?_encoding=UTF8&amp;amp;pd_rd_i=B073ZC68QG&amp;amp;pd_rd_r=5acaf08e-52ff-4daa-ac1e-d72f2582d83b&amp;amp;pd_rd_w=6azML&amp;amp;pd_rd_wg=MtjdJ&amp;amp;pf_rd_p=ed1e2146-ecfe-435e-b3b5-d79fa072fd58&amp;amp;pf_rd_r=MA924EBY2ZXPKW5EVR5N&amp;amp;psc=1&amp;amp;refRID=MA924EBY2ZXPKW5EVR5N"&gt;link&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;High-end&lt;/em&gt; Electronic Component Assortment, 2000pcs - 99$ (&lt;a href="https://www.amazon.com/Interstellar-Electronic-Assortment-Transistors-Potentiometer/dp/B07D1HVZ15/ref=sr_1_4?dchild=1&amp;amp;keywords=electronics+kit&amp;amp;qid=1607417626&amp;amp;sr=8-4"&gt;link&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If possible, try to get a large breadboard, your circuits will outgrow the small once very quickly. Most of these kits come with 5V power supplies, however you probably need to get an additional power cord. Instead of spending another 5$ on one of these, it's a good idea to get your microcontroller directly and use it as a power source, as Arduinos almost always come with an USB cable to power it from your computer.&lt;/p&gt;

&lt;h3&gt;
  
  
  Microcontroller (7–24$)
&lt;/h3&gt;

&lt;p&gt;Latest when you reach the second section of the challenge covering digital electronics, you need to get a microcontroller. Arduino is the goto brand for microcontrollers. But there are also Arduino clones available which are fully compatible with other Arduino and ship for a cheaper price by still remaining a good product quality. If you have decided for a basic electronics kit initially, you should get a microcontroller from the get go to use it as your power source - saves you some bugs for another power cord.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;em&gt;Basic&lt;/em&gt; Seeduino (Arduino Uno Clone) - 7$ (&lt;a href="https://www.seeedstudio.com/Seeeduino-V4-2-p-2517.html?utm_source=blog&amp;amp;utm_medium=blog"&gt;link&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Medium&lt;/em&gt; Elegroo Uno R3 (Arduino Uno Clone) - 14$ (&lt;a href="https://www.amazon.com/ELEGOO-Board-ATmega328P-ATMEGA16U2-Compliant/dp/B01EWOE0UU/ref=sr_1_1_sspa?dchild=1&amp;amp;keywords=arduino+uno+chip&amp;amp;qid=1607419792&amp;amp;sr=8-1-spons&amp;amp;psc=1&amp;amp;spLa=ZW5jcnlwdGVkUXVhbGlmaWVyPUExSzhaTE1GVTFCREEmZW5jcnlwdGVkSWQ9QTAxNDM4OTMyT0NEMVFNVzFIVFcwJmVuY3J5cHRlZEFkSWQ9QTA0ODM4MzMxSUg3UjhZVFIzTDVSJndpZGdldE5hbWU9c3BfYXRmJmFjdGlvbj1jbGlja1JlZGlyZWN0JmRvTm90TG9nQ2xpY2s9dHJ1ZQ=="&gt;link&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;High-end&lt;/em&gt; Original Arduino Uno - $24(&lt;a href="https://www.amazon.com/Arduino-A000066-ARDUINO-UNO-R3/dp/B008GRTSV6/ref=sr_1_3?dchild=1&amp;amp;keywords=arduino+uno&amp;amp;qid=1607419745&amp;amp;sr=8-3"&gt;link&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Electronic Components
&lt;/h3&gt;

&lt;p&gt;During my own challenge I got to the point, where my projects required additional electronic components and sensors which where not included in my basic starter kit. Probably, when starting to fiddle with your own project you will get there too. I used three different options to get my parts. None of them is perfect, they all come with pros and cons.&lt;/p&gt;

&lt;h4&gt;
  
  
  Cheap &amp;amp; Unreliable: AliExpress, Wish &amp;amp; Ebay
&lt;/h4&gt;

&lt;p&gt;You can get your components directly from Chinese suppliers. I tried out AliExpress, Wish and Ebay. They all allowed me to cut out the middle man and save 20–40% on some items. So it's definitely the cheapest source, unfortunately that's the only positive aspect of it. However, I had to wait very long for my orders, did not get any tracking ids and had to pay quite some shipping fees which mitigated the initial cost savings.&lt;/p&gt;

&lt;p&gt;I was lucky to find some quality suppliers there, and got nice additional breadboards.&lt;/p&gt;

&lt;p&gt;&lt;iframe class="tweet-embed" id="tweet-1308498181647486984-88" src="https://platform.twitter.com/embed/Tweet.html?id=1308498181647486984"&gt;
&lt;/iframe&gt;

  // Detect dark theme
  var iframe = document.getElementById('tweet-1308498181647486984-88');
  if (document.body.className.includes('dark-theme')) {
    iframe.src = "https://platform.twitter.com/embed/Tweet.html?id=1308498181647486984&amp;amp;theme=dark"
  }



&lt;/p&gt;

&lt;p&gt;Looking back, I would definitely recommend it as a source for simple, non critical parts. For everything you need in time to continue your learning, I wouldn't use any of those sources. As it's not worth killing your learning routine for some cheap parts.&lt;/p&gt;

&lt;p&gt;More complex (e.g. ICs) parts or tools (e.g. soldering iron, multimeter) I also wouldn't buy there at all. Especially since these suppliers do not have to comply to any of your local safety or quality standards. I personally don't want to risk soldering components which might include toxic raw materials or have a soldering Iron start doing funny things while I am using it.&lt;/p&gt;

&lt;p&gt;Here you find the links&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.wish.com/"&gt;Wish&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.aliexpress.com/"&gt;AliExpress&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://ebay.com"&gt;Ebay&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Online Electronics Shops
&lt;/h4&gt;

&lt;p&gt;When I had a complete parts list for my own project, I tried out some well established online electronics shops, quite a good experience! They really offer a tremendously large selection of components. There is probably nothing you can't find in their inventories. However, you will need to know exactly what you are looking for, otherwise you drown in pages and pages of identically looking components, just differing in some technical detail.&lt;/p&gt;

&lt;p&gt;&lt;iframe class="tweet-embed" id="tweet-1294302896885059592-601" src="https://platform.twitter.com/embed/Tweet.html?id=1294302896885059592"&gt;
&lt;/iframe&gt;

  // Detect dark theme
  var iframe = document.getElementById('tweet-1294302896885059592-601');
  if (document.body.className.includes('dark-theme')) {
    iframe.src = "https://platform.twitter.com/embed/Tweet.html?id=1294302896885059592&amp;amp;theme=dark"
  }



 &lt;/p&gt;

&lt;p&gt;These electronics retails are quite expensive, especially when only ordering small quantities, their shipping cost were ax expensive as ordering directly from China. However, the quality was up to the mark.&lt;br&gt;
So, I'd recommend to get specific and complex components there. If possible batch order, to mitigate the high shipping cost. &lt;/p&gt;

&lt;p&gt;The largest and globally operating shops are:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.mouser.com/"&gt;Mouser&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.rs-online.com/"&gt;RS Components&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.reichelt.com/"&gt;Reichelt&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;
  
  
  Local Electronics Shops
&lt;/h4&gt;

&lt;p&gt;For some urgent needs I also checked out my local electronics store. Wasn't a bad experience at all. It is great to have someone you can talk to in person about your project and if in doubt about the component you need, you can definitely get some advice. &lt;br&gt;
However, I had the experience that they had a very limited selection of components instantly available, even rather generic components like a simple IC holder wasn't available when I was there. Might have been a coincident, but clearly they can't compete with global online shops when it comes to range of available products. &lt;/p&gt;

&lt;p&gt;Their big strength is personal service, instant availability and no shipping costs, so even picking up small quantities is makes sense.&lt;/p&gt;
&lt;h2&gt;
  
  
  Nice to have
&lt;/h2&gt;

&lt;p&gt;There are also a couple of items which are nice to have, but definitely not required to successfully complete your challenge.&lt;/p&gt;
&lt;h3&gt;
  
  
  Microcontroller Kit (36$-90$)
&lt;/h3&gt;

&lt;p&gt;A basic electronics kit + extra Arduino will get you very far already. Alternatively, there are also a lot of dedicated Arduino Starter Kits, however I wouldn't recommend going for one of them. These come already with a microcontroller and many complex electronics components like sensors, motors, bluetooth remote controls etc. Even though all these toys are very tempting to play with, they will not help you grow as much has mastering a wide range of basic components first. Nevertheless, here are some good option if you want to go down that road:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;em&gt;Basic&lt;/em&gt; Elegroo (Arduino Clone) Kit - 36$ (&lt;a href="https://www.amazon.com/ELEGOO-Project-Tutorial-Controller-Projects/dp/B01D8KOZF4/ref=sr_1_1_sspa?dchild=1&amp;amp;keywords=arduino+kit&amp;amp;qid=1607418827&amp;amp;sr=8-1-spons&amp;amp;psc=1&amp;amp;spLa=ZW5jcnlwdGVkUXVhbGlmaWVyPUExV1pGN1kxU0JPQk8yJmVuY3J5cHRlZElkPUEwMjY4MTQ2UFJDTEZZRk44WTNQJmVuY3J5cHRlZEFkSWQ9QTEwMDEzNzYzVFNPV0pHQ01HTlNCJndpZGdldE5hbWU9c3BfYXRmJmFjdGlvbj1jbGlja1JlZGlyZWN0JmRvTm90TG9nQ2xpY2s9dHJ1ZQ=="&gt;link&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Medium&lt;/em&gt; Elegroo (Arduino Clone) Kit - 53$ (&lt;a href="https://www.amazon.com/EL-KIT-001-Project-Complete-Starter-Tutorial/dp/B01CZTLHGE/ref=sr_1_9?dchild=1&amp;amp;keywords=arduino+kit&amp;amp;qid=1607418827&amp;amp;sr=8-9"&gt;link&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;High-end&lt;/em&gt; original Arduino Kit - 90$ (&lt;a href="https://www.amazon.com/Arduino-Starter-Kit-English-Official/dp/B009UKZV0A/ref=sr_1_3?dchild=1&amp;amp;keywords=arduino+kit&amp;amp;qid=1607418827&amp;amp;sr=8-3"&gt;link&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  Multimeter (11–62$)
&lt;/h3&gt;

&lt;p&gt;The multimeter is one of the more useful "nice to have" items. It allows you to measure current, voltage, resistance and continuity. I got mine probably during day 10–20 and it helped me big time to verify assumptions I made based on circuit theory I learned at that time.&lt;/p&gt;

&lt;p&gt;Later on it also helped me to debug my own project, as unfortunately you can't see whats goes wrong with your circuit, only some times a component goes up in smoke, indicating that something is wrong.&lt;/p&gt;

&lt;p&gt;A basic meter will definitely carry you though the challenge, however I recommend to pick the medium one, as it's still affordable and "auto ranging", meaning it finds the most suitable range to display your measured value automatically - very convenient.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;em&gt;Basic&lt;/em&gt; digital Multimeter - 11.50$ (&lt;a href="https://www.amazon.com/Etekcity-Multimeter-MSR-R500-Electronic-Multimeters/dp/B01N9QW620/ref=sr_1_20?crid=2XENJ92B4O8E1&amp;amp;dchild=1&amp;amp;keywords=self+ranging+multimeter&amp;amp;qid=1607421362&amp;amp;sprefix=multimeter+self%2Caps%2C269&amp;amp;sr=8-20"&gt;link&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Medium&lt;/em&gt; digital Multimeter - 23$ (&lt;a href="https://www.amazon.com/INNOVA-3320-Auto-Ranging-Digital-Multimeter/dp/B000EVYGZA/ref=sr_1_5?crid=2XENJ92B4O8E1&amp;amp;dchild=1&amp;amp;keywords=self%2Branging%2Bmultimeter&amp;amp;qid=1607421362&amp;amp;sprefix=multimeter%2Bself%2Caps%2C269&amp;amp;sr=8-5&amp;amp;th=1"&gt;link&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;High-end&lt;/em&gt; digital Multimeter - 62$ (&lt;a href="https://www.amazon.com/Mastech-MS8229-Auto-Range-Multi-Functional-Multimeter/dp/B000JKMTDM/ref=sr_1_4?crid=2XENJ92B4O8E1&amp;amp;dchild=1&amp;amp;keywords=self+ranging+multimeter&amp;amp;qid=1607421362&amp;amp;refinements=p_36%3A1253530011&amp;amp;rnid=1243644011&amp;amp;s=hi&amp;amp;sprefix=multimeter+self%2Caps%2C269&amp;amp;sr=1-4"&gt;link&lt;/a&gt;))&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  Soldering Iron (15–70$)
&lt;/h3&gt;

&lt;p&gt;Soldering is skill I did not expect to pickup myself. I believed I could stick to using solderless breadboards for all my 100 days. When I got to build my own more complex project though, I was struggling, as many issues were caused my wiring mistakes. Learning to solder allowed me to hardwire connections and be sure they will remain function correctly while moving on. For me it was a worthy invest of time and money.&lt;/p&gt;

&lt;p&gt;The price range of soldering equipment is just crazy. You can get a full set with plenty of accessories for 9$, while you can also spend 50$ to just get a plain soldering iron. If you can afford it, I'd recommend to go with the one from the mid price range. The cheapest will just be a gamble on how long it lasts, while the expensive one is a good choice when you expect to use it excessively. Keep in mind will need some more accessories like Helping Hands, Desoldering Pump and a Roll of Solder.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;em&gt;Basic&lt;/em&gt; Soldering Kit - 9$, (&lt;a href="https://www.amazon.com/Soldering-Kit-Temperature-Desoldering-Electronics/dp/B07XKZVG8Z/ref=sr_1_5?crid=3VDYE6IE69XPF&amp;amp;dchild=1&amp;amp;keywords=soldering+iron&amp;amp;qid=1607501736&amp;amp;sprefix=soldering+%2Caps%2C260&amp;amp;sr=8-5"&gt;link&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Medium&lt;/em&gt; Soldering Kit - 25$ (&lt;a href="https://www.amazon.com/YIHUA-Adjustable-Temperature-Soldering-428-896%E2%84%89/dp/B07RY6HS6G/ref=sr_1_36?crid=3VDYE6IE69XPF&amp;amp;dchild=1&amp;amp;keywords=soldering+iron&amp;amp;qid=1607502533&amp;amp;refinements=p_36%3A1253529011%2Cp_72%3A1248909011&amp;amp;rnid=1248907011&amp;amp;s=hi&amp;amp;sprefix=soldering+%2Caps%2C260&amp;amp;sr=1-36"&gt;link&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Medium+&lt;/em&gt; Soldering Station + 5 Soldering Tips - 40$ (&lt;a href="https://www.amazon.com/Soldering-Additional-392%E2%84%89-896%E2%84%89-Temperature-Adjustable/dp/B07Z3KCVCL/ref=sr_1_75?crid=3VDYE6IE69XPF&amp;amp;dchild=1&amp;amp;keywords=soldering+iron&amp;amp;qid=1607501736&amp;amp;sprefix=soldering+%2Caps%2C260&amp;amp;sr=8-75"&gt;link&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  Oscilloscope
&lt;/h3&gt;

&lt;p&gt;A Oscilloscope is an advanced diagnostics tool that shows you a visual wave graph of an electronic signal. They have tons of sophisticated analysis applications, so you could use it for visualizing the time and voltage values of a signal or verify whether or not a malfunctioning component is distorting the signal. &lt;br&gt;
Initially I believed, that I would need one, but to be honest, getting an oscilloscopes for tinkering with starter kits and smaller projects is a bit over the top. Especially, since proper once start at about 300$.&lt;br&gt;
Long story short, get a good multimeter, that will be more than enough.&lt;/p&gt;


&lt;h1&gt;
  
  
  How to Structure the Challenge? &lt;a&gt;&lt;/a&gt;
&lt;/h1&gt;

&lt;p&gt;When I started my challenge run, the sheer width and depth of the hardware topic completely overwhelmed me. Hence, I recommend you to structure you challenge in the following three main sections, especially when you are completely new to the field.&lt;/p&gt;

&lt;p&gt;&lt;iframe class="tweet-embed" id="tweet-1285309900684439558-206" src="https://platform.twitter.com/embed/Tweet.html?id=1285309900684439558"&gt;
&lt;/iframe&gt;

  // Detect dark theme
  var iframe = document.getElementById('tweet-1285309900684439558-206');
  if (document.body.className.includes('dark-theme')) {
    iframe.src = "https://platform.twitter.com/embed/Tweet.html?id=1285309900684439558&amp;amp;theme=dark"
  }



&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Learn Electronics (Day 1–30)
&lt;/h2&gt;

&lt;p&gt;The idea is, to first learn about electronics. This includes, components types, how to build circuits, and some other practical skills. A clear project-based learning path is very valuable here, as you can get lost in complexity very easily.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Learn Arduino (Day 31–50)
&lt;/h2&gt;

&lt;p&gt;Next, you should transition into digital electronics by learning about the microcontrollers. the Arduino platform is a great starting point, as it's really user friends and there is plenty of simple projects out there which build upon the Arduino.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Build your own Projects (Day 51–100)
&lt;/h2&gt;

&lt;p&gt;In the second half of the challenge, I recommend to use all the knowledge you acquired, to build projects you really care about. Thereby, it's much easier to keep up the motivation and you will learn much more than strictly following shallow tutorials.&lt;/p&gt;

&lt;p&gt;I personally build a control board for an old mechanical flip-dot display as my project 50+ project. It was definitely the most valuable project I worked on during the whole time, as I really wanted it to work in the end.&lt;/p&gt;

&lt;p&gt;&lt;iframe class="tweet-embed" id="tweet-1312163585020235776-861" src="https://platform.twitter.com/embed/Tweet.html?id=1312163585020235776"&gt;
&lt;/iframe&gt;

  // Detect dark theme
  var iframe = document.getElementById('tweet-1312163585020235776-861');
  if (document.body.className.includes('dark-theme')) {
    iframe.src = "https://platform.twitter.com/embed/Tweet.html?id=1312163585020235776&amp;amp;theme=dark"
  }



 &lt;/p&gt;

&lt;p&gt;As general advice, don't make to detailed plans for day 50+ in advance. Your growing knowledge will spawn new ideas and increase clarity on existing once. So give yourself plenty of room to adapt. Just note your current ideas and believes, to review when it's time to decide what project to start next.&lt;/p&gt;


&lt;h1&gt;
  
  
  What to learning about Electronics?(Day 0–30) &lt;a&gt;&lt;/a&gt;
&lt;/h1&gt;

&lt;p&gt;I believe, it is crucial to give yourself plenty of time initially really dig into electronics to learn and digest the core principles. During my own challenge, I made the mistake to move into too complex topics too early. As a result, I got very frustrated later on and almost quit, as I couldn't comprehend what was going wrong.&lt;/p&gt;

&lt;p&gt;There are some important concepts you should definitely cover:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Voltage, Current, Resistance&lt;/li&gt;
&lt;li&gt;Direct Current (DC) and Alternating Current (AC)&lt;/li&gt;
&lt;li&gt;Parallel vs. Serial Circuits&lt;/li&gt;
&lt;li&gt;Ohm's Law&lt;/li&gt;
&lt;li&gt;Kirchhoff's circuit law&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You will come across many very technical and math heavy tutorials and articles when researching these topics. Don't get hung up on it. It is helpful to get some basic skills of circuit analysis so you can understand, e.g. why you can measure a certain level of voltage at a specific component. &lt;/p&gt;

&lt;p&gt;The theory beyond those basics, is helpful but not required at this point in time. Building real projects will teach you much more than studying all dry theory beforehand.&lt;/p&gt;

&lt;p&gt;You should also get a good grasp of the following basic electronic components:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Resistor&lt;/li&gt;
&lt;li&gt;LED&lt;/li&gt;
&lt;li&gt;mechanical Button&lt;/li&gt;
&lt;li&gt;Potentiometer&lt;/li&gt;
&lt;li&gt;Capacitor&lt;/li&gt;
&lt;li&gt;Diode&lt;/li&gt;
&lt;li&gt;RGB LED&lt;/li&gt;
&lt;li&gt;Transistor&lt;/li&gt;
&lt;li&gt;Photoresistor&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;While tinkering with these components, it will inevitably be helpful to pickup some additional skills:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;How to use a bread board&lt;/li&gt;
&lt;li&gt;How to read technical "data sheets" of components&lt;/li&gt;
&lt;li&gt;How to read circuit diagrams&lt;/li&gt;
&lt;li&gt;Learn how to use a multimeter&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The most effective and fun way to consolidate your new knowledge is by building increasingly complex bread board projects.&lt;/p&gt;

&lt;p&gt;A good starting point would be a simply blinking LED circuit which you then extend with every freshly mastered component&lt;/p&gt;

&lt;p&gt;&lt;iframe class="tweet-embed" id="tweet-1281309731236335616-81" src="https://platform.twitter.com/embed/Tweet.html?id=1281309731236335616"&gt;
&lt;/iframe&gt;

  // Detect dark theme
  var iframe = document.getElementById('tweet-1281309731236335616-81');
  if (document.body.className.includes('dark-theme')) {
    iframe.src = "https://platform.twitter.com/embed/Tweet.html?id=1281309731236335616&amp;amp;theme=dark"
  }



&lt;/p&gt;

&lt;p&gt;After you have a good grasp of basic electronics, there are some more advanced components called integrated circuits (ICs) which are worth exploring. Here are two very important once, used in many application contexts:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;555 timer&lt;/li&gt;
&lt;li&gt;shift register&lt;/li&gt;
&lt;/ul&gt;




&lt;h1&gt;
  
  
  What to learning about Arduino?(Day 31-50) &lt;a&gt;&lt;/a&gt;
&lt;/h1&gt;

&lt;p&gt;After you got a solid understanding of electronics in general, it's a good point in time leap into digital electronics. While so far, our power source was static, now we get to know micro controllers which allow us to programatically control the flow of current.&lt;/p&gt;

&lt;p&gt;As a software engineer, it won't be hard to wrap your head around how to program the Arduino.&lt;br&gt;
Thanks to the extensive Arduino libraries it, it feels like a simplified version of c. Even though, I have never written c before, I did struggle to achieve my goals. &lt;/p&gt;

&lt;p&gt;The Arduino in general, is a very user friendly microcontroller and makes it easy to learn the basics of programming on the fly.&lt;/p&gt;

&lt;p&gt;Nevertheless, I recommend you to start off with a course on Arduino, to get a feel for this technology.&lt;/p&gt;

&lt;p&gt;Most importantly though, find yourself small projects to build. As with basic electronic components, this will make learning and understanding the Arduino technology much easier than just reading about theory or watching shallow tutorials.&lt;/p&gt;

&lt;p&gt;&lt;iframe class="tweet-embed" id="tweet-1300826121018191872-708" src="https://platform.twitter.com/embed/Tweet.html?id=1300826121018191872"&gt;
&lt;/iframe&gt;

  // Detect dark theme
  var iframe = document.getElementById('tweet-1300826121018191872-708');
  if (document.body.className.includes('dark-theme')) {
    iframe.src = "https://platform.twitter.com/embed/Tweet.html?id=1300826121018191872&amp;amp;theme=dark"
  }



&lt;/p&gt;

&lt;p&gt;When you are getting closer to the end of your microcontroller days , you will have learned quite a lot about digital electronics. That's when it gets really interesting! &lt;/p&gt;

&lt;p&gt;You could for example start to control advanced electronics components like a shift register with an Arduino.&lt;/p&gt;




&lt;h1&gt;
  
  
  How to build your own Projects?(Day 51–100) &lt;a&gt;&lt;/a&gt;
&lt;/h1&gt;

&lt;p&gt;As mentioned before, In the second half of the challenge, I recommend to use all the knowledge you acquired, to build projects you really care about. Now, I'd like to extend that advice and say, even pick a project you consider to be very challenging, almost impossible to master at your current level of knowledge.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Why is such a bolt move is a good idea?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Let your curiosity drive you, only a project you deeply care about will motivate you to continue, thrive for perfection and let you outgrow all the initial unknowns.&lt;br&gt;
You have a lot of time, so no reason to be afraid of the skills and knowledge the project needs and you don't have yet. You can gain all of them during the next weeks.&lt;/p&gt;

&lt;p&gt;Keep in mind, this challenge is about personal growth, even if you couldn't fully complete the project in time, you are achieving your initial goal of establishing a daily routine of learning and personal growth.&lt;/p&gt;

&lt;p&gt;My project of building a control board for my old mechanical flipdot display, eventually came together quite nicely. On the way there, I even learned to read complex schematics and how to solder. Did I believed, that I could fit this into my challenge? No of course not!&lt;/p&gt;

&lt;p&gt;&lt;iframe class="tweet-embed" id="tweet-1329811686379941892-909" src="https://platform.twitter.com/embed/Tweet.html?id=1329811686379941892"&gt;
&lt;/iframe&gt;

  // Detect dark theme
  var iframe = document.getElementById('tweet-1329811686379941892-909');
  if (document.body.className.includes('dark-theme')) {
    iframe.src = "https://platform.twitter.com/embed/Tweet.html?id=1329811686379941892&amp;amp;theme=dark"
  }



&lt;/p&gt;

&lt;p&gt;How to find your own passion project, that triggers your curiosity and keeps you moving?&lt;/p&gt;

&lt;p&gt;Here is a small overview of real world use cases for DIY electronics and hardware:&lt;/p&gt;

&lt;h4&gt;
  
  
  Computer Electronics
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;8-bit Computer&lt;/li&gt;
&lt;li&gt;Retro gaming&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Sound / music production
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;guitar paddels&lt;/li&gt;
&lt;li&gt;synthesizers&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Home automation
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Plant watering system&lt;/li&gt;
&lt;li&gt;Remote Light control&lt;/li&gt;
&lt;li&gt;Security system&lt;/li&gt;
&lt;li&gt;connect home appliances to the web (ioT)&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Visual Art
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;LED cube&lt;/li&gt;
&lt;li&gt;LED walls&lt;/li&gt;
&lt;li&gt;Flipdot displays&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Vehicles/robots
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Drones&lt;/li&gt;
&lt;li&gt;self-diving (toy) cars&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Video/Film making
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Kamera Slider&lt;/li&gt;
&lt;li&gt;Turntable display&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;To get a better idea about the different areas of application, you can use Youtube, Pinterest, Instagram or just plane google for your initial research. &lt;/p&gt;

&lt;p&gt;You will find all kinds of projects other makers create in these fields. Unfortunately, it can be hard to find a detailed list of components and resources for the projects on these platforms.&lt;/p&gt;

&lt;p&gt;As soon as you know which area you are interested in, it is time to check out some websites especially dedicated to makers. There, people share their projects in great detail often including a parts list.&lt;/p&gt;

&lt;p&gt;My favourite makes websites are:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="http://hackaday.io/"&gt;HackAday&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.hackster.io/"&gt;Hackster.io&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.instructables.com/circuits/"&gt;Instructables&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.electromaker.io"&gt;Electromaker&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I also made the experience that you can easily approach creators on these platforms get some more details and open questions answered.&lt;/p&gt;




&lt;h1&gt;
  
  
  Summary &lt;a&gt;&lt;/a&gt;
&lt;/h1&gt;

&lt;p&gt;To conclude this guide, I believe the "100 days of x" challenge format is a great fit for getting started with electronics, Arduino and hardware projects in general. Personally, I had a great time, and learned more than I anticipated before I started.&lt;/p&gt;

&lt;p&gt;However, it's still a big challenge to find suitable resources so if you are on a tight schedule it will be challenging to learn, research theory &amp;amp; projects every day.&lt;/p&gt;

&lt;p&gt;To change this, I am building up 100DaysOfHardware.com as a learning hub, to allow everyone even with a tight schedule (max. 1h a day) to successfully complete the challenge!&lt;/p&gt;

&lt;p&gt;&lt;a href="http://eepurl.com/g9mmhP"&gt;Get notified about all upcoming bite-sized challenge guides&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Thanks to everyone from the community who supported, inspired and motivated me! &lt;/p&gt;

&lt;p&gt;I'd be happy if I could give back, so don't hesitate to reach out to me, when you any questions about the challenge or you need more support to get it going!&lt;/p&gt;

&lt;p&gt;👉 &lt;a href="//twitter.com/hinsencamp"&gt;twitter.com/hinsencamp&lt;/a&gt;&lt;/p&gt;

</description>
      <category>challenge</category>
      <category>arduino</category>
      <category>electronics</category>
      <category>guide</category>
    </item>
    <item>
      <title>The "hello world" circuit</title>
      <dc:creator>Fabian Hinsenkamp</dc:creator>
      <pubDate>Wed, 10 Jul 2019 00:00:00 +0000</pubDate>
      <link>https://dev.to/hinsencamp/the-hello-world-circuit-1ggf</link>
      <guid>https://dev.to/hinsencamp/the-hello-world-circuit-1ggf</guid>
      <description>&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fxv6ahp9auepw6g4wx4lc.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fxv6ahp9auepw6g4wx4lc.jpg" alt="circutit_complete" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This guide shows how to build a simple circuit which is the equivalent to a 'hello world' program. It is part of #100DaysofHardware - A challenge, I pioneer to help other's like me to learn about electronics, microcontrollers and eventually IoT.&lt;/p&gt;

&lt;p&gt;Everyone is welcomed to join the challenge! I'm available on twitter just approach me if you need any help along the way or just share your own progress under #100daysOfHardware.&lt;/p&gt;

&lt;p&gt;Planning my deep-dive into electronics, did feel overwhelming to me, till I found a pathway to cut through the complexity. The result is this guide which let me start in very shallow water.&lt;/p&gt;

&lt;h3&gt;
  
  
  LED, Battery, Resistor - that's all!
&lt;/h3&gt;

&lt;p&gt;The beauty of this very first circuit is, is that everyone can complete it without any deeper understanding of electronics. It's very easy to reason about too. It consists only of three components:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Power source (Battery or power adapter)&lt;/li&gt;
&lt;li&gt;LED&lt;/li&gt;
&lt;li&gt;Resistor&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;How to connect the components is the only this we need to find out today.&lt;/p&gt;

&lt;p&gt;To start-off smoothly, I recommend to get an electronics starter kit. There is plenty of brands out there, any of them will do. It's most importantly that you get a bread board, a power source and a selection of basic electronic components and jumper wires.&lt;/p&gt;

&lt;p&gt;While I got lost couple of times in the scientific depth of electronics theory, Here comes the parts which really matter for today's project:&lt;/p&gt;

&lt;h3&gt;
  
  
  Electrons are flowing through a circuit from one terminal of the power source to the other
&lt;/h3&gt;

&lt;p&gt;In order to plug in the LED correctly, it is important to understand that electricity is basically just electrons flowing through a circuit from one terminal of the power source to the other.&lt;br&gt;&lt;br&gt;
The two terminal can be differentiated by their charge. One is always more positive than the other. Hence, the terminals are normally marked with a red plus and a black minus.&lt;/p&gt;

&lt;p&gt;Many electronic components do only work when the current flows through them in the right direction. The LED, is one of them.&lt;/p&gt;

&lt;p&gt;An LED comes with a two legs, one is longer than the other. This is the positive side of the LED, called the 'anode', while the shorter leg is the negative side, called the 'cathode'.&lt;/p&gt;

&lt;p&gt;If you want to learn about LEDs in much more detail, I can recommend a great article. You find it in the resources below!&lt;/p&gt;

&lt;p&gt;With this first basic learning about electronics, I was already able to setup 75% of this first circuit.&lt;/p&gt;

&lt;p&gt;When you have your bread board in front of you is should look similar to the graphic here.&lt;/p&gt;

&lt;p&gt;Make sure you connect the cathode (long legged side) of the LED with the positive rail of the bread board. If you want to understand better how a breadboard works, you find another link in the resources below.&lt;/p&gt;

&lt;p&gt;As you see in the graphic, I use a standard 9V battery as a power source. Some start kits also ship with a power adapter. Those come with a variety of features which you should all ignore for now, it is only relevant how much Voltage it supplies. I have seen some with 3.3V and 5V. The reason, why it doesn't which power source you are using is the third component - the resistor.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fetip294otx3moka8k0ol.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fetip294otx3moka8k0ol.jpg" alt="circuit_half_complete" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;My first instinct was to simply close the circuit with a regular wire, let the current flow - done.&lt;/p&gt;

&lt;p&gt;Well, it's almost as easy as that. If you simply close the circuit with a wire, the LED is likely to blow up immediately, depending on the voltage of your power source.&lt;/p&gt;

&lt;p&gt;This is because the LED couldn't withstand the voltage which comes straight from the power source. That's why need need to add the the resistor.&lt;/p&gt;

&lt;p&gt;Now, we need to find out which resistor to put in place in order to protect the LED.&lt;/p&gt;

&lt;p&gt;Therefore we use a simple mathematical formula, which is key to understand all this electronics basics - it is called "Ohm's Law".&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;R-resistor = (V-powerSource - V-led )/ I-led
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;To find out about the voltage and the current of the LED, I did have to look into the data sheet which was supplied by the starter kit brand as a pdf.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fsagxmpzooh90n4vflysf.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fsagxmpzooh90n4vflysf.jpg" alt="data_sheet" width="800" height="515"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;depending on your power source, and LED you will end up with a different value.&lt;br&gt;
The resistance we are looking for measured in Ohm.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;R = (9V - 4V) / 0.02A
R = 250 Ohm
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  How much resistance does a resistor have?
&lt;/h3&gt;

&lt;p&gt;For me, each learning was rising more questions, now it is all about how to find out how resistance a resistor has?&lt;/p&gt;

&lt;p&gt;There is two methods to find out about it. You can measure it, if you have a multimeter or you can read the colored ribbons - they tell experienced makers the resistance. Since I had neither experience nor a multimeter, I simply tried out different resistors.&lt;/p&gt;

&lt;p&gt;This is something, I can really recommend. As long as you are playing with simple circuits try out things. There is no expensive equipment you can break. Test theories you have read about, validate your mental model and break thing so you learn that details matter in electronics.&lt;/p&gt;

&lt;p&gt;Guess what, LEDs to have a tolerance when it comes to voltage. If you pick a resistor with to little or to much resistance, it's not going up in smoke instantly. In case you accidentally pick an resistor with close to zero resistance your LED might goes up in smoke. But hey, that's a great experience to start learning more about picking the right resistor.&lt;/p&gt;

&lt;p&gt;Complete today's project with a glowing LED!&lt;/p&gt;

&lt;p&gt;To wrap up, we have successfully build our 'hello world' circuit. Thereby, we have learned about the electricity flow, how to wire an LED, about the capability of resistors to use of current within a circuit.&lt;/p&gt;

&lt;h3&gt;
  
  
  Brain Teaser
&lt;/h3&gt;

&lt;p&gt;Try to plug-in the resistor before and after the LED. Both will work! That's confusing, isn't it? Can you find out why this is the case?&lt;/p&gt;

&lt;h3&gt;
  
  
  Need Help?
&lt;/h3&gt;

&lt;p&gt;Was this guide helpful to you? Do you have questions? Talk to me on &lt;a href="https://twitter.com/hinsencamp"&gt;twitter&lt;/a&gt; to keep learning about electronics, microcontrollers and IoT.&lt;/p&gt;

&lt;p&gt;And if you feel supportive, make sure to follow and support me on Twitter! Thank you! 🙏&lt;/p&gt;

&lt;h3&gt;
  
  
  Further Reads
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.instructables.com/id/How-to-use-a-breadboard/"&gt;How to use a Breadboard&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.instructables.com/id/LEDs-for-Beginners/"&gt;LEDs for Beginners&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>challenge</category>
      <category>tutorial</category>
      <category>hardware</category>
      <category>100daysofhardware</category>
    </item>
    <item>
      <title>Data Structures: Build a Social Network in JavaScript with Graphs!</title>
      <dc:creator>Fabian Hinsenkamp</dc:creator>
      <pubDate>Tue, 02 Jul 2019 22:28:06 +0000</pubDate>
      <link>https://dev.to/hinsencamp/data-structures-build-a-social-network-in-javascript-with-graphs-2d7b</link>
      <guid>https://dev.to/hinsencamp/data-structures-build-a-social-network-in-javascript-with-graphs-2d7b</guid>
      <description>

</description>
      <category>javascript100daysofcode</category>
      <category>graph</category>
      <category>datastructure</category>
    </item>
    <item>
      <title>Build a Social Network in JavaScript with Graphs!</title>
      <dc:creator>Fabian Hinsenkamp</dc:creator>
      <pubDate>Thu, 30 May 2019 15:49:26 +0000</pubDate>
      <link>https://dev.to/hinsencamp/build-a-social-network-in-javascript-with-graphs-2lnn</link>
      <guid>https://dev.to/hinsencamp/build-a-social-network-in-javascript-with-graphs-2lnn</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;How would you design the data structure for a very large social network like Facebook or Linkedin?&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Such kind of question is known to be asked by top-tier tech companies like&lt;br&gt;
Google, Amazon, Facebook and Linkedin as part of their recruitment process.&lt;/p&gt;

&lt;p&gt;The reason is, that social networks are a great use case for graph data structures. In this tutorial, we will dive into the topic with an hands-on example and build a social network ourselves! Thereby, we will learn how a graph works and why it's such an important and powerful data structure.&lt;/p&gt;

&lt;p&gt;The tutorial is also suitable for beginners, the only pre-requirement is a basic understanding of object-oriented JavaScript. If you want to read some about graph theory up-front, check the additional resources, in the resources section at the bottom of this article.&lt;/p&gt;

&lt;p&gt;Later on, we use some helper functions, you find them with the rest of the code in this &lt;a href="https://github.com/fh48/tutorial_SocialNetworkGraph"&gt;repo&lt;/a&gt;;&lt;/p&gt;

&lt;p&gt;Let's start with getting a basic understanding of what we actually want to achieve!&lt;/p&gt;
&lt;h2&gt;
  
  
  What is a Social Network at its Core?
&lt;/h2&gt;

&lt;p&gt;When we try to describe what's a social network at its core, we quickly end up talking about users and connections between them.&lt;br&gt;
Typically users have some kind of connection to other users. Even though theoretically millions of connections are possible, most users don't have more than a couple hundred connections. To put it differently, users don't have connections to most other users in the network.&lt;br&gt;
Just think about it. How many friends do you have on Facebook compared to the number of existing profiles worldwide? Friendship circles are a common pattern, these consist of a limited amount of users sharing many common connections.&lt;/p&gt;

&lt;p&gt;Now, after having thought of the basic interaction of users in social networks, we can start building a data structure that allows us to easily implement these requirements. In the next section you will see why the graph data structure is a great fit for this problem.&lt;/p&gt;
&lt;h2&gt;
  
  
  Why Graphs?
&lt;/h2&gt;

&lt;p&gt;Simply put, graphs are nothing but a collection of nodes and edges which connect them. In the books, you find nodes often also called vertices. In general, nodes can represent any kind of abstract data object. In the context of a social network, it's obvious to represent users by nodes. But also other abstract entities like groups, companies, events, etc. can be modeled as nodes.&lt;/p&gt;

&lt;p&gt;The connections between nodes are called Edges. It exists a range of different types of edges, which allow you to model all kinds of relations between nodes. Read the article &lt;em&gt;Graph Data Structures for Beginners&lt;/em&gt; by &lt;a href="//www.twitter.com/amejiarosario"&gt;@amejiarosario&lt;/a&gt; to learn more about the differences between directed, undirected, cyclic and acyclic graphs. You find the link in the resources section.&lt;/p&gt;

&lt;p&gt;What do you think? Sounds promising, right? Let's dive right into building a graph and see if it's actually as good.&lt;/p&gt;
&lt;h2&gt;
  
  
  Create the Graph
&lt;/h2&gt;

&lt;p&gt;Above, we have figured out what's the core functionality of a social network. To represent this we will build a graph with nodes representing users and bi-directional edges to model the equal connection between users.&lt;/p&gt;

&lt;p&gt;We implement the graph in an object-oriented fashion. Therefore, we start writing a &lt;code&gt;Graph&lt;/code&gt; constructor function which contains an empty object as it's only property.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;Graph&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;graph&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{};&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now To continue the implementation, we add &lt;code&gt;getter&lt;/code&gt; and &lt;code&gt;setter&lt;/code&gt; methods to our graph. To add a node, we simply add the user as a key-value pair to the &lt;code&gt;graph&lt;/code&gt; object and use the user's name as the key. Note, in production unique ids would the better choice.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;Graph&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;prototype&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;addUser&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;graph&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For the &lt;code&gt;getter&lt;/code&gt; method we simply return the user which we retrieve by the name passed as properties.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;Graph&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;prototype&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;getNode&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;graph&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Next, we create the Node constructor function.&lt;/p&gt;

&lt;h2&gt;
  
  
  Create Nodes
&lt;/h2&gt;

&lt;p&gt;The constructor function for the nodes comes only with a name and a friends property.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;Node&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;friends&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{};&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In general, there are two approaches to how graphs can represent nodes and their relations to each other.&lt;/p&gt;

&lt;p&gt;The first approach, which we will apply here is called &lt;code&gt;adjacency list&lt;/code&gt; and relies on a list, kept by each individual node, storing all of the node's edges.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;a&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;b&lt;/span&gt; &lt;span class="nx"&gt;c&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="nx"&gt;b&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;a&lt;/span&gt; &lt;span class="nx"&gt;d&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="nx"&gt;c&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;a&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="nx"&gt;d&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;b&lt;/span&gt; &lt;span class="nx"&gt;c&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The second approach is called &lt;code&gt;adjacency matrix&lt;/code&gt;. Such are especially useful for complex (directed and weighted edges) and highly dense graphs. Read more about the benefits of each representation in &lt;em&gt;When are adjacency lists or matrices the better choice?&lt;/em&gt; you find the link in the resources section.&lt;/p&gt;

&lt;p&gt;The &lt;code&gt;friends&lt;/code&gt; property acts as our &lt;code&gt;adjacency list&lt;/code&gt; and stores all connected users. We could simply use an array or a set to store the connections' names.&lt;br&gt;
However, an object is more performant as we will need to check for already existing connections when we create an edge.&lt;/p&gt;
&lt;h2&gt;
  
  
  Create Edges
&lt;/h2&gt;

&lt;p&gt;The last missing piece to complete the basic network, is a method to add connections between nodes. As we decided on bidirectional edges, we need to add the connection to both involved nodes. To do so, we call &lt;code&gt;addConnection&lt;/code&gt; within itself with the user's node we want to connect with.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;Node&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;prototype&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;addConnection&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;friends&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;friends&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt; &lt;span class="p"&gt;};&lt;/span&gt;
    &lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;addConnection&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Thanks to the condition which wraps the actual logic, we do not end up in an infinite loop. Having all this in place, we can actually start adding users to our network!&lt;/p&gt;

&lt;h2&gt;
  
  
  Grow the Network!
&lt;/h2&gt;

&lt;p&gt;To start our network, let's create a couple of nodes and connect them. Therefore, we first create a couple of nodes.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;fabian&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Node&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Fabian&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;rey&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Node&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Rey&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;ellie&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Node&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Ellie&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;cassi&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Node&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Cassi&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Next, we instantiate a graph and add the nodes to it.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;graph&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Graph&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="nx"&gt;graph&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;addNode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;fabian&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nx"&gt;graph&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;addNode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;rey&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nx"&gt;graph&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;addNode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;ellie&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nx"&gt;graph&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;addNode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;cassi&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In the final step, we connect nodes to each other.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;graph&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Fabian&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;addConnection&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;graph&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Rey&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;span class="nx"&gt;graph&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Fabian&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;addConnection&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;graph&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Ellie&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;span class="nx"&gt;graph&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Fabian&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;addConnection&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;graph&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Cassi&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;

&lt;span class="nx"&gt;graph&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Ellie&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;addConnection&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;graph&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Cassi&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You can use the helper function &lt;code&gt;writeToJSON&lt;/code&gt; to export your graph to a json to get a better overview. In this &lt;a href="https://github.com/fh48/tutorial_SocialNetworkGraph"&gt;repo&lt;/a&gt; you can find it.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nf"&gt;writeToJSON&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;graph&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;graph&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;graph&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Pretty cool, right?&lt;/p&gt;

&lt;h2&gt;
  
  
  Visualise the Network!
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--KEFnurrC--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_800/https://thepracticaldev.s3.amazonaws.com/i/m7ne6lauuwd8bksqfeq6.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--KEFnurrC--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_800/https://thepracticaldev.s3.amazonaws.com/i/m7ne6lauuwd8bksqfeq6.gif" alt="" width="800" height="331"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you want to visualise your network and play with it, check out the visualisation tool on &lt;a href="https://hinsencamp.com/article/social-network-graph/#visualise-the-network"&gt;hinsencamp.com&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;As a next step, you should run another helper function - the network generator. It generates random networks with up to 150 users.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nf"&gt;generateRandomNetwork&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;graph&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="nf"&gt;writeToJSON&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;graph&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;graph&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;graph&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Play around with the number of participants. You will see, with increasing network size it becomes quickly very complicated to keep an overview by just looking at the JSON object. For a better overview, you can drop the JSON object in the visualiser as well.&lt;/p&gt;

&lt;p&gt;It should look similar to this:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--R3yriBRd--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_800/https://thepracticaldev.s3.amazonaws.com/i/pg20ty1ochecg92vgaqg.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--R3yriBRd--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_800/https://thepracticaldev.s3.amazonaws.com/i/pg20ty1ochecg92vgaqg.gif" alt="" width="800" height="331"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;We have built the initial data structure for a social network. Therefore, we have created constructors for the graph and nodes representing users. Moreover, we added edges connecting these nodes bi-directional. This structure represents a solid foundation to build more powerful features on top of it. Here are some hints of what could be added next:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Methods to delete edges and nodes&lt;/li&gt;
&lt;li&gt;Different types of nodes like "groups" or "companies"&lt;/li&gt;
&lt;li&gt;Search Algorithms like Breadth-first search (BFS)&lt;/li&gt;
&lt;li&gt;Recommend users new friends by comparing sets of edges.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Let me know what interests you the most on twitter &lt;a href="https://twitter.com/hinsencamp"&gt;@hinsencamp&lt;/a&gt;! Based on your feedback, I will choose the next tutorial topic.&lt;br&gt;
When you are interested in going into production with a graph-based solution you should consider reading more about&lt;br&gt;
graph databases, which provide many features of graphs out of the box. It's worth having a look at the following free graph databases &lt;a href="https://neo4j.com/"&gt;Neo4J&lt;/a&gt;, &lt;a href="https://orientdb.com/"&gt;OrientDB&lt;/a&gt; and &lt;a href="https://github.com/amark/gun"&gt;GunDB&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Resources
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://hackernoon.com/the-javascript-developers-guide-to-graphs-and-detecting-cycles-in-them-96f4f619d563"&gt;The Javascript Developer’s Guide to Graphs and Detecting Cycles in Them&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://cs.stackexchange.com/questions/79322/when-are-adjacency-lists-or-matrices-the-better-choice"&gt;When are adjacency lists or matrices the better choice?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://adrianmejia.com/blog/2018/05/14/data-structures-for-beginners-graphs-time-complexity-tutorial/"&gt;Graph Data Structures for Beginners&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://medium.com/@keithwhor/using-graph-theory-to-build-a-simple-recommendation-engine-in-javascript-ec43394b35a3"&gt;Using Graph Theory to Build a Simple Recommendation Engine in JavaScript&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://stackoverflow.com/questions/24196067/what-is-the-javascript-equivalent-to-a-c-sharp-hashset"&gt;What is the JavaScript equivalent to a C# HashSet?&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>javascript</category>
      <category>node</category>
      <category>codenewbie</category>
      <category>beginners</category>
    </item>
    <item>
      <title>Discover the Power of Closures in VueJS</title>
      <dc:creator>Fabian Hinsenkamp</dc:creator>
      <pubDate>Sun, 28 Apr 2019 11:23:34 +0000</pubDate>
      <link>https://dev.to/hinsencamp/discover-the-power-of-closures-in-vuejs-4ikl</link>
      <guid>https://dev.to/hinsencamp/discover-the-power-of-closures-in-vuejs-4ikl</guid>
      <description>&lt;p&gt;Originally published on &lt;a href="https://hinsencamp.com/article/closures-vue/" rel="noopener noreferrer"&gt;hinsencamp.com&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Today's frontend technology landscape, required from engineers to know about a wide variety of technologies including frameworks, libraries and packages.&lt;/p&gt;

&lt;p&gt;No wonder, that vanilla JavaScript skills and in-depth knowledge might start spreading thin. No matter if you are just learning JavaScript, refreshing your basic knowledge or preparing for job interviews → This tutorial is for you!&lt;/p&gt;

&lt;p&gt;Here you learn how powerful plane JavaScript closures are. Be aware, this tutorial comes with a challenge. 💪 It's all about building an elegant Emoji Picker in VueJS and leverage closures by using higher order functions.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Let's dive right into it!&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Function Scope
&lt;/h2&gt;

&lt;p&gt;Even though closures are one of the most powerful concepts in JavaScript it is easily overlooked by many.&lt;/p&gt;

&lt;p&gt;Nevertheless, knowing about closures is fundamental as they define which variables a function has access to during its execution. More precisely, closures define which scopes a function has access starting from its own, through all parent scopes up to the global scope.&lt;/p&gt;

&lt;p&gt;To really master closures, it's essential to have a solid understanding of scopes first. Probably, you have also already experienced the impact of scopes yourself.&lt;br&gt;
Every time you execute a function a scope is created. When ever you create variables within that function these are only accessible from within the function itself.&lt;/p&gt;

&lt;p&gt;At the time a function is completed (by reaching a &lt;code&gt;return&lt;/code&gt; statement or &lt;code&gt;}&lt;/code&gt; ) all these variables are destroyed. Next time you execute the function, the same procedure is applied.&lt;/p&gt;

&lt;p&gt;Let's look at the following example to illustrate the concept.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;square&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;x&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;squareX&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;x&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="nx"&gt;x&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;squareX&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// 25&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;squareX&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;squareA&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;square&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;squareA&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// 25&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;squareX&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// ReferenceError: squareX is not defined.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Think about scopes as the temporary context only the code within that function has access to.&lt;/p&gt;

&lt;p&gt;While scopes have a very limited lifetime, limited by the time a function execution need to execute, in contrast a function's closure is already created when a function is initially defined. It also will remain after the execution has been completed.&lt;/p&gt;

&lt;h2&gt;
  
  
  Closures
&lt;/h2&gt;

&lt;p&gt;As mentioned before, closures are responsible for defining which variables are accessible the scope of a function execution. It's essential to understand, that closures do not provide copies of available variables but references to them. If you are not familiar with JavaScript's references check out this &lt;a href="https://medium.com/r/?url=https%3A%2F%2Fcodeburst.io%2Fexplaining-value-vs-reference-in-javascript-647a975e12a0" rel="noopener noreferrer"&gt;article&lt;/a&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;globalString&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;A&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;hello&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;localString&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;C&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;globalString&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;localString&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="nf"&gt;hello&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt; &lt;span class="c1"&gt;// A C&lt;/span&gt;

&lt;span class="nx"&gt;globalString&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;B&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="nf"&gt;hello&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt; &lt;span class="c1"&gt;// B C&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The example looks probably very familiar, not any special, this explains why we barely realise how powerful closures can as it's very common to only define functions in the global scope.&lt;/p&gt;

&lt;p&gt;However, when functions are defined within another function's scope, closures enable powerful techniques and patterns. In an object-oriented architecture, closures offer a simple but efficient way to establish &lt;strong&gt;data privacy&lt;/strong&gt;. In more functional architectures closures are essential to &lt;strong&gt;higher order functions&lt;/strong&gt; and &lt;strong&gt;partial application&lt;/strong&gt; and &lt;strong&gt;currying&lt;/strong&gt;, two more advanced programming techniques. Read more about these techniques here.&lt;/p&gt;

&lt;h2&gt;
  
  
  Higher Order Functions
&lt;/h2&gt;

&lt;p&gt;A functions that operate on other functions, either by taking them as arguments or by returning them, are called &lt;strong&gt;higher-order functions&lt;/strong&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;createMultiplier&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;multiplier&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;value&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="nx"&gt;multiplier&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;};&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;multiplyBy2&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;createMultiplier&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;multiplyBy2&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt; &lt;span class="c1"&gt;// 10&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Here we finally can experience the power of having understood closures. Even though &lt;code&gt;createMultiplier&lt;/code&gt; has been already successfully completed. We can still access its initial &lt;code&gt;multiplier&lt;/code&gt; property.&lt;/p&gt;

&lt;p&gt;This is possible as closures keep the reference of variables, these can even span over multiple scopes even and do not get destroyed when the context terminates. That way, we can still access a specific instance of a local variable.&lt;/p&gt;

&lt;h2&gt;
  
  
  Data Privacy
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;privateVariables&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;privateValue&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;get&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;privateValue&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;};&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;privateVariables&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt; &lt;span class="c1"&gt;//100&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;How come closures are enabling us to implemented data privacy?&lt;/p&gt;

&lt;p&gt;We can simply enclose variables and only allow functions within the containing (outer) function scope to access them.&lt;/p&gt;

&lt;p&gt;You can't get at the data from an outside scope except through the object's privileged methods. This pattern also allows us to program to an interface and not the implementation itself.&lt;/p&gt;

&lt;h2&gt;
  
  
  Coding Challenge: Emoji Tone Picker
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fhinsencamp.com%2Farticle%2Fclosures-vue%2Femoji-picker.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fhinsencamp.com%2Farticle%2Fclosures-vue%2Femoji-picker.png" alt="emoji picker"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Great, that's all the theory we need for actually building something powerful in VueJS and leverage the power of closures!&lt;/p&gt;

&lt;p&gt;In fact, higher order functions are the most interesting use case, as we already have a data privacy concept in VueJS.&lt;/p&gt;

&lt;p&gt;Basically, are components already offering an interface through properties and the data object which isn't accessible from outside.&lt;/p&gt;

&lt;p&gt;Here is what we want to build!&lt;/p&gt;

&lt;p&gt;&lt;iframe src="https://codesandbox.io/embed/842rp5j4n8"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;It is a component to that allows the user to choose the skin tone based an a selection of all available tones, similar to the user experience known from texting on a smart phone.&lt;/p&gt;

&lt;p&gt;Technically, you should try to create a component that receives a single emoji as props and used higher order functions to create multiple click event handlers to select different tones.&lt;/p&gt;

&lt;h3&gt;
  
  
  Hint
&lt;/h3&gt;

&lt;p&gt;Emojis can be stored as HTML hex codes in string values. The folded hands emoji is &amp;amp;#x1F64F. To change the tone attach a colour code to it. You find the codes here.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&amp;amp;#x1F64F + &amp;amp;#x1F3FD = 🙏🏽&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Building Challenge Extension
&lt;/h2&gt;

&lt;p&gt;You want to take it one step further, and really see if you mastered closures? &lt;br&gt;
Then pass multiple emojis and make it work so you can change the skin tone of multiple emojis one at a time. 💯&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Closures are the reason why we can access variables of parent scopes while the related functions might have already terminated.&lt;/p&gt;

&lt;p&gt;We can use this behaviour of JavaScript in VueJS to dynamically build methods based on dynamic arguments without polluting our components with a vast variety of variables and methods.&lt;/p&gt;

&lt;p&gt;Thanks for reading 🙌&lt;/p&gt;

&lt;p&gt;Originally published on &lt;a href="https://hinsencamp.com/article/closures-vue/" rel="noopener noreferrer"&gt;hinsencamp.com&lt;/a&gt;&lt;/p&gt;

</description>
      <category>vue</category>
      <category>javascript</category>
      <category>tutorial</category>
      <category>challenge</category>
    </item>
  </channel>
</rss>
