<?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: Kirill Rogovoy</title>
    <description>The latest articles on DEV Community by Kirill Rogovoy (@kirillrogovoy).</description>
    <link>https://dev.to/kirillrogovoy</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%2F56696%2Fa3c453ad-76c9-475c-b007-6d5430f77e53.jpeg</url>
      <title>DEV Community: Kirill Rogovoy</title>
      <link>https://dev.to/kirillrogovoy</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/kirillrogovoy"/>
    <language>en</language>
    <item>
      <title>No architecture is better than bad architecture</title>
      <dc:creator>Kirill Rogovoy</dc:creator>
      <pubDate>Tue, 22 Nov 2022 17:03:10 +0000</pubDate>
      <link>https://dev.to/kirillrogovoy/no-architecture-is-better-than-bad-architecture-nho</link>
      <guid>https://dev.to/kirillrogovoy/no-architecture-is-better-than-bad-architecture-nho</guid>
      <description>&lt;p&gt;It took me several years to learn how to write code that scales to 10s of team members and a million lines of code. It took even more time to learn to write stupid code again.&lt;/p&gt;

&lt;p&gt;Turns out, "building a solid architecture" in your code can easily be busy work and procrastination.&lt;/p&gt;

&lt;p&gt;Turns out, you can waste a lot of energy trying to get rid of all code duplication and coming up with powerful abstractions to support "future use cases."&lt;/p&gt;

&lt;p&gt;Turns out, one part of your code can intentionally be a well-thought, protected piece of engineering marvel, while the other one should get you fired.&lt;/p&gt;

&lt;p&gt;When you first learn the "best coding practices", somehow you assume that there is a clear line between good and bad architecture. You read or hear horror stories about unmaintainable projects with too much rotten spaghetti code. Inevitably, you end up working on one.&lt;/p&gt;

&lt;p&gt;You start grasping what it means to separate concerns, extract abstractions, invert dependencies, and so on. Once in a while, you get fewer than 50 comments on your pull requests. Now you feel like a real deal!&lt;/p&gt;

&lt;p&gt;Those horror stories you heard... they were real. Without enough care, forethought, and discipline, a project gets messy faster than expected. You see spreadsheet after spreadsheet of "prioritized tech debt" that doesn't get fixed anyway because you need to ship. And the only person who still knew how things worked has just quit!&lt;/p&gt;

&lt;p&gt;But all that is in the past. Over the years, you've developed a dozen heuristics and found the best rules that prevent your code from being rewritten two years down the road (now it's three years!) Yay!&lt;/p&gt;

&lt;h2&gt;
  
  
  Going far or going fast
&lt;/h2&gt;

&lt;p&gt;So far, I've been describing what I like to call "going far with code." Anyone can write code that lasts days before becoming unmaintainable. Learning to keep codebases alive and thriving for years of active work takes practice, tears, and a few rewrites.&lt;/p&gt;

&lt;p&gt;Now, if you work for an organization with (a) enough resources and (b) high certainty of what you are building, going far would be your most important hard skill. To a large extent, that's what would make you a Senior Software Engineer and pay your unbelievable salary.&lt;/p&gt;

&lt;p&gt;However, if you've ever worked with startups or founded your own for-profit projects (lacking in both resource and certainty), you'd quickly point out that "going far" is not what's on your mind most of the time.&lt;/p&gt;

&lt;p&gt;Going fast is.&lt;/p&gt;

&lt;p&gt;Turns out, architecting code—introducing granular concepts, abstractions, relationships, and giving all those things names, scopes, and responsibilities—has a cost. On top of that, undoing such structures is 10 times more costly than building them.&lt;/p&gt;

&lt;p&gt;Because of the time pressure, you will more likely be adding more and more stuff to &lt;a href="https://en.wikipedia.org/wiki/Leaky_abstraction"&gt;leaky abstractions&lt;/a&gt; than tearing them down and rewriting the whole scope.&lt;/p&gt;

&lt;p&gt;Another risk is that architecting and structuring your code is a great and fun way to procrastinate. As a technical founder, I don't like many things I have to do to run a successful project. Tinkering with code often just feels like a refuge from all the anxiety generated by things I should be doing instead.&lt;/p&gt;

&lt;p&gt;A lot of time, the costs of creating too much structure are more nuanced than "quality takes time." For one, more often than not, you simply don't know what you are building yet, in the grand scheme of things. Most code will end up being thrown away or rewritten as you get closer to product-market fit, and rarely is it easy to know which code will stay, so you tend to treat almost all code as temporary.&lt;/p&gt;

&lt;p&gt;So what's the optimal solution here? Do we really have to go back and start writing the same shitty code we did at the start? That doesn't sound right!&lt;/p&gt;

&lt;h2&gt;
  
  
  Writing stupid code well
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--1XMp5m1V--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://rogovoy.me/articles/no-architecture/meta.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--1XMp5m1V--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://rogovoy.me/articles/no-architecture/meta.jpg" alt="code architecture meme" width="880" height="651"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I don't think I have the best answers yet.&lt;br&gt;
However, let me share a few practical heuristics I've learned, that helped me avoid poor outcomes of both extremes: an unmaintainable project or terribly slow velocity.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. No code is equal&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;As with many things, there are a lot of cases of Pareto distribution in your code.&lt;/p&gt;

&lt;p&gt;The first time it occurred to me was when I tried to figure out how to write as few tests as possible that would provide the largest improvement in stability. It quickly became apparent that only a tiny part of my code is called most often and, should it fail, would bring the most trouble.&lt;/p&gt;

&lt;p&gt;So, I extended the same model to deciding where I should put extra time and care and sacrifice some velocity now for long-term benefits.&lt;/p&gt;

&lt;p&gt;I have a 3-year-old SaaS with 60k lines of code. When I started to pay attention, I was surprised to see that most code I didn't read or edit for months (or ever). Most API endpoints, most UI pages, etc. Also, a lot of that code was called orders of magnitude less often than the other.&lt;/p&gt;

&lt;p&gt;And when I saw copy-paste and giant do-everything-at-once functions, I was weirdly so relieved I didn't waste time refactoring that. I mean... it works! I can still understand it well and make changes. I could invest a couple of hours in structuring it better and saving myself a few minutes the next time I work with it... in a year.&lt;/p&gt;

&lt;p&gt;To be clear, I'm not advocating for writing bad code with a lot of smell per se. Instead, I mean writing simple code that often mixes the higher-level flow with lower-level details without being obsessive about areas of concern. It can still be elegant to an extent. It should still represent the intent well and explain what it does.&lt;/p&gt;

&lt;p&gt;Another helpful trick here is fencing off the most important parts from the rest so that tar doesn't spill into your honey.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Let it beg for structure first&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If the previous analogy was to writing tests, this one is going to bring up performance optimization.&lt;/p&gt;

&lt;p&gt;One of the best heuristics regarding performance is that all improvements should be made with a profiler in front of you – No guessing!&lt;/p&gt;

&lt;p&gt;I'd argue the same is useful for refactoring.&lt;/p&gt;

&lt;p&gt;It's much easier to come up with generic cases (abstractions) when you already have 3-4 specific cases (often with code duplication.) Let those cases emerge first. That way, you won't have to predict the future anymore but rather just structure what's already there.&lt;/p&gt;

&lt;p&gt;In other words, be moderate with removing (or preventing) code duplication and repeating yourself in general.&lt;/p&gt;

&lt;p&gt;This idea is so popular that it has a &lt;a href="https://en.wikipedia.org/wiki/Rule_of_three_(computer_programming)"&gt;Wikipedia article&lt;/a&gt; that refers to a book written in 1999!&lt;/p&gt;

&lt;p&gt;It's not an absolute rule. Sometimes, especially in the case of utility functions, you just know that you need to make a building block first and then use it everywhere. Trust your intuition, but make sure you are conscious about the choice.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Always start with one&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I find this concept so useful that I'm going to write a whole article dedicated to it.&lt;/p&gt;

&lt;p&gt;The rule is pretty simple: Unless you have a strong argument against it, start with file, class, function, table, etc.&lt;/p&gt;

&lt;p&gt;As with creating abstractions based on existing cases, splitting things up is always easier once you already have some material to work with. This way, you won't have to guess which buckets things will go into in the future.&lt;/p&gt;

&lt;p&gt;Starting with one is a reliable (though radical) way to remove many mental barriers keeping you from actually delivering something.&lt;/p&gt;

&lt;p&gt;As with other rules, there are perfect reasons to break them. Trust your intuition, but make sure you aren't procrastinating or putting off the actual work.&lt;/p&gt;

