<?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>Forem: Dmytro Lobanov</title>
    <description>The latest articles on Forem by Dmytro Lobanov (@dmytro_lobanov).</description>
    <link>https://forem.com/dmytro_lobanov</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%2F2200288%2F143d8c91-7ae4-4c8d-af6b-49fa3beb05fb.jpg</url>
      <title>Forem: Dmytro Lobanov</title>
      <link>https://forem.com/dmytro_lobanov</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/dmytro_lobanov"/>
    <language>en</language>
    <item>
      <title>I thought my static site was “fine” until Lighthouse gave me a First Contentful Paint error. It turns out that opacity: 0 on the body breaks things. Here's what I fixed, learned, and how my FCP went from null to 0.2s. #webperf #frontend #css</title>
      <dc:creator>Dmytro Lobanov</dc:creator>
      <pubDate>Sat, 21 Jun 2025 16:33:10 +0000</pubDate>
      <link>https://forem.com/dmytro_lobanov/i-thought-my-static-site-was-fine-until-lighthouse-gave-me-a-first-contentful-paint-error-it-1kli</link>
      <guid>https://forem.com/dmytro_lobanov/i-thought-my-static-site-was-fine-until-lighthouse-gave-me-a-first-contentful-paint-error-it-1kli</guid>
      <description>&lt;div class="ltag__link--embedded"&gt;
  &lt;div class="crayons-story "&gt;
  &lt;a href="https://dev.to/dmytro_lobanov/i-ran-lighthouse-on-my-personal-site-heres-what-i-learned-5hdm" class="crayons-story__hidden-navigation-link"&gt;I Ran Lighthouse on My Personal Site - Here's What I Learned&lt;/a&gt;


  &lt;div class="crayons-story__body crayons-story__body-full_post"&gt;
    &lt;div class="crayons-story__top"&gt;
      &lt;div class="crayons-story__meta"&gt;
        &lt;div class="crayons-story__author-pic"&gt;

          &lt;a href="/dmytro_lobanov" class="crayons-avatar  crayons-avatar--l  "&gt;
            &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F2200288%2F143d8c91-7ae4-4c8d-af6b-49fa3beb05fb.jpg" alt="dmytro_lobanov profile" class="crayons-avatar__image"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
        &lt;div&gt;
          &lt;div&gt;
            &lt;a href="/dmytro_lobanov" class="crayons-story__secondary fw-medium m:hidden"&gt;
              Dmytro Lobanov
            &lt;/a&gt;
            &lt;div class="profile-preview-card relative mb-4 s:mb-0 fw-medium hidden m:inline-block"&gt;
              
                Dmytro Lobanov
                
              
              &lt;div id="story-author-preview-content-2592756" class="profile-preview-card__content crayons-dropdown branded-7 p-4 pt-0"&gt;
                &lt;div class="gap-4 grid"&gt;
                  &lt;div class="-mt-4"&gt;
                    &lt;a href="/dmytro_lobanov" class="flex"&gt;
                      &lt;span class="crayons-avatar crayons-avatar--xl mr-2 shrink-0"&gt;
                        &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F2200288%2F143d8c91-7ae4-4c8d-af6b-49fa3beb05fb.jpg" class="crayons-avatar__image" alt=""&gt;
                      &lt;/span&gt;
                      &lt;span class="crayons-link crayons-subtitle-2 mt-5"&gt;Dmytro Lobanov&lt;/span&gt;
                    &lt;/a&gt;
                  &lt;/div&gt;
                  &lt;div class="print-hidden"&gt;
                    
                      Follow
                    
                  &lt;/div&gt;
                  &lt;div class="author-preview-metadata-container"&gt;&lt;/div&gt;
                &lt;/div&gt;
              &lt;/div&gt;
            &lt;/div&gt;

          &lt;/div&gt;
          &lt;a href="https://dev.to/dmytro_lobanov/i-ran-lighthouse-on-my-personal-site-heres-what-i-learned-5hdm" class="crayons-story__tertiary fs-xs"&gt;&lt;time&gt;Jun 17 '25&lt;/time&gt;&lt;span class="time-ago-indicator-initial-placeholder"&gt;&lt;/span&gt;&lt;/a&gt;
        &lt;/div&gt;
      &lt;/div&gt;

    &lt;/div&gt;

    &lt;div class="crayons-story__indention"&gt;
      &lt;h2 class="crayons-story__title crayons-story__title-full_post"&gt;
        &lt;a href="https://dev.to/dmytro_lobanov/i-ran-lighthouse-on-my-personal-site-heres-what-i-learned-5hdm" id="article-link-2592756"&gt;
          I Ran Lighthouse on My Personal Site - Here's What I Learned
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;div class="crayons-story__tags"&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/webperf"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;webperf&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/css"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;css&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/frontend"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;frontend&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/performance"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;performance&lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="crayons-story__bottom"&gt;
        &lt;div class="crayons-story__details"&gt;
          &lt;a href="https://dev.to/dmytro_lobanov/i-ran-lighthouse-on-my-personal-site-heres-what-i-learned-5hdm" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left"&gt;
            &lt;div class="multiple_reactions_aggregate"&gt;
              &lt;span class="multiple_reactions_icons_container"&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/sparkle-heart-5f9bee3767e18deb1bb725290cb151c25234768a0e9a2bd39370c382d02920cf.svg" width="18" height="18"&gt;
                  &lt;/span&gt;
              &lt;/span&gt;
              &lt;span class="aggregate_reactions_counter"&gt;1&lt;span class="hidden s:inline"&gt; reaction&lt;/span&gt;&lt;/span&gt;
            &lt;/div&gt;
          &lt;/a&gt;
            &lt;a href="https://dev.to/dmytro_lobanov/i-ran-lighthouse-on-my-personal-site-heres-what-i-learned-5hdm#comments" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left flex items-center"&gt;
              Comments


              1&lt;span class="hidden s:inline"&gt; comment&lt;/span&gt;
            &lt;/a&gt;
        &lt;/div&gt;
        &lt;div class="crayons-story__save"&gt;
          &lt;small class="crayons-story__tertiary fs-xs mr-2"&gt;
            3 min read
          &lt;/small&gt;
            
              &lt;span class="bm-initial"&gt;
                

              &lt;/span&gt;
              &lt;span class="bm-success"&gt;
                

              &lt;/span&gt;
            
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;


