# Artem Sapegin > Coffee first frontend engineer, photographer, leathercrafter, food and coffee enthusiast. ## Blog - [Better autosave and autoformat in Visual Studio Code](https://sapegin.me/blog/vscode-autosave.html.md): Avoid autoformat messing up your code when you need to look something up in the docs halfway through writing a line of code. - [Modern React testing, part 5: Playwright](https://sapegin.me/blog/react-testing-5-playwright.html.md): Learn how to test React apps end-to-end with Playwright, how to mock network requests with Mock Service Worker, and how to apply testing best practices to write integration tests. - [How I stay (more) focused with ADHD](https://sapegin.me/blog/adhd-focus.html.md): I could never stay focused on one thing for a long time. These tips help me stay focused and productive. - [Typewriter 2.0: search for the perfect writing experience on iPad](https://sapegin.me/blog/writing-on-ipad.html.md): I struggle writing on my desk, so I wanted to find a great mechanical keyboard for iPad that I can take to some nice café with me. - [Healthier way to open source your code](https://sapegin.me/blog/healthy-open-source.html.md): Open source is about sharing your code. Anything else is optional. Don’t want to spend time answering issues and reviewing pull requests? It’s totally up to you! - [Why I quit open source](https://sapegin.me/blog/open-source-no-more.html.md): Four main reasons I stopped maintaining most of my open source projects after ten years of contributing regularly. - [Hiding tabs completely in Visual Studio Code](https://sapegin.me/blog/hiding-tabs-in-visual-studio-code.html.md): - [Migrating my blog from Gatsby to Astro](https://sapegin.me/blog/gatsby-to-astro.html.md): Recently, I redesigned and rebuilt my site and blog from Gatsby to Astro, and would like to share my experience. - [Healing my open source addiction](https://sapegin.me/blog/ex-open-source.html.md): I started my first open source project in 2012 but 10 years later I quit it almost entirely because of its hostile culture. Recently, I found a hobby that gives me everything I liked about open source but without any of its downsides. - [A rebel’s guide to pull requests, commits, and code reviews](https://sapegin.me/blog/rebels-guide-to-pull-requests-commits-code-reviews.html.md): - [Going offline](https://sapegin.me/blog/going-offline.html.md): The Coronavirus allowed me to reflect on what’s important to me, and to see my life from a different point of view regarding work, open source, hobbies, and social networks over the past two years. - [Transpiling ESM files inside node_modules](https://sapegin.me/blog/transpiling-esm-in-node-modules.html.md): - [Writing cross-platform components for web and React Native](https://sapegin.me/blog/react-native-components.html.md): One of the selling points of React Native is code sharing between web, iOS, and Android — “seamless cross-platform” as they say on the homepage. Unfortunately, React Native gives us very few tools to write components that work on web and native, and the experience is far from seamless. - [The most useful accessibility testing tools and techniques](https://sapegin.me/blog/accessibility-testing.html.md): Shipping accessible features is as important for a frontend developer as shipping features without bugs, learn about tools and techniques that will help you achieve that. - [Detecting accessibility issues on CI with cypress-axe](https://sapegin.me/blog/detecting-accessibility-issues-on-ci-with-cypress-axe.html.md): - [Finding unused and missing npm dependencies with depcheck](https://sapegin.me/blog/finding-unused-npm-dependencies-with-depcheck.html.md): - [Generating TypeScript React components from SVG icons using SVGR](https://sapegin.me/blog/generating-typescript-react-components-from-svg-icons-using-svgr.html.md): - [Using React useReducer hook with TypeScript](https://sapegin.me/blog/using-react-usereducer-hook-with-typescript.html.md): - [Enabling new ESLint rules in a legacy codebase with suppress-eslint-errors](https://sapegin.me/blog/enabling-new-eslint-rules-in-a-legacy-codebase-with-suppress-eslint-errors.html.md): - [Caching static assets on Netlify](https://sapegin.me/blog/caching-static-assets-on-netlify.html.md): - [Finding the most often changed files with git effort from git-extras](https://sapegin.me/blog/finding-the-most-often-changed-files-with-git-effort-from-git-extras.html.md): - [Finding the most used React components with react-scanner](https://sapegin.me/blog/finding-the-most-used-react-components-with-react-scanner.html.md): - [Ensuring React Testing Library best practices with ESLint](https://sapegin.me/blog/ensuring-react-testing-library-best-practices-with-eslint.html.md): - [Renaming TypeScript interfaces with ts-morph](https://sapegin.me/blog/renaming-typescript-interfaces-with-ts-morph.html.md): - [Modern React testing, part 4: Cypress and Cypress Testing Library](https://sapegin.me/blog/react-testing-4-cypress.html.md): Learn how to test React apps end-to-end with Cypress and Cypress Testing Library, how to mock network requests with Mock Service Worker, and how to apply testing best practices to write integration tests. - [Six donts of web app internationalization](https://sapegin.me/blog/internationalization.html.md): By avoiding these problems in your app you allow translators do their best job and significantly improve quality of translations on your project - [Modern React testing, part 3: Jest and React Testing Library](https://sapegin.me/blog/react-testing-3-jest-and-react-testing-library.html.md): Learn how to test React components with Jest and React Testing Library and how to apply the best modern frontend testing practices. - [Modern React testing, part 2: Jest and Enzyme](https://sapegin.me/blog/react-testing-2-jest-and-enzyme.html.md): Learn how to test React components with Jest and Enzyme and how to apply the best modern frontend testing practices. - [Modern React testing, part 1: best practices](https://sapegin.me/blog/react-testing-1-best-practices.html.md): Learn why you should write automated tests, what tests to write, and how to write them. What are the best practices of modern frontend and React testing. - [Accessible inline list with bullets between items](https://sapegin.me/blog/accessible-inline-list.html.md): Making lists with bullets between items (like · this · one) accessible can be surprisingly hard. - [React Finland 2019](https://sapegin.me/blog/react-finland-2019.html.md): - [How to get your code reviewed faster](https://sapegin.me/blog/faster-code-reviews.html.md): - [What’s wrong with snapshot tests](https://sapegin.me/blog/snapshot-tests.html.md): - [React Finland 2018](https://sapegin.me/blog/react-finland-2018.html.md): - [React 16.0—16.9 new features for every day use](https://sapegin.me/blog/react-16.html.md): - [No complaints policy in open source](https://sapegin.me/blog/no-complaints-oss.html.md): - [Automating open source project configuration with Mrm](https://sapegin.me/blog/mrm.html.md): - [Testing React Intl components with Jest and Enzyme](https://sapegin.me/blog/react-intl-jest-enzyme.html.md): - [Why robots should format our code for us](https://sapegin.me/blog/prettier.html.md): - [How to use CSS Modules with TypeScript and webpack](https://sapegin.me/blog/typescript-css-modules.html.md): - [Which JavaScript code style is the most popular](https://sapegin.me/blog/javascript-code-styles.html.md): - [What to learn in 2017 if you’re a frontend developer](https://sapegin.me/blog/what-to-learn-in-2017.html.md): - [Testing React components with Jest and Enzyme](https://sapegin.me/blog/react-jest.html.md): - [Whom to follow on Twitter if you’re a frontend developer](https://sapegin.me/blog/frontend-twitters.html.md): - [Ask Me Anything is the new way of blogging](https://sapegin.me/blog/ama.html.md): - [Why I open source my personal code](https://sapegin.me/blog/personal-open-source.html.md): - [Automate npm releases with semantic-release and human-written change logs](https://sapegin.me/blog/semantic-release.html.md): - [Add the fucking change log](https://sapegin.me/blog/changelog.html.md): - [View Source 2016](https://sapegin.me/blog/view-source-2016.html.md): - [Structuring React and Redux applications](https://sapegin.me/blog/react-structure.html.md): - [Egghead courses review: React, reactive programming & open source](https://sapegin.me/blog/egghead.html.md): - [Why I wrote another static site generator](https://sapegin.me/blog/why-fledermaus.html.md): - [React Amsterdam 2016](https://sapegin.me/blog/react-amsterdam-2016.html.md): - [Frontend development mail lists](https://sapegin.me/blog/frontend-mail-lists.html.md): - [On discoverability of JavaScript packages](https://sapegin.me/blog/javascript-discoverability.html.md): - [Don’t touch jQuery](https://sapegin.me/blog/dont-touch-jquery.html.md): - [React single page applications resources](https://sapegin.me/blog/react-redux-spa.html.md): - [Importance of the developer experience in the modern frontend](https://sapegin.me/blog/frontend-developer-experience.html.md): - [A few notes about web developer’s interviews](https://sapegin.me/blog/coding-interview.html.md): - [Loading framework’s plugins with RequireJS](https://sapegin.me/blog/plugins-requirejs.html.md): - [Going wavy](https://sapegin.me/blog/waves.html.md): Often when I have something to get done, I can’t get myself started for a few days. Even if the week before I was very productive. - [How to show GUI dialog window from shell script on a Mac](https://sapegin.me/blog/show-gui-dialog-from-shell.html.md): - [Bower: why frontend needs a package manager](https://sapegin.me/blog/bower.html.md): - [How not to go blind on the internet](https://sapegin.me/blog/internet-blindness.html.md): - [GitHub vs. Dropbox. Why “versus”?](https://sapegin.me/blog/github-vs-dropbox.html.md): - [Simple site deploy from Git](https://sapegin.me/blog/deploy.html.md): - [JavaScript and Stylus conditional compilation (debug mode) in Grunt](https://sapegin.me/blog/debug-mode.html.md): - [Multilingual blog on DocPad](https://sapegin.me/blog/multilingual-docpad.html.md): - [Open source for everyone](https://sapegin.me/blog/open-source-for-everyone.html.md): - [Read less tech books](https://sapegin.me/blog/read-less-tech-books.html.md): - [My new CSS Workflow: Stylus, Autoprefixer, CSSO and Grunt](https://sapegin.me/blog/css-workflow.html.md): - [My frontend methodology: OPOR (One Page of Rules), or BEM for small sites](https://sapegin.me/blog/opor-methodology.html.md): - [WordPress → Aegea → DocPad](https://sapegin.me/blog/docpad.html.md): - [Making frameworks, bootstraps and other developer’s friends](https://sapegin.me/blog/frameworks.html.md): - [alert('Hello world!');](https://sapegin.me/blog/hello-world.html.md): ## Washing your code: a book on clean code for frontend developers - [Avoid loops](https://sapegin.me/book/avoid-loops.html.md): A chapter from “Washing your code. A book on clean code for frontend developers” by Artem Sapegin. Iterating over collections and why traditional loops, such as `for` or `while`, may not be the best way of doing that - [Avoid conditions](https://sapegin.me/book/avoid-conditions.html.md): A chapter from “Washing your code. A book on clean code for frontend developers” by Artem Sapegin. Crafting good conditions and simplifying code by removing unnecessary conditions - [Avoid reassigning variables](https://sapegin.me/book/avoid-reassigning-variables.html.md): A chapter from “Washing your code. A book on clean code for frontend developers” by Artem Sapegin. Improving code readability by making it easier to understand what variables are do and how they are used in the code - [Avoid mutation](https://sapegin.me/book/avoid-mutation.html.md): A chapter from “Washing your code. A book on clean code for frontend developers” by Artem Sapegin. Why mutation hinders code readability and what can we do about it - [Avoid comments](https://sapegin.me/book/avoid-comments.html.md): A chapter from “Washing your code. A book on clean code for frontend developers” by Artem Sapegin. Writing useful comments, when to comment our code, and when it’s better not to - [Naming is hard](https://sapegin.me/book/naming-is-hard.html.md): A chapter from “Washing your code. A book on clean code for frontend developers” by Artem Sapegin. How clear names make it easier to understand the code, and how to improve naming in our code - [Divide and conquer, or merge and relax](https://sapegin.me/book/divide-and-conquer.html.md): A chapter from “Washing your code. A book on clean code for frontend developers” by Artem Sapegin. Splitting code into functions and modules, when the right time is to introduce an abstraction, and when it’s better to sleep on it - [Don’t make me think](https://sapegin.me/book/dont-make-me-think.html.md): A chapter from “Washing your code. A book on clean code for frontend developers” by Artem Sapegin. All the different ways programmers like to write clever code, and why we should avoid clever code as much as possible - [Code style](https://sapegin.me/book/code-style.html.md): A chapter from “Washing your code. A book on clean code for frontend developers” by Artem Sapegin. Which code styles are actually improve readability and which are merely preferences that don’t matter much - [Other techniques](https://sapegin.me/book/other-techniques.html.md): A chapter from “Washing your code. A book on clean code for frontend developers” by Artem Sapegin. Everything else that didn’t fit into other chapters - [Lint your code](https://sapegin.me/book/linting.html.md): A chapter from “Washing your code. A book on clean code for frontend developers” by Artem Sapegin. How linters can help us maintain a consistent and modern codebase, and promote some of the techniques discussed in the book - [Autoformat your code](https://sapegin.me/book/formatting.html.md): A chapter from “Washing your code. A book on clean code for frontend developers” by Artem Sapegin. How tools can make our lives easier by formatting code for us - [Learn your code editor](https://sapegin.me/book/editing.html.md): A chapter from “Washing your code. A book on clean code for frontend developers” by Artem Sapegin. Different techniques for editing code and customizing our environment to make our work more efficient and less tiring