&lt;p&gt;One example people often bring up is how Pieter Levels essentially had &lt;a href="https://twitter.com/levelsio/status/1381709793769979906"&gt;one index.php file&lt;/a&gt; for a business that generated crazy revenue.&lt;/p&gt;




&lt;p&gt;That's it!&lt;/p&gt;

&lt;p&gt;I guess the one-line summary is this: If you want to move fast, you have to put off building the architecture, and if some of your code is shit, at least let it be soft.&lt;/p&gt;

&lt;p&gt;As always, thanks for getting this far.&lt;/p&gt;

&lt;p&gt;If you liked this post, you might like those that will follow.&lt;/p&gt;

&lt;p&gt;Follow me on Twitter at &lt;a href="https://twitter.com/krogovoy"&gt;@krogovoy&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;See you next time! 🙌&lt;/p&gt;

</description>
      <category>programming</category>
      <category>architecture</category>
    </item>
    <item>
      <title>How I launched Impulse.dev</title>
      <dc:creator>Kirill Rogovoy</dc:creator>
      <pubDate>Wed, 12 Oct 2022 09:49:14 +0000</pubDate>
      <link>https://dev.to/kirillrogovoy/how-i-launched-impulsedev-4di3</link>
      <guid>https://dev.to/kirillrogovoy/how-i-launched-impulsedev-4di3</guid>
      <description>&lt;p&gt;I've been working on Impulse for six months, and a few weeks ago—Sep 28—I decided to finally make an official launch.&lt;/p&gt;

&lt;p&gt;In this post, I want to reflect on what happened before, during, and after that launch. What I've learned and what I could have done differently.&lt;/p&gt;

&lt;p&gt;I've never understood the grandiosity of Launching The Product. Don't you just post a bunch of links on websites with tons of traffic and cross your fingers?&lt;/p&gt;

&lt;p&gt;It turns out you can definitely do that, but it will likely depend on luck more than you think. I had to do it the naive way to learn this lesson.&lt;/p&gt;

&lt;p&gt;Before we get to the lesson, though, let's start with the inputs. I'll talk about what I had before the launch, the decision to launch now (not sooner nor later), and what came out of it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Input 1: Product
&lt;/h2&gt;

&lt;p&gt;Impulse is an open-source dev tool for web developers. It's free, and there's no business behind it.&lt;/p&gt;

&lt;p&gt;It means several things:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;There's no marketing budget. Putting money into acquiring users doesn't generate any money at the other end. So the decision here is to not put any money into the launch.&lt;/li&gt;
&lt;li&gt;The target audience is developers. More specifically, people who use React and TailwindCSS. Developers are opinionated, and the market is tricky.&lt;/li&gt;
&lt;li&gt;I can't (and am not incentivized to) apply any limited-offer kind of marketing, such as promo codes.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Also, Impulse is a single-player tool with no room for product-led marketing and no easy access to virality.&lt;/p&gt;

&lt;p&gt;Having been in active development for six months, it went from "extremely buggy" to "slightly buggy" (the industry standard!) and also got a complete redesign a few weeks before the launch.&lt;/p&gt;

&lt;h2&gt;
  
  
  Input 2: Existing Impulse users
&lt;/h2&gt;

&lt;p&gt;Impulse doesn't have any form of telemetry, so it's hard to say how many daily/weekly users it had. That's an unfortunate downside of running a browser-only self-hosted tool. I might decide to start collecting some minimal anonymized data in the future, but it's a tricky subject.&lt;/p&gt;

&lt;p&gt;So the only data I had about users was anecdotal. Other than myself and my co-founder, I knew of just several people who would use Impulse sometimes.&lt;/p&gt;

&lt;p&gt;There is, however, a secondary metric that at least can show some dynamics - downloads from NPM:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;July: 299&lt;/li&gt;
&lt;li&gt;August: 332&lt;/li&gt;
&lt;li&gt;September (before launching): 409&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;One should not rely on this data in general because:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;An undefined % of downloads is automated: bots, CI, local hooks, etc.&lt;/li&gt;
&lt;li&gt;It's impossible to tell the retention. An undefined % of real people could uninstall the package just a few minutes after the download, and I wouldn't know.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;However, you can still use these numbers to have some idea about the relative change in overall usage.&lt;/p&gt;

&lt;p&gt;Some other product-related numbers before the launch:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;30 Discord chat members&lt;/li&gt;
&lt;li&gt;94 Github stars&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Input 3: Personal audience
&lt;/h2&gt;

&lt;p&gt;I had not been doing much publicly before starting Impulse, so the circle of people interested in hearing from me was close to "nobody".&lt;/p&gt;

&lt;p&gt;Still, something is better than nothing. The numbers were:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;140 followers on &lt;a href="https://twitter.com/krogovoy"&gt;Twitter&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;50 email subscribers from &lt;a href="https://rogovoy.me/blog"&gt;my previous writing&lt;/a&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;I didn't have a vast private network either: just a handful of people who are relevant to the product and would be interested in helping me out.&lt;/p&gt;

&lt;p&gt;Last but not least, I hadn't spent much time in development chats or communities. A few comments on HN, an argument on Reddit, and five minutes of scrolling Twitter are the limit of my online social activity for the day. Most of my social life happens offline.&lt;/p&gt;

&lt;p&gt;So I'm not a recognized member of any specific online dev community.&lt;/p&gt;

&lt;p&gt;Oh, and I don't have a day job, so there are no colleagues other than my co-founder.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why launch now?
&lt;/h2&gt;

&lt;p&gt;Arguably, the main risk here was launching too early for several reasons.&lt;/p&gt;

&lt;p&gt;First, your product might be too raw, so even in the case of a successful launch, not many people would stick.&lt;/p&gt;

&lt;p&gt;In the case of Impulse, we've been dogfooding it for long enough to hunt down most bugs and develop a usable, familiar, and pleasant UI.&lt;/p&gt;

&lt;p&gt;Second, it's essential to communicate your product's value and what it does. Things like the website copy, README, tag lines, pictures, demos, etc.&lt;/p&gt;

&lt;p&gt;I've struggled to explain what Impulse did and why since the beginning. I'm still not happy with that part, but six months was enough for better wording to emerge.&lt;/p&gt;

&lt;p&gt;Third, I tend to see product launches mainly as multipliers of whatever traction you already have. There's a lot of luck involved, but your existing users and audience are, I believe, essential to a good launch.&lt;/p&gt;

&lt;p&gt;For Impulse, the user base was definitely a weak spot and a good reason to push the launch back, but here's why I decided to go for it.&lt;/p&gt;

&lt;p&gt;I've been working exclusively on this project for half a year and... I don't really know where it's going. One of the primary goals from the beginning was to make a product I could use for most of my UI work. And oh my God, have I achieved that. Having used Impulse regularly for months (including designing Impulse itself and &lt;a href="https://impulse.dev"&gt;impulse.dev&lt;/a&gt;), I can't imagine going back.&lt;/p&gt;

&lt;p&gt;However, the other goal, expectedly, was to see if other people needed it and make a product that would be great to use for others.&lt;/p&gt;

&lt;p&gt;It would be hard to continue to work on a product no one needs. And to figure that out, I need a stream of feedback. I need to test the demand.&lt;/p&gt;

&lt;p&gt;Hence, launching Impulse was supposed to provide some clarity on that front. Ideally, you should have done more marketing and talked to the users more. In practice, I was past all of my deadlines for getting meaningful traction.&lt;/p&gt;

&lt;h2&gt;
  
  
  Before the launch day
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;"He who has begun has half done." — Horace&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;One lesson I could take away from the "launching guides" was that you have to pre-launch your launch. People should know you are launching, and posting a few teasers about your product doesn't hurt either.&lt;/p&gt;

&lt;p&gt;So once I knew the launch date (I set it a few days in advance), I let the people know via Twitter, Discord, and email.&lt;/p&gt;


