<?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: metamn</title>
    <description>The latest articles on DEV Community by metamn (@metamn).</description>
    <link>https://dev.to/metamn</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%2F123021%2F2f25747b-98d7-4e66-a4c6-170e3c7cbf7b.png</url>
      <title>DEV Community: metamn</title>
      <link>https://dev.to/metamn</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/metamn"/>
    <language>en</language>
    <item>
      <title>On Design Systems</title>
      <dc:creator>metamn</dc:creator>
      <pubDate>Mon, 29 Nov 2021 10:41:18 +0000</pubDate>
      <link>https://dev.to/metamn/on-design-systems-78c</link>
      <guid>https://dev.to/metamn/on-design-systems-78c</guid>
      <description>&lt;p&gt;Design systems bring a novel approach to UI/UX design and development — to solve its inherent consistency and scalability problems.&lt;/p&gt;

&lt;p&gt;As of today, dedicated companies — with resources — can afford their own custom design system. Others copy or innovate.&lt;/p&gt;

&lt;p&gt;The series walks-through the problem in-depth, from the viewpoint of all stakeholders.&lt;/p&gt;

&lt;p&gt;And proposes a solution — of recent origin — to help companies with less resources to roll their own.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Workflow, practices and deliverables
&lt;/h2&gt;

&lt;p&gt;&lt;a href="http://metamn.io/react/on-design-sytems-1/"&gt;The first article&lt;/a&gt; takes a look at existing systems and defines the workflow, practices and deliverables for all stakeholders.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Design tools and processes
&lt;/h2&gt;

&lt;p&gt;&lt;a href="http://metamn.io/react/on-design-systems-2/"&gt;The second article&lt;/a&gt; examines design systems from the designer viewpoint.&lt;/p&gt;

&lt;p&gt;Offers novel ideas — design systems as database (code), pair designing — to reduce the cost of rolling out design systems.&lt;/p&gt;

&lt;p&gt;It presents an ideal and working use case where a rare species — a developer who designs — creates a design system, and more, in the browser.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Consistent user interfaces in web context
&lt;/h2&gt;

&lt;p&gt;&lt;a href="http://metamn.io/react/on-design-systems-3/"&gt;The third article&lt;/a&gt; examines design systems from the developer viewpoint.&lt;/p&gt;

&lt;p&gt;It presents past and current front-end development paradigms and examines why they lead, or not, to consistent user interfaces.&lt;/p&gt;

&lt;p&gt;And comes to the conclusion: to end fragility in front-end development — standard software development patterns and practices should replace the current hacking mindset and non-programming languages.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Implementing a design system in React and Typescript
&lt;/h2&gt;

&lt;p&gt;A work in progress. A complete example for developers where the findings above merge into a real-life project.&lt;/p&gt;

</description>
      <category>designsystem</category>
      <category>componentlibrary</category>
      <category>react</category>
      <category>typescript</category>
    </item>
    <item>
      <title>On design systems — 2</title>
      <dc:creator>metamn</dc:creator>
      <pubDate>Sun, 07 Nov 2021 00:00:00 +0000</pubDate>
      <link>https://dev.to/metamn/on-design-systems-2-39f6</link>
      <guid>https://dev.to/metamn/on-design-systems-2-39f6</guid>
      <description>&lt;p&gt;Tools and processes.&lt;/p&gt;




&lt;h2&gt;
  
  
  TLDR;
&lt;/h2&gt;

&lt;p&gt;Design systems are a paradigm shift in UX/UI design and front-end development for native and web applications, sites.&lt;/p&gt;

&lt;p&gt;With a systematic approach to the design process, design systems produce consistent and scalable user interfaces.&lt;/p&gt;

&lt;p&gt;Companies with resources lead the adoption. They do it by augmenting old tools and processes with extensive mind power.&lt;/p&gt;

&lt;p&gt;Smaller companies with less resources must innovate to keep up.&lt;/p&gt;

&lt;h2&gt;
  
  
  The current landscape
&lt;/h2&gt;

&lt;p&gt;Design systems are new, yet old.&lt;/p&gt;

&lt;p&gt;They’ve been around since 2015 when Google rolled out Material Design. Still, only big companies can afford to have their own design system today.&lt;/p&gt;

&lt;p&gt;The rest builds on open source, freely available component libraries and design systems by employing heavy customizations. We all know the result: similar looking websites and apps all around the internet.&lt;/p&gt;

&lt;p&gt;If one goes further — and tries to roll out unique looking, yet consistent and scalable user interfaces for a progressive audience — hits the same obstacles as their predecessors, the big companies.&lt;/p&gt;

&lt;p&gt;Same obstacles, less resources. For Airbnb, it took several years and iterations to come up with a solution which scales.&lt;/p&gt;

&lt;p&gt;Design systems are hard.&lt;/p&gt;

&lt;p&gt;They introduce a systematic approach to a domain previously ruled by human-driven, ad-hoc processes.&lt;/p&gt;

&lt;h2&gt;
  
  
  Before design systems
&lt;/h2&gt;

&lt;p&gt;Google is a company with dozens of digital assets — email, maps, search, ads, video, and many more — across all platforms.&lt;/p&gt;

&lt;p&gt;Before employing a design system these assets were looking more-or-less the same, in the best case, but many times completely different.&lt;/p&gt;

&lt;p&gt;Material Design made the entire Google portfolio to look consistent, following unconditionally and perfectly the brand design guidelines.&lt;/p&gt;

&lt;p&gt;Whatever the asset, whenever the platform might be.&lt;/p&gt;

&lt;h2&gt;
  
  
  What a design system does?
&lt;/h2&gt;

&lt;p&gt;It offers a systematic approach to the design process to reduce the cognitive load on designers.&lt;/p&gt;

&lt;p&gt;To understand the amount of the cognitive load required to design, let’s take for example the buttons. In a simple use case, we have 20 variations.&lt;/p&gt;

&lt;p&gt;&lt;a href="///react/static/c909f0839df1620db7e99f2bfdbba943/2f950/buttons.png"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--wlwqRLcj--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/http://metamn.io/react/static/c909f0839df1620db7e99f2bfdbba943/5cc77/buttons.png" alt="Buttons" title="Buttons" width="768" height="432"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Aside to buttons, a design deals with dozens of other, more complex patterns and components like layout, spacing, typography, navigation, responsiveness, images, animations, accessibility and more.&lt;/p&gt;

&lt;p&gt;A designer — to be able to reason about, modify, or extend a design — has to keep in her mental model all this information. The details, the nuances, the settings, and the states.&lt;/p&gt;

&lt;p&gt;An impossible task even at Google level with an infinite pool of designers.&lt;/p&gt;

&lt;p&gt;Design systems solve this challenge via the &lt;em&gt;divide et impera&lt;/em&gt; method.&lt;/p&gt;

&lt;p&gt;They separate design into small, independent and manageable parts / layers — style tokens, components, sections, pages, sites, apps — and enforce consistency on the entire path, across the entire portfolio.&lt;/p&gt;

&lt;p&gt;Each layer is independent, self-contained, and acts as a single source of truth for its own domain.&lt;/p&gt;

&lt;p&gt;Each layer builds on the previous layer — without the ability to modify it.&lt;/p&gt;

&lt;p&gt;For example, tokens — the base layer — are atomic, and their single responsibility is to describe style via pure data.&lt;/p&gt;

&lt;p&gt;Components build on tokens, but they don’t interfere with tokens. They use tokens for styling, but they can’t add new, custom styles. If a new style element is required — first it is added to the tokens, then the component becomes able to use it.&lt;/p&gt;

&lt;p&gt;This separation of concerns, augmented with strong human discipline, makes consistency and scalability achievable across hundreds of tokens, components, sites and apps.&lt;/p&gt;

&lt;h2&gt;
  
  
  Tools and processes
&lt;/h2&gt;

&lt;p&gt;The systematic approach brought by design systems left untouched the tools and processes used in creating digital assets.&lt;/p&gt;

&lt;p&gt;A typical workflow is the same today as it was before design systems.&lt;/p&gt;

&lt;p&gt;Designers use visual, non-programmable tools like Figma, Sketch, Adobe Illustrator etc. to create the layers of a design system.&lt;/p&gt;

&lt;p&gt;These tools are visualization tools, not decision-making tools.&lt;/p&gt;

&lt;p&gt;When a designer has to make a decision — to change, extend a design — again, she has to build a mental model first, even if the model is now smaller due to the design system approach.&lt;/p&gt;

&lt;p&gt;The decision made cannot be proven correct in an objective way like we used to have in software development, or in other exact science.&lt;/p&gt;

&lt;p&gt;Designing with mental models is error-prone. Introduces continuous uncertainty. And requires human resources to scale.&lt;/p&gt;

&lt;p&gt;The other drawback of the visual, non-programmable design tools is the deliverables they produce.&lt;/p&gt;

&lt;p&gt;The designer’s work needs to be further translated to the target medium by developers. This process is communication-heavy, error-prone again, and far from being real-time.&lt;/p&gt;

&lt;h2&gt;
  
  
  Better tools and processes
&lt;/h2&gt;

&lt;p&gt;It’s easy to observe: the tools used by designers produce side effects related to scalability, communication latency and cost.&lt;/p&gt;

&lt;p&gt;They are the bottleneck in the process of building consistent user interfaces in an affordable way, with support for companies with less resources.&lt;/p&gt;

&lt;p&gt;What if the tools in the design process — in the same way as in the development process — would be programmable?&lt;/p&gt;

&lt;p&gt;What if the outcome of a design process would be a program / data instead of the current visuals-to-be-translated-into-code mess?&lt;/p&gt;

&lt;p&gt;That would solve the mental model capacity problem and reduce the design and development process to real-time.&lt;/p&gt;

&lt;h2&gt;
  
  
  Design systems as a database
&lt;/h2&gt;

&lt;p&gt;Imagine the design system as a database.&lt;/p&gt;

&lt;p&gt;Tokens, components, sections, pages, apps, sites — all quantifiable, thus correct. All queryable, to an arbitrarily small level, to fit comfortably into a single person’s mental model.&lt;/p&gt;

&lt;p&gt;Databases handle billions of entries and help us reason about infinite relationships. They help us make correct decisions and ensure changes happen in real-time.&lt;/p&gt;

&lt;p&gt;Designing with the help of databases would offer the same benefits.&lt;/p&gt;

&lt;p&gt;It sounds like utopia — but it can be done today and requires only a minor cultural shift.&lt;/p&gt;

&lt;h2&gt;
  
  
  Pair designing
&lt;/h2&gt;

&lt;p&gt;Pair programming is an age-old paradigm.&lt;/p&gt;

&lt;p&gt;Two developers sit in the front of a single machine. They collaborate instantly and produce a single output.&lt;/p&gt;

&lt;p&gt;Pair designing would be similar. A designer and a developer would sit at a single desk and produce a single output.&lt;/p&gt;

&lt;p&gt;The designer would still use her own favourite visual tool like Figma. But the deliverable would not be official — just a temporary result.&lt;/p&gt;

&lt;p&gt;The developer would instantly input the Figma deliverables into a design system built on code, like a database.&lt;/p&gt;

&lt;p&gt;That would be the final, official deliverable — a living design system.&lt;/p&gt;

&lt;h2&gt;
  
  
  A case study
&lt;/h2&gt;

&lt;p&gt;I’m fortunate enough to both have a computer science degree and design works featured in online galleries.&lt;/p&gt;

&lt;p&gt;I’m a developer who designs. An ideal pair designer.&lt;/p&gt;

&lt;p&gt;In 2015, I’ve rolled out my portfolio powered by a &lt;a href="http://metamn.io/v1/styleguide/"&gt;living styleguide&lt;/a&gt;. There were no design systems at that time — by the term coined. The rest was / is still &lt;a href="http://metamn.io/beat/creating-a-styleguide-with-gulp/"&gt;the same&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Since then, &lt;a href="https://osequi.com/"&gt;I’m working&lt;/a&gt; in this novel domain.&lt;/p&gt;

&lt;p&gt;I produce unique looking websites and apps for progressive brands with the help of a handcrafted, tailor made, built-from-scratch, completely customizable design system.&lt;/p&gt;

&lt;p&gt;With a considerable investment yielding high rewards.&lt;/p&gt;

