<?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: Valentin Sawadski (he/him)</title>
    <description>The latest articles on DEV Community by Valentin Sawadski (he/him) (@vsaw).</description>
    <link>https://dev.to/vsaw</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%2F119599%2F39afbc3b-4f2e-404d-81dc-f3208e7bd7f7.jpg</url>
      <title>DEV Community: Valentin Sawadski (he/him)</title>
      <link>https://dev.to/vsaw</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/vsaw"/>
    <language>en</language>
    <item>
      <title>Hardware 101 - CPUs, Cores and Threads</title>
      <dc:creator>Valentin Sawadski (he/him)</dc:creator>
      <pubDate>Mon, 26 Sep 2022 14:09:51 +0000</pubDate>
      <link>https://dev.to/vsaw/hardware-101-cpus-cores-and-threads-2mhg</link>
      <guid>https://dev.to/vsaw/hardware-101-cpus-cores-and-threads-2mhg</guid>
      <description>&lt;p&gt;In this post, I'm going to give you a beginner friendly introduction into how modern CPUs (Intel, Apple, AMD, ARM, etc.) work.&lt;/p&gt;

&lt;h2&gt;
  
  
  CPUs
&lt;/h2&gt;

&lt;p&gt;Let's start with the CPU. The CPU is often referred to as the "Brain" of your computer, but what does this mean? The CPU does most of the computation on your computer. It runs your Web browser, Office etc. Basically everything except Graphics &amp;amp; Machine Learning, this usually runs on the GPU. The difference between the CPU and GPU is that the CPU is "good" for a generic computing. The GPU is a highly specialized chip which is GREAT for certain tasks like Graphics &amp;amp; Machine Learning, but also much more expensive. Other then than the Brain, neither the CPU nor the GPU actually store any data. They just fetch it from memory, process it (e.g. math calculations) and write it back to memory.&lt;/p&gt;

&lt;p&gt;A CPU has multiple parts, &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;a "Core" that does the computation&lt;/li&gt;
&lt;li&gt;a "Cache" which you can imagine like super small but super fast RAM&lt;/li&gt;
&lt;li&gt;and a Memory I/O so that me CPU can read and write from RAM and your hard drive.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Cores
&lt;/h2&gt;

&lt;p&gt;In the beginning each CPU had only one "Core" but modern CPUs have multiple cores. For example, I'm writing this post on an 2 GHz Intel i5 CPU with 4 cores. Other CPUs like the AMD Ryzen 7950x have 16 cores!&lt;/p&gt;

&lt;p&gt;But what does it mean if a CPU has more cores? Can it then "do more" as well? Yes, and No. Assume we have two identical Computers, one with 16 cores and one with 4 cores. Are there programs that the 4 core CPU can't run? No. If there are more tasks then cores, your OS will "time share". "Time Share" is when two or more programs share the use of a Core. Time slots are super small, &amp;lt; 1ms per program, so that programs switch all the time, making it seem to humans as if they are running in parallel, when in fact they are running sequentially. This is a normal thing to do for computers. E.g. My computer has 4 cores, but I have 7 programs running. (+ 500 more processes running in the background). So more cores will not allow you to do "more" things. They just allow you to run more things truly parallel.&lt;/p&gt;

&lt;p&gt;So how many cores do you need? This depends on the type of Software you are using. Computationally intensive application like gaming, or math simulations etc. may run faster if you CPUs with more Cores. Still CPUs with less cores do fine most of the time. As I said, my laptop has only 4 cores, and they are idle 80% of the time while I write this Post.&lt;/p&gt;

&lt;h2&gt;
  
  
  Threads
&lt;/h2&gt;

&lt;p&gt;Modern Cores have a special feature called "Multi-Threading". To explain this we first need to understand what "Processes" and "threads" are.&lt;/p&gt;

&lt;p&gt;Examples of Processes are your Music Player App and your Email-App. Processes can run in parallel and should be strictly separated by the Operating System and Hardware. We don't want the Email-App to mess up the Music Player or the other way around.&lt;/p&gt;

&lt;p&gt;But looking at the Music player there is "parallel" computing going on in the Music player itself. You can keep listening the the music while the User Interface reacts to your input while you browse your library. This is done by using multiple "Threads" which run inside the Music Player process. One thread keeps playing the music, while the other thread takes care of the user interface. Inside the Music Player we want Threads to be able to exchange information easily, so the player starts playing a new song as soon as you double click it.&lt;/p&gt;

&lt;p&gt;As threads are quite common, modern CPU Cores have Hardware Support for it, called Multithreading.&lt;/p&gt;

&lt;h2&gt;
  
  
  More Cores &amp;amp; Threads != More Performance
&lt;/h2&gt;

&lt;p&gt;Multi-core CPUs and Multithreading can increase performance of your computer, but only if you use them right.&lt;/p&gt;

&lt;p&gt;Imagine a highway&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;CPU clock speed = speed limit&lt;/li&gt;
&lt;li&gt;Cores/Threads = Amount of Lanes&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Adding a core/thread potentially allows more cars to go through in parallel. But it’s not going to make the individual car go faster. The overall throughput then depends on your “traffic”. Have loads of individual cars? More cores can help. Need to get one single car from A to B? Then no.&lt;/p&gt;

&lt;p&gt;By default processes start with a single thread. It's up to the programmer to write programs that create child processes or multiple threads so they can take advantage of multi-core and multithread CPUs.&lt;/p&gt;