&lt;blockquote class="ltag__twitter-tweet"&gt;

  &lt;div class="ltag__twitter-tweet__main"&gt;
    &lt;div class="ltag__twitter-tweet__header"&gt;
      &lt;img class="ltag__twitter-tweet__profile-image" src="https://res.cloudinary.com/practicaldev/image/fetch/s--22JYaYWE--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://pbs.twimg.com/profile_images/1449974851083571208/z2pZzka-_normal.jpg" alt="Kirill Rogovoy profile image"&gt;
      &lt;div class="ltag__twitter-tweet__full-name"&gt;
        Kirill Rogovoy
      &lt;/div&gt;
      &lt;div class="ltag__twitter-tweet__username"&gt;
        @krogovoy
      &lt;/div&gt;
      &lt;div class="ltag__twitter-tweet__twitter-logo"&gt;
        &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--ir1kO05j--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev.to/assets/twitter-f95605061196010f91e64806688390eb1a4dbc9e913682e043eb8b1e06ca484f.svg" alt="twitter logo"&gt;
      &lt;/div&gt;
    &lt;/div&gt;
    &lt;div class="ltag__twitter-tweet__body"&gt;
      After a ground-up redesign, I'm going to finally launch Impulse the next week! 🎉&lt;br&gt;&lt;br&gt;Wish me luck, haha&lt;br&gt;&lt;br&gt;If you use it, please upgrade to the latest version and tell me what you think.&lt;br&gt;&lt;br&gt;If you don't, now is the best moment to try it out.
    &lt;/div&gt;
    &lt;div class="ltag__twitter-tweet__date"&gt;
      11:28 AM - 23 Sep 2022
    &lt;/div&gt;


    &lt;div class="ltag__twitter-tweet__actions"&gt;
      &lt;a href="https://twitter.com/intent/tweet?in_reply_to=1573273134089863174" class="ltag__twitter-tweet__actions__button"&gt;
        &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--fFnoeFxk--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev.to/assets/twitter-reply-action-238fe0a37991706a6880ed13941c3efd6b371e4aefe288fe8e0db85250708bc4.svg" alt="Twitter reply action"&gt;
      &lt;/a&gt;
      &lt;a href="https://twitter.com/intent/retweet?tweet_id=1573273134089863174" class="ltag__twitter-tweet__actions__button"&gt;
        &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--k6dcrOn8--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev.to/assets/twitter-retweet-action-632c83532a4e7de573c5c08dbb090ee18b348b13e2793175fea914827bc42046.svg" alt="Twitter retweet action"&gt;
      &lt;/a&gt;
      &lt;a href="https://twitter.com/intent/like?tweet_id=1573273134089863174" class="ltag__twitter-tweet__actions__button"&gt;
        &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--SRQc9lOp--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev.to/assets/twitter-like-action-1ea89f4b87c7d37465b0eb78d51fcb7fe6c03a089805d7ea014ba71365be5171.svg" alt="Twitter like action"&gt;
      &lt;/a&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/blockquote&gt;


&lt;p&gt;I could probably take it somewhat further, but I was too lazy. One missed opportunity here is that I could reach out to many more people privately, hoping they would upvote my postings, but it felt too ingenuine.&lt;/p&gt;

&lt;p&gt;Another pre-launch thing you can't ignore is simply making sure that your website is accessible and fast, the meta tags for social sharing are set correctly, and Google indexes what it needs to index.&lt;/p&gt;

&lt;p&gt;As I would learn, most of the launching happens before the launch day. It's not hard to press a bunch of "submit" buttons. The hard part is creating enough momentum for your launch to have a real effect.&lt;/p&gt;

&lt;p&gt;Those include working on:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Brand awareness&lt;/li&gt;
&lt;li&gt;Communities&lt;/li&gt;
&lt;li&gt;Twitter following and capturing emails&lt;/li&gt;
&lt;li&gt;Press coverage&lt;/li&gt;
&lt;li&gt;and much more&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;But why do you need all that?&lt;/p&gt;

&lt;p&gt;Well, if you want tons of people to see your product, you need a lot of upvotes, right? More upvotes -&amp;gt; more people see it -&amp;gt; more upvotes, and so on. Of course, it's not cool to ask your whole extended family and ex-classmates to create Product Hunt accounts and go vote for you. Such behavior will quickly get you in trouble.&lt;/p&gt;

&lt;p&gt;But nobody said you couldn't broadcast your launch on the internet and "let people know."&lt;br&gt;
(Product Hunt explicitly &lt;a href="https://www.producthunt.com/questions/how-do-i-promote-my-launch"&gt;allows you&lt;/a&gt; to ask people to come to visit and comment, but not vote).&lt;/p&gt;

&lt;p&gt;Another reason is that the second you submit your posts to websites like Product Hunt or Hacker News, that post stays in some sort of limbo: Unless enough people upvote it within a short period of time (the difference even between 0 and 10 upvotes at this point is huge), the post might never really surface. So you need that kick-starter crew more than anything.&lt;/p&gt;

&lt;p&gt;Now, this whole tactic may seem ingenuine. Shouldn't the product's rank depend solely on the product itself?&lt;/p&gt;

&lt;p&gt;In theory, it should. In practice, it is an ideal that's impossible to reach. It's a game, and games are played. Can you have a successful launch without all the preparations? Absolutely! Just less likely.&lt;/p&gt;

&lt;p&gt;Again, you shouldn't ask people to upvote your posts. But everybody just knows that's what you want.&lt;/p&gt;

&lt;p&gt;Anyway, as I would realize, most launch preparations are too late to do when the launch is tomorrow. Strategically, a successful launch should be just a culmination of months of marketing.&lt;/p&gt;

&lt;p&gt;Hence, I did what I could still do: make a few public posts and talk to several people.&lt;/p&gt;

&lt;p&gt;The lesson here is not to think about your launch date from day 1 of the project.&lt;/p&gt;

&lt;p&gt;The lesson is that launching your product is just an extension of your marketing efforts overall.&lt;/p&gt;

&lt;p&gt;Want to have a great launch? Do great marketing consistently for several months leading up to the launch.&lt;/p&gt;
&lt;h2&gt;
  
  
  Launch day
&lt;/h2&gt;

&lt;p&gt;The plan was to launch on:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Product Hunt&lt;/li&gt;
&lt;li&gt;Hacker News&lt;/li&gt;
&lt;li&gt;Reddit&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Because Product Hunt has the concept of daily ranking (everybody wants to be the #1 Product of the Day), the first thing I did was craft the PH post, submit it, and add a PH link to &lt;a href="https://impulse.dev"&gt;impulse.dev&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Then I would send a new series of posts on Twitter, Discord, and email.&lt;/p&gt;


&lt;blockquote class="ltag__twitter-tweet"&gt;

  &lt;div class="ltag__twitter-tweet__main"&gt;
    &lt;div class="ltag__twitter-tweet__header"&gt;
      &lt;img class="ltag__twitter-tweet__profile-image" src="https://res.cloudinary.com/practicaldev/image/fetch/s--22JYaYWE--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://pbs.twimg.com/profile_images/1449974851083571208/z2pZzka-_normal.jpg" alt="Kirill Rogovoy profile image"&gt;
      &lt;div class="ltag__twitter-tweet__full-name"&gt;
        Kirill Rogovoy
      &lt;/div&gt;
      &lt;div class="ltag__twitter-tweet__username"&gt;
        @krogovoy
      &lt;/div&gt;
      &lt;div class="ltag__twitter-tweet__twitter-logo"&gt;
        &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--ir1kO05j--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev.to/assets/twitter-f95605061196010f91e64806688390eb1a4dbc9e913682e043eb8b1e06ca484f.svg" alt="twitter logo"&gt;
      &lt;/div&gt;
    &lt;/div&gt;
    &lt;div class="ltag__twitter-tweet__body"&gt;
      It's on! Impulse is on Product Hunt! 🏆&lt;br&gt;&lt;br&gt;&lt;a href="https://t.co/U0ssON4QFz"&gt;producthunt.com/posts/impulse-…&lt;/a&gt;&lt;br&gt;&lt;br&gt;I have no idea what I'm doing. :)
    &lt;/div&gt;
    &lt;div class="ltag__twitter-tweet__date"&gt;
      07:12 AM - 28 Sep 2022
    &lt;/div&gt;


    &lt;div class="ltag__twitter-tweet__actions"&gt;
      &lt;a href="https://twitter.com/intent/tweet?in_reply_to=1575020706504400896" class="ltag__twitter-tweet__actions__button"&gt;
        &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--fFnoeFxk--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev.to/assets/twitter-reply-action-238fe0a37991706a6880ed13941c3efd6b371e4aefe288fe8e0db85250708bc4.svg" alt="Twitter reply action"&gt;
      &lt;/a&gt;
      &lt;a href="https://twitter.com/intent/retweet?tweet_id=1575020706504400896" class="ltag__twitter-tweet__actions__button"&gt;
        &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--k6dcrOn8--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev.to/assets/twitter-retweet-action-632c83532a4e7de573c5c08dbb090ee18b348b13e2793175fea914827bc42046.svg" alt="Twitter retweet action"&gt;
      &lt;/a&gt;
      &lt;a href="https://twitter.com/intent/like?tweet_id=1575020706504400896" class="ltag__twitter-tweet__actions__button"&gt;
        &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--SRQc9lOp--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev.to/assets/twitter-like-action-1ea89f4b87c7d37465b0eb78d51fcb7fe6c03a089805d7ea014ba71365be5171.svg" alt="Twitter like action"&gt;
      &lt;/a&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/blockquote&gt;