</description>
      <category>webperf</category>
      <category>css</category>
      <category>frontend</category>
      <category>performance</category>
    </item>
    <item>
      <title>I Ran Lighthouse on My Personal Site - Here's What I Learned</title>
      <dc:creator>Dmytro Lobanov</dc:creator>
      <pubDate>Tue, 17 Jun 2025 12:44:23 +0000</pubDate>
      <link>https://forem.com/dmytro_lobanov/i-ran-lighthouse-on-my-personal-site-heres-what-i-learned-5hdm</link>
      <guid>https://forem.com/dmytro_lobanov/i-ran-lighthouse-on-my-personal-site-heres-what-i-learned-5hdm</guid>
      <description>&lt;p&gt;I finally decided to test my personal website with Lighthouse. It's a simple, static, one-page site, so I always thought, “It’s fine as it is.”&lt;br&gt;
Well… I was wrong.&lt;/p&gt;

&lt;p&gt;When I ran the audit, I didn’t get a shiny report. Instead, I got an error.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.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%2F6uknkbjdr428dv86rxvz.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2F6uknkbjdr428dv86rxvz.png" alt="The lighthouse analisys failed" width="800" height="697"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  First Contentful Paint Error (aka NO_FCP)
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;The page did not paint any content. Please ensure you keep the browser window in the foreground during the load and try again. (NO_FCP)&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Let’s break that down.&lt;/p&gt;

&lt;p&gt;FCP stands for First Contentful Paint and it's the moment something (text, image, etc.) first appears on the screen. It's one of the key metrics Lighthouse uses to measure performance.&lt;/p&gt;

&lt;p&gt;At first, I thought this error was just a fluke, but then I found &lt;a href="https://stackoverflow.com/a/72558529/6498232" rel="noopener noreferrer"&gt;this helpful explanation on StackOverflow&lt;/a&gt;. The issue came from how I was handling page load animations.&lt;/p&gt;