&lt;p&gt;Once you have implemented threading in your program, a piece of the Operating System called the "Scheduler" will take over. Each modern operating system has a "Scheduler" which decides which process and thread gets executed next, based on available CPU resources and their priority. For example with our Music player app, we need the Thread playing the music to have high priority, otherwise the sound comes out choppy. For the User Interface however we could use a lower priority, because worst case it takes a few milliseconds longer to load, but users will not mind this as much.&lt;/p&gt;

&lt;h2&gt;
  
  
  Summary
&lt;/h2&gt;

&lt;p&gt;I hope this little summary helps you to understand the differences between CPUs, Cores and Threads! If you still have some questions or would like to learn more drop me a question in the comments!&lt;/p&gt;




&lt;p&gt;&lt;em&gt;This a longer, more readable version of a Thread I posted on Twitter recently. I don't always find the time to post all of my Twitter threads on Dev.To, so follow me on Twitter &lt;a href="https://twitter.com/_vsaw"&gt;@_vsaw&lt;/a&gt; if you don't want to miss out on anything!&lt;/em&gt;&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---_m2XUYX--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://pbs.twimg.com/profile_images/861644752311263232/AC1BvP7f_normal.jpg" alt="Valentin Sawadski (he/him) profile image"&gt;
      &lt;div class="ltag__twitter-tweet__full-name"&gt;
        Valentin Sawadski (he/him)
      &lt;/div&gt;
      &lt;div class="ltag__twitter-tweet__username"&gt;
        @_vsaw
      &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;
      Recently this thread trying to explain modern CPUs popped up in my feed and it got so many things wrong!&lt;br&gt;&lt;br&gt;So here's a fact checked correct version of how CPUs and Cores &amp;amp; Multithreading REALLY works! &lt;a href="https://t.co/6eMoF548i2"&gt;twitter.com/DThompsonDev/s…&lt;/a&gt;
    &lt;/div&gt;
    &lt;div class="ltag__twitter-tweet__date"&gt;
      16:28 PM - 23 Sep 2022
    &lt;/div&gt;

      &lt;div class="ltag__twitter-tweet__quote"&gt;
        &lt;div class="ltag__twitter-tweet__quote__header"&gt;
          &lt;span class="ltag__twitter-tweet__quote__header__name"&gt;
            Danny Thompson
          &lt;/span&gt;
          &lt;a class="mentioned-user" href="https://dev.to/dthompsondev"&gt;@dthompsondev&lt;/a&gt;
        &lt;/div&gt;
        What is a CPU?
What are Cores?
What is threading and multi-threading?

Lately I have been learning about hardware and about to build a PC but found myself completely confused! So I've spent a ton of time learning about hardware!

Here is your beginner crash course in CPU chips!
      &lt;/div&gt;

    &lt;div class="ltag__twitter-tweet__actions"&gt;
      &lt;a href="https://twitter.com/intent/tweet?in_reply_to=1573348707902300161" 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=1573348707902300161" 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=1573348707902300161" 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;


</description>
      <category>beginners</category>
      <category>hw</category>
      <category>todayilearned</category>
      <category>hardware</category>
    </item>
    <item>
      <title>Not Documented, not Done!</title>
      <dc:creator>Valentin Sawadski (he/him)</dc:creator>
      <pubDate>Wed, 15 Jun 2022 15:45:02 +0000</pubDate>
      <link>https://dev.to/vsaw/not-documented-not-done-4f3n</link>
      <guid>https://dev.to/vsaw/not-documented-not-done-4f3n</guid>
      <description>&lt;p&gt;"Not Documented, not Done!" is probably my most used comment in Jira &amp;amp; GitHub as a CTO and engineering leader 🙄&lt;/p&gt;

&lt;p&gt;I hate writing it. But at the same time I'm absolutely convinced that documenting tasks results is amongst the most valuable documentation you can write.&lt;/p&gt;

&lt;p&gt;Not documenting task results will have many negative consequences. Without Documentation, People not directly involved with the task will not know&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;if the task got finished, aborted, skipped?&lt;/li&gt;
&lt;li&gt;where to find the results of the tasks?&lt;/li&gt;
&lt;li&gt;how it relates to other tasks?&lt;/li&gt;
&lt;li&gt;etc.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;All of which is going to be very important to know as the team grows and will be collaborating with many people on multiple tasks at the same time.&lt;/p&gt;

&lt;p&gt;It's also going to be a treasure trove of "undocumented behavior" as Repositories can grow to thousands of issues over the years.&lt;/p&gt;

&lt;p&gt;Any old bug report, can either be a source of knowledge on what was tried to fix the bug and decisions on why a bug was "not fixed". Or it can just be a "closed" ticket, leaving you puzzled about what happened and wondering if that's somehow related to your current task.&lt;/p&gt;

&lt;p&gt;Therefore I recommend everyone to add short comment covering the following whenever they close an Issue&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;What was the outcome?&lt;/li&gt;
&lt;li&gt;Are there any links to results, documents etc you can add?&lt;/li&gt;
&lt;li&gt;Are there follow up tasks or open points that are being tracked in separate issues?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Biggest challenge in being "documentation police" is making that team members are not feeling checked up on, or otherwise offended. I usually resolve these tensions in a 1:1, ensuring that this is about the documentation and not about reviewing the quality of work.&lt;/p&gt;