&lt;p&gt;A few hours later, I'd make a Show HN post and then 8 Reddit posts (to different subreddits) 20-30 minutes apart. Because I prepared most of the texts and media in advance, this process did feel like just pressing a bunch of submit buttons.&lt;/p&gt;

&lt;p&gt;That was it. All I had to do was wait and react to comments.&lt;/p&gt;

&lt;p&gt;It felt like opening a new store and sitting in an empty space behind the counter, waiting for someone to arrive.&lt;/p&gt;

&lt;p&gt;And someone did!&lt;/p&gt;

&lt;h2&gt;
  
  
  Expectations
&lt;/h2&gt;

&lt;p&gt;Before getting to the results, think about what expectations you would have about this launch.&lt;/p&gt;

&lt;p&gt;My thinking at this point was that, with a tiny audience and lack of marketing before the launch day, the results would mainly be up to Math.random() of the world.&lt;/p&gt;

&lt;p&gt;Sure, I tried my best to write the copy, make the landing page, tag lines, and so on. But I couldn't control much beyond that.&lt;/p&gt;

&lt;p&gt;So any outcome, including (or especially) having 0 views, was expected.&lt;/p&gt;

&lt;h2&gt;
  
  
  Results
&lt;/h2&gt;

&lt;p&gt;Product Hunt:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;47 upvotes&lt;/li&gt;
&lt;li&gt;10 comments&lt;/li&gt;
&lt;li&gt;Day rank #27&lt;/li&gt;
&lt;li&gt;186 unique LP views&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Hacker News:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;1 upvote&lt;/li&gt;
&lt;li&gt;16 unique LP views&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Reddit (total for 8 posts):&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;193 upvotes&lt;/li&gt;
&lt;li&gt;55 comments&lt;/li&gt;
&lt;li&gt;893 unique LP views&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;There were also 787 unique LP views with an undefined referrer and a long tail of isolated visits from random places.&lt;/p&gt;

&lt;p&gt;Ultimately, it amounted to about 2000 unique LP visits within 48 hours after the launch.&lt;/p&gt;

&lt;p&gt;For comparison, my blog post that kicked off my work on Impulse had 20k page views just from Hacker News.&lt;/p&gt;

&lt;p&gt;Other effects:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;94 -&amp;gt; 180 Github stars&lt;/li&gt;
&lt;li&gt;30 -&amp;gt; 39 Discord members&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Was this launch a success?&lt;/p&gt;

&lt;p&gt;Yes and no.&lt;/p&gt;

&lt;p&gt;On the one hand, 2k views and #27 Product of the Day are not what you typically see in articles about launches.&lt;/p&gt;

&lt;p&gt;On the other hand, it did get things moving.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--cTy_k0yj--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/e08i3tkvkxottblhru02.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--cTy_k0yj--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/e08i3tkvkxottblhru02.jpg" alt="impulse.dev page view graph" width="880" height="288"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://impulse.dev"&gt;impulse.dev&lt;/a&gt;'s typical daily traffic grew from {'&amp;lt;'}10 to about 50.&lt;/p&gt;

&lt;p&gt;One week after the launch, Impulse got featured in &lt;a href="https://tldr.tech"&gt;tldr.tech&lt;/a&gt;, which generated 2646 page views, more than from launching, but I doubt that Impulse would have been spotted without the launch.&lt;/p&gt;

&lt;p&gt;As for the actual users, several new people came to Discord and Github with questions and issues, which I tried my best to resolve. A few people left positive feedback about their experience too.&lt;/p&gt;

&lt;p&gt;I still don't know how many people use it consistently, though.&lt;/p&gt;

&lt;h2&gt;
  
  
  Lessons learned
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--CFE90BtH--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/fjwn90ite8wn2rnwn2z2.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--CFE90BtH--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/fjwn90ite8wn2rnwn2z2.jpg" alt="https://www.memelogy.co/meme/rechTosUQTtwgMxjJ" width="880" height="896"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Ultimately, I'm not happy or sad about this launch because I think I set the right expectations. It did give Impulse a boost, but it's just one drop in the sea of marketing that needs to be done to take it to the next level.&lt;/p&gt;

&lt;p&gt;Several things I'd do differently:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Reach out to more people privately and tell them about the launch.&lt;/li&gt;
&lt;li&gt;Maybe reach out to all stargazers with public email, but I'm still 50/50 on whether or not it's spamming.&lt;/li&gt;
&lt;li&gt;Launch on more websites. Especially since Impulse is 100% open-source. There are many more places it could have been featured (and still can, only independently from the launch).&lt;/li&gt;
&lt;li&gt;Think about the launch day one month prior to it instead of several days.&lt;/li&gt;
&lt;/ol&gt;

&lt;blockquote&gt;
&lt;p&gt;"There are no silver bullets, only lead ones." – Ben Horowitz&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Anyway, the journey is far from over. Impulse is definitely entering a new stage, and I'm excited to learn what it means.&lt;/p&gt;

&lt;p&gt;Stay tuned!&lt;/p&gt;

&lt;p&gt;And, you know, why not give &lt;a href="https://github.com/impulse-oss/impulse"&gt;Impulse&lt;/a&gt; a star?&lt;/p&gt;

</description>
      <category>opensource</category>
      <category>launch</category>
      <category>react</category>
      <category>tailwindcss</category>
    </item>
    <item>
      <title>I quit my business to start an open-source dev tool</title>
      <dc:creator>Kirill Rogovoy</dc:creator>
      <pubDate>Mon, 25 Jul 2022 13:16:23 +0000</pubDate>
      <link>https://dev.to/kirillrogovoy/i-quit-my-business-to-start-an-open-source-dev-tool-7c4</link>
      <guid>https://dev.to/kirillrogovoy/i-quit-my-business-to-start-an-open-source-dev-tool-7c4</guid>
      <description>&lt;p&gt;This is a story of me quitting my job as a web dev, starting my first SaaS, burning through all of my savings, and finding what I really wanted to do.&lt;/p&gt;

&lt;p&gt;Also, this post is my attempt to start sharing my honest experiences, however good or bad, on the internet. Both as a form of journaling for myself and as a case study for the community.&lt;/p&gt;

&lt;p&gt;I want these to be more like personal letters and less like self-promotional feel-good traffic-generating positively-thinking marketing posts.&lt;/p&gt;

&lt;p&gt;I want to stay vulnerable and honest.&lt;/p&gt;

&lt;p&gt;It's going to be ugly.&lt;/p&gt;

&lt;h2&gt;
  
  
  Quitting my job to start an online product
&lt;/h2&gt;

&lt;p&gt;In January 2020, I quit my job as a web developer to start a SaaS with a partner. It was the boldest move I've ever made in my professional life. I was scared but unbelievably excited. Starting my own project has been my gestalt for years.&lt;/p&gt;

&lt;p&gt;It's finally happening!&lt;/p&gt;

&lt;p&gt;I was very lucky to have been making more than I've been spending for several years and investing that in S&amp;amp;P500 during the bull phase of the market. It resulted in enough savings to not think about money for at least a few years.&lt;/p&gt;

&lt;p&gt;Looking back, I can't help but think that having too much cash runway can jeopardize your venture: too easy to get comfortable.&lt;/p&gt;

&lt;p&gt;We didn't know what we wanted to build. Still, we wanted to work together (having been colleagues for 3.5+ years), and we knew that the stars might not align again in the future.&lt;/p&gt;

&lt;p&gt;With a sense of freedom but also immense pressure that I couldn't explain, we started to brainstorm ideas. At that moment, neither of us had something he had always wanted to build (and that would also qualify as a viable business opportunity), so the process was a combination of looking inward and seeking gaps in markets.&lt;/p&gt;

&lt;p&gt;It was the first time I internalized that the price for all the freedom I felt at the time was the heavy burden of uncertainty. Before 2020, I had been a web developer (with a mixture of leading teams, product management, analytics, and other things) for 7 years. There had always been someone to tell me, at least on some level, what goal should be achieved.&lt;/p&gt;