&lt;p&gt;Setting opacity: 0 on the entire body is a bad idea if you care about performance and accessibility.&lt;/p&gt;

&lt;p&gt;Here’s what I had before:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="nt"&gt;Bad&lt;/span&gt; &lt;span class="nt"&gt;idea&lt;/span&gt; &lt;span class="nt"&gt;to&lt;/span&gt; &lt;span class="nt"&gt;set&lt;/span&gt; &lt;span class="nt"&gt;opacity&lt;/span&gt; &lt;span class="nt"&gt;to&lt;/span&gt; &lt;span class="err"&gt;0&lt;/span&gt;
&lt;span class="nt"&gt;body&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;opacity&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;animation&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;fadeIn&lt;/span&gt; &lt;span class="m"&gt;1s&lt;/span&gt; &lt;span class="n"&gt;forwards&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;@keyframes&lt;/span&gt; &lt;span class="n"&gt;fadeIn&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nt"&gt;to&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nl"&gt;opacity&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This makes Lighthouse think nothing is ever painted, which triggers the NO_FCP warning.&lt;/p&gt;

&lt;h3&gt;
  
  
  Fixing It the Right Way
&lt;/h3&gt;

&lt;p&gt;Here’s how I fixed it while keeping the animation and improving accessibility:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="k"&gt;@keyframes&lt;/span&gt; &lt;span class="n"&gt;fadeIn&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="err"&gt;0&lt;/span&gt;&lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c"&gt;/* Start slightly visible to trigger FCP */&lt;/span&gt;
    &lt;span class="nl"&gt;opacity&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;0.01&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="err"&gt;100&lt;/span&gt;&lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nl"&gt;opacity&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c"&gt;/* Only animate if the user hasn't asked for reduced motion */&lt;/span&gt;
&lt;span class="k"&gt;@media&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;prefers-reduced-motion&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;no-preference&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nt"&gt;body&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nl"&gt;opacity&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nl"&gt;animation-name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;fadeIn&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nl"&gt;animation-duration&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;0.6s&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nl"&gt;animation-timing-function&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;ease-in&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nl"&gt;animation-iteration-count&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now the page paints something almost immediately, and animations still work as expected! Here’s the Lighthouse report after the fix. We’re back in business.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.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%2Fluhmxcwfdumg43azh2wa.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2Fluhmxcwfdumg43azh2wa.png" alt="The Lighthouse report with first Contentful Paint is 0.6 seconds" width="800" height="589"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Eliminate Render-Blocking Resources
&lt;/h2&gt;

&lt;p&gt;Next up, Lighthouse complained about render-blocking resources.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.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%2F3aw9t1evc8a5btgoefdv.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2F3aw9t1evc8a5btgoefdv.png" alt="Eliminate render-blocking resources error in the lighthouse report" width="800" height="358"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;My FCP and LCP (Largest Contentful Paint) were both around 0.6s and it's not bad, but I knew I could do better.&lt;/p&gt;

&lt;p&gt;So, I followed this &lt;a href="https://www.filamentgroup.com/lab/load-css-simpler/" rel="noopener noreferrer"&gt;awesome tip from Scott Jehl&lt;/a&gt; and changed how I load fonts:&lt;/p&gt;

&lt;p&gt;In my case, that's not a big deal, but my perfectionism asks me to fix it. So, I found a really elegant solution in the article.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;link&lt;/span&gt; &lt;span class="na"&gt;href=&lt;/span&gt;&lt;span class="s"&gt;"https://fonts.googleapis.com/css2family=Manrope:wght@200..800&amp;amp;family=Sora:wght@100..800&amp;amp;display=swap"&lt;/span&gt;
      &lt;span class="na"&gt;rel=&lt;/span&gt;&lt;span class="s"&gt;"stylesheet"&lt;/span&gt; 
      &lt;span class="na"&gt;media=&lt;/span&gt;&lt;span class="s"&gt;"print"&lt;/span&gt; 
      &lt;span class="na"&gt;onload=&lt;/span&gt;&lt;span class="s"&gt;"this.media='all'"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Fonts now load without blocking rendering, and look at these numbers, much better:&lt;br&gt;