&lt;p&gt;I’ve &lt;a href="https://docs.google.com/spreadsheets/d/1Yn-fzRIfXcpFilQwjv62MC4yRCTQFaS2qhhtbnfohhg/edit?usp=sharing"&gt;analysed&lt;/a&gt; other design systems; wrote &lt;a href="http://metamn.io/beat/design-systems-are-a-cultural-challenge/"&gt;articles&lt;/a&gt;; a &lt;a href="https://docs.google.com/document/d/1ukf5kDq7pHGnnExUstssu5Xtl-2yT3KxUp4XU8vvpzE/edit?usp=sharing"&gt;mini-book / technical guide&lt;/a&gt;; learnt &lt;a href="http://metamn.io/beat/clojure/"&gt;other languages&lt;/a&gt; and stacks to better understand the current theory and common practices; done four complete iterations on the code base; employed the result in a couple of real-life applications.&lt;/p&gt;

&lt;p&gt;Today, in short, this custom-made design system / component library offers:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Wireframing&lt;/strong&gt; — To sketch up the requirement specifications and get immediate feedback.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Mockuping&lt;/strong&gt; — To show real-life-like components, helping to finalize the requirements, the information architecture and the data structure.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Inline content editing&lt;/strong&gt; — To let editors add content at an early stage, to find out missing parts and inconsistencies in the original requirement specification.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Theming&lt;/strong&gt; — To support design trials and errors, iterations and variations, rollbacks. In a fully responsive way, with annotated design decisions.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Living documentation and playground&lt;/strong&gt; — Generated from code, to assure the design system driving the final product is tested, and all its parts are documented.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;All these live, inside the browser.&lt;/p&gt;

&lt;p&gt;No 3rd parties like Figma, Sketch, Storybook and co.&lt;/p&gt;

&lt;p&gt;What you see is what you’ve already got.&lt;/p&gt;

&lt;p&gt;Production-ready code with React, Typescript and CSS-in-JS. Statically generated pages using a headless CMS and GraphQL.&lt;/p&gt;

&lt;p&gt;Simple, code-based tools. Real-time production process with verifiable, scalable deliverables.&lt;/p&gt;

&lt;p&gt;In less time, cost and hustle.&lt;/p&gt;

</description>
      <category>designsystem</category>
      <category>componentlibrary</category>
      <category>uiuxdesign</category>
    </item>
    <item>
      <title>On design systems — 1</title>
      <dc:creator>metamn</dc:creator>
      <pubDate>Wed, 06 Jan 2021 00:00:00 +0000</pubDate>
      <link>https://dev.to/metamn/on-design-systems-1-8ne</link>
      <guid>https://dev.to/metamn/on-design-systems-1-8ne</guid>
      <description>&lt;p&gt;Context and deliverables.&lt;/p&gt;




&lt;h2&gt;
  
  
  Update
&lt;/h2&gt;

&lt;p&gt;This post was heavily edited on 10th of November 2021, when &lt;a href="http://metamn.io/react/on-design-sytems-2/"&gt;another take&lt;/a&gt; on the subject was published.&lt;/p&gt;

&lt;p&gt;The posts are complementary.&lt;/p&gt;

&lt;p&gt;This is a high level overview, focusing on deliverables. The second take is more technical, focusing on tools and processes.&lt;/p&gt;

&lt;h2&gt;
  
  
  A short history
&lt;/h2&gt;

&lt;p&gt;Design systems have been around since 2013-2014.&lt;/p&gt;

&lt;p&gt;Lonely Planet’s &lt;a href="https://github.com/lonelyplanet/rizzo"&gt;Rizzo&lt;/a&gt; was the early bird, then followed by the well-known &lt;a href="https://github.com/mui-org/material-ui"&gt;Material UI&lt;/a&gt; implementing Google’s &lt;a href="https://material.io/"&gt;Material Design&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;2020 was the year when design systems popped up every week. &lt;a href="https://adele.uxpin.com/"&gt;Adele&lt;/a&gt; of UXPin lists over a hundred systems and libraries—yet the list is incomplete.&lt;/p&gt;

&lt;h2&gt;
  
  
  Purpose and audience
&lt;/h2&gt;

&lt;p&gt;Why companies create design systems? A &lt;a href="https://docs.google.com/spreadsheets/d/1Yn-fzRIfXcpFilQwjv62MC4yRCTQFaS2qhhtbnfohhg/edit?usp=sharing"&gt;quick analysis&lt;/a&gt; reveals the main goals:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Internal: To build apps for their brand and/or platform.&lt;/li&gt;
&lt;li&gt;External: To build general purpose apps.&lt;/li&gt;
&lt;li&gt;Foundational: To help build design systems and component libraries.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The majority builds internal systems—no wonder—design systems shine when used to create uniform looking products across a portfolio.&lt;/p&gt;

&lt;p&gt;A handful of companies create general purpose systems. More precisely, they create an internal system and share to the public.&lt;/p&gt;

&lt;p&gt;This generosity links to the company size: Google, IBM, Ant, Adobe can afford to open-source code worth millions:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;This represents millions of dollars of investment for each company to duplicate work that many other companies are also doing. — &lt;a href="https://react-spectrum.adobe.com/react-aria/why.html"&gt;Adobe Spectrum&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Foundational systems represent a new business model—&lt;a href="https://www.modulz.app/"&gt;Modulz&lt;/a&gt; helps teams create design systems without writing code—or &lt;a href="https://bold.bridge.ufsc.br/en/about/"&gt;institutions&lt;/a&gt; sharing their work for the common good.&lt;/p&gt;

&lt;h2&gt;
  
  
  Type
&lt;/h2&gt;

&lt;p&gt;The terms design system and component library are often interchanged. The difference is subtle and far-reaching.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;The difference between a component library and a design system is whether or not your components have ’className’ and ’style’ props. — &lt;a href="https://twitter.com/markdalgleish/status/1308330959973027846?ref_src=twsrc%5Etfw"&gt;Mark Dalgleish&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Design systems are strict. They form a complete system. They don’t allow on-the-fly customisation. Modifying a system is possible at a well-defined entry point, then changes reflect across the site automatically.&lt;/p&gt;

&lt;p&gt;Component libraries are loose. They offer the basics and let customisation happen at any point, any time.&lt;/p&gt;

&lt;p&gt;Design systems are more expensive to create, and easier to use later. &lt;a href="https://seek-oss.github.io/braid-design-system/"&gt;Braid’s Playroom&lt;/a&gt; shows even non-devs can create with a design system.&lt;/p&gt;

&lt;h2&gt;
  
  
  Features
&lt;/h2&gt;

&lt;p&gt;Purpose and audience defines a design system’s features.&lt;/p&gt;

&lt;p&gt;While purpose, audience and type overlap, features differentiate and define the unique characteristics of a design system.&lt;/p&gt;

&lt;p&gt;Material Design goes full circle. From top-bottom connects designers and their tools with developers of all platforms and technologies. From Figma to web and native apps everything is in a system.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://radix-ui.com/primitives/docs/overview/introduction"&gt;Radix&lt;/a&gt; from Modulz is bare bones to that level of not offering any styling.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://react-spectrum.adobe.com/index.html"&gt;Spectrum&lt;/a&gt; from Adobe offers support for server-side rendering, virtual lists, state management and accessibility for anybody building design systems.&lt;/p&gt;

&lt;h2&gt;
  
  
  Common practices
&lt;/h2&gt;

&lt;p&gt;This quick &lt;a href="https://docs.google.com/spreadsheets/d/1Yn-fzRIfXcpFilQwjv62MC4yRCTQFaS2qhhtbnfohhg/edit?usp=sharing"&gt;design systems analysis&lt;/a&gt; reveals common practices covering theory, technology and usability.&lt;/p&gt;

&lt;h3&gt;
  
  
  Theory
&lt;/h3&gt;

&lt;p&gt;Theory is important. Drives design decisions. It’s good to have a solid foundation and principles enduring years.&lt;/p&gt;

&lt;p&gt;Design systems have no common theoretical foundation yet. Everybody rolls their own, following—or not—design patterns.&lt;/p&gt;

&lt;p&gt;The patterns listed below come compiled from the analysed systems.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://polaris.shopify.com/"&gt;Shopify Polaris&lt;/a&gt; and &lt;a href="https://react-spectrum.adobe.com/index.html"&gt;Adobe Spectrum&lt;/a&gt; are implementing all these patterns to a certain extent. The rest implements none, or part of them.&lt;/p&gt;

&lt;h4&gt;
  
  
  Single Source of Truth (SST)
&lt;/h4&gt;

&lt;p&gt;Design systems collect settings under a common place. Any later change goes into this single source of truth and reflects across the system automatically.&lt;/p&gt;

&lt;p&gt;This reduces the cognitive load to manage and extend the system.&lt;/p&gt;

&lt;h4&gt;
  
  
  Single Responsibility Principle (SRP)
&lt;/h4&gt;

&lt;p&gt;Design systems contain dozens, hundreds of tokens and components. Wiring them into a system is not a trivial task.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://dev.to/metamn/the-reactive-functional-nature-of-react-gal"&gt;Functional programming&lt;/a&gt; advocates the idea of composing up a system from smaller parts is the best possible when the underlying components behave predictably.&lt;/p&gt;

&lt;p&gt;Independent components—self-contained, with stable interfaces— compose better and provide modular architecture.&lt;/p&gt;

&lt;h4&gt;
  
  
  The base / variant pattern (BEM)
&lt;/h4&gt;

&lt;p&gt;In &lt;a href="https://www.slideshare.net/MajaWichrowska/building-and-rebuilding-the-airbnb-design-system"&gt;Building (and Re-Building) the Airbnb Design System&lt;/a&gt; an old pattern, &lt;a href="http://getbem.com/introduction/"&gt;BEM&lt;/a&gt;, emerges as a solution for scalability.&lt;/p&gt;

&lt;p&gt;Keeping a simple base and following simple rules for extensions scales up the source code and reduces its complexity.&lt;/p&gt;

&lt;h3&gt;
  
  
  Technology
&lt;/h3&gt;

&lt;p&gt;In contrast to theory, technology is well-defined on the design systems scene.&lt;/p&gt;

&lt;p&gt;The majority of the solutions goes with &lt;strong&gt;Typescript&lt;/strong&gt; and &lt;strong&gt;CSS-in-JS&lt;/strong&gt;. All solutions embrace packaging and publishing to NPM. Half of them via a &lt;strong&gt;monorepo&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Testing isn’t fully satisfactory. The majority does &lt;strong&gt;unit testing&lt;/strong&gt; using &lt;strong&gt;ts-jest&lt;/strong&gt; and &lt;strong&gt;React Testing Library&lt;/strong&gt; with questionable coverage.&lt;/p&gt;

&lt;p&gt;Often times, &lt;strong&gt;Storybook&lt;/strong&gt; complements missing unit tests and mocks integration tests with visual tests.&lt;/p&gt;

&lt;p&gt;Storybook mocks also documentation.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://bold.bridge.ufsc.br/en/"&gt;Bold&lt;/a&gt; alone managed to come up with a good-looking Storybook for their API docs. The rest uses Storybook to complement their documentation suite, which results in a scattered user experience—two separate apps with different look-and-feel.&lt;/p&gt;

&lt;p&gt;The big players—again—managed to come up with an &lt;strong&gt;in-house, integrated documentation&lt;/strong&gt; tool reaching UX excellence.&lt;/p&gt;

&lt;p&gt;What’s missing from the majority of solutions is &lt;strong&gt;generated documentation (JSDoc)&lt;/strong&gt;. Manual, handwritten documentation—no matter what—breaks from the source code’s reality.&lt;/p&gt;

&lt;h3&gt;
  
  
  Usability
&lt;/h3&gt;

&lt;p&gt;Design systems have &lt;em&gt;users&lt;/em&gt; who build solutions with the system without extending it, and have &lt;em&gt;devs&lt;/em&gt; who build / adapt / tweak new design systems from the existing system.&lt;/p&gt;

&lt;p&gt;The first group values &lt;strong&gt;User Experience (UX)&lt;/strong&gt; while the second group longs for &lt;strong&gt;Developer Experience (DX)&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The groups overlap. Important is to examine design systems from these two perspectives instead of a single one.&lt;/p&gt;