</description>
      <category>career</category>
      <category>writing</category>
      <category>management</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Watching videos on 720p instead of 1080p cuts the energy consumption of your phone in half!</title>
      <dc:creator>Valentin Sawadski (he/him)</dc:creator>
      <pubDate>Thu, 21 Apr 2022 10:03:26 +0000</pubDate>
      <link>https://dev.to/vsaw/watching-videos-on-720p-instead-of-1080p-cuts-the-energy-consumption-of-your-phone-in-half-1b49</link>
      <guid>https://dev.to/vsaw/watching-videos-on-720p-instead-of-1080p-cuts-the-energy-consumption-of-your-phone-in-half-1b49</guid>
      <description>&lt;p&gt;I just stumbled upon this &lt;a href="https://s2group.cs.vu.nl/2022-01-05-green-lab-experiment/" rel="noopener noreferrer"&gt;"The impact of video quality on energy efficiency and network usage for video streaming applications on Android"&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;According to their research the energy savings are significant!&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%2Fs2group.cs.vu.nl%2Ffiles%2Fposts%2Fimages_energy_android_experiment%2FY_con.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fs2group.cs.vu.nl%2Ffiles%2Fposts%2Fimages_energy_android_experiment%2FY_con.png" alt="A graph that shows the estimates of the power consumption during video plays on Youtube with 360p, 480p, 720p and 1080p."&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Makes me wonder if I can somehow fix it to 720p on all me devices (especially since my phone's display does not support 1080p natively and would have to downsize the image anyway).&lt;/p&gt;

&lt;p&gt;Also last week I stumbled upon a paper which said that &lt;a href="https://dev.to/_vsaw/do-you-use-caching-in-your-cicd-pipelines-m7o"&gt;only ~20% of GitHub Actions use Caching&lt;/a&gt;, which makes me wonder how much low hanging fruit is out there that we can use the make SW more energy efficient and performant!&lt;/p&gt;

</description>
      <category>performance</category>
      <category>mobile</category>
      <category>energy</category>
      <category>streaming</category>
    </item>
    <item>
      <title>Do you use caching in your CI/CD pipelines?</title>
      <dc:creator>Valentin Sawadski (he/him)</dc:creator>
      <pubDate>Sat, 16 Apr 2022 14:14:14 +0000</pubDate>
      <link>https://dev.to/vsaw/do-you-use-caching-in-your-cicd-pipelines-m7o</link>
      <guid>https://dev.to/vsaw/do-you-use-caching-in-your-cicd-pipelines-m7o</guid>
      <description>&lt;p&gt;According to &lt;a href="https://mairieli.com/files/papers/MSR2021.pdf" rel="noopener noreferrer"&gt;this study&lt;/a&gt; only ~20% of GitHub actions use caching to speed up builds! 🤯&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%2Fb7yyj6nituj5aibecyhc.jpeg" 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%2Fb7yyj6nituj5aibecyhc.jpeg" alt="Only 1729 out of 7962 projects use caching"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Seems incredibly low and wasteful to me, so I was wondering. How many of you don’t use caching in their projects? And what are the reasons why not? &lt;/p&gt;

</description>
      <category>discuss</category>
      <category>ci</category>
      <category>cd</category>
      <category>devops</category>
    </item>
    <item>
      <title>Handle scope changes without coming across as a naysayer 🙌</title>
      <dc:creator>Valentin Sawadski (he/him)</dc:creator>
      <pubDate>Tue, 28 Dec 2021 17:37:01 +0000</pubDate>
      <link>https://dev.to/vsaw/handle-scope-changes-without-coming-across-as-a-naysayer-2p05</link>
      <guid>https://dev.to/vsaw/handle-scope-changes-without-coming-across-as-a-naysayer-2p05</guid>
      <description>&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--ovHWjnGN--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://imgs.xkcd.com/comics/tasks.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--ovHWjnGN--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://imgs.xkcd.com/comics/tasks.png" alt="XKCD Comic Strip Showing a Product Manager and Developer, talking about introducing scope changes to a Software" width="267" height="448"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Sooner or later, every developer finds themselves in this situation where "simple" scope changes are introduced in the project. Instead of saying "No!" to those changes, let’s learn some communication skills today: &lt;strong&gt;Here are 3 things software developers can do to handle scope changes without coming across as a naysayer 🙌&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  1️⃣ Assume they don’t know what is easy/hard
&lt;/h2&gt;

&lt;p&gt;For outsiders in any field it is very difficult to estimate effort it takes. E.g. I don’t know what things are easy/hard to do in an average biology lab 🤷‍♂️&lt;/p&gt;

&lt;p&gt;Software is the same for non-developers. So cut them some slack, and explain what parts are easy/hard to do. Most of the time that helps them to rephrase their request into something you can implement more easily. &lt;/p&gt;

&lt;h2&gt;
  
  
  2️⃣ Understand the problem and propose a different solution
&lt;/h2&gt;

&lt;p&gt;In the XKCD example above try to understand why birds? Ask them about the confidence they need? Most of the time, having a thorough understanding of the problem allows you to come up with simple alternative solutions that will provide 80% of the value with 20% implementation effort&lt;/p&gt;

&lt;h2&gt;
  
  
  3️⃣ Explain your capacity
&lt;/h2&gt;

&lt;p&gt;If you know the effort it takes to implement, don’t  just add it to your backlog, instead show your capacity and backlog to them.&lt;/p&gt;

&lt;p&gt;By looking at your capacity and backlog together you can visualize what you are currently working on and explain that, in order to do the new thing, you will need to remove something else. This is better then just saying “we don’t have time” because it gives the other person the option to make a trade off and reprioritize, while still protecting your workload.&lt;/p&gt;

