<?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: Devon Campbell</title>
    <description>The latest articles on DEV Community by Devon Campbell (@raddevon).</description>
    <link>https://dev.to/raddevon</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%2F68773%2Fb7d80362-8828-44a6-aaeb-60ab21efaf84.png</url>
      <title>DEV Community: Devon Campbell</title>
      <link>https://dev.to/raddevon</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/raddevon"/>
    <language>en</language>
    <item>
      <title>Make your users happy by keeping it RYL in documentation</title>
      <dc:creator>Devon Campbell</dc:creator>
      <pubDate>Fri, 04 Aug 2023 20:17:39 +0000</pubDate>
      <link>https://dev.to/edgedb/make-your-users-happy-by-keeping-it-ryl-in-documentation-1l32</link>
      <guid>https://dev.to/edgedb/make-your-users-happy-by-keeping-it-ryl-in-documentation-1l32</guid>
      <description>&lt;p&gt;One of the first principles you learn as a developer is DRY: don't repeat yourself. In some cases, DRY should be ignored — like to avoid over-abstraction or tight coupling, and when it might have a problematic impact on performance — but, in &lt;em&gt;most&lt;/em&gt; cases, it's a principle that serves developers well. It makes code easier to maintain, easier to test, and less buggy (since there's just less of it in general).&lt;/p&gt;

&lt;p&gt;Many of us find ourselves at some point writing documentation for the software we've built. DRY is so useful when writing software that we want to bring it over with us and use it when we write our documentation too. It &lt;em&gt;can&lt;/em&gt; have benefits in documentation… but it can also do more harm than good. Let's look at some examples from &lt;a href="https://www.edgedb.com/docs/intro/index#ref-intro"&gt;the EdgeDB documentation&lt;/a&gt; to show when DRY works and when it doesn't.&lt;/p&gt;

&lt;h2&gt;
  
  
  The most repeated piece of EdgeDB documentation​
&lt;/h2&gt;

&lt;p&gt;This is the most foundational thing we document… and it's, by no coincidence, the most repeated bit of documentation on our entire site. If we don't tell you how to install EdgeDB, there's not really much point in telling you anything else. 😅&lt;/p&gt;

&lt;p&gt;We have at least four instances of the installation instructions:&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Installation instructions on the EdgeDB home page&lt;/em&gt;&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--qYXX4E6U--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://www.edgedb.com/_images/_blog-gallery/8af55687651e46908c0bf6cdcd5822fcb1b19aaf-1440.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--qYXX4E6U--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://www.edgedb.com/_images/_blog-gallery/8af55687651e46908c0bf6cdcd5822fcb1b19aaf-1440.webp" alt="Installation instructions on the EdgeDB home page" width="800" height="600"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Installation instructions on the EdgeDB quickstart&lt;/em&gt;&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--vJatC1xl--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://www.edgedb.com/_images/_blog-gallery/031dbb465a703ad516b4f42217fbd0146e3525b6-1440.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--vJatC1xl--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://www.edgedb.com/_images/_blog-gallery/031dbb465a703ad516b4f42217fbd0146e3525b6-1440.webp" alt="Installation instructions on the EdgeDB quickstart" width="800" height="599"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Installation instructions in the EdgeDB CLI documentation&lt;/em&gt;&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--KyyMpMrJ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://www.edgedb.com/_images/_blog-gallery/340c1de734a0a59112fb72c9d39e74659a414160-1440.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--KyyMpMrJ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://www.edgedb.com/_images/_blog-gallery/340c1de734a0a59112fb72c9d39e74659a414160-1440.webp" alt="Installation instructions in the EdgeDB CLI documentation" width="800" height="601"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Installation instructions in the EdgeDB Next.js blog tutorial&lt;/em&gt;&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--4WA_yTQa--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://www.edgedb.com/_images/_blog-gallery/d4c722764b632ab594d1e2d96bb46f215e7aa9c0-1440.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--4WA_yTQa--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://www.edgedb.com/_images/_blog-gallery/d4c722764b632ab594d1e2d96bb46f215e7aa9c0-1440.webp" alt="Installation instructions in the EdgeDB Next.js blog tutorial" width="800" height="601"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Messy, right? Now, if the command for installing EdgeDB changes, we have to change it in four different places — and that's the best case scenario. What happens if the person updating it doesn't know to look for these additional instances? Then, three instances don't get updated and end up leading someone in the wrong direction.&lt;/p&gt;

&lt;p&gt;This is exactly the reason we use DRY when writing software. So, why wouldn't we also apply it when writing documentation? The DRY approach would be to pick a single location to house the canonical installation instructions and then to link back to it from anywhere else we need to tell someone how to install. Why make life hard on those of us writing and maintaining documentation?&lt;/p&gt;

&lt;p&gt;Only because the alternative is worse.&lt;/p&gt;

&lt;h2&gt;
  
  
  The cost of DRY documentation​
&lt;/h2&gt;

&lt;p&gt;It's not that there's &lt;em&gt;never&lt;/em&gt; a cost associated with keeping code DRY. There is. It can mean code is spread across more files and that things are a bit harder to work with. The nice thing though is that, usually when you're re-using code, you by necessity leave a breadcrumb trail that leads to the one canonical source of the code in question. Most of the time, those pains a small price to pay for the gains.&lt;/p&gt;

&lt;p&gt;But the critical point is &lt;em&gt;who&lt;/em&gt; pays the cost of DRY code: your developers. Maybe they have to search around a little to find the function they need to refactor… but that &lt;em&gt;is&lt;/em&gt; the job. It's just part of what we do as developers.&lt;/p&gt;

&lt;p&gt;When we use DRY in documentation though by insisting every atom of documentation is located in one and only one place, the largest cost is paid &lt;strong&gt;by our users&lt;/strong&gt; when they try to &lt;em&gt;use&lt;/em&gt; the documentation. Take our &lt;a href="https://www.edgedb.com/docs/guides/tutorials/nextjs#ref-guide-nextjs"&gt;Next.js blog tutorial&lt;/a&gt; shown in one of the examples above. Imagine that it instead linked out of the tutorial to the "Install" page for installation instructions. Now, instead of the tutorial being a one-stop shop for pretty much everything you need to build the app, the user has to jump out to another page, perform that step, and then come back.&lt;/p&gt;

&lt;p&gt;OK, now I can hear you across time and space saying: "Big deal! It's one click and a few seconds on a different page." This is true, but the problem is that the Next.js blog tutorial aggregates all sorts of information from all across the documentation and even from documentation for other non-EdgeDB projects. To avoid repeating ourselves — or repeating &lt;em&gt;anyone&lt;/em&gt; — we would have links out to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Next.js documentation&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;our CLI documentation&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;our schema quickstart&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;our migration quickstart&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;our JavaScript client documentation&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;our page on the JavaScript query builder&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Vercel documentation&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;and probably a few others I've missed&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The Next.js tutorial would no longer be a tutorial, and instead it would become just an aggregation of links. Instead of one click and a few seconds to figure out how to install, the tutorial now requires globetrotting all across the internet just to build a simple project. This creates a subtle shift in what this piece of documentation is: it's no longer teaching users to build a Next.js blog; it's teaching users to &lt;em&gt;learn&lt;/em&gt; to build a Next.js blog. The burden of the actual "teaching" though now falls to them.&lt;/p&gt;

&lt;p&gt;Now take that friction and multiply it by every instance of repeated documentation across our docs. You can see how the constant added friction would make learning and using EdgeDB incredibly frustrating.&lt;/p&gt;

&lt;p&gt;Wait, what's that? It's another whisper across the void. I hear you saying, "but if DRY is good enough for developers and we're documenting a project targeted at developers, then DRY documentation should be good enough for them." The key difference is DRY code forces developers &lt;em&gt;we employ&lt;/em&gt; to do a little more work whereas DRY documentation forces our &lt;em&gt;users&lt;/em&gt; or maybe &lt;em&gt;customers&lt;/em&gt;, who granted might also happen to be developers, to do more work. Do we really want to start that relationship by making their lives harder? (Spoiler: the answer is "no, we don't." 😜)&lt;/p&gt;

&lt;p&gt;Many users will check out. They just won't do it, and I can't blame them. I wouldn't do it either if I were in their shoes! It's not that they don't want to learn. It's that there's &lt;em&gt;someone&lt;/em&gt; out there writing documentation that will make their heart smile by not forcing them do so much work. It's easier and smarter to jump ship instead of jumping through the hoops &lt;em&gt;we&lt;/em&gt; erected to make life easier on &lt;em&gt;us&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;In software, DRY is transparent to your user. To them, your app would work the same if you rewrote the same function 14 times for the 14 different contexts you call it in or if you wrote it once and calling it in those 14 contexts. But in documentation, DRY changes the user experience, often for the worse.&lt;/p&gt;

&lt;p&gt;Instead, we want to use a principle I'm calling RYL: repeat yourself liberally. (Not only does this accurately describe the concept, but it also allows me to giggle to myself as I use it to riff on a slang idiom with "keeping it RYL." 😁)&lt;/p&gt;

&lt;p&gt;The "liberally" part does some heavy lifting here. I &lt;em&gt;don't&lt;/em&gt; mean to imply you should repeat everything all the time. Let's look at why.&lt;/p&gt;

&lt;h2&gt;
  
  
  When DRY works for documentation​
&lt;/h2&gt;

&lt;p&gt;DRY is bad for documentation, so maybe you should ARY (always repeat yourself), right? Well, no, that's not really the best solution either. As with so many questions in software development, the answer to the question, "Should I reproduce an existing piece of documentation in this other context where it might be needed?" is the dreaded "it depends."&lt;/p&gt;

&lt;p&gt;If we skip down near the end of the Next.js tutorial, we'll find a section on deploying the app. The first step in deploying is to deploy an EdgeDB instance.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--LdWFwmFz--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://www.edgedb.com/_images/_blog/901bc50a1266548b97ddd11cf93b79aed1eae873-940.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--LdWFwmFz--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://www.edgedb.com/_images/_blog/901bc50a1266548b97ddd11cf93b79aed1eae873-940.webp" alt="The Next.js tutorial's links to the various EdgeDB deployment guides:&amp;lt;br&amp;gt;
AWS, Google Cloud, Azure, DigitalOcean, Fly.io, and Docker" width="800" height="603"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Readers have as many ways to do this as there are cloud providers, and we have instructions for many of them. Each of these deployment guides is fairly extensive which means including even &lt;em&gt;one&lt;/em&gt; of them would have a massive impact on the tutorial's word count. A user will probably have a strong preference for one deployment method over the others — maybe they already have some infrastructure on Google Cloud, or maybe they're familiar with AWS because they used it at a previous job — and only need to deploy to one target, so seeing all of the deployment guides inline in this tutorial will almost never be useful.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;☁️ The easiest way to deploy EdgeDB is now in beta: EdgeDB Cloud! &lt;a href="https://www.edgedb.com/p/cloud-waitlist"&gt;Sign up&lt;/a&gt; to try it for yourself.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Repeating the deployment guides here also doesn't work because it will create a ton of noise in the guide, and there's nothing particular to this tutorial about setting up the EdgeDB instance. You simply set up an instance. Then, the Next.js guide takes over again when it's time to connect that instance with your app. Repeating this mountain of deployment information within the tutorial would make it harder to use.&lt;/p&gt;

&lt;p&gt;Maybe at this point, you find yourself convinced that RYL is a useful principle when applied to tutorials which naturally aggregate information from different sources. Can RYL still be useful in other kinds of documentation where aggregation isn't their primary purpose?&lt;/p&gt;

&lt;h2&gt;
  
  
  Being RYL outside of tutorials​
&lt;/h2&gt;

&lt;p&gt;In addition to giving the basic information about how features work, documentation needs to tell users about behavior that may not be intuitive or that they might not expect. This kind of information is a great candidate for RYL. My philosophy is this: if the behavior is likely to cause a user frustration when they're using EdgeDB, make the warning about it easy to trip over in the documentation. Here's an example where we describe how to specify your server version for EdgeDB.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;edgedb instance create&lt;/em&gt;&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--6HihUZV_--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://www.edgedb.com/_images/_blog-gallery/ac0b78f79f48d829cbbdf43c8ca1974de589783f-1440.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--6HihUZV_--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://www.edgedb.com/_images/_blog-gallery/ac0b78f79f48d829cbbdf43c8ca1974de589783f-1440.webp" alt='Description of how version specifications work on the "edgedb instance create" command documentation page. "By default, when you specify a version, the CLI will use the latest release in the major version specified. This command, for example, will install the latest 2.x release: edgedb project init --server-version 2.6 You may pin to a specific version by prepending the version number with an equals sign. This command will install version 2.6: edgedb project init --server-version =2.6"' width="800" height="477"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;edgedb project init&lt;/em&gt;&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--OggZy9O1--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://www.edgedb.com/_images/_blog-gallery/237797b518be1ccd36bf458dec21d8201432837e-1440.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--OggZy9O1--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://www.edgedb.com/_images/_blog-gallery/237797b518be1ccd36bf458dec21d8201432837e-1440.webp" alt='Description of how version specifications work on the "edgedb project init" command documentation page. "By default, when you specify a version, the CLI will use the latest release in the major version specified. This command, for example, will install the latest 2.x release: edgedb project init --server-version 2.6 You may pin to a specific version by prepending the version number with an equals sign. This command will install version 2.6: edgedb project init --server-version =2.6"' width="800" height="476"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;edgedb.toml&lt;/em&gt;&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--t3sR8hum--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://www.edgedb.com/_images/_blog-gallery/2a9ffeddd14b080d3e2f155caf78c58871b53c27-1440.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--t3sR8hum--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://www.edgedb.com/_images/_blog-gallery/2a9ffeddd14b080d3e2f155caf78c58871b53c27-1440.webp" alt="Description of how version specifications work in the edgedb.toml config file's documentation page. &amp;quot;server-version- The server version of the EdgeDB project. NOTE: The version specification is assumed to be a minimum version, but the CLI will not upgrade to subsequent major versions. This means if the version specified is 3.1 and versions 3.2 and 3.3 are available, 3.3 will be installed, even if version 4.0 is also available. To specify an exact version, prepend with = like this: =3.1. We support all of the same version specifications as Cargo, Rust’s package manager.&amp;quot;" width="800" height="476"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;There is no "right" way to specify a dependency version. People have different expectations about how it should work. This means that, if you build a way to specify a version that is intuitive for one group, it will surprise another. Even though the way we do it will be surprising for some, it isn't "broken" and as a result, it can't be "fixed." What we &lt;em&gt;can&lt;/em&gt; do is to document it properly and put that documentation where users can find it.&lt;/p&gt;

&lt;p&gt;You can specify your version when you create an instance or when you initialize a project. Maybe you want to hand-write an &lt;code&gt;edgedb.toml&lt;/code&gt; file and bring up a project from it. All three are perfectly valid. It would be silly to try link users from the &lt;code&gt;edgedb.toml&lt;/code&gt; documentation across to the &lt;code&gt;edgedb instance create&lt;/code&gt; documentation for information on how version specification works, especially since we're just talking about repeating a paragraph or two of text. As part of maintaining our documentation, we will take on the burden of maintaining this information in multiple places to take the burden of finding the information or having to bounce all over our documentation off our users. By using RYL, we can ensure our users will have the information they need no matter what circumstances they find themselves in.&lt;/p&gt;

&lt;p&gt;One other nice thing about repeating this is that we can change up the text to fit the context. The first two examples are nearly identical, except that the command examples are changed to reflect the command we're talking about. Could someone figure this out on their own? Yeah, probably, but why would we make them?&lt;/p&gt;

&lt;h2&gt;
  
  
  Sometimes, DRY works tutorials better in non-tutorial docs too​
&lt;/h2&gt;

&lt;p&gt;Being DRY in other documentation is also useful. A great example is &lt;a href="https://www.edgedb.com/docs/cli/edgedb_connopts#ref-cli-edgedb-connopts"&gt;our CLI's connection flags&lt;/a&gt;. Most of the CLI's commands need to connect to an EdgeDB instance in order to be useful, and we provide many different options to make that easy for you. The current count is 13 different connection flags. They work the same way across all commands, and the documentation on them is not trivial.&lt;/p&gt;

&lt;p&gt;Here's a case where duplicating this information across a couple dozen documentation pages doesn't make sense and linking to it is the better choice. It's just too much, and the usage doesn't change across the various commands.&lt;/p&gt;

&lt;h2&gt;
  
  
  Keep it RYL… when that makes sense​
&lt;/h2&gt;

&lt;p&gt;In plenty of cases, keeping documentation DRY makes sense, but not always. DRY is less useful in documentation than it is in code because of the burden DRY documentation shifts to your users.&lt;/p&gt;

&lt;p&gt;Add RYL to the equation when you're thinking about how best to support your users with documentation. When you should and shouldn't use it is more art than science. It'll be up to you to define where that balance lies for your project, but you want to use every tool you can find to make sure your users can be successful. RYL is often the right tool for documentation, to make sure your users find exactly what they need when they need it.&lt;/p&gt;

</description>
      <category>devrel</category>
      <category>documentation</category>
      <category>writing</category>
    </item>
    <item>
      <title>Confessions of a 0.8x Developer 😅</title>
      <dc:creator>Devon Campbell</dc:creator>
      <pubDate>Tue, 06 Jul 2021 02:07:43 +0000</pubDate>
      <link>https://dev.to/raddevon/confessions-of-a-0-8x-developer-2hja</link>
      <guid>https://dev.to/raddevon/confessions-of-a-0-8x-developer-2hja</guid>
      <description>&lt;p&gt;This may be career suicide… but I feel like a lot of people probably need to see it.&lt;/p&gt;

&lt;p&gt;I have a confession to make. I’m not a very good developer.&lt;/p&gt;

&lt;p&gt;Maybe that’s a little unfair to myself. Actually, I think I &lt;em&gt;am&lt;/em&gt; a good developer, but not because I’m especially clever or fast at building software.&lt;/p&gt;

&lt;p&gt;There’s nothing left to be said about the legendary 10x developer, particularly about whether or not such a beast exists. I won’t weigh in on that. In the event you aren’t familiar with the concept, though, I’ll just briefly define it. A 10x developer is a developer who is 10x faster, 10x smarter, or generally 10x better than the typical developer.&lt;/p&gt;

&lt;p&gt;Even though I can’t say whether the 10x developer exists, what I can say that is that I am not one of them. I’m more like a 0.8x developer. Here’s why.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;I don’t write especially clever code.&lt;/strong&gt; If I’m feeling my oats and want to humble myself, I’ll head over to &lt;a href="https://codewars.com/"&gt;CodeWars&lt;/a&gt; to do a few challenges. Once I find a working solution, I like to browse the top voted solutions. When my solution is 16 lines, the best solution is often a one-liner. I tend to brute force everything. I write code in the way that makes sense to me. I can get it done, but do I get it done the best way? Usually not.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;I’m slow.&lt;/strong&gt; You may already know that I organize a meetup group for new and aspiring devs here in Seattle. Sometimes, we have events where we code together in small teams, each team having an opportunity to present and talk about what they’ve built. I’m frequently amazed at what people have been able to build. These are people without jobs who are able to build far more in 2-3 hours than I could, even though I’ve had years of experience.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;I’m not much of a computer scientist.&lt;/strong&gt; This isn’t a huge deal because I’m not doing computer science most of the time. The only problem is that every developer interview tests you on computer science – implement a linked list, perform a bubble sort, or write a recursive algorithm.&lt;/p&gt;

&lt;p&gt;You may be reading this and thinking, “These don’t describe me. I’m way better than Devon.” If so, that’s awesome. I’m sure you’ll find a ton of success. I’m happy to help you move forward into your career however I can, but I didn’t write this for you. I wrote this for the person reading and saying, “Me too.” I’m writing to let you know that none of these shortcomings mean you can’t have a great career as a web developer.&lt;/p&gt;

&lt;p&gt;Now, we’re flipping to the other side of the coin. These are the things I do well.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;I write maintainable code.&lt;/strong&gt; One reason my code is generally more verbose than the top solution on CodeWars is that I’ve trained myself to write my code to be read by other developers. This is a skill I have honed for mostly self-serving reasons, those being that I can’t understand clever code and write so that later I can read and understand the code. This has the nice side effect that, if I can understand the code, most anyone can.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;I am reliable.&lt;/strong&gt; I underpromise and over-deliver. If I say I will be at a meeting, I will be there. I will not tell you that your final delivered software will be 100% bug-free and secure because no software ever is. I will not tell you I will ship a feature next Tuesday unless I’m pretty damn sure I can make that happen.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;I communicate well.&lt;/strong&gt; You know that feature I was pretty damn sure I would ship next Tuesday? I now suspect I’m not going to hit the deadline because of a number of factors, and I’m currently writing my client an email detailing all of those and asking how we should proceed. That’s because this is their business. Even reliable people miss deadlines, but reliable people also have empathy for the people they work for and give them as much time as possible to prepare for those deadlines to be missed.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;I care about what happens around the code.&lt;/strong&gt; I can’t count the number of people I’ve heard say, “I just want to be left alone to write code,” when confronted with meetings, estimating timelines, or other realities of running a business. I totally understand that impulse, and you can have that… &lt;em&gt;if&lt;/em&gt; you just want web development to be a hobby. If you want to get a paycheck, there’s a business making the money to back that paycheck, and you should probably care about its continued success.&lt;/p&gt;

&lt;p&gt;Now, I’m a capable person. If I wanted to, I could probably make an effort to develop those skills I don’t have. I could write more clever code and write solutions that rank near the top of CodeWars. I could develop techniques to code faster. I could sit down and really learn computer science. I’d guess most people could if they really put in the effort.&lt;/p&gt;

&lt;p&gt;But the things I do well are things that almost &lt;em&gt;anyone&lt;/em&gt; can do well if they make the effort and summon the empathy to care about factors orbiting around their work. These are skills that are incredibly valuable to businesses. I don’t know this for a fact, but I’m pretty sure these are the reasons people want to work with me. They don’t go on a resume, but they’re factors people pick up on when they work with you, which is why I advocate so strongly for &lt;a href="https://raddevon.com/articles/inverted-career-path/"&gt;starting with freelancing in your career&lt;/a&gt;. &lt;a href="https://raddevon.com/articles/woo-clients-by-showing-instead-telling/"&gt;Showing is more powerful than telling&lt;/a&gt;. You can use freelance work to show people you have the qualities they want in a partner… or maybe an employee someday, if that’s what you want and what they need.&lt;/p&gt;

&lt;p&gt;As I’m reading back through this, doing some editing, it occurs to me that maybe my premise was wrong to begin with. Maybe I &lt;em&gt;am&lt;/em&gt; a 10x developer, just not measured by the metrics that are generally used to identify those. Or maybe I’m just a 1x developer… but that’s still better than 0.8x! The skills I do have allowed me to build a career that’s ~8 years strong at this point. Even though I’m not as fast nor smart as many web developers, it seems like some people, at least, have decided I’m good enough for them.&lt;/p&gt;

&lt;p&gt;The post &lt;a href="https://raddevon.com/articles/confessions-of-a-0-8x-developer/"&gt;Confessions of a 0.8x Developer&lt;/a&gt; first appeared on &lt;a href="https://raddevon.com"&gt;Rad Devon&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>codenewbie</category>
      <category>career</category>
      <category>beginners</category>
    </item>
    <item>
      <title>Use DuckDuckGo to find answers as a developer</title>
      <dc:creator>Devon Campbell</dc:creator>
      <pubDate>Sat, 08 May 2021 14:58:15 +0000</pubDate>
      <link>https://dev.to/raddevon/use-duckduckgo-to-find-answers-as-a-developer-1dkp</link>
      <guid>https://dev.to/raddevon/use-duckduckgo-to-find-answers-as-a-developer-1dkp</guid>
      <description>&lt;p&gt;I pride myself on teaching &lt;a href="https://raddevon.com/articles/new-web-developer-skills-you-probably-dont-know/"&gt;the developer skills that not many people focus on&lt;/a&gt; – &lt;a href="https://raddevon.com/articles/when-you-get-rejected-as-a-web-developer-its-not-personal/"&gt;dealing with rejection&lt;/a&gt;, &lt;a href="https://raddevon.com/articles/books-that-made-me-the-personal-mba/"&gt;understanding business&lt;/a&gt;, &lt;a href="https://raddevon.com/articles/get-web-development-clients-while-on-lockdown/"&gt;finding work&lt;/a&gt;… those kinds of things. Here’s a skill that I use every day but hadn’t even considered talking about: &lt;strong&gt;searching&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;It occurred to me when I found an article by Marko Denic on &lt;a href="https://markodenic.com/use-google-like-a-pro/"&gt;how to use Google’s search syntax&lt;/a&gt;. I highly recommend you check it out. It’s a quick read, and, even though I’m searching all day every day, I picked up a few new tips.&lt;/p&gt;

&lt;p&gt;The one thing I don’t care for about the article is that it’s very Google-centric. We’re well past the “don’t be evil” Google of the past and into the “maneuver around the law and common decency in an effort to collect the most possible data on our users” era of the company. It’s why I switched over to a privacy-focused search engine called &lt;a href="http://duckduckgo.com"&gt;DuckDuckGo&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;I’m going to be up-front with you. The results on DDG are not always on par with those on Google, and I do still use Google when I need to. What I find, though, is that for 90% of the searches I need to do, DuckDuckGo works just as well and sometimes better.&lt;/p&gt;

&lt;p&gt;Google is much better at finding results in online discussion which is very useful when you’re trying to find the answer to a specific question. Google will return multiple results from StackOverflow, Reddit, and support forums. DuckDuckGo has these, but it seems to find fewer of them and it doesn’t always surface the relevant ones.&lt;/p&gt;

&lt;p&gt;Here’s my simple search workflow:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt; Try my search on DuckDuckGo.&lt;/li&gt;
&lt;li&gt; In the event I don’t find what I’m looking for, I add &lt;code&gt;!g&lt;/code&gt; to my search to search on Google.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This uses a DDG feature called “bangs” that allow you to send your search over to another site. Adding &lt;code&gt;!g&lt;/code&gt; just sends your same search over to Google. You’ll get back the Google results for your search terms (on Google; they’re not proxied through DDG, so it’s literally identical to searching on Google).&lt;/p&gt;

&lt;p&gt;This always feels like giving up (and frankly, it is), but the bangs feature goes beyond just redirecting failed searches over to Google. DDG has thousands of bangs, and many of them are super useful for developers. Here are a few you might find useful:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;code&gt;!mdn&lt;/code&gt;- Mozilla Developer Network&lt;/li&gt;
&lt;li&gt;  &lt;code&gt;!sof&lt;/code&gt;- StackOverflow&lt;/li&gt;
&lt;li&gt;  &lt;code&gt;!csst&lt;/code&gt;- CSS-Tricks&lt;/li&gt;
&lt;li&gt;  &lt;code&gt;!r&lt;/code&gt;- Reddit&lt;/li&gt;
&lt;li&gt;  &lt;code&gt;!dev.to&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These are just the ones I think are most generally useful to developers, but there are tons of these things. You have language-specific bangs like &lt;code&gt;!py&lt;/code&gt; for searching the Pyton documentation, front-end framework specific bangs like &lt;code&gt;!vue&lt;/code&gt; for the Vue documentation, and tool-specific bangs like &lt;code&gt;!vscode&lt;/code&gt; to search the Visual Studio Code docs. I could go on, but instead you should check out &lt;a href="https://duckduckgo.com/bang"&gt;DDG’s bangs page&lt;/a&gt; and find the bangs that will help you code faster.&lt;/p&gt;

&lt;p&gt;You could still use &lt;code&gt;site:mdn.org&lt;/code&gt; for example to search just on the MDN site, but this works differently from a bang. The bang searches through the site’s own search engine. Limiting your DDG search to a site using &lt;code&gt;site:&lt;/code&gt; still uses DDG’s search and not the site’s own search. Either approach might be useful depending on the context.&lt;/p&gt;

&lt;p&gt;You might be wondering, “Why wouldn’t I just go directly to the site I want to search and search there instead of going to DDG and using a bang to redirect my search to the other site?” I’d reply, “That’s an astute observation, intelligent reader,” and proceed to address it like so: bangs shine when DDG is your browser’s primary search engine. If you decide to set DuckDuckGo as your browser’s search engine, you can now search directly from the address bar, giving your address bar some cool superpowers.&lt;/p&gt;

&lt;p&gt;You can now type your search in the address bar to search DuckDuckGo, or you can type your search and add “!g” to search Google (e.g. &lt;code&gt;flexbox !g&lt;/code&gt;). Maybe that leads you to a StackOverflow article with a recommendation for a book on CSS. Awesome! Now, you hit command/control-L to focus the address bar again and type &lt;code&gt;!a flexbox in css&lt;/code&gt; to find the book on Amazon. (Note that your bang can go anywhere in the search. It doesn’t have to be at the end.) Then, you order the book and search &lt;code&gt;!mdn flexbox&lt;/code&gt; to find a quick reference on MDN while you wait for your book to ship. That’s the true power of the bang.&lt;/p&gt;

&lt;p&gt;In case you’re wondering about the search tips in the Marko Denic article, most of them work in DuckDuckGo.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Quotes work the same way.&lt;/li&gt;
&lt;li&gt;  The &lt;code&gt;AND&lt;/code&gt; and &lt;code&gt;OR&lt;/code&gt; keywords don’t exist in DDG, but search terms are implicitly &lt;code&gt;OR&lt;/code&gt;ed.&lt;/li&gt;
&lt;li&gt;  The minus (&lt;code&gt;-&lt;/code&gt;) operator is slightly different in DDG. Where Google eliminates results with the term, DDG gives the term specified by the operator less weight. It’s not as useful, but it can still get the job done.&lt;/li&gt;
&lt;li&gt;  Wildcards don’t seem to work in DDG, best I can tell.&lt;/li&gt;
&lt;li&gt;  Limiting search to a site with &lt;code&gt;site:&lt;/code&gt; or to a file type with &lt;code&gt;filetype:&lt;/code&gt; works exactly the same.&lt;/li&gt;
&lt;li&gt;  Numeric ranges and dates in the search don’t work, but you can date limit the search via DDG’s UI.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So, we’re close to feature parity, but not quite there. It’s going to be enough for most searches. If you absolutely need to refine a search by adding a wildcard to it, just do it and also add the &lt;code&gt;!g&lt;/code&gt; hashbang to send that search over to Google instead.&lt;/p&gt;

&lt;p&gt;There are two things I want you to take away from this article:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Take some time to improve your searching skills. It’s a massive part of what we do as developers and, even though it’s not tested in interviews like algorithms and data structures, it’s a skill you’ll get a lot more milage out of in the long run.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;You don’t have to throw all your data into Google’s data lake in order to get great results. At the same time, you don’t have to quit Google cold turkey.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Thanks for reading. Hope this will help you find whatever it is you’re searching for!&lt;/p&gt;

&lt;p&gt;The post &lt;a href="https://raddevon.com/articles/use-duckduckgo-to-find-answers-as-a-developer/"&gt;Use DuckDuckGo to find answers as a developer&lt;/a&gt; first appeared on my site &lt;a href="https://raddevon.com/"&gt;Rad Devon&lt;/a&gt;. Head over there for more help transitioning into your career as a web developer!&lt;/p&gt;

&lt;p&gt;While you're there, grab a copy of my free book &lt;a href="https://raddevon.com/5-projects-to-become-qualified-as-a-web-developer/"&gt;&lt;em&gt;5 Projects to Become Qualified as a Web Developer&lt;/em&gt;&lt;/a&gt;. I'll take you through 5 projects that will give you the basic skills you need to work as a full-stack developer. (Psst, you'll actually already be working. That's project 5!)&lt;/p&gt;

&lt;p&gt;&lt;a href="https://raddevon.com/5-projects-to-become-qualified-as-a-web-developer/"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--QHQPhvFw--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/2rfusucx22eozo9b8bmj.png" alt="5 Projects to Become Qualified as a Web Developer cover"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>beginners</category>
      <category>codenewbie</category>
      <category>productivity</category>
      <category>learning</category>
    </item>
    <item>
      <title>Learn Svelte by building a habit tracker app 🏎</title>
      <dc:creator>Devon Campbell</dc:creator>
      <pubDate>Mon, 03 May 2021 00:49:55 +0000</pubDate>
      <link>https://dev.to/raddevon/learn-svelte-by-building-a-habit-tracker-app-24h</link>
      <guid>https://dev.to/raddevon/learn-svelte-by-building-a-habit-tracker-app-24h</guid>
      <description>&lt;p&gt;In this video, you’ll work along with me to build a habit tracker app in Svelte. In under an hour, you’ll learn:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  🔸 Components&lt;/li&gt;
&lt;li&gt;  🔸 State&lt;/li&gt;
&lt;li&gt;  🔸 Rendering arrays&lt;/li&gt;
&lt;li&gt;  🔸 How reactivity works&lt;/li&gt;
&lt;li&gt;  🔸 Props&lt;/li&gt;
&lt;li&gt;  🔸 Stores (with auto-subscription)&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;Go to this post's page on my site to get my free Javascript cheatsheet. It gives you practical examples of basic Javascript concepts in action. Having this handy will make learning Svelte faster and easier! 👇&lt;/p&gt;

&lt;p&gt;The post &lt;a href="https://raddevon.com/articles/learn-svelte-by-building-a-habit-tracker-app/"&gt;Learn Svelte by building a habit tracker app 🏎&lt;/a&gt; first appeared on my site &lt;a href="https://raddevon.com/"&gt;Rad Devon&lt;/a&gt;. Head over there for more help transitioning into your career as a web developer!&lt;/p&gt;

</description>
      <category>beginners</category>
      <category>svelte</category>
      <category>codenewbie</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>How to build a responsive nav with no Javascript!</title>
      <dc:creator>Devon Campbell</dc:creator>
      <pubDate>Tue, 09 Feb 2021 03:28:53 +0000</pubDate>
      <link>https://dev.to/raddevon/how-to-build-a-responsive-nav-with-no-javascript-4nb6</link>
      <guid>https://dev.to/raddevon/how-to-build-a-responsive-nav-with-no-javascript-4nb6</guid>
      <description>&lt;p&gt;In this video, I’ll teach you to build fancy collapsible navigation without using any Javascript. Just HTML and CSS!&lt;/p&gt;

&lt;p&gt;I love that we can make clever use of CSS and HTML to achieve something most people use Javascript for, but you won’t get far as a web developer without Javascript. That’s why I made a cheat sheet with practical examples to help you learn it. Head over to &lt;a href="https://raddevon.com/articles/how-to-build-a-responsive-nav-with-no-javascript/"&gt;this post's page on my site&lt;/a&gt; to get your copy.&lt;/p&gt;

&lt;p&gt;If you want to work along with the video, start from this &lt;a href="https://codepen.io/raddevon/pen/xxRVmOQ"&gt;pen&lt;/a&gt;. Open that and click the “Fork” button in the bottom-right so you can get your own copy to work with.&lt;/p&gt;

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

&lt;p&gt;The CSS framework I used is &lt;a href="https://milligram.io/"&gt;Milligram&lt;/a&gt;. I like to use it because it takes just basic HTML and makes it look nice. I don’t have to sprinkle a bunch of wacky classes around to get something that looks decent.&lt;/p&gt;

&lt;p&gt;I talk about the “+” selector and refer to it in the video as the “sibling selector.” More accurately, it’s the &lt;em&gt;adjacent&lt;/em&gt; sibling selector. It only selects the UL if it is a sibling of the checked checkbox and also if the two are adjacent (meaning no elements between).&lt;/p&gt;

&lt;p&gt;Hope you enjoy this tutorial! Comment here or &lt;a href="http://twitter.com/raddevon"&gt;tweet at me&lt;/a&gt; if you have questions.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>tutorial</category>
      <category>css</category>
      <category>codenewbie</category>
    </item>
    <item>
      <title>When you get rejected as a web developer, it’s not personal</title>
      <dc:creator>Devon Campbell</dc:creator>
      <pubDate>Fri, 18 Dec 2020 13:55:00 +0000</pubDate>
      <link>https://dev.to/raddevon/when-you-get-rejected-as-a-web-developer-it-s-not-personal-2lo2</link>
      <guid>https://dev.to/raddevon/when-you-get-rejected-as-a-web-developer-it-s-not-personal-2lo2</guid>
      <description>&lt;p&gt;As a web developer, you’re going to get rejected a lot. You’ll end up not being able to close a freelance deal. You’ll make it to a third-round interview and end up getting passed over for someone else. Maybe it’s just a recommendation you make that the rest of your team doesn’t go for.&lt;/p&gt;

&lt;p&gt;When you’re new, it’s hard not to take that personally. I did, and it led to a bunch of unnecessary pain and self-doubt. Here’s a pep talk that should help keep you from making the same mistake.&lt;/p&gt;

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

&lt;p&gt;If you're just getting started in your career transition, please grab a copy of my free book &lt;a href="https://raddevon.com/5-projects-to-become-qualified-as-a-web-developer/" rel="noopener noreferrer"&gt;&lt;em&gt;5 Projects to Become Qualified as a Web Developer&lt;/em&gt;&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://raddevon.com/5-projects-to-become-qualified-as-a-web-developer/" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2rfusucx22eozo9b8bmj.png" alt="5 Projects to Become Qualified as a Web Developer cover"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The post &lt;a href="https://raddevon.com/articles/when-you-get-rejected-as-a-web-developer-its-not-personal/" rel="noopener noreferrer"&gt;When you get rejected as a web developer, it's not personal&lt;/a&gt; first appeared on my site &lt;a href="https://raddevon.com/" rel="noopener noreferrer"&gt;Rad Devon&lt;/a&gt;. Head over there for more help transitioning into your career as a web developer!&lt;/p&gt;

</description>
      <category>beginners</category>
      <category>career</category>
      <category>motivation</category>
    </item>
    <item>
      <title>Web Developer Gift Guide for 2020</title>
      <dc:creator>Devon Campbell</dc:creator>
      <pubDate>Fri, 11 Dec 2020 13:25:51 +0000</pubDate>
      <link>https://dev.to/raddevon/web-developer-gift-guide-for-2020-4m2i</link>
      <guid>https://dev.to/raddevon/web-developer-gift-guide-for-2020-4m2i</guid>
      <description>&lt;p&gt;Check out these gifts for a web developer in your life or for yourself! These will make any web developer more productive. Some of my picks will even make them safer through the magic of ergonomics!&lt;/p&gt;

&lt;p&gt;The links to all my recommendations are below the video. 👇&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;  &lt;a href="https://amzn.to/3a0WOzF"&gt;Logitech MX Vertical Wireless Mouse&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;a href="https://amzn.to/3gBrf0B"&gt;BRILA Wrist rest for mouse&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;a href="https://www.xdesk.com/terra"&gt;XDesk Terra standing desk&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;a href="https://www.upliftdesk.com/uplift-v2-standing-desk-v2-or-v2-commercial/?product_config=4853"&gt;A cheaper standing desk alternative&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;a href="https://amzn.to/3m6wIOi"&gt;Topo Ergodriven standing mat&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;a href="https://amzn.to/2Lf4qnV"&gt;Ducky One 2 Keyboard&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;a href="https://1password.com/giftcards/"&gt;1Password password manager (for them)&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;a href="https://1password.com/sign-up/"&gt;1Password (for you)&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;a href="https://www.backblaze.com/partner/af9rzg?redirect=gift.htm"&gt;Backblaze backup service (for them)&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;a href="https://www.backblaze.com/cloud-backup.html#af9rzg"&gt;Backblaze (for you)&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;a href="https://amzn.to/3gBA7DF"&gt;Sony wireless headphones&lt;/a&gt; (not the ones I have, but the ones I would get today)&lt;/li&gt;
&lt;li&gt;  &lt;a href="https://amzn.to/3qEzk9w"&gt;Logitech C920 webcam&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;a href="https://amzn.to/2JRSXKN"&gt;BZE tripod/selfie stick&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Share your ideas here or in the comments &lt;a href="https://youtu.be/TFIcUn51-6s"&gt;on YouTube&lt;/a&gt;. Thanks for watching!&lt;/p&gt;

</description>
      <category>uncategorized</category>
      <category>ergonomics</category>
      <category>gifts</category>
      <category>hardware</category>
    </item>
    <item>
      <title>Validate Forms with Event-Driven Javascript</title>
      <dc:creator>Devon Campbell</dc:creator>
      <pubDate>Fri, 04 Dec 2020 13:09:00 +0000</pubDate>
      <link>https://dev.to/raddevon/validate-forms-with-event-driven-javascript-3460</link>
      <guid>https://dev.to/raddevon/validate-forms-with-event-driven-javascript-3460</guid>
      <description>&lt;p&gt;Validating form input on the front-end is a great way to make your users’ experience better. When &lt;em&gt;I’m&lt;/em&gt; the user, I’d rather know immediately that something is wrong with my input than having to wait until I submit the form and get the results back.&lt;/p&gt;

&lt;p&gt;In my previous video, I showed &lt;a href="https://raddevon.com/articles/working-with-html-form-fields-in-javascript/"&gt;how you can access a form’s values&lt;/a&gt; which is one piece of the front-end form validation puzzle. This video completes the puzzle.&lt;/p&gt;

&lt;p&gt;If you want to work along, &lt;a href="https://raddevon.com/articles/validate-forms-with-event-driven-javascript/"&gt;go to this video's page on my site&lt;/a&gt; to get the project starter.&lt;/p&gt;

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

&lt;p&gt;Before I teach you to write Javascript form validation, I’ll teach you ways to validate your form &lt;em&gt;without&lt;/em&gt; writing custom JS. HTML5 forms have some validation capability baked right in, and using this is preferable to custom validations.&lt;/p&gt;

&lt;p&gt;Later, we move on to a scenario where built-in validation either wouldn’t work or would be more difficult than the custom variety. We’ll start by hooking into an event. This allows us to start running some Javascript when the user interacts with our form. Then, we’ll check the user’s values to see if they are valid. If they aren’t, we’ll stop the form from submitting.&lt;/p&gt;

&lt;p&gt;Be sure to leave a comment if you have any questions. Thanks for watching!&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>beginners</category>
      <category>codenewbie</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Working with HTML Form Fields in Javascript</title>
      <dc:creator>Devon Campbell</dc:creator>
      <pubDate>Fri, 20 Nov 2020 13:57:00 +0000</pubDate>
      <link>https://dev.to/raddevon/working-with-html-form-fields-in-javascript-fj5</link>
      <guid>https://dev.to/raddevon/working-with-html-form-fields-in-javascript-fj5</guid>
      <description>&lt;p&gt;You might want to go back and watch the first two videos in my DOM manipulation series if you haven’t already. This one follows from those two.&lt;/p&gt;

&lt;p&gt;Forms and their controls have slightly different methods and properties from the other DOM elements. In this video, I show you a couple of those and demonstrate the foundational concepts of how you’d validate a user’s input.&lt;/p&gt;

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

&lt;p&gt;Even now after writing Javascript almost daily for quite a few years, I still need to look things up, often just to see examples of them in use. I created this cheatsheet so you can have examples of the Javascript basics at the ready. Head over to &lt;a href="https://raddevon.com/articles/working-with-html-form-fields-in-javascript/"&gt;this video's page on my site&lt;/a&gt; where you can get your own copy!&lt;/p&gt;

</description>
      <category>beginners</category>
      <category>javascript</category>
      <category>codenewbie</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Moving Elements and Adding New Ones with DOM Manipulation</title>
      <dc:creator>Devon Campbell</dc:creator>
      <pubDate>Fri, 13 Nov 2020 14:32:00 +0000</pubDate>
      <link>https://dev.to/raddevon/moving-elements-and-adding-new-ones-with-dom-manipulation-gn0</link>
      <guid>https://dev.to/raddevon/moving-elements-and-adding-new-ones-with-dom-manipulation-gn0</guid>
      <description>&lt;p&gt;If you haven’t watched &lt;a href="https://raddevon.com/articles/dom-manipulation-with-plain-old-javascript/"&gt;the first video in my series on basic DOM manipulation&lt;/a&gt;, you’ll want to catch up with that first.&lt;/p&gt;

&lt;p&gt;In this video, we’ll dig a bit deeper into selecting elements. I’ll also show you how you can move your elements around in the DOM and how to create brand new elements in Javascript and render them onto your page.&lt;/p&gt;

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

&lt;p&gt;If you want to learn Javascript faster, download my Javascript By Example cheatsheet. Just share your email in the form on &lt;a href="https://raddevon.com/articles/moving-elements-and-adding-new-ones-with-dom-manipulation/"&gt;the original article&lt;/a&gt; (back on my site). It’s like a regular Javascript cheatsheet but without all that “foo” and “bar” garbage.&lt;/p&gt;

</description>
      <category>beginners</category>
      <category>webdev</category>
      <category>javascript</category>
      <category>codenewbie</category>
    </item>
    <item>
      <title>DOM Manipulation with Plain Old Javascript</title>
      <dc:creator>Devon Campbell</dc:creator>
      <pubDate>Fri, 06 Nov 2020 13:45:00 +0000</pubDate>
      <link>https://dev.to/raddevon/dom-manipulation-with-plain-old-javascript-304l</link>
      <guid>https://dev.to/raddevon/dom-manipulation-with-plain-old-javascript-304l</guid>
      <description>&lt;p&gt;One of the most useful things you’ll be doing with Javascript is manipulating the DOM. The DOM is the document object model. It’s a model of your HTML document in Javascript that allows you to make changes to your web page as users are using your page.&lt;/p&gt;

&lt;p&gt;DOM manipulation is what makes it possible to build web sites that work like applications. When you’re using a web site that changes in response to your inputs (clicks, keypresses, etc.) without having to reload a new page each time, that’s happening through DOM manipulation.&lt;/p&gt;

&lt;p&gt;Front-end frameworks exist to help you build web apps that rely heavily on DOM manipulation, but they’re not necessary if you just need to do some small changes in response to a couple of different user interactions. If that describes what you’re building, do your users a favor and skip the framework. Manipulate the DOM yourself in plain old Javascript.&lt;/p&gt;

&lt;p&gt;I’ve created a short video series to get you started. In this first video, I’ll teach you to select the element you want to interact with by querying the DOM, how to change CSS classes on an element, and how to style an element.&lt;/p&gt;

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

&lt;p&gt;Check out &lt;a href="https://raddevon.com/articles/dom-manipulation-with-plain-old-javascript/"&gt;this article back on my site&lt;/a&gt; to grab my Javascript By Example cheatsheet. Stop Googling every concept you need to recall in order to learn faster. This cheatsheet works as a quick reference for the basics of Javascript!&lt;/p&gt;

</description>
      <category>beginners</category>
      <category>webdev</category>
      <category>javascript</category>
      <category>codenewbie</category>
    </item>
    <item>
      <title>Learn Docker 🐳 for more consistent and portable dev environments!</title>
      <dc:creator>Devon Campbell</dc:creator>
      <pubDate>Sat, 31 Oct 2020 13:43:32 +0000</pubDate>
      <link>https://dev.to/raddevon/learn-docker-for-more-consistent-and-portable-dev-environments-21af</link>
      <guid>https://dev.to/raddevon/learn-docker-for-more-consistent-and-portable-dev-environments-21af</guid>
      <description>&lt;p&gt;Docker is a fantastic technology that lets you create repeatable and portable environments for development or even for production.&lt;/p&gt;

&lt;p&gt;What does that mean? That means other developers working on the same project will be running it in the same environment as you. No more fun bugs to hunt down only to find out it’s because your colleague is running Node 8.x while you’re running 11.x.&lt;/p&gt;

&lt;p&gt;The definitions of your Docker containers can be included in your repo to make it super easy for any new developers to bring up an identical version of the dev environment. It’s a huge boon to developers when it comes to collaboration.&lt;/p&gt;

&lt;p&gt;In this course, I’ll teach you the basics by working through the &lt;a href="https://training.play-with-docker.com/dev-stage1/"&gt;Play with Docker classroom training&lt;/a&gt; together.&lt;/p&gt;

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

&lt;p&gt;Quick question while you’re here: why are you learning web development? I don’t mean the surface level answers – “I want to be a web developer,” and “I want to make more money.” What’s really driving you?&lt;/p&gt;

&lt;p&gt;If you’re not clear on that, you won’t make it very far. &lt;a href="https://raddevon.com/stick-with-web-development/"&gt;Read more about how this helps and take my free Big Goals course&lt;/a&gt; to finally break through that wall and make this change real! 💥&lt;/p&gt;

</description>
      <category>docker</category>
      <category>devops</category>
      <category>beginners</category>
      <category>codenewbie</category>
    </item>
  </channel>
</rss>