&lt;a href="https://media2.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%2Fic54kro7xspmimhrjk5k.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2Fic54kro7xspmimhrjk5k.png" alt="the report from the lighthouse with First Contentful Paint 0.2 seconds and Largest Contentful Paint 0.4" width="800" height="544"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;And just one more tip:&lt;br&gt;
If you're using custom fonts, consider adding a fallback font in your CSS. Google Fonts no longer blocks rendering, so users might briefly see a different font while the main one loads, especially on slow connections.&lt;/p&gt;

&lt;h2&gt;
  
  
  Final Thoughts
&lt;/h2&gt;

&lt;p&gt;Running Lighthouse wasn’t just about fixing issues - it helped me spot things I never considered. I learned how to make my site faster, more accessible, and more user-friendly.&lt;/p&gt;

&lt;p&gt;Even if your site is 'just a static page,' don’t skip the analysis. There’s always room for improvement and sometimes, it’s surprisingly fun.&lt;/p&gt;

</description>
      <category>webperf</category>
      <category>css</category>
      <category>frontend</category>
      <category>performance</category>
    </item>
    <item>
      <title>The Odin Project experience</title>
      <dc:creator>Dmytro Lobanov</dc:creator>
      <pubDate>Sat, 07 Jun 2025 16:24:16 +0000</pubDate>
      <link>https://forem.com/dmytro_lobanov/the-odin-project-experience-25cj</link>
      <guid>https://forem.com/dmytro_lobanov/the-odin-project-experience-25cj</guid>
      <description>&lt;h2&gt;
  
  
  My Experience Learning with The Odin Project
&lt;/h2&gt;

&lt;p&gt;When I first discovered The Odin Project, I was immediately drawn to the idea behind it: a full, open-source curriculum for learning web development. All the materials are free, open to everyone, and community-driven, and that community has done a tremendous job. It’s rare to find such a solid structure, packed with real projects, completely open and maintained by volunteers.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Makes It Great
&lt;/h2&gt;

&lt;p&gt;Two core ideas make The Odin Project (TOP) stand out to me:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Learning how to learn and staying motivated over the long journey;&lt;/li&gt;
&lt;li&gt;Focusing on principles over tools;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The curriculum is packed with real projects that help solidify your learning. These aren’t toy examples — you build things that resemble real-world applications. That’s a huge motivator and makes the learning process much more satisfying.&lt;/p&gt;

&lt;h2&gt;
  
  
  Things That Could Be Improved (Just My Opinion!)
&lt;/h2&gt;

&lt;p&gt;Now, these are my thoughts, and I might be wrong. But I want to share them in case they spark a discussion.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;The environment setup can be intimidating for total beginners.&lt;/strong&gt;&lt;br&gt;
&lt;a href="https://www.theodinproject.com/lessons/foundations-installations" rel="noopener noreferrer"&gt;https://www.theodinproject.com/lessons/foundations-installations&lt;/a&gt;&lt;br&gt;
While I understand why it’s important to learn these skills early, the process can feel overwhelming and scare away those who are just starting out.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;No public profile to show off your progress or completed projects.&lt;/strong&gt; A profile with links to your portfolio or GitHub could help new developers present themselves better when job-hunting.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Only React is taught as a front-end library.&lt;/strong&gt; I think it would be great to offer an alternative path for Vue.js — not necessarily as a replacement, but as an optional track.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;No CI/CD topics.&lt;/strong&gt; These are essential in modern development workflows, even at the junior level. It would be valuable to add at least basic content about automated testing, deployment pipelines, and GitHub Actions.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  My Advice for Using TOP Projects Effectively
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Revisit previous projects.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;As you learn more, go back and improve older work. It’s a great way to reflect on how far you’ve come.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Don’t try to implement everything. &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Scope creep is real. Set time limits for projects and focus on what you're currently learning. You’ll have plenty of time to polish things later.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Avoid falling into the “build your own framework” trap.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It’s easy to get distracted with side ideas like making your own CSS reset or reinventing the wheel. Keep those ideas on a list for later, and stick to finishing projects.&lt;/p&gt;