&lt;p&gt;However, in my experience, most of the time the new request get dropped as the things in your backlog are more important 😉&lt;/p&gt;

&lt;p&gt;Image Credits: &lt;a href="https://xkcd.com/1425/"&gt;XKCD&lt;/a&gt;&lt;/p&gt;

</description>
      <category>career</category>
      <category>management</category>
      <category>communication</category>
      <category>softskills</category>
    </item>
    <item>
      <title>A short story about the dark side of being a founder and how insecure I was with Job Titles</title>
      <dc:creator>Valentin Sawadski (he/him)</dc:creator>
      <pubDate>Sun, 08 Aug 2021 09:38:01 +0000</pubDate>
      <link>https://dev.to/vsaw/a-short-story-about-the-dark-side-of-being-a-founder-and-how-insecure-i-was-with-job-titles-c0p</link>
      <guid>https://dev.to/vsaw/a-short-story-about-the-dark-side-of-being-a-founder-and-how-insecure-i-was-with-job-titles-c0p</guid>
      <description>&lt;p&gt;I used to be obsessed with Job Titles. It was very hard to have an honest conversation with me about roles and responsibilities in the founding/management team. I simply had to have that C-Title. But I did not really know why 🤷‍♂️&lt;/p&gt;

&lt;p&gt;This meant that I was blind to make good decisions on management responsibilities, because I always kept thinking about myself and not about the companies best interest. Looking back, that is one of the clearest signs of a dysfunctional management team. And it was my fault!&lt;/p&gt;

&lt;p&gt;And it wasn’t until a year later, when I had drinks with someone that I realized why: My social life depended on it! He wasn’t meeting me because of “me”, he was meeting me because of my C-Title! For him it was networking, for me it was more than that!&lt;/p&gt;

&lt;p&gt;And it dawned on me how much I had neglected my social life over the past years! And instead of having friends and family around me I took my sense of belonging and self worth from my job and title.&lt;/p&gt;

&lt;p&gt;Feeling lost inside I needed to reorient my inner compass. What worked for me was diving into Philosophy, especially &lt;a href="https://en.wikipedia.org/wiki/Th%C3%ADch_Nh%E1%BA%A5t_H%E1%BA%A1nh"&gt;Thich Nhat Hanh&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;What I learned from him is the concept of “interbeing” which in essence says it’s hard to draw the line between you and your environment as you are not constant but at all time changing, because of your breathing, metabolising, essentially consuming your surroundings.&lt;/p&gt;

&lt;p&gt;And if it’s so hard to actually define what "you" are, because you are constantly changing (literally speaking!), then why worry about your ego and title? Instead, isn’t it better to think about the part you play in your environment?&lt;/p&gt;

&lt;p&gt;Now instead of titles, I focus on one question: &lt;em&gt;How can I be helpful?&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;I’m constantly looking for the role that I can contribute the most and try to set up things in way to achieve the best outcome, which might be by removing myself from the equations. And that's okay!&lt;/p&gt;

&lt;p&gt;Which does not mean that sometimes these old feelings won’t come back. But at least this time it’s easier for me to recognize them and not get blindsided again.&lt;/p&gt;

&lt;p&gt;And when those feelings come back, I try to take a break and reach out to people who care about my happiness more then about my job, to ground myself put things into perspective again.&lt;/p&gt;

&lt;p&gt;Or hang out with dogs. They're always happy to see you as long as you give them attention (and snacks) 😉&lt;/p&gt;

&lt;p&gt;If all of this sounds familiar and you’d love to talk some more. Comment, or for a more private discussion reach out to me on &lt;a href="https://twitter.com/_vsaw"&gt;Twitter&lt;/a&gt;. My DMs are open!&lt;/p&gt;

</description>
      <category>career</category>
      <category>mentalhealth</category>
      <category>startup</category>
      <category>productivity</category>
    </item>
    <item>
      <title>What's the difference between a Developer and a CTO?</title>
      <dc:creator>Valentin Sawadski (he/him)</dc:creator>
      <pubDate>Fri, 06 Aug 2021 10:17:29 +0000</pubDate>
      <link>https://dev.to/vsaw/what-s-the-difference-between-a-developer-and-a-cto-pe</link>
      <guid>https://dev.to/vsaw/what-s-the-difference-between-a-developer-and-a-cto-pe</guid>
      <description>&lt;p&gt;In my opinion it can be summarised like this:&lt;/p&gt;

&lt;p&gt;Dev: Technology is key!&lt;br&gt;
CTO: Technology is a tool!&lt;/p&gt;

&lt;p&gt;Don't get me wrong, it's important to be good at your craft, but in the end you will not be measured by how clean your code is, but by achieving your companies goals!&lt;/p&gt;

&lt;p&gt;Or how would you describe the difference?&lt;/p&gt;

</description>
      <category>discuss</category>
      <category>management</category>
      <category>career</category>
    </item>
    <item>
      <title>Improve your memory management skills with Linked Lists 🔗</title>
      <dc:creator>Valentin Sawadski (he/him)</dc:creator>
      <pubDate>Tue, 03 Aug 2021 09:28:29 +0000</pubDate>
      <link>https://dev.to/vsaw/improve-your-memory-management-skills-with-linked-lists-2o8d</link>
      <guid>https://dev.to/vsaw/improve-your-memory-management-skills-with-linked-lists-2o8d</guid>
      <description>&lt;p&gt;In Embedded C, memory management was one of the hardest things about software development for me to master. I was constantly struggling trying to figure out buffer sizes and access to shared memory.&lt;/p&gt;