&lt;h4&gt;
  
  
  Documentation
&lt;/h4&gt;

&lt;p&gt;For users, the significant feature is the documentation. This is the entry point where they meet the design system.&lt;/p&gt;

&lt;p&gt;From the analysis, &lt;a href="https://www.carbondesignsystem.com/"&gt;IBM’s Carbon&lt;/a&gt; turned out the most complete, offering the following features:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Impeccable UX of the documentation site.&lt;/li&gt;
&lt;li&gt;Integrated: All docs (API, Guide) integrated into a single application.&lt;/li&gt;
&lt;li&gt;Generated: Entries generated from JSDoc, MDX, tests instead of written separately.&lt;/li&gt;
&lt;li&gt;Searchable.&lt;/li&gt;
&lt;li&gt;Well-explained props.&lt;/li&gt;
&lt;li&gt;Every prop comes with its own example.&lt;/li&gt;
&lt;li&gt;Live editor for examples.&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  API
&lt;/h4&gt;

&lt;p&gt;For users, another significant feature is the usability of the API. Namely:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;import ../../...&lt;/code&gt; won’t do it. &lt;code&gt;import @package/&lt;/code&gt; will do it.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;&amp;lt;Card as='thumbnail'&amp;gt;&lt;/code&gt; is better than &lt;code&gt;&amp;lt;Card image={true} title='H3' excerpt={true}&amp;gt;&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;&amp;lt;Button as='link'&amp;gt;&lt;/code&gt; and &lt;code&gt;&amp;lt;Heading level={3}&amp;gt;&lt;/code&gt; won’t do it. &lt;code&gt;&amp;lt;Heading as='H3'&amp;gt;&lt;/code&gt; is better.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Having a clean and consistent API is art. It takes iterations to achieve simplicity. &lt;a href="https://seek-oss.github.io/braid-design-system/"&gt;Braid&lt;/a&gt; offers this feature as a unique selling point:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;We’re aggressively focused on the simplicity and composability of its API.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h4&gt;
  
  
  Example apps
&lt;/h4&gt;

&lt;p&gt;Show, don’t tell. An example worth thousands of words.&lt;/p&gt;

&lt;p&gt;After browsing the docs, a common practice is to check the examples to get a glimpse about the quality of the code.&lt;/p&gt;

&lt;p&gt;Yet half of the examined systems have no example apps. Or the code quality rings alarms.&lt;/p&gt;

&lt;h4&gt;
  
  
  Naming conventions
&lt;/h4&gt;

&lt;p&gt;For developers, the &lt;code&gt;It Just Works!&lt;/code&gt; factor is perhaps the most important.&lt;/p&gt;

&lt;p&gt;Finding parts of the system should be intuitive with as less cognitive load as possible. From the big picture—tokens, hooks, components, themes—to the details—button variations.&lt;/p&gt;

&lt;p&gt;The vertical integration of the layers should be clear and well-thought. The &lt;code&gt;token -&amp;gt; theme -&amp;gt; hook -&amp;gt; component&lt;/code&gt; path should be easy to follow when extending the system.&lt;/p&gt;

&lt;h4&gt;
  
  
  Guidelines for design principles
&lt;/h4&gt;

&lt;p&gt;Design decisions make or break a product. Yet, documenting these decisions is often missing.&lt;/p&gt;

&lt;p&gt;Guidelines explaining design decisions reduce development time. Once developers understand the theory behind, they’ll use the system as their own.&lt;/p&gt;

&lt;h2&gt;
  
  
  Summing up
&lt;/h2&gt;

&lt;p&gt;Creating a design system or a component library starts with analysis and planning. The goal of the process is to prepare the implementation.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Input&lt;/th&gt;
&lt;th&gt;Output&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Purpose&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Audience&lt;br&gt;&lt;br&gt;
Common practices | Features&lt;br&gt;&lt;br&gt;
Technologies&lt;br&gt;&lt;br&gt;
Deliverables&lt;br&gt;&lt;br&gt;
Theory |&lt;/p&gt;

&lt;p&gt;Deliverables are standard. They follow a common practice.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Deliverable&lt;/th&gt;
&lt;th&gt;Features&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Documentation&lt;/td&gt;
&lt;td&gt;Integrated&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Searchable&lt;br&gt;&lt;br&gt;
Props&lt;br&gt;&lt;br&gt;
Playground |&lt;br&gt;
| Example apps | High-quality source code |&lt;br&gt;
| Guidelines | For design decisions |&lt;/p&gt;

&lt;p&gt;Standard theory is missing. However it should be built using existing software design patterns.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Theory&lt;/th&gt;
&lt;th&gt;Features&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Single Source of Truth (SST)&lt;/td&gt;
&lt;td&gt;All settings in one single place.&lt;/td&gt;
&lt;td&gt;Specific for design systems&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Single Responsibility Principle (SRP)&lt;/td&gt;
&lt;td&gt;Functional compositions&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Modular architecture&lt;/td&gt;
&lt;td&gt;Functional Reactive Programming&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;The base / variant pattern (BEM)&lt;/td&gt;
&lt;td&gt;Scalability and simplicity&lt;/td&gt;
&lt;td&gt;A common practice&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Clean API&lt;/td&gt;
&lt;td&gt;Minimal props with uniform naming&lt;/td&gt;
&lt;td&gt;The hardest to achieve&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Folder structure&lt;/td&gt;
&lt;td&gt;Reduce cognitive load&lt;/td&gt;
&lt;td&gt;Find anything in no time&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

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

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://adele.uxpin.com/"&gt;Adele / UXPin - A repository of publicly available design systems and pattern libraries&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.google.com/spreadsheets/d/1Yn-fzRIfXcpFilQwjv62MC4yRCTQFaS2qhhtbnfohhg/edit?usp=sharing"&gt;A quick analysis of design systems and component libraries&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.slideshare.net/MajaWichrowska/building-and-rebuilding-the-airbnb-design-system"&gt;Building (and Re-Building) the Airbnb Design System&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=jnV1u67_yVg&amp;amp;feature=youtu.be"&gt;Mark Dalgleish: Rethinking Design Practices&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>designsystem</category>
      <category>componentlibrary</category>
      <category>uiuxdesign</category>
    </item>
    <item>
      <title>How to write React code in 2019</title>
      <dc:creator>metamn</dc:creator>
      <pubDate>Sun, 20 Oct 2019 00:00:00 +0000</pubDate>
      <link>https://dev.to/metamn/how-to-write-react-code-in-2019-3h94</link>
      <guid>https://dev.to/metamn/how-to-write-react-code-in-2019-3h94</guid>
      <description>&lt;p&gt;&lt;a href="https://twitter.com/housecor/status/1185222395210153984?s=20"&gt;Cory House&lt;/a&gt; nails it.&lt;/p&gt;

&lt;p&gt;Even if there is &lt;a href="http://metamn.io/react/there-is-no-official-style-guide-for-react/"&gt;no official style guide&lt;/a&gt; to write React code — there are official &lt;a href="https://reactjs.org/docs/thinking-in-react.html"&gt;guidelines&lt;/a&gt; and &lt;a href="https://reactjs.org/docs/hooks-rules.html"&gt;rules&lt;/a&gt; to follow, and a common sense emerging from &lt;a href="https://dev.toIdentify%20the%20right%20leaders"&gt;the leaders&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;In &lt;a href="https://www.dropbox.com/s/tsid5bnphznbvjv/Lessons%20learned%20from%205%20years%20in%20React.docx?dl=0"&gt;Lessons learned from 5 years in React&lt;/a&gt; Cory House collects his wisdom into one single document. I found it deeply resonating with my practice — and the common sense.&lt;/p&gt;

&lt;p&gt;(With his hopefully mutual permission) I'm replicating the document as checkboxes to see those points I've met, and the ones where I might catch up.&lt;/p&gt;

&lt;p&gt;You can do the same exercise too by &lt;a href="https://github.com/metamn/react/blob/master/content/blog/how-to-write-react-code-in2019/index.md"&gt;forking the list&lt;/a&gt; from the source code of this article.&lt;/p&gt;

&lt;h3&gt;
  
  
  Getting familiar with a new project
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;[x] Review package.json first to understand deps, scripts, and config.&lt;/li&gt;
&lt;li&gt;[x] Draw tree on the whiteboard, or use React dev tools. Helps to visualize state.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Dev workflow
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;[ ] Quickly nav to component or func: CMD click in JSX (VSCode)&lt;/li&gt;
&lt;li&gt;[ ] Quickly nav to parent: CMD+SHIFT+F to Search for &amp;lt;ComponentName (VSCode)&lt;/li&gt;
&lt;li&gt;[ ] Quickly view list of parents: Use React dev tools&lt;/li&gt;
&lt;li&gt;[ ] Create a component state checklist. Use it for every component. (error, no data, lots of data, long values, full list here)&lt;/li&gt;
&lt;li&gt;[ ] Debugging? type debugger. console.assert also handy.&lt;/li&gt;
&lt;li&gt;[ ] Work against mock data and mock API (I like json-server, json-graphql-server)&lt;/li&gt;
&lt;li&gt;[ ] Centralize mock data for Storybook, tests, and mock API.&lt;/li&gt;
&lt;li&gt;[x] Pass an object to a function and destructure to create named parameters. Reads more clearly. And can destructure in the function signature too. This keeps the calls in the func short and documents the expected object properties.&lt;/li&gt;
&lt;li&gt;[x] Storybook driven development – Build and test each component in isolation. Document each state in a separate story. Then use Percy or Chromatic to snapshot.

&lt;ul&gt;
&lt;li&gt;[x] Knobs&lt;/li&gt;
&lt;li&gt;[x] Responsive design&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  JSX
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;[x] You can only write expressions within a return. This limits what you can do in JSX. Options:

&lt;ul&gt;
&lt;li&gt;[x] Return early. (good for loaders and errors)&lt;/li&gt;
&lt;li&gt;[x] Extract a separate function from render when you want the full power of JavaScript (if/else/switch)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Performance
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;[x] Do the most convenient thing. It’ll probably be fast enough. Inline func? Fine. Worried about renders? Don’t be. Worried about context performance? Okay, then maybe you’re misusing context (should rarely change). Sure, perf test (set Chrome perf to 6x), but don’t speculate. Degrade ergonomics after establishing a perf issue.&lt;/li&gt;
&lt;li&gt;[x] Remember, a render != DOM change. With virtual DOM, the diff is in-memory. Flow: render -&amp;gt; reconcile -&amp;gt; commit. If the DOM doesn’t change, there’s likely no perf issue. So stop worrying about needless re-renders. React is smart enough to only change the DOM when needed, so it’s typically fast enough. &lt;/li&gt;
&lt;li&gt;[x] Don’t slap useMemo, shouldComponentUpdate, PureComponent everywhere. Only where needed. They have overhead because it’s an extra diff. If they were typically faster, they’d be the default!&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  State management
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;[x] Keep state as low as you can. Lift when needed.&lt;/li&gt;
&lt;li&gt;[x] Avoid state that can be derived. Calc on the fly. Reference objects by id instead of duplicating.&lt;/li&gt;
&lt;li&gt;[ ] Use _myVar convention to resolve state naming conflicts.&lt;/li&gt;
&lt;li&gt;[x] Don’t sync state, derive it. Example, calculate full name on the fly by concatenating firstName and lastName in render. Don’t store fullName separately. Doing so risks out of sync issues and requires extra code to keep it in sync.&lt;/li&gt;
&lt;li&gt;[x] State that changes together, should live together. Reducers help. So does grouping via useState. Consider state machines – they describe valid states, which makes invalid state impossible (as new customer with 5 previous purchases, or an admin with no rights shouldn’t be possible. If separate states, they can get outta sync)&lt;/li&gt;
&lt;li&gt;[x] Probably don’t need Redux. Lifting state scales nicely and is easy to understand. Prop drilling pain is overblown. Keep prop names the same. Spread props. Pass child. Memoize. Use context and useReducer cover the rare global needs well. Show slides of diff data approaches from my updated Redux course.&lt;/li&gt;
&lt;li&gt;[ ] Context isn’t just useful for global data. Useful for compound components. Can be useful for performance. &lt;/li&gt;
&lt;li&gt;[ ] setLoading(false) in finally to assure it’s called&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Props
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;[x] Require all props at first&lt;/li&gt;
&lt;li&gt;[x] Destructure props in func signature to shorten calls below. Useful on event handler funcs too. But what about props with dashes in name like aria-label? Well, don’t destructure that by using spread: …otherProps&lt;/li&gt;
&lt;li&gt;[x] Make your props as specific as possible&lt;/li&gt;
&lt;li&gt;[x] Standardize naming. onX for eventHandler props. handleX for the func.&lt;/li&gt;
&lt;li&gt;[x] Centralize your propTypes&lt;/li&gt;
&lt;li&gt;[x] Document propTypes via JSDoc style comments = autocomplete and docs in Storybook. Can even use markdown!&lt;/li&gt;
&lt;li&gt;[x] Spread props or pass children to reduce the pain of prop drilling&lt;/li&gt;
&lt;li&gt;[ ] Prop existence conveys truth. So &lt;code&gt;&amp;lt;Input required /&amp;gt;&lt;/code&gt; is sufficient. &lt;/li&gt;
&lt;li&gt;[x] Honor the native API in your reusable component designs. Pass the full event to event handlers, not merely the value. Then you can use a centralized change handler. Honor the native names (onBlur, onChange, etc). Doing so maximizes flexibility and minimizes the learning curve.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Styling
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;Note: Here I have a completely different approach based on &lt;code&gt;styled-components&lt;/code&gt; best practices and inspired by Material UI.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;[ ] Mix styling approaches. &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;[ ] Inline styles for dynamic styles. &lt;/li&gt;
&lt;li&gt;[ ] Namespace via CSS modules.&lt;/li&gt;
&lt;li&gt;[ ] Use plain Sass for global styles.&lt;/li&gt;
&lt;li&gt;[ ] CSS in JS remains a hard sell – too many horses in the race. &lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;[ ] Use classnames to apply multiple styles&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;[x] Use flexbox and CSS Grid over floating styles&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;[ ] Create abstraction over flexbox to abstract breakpoints for consistency (bootstrap gives ya this) &lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Reusable components
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;[x] 3 keys to easy reuse&lt;/li&gt;
&lt;li&gt;[ ] Consider dedicating a person/team to this. Why? Speed. Less decision fatigue. Smaller bundles. Consistency = better UX. Less code = fewer bugs.&lt;/li&gt;
&lt;li&gt;[x] Look for repeated code – opportunity for reuse. Every reuse is a perf enhancement.&lt;/li&gt;
&lt;li&gt;[ ] DRY out your forms by combining custom hooks, context, and reusable components to create an opinionated custom approach that encapsulates your app’s business rules. These tools are the foundation.&lt;/li&gt;
&lt;li&gt;[ ] Accept both a simple string and an element. Use React.isValidElement to tell which you’re getting.&lt;/li&gt;
&lt;li&gt;[ ] Create an “as” prop to specify the top-level element.
&lt;/li&gt;
&lt;li&gt;[ ] Create a reusable AppLayout using the slot pattern.&lt;/li&gt;
&lt;li&gt;[ ] Centralize alerts in AppLayout and provide function for showing the alerts via context.&lt;/li&gt;
&lt;li&gt;[x] Gen custom docs via react-docgen&lt;/li&gt;
&lt;li&gt;[ ] Consider creating separate mobile and desktop components if they differ significantly. Lazy load the relevant size. &lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Testing
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;[ ] Prefer RTL over Enzyme. Simpler API = pit of success. Encourages a11y. Easy to debug. Can use same queries for Cypress.&lt;/li&gt;
&lt;li&gt;[ ] JSDOM doesn’t render, so can’t test responsive design there. Use Cypress to test responsive design behavior.&lt;/li&gt;
&lt;li&gt;[ ] Avoid Jest snapshot tests. They’re brittle, they test implementation details, they’re often poorly named, they all fail when a single line changes, and they’re hard to fix when they fail. Instead, prefer Percy or Chromatic to test visuals&lt;/li&gt;
&lt;li&gt;[ ] Use the scenario selector pattern to run your app against different data. Automate these tests via Cypress/Selenium&lt;/li&gt;
&lt;li&gt;[ ] Use Cypress testing library so your Cy selectors match your React Testing library selectors = No need to change code to support Cypress tests!&lt;/li&gt;
&lt;li&gt;[ ] Cypress driven development – TDD for integration testing. Use Cypress to navigate to the spot you need to test. Use cy.only to call a single test. It should fail first. Make it pass. &lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Dev env
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;[ ] Consider customizing create-react-app (CRA). &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;[ ] Use react-app-rewired to tweak the config without ejecting &lt;/li&gt;
&lt;li&gt;[ ] Customize linting rules. &lt;/li&gt;
&lt;li&gt;[ ] Add webpack-bundle-analyzer. Know what’s in your bundle. &lt;/li&gt;
&lt;li&gt;[ ] Consider forking at least react scripts. Consider forking CRA. Create a company framework that generates a project with a single dependency: Your react-scripts fork that includes your company’s components, tweaks, dependencies, linting rules, webpack.config, etc.
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;[x] Use Prettier. Convert in one big commit. You’ll look like the hero!&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;[x] Lean on ESLint. Use as a teaching tool. Object shorthand. No var. Disallow certain imports (jquery, lodash, moment). Require triple equals. Don’t form a committee. Assign someone you trust and enable a lot of good stuff. Can always back off later. Add plugins like jsx-a11y/recommended.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;[x] Require strict propTypes (or TS). I don’t get many type issues. (see link for list)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;[ ] Use .vsextensions to encourage extensions.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;[ ] Keep client and server separate. If embedding React in a server-side tech, use Storybook to develop components in isolation.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Consider a monorepo
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;[ ] Why? Rapid feedback. Continuous integration.&lt;/li&gt;
&lt;li&gt;[ ] Easy reuse&lt;/li&gt;
&lt;li&gt;[ ] CI integration tests projects on every PR&lt;/li&gt;
&lt;li&gt;[ ] Use Lerna, Bolt, Yarn Workspaces, or even simply a relative file reference to your reusable components to manage. I typically use Lerna.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Learning
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;[x] Have a system for organizing your knowledge. Find a new tool? Technique? Document it. I use GitHub issues here on my reactjsconsulting repo.&lt;/li&gt;
&lt;/ol&gt;

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

&lt;ul&gt;
&lt;li&gt;&lt;a href="http://metamn.io/react/there-is-no-official-style-guide-for-react/"&gt;There is no official style guide for React&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://metamn.io/react/identify-the-right-leaders/"&gt;Identify the right leaders&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://reactjs.org/docs/hooks-rules.html"&gt;Rules of Hooks&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://reactjs.org/docs/thinking-in-react.html"&gt;Thinking in React&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.dropbox.com/s/tsid5bnphznbvjv/Lessons%20learned%20from%205%20years%20in%20React.docx?dl=0"&gt;Lessons learned from 5 years in React&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>react</category>
      <category>bestpractices</category>
      <category>2019</category>
    </item>
    <item>
      <title>A Big Picture</title>
      <dc:creator>metamn</dc:creator>
      <pubDate>Sun, 20 Oct 2019 00:00:00 +0000</pubDate>
      <link>https://dev.to/metamn/a-big-picture-3cm1</link>
      <guid>https://dev.to/metamn/a-big-picture-3cm1</guid>
      <description>&lt;p&gt;React and the ecosystem mapped up.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--3-6CCwA8--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/p3khdq8ktwse393tg3c0.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--3-6CCwA8--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/p3khdq8ktwse393tg3c0.png" alt="The Big Picture"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;A higher resolution image and detailed information about the building blocks is available in &lt;a href="https://miro.com/app/board/o9J_kwFipAA=/"&gt;Miro&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;All resources based upon the chart was drawn are available in &lt;a href="http://metamn.io/react/putting-react-in-context/"&gt;Putting React in context&lt;/a&gt;&lt;/p&gt;

</description>
      <category>react</category>
      <category>ecosystem</category>
      <category>bigpicture</category>
    </item>
    <item>
      <title>We're gonna program like it's 1999</title>
      <dc:creator>metamn</dc:creator>
      <pubDate>Sat, 19 Oct 2019 00:00:00 +0000</pubDate>
      <link>https://dev.to/metamn/we-re-gonna-program-like-it-s-1999-ga1</link>
      <guid>https://dev.to/metamn/we-re-gonna-program-like-it-s-1999-ga1</guid>
      <description>&lt;p&gt;How joy and simplicity was brought back into our lives by the Facebook crew.&lt;/p&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/ADEav6zlDjg"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;h2&gt;
  
  
  Personally
&lt;/h2&gt;

&lt;p&gt;With &lt;a href="http://metamn.io/react/a-big-picture/"&gt;React and its ecosystem&lt;/a&gt; — functional reactive programming, microservices, domain-driven design, data-driven applications — I've got back my mojo.&lt;/p&gt;

&lt;p&gt;Now I write code as I've written twenty or thirty years ago.&lt;/p&gt;

&lt;p&gt;Now I design and develop user interfaces and applications like a software engineer. &lt;/p&gt;

&lt;p&gt;No more hacking, plumbing, massaging HTML, CSS, Javascript with Gulp, Grunt or Webpack — it's programming again.&lt;/p&gt;

</description>
      <category>react</category>
      <category>functional</category>
      <category>reactiveprogramming</category>
    </item>
    <item>
      <title>On GraphQL</title>
      <dc:creator>metamn</dc:creator>
      <pubDate>Thu, 10 Oct 2019 00:00:00 +0000</pubDate>
      <link>https://dev.to/metamn/on-graphql-1bb7</link>
      <guid>https://dev.to/metamn/on-graphql-1bb7</guid>
      <description>&lt;p&gt;Easy to use on the front-end. More complicated on the back-end.&lt;/p&gt;

&lt;h2&gt;
  
  
  Definition
&lt;/h2&gt;

&lt;p&gt;GraphQL, according to &lt;a href="https://graphql.org/learn/"&gt;GraphQL.org&lt;/a&gt; is three things:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;A query language&lt;/li&gt;
&lt;li&gt;A server-side runtime&lt;/li&gt;
&lt;li&gt;A type system&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Query language
&lt;/h3&gt;

&lt;p&gt;We all know query languages. SQL — to query relational databases. REST API — to query data on the backend.&lt;/p&gt;

&lt;p&gt;GraphQL is in the same way a query language. It is like REST built on the more advanced principles of &lt;a href="http://metamn.io/react/is-graphql-functional-and-reactive/"&gt;functional and reactive programming&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Server-side runtime
&lt;/h3&gt;

&lt;p&gt;The UNIX philosophy of&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Do one thing and do it well&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://www.youtube.com/watch?v=gb1R-fWP1Yw"&gt;is built into&lt;/a&gt; GraphQL making it a super simple layer on the server.&lt;/p&gt;

&lt;p&gt;The GraphQL runtime does only one thing: returns results for queries. How results are computed, put together, collected from other services — the business logic — is outside its scope.&lt;/p&gt;

&lt;p&gt;(As a compensation) GraphQL offers extensive connectivity to various backend services like databases, storage engines, serverless functions, authentication, caching to be used in any combination to define how the application works.&lt;/p&gt;

&lt;h3&gt;
  
  
  Type system
&lt;/h3&gt;

&lt;p&gt;What glues together the client-side queries and server-side responses is the GraphQL Schema — a place where:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;All types are defined together with&lt;/li&gt;
&lt;li&gt;All fields for all types, and&lt;/li&gt;
&lt;li&gt;All single purpose functions (resolvers) associated with each and every field&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In practice:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="cm"&gt;/* A GraphQL Schema */&lt;/span&gt;

&lt;span class="cm"&gt;/**
 * Data type
 * - Defines a data entity
 */&lt;/span&gt;
&lt;span class="nx"&gt;type&lt;/span&gt; &lt;span class="nx"&gt;Book&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nl"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;ID&lt;/span&gt;
    &lt;span class="nx"&gt;title&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;String&lt;/span&gt;  &lt;span class="cm"&gt;/* A field */&lt;/span&gt;
    &lt;span class="nx"&gt;author&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;Author&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="cm"&gt;/**
 * Data type
 * - Defines a data entity
 */&lt;/span&gt;