&lt;h2&gt;
  
  
  Recommended Prep Before Starting The Odin Project
&lt;/h2&gt;

&lt;p&gt;I recommend going through a few courses first, especially if you're brand new to programming:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.khanacademy.org/computing/computer-science" rel="noopener noreferrer"&gt;Khan Academy – Computer Science&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.udacity.com/enrollment/cs215" rel="noopener noreferrer"&gt;Udacity CS215 – Intro to Programming&lt;br&gt;
&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.coursera.org/specializations/algorithms" rel="noopener noreferrer"&gt;Coursera – Algorithms Specialization&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;These will help you build a mindset for solving problems and understanding how things work under the hood, which is essential for succeeding in TOP.&lt;/p&gt;

&lt;h2&gt;
  
  
  Final Thoughts
&lt;/h2&gt;

&lt;p&gt;Be ready - this is a long journey, and it’s okay if you stop and return a few times. That’s part of the process. I’m a strong believer in continuous learning, and The Odin Project was a fun and enriching experience for me.&lt;/p&gt;

&lt;p&gt;If you’re serious about becoming a web developer and you're willing to put in the time, The Odin Project is one of the best places to start.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.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%2Fb84xrfw54ikne45hrf9p.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2Fb84xrfw54ikne45hrf9p.png" alt="Donate" width="800" height="756"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Support it and you will never get so many pieces of advice for only 5$ &lt;/p&gt;

</description>
      <category>theodinproject</category>
      <category>webdev</category>
      <category>learning</category>
      <category>beginners</category>
    </item>
    <item>
      <title>Workplace Communication</title>
      <dc:creator>Dmytro Lobanov</dc:creator>
      <pubDate>Wed, 11 Dec 2024 23:57:09 +0000</pubDate>
      <link>https://forem.com/dmytro_lobanov/workplace-communication-4c15</link>
      <guid>https://forem.com/dmytro_lobanov/workplace-communication-4c15</guid>
      <description>&lt;ul&gt;
&lt;li&gt;Why Workplace Communication Matters&lt;/li&gt;
&lt;li&gt;Tips to Improve Communication&lt;/li&gt;
&lt;li&gt;Few Go-To Conversation Starters&lt;/li&gt;
&lt;li&gt;Ending a Conversation Positively&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Effective communication is one of the most critical skills in any workplace. It is central to collaboration, relationship building, and achieving goals. For example, if you’re applying for a new job, strong communication skills can set you apart as a valuable team member.&lt;/p&gt;

&lt;p&gt;I will explore the importance of workplace communication and practical ways to enhance your skills.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Workplace Communication Matters
&lt;/h2&gt;

&lt;p&gt;Workplace communication encompasses listening, writing, and interpreting nonverbal cues. Mastering these skills enables you to send and receive messages effectively, leading to several workplace benefits:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Enhanced Collaboration: When you speak clearly, listen attentively, and use the appropriate nonverbal cues, conversations become easier, improving your team’s ability to brainstorm, develop new ideas, and collaborate with one another.&lt;/li&gt;
&lt;li&gt;Stronger Team Cohesion: A team that communicates well is more likely to be on the same page about overall goals and individual responsibilities. Plus, they can reference excellent written documentation to avoid misunderstandings.&lt;/li&gt;
&lt;li&gt;Higher Customer Trust: Building strong client relationships hinges on clear and respectful communication.&lt;/li&gt;
&lt;li&gt;Effective Management: Managers who communicate effectively provide clear directions and better understand their team’s needs and ideas.&lt;/li&gt;
&lt;li&gt;Conflict Resolution: Conflicts happen, but they don’t need to end negatively. Show empathy and remove misunderstandings by sharing carefully constructed messages paired with appropriate verbal and nonverbal signals.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Tips to Improve Communication
&lt;/h2&gt;

&lt;p&gt;Whether you’re having a conversation, participating in a staff meeting, running a presentation, or writing an instant message or email, effective communication skills play a central role in bringing both people and ideas together.&lt;/p&gt;

&lt;h3&gt;
  
  
  Plan Before Action
&lt;/h3&gt;