&lt;p&gt;Until I learned about "Embedded Linked Lists"! They were a real game changer!&lt;/p&gt;

&lt;h2&gt;
  
  
  Linked Lists
&lt;/h2&gt;

&lt;p&gt;Before we start here's a little refresher from &lt;a href="https://en.wikipedia.org/wiki/Linked_list"&gt;Wikipedia&lt;/a&gt; (with a few changes to make it sound more "C like")&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--0ONAKv1U--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://upload.wikimedia.org/wikipedia/commons/thumb/6/6d/Singly-linked-list.svg/1280px-Singly-linked-list.svg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--0ONAKv1U--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://upload.wikimedia.org/wikipedia/commons/thumb/6/6d/Singly-linked-list.svg/1280px-Singly-linked-list.svg.png" alt="Linked List" width="800" height="81"&gt;&lt;/a&gt;&lt;br&gt;
A linked list [is a &lt;code&gt;struct&lt;/code&gt; with] two fields: a value and a [pointer] to the next node. The last node is linked to [&lt;code&gt;NULL&lt;/code&gt;] used to signify the end of the list.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Linked Lists have the big advantage that they do not need a pre-allocated big block of memory. Instead, Linked Lists can be&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;spread across memory locations&lt;/li&gt;
&lt;li&gt;dynamically allocated&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;But even with static memory as often used in Embedded C, Linked Lists are very useful.&lt;/p&gt;

&lt;h2&gt;
  
  
  A simple HTTP client
&lt;/h2&gt;

&lt;p&gt;Let's look at an HTTP client for example, which can only do one request at a time and should therefore queue pending requests.&lt;/p&gt;

&lt;p&gt;But: How long should the queue be? 🤔&lt;br&gt;
Enter: Linked Lists! 💡&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight c"&gt;&lt;code&gt;&lt;span class="c1"&gt;// http_client.h&lt;/span&gt;

&lt;span class="cm"&gt;/**
 * Do a HTTP GET on the given request
 *
 * Params:
 * - new_request: A struct with the Request data
 *   (URL, custom header fields, etc)
 *
 * Returns:
 * - 0 if the request was accepted and started immediately 
 * - 1 if the request was queued
 * - &amp;lt; 0 on error
 */&lt;/span&gt;
&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="nf"&gt;http_get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;struct&lt;/span&gt; &lt;span class="n"&gt;http_request&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;new_request&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Embedding Linked Lists into &lt;code&gt;struct http_request&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;The trick to using linked lists in Embedded C is putting the pointer to the next node inside your struct. That way the applications must take care of the memory management and no more guessing on the side of the HTTP client 🙌&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight c"&gt;&lt;code&gt;&lt;span class="c1"&gt;// http_client.h&lt;/span&gt;

&lt;span class="cm"&gt;/** 
 * A struct that contains all the data 
 * for the HTTP request such as the URL 
 */&lt;/span&gt;
&lt;span class="k"&gt;struct&lt;/span&gt; &lt;span class="n"&gt;http_request&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="cm"&gt;/** A pointer to the next HTTP request to perform */&lt;/span&gt;
    &lt;span class="k"&gt;struct&lt;/span&gt; &lt;span class="n"&gt;http_request&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;next_request&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="cm"&gt;/** The URL to GET */&lt;/span&gt;
    &lt;span class="kt"&gt;char&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="c1"&gt;// ...&lt;/span&gt;
    &lt;span class="c1"&gt;// Other field omitted for brevity&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Handling the request list in &lt;code&gt;http_get&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;Inside the HTTP client you keep a reference to the start of the list and simply add every new request to the end of the list&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight c"&gt;&lt;code&gt;&lt;span class="c1"&gt;// http_client.c&lt;/span&gt;

&lt;span class="cm"&gt;/** 
 * A pointer to the current HTTP request or NULL if 
 * no request is pending
 */&lt;/span&gt;
&lt;span class="k"&gt;static&lt;/span&gt; &lt;span class="k"&gt;struct&lt;/span&gt; &lt;span class="n"&gt;http_request&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;current_request&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="nf"&gt;http_get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;struct&lt;/span&gt; &lt;span class="n"&gt;http_request&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;new_request&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// Check if we have an ongoing HTTP request&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;NULL&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="n"&gt;current_request&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="c1"&gt;// We have a request ongoing and will add the&lt;/span&gt;
        &lt;span class="c1"&gt;// new request to the end of the list&lt;/span&gt;
        &lt;span class="k"&gt;struct&lt;/span&gt; &lt;span class="n"&gt;http_request&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;req&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;current_request&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="k"&gt;while&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;NULL&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="n"&gt;req&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;next_request&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;req&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;req&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;next_request&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="n"&gt;req&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;next_request&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;new_request&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="c1"&gt;// No ongoing HTTP request, can start with current_request&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;When the current request has finished, simply take the next item from the list until all requests are complete.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight c"&gt;&lt;code&gt;&lt;span class="c1"&gt;// http_client.c&lt;/span&gt;

&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="nf"&gt;http_get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;struct&lt;/span&gt; &lt;span class="n"&gt;http_request&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;new_request&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// ...&lt;/span&gt;

    &lt;span class="c1"&gt;// Finished current HTTP request,&lt;/span&gt;
    &lt;span class="c1"&gt;// check if there is another one queued&lt;/span&gt;
    &lt;span class="n"&gt;current_request&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;current_request&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;next_request&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;NULL&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="n"&gt;current_request&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="c1"&gt;// Have an HTTP request queued, start with it now&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;p&gt;And that's it. This simple but effective method allows you to write a powerfull queueing mechanism without any memory overhead.&lt;br&gt;