&lt;span class="nx"&gt;type&lt;/span&gt; &lt;span class="nx"&gt;Author&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nl"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;ID&lt;/span&gt;
    &lt;span class="nx"&gt;firstName&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;String&lt;/span&gt;  &lt;span class="cm"&gt;/* A field */&lt;/span&gt;
    &lt;span class="nx"&gt;lastName&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;String&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="cm"&gt;/**
 * Query type
 * - Defines operations on data
 */&lt;/span&gt;
&lt;span class="nx"&gt;type&lt;/span&gt; &lt;span class="nx"&gt;Query&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;book&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;ID&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="nx"&gt;Book&lt;/span&gt;  &lt;span class="cm"&gt;/* A field */&lt;/span&gt;
    &lt;span class="nx"&gt;author&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;ID&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="nx"&gt;Author&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;





&lt;div class="highlight"&gt;&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="cm"&gt;/**
 * Server-side, single purpose functions (resolvers)
 */&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;resolvers&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;Query&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;author&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;root&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;id&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;find&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;authors&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;id&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="na"&gt;Author&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;books&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;author&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;filter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;books&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;authorId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;author&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;id&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;div class="highlight"&gt;&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Client-side query&lt;/span&gt;
&lt;span class="c"&gt;#&lt;/span&gt;
GET /graphql?query&lt;span class="o"&gt;={&lt;/span&gt;
    book&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;id&lt;/span&gt;: &lt;span class="s2"&gt;"1"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        title,
        author
        &lt;span class="o"&gt;{&lt;/span&gt;
            firstName
        &lt;span class="o"&gt;}&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;





&lt;div class="highlight"&gt;&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="cm"&gt;/**
 * The result
 */&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;title&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Black Hole Blues&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;author&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;firstName&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Janna&lt;/span&gt;&lt;span class="dl"&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;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;h2&gt;
  
  
  The Facebook way
&lt;/h2&gt;

&lt;p&gt;GraphQL was created by Facebook and later open sourced for the community. Together with the other parts of the stack — React, Relay — they &lt;a href="https://developers.facebook.com/videos/2019/building-the-new-facebookcom-with-react-graphql-and-relay/"&gt;power&lt;/a&gt; one of the largest web apps today, Facebook.com.&lt;/p&gt;

&lt;p&gt;It's good to be aware of the Facebook way. To learn about the best practices on large scale.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Facebook has been using GraphQL in production for almost four years; today, it serves over 300 billion queries a day and its schema has nearly 10,000 types. &lt;/p&gt;

&lt;p&gt;In building this API, we’ve developed a set of best practices for designing an understandable and scalable GraphQL schema. — &lt;a href="https://www.youtube.com/watch?v=etax3aEe2dA"&gt;Dan Schafer at react-europe&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Facebook defines GraphQL using the following concepts:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;The underlying database and business model is a graph&lt;/li&gt;
&lt;li&gt;There is a single source of truth&lt;/li&gt;
&lt;li&gt;The API is a thin layer&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Graph databases
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://www.prisma.io/blog/comparison-of-database-models-1iz9u29nwn37"&gt;Comparing Database Types: How Database Types Evolved to Meet Different Needs&lt;/a&gt; has a great overview and definition for graph databases:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Graph databases are most useful when working with data where the relationships or connections are highly important.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;In contrast, the relational database paradigm is best used to organize well-structured data:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;In general, relational databases are often a good fit for any data that is regular, predictable.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;In other words graph databases focus on interactions in an unpredictable environment while relational databases focus on structure in a well-known context.&lt;/p&gt;

&lt;p&gt;In graph databases entities have flexible shapes and more importantly they can form relationships freely, on the fly.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--z5OuS_UI--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/e4w7hozjhfuura662jue.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--z5OuS_UI--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/e4w7hozjhfuura662jue.png" alt="Graph database diagram"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In relational databases the business domain is well known a priori and what's left is to create a well performing model upon.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--VoaDCbW6--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/3plyw7f4g5o46g3yieg0.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--VoaDCbW6--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/3plyw7f4g5o46g3yieg0.png" alt="Relational database diagram"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;No wonder Facebook chose the graph approach. It handles better the use case of interaction-heavy user interfaces.&lt;/p&gt;

&lt;h3&gt;
  
  
  Domain-driven design — DDD
&lt;/h3&gt;

&lt;p&gt;Dynamic contexts needs &lt;a href="https://khalilstemmler.com/articles/typescript-domain-driven-design/ddd-vs-crud-design/"&gt;a new kind of design thinking&lt;/a&gt; to be able to provide solutions.&lt;/p&gt;

&lt;p&gt;In a rigid environment, where there are no moving parts and everything is under &lt;em&gt;control&lt;/em&gt; one could easily model &lt;em&gt;how&lt;/em&gt; things work using an &lt;em&gt;imperative&lt;/em&gt; approach.&lt;/p&gt;

&lt;p&gt;In dynamic environments the only (relatively) sure thing is the existence of an entity. The capabilities an entity offers can change over time. Therefore the most important thing an entity can do is to &lt;em&gt;declare&lt;/em&gt; &lt;em&gt;what&lt;/em&gt; are its capabilities. Then the other parts of the system will be able to understand it and interact with.&lt;/p&gt;

&lt;p&gt;For such evolving models where an entity is:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;An object that is not defined by its attributes, but rather by a thread of continuity and its identity.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;a suitable design approach is called &lt;a href="https://en.wikipedia.org/wiki/Domain-driven_design"&gt;Domain-driven design&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--ct1cZvpw--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/nkcpervl3ocn7ge9ky84.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--ct1cZvpw--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/nkcpervl3ocn7ge9ky84.png" alt="DDD Sketch"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;via&lt;/em&gt; &lt;a href="https://martinfowler.com/bliki/images/boundedContext/sketch.png"&gt;Martin Fowler&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Microservices
&lt;/h3&gt;

&lt;p&gt;The Facebook way implies Domain-driven design which is closely related to the microservices architecture.&lt;/p&gt;

&lt;p&gt;Ville Touronen from University of Helsinki wrote a well-worth-reading &lt;a href="https://helda.helsinki.fi/bitstream/handle/10138/304677/Touronen_Ville_Pro_gradu_2019.pdf"&gt;master thesis&lt;/a&gt; about how GraphQL connects to DDD and microservices.&lt;/p&gt;

&lt;p&gt;In short — this new context, array of technologies, and paradigms requires the business domain to be split into different functional domains (&lt;em&gt;services&lt;/em&gt;) which are highly isolated, independent and loosely coupled (&lt;em&gt;micro&lt;/em&gt;).&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--DK_zyQGP--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/yxfcz8fur8e6if0z6nmg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--DK_zyQGP--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/yxfcz8fur8e6if0z6nmg.png" alt="Microservices"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;via&lt;/em&gt; &lt;a href="https://www.apollographql.com/customers/expediagroup/"&gt;Apollo / Expedia GraphQL architecture&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Microservices complete the big picture. The Facebook way is a full bet on the &lt;a href="https://blog.danlew.net/2017/07/27/an-introduction-to-functional-reactive-programming/"&gt;Functional Reactive Programming paradigm&lt;/a&gt; from design (DDD), data (GraphQL and graph databases), implementation (React) to servers (microservices).&lt;/p&gt;

&lt;h3&gt;
  
  
  Single source of truth
&lt;/h3&gt;

&lt;p&gt;In a dynamic context it is very important to establish a single source of truth from where all other parts of the stack provision themselves.&lt;/p&gt;

&lt;p&gt;The creators of GraphQL &lt;a href="https://www.youtube.com/watch?v=gb1R-fWP1Yw"&gt;are always eager to emphasize&lt;/a&gt; the importance of such a truth layer.&lt;/p&gt;

&lt;p&gt;In &lt;a href="https://graphql.org/learn/thinking-in-graphs/#business-logic-layer"&gt;Thinking in Graphs / Business Logic Layer&lt;/a&gt; chapter there is a clear definition and a diagram describing the use case:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Your business logic layer should act as the single source of truth for enforcing business domain rules&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--naLOczIt--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/4rzntu0z2t6hio7dnwum.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--naLOczIt--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/4rzntu0z2t6hio7dnwum.png" alt="Business logic layer"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In the Facebook approach the truth gatekeeper role is given to GraphQL. &lt;/p&gt;

&lt;p&gt;GraphQL's type system / schema is suitable to declare and define the capabilities of an entity. And it is extendable through &lt;em&gt;Smart Data Objects / GraphQLObjectType&lt;/em&gt; to connect with the business logic layer.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="cm"&gt;/**
 * From Ville Touronen's master thesis
 * 
 * See: https://helda.helsinki.fi/bitstream/handle/10138/304677/Touronen_Ville_Pro_gradu_2019.pdf
 */&lt;/span&gt;



&lt;span class="cm"&gt;/**
 * - The business logic is held in a separate layer
 * - Each type (`Book`) has an associated `model` where
 * ... data fetching, business logic, or security is solved 
 * ... exactly once for this type across the application
 * ... providing the single source of truth
 * 
 * See: https://blog.apollographql.com/graphql-at-facebook-by-dan-schafer-38d65ef075af 
 */&lt;/span&gt; 
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;getBook&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./models/book&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;


&lt;span class="cm"&gt;/**
 * Bindings to the business logic layer
 */&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;bookQuery&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nx"&gt;GraphQLSchema&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
    &lt;span class="na"&gt;query&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nx"&gt;GraphQLObjectType&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="s2"&gt;`Query`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;fields&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="na"&gt;book&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;bookType&lt;/span&gt; &lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="na"&gt;args&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                    &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                        &lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;internal id of the book&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                        &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;GraphQLNonNull&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="nx"&gt;GraphQLString&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="cm"&gt;/**
                 * Resolvers **always** map to the business logic
                 */&lt;/span&gt;
                &lt;span class="na"&gt;resolve&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="nx"&gt;root&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;id&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;getBook&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="nx"&gt;id&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="p"&gt;});&lt;/span&gt;

&lt;span class="cm"&gt;/**
 * The capabilities of an entity aka the types
 */&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;bookType&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nx"&gt;GraphQLObjectType&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="s1"&gt;Book&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;A book with an ISBN code&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;fields&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;({&lt;/span&gt;
        &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;GraphQLNonNull&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;GraphQLString&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;The internal identifier of the book&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="cm"&gt;/* ... The other fields ... */&lt;/span&gt;
    &lt;span class="p"&gt;})&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt;

&lt;span class="cm"&gt;/**
 * All wrapped together
 */&lt;/span&gt;
&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;BookSchema&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nx"&gt;GraphQLSchema&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
    &lt;span class="na"&gt;query&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;bookQuery&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;types&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt; &lt;span class="nx"&gt;bookType&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;h3&gt;
  
  
  Thin API Layer
&lt;/h3&gt;

&lt;p&gt;The most important takeaway up to this point is the:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;code&gt;type&lt;/code&gt; → &lt;code&gt;field&lt;/code&gt; → &lt;code&gt;resolver&lt;/code&gt; → &lt;code&gt;business logic&lt;/code&gt; pattern.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Types have fields and every field has an associated server-side function which returns results and connects to the business logic layer.&lt;/p&gt;

&lt;p&gt;The first three items constitute the thin API layer of GraphQL, the last one is the separated business logic layer.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;|------------------|                 |----------------------|
| GraphQL Thin API |                 | Business Logic Layer |
|---------------------------|        |--------------------------------|
| Type -&amp;gt; Field -&amp;gt; Resolver |   -&amp;gt;   | Model / Single source of truth |
|---------------------------|        |--------------------------------|
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;This pattern is a double-edged sword. It makes design and development easier but scaling on the server-side harder.&lt;/p&gt;

&lt;h4&gt;
  
  
  The N+1 problem
&lt;/h4&gt;

&lt;p&gt;The &lt;a href="https://stackoverflow.com/questions/97197/what-is-the-n1-selects-problem-in-orm-object-relational-mapping"&gt;N+1 selects problem&lt;/a&gt; is a basic design and development constraint in older paradigms like relational databases. It makes the business / data / component model to follow certain strict technical guidelines which are not natural to default human thinking.&lt;/p&gt;