&lt;p&gt;Organize your thoughts. When you consider your words ahead of time, you’re less likely to say the wrong thing or deliver a confusing message. Before you send a message, give yourself a minute to reread your message.&lt;br&gt;
Use the broad-narrow-broad approach to present your ideas and arguments in a logical structure.&lt;/p&gt;

&lt;h3&gt;
  
  
  Keep Your Message Clear and Concise
&lt;/h3&gt;

&lt;p&gt;Speak slowly and confidently. Speaking clearly is about volume, pace, and pronunciation.&lt;br&gt;
The first question you should ask yourself before starting is, “Why am I writing this?” Effective communication has a defined purpose.&lt;br&gt;
Also, make a clear call to action; if you need your audience to take action, such as to review or make an update, then be direct.&lt;/p&gt;

&lt;h3&gt;
  
  
  Choose Your Medium
&lt;/h3&gt;

&lt;p&gt;Common workplace mediums include one-to-one conversations, meetings, emails, instant messages, and so on. The medium you choose will set the stage for your communication: it can immediately express how formal, urgent, or complex your message is.&lt;/p&gt;

&lt;p&gt;When you’re skilled at sending and receiving verbal, nonverbal, and written messages, you’re likely to improve your workplace performance.&lt;/p&gt;

&lt;h2&gt;
  
  
  Few Go-To Conversation Starters
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Compliment listeners; Everyone enjoys a compliment, especially when it’s about their accomplishments or talents. If you know nothing about the person, compliment them on something you see, such as their taste in clothing or accessories.&lt;/li&gt;
&lt;li&gt;Find common interests; If the person is a stranger, find common ground with a few generic questions. You could ask: “What are your hobbies outside of work?” or “I just hate leaving my dog alone! Do you have any pets?”&lt;/li&gt;
&lt;li&gt;Ask for help; A request for advice can make someone feel important and valued. For instance, you might say: “I have no idea what to do for lunch today. Do you have a favorite restaurant in the area?”&lt;/li&gt;
&lt;li&gt;Talk about where you are; Take a look around you. Is there anything you can comment on? For example, you might say: “This is such a beautiful building. Have you been here before?”&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Ending a Conversation Positively
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Summarize What You’ve Talked About; If a coworker is sharing a story about their weekend, you might say: “That’s a great story! It sounds like you had a pretty exciting weekend.” These types of statements signal that the topic has run its course. They bring your discussion to a natural close.&lt;/li&gt;
&lt;li&gt;Express Appreciation; Show a person that you enjoyed the talk and that you valued their time. Your goal is to help them feel positive about you, the discussion, and themselves. For example, you might say: “I’m so glad we had a chance to catch up!” or “It’s been great chatting with you!”&lt;/li&gt;
&lt;li&gt;Suggest a Future Meeting; This last step is optional, but if you enjoyed talking to the person, suggest a future meeting. It’s much easier to say goodbye to someone you plan to see again.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;If you have any additions or practical advice, I would be grateful if you could share them in the comments. My conclusions are based on the course I completed and are more suitable for people working in unfamiliar or international teams.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Sources:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://ecollege.ie/all-courses/communication-skills-101" rel="noopener noreferrer"&gt;https://ecollege.ie/all-courses/communication-skills-101&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>productivity</category>
      <category>career</category>
    </item>
    <item>
      <title>CS50's Introduction to Computer Science - Week 1 / Notes</title>
      <dc:creator>Dmytro Lobanov</dc:creator>
      <pubDate>Wed, 06 Nov 2024 13:05:48 +0000</pubDate>
      <link>https://forem.com/dmytro_lobanov/cs50s-introduction-to-computer-science-week-1-notes-3k15</link>
      <guid>https://forem.com/dmytro_lobanov/cs50s-introduction-to-computer-science-week-1-notes-3k15</guid>
      <description>&lt;p&gt;&lt;a href="https://manual.cs50.io/" rel="noopener noreferrer"&gt;https://manual.cs50.io/&lt;/a&gt;&lt;br&gt;