If you are interested in seeing real world use of Linked Lists in Embedded Operating systems you can find them for Example in &lt;a href="https://github.com/contiki-os/contiki/blob/32b5b17f674232867c22916bb2e2534c8e9a92ff/core/lib/list.h"&gt;Contiki OS&lt;/a&gt; and &lt;a href="https://github.com/contiki-ng/contiki-ng/search?q=list_struct"&gt;Contiki-NG&lt;/a&gt; (and I'm pretty sure if I knew the &lt;a href="https://www.zephyrproject.org/"&gt;Zephyr&lt;/a&gt; code base better I would find it there as well Winking face)&lt;/p&gt;

&lt;p&gt;Thanks for making it this far! If you learned something from this, consider following me for more IoT, and Embedded Software development content here and an &lt;a href="https://twitter.com/_vsaw"&gt;Twitter&lt;/a&gt;! 👋&lt;/p&gt;

&lt;p&gt;Cover Image by &lt;a href="https://commons.wikimedia.org/wiki/File:Intel_8742_153056995.jpg"&gt;Ioan Sameli&lt;/a&gt;&lt;/p&gt;

</description>
      <category>microcontroller</category>
      <category>c</category>
      <category>programming</category>
      <category>memory</category>
    </item>
    <item>
      <title>How much time should you spend on lowering your Bill of Materials? 📉🤔</title>
      <dc:creator>Valentin Sawadski (he/him)</dc:creator>
      <pubDate>Sat, 17 Jul 2021 11:06:52 +0000</pubDate>
      <link>https://dev.to/vsaw/how-much-time-should-you-spend-on-lowering-your-bill-of-materials-1fjh</link>
      <guid>https://dev.to/vsaw/how-much-time-should-you-spend-on-lowering-your-bill-of-materials-1fjh</guid>
      <description>&lt;p&gt;👉 tl/dr; Lower the BOM only to the point where you have a comfortable profit margin. Going lower than that is probably not worth it because of low production volumes, higher burn and longer time to market. 👈&lt;/p&gt;

&lt;p&gt;When looking at your Bill of Materials (BOM), I believe it's best to always put it into comparison with your profit margins. This will help you establish a "Max BOM" line. The number depends on a lot of different things like your business model and price, but rule of thumb for non-subscriptions models is at least: Price &amp;gt; 2x BOM&lt;/p&gt;

&lt;p&gt;If you're above that "Max BOM" line, you'll need to figure out a way to either raise the price or lower your BOM. But we're going to focus on why it's not worth to go lower, with a small back of the envelope calculation:&lt;/p&gt;

&lt;p&gt;Assume you are are startup close to start production of your first batch, and then someone proposes to replace a few parts and save some money!&lt;/p&gt;

&lt;p&gt;Production Volume: 5k pcs&lt;br&gt;
BOM reduction: 10 EUR / piece&lt;br&gt;
=&amp;gt;💰💰💰 50k EUR savings! 💰💰💰&lt;/p&gt;

&lt;p&gt;Now that's a lot of money for a startup! ..... Except when you take implementation effort into account. Last minute HW changes can easily delay the timeline for 2 months, because you'll need&lt;/p&gt;

&lt;p&gt;~1 month to implement the new changes&lt;br&gt;
~1 month to build new prototypes and make sure everything still works&lt;/p&gt;

&lt;p&gt;If you take your burn rate into account, it could easily be that you burn &amp;gt;25k EUR per Month in salaries, tools, prototypes etc.&lt;/p&gt;

&lt;p&gt;Compare this with your potential savings of 50k and you'll lose money in the end! Not to mention the 2 months sales revenue you miss out on! 😉&lt;/p&gt;

&lt;p&gt;Therefore cost saving projects only start paying off when you've reached higher production volumes.&lt;/p&gt;

&lt;p&gt;So, be careful when implementing cost saving projects early in your companies life. Most of the time your resources are better spent focusing on growing your revenue. 📈&lt;/p&gt;

&lt;p&gt;How do you manage your BOM and cost-cutting initiatives?&lt;/p&gt;

&lt;p&gt;Image Credits: &lt;a href="https://commons.wikimedia.org/wiki/File:Bill_of_Materials.jpg"&gt;NathanMinnick58&lt;/a&gt;&lt;/p&gt;

</description>
      <category>iot</category>
      <category>startup</category>
      <category>management</category>
      <category>discuss</category>
    </item>
    <item>
      <title>The things we can do to write better emails, slack messages, etc.</title>
      <dc:creator>Valentin Sawadski (he/him)</dc:creator>
      <pubDate>Sun, 18 Oct 2020 14:13:32 +0000</pubDate>
      <link>https://dev.to/vsaw/the-things-we-can-do-to-write-better-emails-slack-messages-etc-2nj8</link>
      <guid>https://dev.to/vsaw/the-things-we-can-do-to-write-better-emails-slack-messages-etc-2nj8</guid>
      <description>&lt;p&gt;We've all seen posts like these about the increase of writing skills&lt;/p&gt;

&lt;p&gt;&lt;iframe class="tweet-embed" id="tweet-1317560458199617538-705" src="https://platform.twitter.com/embed/Tweet.html?id=1317560458199617538"&gt;
&lt;/iframe&gt;

  // Detect dark theme
  var iframe = document.getElementById('tweet-1317560458199617538-705');
  if (document.body.className.includes('dark-theme')) {
    iframe.src = "https://platform.twitter.com/embed/Tweet.html?id=1317560458199617538&amp;amp;theme=dark"
  }



&lt;/p&gt;

&lt;p&gt;While I fully agree that written communication is becoming extremely more important in remote and async work. I found no good post on how to improve your writing skills.&lt;/p&gt;

&lt;p&gt;So I decided to share with you what I've learned so far and hope to pick up a few things from the comments.&lt;/p&gt;

&lt;h1&gt;
  
  
  Getting to know your medium
&lt;/h1&gt;

&lt;p&gt;Before we get into tips and tricks, I found it important to understand the different aspects of text.&lt;/p&gt;

&lt;p&gt;The upsides are best summarized in this tweet&lt;/p&gt;

&lt;p&gt;&lt;iframe class="tweet-embed" id="tweet-571928034426552320-250" src="https://platform.twitter.com/embed/Tweet.html?id=571928034426552320"&gt;
&lt;/iframe&gt;

  // Detect dark theme
  var iframe = document.getElementById('tweet-571928034426552320-250');
  if (document.body.className.includes('dark-theme')) {
    iframe.src = "https://platform.twitter.com/embed/Tweet.html?id=571928034426552320&amp;amp;theme=dark"
  }



&lt;/p&gt;

&lt;p&gt;On the other hand, the async nature of text comes with its limitations: You can not...&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;control when your text will be read&lt;/li&gt;
&lt;li&gt;how much attention it is given&lt;/li&gt;
&lt;li&gt;control how your text will be interpreted&lt;/li&gt;
&lt;li&gt;see how well your text is understood&lt;/li&gt;
&lt;li&gt;react to the reader&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;With that in mind, here are 4 things I do to bring my message across :-)&lt;/p&gt;