&lt;p&gt;In GraphQL this issue &lt;a href="https://www.youtube.com/watch?v=P_yfbQrdzJo&amp;amp;list=PLn2e1F9Rfr6kChXoURShhO3A-4r8FLYsO&amp;amp;index=18"&gt;is automatically solved&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;The original N+1 problem is related to database design. Improperly designed database tables can lead to more database queries than optimal reducing considerably the app response time. To circumvent this issue in the object-relational paradigm various normalization techniques are used.&lt;/p&gt;

&lt;p&gt;In GraphQL there is no N+1 problem. One can design freely the types in the schema and a middle-layer — the Dataloader — takes care of eliminating the N+1 performance issues.&lt;/p&gt;

&lt;p&gt;In practice this means &lt;code&gt;fields&lt;/code&gt; can be freely added to &lt;code&gt;types&lt;/code&gt; without worrying about normalization. Components can be modeled in a less rigid, more human friendly way using &lt;em&gt;graphs&lt;/em&gt; which let directly store the relationships between records.&lt;/p&gt;

&lt;p&gt;Writing the associated &lt;code&gt;resolvers&lt;/code&gt; to &lt;code&gt;fields&lt;/code&gt; is again free thinking: just focus on the single purpose of the function of returning the results and forget about redundancy, caching and performance.&lt;/p&gt;

&lt;p&gt;The chatty server-side functions (resolvers) which might repaetedly load data from the database are collected, optimized into a single request, and their results cached — by the GraphQL middle-layer.&lt;/p&gt;

&lt;h4&gt;
  
  
  Challenges are mounting on the back-end
&lt;/h4&gt;

&lt;p&gt;Around two third of all talks from the &lt;a href="https://www.youtube.com/playlist?list=PLn2e1F9Rfr6kChXoURShhO3A-4r8FLYsO"&gt;2019 GraphQL conference&lt;/a&gt; is about the schema.&lt;/p&gt;

&lt;p&gt;How to build it from fragments to make it scalable; how to design it in a way to properly handle error messages; a dozen of opinions on how to manage the growth of the schema. From Github, Facebook to Twitter, Coursera and Visa everybody is facing the schema scaling issue.&lt;/p&gt;

&lt;p&gt;The GraphQL / Domain-driven design / Microservices &lt;a href="https://www.youtube.com/watch?v=S22rYsesrQc&amp;amp;feature=youtu.be"&gt;patterns&lt;/a&gt; — API Gateway, Integration Database, Data Federation, Backend for Front End — are new concepts and all subject of scaling.&lt;/p&gt;

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

&lt;p&gt;GraphQL is no silver bullet. It's not better or worse than other paradigms.&lt;/p&gt;

&lt;p&gt;It makes app design and user interface development more human by empowering the architects, designers and front-end developers. What is gained here has to be solved on the back-end in new ways with new efforts.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://graphql.org/learn/"&gt;Introduction to GraphQL&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://metamn.io/react/is-graphql-functional-and-reactive/"&gt;Is GraphQL functional and reactive?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=gb1R-fWP1Yw"&gt;GraphQL before GraphQL — Dan Schafer @ GraphQLConf 2019&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://stackoverflow.com/questions/97197/what-is-the-n1-selects-problem-in-orm-object-relational-mapping"&gt;The "N+1 selects problem"&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=P_yfbQrdzJo&amp;amp;list=PLn2e1F9Rfr6kChXoURShhO3A-4r8FLYsO&amp;amp;index=18"&gt;GraphQL Execution Strategies — Andreas Marek @ GraphQL Conf 2019&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=S22rYsesrQc&amp;amp;feature=youtu.be"&gt;GraphQL Berlin Meetup #15: System Design and Architecture @ GraphQL — Bogdan Nedelcu&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://khalilstemmler.com/articles/typescript-domain-driven-design/ddd-vs-crud-design/"&gt;REST-first design is Imperative, DDD is Declarative [Comparison] - DDD w/ TypeScript&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://helda.helsinki.fi/bitstream/handle/10138/304677/Touronen_Ville_Pro_gradu_2019.pdf"&gt;Microservice architecture patterns with GraphQL&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://blog.danlew.net/2017/07/27/an-introduction-to-functional-reactive-programming/"&gt;An Introduction to Functional Reactive Programming&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>react</category>
      <category>graphql</category>
      <category>microservices</category>
      <category>domaindrivendesign</category>
    </item>
    <item>
      <title>The reactive, functional nature of React</title>
      <dc:creator>metamn</dc:creator>
      <pubDate>Tue, 08 Oct 2019 00:00:00 +0000</pubDate>
      <link>https://dev.to/metamn/the-reactive-functional-nature-of-react-gal</link>
      <guid>https://dev.to/metamn/the-reactive-functional-nature-of-react-gal</guid>
      <description>&lt;p&gt;React follows the Functional Reactive Programming paradigm. That's a shift from the old proactive, imperative approach.&lt;/p&gt;

&lt;h2&gt;
  
  
  The context
&lt;/h2&gt;

&lt;p&gt;Both paradigms solve the same problem — to build modular, interactive applications — in different ways.&lt;/p&gt;

&lt;p&gt;The old way implemented modularity through tight-coupling and interaction synchronously. The new way implements modularity with loose-coupling and interaction asynchronously.&lt;/p&gt;

&lt;p&gt;Modularity and interaction abstracted to composition and coupling can further elucidate the picture. Composition is about how the components of the system can add up to form a whole, while coupling is about how they communicate with each other.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://blog.danlew.net/2017/07/27/an-introduction-to-functional-reactive-programming/"&gt;Functional reactive programming&lt;/a&gt; deals with composition the functional programming way and with coupling the reactive programming way.&lt;/p&gt;

&lt;h2&gt;
  
  
  Composition
&lt;/h2&gt;

&lt;p&gt;Composing up a system from smaller parts is best possible when the underlying components behave predictably:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;They have clear and stable interfaces — input parameters and return values — which can be easily combined.&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;During execution, while input parameters are transformed into return values&lt;/p&gt;

&lt;p&gt;2.1. The process doesn't modify the input parameters&lt;/p&gt;

&lt;p&gt;2.2. No external information is used beside input parameters to produce the return value&lt;/p&gt;

&lt;p&gt;2.3. No additional operations are performed beside the planned functionality&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Pure functions
&lt;/h3&gt;

&lt;p&gt;Such components in functional programming are called &lt;em&gt;pure functions&lt;/em&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="cm"&gt;/**
 * A pure component example
 */&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;PureComponent&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;props&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="cm"&gt;/**
   * ✅ Clear interfaces:
   * - props are input params, JSX is the return value
   * ✅ Input params are not modified
   * ✅ No external information is used beside input params to produce the return value
   * ✅ No additional operations are performed beside the planned functionality
   */&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;div&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="nx"&gt;Pure&lt;/span&gt; &lt;span class="nx"&gt;component&lt;/span&gt; &lt;span class="na"&gt;props&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;stringify&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;props&lt;/span&gt;&lt;span class="p"&gt;)}&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/div&amp;gt;&lt;/span&gt;&lt;span class="err"&gt;;
&lt;/span&gt;&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;h3&gt;
  
  
  Impure functions
&lt;/h3&gt;

&lt;p&gt;Having only pure functions in a complex system is almost impossible. Therefore the concept of impure functions and side effects is introduced.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="cm"&gt;/**
 * An impure component example with side effects
 */&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;ImpureComponent&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;props&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="cm"&gt;/**
   * ✅ Clear interfaces:
   * - props are input params, JSX is the return value
   * ✅ Input params are not modified
   * - props are protected by React so they can't be easily distorted
   */&lt;/span&gt;

  &lt;span class="cm"&gt;/**
   * Side effect #1
   *
   * ❌ External information is used beside input params to produce the return value
   */&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;external&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;External info&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="cm"&gt;/**
   * Side effect #2
   *
   * ❌ Additional operations are performed beside the planned functionality
   */&lt;/span&gt;
  &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;props:&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;stringify&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;props&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="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;ul&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;li&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="nx"&gt;Impure&lt;/span&gt; &lt;span class="nx"&gt;component&lt;/span&gt; &lt;span class="na"&gt;props&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;stringify&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;props&lt;/span&gt;&lt;span class="p"&gt;)}&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/li&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;      &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;li&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="nx"&gt;External&lt;/span&gt; &lt;span class="nx"&gt;info&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="na"&gt;value&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;external&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/li&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/ul&lt;/span&gt;&lt;span class="err"&gt;&amp;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;h3&gt;
  
  
  Side effects, managed
&lt;/h3&gt;