Full notes: &lt;a href="https://cs50.harvard.edu/x/2024/notes/1/" rel="noopener noreferrer"&gt;https://cs50.harvard.edu/x/2024/notes/1/&lt;/a&gt;&lt;br&gt;
Practice: &lt;a href="https://cs50.harvard.edu/x/2024/psets/1/" rel="noopener noreferrer"&gt;https://cs50.harvard.edu/x/2024/psets/1/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;To start we should know 3 main keys:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;how to write commands&lt;/li&gt;
&lt;li&gt;how to compile commands&lt;/li&gt;
&lt;li&gt;how to run commands
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;code filename.c // create a file

// compiles the file from our instructions in C and creates an executable file called
make filename

./filename // run
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h2&gt;
  
  
  Building blocks:
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Functions&lt;/li&gt;
&lt;li&gt;Variables&lt;/li&gt;
&lt;li&gt;Conditionals&lt;/li&gt;
&lt;li&gt;Loops&lt;/li&gt;
&lt;li&gt;Operators&lt;/li&gt;
&lt;li&gt;Comments&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
  
  
  Types and format codes
&lt;/h2&gt;

&lt;p&gt;Types refer to the possible data that can be stored within a variable. Types are very important because each type has specific limits.&lt;br&gt;
The number of bits limits how high and low we can count.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;em&gt;bool&lt;/em&gt;, a Boolean expression of either true or false&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;char&lt;/em&gt;, a single character like a or 2 and takes 8 bits(1 byte);&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;double&lt;/em&gt;, a floating-point value with more digits than a float&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;float&lt;/em&gt;, a floating-point value, or real number with a decimal value (32 bits = 4 bytes);&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;int&lt;/em&gt;, integers up to a certain size (always 32 bits = 4 bytes), or number of bits&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;long&lt;/em&gt;, integers with more bits so that they can count higher than an int&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;string&lt;/em&gt;, a string of characters&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;printf&lt;/strong&gt; allows for many format codes, full list &lt;a href="https://manual.cs50.io/3/fprintf" rel="noopener noreferrer"&gt;https://manual.cs50.io/3/fprintf&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;int     %i
float   %f
char    %c
string  %s
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
      <category>cs50</category>
      <category>c</category>
    </item>
    <item>
      <title>CS50's Introduction to Computer Science - Week 0 / Notes</title>
      <dc:creator>Dmytro Lobanov</dc:creator>
      <pubDate>Thu, 31 Oct 2024 15:43:53 +0000</pubDate>
      <link>https://forem.com/dmytro_lobanov/cs50s-introduction-to-computer-science-week-0-notes-48jh</link>
      <guid>https://forem.com/dmytro_lobanov/cs50s-introduction-to-computer-science-week-0-notes-48jh</guid>
      <description>&lt;p&gt;All courses: &lt;a href="https://cs50.harvard.edu/" rel="noopener noreferrer"&gt;https://cs50.harvard.edu/&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  Week 0
&lt;/h1&gt;

&lt;p&gt;Full notes: &lt;a href="https://cs50.harvard.edu/x/2024/notes/0/" rel="noopener noreferrer"&gt;https://cs50.harvard.edu/x/2024/notes/0/&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  How do computers think?
&lt;/h2&gt;

&lt;p&gt;Computers today count using a &lt;strong&gt;binary system&lt;/strong&gt;. From the binary digit, we get a familiar term called &lt;strong&gt;bit (binary digit)&lt;/strong&gt;. A bit is a zero or one: on or off.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;2^3  2^2  2^1  2^0
 8    4    2    1
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Computers generally use eight bits &lt;strong&gt;byte&lt;/strong&gt; to represent a number. For example, 00000101 is the number 5 in binary. 11111111 represents the number 255.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;For example, the letter A was decided to map to the number 65. 01000001 represents the number 65 in binary.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  How do computers understand letters, colors, and music?
&lt;/h2&gt;

&lt;p&gt;Just as numbers are binary patterns of ones and zeros, letters are represented using ones and zeros too!&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;For example, the letter A was decided to map to the number 65. 01000001 represents the number 65 in binary.&lt;br&gt;
&lt;/p&gt;
&lt;/blockquote&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;H   I   !
72  73  33
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Unicode standard expanded the number of bits that can be transmitted and understood by computers. Unicode includes not only special characters but emoji as well.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is an algorithm and pseudocode?
&lt;/h2&gt;