&lt;p&gt;Being able to do whatever I wanted did not taste as sweet as I had pictured. It felt like we could make any number of bad decisions, and there was nobody to tell us that.&lt;/p&gt;

&lt;p&gt;However, that feeling was also one of the best exercises for taking responsibility for your life. In the end, dealing with uncertainty and taking personal responsibility for tough decisions are things you train by practicing, not learning from books.&lt;/p&gt;

&lt;p&gt;I'm so tempted to say that, in hindsight, that experience has taught me to take ultimate responsibility for my life decisions and made me an exceptionally self-directed person. But it would be a lie. I'm 2.5 years into "doing whatever I want", and, at best, I've learned to freak out less. Being truly responsible for one's each and every decision is tough. Not as a concept but as a practice.&lt;/p&gt;

&lt;h2&gt;
  
  
  Taking on food tech
&lt;/h2&gt;

&lt;p&gt;Those few days of brainstorming and scoring different ideas using a dozen factors finally led us to the one problem we chose to solve.&lt;/p&gt;

&lt;p&gt;We wanted all restaurants and cafes in the world to have modern digital menus with high-quality photos of each meal, and the ability to take orders online. (Keep in mind that we are still several months away from the worldwide pandemic.)&lt;/p&gt;

&lt;p&gt;We also saw a business opportunity: why wouldn't restaurants pay us for a significant improvement (in our minds) of the experience of their visitors.&lt;/p&gt;

&lt;p&gt;We called our project Foodba simply because there was a cheap-ish .com domain.&lt;br&gt;
I know.&lt;/p&gt;

&lt;p&gt;What we didn't see at the moment is that we only cared about the visitors. We knew nothing about people running restaurants, nor did we really care.&lt;/p&gt;

&lt;p&gt;Being blind to that, we ran 10s of "customer interviews" with almost everybody telling us that having those digital menus would be great. None of those people were running restaurants.&lt;/p&gt;

&lt;p&gt;Had we talked to people that we actually expected to pay us, the whole venture would have been different. &lt;/p&gt;

&lt;p&gt;Anyway, we ended up building an MVP and leveraging our personal networks to find first several customers that would agree to use our product for free. In return, we could study how they operated in general, along with their specific feedback about the product.&lt;/p&gt;

&lt;p&gt;We actually enjoyed this period. We had to do everything: build the product, talk to customers, design and print QR codes for them, and even take professional photos of 100s of meals. We were hustling!&lt;/p&gt;

&lt;p&gt;We didn't make money yet, but it already started to feel like a hell of an adventure.&lt;/p&gt;

&lt;h2&gt;
  
  
  Wear masks and keep distance
&lt;/h2&gt;

&lt;p&gt;Then Covid happened. Ouch!&lt;/p&gt;

&lt;p&gt;Undoubtedly, it has shaken almost every industry, with the hospitality businesses being especially vulnerable. Today you serve; tomorrow, you're closed. You launch takeaway, but nobody orders. You lean on delivery, but the food platform commissions only bring you losses.&lt;/p&gt;

&lt;p&gt;To make things worse, nobody knew what to expect next, and everybody was cutting losses. There was no solid ground. Problems would come and go in a matter of weeks, so it was problematic to capture a specific pain that we could solve.&lt;/p&gt;

&lt;p&gt;At the same time, we felt like we really worked hard and were productive. Finally, it really felt like "building a startup": talking to customers almost every day, building something to solve at least some problem (however fleeting), getting feedback, etc.&lt;/p&gt;

&lt;p&gt;It was exhausting but somewhat rewarding.&lt;/p&gt;

&lt;p&gt;Looking back, I think the pandemic was the real reason we had any traction. People in crisis needed help, and we wanted to be useful.&lt;/p&gt;

&lt;p&gt;Even though it never felt like we found any product-market fit, in December 2020 (one year in), we had almost 50 paid customers. In June, we had none, so it felt like a success!&lt;/p&gt;

&lt;p&gt;Also, every indie hacker knows that the feeling of people actually handing you money for something you've done is ecstatic. At least in the beginning.&lt;/p&gt;

&lt;p&gt;By that point, people would buy our product for a bunch of different reasons. None of them were allowed to have paper menus, so some just wanted a better experience than an ugly PDF behind a QR code. Some wanted to run their own delivery. Some wanted to run Facebook re-targeting campaigns. Some just thought that it was trendy to have a digital menu.&lt;br&gt;
Our "customer profile" was a mess.&lt;/p&gt;

&lt;p&gt;Let's take a moment to reflect.&lt;/p&gt;

&lt;p&gt;Two dudes spent one year building a product full-time. Results:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;~$600 MRR.&lt;/li&gt;
&lt;li&gt;No clear product-market fit.&lt;/li&gt;
&lt;li&gt;No clear way for scaling.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;By this point, the cumulative opportunity cost is in $100,000s.&lt;/p&gt;

&lt;p&gt;Would you continue such a venture?&lt;/p&gt;

&lt;p&gt;That's a tough choice.&lt;/p&gt;

&lt;p&gt;We did. &lt;/p&gt;

&lt;h2&gt;
  
  
  Product-market misfit
&lt;/h2&gt;

&lt;p&gt;Still thinking back on our decision to continue, it's worth mentioning that, of course, it's not just about money.&lt;/p&gt;

&lt;p&gt;We have learned so much. Not just about building a product but sales, marketing, UX, you name it.&lt;/p&gt;

&lt;p&gt;Persistence. We have learned how to not quit when things don't work.&lt;/p&gt;

&lt;p&gt;In the end, working on the business was simply &lt;em&gt;fun and fulfilling&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;And so, we began scaling.&lt;/p&gt;

&lt;p&gt;From this point, there were only three kinds of tasks we could afford to do:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Fixing something that's broken.&lt;/li&gt;
&lt;li&gt;Whatever brings us new customers.&lt;/li&gt;
&lt;li&gt;Whatever helps us spend less time on support.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Our problem with scaling was that we tried to do things as if we had a product-market fit without actually having it.&lt;/p&gt;

&lt;p&gt;Usually, scaling your business means that you already have one or many sales/marketing channels that work on a small scale. You invest more time and money in developing them. You do it until you hit a point when growing it becomes more expensive than the potential output.&lt;/p&gt;

&lt;p&gt;But it wasn't really our situation.&lt;/p&gt;

&lt;p&gt;We were still unsure if our customer was closer to a hotel restaurant, a downtown tourist venue, or a local coffee shop.&lt;/p&gt;

&lt;p&gt;A random venue from Google Ads would just sign up and use the service with no questions or assistance. At the same time, we would spend two days making custom QR codes and making a photoshoot for 60 menu items for a local restaurant in London, only to get ghosted. At least they fed us. Once.&lt;/p&gt;

&lt;p&gt;It wasn't going well.&lt;/p&gt;

&lt;p&gt;I still remember the adrenaline rush of cold-calling random Asian woks. Poor busy exhausted administrators couldn't understand what I was talking about. Can I just go back to coding, please?&lt;/p&gt;

&lt;p&gt;Our search for whoever we thought was the customer and for a scalable channel to get them would continue for months. We tried cold calls, cold visits, cold emails, ads, SEO, flyers, referrals, partnerships, and more.&lt;/p&gt;

&lt;p&gt;Somewhere around that time, I started to realize I didn't like what we were doing anymore. 😬&lt;/p&gt;

&lt;p&gt;First, I didn't really care about our clients. I had zero friends who were in the restaurant business. I, personally, wasn't interested in how restaurants were run and what a life of a staff member would be like.&lt;/p&gt;

&lt;p&gt;All I cared about was me and people like me, who, among other things, visited restaurants. But visitors weren't the ones who paid, nor could we find a reasonable way to change that.&lt;/p&gt;

&lt;p&gt;Second, I started to get bored as a developer. In the beginning, I'd learn a thing or two about running serverless functions, working with AWS, or optimizing images. But a QR menu service, with all its specialized features, is just a CRUD app.&lt;/p&gt;

&lt;p&gt;It wasn't a problem per se. It's not realistic to have an app that's fun and challenging to develop day after day. Most apps on the internet are CRUD apps with bells and whistles.&lt;/p&gt;

&lt;p&gt;However, coding had for a long time been my shelter. The place I could go after a day of palm-sweating cold calls and enjoy doing something I was actually good at. But for whatever reason, coding stopped being that place, and I didn't want to make things more complex just for entertainment.&lt;/p&gt;