&lt;p&gt;When side effects are not avoidable they have to be made &lt;a href="https://overreacted.io/writing-resilient-components/#writing-resilient-components"&gt;resilient&lt;/a&gt; — not distorting the original application flow.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="cm"&gt;/**
 * Side effects managed through useEffect
 */&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;SideEffectsWithUseEffect&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;props&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="cm"&gt;/**
   * ✅ The `external` side effect is wrapped into a state
   * ✅ Later it can be managed via `useEffect` which makes it resilient 
   */&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;external&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;setExternal&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;useState&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Initial value ...&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="cm"&gt;/**
   * ✅ By using `useEffect` the rendering of the component is not suspended, the flow is not distorted.
   * ✅ First the component is rendered with the default value
   * ✅ After 3 seconds React automatically updates the component with the new value.
   * (The 3s delay added makes the effect visible on UI)
   */&lt;/span&gt;
  &lt;span class="nx"&gt;useEffect&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="cm"&gt;/**
     * Manages the side effect
     */&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;timer&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;setTimeout&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="nx"&gt;setExternal&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Initial value replaced with useEffect&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="mi"&gt;3000&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="cm"&gt;/**
     * Cleans up the side effect
     *
     * @link https://reactjs.org/docs/hooks-effect.html
     */&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;clearTimeout&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;timer&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="cm"&gt;/**
   * ✅ The `console.log` additional operation side effect is wrapped into the `useEffect` hook
   * ✅ The Effect Hook lets you perform side effects in function components
   */&lt;/span&gt;
  &lt;span class="nx"&gt;useEffect&lt;/span&gt;&lt;span class="p"&gt;(()&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;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;props:&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;stringify&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;props&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;props&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="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;ul&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;li&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="nx"&gt;Component&lt;/span&gt; &lt;span class="na"&gt;props&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;stringify&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;props&lt;/span&gt;&lt;span class="p"&gt;)}&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/li&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;      &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;li&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="nx"&gt;External&lt;/span&gt; &lt;span class="nx"&gt;info&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;value&lt;/span&gt; &lt;span class="kd"&gt;with&lt;/span&gt; &lt;span class="na"&gt;useEffect&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;external&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/li&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/ul&lt;/span&gt;&lt;span class="err"&gt;&amp;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;h2&gt;
  
  
  Coupling
&lt;/h2&gt;

&lt;p&gt;Coupling deals with the communication between the components of a system. To make a system scale communication has to be in the same effective as composition.&lt;/p&gt;

&lt;p&gt;Reactive programming achieves this through:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Isolation:&lt;/p&gt;

&lt;p&gt;1.1 Components are aware of, and care about their own problems only&lt;/p&gt;

&lt;p&gt;1.2 Components does not interfere with each other's inner workings&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Asynchronous communication:&lt;/p&gt;

&lt;p&gt;2.1 Components subscribe to events&lt;/p&gt;

&lt;p&gt;2.2 They react when an event happens&lt;/p&gt;

&lt;p&gt;2.3 They return an observable — which emits events other components can subscribe to.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Isolation
&lt;/h3&gt;

&lt;p&gt;In React isolation is about the local state — components can update only their own state and can't modify other component's state.&lt;/p&gt;

&lt;h3&gt;
  
  
  Asynchronous communication
&lt;/h3&gt;

&lt;p&gt;In React asynchronous communication is all about hooks. Components communicate with each other and the surrounding ecosystem — the local data store, the local cache store, the database — via the hooks mechanism.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;|-----------------|-------------------|
| Hook            | Ecosystem         |
|-----------------| ------------------|
| useContext      | Local data store  |
| useMemo         | Local cache store |
| useCallback     | Other components  |
| useQuery,       |                   |
| useMutation,    |                   |
| useSubscription | GraphQL database  |
|-------------------------------------|
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;h2&gt;
  
  
  Wrapping up
&lt;/h2&gt;

&lt;p&gt;Using reactive and functional programming concepts React and its building blocks — props, state, hooks, side effects, pure components — can be put in a general context.&lt;/p&gt;

&lt;p&gt;A general context which is a great help when mapping up the big picture.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;|================|                            |================|
| Component 1    |                            | Component 2    |
|================|                            |================|
| Props          |                            | Props          |
|----------------|                            |----------------|
| Local state    |                            | Local state    |
|----------------|                            |----------------|
|                | &amp;lt;-------- Hooks --------&amp;gt;  |                |
|                | &amp;lt;-------- Hooks --------&amp;gt;  |                |
| Side effects   | &amp;lt;-------- Hooks --------&amp;gt;  | Side effects   |
|                | &amp;lt;-------- Hooks --------&amp;gt;  |                |
|                | &amp;lt;-------- Hooks --------&amp;gt;  |                |
|----------------|                            |----------------|
| Return JSX     |                            | Return JSX     |
|================|                            |================|

     ^                 ^                ^                ^
     |                 |                |                |
     | Hooks           | Hooks          | Hooks          | Hooks
     |                 |                |                |
|----------|     |-----------|     |----------|     |-----------|
| State    |     | Data      |     | Cache    |     | UI        |
| store    |     | store     |     | store    |     | Events    |
|----------|     |-----------|     |----------|     |-----------|
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



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

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://blog.danlew.net/2017/07/27/an-introduction-to-functional-reactive-programming/"&gt;An Introduction to Functional Reactive Programming&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://overreacted.io/writing-resilient-components/#writing-resilient-components"&gt;Writing Resilient Components&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>react</category>
      <category>functional</category>
      <category>reactiveprogramming</category>
    </item>
    <item>
      <title>Ontology, taxonomy, choreography</title>
      <dc:creator>metamn</dc:creator>
      <pubDate>Sun, 06 Oct 2019 00:00:00 +0000</pubDate>
      <link>https://dev.to/metamn/ontology-taxonomy-choreography-mj4</link>
      <guid>https://dev.to/metamn/ontology-taxonomy-choreography-mj4</guid>
      <description>&lt;p&gt;A way to think about Information Architecture in React terms.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is Information Architecture, and what is not?
&lt;/h2&gt;

&lt;p&gt;We all think we know what Information Architecture is — so why the question?&lt;/p&gt;

&lt;p&gt;Wikipedia has &lt;a href="https://en.wikipedia.org/wiki/Information_architecture"&gt;9 definitions&lt;/a&gt; for this term. Choosing the ones related to web / app design we have:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;The art and science of organizing and labeling web sites, intranets, online communities, and software to support findability and usability.&lt;/li&gt;
&lt;li&gt;The combination of organization, labeling, search and navigation systems within websites and intranets.&lt;/li&gt;
&lt;li&gt;The practice of organizing the information / content / functionality of a web site so that it presents the best user experience it can, with information and services being easily usable and findable (as applied to web design and development).&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;These definitions relate to keywords specific to UX design — usability, experience — yet there is a &lt;a href="https://www.uxbooth.com/articles/the-difference-between-ia-and-ux-design/"&gt;clear differentiation&lt;/a&gt; between IA and UX:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Information Architecture concerns &lt;em&gt;structure&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;User Experience concerns &lt;em&gt;emotion&lt;/em&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Let's analyze further Information Architecture by the means of structure.&lt;/p&gt;

&lt;h2&gt;
  
  
  Architects of understanding
&lt;/h2&gt;

&lt;p&gt;The term IA was born together with the web and evolved with mobile devices and apps.&lt;/p&gt;

&lt;p&gt;Peter Morville, an Information Architecture icon, &lt;a href="https://prezi.com/aafmvya6bk7t/understanding-information-architecture/"&gt;captures&lt;/a&gt; perfectly these moments:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--mehtTBtk--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/lsu4be1e5ebe2nf9w08c.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--mehtTBtk--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/lsu4be1e5ebe2nf9w08c.png" alt="IA definition #1"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;... and concludes with a statement where — again — UX is removed:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--WKuD841e--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/ae5qqh9gpg1upkxl4qid.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--WKuD841e--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/ae5qqh9gpg1upkxl4qid.png" alt="IA definition #2"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Here we are in the business of understanding: understanding the problem and understanding how people can best solve the problem — in an interactive space. &lt;/p&gt;

&lt;p&gt;Information Architecture now has a shape. It's about modeling problem structure and modeling user behavior with the help of user interfaces.&lt;/p&gt;

&lt;h2&gt;
  
  
  Structure and behavior
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://www.uxbooth.com/articles/complete-beginners-guide-to-information-architecture/"&gt;Dan Klyn&lt;/a&gt; has a clear take on how to model structure and behavior in user interfaces: with ontology, taxonomy and choreography.&lt;/p&gt;

&lt;p&gt;&lt;iframe src="https://player.vimeo.com/video/8866160" width="710" height="399"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;&lt;a href="https://vimeo.com/8866160"&gt;explaining information architecture&lt;/a&gt; from &lt;a href="https://vimeo.com/user3007539"&gt;Dan Klyn&lt;/a&gt; on &lt;a href="https://vimeo.com"&gt;Vimeo&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Simplified to this point — the tasks of an Information Architect are clear:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Reduce, limit the complexity of the problem.&lt;/li&gt;
&lt;li&gt;Organize the information about the problem into data.&lt;/li&gt;
&lt;li&gt;Define data entities, the properties of entities, and the relations between.&lt;/li&gt;
&lt;li&gt;Organize entities into hierarchies, maps and views.&lt;/li&gt;
&lt;li&gt;Design the sequences of movement between the elements above.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Ontology, taxonomy, choreography and React
&lt;/h2&gt;

&lt;p&gt;Finally we can put React in context with Information Architecture giving developers and UI/UX designers a bigger picture and a shared vocabulary.&lt;/p&gt;

&lt;p&gt;Ontology, taxonomy and choreography can act as the boundary between these two different disciplines.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;|------------|     |------------|     |--------------|
| Ontology   |     | Taxonomy   |     | Choreography |    UI/UX ▲
|------------|     |------------|     |--------------|    -----------
| Data       |     | Sitemap    |     | Events       |    UI/UX + Dev
|------------|     |------------|     |--------------|    -----------
     |                   |                   |            Dev ▼
     |                   |                   |
     ▼                   ▼                   ▼
|------------|     |------------|     |--------------|
| GraphQL    |     | Router     |     | State        |
|------------|     |------------|     |--------------|
     |                   |                   |
     |                   |                   |
     ▼                   ▼                   ▼
|----------------------------------------------------|
|                 React Components                   |
|----------------------------------------------------| 
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



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

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://en.wikipedia.org/wiki/Information_architecture"&gt;Information architecture - Wikipedia&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.uxbooth.com/articles/the-difference-between-ia-and-ux-design/"&gt;The Difference Between Information Architecture and UX Design&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://prezi.com/aafmvya6bk7t/understanding-information-architecture/"&gt;Understanding Information Architecture&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://vimeo.com/8866160"&gt;Explaining Information Architecture&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>react</category>
      <category>informationarchitecture</category>
      <category>ux</category>
    </item>
    <item>
      <title>On state</title>
      <dc:creator>metamn</dc:creator>
      <pubDate>Sat, 05 Oct 2019 00:00:00 +0000</pubDate>
      <link>https://dev.to/metamn/on-state-4o1k</link>
      <guid>https://dev.to/metamn/on-state-4o1k</guid>
      <description>&lt;p&gt;Everything in React rolls around the concept of state. &lt;/p&gt;

&lt;h2&gt;
  
  
  The concept
&lt;/h2&gt;

&lt;p&gt;State was unknown in proactive programming. Now it is surfacing as the central element of reactive programming.&lt;/p&gt;

&lt;p&gt;In Dan Lew's &lt;a href="https://blog.danlew.net/2017/07/27/an-introduction-to-functional-reactive-programming/" rel="noopener noreferrer"&gt;seminal article&lt;/a&gt; about Functional Reactive Programming the concept of state is fully explained and put further in context. Please read it first. It's pure joy.&lt;/p&gt;

&lt;h3&gt;
  
  
  Proactive programming — No state
&lt;/h3&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%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fxq1ng338rgjjqptsfyfm.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%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fxq1ng338rgjjqptsfyfm.png" alt="Proactive"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In proactive programming a component directly calls public methods of other components — and the passive components are not aware of these calls. They don't do accounting for what is happening inside them — they have no state. &lt;/p&gt;

&lt;p&gt;The caller component is responsible to interpret the results of the call. The passive component has one single responsibility: to make the publicly callable methods available to the external world.&lt;/p&gt;

&lt;h3&gt;
  
  
  Reactive programming — With state
&lt;/h3&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%2Fthepracticaldev.s3.amazonaws.com%2Fi%2F89th4gmxsv7h28rp4ob8.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%2Fthepracticaldev.s3.amazonaws.com%2Fi%2F89th4gmxsv7h28rp4ob8.png" alt="Reactive"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In reactive programming everything is different. Each component owns its own state and modifies it on request. No component can directly modify the state of another component. &lt;/p&gt;

&lt;p&gt;The caller component has to ask the receiver component to perform an operation which might modify the receiver component's internal state, then wait for — subscribe to — the results.&lt;/p&gt;

&lt;p&gt;This kind of isolation brings greater composability — essential to build large scale systems and complex, interactive user interfaces.&lt;/p&gt;

&lt;h3&gt;
  
  
  How it works
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;|============|==================|=================|==============|
| Paradigm   | Step 1           | Step 2          | Step 3       |
|============|==================|=================|==============|
| Reactive   | The switcher     | The bulb        | The bulb     |
|            | emits request    | receives        | changes its  |
|            | for state change | the request     | own state    |
|------------|------------------|-----------------|--------------|
| Imperative | The bulb         | The switcher    |              |
|            | exposes a state  | calls the state |              |
|            | change function  | change function |              |
|            |                  | of the bulb     |              |
|================================================================|
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  State in React
&lt;/h2&gt;

&lt;p&gt;State is so important in React it is marked first in the list of features:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;React makes it painless to create interactive UIs. Design simple views for each state in your application, and React will efficiently update and render just the right components when your data changes. — &lt;a href="https://reactjs.org/" rel="noopener noreferrer"&gt;https://reactjs.org/&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;More, when hooks were introduced they were immediately related to state: &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Hooks are a new addition in React 16.8. They let you use state and other React features without writing a class. — &lt;a href="https://reactjs.org/docs/hooks-intro.html" rel="noopener noreferrer"&gt;Introducing Hooks&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;React has to offer built-in mechanisms to deal with state — to support one of its main core features. And yes it does with &lt;code&gt;useState&lt;/code&gt; and &lt;code&gt;useReducer&lt;/code&gt;. &lt;/p&gt;

&lt;p&gt;None of these are powerful enough to handle complex scenarios like global shared state — leaving to the ecosystem to come up with  alternatives like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://redux.js.org/" rel="noopener noreferrer"&gt;Redux&lt;/a&gt;, &lt;a href="https://mobx.js.org/" rel="noopener noreferrer"&gt;MobX&lt;/a&gt; — Global, shared state services for large applications.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.apollographql.com/docs/react/essentials/local-state/" rel="noopener noreferrer"&gt;Apollo GraphQL&lt;/a&gt; — State management bundled with data management from a proven provider.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://css-tricks.com/finite-state-machines-with-react/" rel="noopener noreferrer"&gt;XState&lt;/a&gt; — Finite state machines and state charts to manage state and make it error prone.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Every day a new state &lt;a href="https://twitter.com/DavidKPiano/status/1180174113954029570" rel="noopener noreferrer"&gt;library&lt;/a&gt; or &lt;a href="https://twitter.com/dai_shi/status/1178106720108679168" rel="noopener noreferrer"&gt;approach&lt;/a&gt; is popping up. There is no holy grail which one to use — everybody makes its own bet.&lt;/p&gt;

&lt;p&gt;When in doubt important is to follow the React way: &lt;em&gt;'Don’t overthink it`&lt;/em&gt;. Which in this case translates to: &lt;em&gt;'Use only when you need it'&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Learn the different techniques and combine them by need.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;&lt;/code&gt;&lt;code&gt;&lt;br&gt;
|================|=============================|===========================================&lt;br&gt;
| Implementation | When to use                 | State type | Notes                       |&lt;br&gt;
|================|=============================|===========================================&lt;br&gt;
| useState       | Simple states               | Local      |                             |&lt;br&gt;
|----------------|-----------------------------|------------|-----------------------------|&lt;br&gt;
| useReducer     | Complex state logic         | Local      | With&lt;/code&gt;useContext&lt;code&gt;~= Redux  |&lt;br&gt;
|----------------|-----------------------------|------------|-----------------------------|&lt;br&gt;
| useMachine     | Complex state logic         | Local      | - Use for component design  |&lt;br&gt;
| (XState)       | Fool-proof states           |            | - Autogenerate tests        |&lt;br&gt;
|----------------|-----------------------------|------------|-----------------------------|&lt;br&gt;
| Redux, MobX    | When none above are enough  | Global     |                             |&lt;br&gt;
|================|=============================|============|=============================|&lt;br&gt;
&lt;/code&gt;&lt;code&gt;&lt;/code&gt;&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://blog.danlew.net/2017/07/27/an-introduction-to-functional-reactive-programming/" rel="noopener noreferrer"&gt;An Introduction to Functional Reactive Programming&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.robinwieruch.de/react-state-usereducer-usestate-usecontext/" rel="noopener noreferrer"&gt;React State with Hooks: useReducer, useState, useContext&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://kentcdodds.com/blog/application-state-management-with-react" rel="noopener noreferrer"&gt;Application State Management with React&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.robinwieruch.de/redux-vs-usereducer/" rel="noopener noreferrer"&gt;React's useReducer vs Redux&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://css-tricks.com/finite-state-machines-with-react/" rel="noopener noreferrer"&gt;Finite State Machines with React&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/gatsbyjs/gatsby/pull/11897" rel="noopener noreferrer"&gt;Gatsby: Move page component state &amp;amp; side effect handling to xstate&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://css-tricks.com/model-based-testing-in-react-with-state-machines/" rel="noopener noreferrer"&gt;Model-Based Testing in React with State Machines&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.apollographql.com/docs/react/essentials/local-state/" rel="noopener noreferrer"&gt;Learn how to work with your local data in Apollo Client&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>react</category>
      <category>state</category>
      <category>reactiveprogramming</category>
    </item>
    <item>
      <title>Rapid prototyping for GraphQL APIs?</title>
      <dc:creator>metamn</dc:creator>
      <pubDate>Thu, 03 Oct 2019 03:00:00 +0000</pubDate>
      <link>https://dev.to/metamn/rapid-prototyping-for-graphql-apis-53l5</link>
      <guid>https://dev.to/metamn/rapid-prototyping-for-graphql-apis-53l5</guid>
      <description>&lt;p&gt;That's nearly impossible today.&lt;/p&gt;

&lt;h2&gt;
  
  
  GraphQL is young
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://nordicapis.com/is-graphql-moving-toward-ubiquity/"&gt;According to its creator&lt;/a&gt; GraphQL is expected to become ubiquitous in 2020-2021. Today is in the phase of being accepted by the large companies.&lt;/p&gt;

&lt;p&gt;The official GraphQL page &lt;a href="https://graphql.org/code/#services"&gt;lists&lt;/a&gt; only a handful of services ready to build upon. Of them a few are complete solutions — backends as a service — and of them a few are production ready.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Graphcool - is self hosted&lt;/li&gt;
&lt;li&gt;Reindex - looks empty&lt;/li&gt;
&lt;li&gt;Scaphold - closed down&lt;/li&gt;
&lt;li&gt;Tipe - is in beta&lt;/li&gt;
&lt;li&gt;Hasura - has no pricing plans&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;What's left is Apollo, GraphCMS and AWS AppSync.&lt;/p&gt;

&lt;p&gt;Before checking them let's see how an ideal GraphQL API backend should look like.&lt;/p&gt;

&lt;h2&gt;
  
  
  The ideal GraphQL API service
&lt;/h2&gt;

&lt;p&gt;An ideal service would offer the following features:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Visual Schema designer&lt;/li&gt;
&lt;li&gt;Automatic database generation based on the schema&lt;/li&gt;
&lt;li&gt;Automatic resolver generation&lt;/li&gt;
&lt;li&gt;Automatic lambda function generation for the resolvers&lt;/li&gt;
&lt;li&gt;Automatic Type / Schema code generation and sync for clients&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;In other words:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;One should be able to visually design the data structure&lt;/li&gt;
&lt;li&gt;From that design all else — possible — is automatically generated: database tables, resolvers, lambda functions, schema, types, boilerplate client code&lt;/li&gt;
&lt;li&gt;On client side, during development, when the schema is modified it is automatically synced with the backend.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That would mean rapid prototyping.&lt;/p&gt;

&lt;h2&gt;
  
  
  Apollo and AWS AppSync
&lt;/h2&gt;

&lt;p&gt;Both of them support all requirements except 1.) the visual scheme designer.&lt;/p&gt;