&lt;h1&gt;
  
  
  #1 Keep it brief
&lt;/h1&gt;

&lt;p&gt;Assume your Emails, Bug tickets, Commit messages, etc. will be read many times (e.g. they go out to more than 1 person or will be used as reference for related topics in the future).&lt;/p&gt;

&lt;p&gt;Therefore, keep your text brief. Exclude anything that is not relevant. Replace "fill words" with clear, easy statements&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;In my humble opinion -&amp;gt; I think&lt;/li&gt;
&lt;li&gt;The outcome remains unpredictable -&amp;gt; I don't know&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  #2 Give it structure
&lt;/h1&gt;

&lt;p&gt;A clear structure can help guide your reader through longer texts. So use headlines, paragraphs, formatting to separate and highlight the different parts of your text.&lt;/p&gt;

&lt;p&gt;For some text formats like Commit messages, Bug tickets, regular status updates, a more formal structure make sense for you. Check out &lt;a href="https://nitayneeman.com/posts/understanding-semantic-commit-messages-using-git-and-angular/" rel="noopener noreferrer"&gt;semantic commit messages&lt;/a&gt; for example.&lt;/p&gt;

&lt;h1&gt;
  
  
  #3 Avoid Ambiguity
&lt;/h1&gt;

&lt;p&gt;Texts might be read out context (e.g. forwarded emails) or someone who does not have the same background information you do. Therefore try to use precise term that allow little misinterpretation, e.g.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Use Names: I've spoken to &lt;del&gt;him&lt;/del&gt; John&lt;/li&gt;
&lt;li&gt;Use Numbers: It happens &lt;del&gt;sometimes&lt;/del&gt; once a week&lt;/li&gt;
&lt;li&gt;Beware of "and" and "or": We could do &lt;del&gt;1 and 2 or 3&lt;/del&gt; A) 1 and 2, or B) 3. Let me know if you want to do A) or B).&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  #4 Anticipate Follow Ups
&lt;/h1&gt;

&lt;p&gt;Reduce the amount of communication loops by grouping your questions and anticipating follow up.&lt;/p&gt;

&lt;p&gt;E.g. Don't send an email asking "can XYZ be done?", wait 2 days for the reply and then ask "how long will it take?". Instead write something like this&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Hi,&lt;/p&gt;

&lt;p&gt;can XYZ be done? I ask because of reason ABC.&lt;/p&gt;

&lt;p&gt;If so, can you give me an estimate how long it will take. You don't need to spend much time on this a rough estimate is fine.&lt;/p&gt;

&lt;p&gt;If it can not be done, please let me know what would need to change in order for it to become possible. Again, a rough estimate is fine.&lt;/p&gt;

&lt;p&gt;This is not urgent. A reply until Friday 23rd is fine.&lt;/p&gt;

&lt;p&gt;Thank you&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This way, you have both outcomes of your original questions covered. And follow up questions about the context, and expected quality of the estimations and deadline are also answered beforehand.&lt;/p&gt;

&lt;h1&gt;
  
  
  Conclusion
&lt;/h1&gt;

&lt;p&gt;To sum it up, whenever I write texts I always ask myself the following 4 questions before hitting send:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;did I keep it brief?&lt;/li&gt;
&lt;li&gt;is my structure clear?&lt;/li&gt;
&lt;li&gt;what could be misunderstood?&lt;/li&gt;
&lt;li&gt;which follow ups will come?&lt;/li&gt;
&lt;/ol&gt;