&lt;p&gt;Another sign of disliking the project was that I didn't want to discuss it with other people anymore. I felt ashamed but didn't know of what. I felt ashamed of feeling ashamed too.&lt;/p&gt;

&lt;p&gt;And that's how 2021 went. We kept trying to find the product-market fit. Every week it seemed like the breakthrough was around the corner. &lt;/p&gt;

&lt;p&gt;Some things worked. Most didn't.&lt;/p&gt;

&lt;p&gt;We ended up growing our customer base from 50 to around 150 that year, tripling our MRR.&lt;/p&gt;

&lt;p&gt;For the most part, we discovered a thousand ways that didn't work for us. I would often think about that to comfort myself and make it look like we were making progress.&lt;/p&gt;

&lt;p&gt;More importantly, we managed to reflect on the key turning points that led us to where we were;&lt;br&gt;
our biases and blind spots that kept us digging in the wrong direction. Or was the direction right, but we just executed poorly? I wouldn't know.&lt;/p&gt;

&lt;p&gt;After a long New Year vacation, we agreed that the project wasn't doing well. We didn't know what to do, but we surely were demotivated.&lt;/p&gt;

&lt;h2&gt;
  
  
  Goodbye Blue Sky
&lt;/h2&gt;

&lt;p&gt;(I live in Ukraine.)&lt;/p&gt;

&lt;p&gt;I don't remember much between Feb 24 and late March. It has condensed into one hazy memory filled with sounds of sirens, midnight doom scrolling, and moving places.&lt;/p&gt;

&lt;p&gt;All I can say is that I'm lucky to be writing this post on a fancy laptop while sipping fresh filter coffee in the beautiful city of Lviv, with all my body parts appropriately hanging from the right spots.&lt;/p&gt;

&lt;p&gt;This post isn't about the war, and I'm certainly not the one to have suffered the most, but you can imagine that an experience like that might make one reflect more on their life choices.&lt;/p&gt;

&lt;p&gt;That reflection made it crystal clear that it was time to turn the page.&lt;/p&gt;

&lt;p&gt;Luckily, about the time I ran out of my savings, which had supported me for almost 2.5 years, our business started to generate just enough profit for me to not look for a job or a side gig.&lt;/p&gt;

&lt;p&gt;We jointly decided to keep the business operating and heavily automate whatever still required our attention. But we quit investing any new effort.&lt;/p&gt;

&lt;p&gt;Finally, we were free to choose what would be next. All the anxiety of "doing whatever you want" came back in an instant, on top of not knowing what would happen tomorrow in my physical environment.&lt;/p&gt;

&lt;h2&gt;
  
  
  Lessons (not) learned
&lt;/h2&gt;

&lt;p&gt;It might seem that two and a half years of running a SaaS app should have given me a lot of insight on how to properly do it.&lt;/p&gt;

&lt;p&gt;It has not.&lt;/p&gt;

&lt;p&gt;At best, I went from having no idea to having some idea about what I was doing. At the same time, it made me feel much more comfortable about being incompetent.&lt;/p&gt;

&lt;p&gt;It completely dispelled the illusion that one must first get good at something and then do it. It doesn't make much sense if you are a heart surgeon or a pilot. But when it comes to doing silly things on the web, such as in my case, I found the scrappy just-do-it attitude to be the most productive.&lt;/p&gt;

&lt;h3&gt;
  
  
  Lesson 1: find users you care about
&lt;/h3&gt;

&lt;p&gt;I've learned that it's essential for me to be able to relate to my users deeply.&lt;/p&gt;

&lt;p&gt;Over the last few months, I've spoken to a dozen of developers I had never met before. Oh. My. God. What a contrast.&lt;/p&gt;

&lt;p&gt;We could talk for hours. I understand them. They understand me. It feels more like two kids discussing toys. I loved it!&lt;/p&gt;

&lt;p&gt;Comparing that to people who run restaurants, the difference in my attitude is stark.&lt;/p&gt;

&lt;p&gt;Although typing curly braces isn't by far the only interest of mine, feeling that I'm "a part of the tribe" makes me want to contribute in a completely different way. &lt;/p&gt;

&lt;p&gt;It also makes it much easier to actually use what you make.&lt;/p&gt;

&lt;p&gt;When working for companies, I always felt the urge to improve the tools my team and I used. I don't know why. Instead of applying my craft and solving problems with it, I wanted to improve the craft itself. I wanted to think and talk about how we do more than what we do.&lt;/p&gt;

&lt;p&gt;This realization made it clear: I want to do stuff for people I'm excited to talk to. Those I want to learn about even without having a project in mind.&lt;/p&gt;

&lt;h3&gt;
  
  
  Lesson 2: second order effects
&lt;/h3&gt;

&lt;p&gt;Whatever project you do, there are always results that outlive the project: skills acquired, people met, doors opened.&lt;/p&gt;

&lt;p&gt;Turns out, you can (and should) consider that when choosing what to do.&lt;/p&gt;

&lt;p&gt;With Foodba, I didn't. Therefore:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;I gained a lot of domain knowledge (food industry) I will not use.&lt;/li&gt;
&lt;li&gt;I gained zero contacts that could be my future customers, partners, employees, employers, etc.&lt;/li&gt;
&lt;li&gt;I didn't increase my "luck surface area."&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That sucks because, as I stop working on Foodba, it feels like not much has changed since 2020. It doesn't feel like I gained any inertia. No unfair advantages. No trump cards to play.&lt;/p&gt;

&lt;p&gt;This time, I can do better. At least by entering the domain where I see myself doing much more projects and creating long-lasting value beyond any specific endeavor.&lt;/p&gt;

&lt;p&gt;Example? You are looking at it.&lt;/p&gt;

&lt;p&gt;Tim Ferriss once said on his podcast something that stuck with me:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Even if this fails, are there skills and relationships that I can develop that will carry over into other things?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Lesson 3: pick the right kind of challenge
&lt;/h3&gt;

&lt;p&gt;I want a challenge, but not any challenge.&lt;/p&gt;

&lt;p&gt;The ability of an entrepreneur to do whatever it takes to get the job done is often romanticized. And for good reasons.&lt;/p&gt;

&lt;p&gt;However, I've realized that I simply don't want to succeed at all costs. Doing what I love (most of the time) is in many ways more important to me.&lt;/p&gt;

&lt;p&gt;There are skills I don't want to develop or activities that make me want to quit. Things like making cold calls, dealing with a lot of ops work, or writing SEO-optimized marketing posts.&lt;/p&gt;

&lt;p&gt;Those aren't bad things to do. They are just not what fulfills me.&lt;/p&gt;

&lt;p&gt;At the same time, there are a ton of difficult challenges I'm excited to take on:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Writing&lt;/li&gt;
&lt;li&gt;Being proactively useful for the community&lt;/li&gt;
&lt;li&gt;Build a community of my own&lt;/li&gt;
&lt;li&gt;Mind-boggling tech problems&lt;/li&gt;
&lt;li&gt;Building in public while staying authentic&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Avoiding things I don't like doesn't mean I will stay away from opportunities that would work best if I did those things. I'll be happy to delegate them. I just want to make sure it's not something that's critical to do at the early stages.&lt;/p&gt;

&lt;h2&gt;
  
  
  Starting an open-source dev tool
&lt;/h2&gt;

&lt;p&gt;Finally, pieces are coming together:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;I like making tools&lt;/li&gt;
&lt;li&gt;The tech community is my tribe&lt;/li&gt;
&lt;li&gt;It fits the challenges I chose&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;To me, the tech industry is unlike any other field.&lt;/p&gt;

&lt;p&gt;It's brutal in its own ways. But also uniquely rewarding.&lt;/p&gt;

&lt;p&gt;It's highly competitive but fairly meritocratic.&lt;/p&gt;

&lt;p&gt;I believe it to still be the Wild West.&lt;/p&gt;

&lt;p&gt;And so, I've decided to give it a try. I'll do my best to be as valuable as possible to my tribe while explicitly doing things I enjoy the most.&lt;/p&gt;

&lt;p&gt;That includes several (scary) things I've never done:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Starting a newsletter and this blog&lt;/li&gt;
&lt;li&gt;Exploring social media as a platform to create value&lt;/li&gt;
&lt;li&gt;Building in public while staying as honest as possible&lt;/li&gt;
&lt;li&gt;Finally, making a tool &lt;strong&gt;I&lt;/strong&gt; have wanted for a long time, 100% open-source&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Impulse.dev: first baby steps
&lt;/h3&gt;