&lt;p&gt;In Apollo all tasks imply (mostly) &lt;a href="https://www.apollographql.com/docs/tutorial/introduction/"&gt;manual work&lt;/a&gt;. In AWS AppSync + Amplify everything is automated.&lt;/p&gt;

&lt;p&gt;No wonder. Their description and distinctive features are put pretty clear on &lt;a href="https://graphql.org/code/#services"&gt;GraphQL.org&lt;/a&gt;.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Apollo Engine: A service for monitoring the performance and usage of your GraphQL backend.&lt;/p&gt;

&lt;p&gt;AWS AppSync: Fully managed GraphQL service with realtime subscriptions, offline programming &amp;amp; synchronization, and enterprise security features as well as fine grained authorization controls.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;One has to choose AWS AppSync then, or dive deep into Apollo to find hidden gems unsurfaced during this quick research.&lt;/p&gt;

&lt;p&gt;However in our collective mindset AWS is for large scale production apps and enterprise use not for rapid prototyping. All plans are paid and every operation is billed.&lt;/p&gt;

&lt;p&gt;GraphCMS to the rescue?&lt;/p&gt;

&lt;h2&gt;
  
  
  Headless CMS is young (and not enough)
&lt;/h2&gt;

&lt;p&gt;From the &lt;a href="https://docs.google.com/spreadsheets/d/1AmrfMT6a-tT9x4nR__RumuCcT6NedxliFf-76Ocv2pQ/edit?usp=sharing"&gt;list of developer friendly headless CMS services on JAMStack&lt;/a&gt; — including Contentful, GraphCMS, Sanity, TakeShape, Prismic, Kentico — only a few experiences worth it.&lt;/p&gt;

&lt;p&gt;Setting up an account and trying to get a GraphQL endpoint on a free plan was tedious or impossible in many times:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Contentful - No GraphQL on the free plan&lt;/li&gt;
&lt;li&gt;GraphCMS - Except 5.) Automatic code generation and sync — it offers all other features. However these features seems to be undocumented and very fragile.&lt;/li&gt;
&lt;li&gt;Sanity - A strange, download first approach. Skipped for now.&lt;/li&gt;
&lt;li&gt;TakeShape - The GraphQL endpoint works out of the box. Worth experiencing with it further.&lt;/li&gt;
&lt;li&gt;Prismic - GraphQL support has to be asked for / enabled manually by the support team. Worth experiencing with it further.&lt;/li&gt;
&lt;li&gt;WPGraphQL - Works perfect however is tailored to the WordPress data structure. It can be extended of course but WordPress is a specific, not a general purpose CMS.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;Wait for the Headless CMS scene to take off. &lt;/p&gt;

&lt;p&gt;Otherwise, if needed right now, go with AWS. All services can be used for free for a year.&lt;/p&gt;

&lt;p&gt;Is AWS expensive? It's a Tier 1 service. Probably all other Headless CMS providers on upper tiers are building upon its infrastructure — increasing the bill. &lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://nordicapis.com/is-graphql-moving-toward-ubiquity/"&gt;Is GraphQL Moving Toward Ubiquity?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://graphql.org/code/#services"&gt;GraphQL Services&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.apollographql.com/docs/tutorial/introduction/"&gt;Apollo Introduction&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.google.com/spreadsheets/d/1AmrfMT6a-tT9x4nR__RumuCcT6NedxliFf-76Ocv2pQ/edit?usp=sharing"&gt;A list of developer friendly headless CMS services on JAMStack&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>react</category>
      <category>graphql</category>
      <category>headlesscms</category>
      <category>aws</category>
    </item>
    <item>
      <title>Identify the right leaders</title>
      <dc:creator>metamn</dc:creator>
      <pubDate>Thu, 03 Oct 2019 00:00:00 +0000</pubDate>
      <link>https://dev.to/metamn/identify-the-right-leaders-3h8b</link>
      <guid>https://dev.to/metamn/identify-the-right-leaders-3h8b</guid>
      <description>&lt;p&gt;Or else.&lt;/p&gt;

&lt;h2&gt;
  
  
  The buzz
&lt;/h2&gt;

&lt;p&gt;React is famous about its steep learning curve. No wonder — starting from the programming model through data to user interaction introduced changes which are often paradigm shifts.&lt;/p&gt;

&lt;p&gt;Want the buzzwords?&lt;/p&gt;

&lt;p&gt;Reactive programming, Functional programming, Pure functions, Side effects, State, Hooks, Functional components, Referential equality, Finite State Machines / XState, Data driven applications, Code splitting, Pre-caching assets, Pre-rendering static HTML, Memoization, Static type checking — none of these were present in your old framework, perhaps.&lt;/p&gt;

&lt;p&gt;Learning React is not like it was learning Ruby on Rails, Yii, or MVC. It’s more like a fresh start with unlearning first, then re-learning everything from information architecture design to event-based user interfaces.&lt;/p&gt;

&lt;h2&gt;
  
  
  The problem
&lt;/h2&gt;

&lt;p&gt;Identify the right leaders.&lt;/p&gt;

&lt;p&gt;A surprisingly compact ecosystem around React makes this process enjoyable. There are a handful of opinion leaders who often share their thoughts which &lt;em&gt;are in line&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;The list goes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Robin Wieruch&lt;/li&gt;
&lt;li&gt;Kent C. Dodds&lt;/li&gt;
&lt;li&gt;Dan Abramov&lt;/li&gt;
&lt;li&gt;Dave Ceddia&lt;/li&gt;
&lt;li&gt;(sorry if I skipped you …)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Once you’ve found the &lt;em&gt;line&lt;/em&gt; your learning process will be smooth unless you leave the safe waters. At the edge there is nobody to guide you.&lt;/p&gt;

&lt;h2&gt;
  
  
  An example
&lt;/h2&gt;

&lt;p&gt;All the buzz is around the state. It’s React’s cornerstone and it’s not yet solved.&lt;/p&gt;

&lt;p&gt;Go with Redux? Forget Redux after hooks? Dive into finite state machines? What about MobX? Many job posts require it — it must be popular and useful.&lt;/p&gt;

&lt;p&gt;Apollo started to introduce local state management with GraphQL. What that means for all the other libraries? Will they push it together with Apollo Client?&lt;/p&gt;

&lt;p&gt;RWieruch just published a tutorial for state management with RxJS. Should I read it?&lt;/p&gt;

&lt;p&gt;There is a new library React Tracked: Super fast global/shared state with context and hooks. Should I read it? Can I trust the author? Is he in the &lt;em&gt;line&lt;/em&gt;?&lt;/p&gt;

&lt;h2&gt;
  
  
  The solution
&lt;/h2&gt;

&lt;p&gt;I went with finite state machines / Xstate. Why?&lt;/p&gt;

&lt;p&gt;Its leader is trustworthy. Checked videos, blog posts, chatted on twitter, created a test project, advanced it, found a bug, filed a bug in Github, got a fix for it — and all the time every interaction felt so natural.&lt;/p&gt;

&lt;p&gt;Will this choice stand the test of time? I don’t know. But this new piece of knowledge perfectly fits the bigger picture. Good UI/UX should be flawless and this tool helps achieve that.&lt;/p&gt;

&lt;p&gt;I’m adding David K. Piano to the list.&lt;/p&gt;

</description>
      <category>react</category>
    </item>
  </channel>
</rss>