</description>
      <category>writing</category>
      <category>career</category>
      <category>productivity</category>
      <category>beginners</category>
    </item>
    <item>
      <title>Wear Headphones when you work from home! - How putting down headphones after a days work can help you unplug at home!</title>
      <dc:creator>Valentin Sawadski (he/him)</dc:creator>
      <pubDate>Mon, 11 May 2020 15:11:12 +0000</pubDate>
      <link>https://dev.to/vsaw/wear-headphones-when-you-work-from-home-how-putting-down-headphones-after-a-days-work-can-help-you-unplug-at-home-5632</link>
      <guid>https://dev.to/vsaw/wear-headphones-when-you-work-from-home-how-putting-down-headphones-after-a-days-work-can-help-you-unplug-at-home-5632</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;This was originally released on the &lt;a href="https://theworkmirror.com/blog/2020/05/11/Whear-Headphones-when-working-from-home.html"&gt;Mirror Blog&lt;/a&gt;. Visit &lt;a href="https://theworkmirror.com"&gt;theworkmirror.com&lt;/a&gt; for more resources on how to make time for what matters and stay healthy and productive at work.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I tried not to talk about "how to work better from home" because everyone's an expert now. But apparently a lot of people like my headphone hack so I'll make an exception. Here it comes: &lt;strong&gt;Wear Headphones whenever you work! 🤯🎧&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;All those "&lt;em&gt;go to a desk, don't work from your bed&lt;/em&gt;" home office advice tries to do two things:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;limit distractions&lt;/li&gt;
&lt;li&gt;create a boundary between your work and your home so you won't be working 24/7&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Especially the last part is very important as for many of us that separation of work and personal spaces was not obvious. It was just something we unconsciously did by going from/to work. These days many people recommend to create a new separation by working from a separate room. But what to do when you do not have that space?&lt;/p&gt;

&lt;p&gt;In my experience, Headphones can do the same! Because&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;noise cancellation 😉&lt;/li&gt;
&lt;li&gt;the important part about separating yourself from work is not the space but to find a clear signal that you are no longer in "work mode". Putting down the headphones does that for me, as I only use them during work.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;So if you don't have home office, get yourself a decent pair of headphones to help you unplug after work!&lt;/p&gt;

</description>
      <category>productivity</category>
      <category>career</category>
      <category>mentalhealth</category>
    </item>
    <item>
      <title>Home office for Embedded Developers</title>
      <dc:creator>Valentin Sawadski (he/him)</dc:creator>
      <pubDate>Mon, 30 Mar 2020 14:21:49 +0000</pubDate>
      <link>https://dev.to/vsaw/home-office-for-embedded-developers-2m1l</link>
      <guid>https://dev.to/vsaw/home-office-for-embedded-developers-2m1l</guid>
      <description>&lt;p&gt;In light of Covid-19 I see a lot of people making the switch to work from home. However, I fear that in some cases embedded developers are not given the benefits of working from home due to outdated development methodologies, which still rely on HW more then necessary. Therefore I thought I'd give some pointer on how to lose the HW dependancy and work from home as an embedded developer.&lt;/p&gt;

&lt;h2&gt;
  
  
  Virtualizing HW
&lt;/h2&gt;

&lt;p&gt;The way I see it, embedded developers have two options: taking HW home (which can be impossible or very impractical) or &lt;strong&gt;virtualise the HW&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Besides easier logistics, virtualising the hardware has some added benefits:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Testability:&lt;/strong&gt; Virtual HW is easy to mock, so you can run simulate and test abnormal sensor values and errors&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Automatable&lt;/strong&gt;: Virtual HW is much easier to set up than a real test bench. Therefore you can automate a lot more scenarios and run them more often&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Portable&lt;/strong&gt;: If you got it working in a virtual environment, you can also get it working on the new HW platform!&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Emulation vs. Mocking
&lt;/h2&gt;

&lt;p&gt;To virtualize HW you can go down two roads:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Full HW Emulation&lt;/strong&gt; a.k.a. run your binary on QEMU&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;HAL Mocking&lt;/strong&gt; a.k.a. compile your application for your host, and give it HW mocks&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Full HW Emulation gives you greater depth, but it's much harder to setup and depending on your application possibly overkill.&lt;/p&gt;

&lt;p&gt;Therefore in most of the cases I've decided for HAL mocking. In HAL mocking you will compile the source code for a different target machine (e.g. an Intel CPU running Linux) instead of the target HW (e.g. ARM) and replace all hardware specific files with mocks. It does not mimic your application as closely since you get a different binary, but the beauty of it though is that now &lt;strong&gt;you get a binary that you can run on your development workstation natively, including full access to native development tools like (debuggers, profilers and tests)!&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Finally
&lt;/h2&gt;

&lt;p&gt;To sum it up: Virtualize your HW and work from home with a much better development workflow!&lt;/p&gt;

&lt;p&gt;So, out of curiosity how are you guys holding up? If you are working from home, share your setup! If not, tell us why not and maybe we can figure out how to get you home safely!&lt;/p&gt;

&lt;p&gt;P.S. Hit me if you want to talk more about HW mocking. I would like to help allowing everyone to work safely from home!&lt;br&gt;
P.P.S. Cover image by &lt;a href="https://www.flickr.com/photos/deldevries/5524357801"&gt;deldevries&lt;/a&gt;&lt;/p&gt;

</description>
      <category>remote</category>
      <category>embedded</category>
      <category>productivity</category>
      <category>covid19</category>
    </item>
  </channel>
</rss>