&lt;p&gt;In April, I posted my first public article since 2018:&lt;br&gt;
&lt;a href="https://rogovoy.me/blog/writing-html-sucks"&gt;Writing HTML sucks and No-code doesn't help&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;It brought 20K page views, 168 HN comments, and 40 email subscribers. Yay!&lt;/p&gt;

&lt;p&gt;It might not seem like much, but it was nerve-wracking for a person who isn't used to any public attention or criticism.&lt;/p&gt;

&lt;p&gt;Two months later, I released the first alpha version and recorded a 42-minute demo (I know!), available at &lt;a href="https://impulse.dev"&gt;impulse.dev&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Luckily, my partner from the previous venture joined me, so that period didn't feel lonely or like too much work.&lt;/p&gt;

&lt;p&gt;I tried to write about our alpha release in &lt;a href="https://rogovoy.me/blog/writing-html-sucks-less"&gt;Writing HTML sucks less with Impulse&lt;/a&gt;, but &lt;em&gt;nobody&lt;/em&gt; read it.&lt;/p&gt;

&lt;p&gt;When you spend several hours (or days) meticulously capturing your thoughts into text, and then nothing happens, you feel like nothing's worth doing anymore. :) But hey, it's a very long game, right?&lt;/p&gt;

&lt;p&gt;Anyway, here I am, alternating between writing this post and thinking if any of this was ever a good idea.&lt;/p&gt;

&lt;p&gt;I'm omitting a lot of details about building Impulse. This new journey deserves many more posts, and I'm already 3000 words in. :)&lt;/p&gt;

&lt;p&gt;The last topic I haven't touched on is money. Everyone who ran open-source projects without significant backing from Big Tech would tell you that it's very hard to make a living off open-source. And they are right. I'd like to discuss it in detail in future posts, but it's definitely a long-term concern.&lt;/p&gt;

&lt;h2&gt;
  
  
  Follow my journey
&lt;/h2&gt;

&lt;p&gt;If you liked this post, you might like those that will follow.&lt;/p&gt;

&lt;p&gt;Subscribe to the newsletter using the form below, and &lt;a href="https://twitter.com/krogovoy"&gt;follow me on Twitter&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;If you use TailwindCSS, you might find &lt;a href="https://impulse.dev"&gt;impulse.dev&lt;/a&gt; useful!&lt;/p&gt;

&lt;p&gt;See you next time! 🙌&lt;/p&gt;

&lt;p&gt;P.S.&lt;br&gt;
I spent more than a week doing nothing but working on this post. Writing is fucking hard. If you have reached this far, &lt;strong&gt;thank you&lt;/strong&gt;.&lt;/p&gt;

</description>
      <category>opensource</category>
      <category>indiehackers</category>
      <category>tailwindcss</category>
      <category>react</category>
    </item>
    <item>
      <title>Writing HTML sucks less with Impulse</title>
      <dc:creator>Kirill Rogovoy</dc:creator>
      <pubDate>Thu, 07 Jul 2022 12:53:54 +0000</pubDate>
      <link>https://dev.to/kirillrogovoy/writing-html-sucks-less-with-impulse-487o</link>
      <guid>https://dev.to/kirillrogovoy/writing-html-sucks-less-with-impulse-487o</guid>
      <description>&lt;p&gt;This post is a follow-up to &lt;a href="https://rogovoy.me/blog/writing-html-sucks" rel="noopener noreferrer"&gt;Writing HTML sucks and No-code doesn't help&lt;/a&gt; that I published two months ago.&lt;/p&gt;

&lt;p&gt;A quick recap of opinions I expressed in that article:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Writing HTML is slow and boring.&lt;/li&gt;
&lt;li&gt;No-code tools are great but aren't suitable for a lot of projects. Also, developers don't like them.&lt;/li&gt;
&lt;li&gt;When it comes to creating UIs, developers are the underserved customers.&lt;/li&gt;
&lt;li&gt;Having a tight feedback loop is crucial. It's not tight enough when you need to develop the UI by writing code in the editor.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;We can do better.&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I've also suggested a solution. I wanted a tool that worked directly with my code, allowing me to edit the UI inside the browser.&lt;/p&gt;

&lt;p&gt;I wanted a tool that's made for developers, with zero abstractions on top of HTML/CSS and a keyboard-driven UX.&lt;/p&gt;

&lt;p&gt;Ultimately, I wanted a tool to make creating UIs fun and fast, without giving up on any of my code.&lt;/p&gt;

&lt;p&gt;I wanted something that looked like this:&lt;/p&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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fo2x2706xw820wt148v0b.gif" 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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fo2x2706xw820wt148v0b.gif" alt="Impluse page creation demo"&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;Two months and a few gallons of coffee in, as promised, I've made a prototype!&lt;/p&gt;

&lt;h2&gt;
  
  
  Introducing Impulse
&lt;/h2&gt;

&lt;p&gt;Impulse allows you to edit your UI (think specific JSX code) visually inside your app by editing the DOM element.&lt;/p&gt;

&lt;p&gt;Imagine if you could change the styles of any DOM element on the page using the Devtools, and it would be automatically saved to your code exactly the way you would do it yourself.&lt;/p&gt;

&lt;p&gt;Impulse is that, and much more, but with a better UX.&lt;/p&gt;

&lt;p&gt;It's completely local and open-source. No SaaS. No servers. No accounts.&lt;/p&gt;

&lt;p&gt;It's built for React and works best if you use Tailwind. More on this below.&lt;/p&gt;

&lt;p&gt;Most importantly, Impulse isn't a replacement for anything. It's an add-on. Just like Devtools, you use it when you need it and then stash it away.&lt;/p&gt;

&lt;p&gt;Website: &lt;a href="https://impulse.dev" rel="noopener noreferrer"&gt;impulse.dev&lt;/a&gt;&lt;br&gt;
Github: &lt;a href="https://github.com/impulse-oss/impulse" rel="noopener noreferrer"&gt;impulse-oss/impulse&lt;/a&gt;&lt;br&gt;
Full 40-minute demo: &lt;a href="https://youtu.be/QaTSsaGXCco" rel="noopener noreferrer"&gt;https://youtu.be/QaTSsaGXCco&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Why writing code isn't fast enough
&lt;/h2&gt;

&lt;p&gt;I feel like it's important to reiterate the problem Impulse is solving.&lt;/p&gt;

&lt;p&gt;Citing my previous post:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Sometimes, it's a 2-minute job. Fix some margin. No big deal. But sometimes I'd spend the whole day working on the UI, and the issue becomes much more apparent.&lt;/p&gt;

&lt;p&gt;In that working-on-UI mode, writing HTML feels like trying to draw a picture by shooting arrows at the target. You shoot one, see where it landed, adjust, and shoot again. Code feels like the gap between you and the target.&lt;/p&gt;

&lt;p&gt;We aren't blind to this problem. In fact, we got pretty good at shooting those arrows. Emmet saves us raw keystrokes, Tailwind (with its VS Code extension) saves us mental effort, Fast Refresh (aka Hot Module Replacement) shrinks the feedback loop, the browser's DOM explorer gives us some optics. We shoot those arrows from a machine gun.&lt;/p&gt;

&lt;p&gt;But the distance is still there. The gap is still there. We are just traveling it faster.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Creating UI code is pretty damn fast in 2022. However, the constant context switching between the browser and the code editor hasn't gone away. And to me, it just feels wrong.&lt;/p&gt;

&lt;p&gt;The feedback loop is tight but not tight enough.&lt;/p&gt;

&lt;p&gt;It's not just speed. It's about fun too. For a long time, I hated coding the UIs. I loved the design phase, but writing the HTML down felt so boring.&lt;/p&gt;

&lt;p&gt;Now I honestly look forward to it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why React
&lt;/h2&gt;

&lt;p&gt;For one, it's what I've been using for the last few years, and it also happens to be the most popular front-end framework at the time of creating Impulse.&lt;/p&gt;

&lt;p&gt;Another important reason is the little-known internal feature of React that allows you to know which DOM element was created by which piece of code with high precision.&lt;/p&gt;

&lt;p&gt;I don't know if Vue or Svelte, or Angular do anything similar, but without that information, there's no Impulse.&lt;/p&gt;

&lt;p&gt;I'm tempted to elaborate more on how it works exactly, but there's so much more to it, that it deserves a separate post. Please, let me know if you're curious!&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Tailwind
&lt;/h2&gt;

&lt;p&gt;In the demo above, I add the styles of the elements by adding Tailwind classes.&lt;/p&gt;