&lt;p&gt;An &lt;strong&gt;algorithm&lt;/strong&gt; is a procedure used for solving a problem or performing a computation.&lt;br&gt;
&lt;strong&gt;Pseudocode&lt;/strong&gt; is a human-readable version of your code&lt;/p&gt;

&lt;p&gt;Example of the pseudocode&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;1 Pick up a phone book
2 Open to the middle of the book
3 If the person on the page
4    Call person
5 Else if the person is earlier in the book
6    Open to the middle of left half of book
7    Go back to line 3
8 Else if the person is later in the book
9    Open to the middle of right half of book
10   Go back to line 3
11 Else 
12   Quit
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;em&gt;Pick up, Open, Call, and Quit&lt;/em&gt; are functions.&lt;br&gt;
&lt;em&gt;If, Else if&lt;/em&gt; are conditions.&lt;br&gt;
&lt;em&gt;the person is earlier in the book, if the person is later in the book&lt;/em&gt; are boolean expressions.&lt;br&gt;
&lt;em&gt;Go back to line 3&lt;/em&gt; is a loop.&lt;/p&gt;




&lt;p&gt;Useful links:&lt;br&gt;
&lt;a href="https://cs50.ai/chat" rel="noopener noreferrer"&gt;https://cs50.ai/chat&lt;/a&gt; - your AI duck tutor&lt;br&gt;
&lt;a href="https://cs50.dev/" rel="noopener noreferrer"&gt;https://cs50.dev/&lt;/a&gt; - Visual Studio Code for CS50&lt;/p&gt;

</description>
      <category>cs50</category>
    </item>
    <item>
      <title>Guide to Free Coding Resources: Courses, Practice, and Community</title>
      <dc:creator>Dmytro Lobanov</dc:creator>
      <pubDate>Tue, 29 Oct 2024 16:32:05 +0000</pubDate>
      <link>https://forem.com/dmytro_lobanov/guide-to-free-coding-resources-courses-practice-and-community-3h5f</link>
      <guid>https://forem.com/dmytro_lobanov/guide-to-free-coding-resources-courses-practice-and-community-3h5f</guid>
      <description>&lt;p&gt;Whether starting or leveling up your skills, you don’t need a big budget to learn coding—just the right resources and a commitment to learning. In this guide, I’ve gathered some of the best free platforms and communities that helped me.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;This article is a WORK IN PROGRESS as I continue discovering new resources and insights. If you have your favorite free platforms, tips, or learning experiences, please share them in the comments! Let’s build a resourceful community together.&lt;br&gt;
??? - means didn't test fully&lt;/p&gt;
&lt;/blockquote&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://www.freecodecamp.org/" rel="noopener noreferrer"&gt;Freecodecamp&lt;/a&gt; - #Certifications, #CoreSkills, #CompletelyFree, #web, #javascript, #react #python, #databases, #c, #english&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.theodinproject.com/" rel="noopener noreferrer"&gt;theodinproject&lt;/a&gt; - #CoreSkills, #CompletelyFree, #web, #javascript, #ruby, #databases, #react&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.codesignal.com" rel="noopener noreferrer"&gt;CodeSignal&lt;/a&gt; - #CoreSkills, #Freemium, #web, #javascript, #interviewprep&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.khanacademy.org/computing" rel="noopener noreferrer"&gt;Khan Academy&lt;/a&gt; - #CoreSkills, #javascript, #sql, #python&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://leetcode.com/" rel="noopener noreferrer"&gt;LeetCode&lt;/a&gt; - #Practice, #javascript, #sql, #python, #prep&lt;/li&gt;
&lt;li&gt;??? &lt;a href="https://frontendmasters.com/courses/#free" rel="noopener noreferrer"&gt;frontendmasters&lt;/a&gt; - #freemium&lt;/li&gt;
&lt;li&gt;??? &lt;a href="https://www.netacad.com/" rel="noopener noreferrer"&gt;CISCO Network Academy&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>beginners</category>
      <category>career</category>
      <category>learning</category>
      <category>resources</category>
    </item>
  </channel>
</rss>