&lt;p&gt;Tailwind has already been my go-to choice for more than two years,&lt;br&gt;
but the fact that it uses utility classes for styling made it a great fit.&lt;/p&gt;

&lt;p&gt;It also allows you to &lt;em&gt;not&lt;/em&gt; come up with semantic names for styles which helps you tighten the feedback loop, which has been my goal in the first place.&lt;/p&gt;

&lt;p&gt;Since using Tailwind is as easy as adding or removing classes, it naturally made it trivial to integrate with.&lt;/p&gt;

&lt;p&gt;If you haven't used Tailwind, this project might be a great reason to try it out. Full-pledged support with auto-completion and other goodies is on its way. &lt;/p&gt;

&lt;h2&gt;
  
  
  What Impulse can do
&lt;/h2&gt;

&lt;p&gt;Since Impulse knows the exact source code that created any given DOM element on the page, it unlocks some powerful features.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Edit classes
&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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8rdrrk6k4a4814295132.gif" 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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8rdrrk6k4a4814295132.gif" alt="Edit styles by adding classes"&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;Use Impulse to add or remove classes from any DOM element, and it will also edit your code.&lt;/p&gt;

&lt;p&gt;With Tailwind, it means that you can style any element without leaving the browser while seeing your changes apply instantly.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Add, move, and remove elements
&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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fceh3n2trwqctsyzo7gu3.gif" 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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fceh3n2trwqctsyzo7gu3.gif" alt="Create a full page with Impulse"&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;With the ability to add styles, this allows you to create whole new UIs without leaving the browser. Again, all of the changes get saved to the source code.&lt;/p&gt;

&lt;p&gt;Oftentimes I'd catch myself spending 30 minutes straight creating new UI in the browser without looking at the code even once. Then, when I do open the code, it's exactly the same code I would have written manually.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Jump to code
&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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F30iv7u6li2f2tdayhsc2.gif" 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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F30iv7u6li2f2tdayhsc2.gif" alt="Jump to code that created the element"&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;The most versatile feature I use on both new and existing projects.&lt;/p&gt;

&lt;p&gt;There are a lot of things Impulse can't do, either conceptually, or just yet.&lt;/p&gt;

&lt;p&gt;Impulse isn't a no-code tool in the sense that it'd discourage you from using your editor. In fact, most things are easier to do with code. Impulse is just trying to fix the boring parts.&lt;/p&gt;

&lt;p&gt;So, every time you do need to switch to your code editor, save yourself some brain cycles by using this feature to instantly jump to the place you are looking for.&lt;/p&gt;

&lt;p&gt;No more mental mapping between which exact code created that &lt;code&gt;&amp;lt;div&amp;gt;&lt;/code&gt; you are staring at.&lt;/p&gt;

&lt;p&gt;No more looking up the classes in Dev Tools to search for them in your code to find that node.&lt;/p&gt;

&lt;p&gt;Just press C.&lt;/p&gt;

&lt;h2&gt;
  
  
  Feedback needed!
&lt;/h2&gt;

&lt;p&gt;So far, I've been trying to create what's been missing from &lt;em&gt;my&lt;/em&gt; world.&lt;/p&gt;

&lt;p&gt;That's not the end goal but a necessary step.&lt;/p&gt;

&lt;p&gt;I want to build what people need.&lt;/p&gt;

&lt;p&gt;The best way one can contribute to Impulse is to give it a try and share honest feedback. :)&lt;/p&gt;

&lt;p&gt;Please, reach out to me directly or join the &lt;a href="https://discord.gg/nDDCyyedbs" rel="noopener noreferrer"&gt;Impulse Discord server&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;If you need help or some onboarding session, I'm happy to jump on the call!&lt;/p&gt;

&lt;p&gt;Website: &lt;a href="https://impulse.dev" rel="noopener noreferrer"&gt;impulse.dev&lt;/a&gt;&lt;br&gt;
Github: &lt;a href="https://github.com/impulse-oss/impulse" rel="noopener noreferrer"&gt;impulse-oss/impulse&lt;/a&gt;&lt;br&gt;
Full 40-minute demo: &lt;a href="https://youtu.be/QaTSsaGXCco" rel="noopener noreferrer"&gt;https://youtu.be/QaTSsaGXCco&lt;/a&gt;&lt;/p&gt;

</description>
      <category>react</category>
      <category>tailwindcss</category>
    </item>
    <item>
      <title>Hacktoberfest 2019: four PRs to Parcel</title>
      <dc:creator>Kirill Rogovoy</dc:creator>
      <pubDate>Tue, 08 Oct 2019 13:04:42 +0000</pubDate>
      <link>https://dev.to/kirillrogovoy/hacktoberfest-2019-four-prs-to-parcel-4e09</link>
      <guid>https://dev.to/kirillrogovoy/hacktoberfest-2019-four-prs-to-parcel-4e09</guid>
      <description>&lt;p&gt;So here it goes — four PRs submitted for this year's challenge!&lt;/p&gt;

&lt;p&gt;It took me several days to find issues of the right size, debug them down, and submit the solutions, but it was worth it. :) &lt;/p&gt;

&lt;p&gt;Honestly, every PR here is quite small, but I'm still satisfied with the impact.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;a href="https://github.com/parcel-bundler/parcel/pull/3608"&gt;Add script href as a viable attribute for dependency detection&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/parcel-bundler/parcel/pull/3610"&gt;CONTRIBUTING.md: add a snippet re: how to run the dev version&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/parcel-bundler/parcel/pull/3616"&gt;Purge dist dirs before bundling&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/parcel-bundler/parcel/pull/3617"&gt;Fix: set pragmafrag for jsx in v2&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;

</description>
      <category>hacktoberfest</category>
      <category>parcel</category>
    </item>
    <item>
      <title>Tracking how much different code is read (literally)</title>
      <dc:creator>Kirill Rogovoy</dc:creator>
      <pubDate>Thu, 13 Jun 2019 18:12:04 +0000</pubDate>
      <link>https://dev.to/kirillrogovoy/tracking-how-much-different-code-is-read-literally-1e4o</link>
      <guid>https://dev.to/kirillrogovoy/tracking-how-much-different-code-is-read-literally-1e4o</guid>
      <description>&lt;p&gt;Hey, hope you are having a great Thursday!&lt;/p&gt;

&lt;p&gt;I've been engaged in various discussions about eliminating tech debt and refactoring stuff out.&lt;/p&gt;

&lt;p&gt;One of the goals of such sessions is to prioritize issues, so we spend our precious refactoring time fixing up the most important stuff.&lt;/p&gt;

&lt;p&gt;A helpful rule for that process is "change code that people work with and read, and don't bother about the code that is read once in a while and is relatively simple even if flawed in some ways."&lt;/p&gt;

&lt;p&gt;This is not the only rule, but definitely a good indicator on what to look at first. At least from my experience.&lt;/p&gt;

&lt;p&gt;But here's &lt;strong&gt;the problem&lt;/strong&gt;. When it comes to debates about which code we read and change more often, most of the process is just &lt;em&gt;guessing&lt;/em&gt;. We try to gauge that from the intuitive context that we have at the moment: recent features, major features, plans, opinions, etc.&lt;/p&gt;

&lt;p&gt;Even though we usually end up with a not very bad estimation, there's really no good way to measure or reflect on that process.&lt;/p&gt;




&lt;p&gt;So it got me thinking: isn't it just a technical problem that we could solve with tools?&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;We could track how much (and how often) different files are changed using history from Git. The data is in front of us, and we would use something similar to &lt;a href="https://github.com/jez/git-heatmap"&gt;https://github.com/jez/git-heatmap&lt;/a&gt; to assess that.&lt;/li&gt;
&lt;li&gt;But point 1 is just half of the story. Wouldn't it be also great to track how much developers &lt;em&gt;read&lt;/em&gt; different parts of the code? This would probably require an editor extension that would track all the cursor movements and jumps + navigation between files — perhaps a trivial thing to code for most of the popular editors. Then we would build a similar heatmap of how the code is read.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Questions:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Is the whole refactoring problem something that you are regularly solving at your organization as well? What's your approach and what are your struggles?&lt;/li&gt;
&lt;li&gt;Would that code navigation tracker be of any use to you? Can you think of a project that can already do that?&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Thanks for reading! Here is a ship-shipping ship, shipping shipping ships&lt;/p&gt;

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

</description>
      <category>discuss</category>
      <category>webdev</category>
      <category>management</category>
    </item>
  </channel>
</rss>
