<?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: Marek Zaluski</title>
    <description>The latest articles on Forem by Marek Zaluski (@marek).</description>
    <link>https://forem.com/marek</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%2F123184%2F7eefdb7c-1047-4617-8608-f33db3dc5ba7.jpg</url>
      <title>Forem: Marek Zaluski</title>
      <link>https://forem.com/marek</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/marek"/>
    <language>en</language>
    <item>
      <title>Writing Readable Code: Why It Matters and How to Do It</title>
      <dc:creator>Marek Zaluski</dc:creator>
      <pubDate>Wed, 15 Feb 2023 14:23:26 +0000</pubDate>
      <link>https://forem.com/marek/readable-code-why-it-matters-and-how-to-do-it-1gf5</link>
      <guid>https://forem.com/marek/readable-code-why-it-matters-and-how-to-do-it-1gf5</guid>
      <description>&lt;p&gt;There's a joke in programming that some code is write-only. It's a reference to the fact that code can be impossible to read, and that the only moment when it can be understood is at the moment of writing.&lt;/p&gt;

&lt;p&gt;The reality is that code readability is a big deal with significant consequences.&lt;/p&gt;

&lt;p&gt;There are many competing priorities when developing software, and readability can sometimes become a second thought. It's easier to make the case that code should be fast, bug-free, and shipped quickly. But I'm making the case that readability can be a number one priority, too. In fact, it can you help achieve all of the other priorities: it makes it easier to write faster code, it makes bugs more discoverable, and it allows you to ship faster.&lt;/p&gt;

&lt;h2&gt;
  
  
  Who is it for?
&lt;/h2&gt;

&lt;p&gt;When you're putting effort into making code readable, who are you doing it for?&lt;/p&gt;

&lt;p&gt;In some cases, the person who will be reading it is your future self. You might have all the context about the code in your mind right now, and you might think you're going to understand it in the future. But the reality is that we forget quickly.&lt;/p&gt;

&lt;p&gt;Making your code readable is a gift to your future self. It's a gift of time and convenience because it will help you get back into the code faster and spend less time trying to figure out what's going on.&lt;/p&gt;

&lt;p&gt;Aside from being a gift to your future self, it's also a gift to anyone else who will be reading your code. This includes your co-workers and collaborators who will be reviewing your code in the immediate future. But it also includes people who you don't currently know: future collaborators, or people who will be maintaining your code long after you might be gone from your position or role.&lt;/p&gt;

&lt;p&gt;Sometimes you're on a team and you can ask co-workers to explain the code that they wrote. But there are many times when that's not the case: the original authors of the code might be unavailable or they might have left the company or the project long ago. I've had situations where I've wanted to ask the code author for an explanation of what they wrote, only to find out that they're no longer at the company.&lt;/p&gt;

&lt;p&gt;Writing readable code is also a gift to those who are learning. What best practices of readability do you want to pass down to future developers? It's a great opportunity: instead of gatekeeping our knowledge, we can make it easier for newcomers into the profession to read and learn.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to write readable code?
&lt;/h2&gt;

&lt;p&gt;Put yourself into the shoes of someone who is reading the code for the first time and doesn't have a lot of context about how it works. What do they care about?&lt;/p&gt;

&lt;p&gt;First, make the intent clear: what is the code intending to do?&lt;/p&gt;

&lt;p&gt;The two main tools you have at your disposal for clear intent are descriptive names and intentful comments.&lt;/p&gt;

&lt;p&gt;Descriptive names apply to function names and variable names in particular. Here, the idea is to stuff more information about what a function is intended to do into the name itself. Variable names can also have a lot of meaning stuffed into their name: what data they contain, and what that data is for.&lt;/p&gt;

&lt;p&gt;The best descriptive names are consistent in their level of detail. And they can evolve. In a simple project, you can survive with short names that don't need to specify a lot of detail. But once the number of functions and variables gets large, then you really start to benefit from longer and more descriptive names. That's because, with growing complexity, there's more to be said about how each name is different from the others.&lt;/p&gt;

&lt;p&gt;The second tool is writing intentful comments. This is what I call comments that carry intent. They describe not just what a piece of code is doing, but what it's intending to do. This might mean answering the "why" behind the code. A good "why" explanation doesn't just explain the reasons behind the way that the code was written, but it also mentions the alternative implementations that were considered but were not used. &lt;/p&gt;

&lt;p&gt;Intentful comments can be the most useful help when debugging: if you're trying to figure out a bug and you see a discrepancy between how the code functions and how its intent is described, this can be very valuable information for narrowing down the location of the bug.&lt;/p&gt;

&lt;h2&gt;
  
  
  Writing readable code makes you a better programmer
&lt;/h2&gt;

&lt;p&gt;In conclusion, it's worth making readable code a priority. It pays off in the future, making it easier for you to come back to your old code and quickly get right back into it, and also making it easier for collaborators to work on it.&lt;/p&gt;

&lt;p&gt;Writing readable code makes you practice empathy as a programmer. It forces you to think about the state of mind of someone who will be reading the code without all the context and understanding that you have in the moment. And that's a great exercise to make you a better developer.&lt;/p&gt;

</description>
      <category>discuss</category>
      <category>ai</category>
      <category>productivity</category>
      <category>psychology</category>
    </item>
    <item>
      <title>Are Callbacks Always Asynchronous?</title>
      <dc:creator>Marek Zaluski</dc:creator>
      <pubDate>Tue, 18 Feb 2020 12:54:08 +0000</pubDate>
      <link>https://forem.com/marek/are-callbacks-always-asynchronous-bah</link>
      <guid>https://forem.com/marek/are-callbacks-always-asynchronous-bah</guid>
      <description>&lt;p&gt;When I was learning JavaScript and first encountered the concept of callback functions, I was still trying to wrap my head around the whole "asynchronous" idea.&lt;/p&gt;

&lt;p&gt;Because callback functions seemed to get involved every time something asynchronous was mentioned, I had the understanding that if you were talking about callback functions, then it meant that you were doing something asynchronous.&lt;/p&gt;

&lt;p&gt;In fact, I've seen a lot of tutorials and courses that tell you that a callback function is a type of asynchronous function.&lt;/p&gt;

&lt;p&gt;Well, this is actually not true.&lt;/p&gt;

&lt;p&gt;It turns out that callbacks aren't necessarily asynchronous at all.&lt;/p&gt;

&lt;p&gt;But in order for that to make sense, it's helpful to have a clearer definition of what a callback function actually is, and also a clearer definition of what "asynchronous" means.&lt;/p&gt;

&lt;h2&gt;
  
  
  What's the definition of a callback function?
&lt;/h2&gt;

&lt;p&gt;You're in the presence of a callback when you can see this situation in your code:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A function is being called. (Let's name it function Alpha).&lt;/li&gt;
&lt;li&gt;Some other function is being passed as an argument into that call. (Let's name it function Bravo).&lt;/li&gt;
&lt;li&gt;There's an expectation that Alpha is taking on the responsibility of calling Bravo, at some point in time.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The shape of the code looks like this (which is the syntax of a function call with one argument):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nf"&gt;alpha&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;bravo&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If the situation matches the those three conditions, then Bravo is a callback function. It's being passed into a function call as an argument with the expectation that it will get called. That's a callback.&lt;/p&gt;

&lt;p&gt;Let's take a look at an event handler example and we'll confirm that the above points are there.&lt;/p&gt;

&lt;p&gt;If you're waiting for a mouse click on your page, you might use the &lt;code&gt;addEventListener&lt;/code&gt; method. If you're using a framework like React, then the &lt;code&gt;onClick&lt;/code&gt; prop works in almost the same way.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;doSomethingAfterClick&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;numberOfClicks&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// Count the number of mouse clicks, just for the sake of example.&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;button&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getElementById&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;action-button&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="nx"&gt;button&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;addEventListener&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;click&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;doSomethingAfterClick&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// here is the callback situation&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In this example, do we have...&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;...a function being called?

&lt;ul&gt;
&lt;li&gt;Yes, we're calling &lt;code&gt;addEventListener&lt;/code&gt;, our Alpha function.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;...a function being passed as an argument into the call? 

&lt;ul&gt;
&lt;li&gt;Yes, we're passing &lt;code&gt;doSomethingAfterClick&lt;/code&gt;, our Bravo function.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;...the expectation that Alpha will call Bravo at some point?

&lt;ul&gt;
&lt;li&gt;Yes, when a mouse click happens, we expect that &lt;code&gt;doSomethingAfterClick&lt;/code&gt; will be called.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;So we can conclude that yes, it's a callback function.&lt;/p&gt;

&lt;p&gt;To clarify the 3rd point of the definition, it's helpful to ask: who is calling the callback function?&lt;/p&gt;

&lt;p&gt;In our example, who is calling &lt;code&gt;doSomethingAfterClick&lt;/code&gt;? It's not our own code, because we don't see &lt;code&gt;doSomethingAfterClick&lt;/code&gt; being called. If we were calling it, then we would see the function call syntax which includes the brackets after the function name: &lt;code&gt;doSomethingAfterClick()&lt;/code&gt;. We don't have that here.&lt;/p&gt;

&lt;p&gt;So, we can conclude that &lt;code&gt;addEventListener&lt;/code&gt; is the one who will be responsible for calling &lt;code&gt;doSomethingAfterClick&lt;/code&gt;. Because even if we don't see the explicit function call, we know that &lt;code&gt;addEventListener&lt;/code&gt; can take our callback and can do whatever it wants with it, which includes making sure that it gets called when that click event happens.&lt;/p&gt;

&lt;h2&gt;
  
  
  Callbacks can be synchronous or asynchronous
&lt;/h2&gt;

&lt;p&gt;After talking about the definition of a callback function, we can see that callbacks don't have anything to do with the async concept at all. They're just regular functions, and they don't know or care whether they're going to be called asynchronously or not.&lt;/p&gt;

&lt;p&gt;But what's the difference between a synchronous callback and an asynchronous callback? What does it even mean when we say that a callback is asynchronous?&lt;/p&gt;

&lt;h2&gt;
  
  
  How to tell if it's an asynchronous callback?
&lt;/h2&gt;

&lt;p&gt;Instead of going deep under the hood to find a technical definition of what asynchronous code means, I think it would be more helpful to stay close to the surface and ask: what can we actually observe that's different between sync and async callbacks?&lt;/p&gt;

&lt;p&gt;To figure it out, we need to know what happens and in what order. Let's write a timeline based on the above scenario with functions Alpha and Bravo.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;We call function Alpha and pass Bravo, our callback, as an argument (example: we call &lt;code&gt;addEventListener&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Alpha returns. (this happens right away).&lt;/li&gt;
&lt;li&gt;Bravo, our callback, gets called. (example: a mouse click event happens)&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The important thing to notice is the order of #2 and #3. First, Alpha returns. Then, Bravo is called at some later time.&lt;/p&gt;

&lt;p&gt;This tells us that it's an asynchronous function. The reason is that the only way for Alpha to return before Bravo is if it puts Bravo into the asynchronous queue, causing it to be called at a later point in time.&lt;/p&gt;

&lt;p&gt;I like to use the term &lt;strong&gt;parent function&lt;/strong&gt; to refer to Alpha. The parent function receives the callback and takes responsibility for calling the callback.&lt;/p&gt;

&lt;p&gt;Here's how the relationship between the callback and the parent function looks on the timeline:&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%2Fi%2Frjqf7w2vmlxxz5ez0dbz.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%2Fi%2Frjqf7w2vmlxxz5ez0dbz.png" alt="Alt Text" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;On the other hand, if we had a synchronous situation, then it would mean that Alpha is calling Bravo directly and therefore needs to wait until Bravo returns before it can return too.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to tell that it's a synchronous callback?
&lt;/h2&gt;

&lt;p&gt;How would that timeline look if we had a synchronous situation?&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;We call function Alpha and pass Bravo as an argument&lt;/li&gt;
&lt;li&gt;Bravo, our callback, gets called.&lt;/li&gt;
&lt;li&gt;Alpha returns.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;So the relationship between the parent function Alpha and the callback function Bravo now looks like this:&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%2Fi%2Fhyaxexxqnkl9ymxrjlh4.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%2Fi%2Fhyaxexxqnkl9ymxrjlh4.png" alt="Alt Text" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Here are some great examples of synchronous callbacks:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;the &lt;code&gt;forEach&lt;/code&gt; array method. &lt;code&gt;forEach&lt;/code&gt; takes a callback and it calls that callback once for every item in the array, waiting for each call to return before &lt;code&gt;forEach&lt;/code&gt; itself returns, meaning it's synchronous.&lt;/li&gt;
&lt;li&gt;the &lt;code&gt;map&lt;/code&gt; array method. It also takes a callback and calls it for every item in the array. And because it has to wait for each call's result before it can produce the final output array, it doesn't even have a choice but to be synchronous.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;filter&lt;/code&gt; and &lt;code&gt;reduce&lt;/code&gt; also work in the same synchronous way.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If we were to draw these examples, we'd actually draw the blue box being called multiple times, and those calls would all happen before the parent function returns.&lt;/p&gt;

&lt;p&gt;You can also look at the code of a function to figure out if it uses sync or async callbacks. If you can see the callback being called directly, with the function call syntax (like &lt;code&gt;callback()&lt;/code&gt;) then you know it's synchronous.&lt;/p&gt;

&lt;p&gt;Here's a function that uses a callback synchronously, and we can know this with certainty because we can see that the  callback gets called directly:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Example of a sync callback&lt;/span&gt;
&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;callWithRandom&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;input&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;callback&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;output&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;Math&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;random&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="nx"&gt;input&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nf"&gt;callback&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;output&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// the callback is being called directly, right here&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This matches what we see on the diagram, because the call to &lt;code&gt;callback(output)&lt;/code&gt; must be completed before the JavaScript engine can reach the end of the parent function and return from it.&lt;/p&gt;

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

&lt;p&gt;What's the relevant part of this story? Let's recap the main points.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A callback function is a function that gets passed as an argument into a parent function call.&lt;/li&gt;
&lt;li&gt;There's an expectation that the callback can be called by the parent function.&lt;/li&gt;
&lt;li&gt;A callback can be used synchronously or asynchronously.&lt;/li&gt;
&lt;li&gt;There's a difference in the order in which things happen in the timeline, depending on whether the callback is used synchronously or asynchronously.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;My next articles will cover more topics on the fundamentals of JavaScript execution, so click Follow to get notified about them.&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>async</category>
      <category>webdev</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Soft Skills Are Out. Here's a Better Model</title>
      <dc:creator>Marek Zaluski</dc:creator>
      <pubDate>Mon, 17 Jun 2019 16:12:25 +0000</pubDate>
      <link>https://forem.com/marek/soft-skills-are-out-here-s-a-better-model-bd4</link>
      <guid>https://forem.com/marek/soft-skills-are-out-here-s-a-better-model-bd4</guid>
      <description>&lt;p&gt;I started out my developer career focused on the kinds of skills that I thought were most important: the technical skills.&lt;/p&gt;

&lt;p&gt;Consider the question: what makes a good developer good?&lt;/p&gt;

&lt;p&gt;The most common answer: it's the level of their technical skills.&lt;/p&gt;

&lt;p&gt;As I got more experienced and as I worked with more teams (and larger teams), I started to realize that it isn't so simple: there's more to the story.&lt;/p&gt;

&lt;p&gt;The most effective developers that I met weren't just skilled in technical ways. They were really good at a few other key things too: explaining problems clearly, sharing solutions with team members, and being good at communication in general.&lt;/p&gt;

&lt;p&gt;So I took a look at my own skill-set and I saw that yes, I was making a lot of progress on the technical side and I was learning a lot of new tech skills. But I wasn't really doing anything to improve my communication skills.&lt;/p&gt;

&lt;p&gt;There's a term that's often used to refer to these non-technical skills that are nevertheless important for a job: soft skills. These are usually defined as some combination of communication skills, teamwork skills, and empathy.&lt;/p&gt;

&lt;p&gt;Some definitions of soft skills might also throw in things like professionalism, accountability, or integrity.&lt;/p&gt;

&lt;p&gt;Getting good at soft skills, just like technical skills, requires deliberate practice.&lt;/p&gt;

&lt;p&gt;I realized that I needed to get better at communication so I started practicing. I started a writing habit, published some blog posts, and generally tried to see where I could improve how I work with my team members.&lt;/p&gt;

&lt;p&gt;And outside of working in a team, when I eventually started doing solo consulting work for clients, I realized that there's a whole set of communication skills that are important in that kind of work, too. Communication can make or break your relationships with clients.&lt;/p&gt;

&lt;h2&gt;
  
  
  Soft skills: the wrong label?
&lt;/h2&gt;

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

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



&lt;/p&gt;

&lt;p&gt;I recently came across the idea that the phrase "soft skills" isn't actually the best term. I've been using the phrase for a long time but now I agree: calling these skills "soft skills" leaves out a lot of nuance and it implies some assumptions that aren't true.&lt;/p&gt;

&lt;h3&gt;
  
  
  Problem 1: "Soft skills" sounds less important than "tech skills".
&lt;/h3&gt;

&lt;p&gt;Reality: Soft skills are just as important, if not more important, for career success.&lt;/p&gt;

&lt;p&gt;If you look at it from the perspective of a particular job, or a particular task, then sure: in those cases you can probably identify specific technical skills that are needed to succeed.&lt;/p&gt;

&lt;p&gt;After all, if you're working on something technical like an operating system kernel, then knowing the inner workings of the kernel is a pre-requisite skill. There's no way around that, and being really good at communication isn't going to help you directly.&lt;/p&gt;

&lt;p&gt;But if you zoom out and look at the bigger picture, and consider a longer time span like your entire career, then communication and teamwork skills start to really show their importance. If you want to progress in your career and face new challenges, then these are the skills that are going to be just as important or more important than the tech skills.&lt;/p&gt;

&lt;h3&gt;
  
  
  Problem 2: "Soft skills" can imply that these skills are easier than "hard skills"
&lt;/h3&gt;

&lt;p&gt;There's an argument to be made that by calling them "soft skills," you're making these skills sound like they're easy and therefore make them seem less valuable.&lt;/p&gt;

&lt;p&gt;There's no doubt that technical skills are difficult to learn. There's a lot of work, effort and practice involved.&lt;/p&gt;

&lt;p&gt;But so-called soft skills are difficult in different ways.&lt;/p&gt;

&lt;p&gt;First, it's difficult to self-assess how good you are at communication without taking the time to reflect and introspect. There's no test or metric that can tell you how good you are at it. You have to make a deliberate effort to look for ways to improve.&lt;/p&gt;

&lt;p&gt;Second, communication and teamwork require empathy, and that's not an easy skill to acquire. You can't learn it from a book, a course, or a tutorial.&lt;/p&gt;

&lt;p&gt;Third, you have to learn to listen. When you hear about "communication" as a skill, it's easy to think about only one side of it: transmitting information to others. But that's only half: and the other half, arguably, is even more important. It's listening and understanding what other people are saying. In my experience, that can be a blind spot for many people, even those who think of themselves as good communicators.&lt;/p&gt;

&lt;h2&gt;
  
  
  So what can we call them instead?
&lt;/h2&gt;

&lt;p&gt;Instead of calling them "soft skills," we can call these skills something that's more accurate, something that reflects a better career mindset.&lt;/p&gt;

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

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



&lt;/p&gt;

&lt;p&gt;There are some ideas floating around for an alternative name for these skills, but my favorite is &lt;strong&gt;"core skills."&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Why core skills? Because they're at the core. They're at the middle of your skill-set and career, not on the outskirts. And all of your other skills (including the technical and specialized ones) connect into them directly.&lt;/p&gt;

&lt;p&gt;Every single one of your other skills is amplified and made more powerful when it connects to a strong core.&lt;/p&gt;

&lt;p&gt;So if you were to make a diagram of your skills as a professional, it might look like this:&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%2Fdevelopermission.com%2Fstatic%2Fcontent%2Fcore-skills.png%3F1" 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%2Fdevelopermission.com%2Fstatic%2Fcontent%2Fcore-skills.png%3F1" alt="Core Skills" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;
Core skills are a better model for thinking about soft skills



&lt;p&gt;If you do some research on the term "core skills" then you might find that some people have already used the term to refer to technical skills. It may also have some overlap with the use of the phrase "core competency."&lt;/p&gt;

&lt;p&gt;But that usage aside, I really like the visual of placing these skills at the center, and giving them the attention that they deserve. It's where they should be.&lt;/p&gt;

&lt;p&gt;Ultimately, the question that you have to ask if you want to maximize your career success is "where should I be investing time and effort into my career?".&lt;/p&gt;

&lt;p&gt;And the message should be: invest in technical skills that help you specialize, but no matter what your specialization is, make sure to invest into making your core as strong as possible.&lt;/p&gt;




&lt;p&gt;PS. I'm starting a newsletter and channel for developers called Developer Mission. If you want more of my content about how to find clarity in your software career, sign up at &lt;a href="https://developermission.com" rel="noopener noreferrer"&gt;developermission.com&lt;/a&gt;&lt;/p&gt;

</description>
      <category>career</category>
      <category>advice</category>
      <category>learning</category>
      <category>softskills</category>
    </item>
    <item>
      <title>Should You Throw Away More Code than You Keep?</title>
      <dc:creator>Marek Zaluski</dc:creator>
      <pubDate>Mon, 22 Apr 2019 18:43:16 +0000</pubDate>
      <link>https://forem.com/marek/should-you-throw-away-more-code-than-you-keep-3ddd</link>
      <guid>https://forem.com/marek/should-you-throw-away-more-code-than-you-keep-3ddd</guid>
      <description>&lt;p&gt;Once in a while, I like to pick a random NPM package that I'm using in my projects, and go read the source code on GitHub.&lt;/p&gt;

&lt;p&gt;When I was first learning JavaScript, I read some of the source code for jQuery and Express. It was a positive experience. I was surprised that I could understand a lot more of the code than I expected. There were definitely a lot of terms and concepts that I had to look up as I went along, but that helped me learn a lot of new things.&lt;/p&gt;

&lt;p&gt;I expected it to be much more intimidating, it was actually very readable. That's probably in large part because I was lucky that jQuery and Express are well-written and documented projects.&lt;/p&gt;

&lt;p&gt;I've also read some really messy codebases (and written a lot of messy code myself), and it showed me that there's a lot of variability in the software world. No two projects as alike.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;But here's what reading source code doesn't show you:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;You don't see what paths development took and how the code got to where it is today. (unless you go digging through git commits, which I recommend as well).&lt;/p&gt;

&lt;p&gt;When you read the source code of a fully-formed, well-maintained and well-documented project, you might get the impression that the developers really knew what they were doing. When you look at the finished product, it might seem like the authors had everything figured out, and they just sat down and wrote it.&lt;/p&gt;

&lt;p&gt;The reality is: they probably threw away more code than they wrote, before arriving at the current state.&lt;/p&gt;

&lt;p&gt;In fact the code probably went through a lot more iterations that it might seem.&lt;/p&gt;

&lt;p&gt;So when you're learning and working on your own projets, don't be afraid to throw away code.&lt;/p&gt;

&lt;p&gt;Code is free to write, so write lots of it. Code is also free to delete, so delete at will.&lt;/p&gt;

&lt;p&gt;As long as you keep producing, you'll keep getting better at it.&lt;/p&gt;

&lt;p&gt;By having the mindset that it's okay to throw away your code, you're going to write more and that's how you improve.&lt;/p&gt;

&lt;p&gt;Do you agree? Should you throw away code more code than you keep?&lt;/p&gt;

</description>
      <category>productivity</category>
      <category>beginners</category>
      <category>discuss</category>
      <category>healthydebate</category>
    </item>
    <item>
      <title>Why You Need (at least) Two Mentors</title>
      <dc:creator>Marek Zaluski</dc:creator>
      <pubDate>Fri, 05 Apr 2019 14:36:27 +0000</pubDate>
      <link>https://forem.com/marek/why-you-need-at-least-two-mentors-5h</link>
      <guid>https://forem.com/marek/why-you-need-at-least-two-mentors-5h</guid>
      <description>&lt;p&gt;Here's one of the best pieces of career advice: Get a mentor!&lt;/p&gt;

&lt;p&gt;The support and feedback that you get from a mentor is invaluable. You don't get this kind of value from any other source of career input: whether you read career blog posts, watch Youtube videos or follow people on Twitter, nothing is as useful as a mentor who you can actually talk to.&lt;/p&gt;

&lt;p&gt;But when people say "mentor", they aren't always talking about the same thing.&lt;/p&gt;

&lt;p&gt;There are two kinds of mentors. Let's break it down.&lt;/p&gt;

&lt;h2&gt;
  
  
  The job mentor
&lt;/h2&gt;

&lt;p&gt;If your mentor is one of your co-workers, then they're what I call a &lt;strong&gt;job mentor.&lt;/strong&gt; &lt;/p&gt;

&lt;p&gt;At some companies, when you join the team, they assign you to a mentor. That mentor's task is to get you acquainted with how things work at the company, and serve as someone that you can turn to with questions and concerns.&lt;/p&gt;

&lt;p&gt;If there's no official mentorship program at your workplace, then you should try to get a job mentor by approaching someone yourself. It's good to do this early on.&lt;/p&gt;

&lt;p&gt;Ideally, find a mentor who is not your direct boss. This is because the mentor relationship is different than the boss-subordinate relationship. The mentor is the person you can go to when the concern or question that you have is actually about your relationship with your boss.&lt;/p&gt;

&lt;h2&gt;
  
  
  The career mentor
&lt;/h2&gt;

&lt;p&gt;If you have a mentor outside of your workplace, then you have a different kind of mentor: a &lt;strong&gt;career mentor&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;A career mentor is someone you can talk to when you're looking for big-picture career advice. It's someone you can ask about switching jobs and deciding on your next move.&lt;/p&gt;

&lt;p&gt;Having a career mentor is good for the questions that you wouldn't ask your job mentor. Maybe you have serious concerns about your workplace and you want an outside opinion. Maybe your employer isn't investing into your career development because they don't want you to go get a better job elsewhere. Then you need an external perspective.&lt;/p&gt;

&lt;p&gt;Let's be real for a minute. Not all employers care about your career development. Most just care about the here and now: the productivity that you're providing to the company's bottom line at the present moment. So your employer isn't typically the best place to get good career advice for the longer term.&lt;/p&gt;

&lt;p&gt;How do you find a career mentor? Approach someone who is a few years ahead of you in their career, and who is doing the kind of work that you'd like to be doing. Ask them about their career path and how they got where they are. Most people are very eager to share their work experiences.&lt;/p&gt;

&lt;h2&gt;
  
  
  You need both
&lt;/h2&gt;

&lt;p&gt;Ideally, you need at least one mentor of each kind.&lt;/p&gt;

&lt;p&gt;You need someone to "on the inside" in your company so that you can decode the company culture and figure out the unwritten "this is how we do things here" rules.&lt;/p&gt;

&lt;p&gt;But you also need an outside perspective who can call out the group-think of your workplace.&lt;/p&gt;

&lt;p&gt;Do you have a story of how a mentor helped you in your career? Share it in the comments.&lt;/p&gt;

</description>
      <category>career</category>
      <category>mentorship</category>
      <category>beginners</category>
    </item>
    <item>
      <title>Think of Your Career as a Series of Stepping Stones</title>
      <dc:creator>Marek Zaluski</dc:creator>
      <pubDate>Thu, 21 Mar 2019 21:00:30 +0000</pubDate>
      <link>https://forem.com/marek/how-to-think-of-your-career-as-a-series-of-stepping-stones--2ph6</link>
      <guid>https://forem.com/marek/how-to-think-of-your-career-as-a-series-of-stepping-stones--2ph6</guid>
      <description>&lt;p&gt;If you want a fast-moving career, think of each job as a stepping stone. A good stepping stone is one that gets you closer to the next stone in your path, towards your end-goal.&lt;/p&gt;

&lt;p&gt;The end-goal is your dream job or ideal career.&lt;/p&gt;

&lt;p&gt;The thing about stepping stones is that you have to make a jump if you want to reach the next one. You can stand on a stone as long as you want but it's not going to move on its own.&lt;/p&gt;

&lt;p&gt;A slow and steady career, on the other hand, is more like floating downstream in a slow steady river. You're not going to go as fast, but you don't need to do as much jumping. And you don't have as much say about where you're going to end up.&lt;/p&gt;

&lt;h1&gt;
  
  
  Choosing to make the jump
&lt;/h1&gt;

&lt;p&gt;Years ago I was at a crossroads in my career where I had a job offer to work in PHP and another offer at a different company to work on JavaScript and Node.js.&lt;/p&gt;

&lt;p&gt;I was much more comfortable in PHP. My knowledge of JavaScript had a lot of holes in it and I didn't know much about Node.js except for what I had learned in a few hackathon projects.&lt;/p&gt;

&lt;p&gt;I would have been in my comfort zone with PHP. I wasn't looking for comfort, though. I was looking to keep my career moving and jump to the next stepping stone.&lt;/p&gt;

&lt;h1&gt;
  
  
  Jumping into the deep end
&lt;/h1&gt;

&lt;p&gt;So I took the JavaScript job. I have to be honest, it was a lot of work to get up to speed. I had to learn how Node.js does things, which was very different from PHP -- and also different from Rails and Django which I had used before.&lt;/p&gt;

&lt;p&gt;But I knew that JS is where I wanted to take my career next. I wanted to go after where I saw the action. The opportunities were there and when I looked at Node.js, which was relatively new, I saw a platform that was picking up steam at breakneck speed.&lt;/p&gt;

&lt;p&gt;I could have worked on my JS skills in my free time while working in a comfortable, slow-moving day job. I could have played with Node.js in my personal projects, while writing code in PHP at work.&lt;/p&gt;

&lt;p&gt;But I didn't have the patience, nor the extra time and energy for that.&lt;/p&gt;

&lt;p&gt;That's why when this opportunity came knocking, I'm glad I recognized it. It was an employer who was willing to take a risk on me and my skills, and who basically wanted to pay me to learn things.&lt;/p&gt;

&lt;h1&gt;
  
  
  Choose your next job strategically
&lt;/h1&gt;

&lt;p&gt;Not all employers will give you this kind of opportunity. In fact, the majority of employers are not willing to take risks, and many of them are bad at hiring overall. To be fair, hiring well is a really hard process.&lt;/p&gt;

&lt;p&gt;How to maximize the chance of finding good stepping stone job opportunities?&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Decide if you want to take some risks and if you want a fast-moving career. If you're at a point where you want stability, then a stepping stone strategy might not be the best choice.&lt;/li&gt;
&lt;li&gt;Know what you want to learn next. Look at where the action is in the industry, and see where you can build career capital.&lt;/li&gt;
&lt;li&gt;Recognize the effects of hype in the tech world and how you can take advantage of it. What you want is not short-term hype, but medium-term: the cycle needs to be long enough for it to be a worthwhile career capital investment.&lt;/li&gt;
&lt;li&gt;Show that you're willing and able to learn fast. Smart employers know that this is more valuable than X number of years of experience in a technology.&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  Pick the job that matches your philosophy
&lt;/h1&gt;

&lt;p&gt;It was no coincidence that the employer that was looking to hire someone to do Node.js was also willing to hire someone based on eagerness to learn instead of years of experience.&lt;/p&gt;

&lt;p&gt;This was a time several years ago when Node.js was in its early stages. And this company was an early adopter. Their very philosophy was to move fast, learn fast, and take advantage of new technology. So they were looking for people that shared that philosophy.&lt;/p&gt;

&lt;p&gt;If you want a stable, slow-moving career, then pick a slow-moving technology stack. Stability can be a good thing if that's what you're looking for.&lt;/p&gt;

&lt;p&gt;You can stay with PHP or enterprise stacks like Java or .NET for a solid, stable career: but generally speaking (and ignoring the expections) don't expect to find fast-moving, risk-taking employers in those stacks.&lt;/p&gt;

&lt;h1&gt;
  
  
  Learning something from each step
&lt;/h1&gt;

&lt;p&gt;I learned a lot from the work that I did with PHP: it made me a better programmer.&lt;/p&gt;

&lt;p&gt;I also had a few stepping stones that involved Python, Ruby, Go and some other stacks.&lt;/p&gt;

&lt;p&gt;In retrospect those steps were a bit to the side, rather than aligned straight-on towards my goals. Only later did I decide to go all-in with JavaScript as my chosen language of expertise, and I didn't pursue those other languages further.&lt;/p&gt;

&lt;p&gt;You don't always have enough visibility to tell which step you should be taking, or which direction you should be going.&lt;/p&gt;

&lt;p&gt;As long as you're not stepping backwards, then you're going to learn something new with each and every jump. And you're going to see your next steps more clearly.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Why Programming Languages Are Hard</title>
      <dc:creator>Marek Zaluski</dc:creator>
      <pubDate>Mon, 04 Mar 2019 18:23:16 +0000</pubDate>
      <link>https://forem.com/marek/why-programming-languages-are-hard-19ch</link>
      <guid>https://forem.com/marek/why-programming-languages-are-hard-19ch</guid>
      <description>&lt;p&gt;Years ago when I first tried learning Python, within the first five minutes of playing around with it I encountered one of these error messages:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;SyntaxError: invalid syntax
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It sounded like Python was telling me: you did something bad, and you should feel bad.&lt;/p&gt;

&lt;p&gt;I did feel bad, in part because I had no idea what a SyntaxError meant, and the phrase "invalid syntax" didn't help clarify anything at all.&lt;/p&gt;

&lt;p&gt;Today, I know a lot more about programming languages and about how parsers work. But the error message is still bad. It's bad UX, or more precisely: bad DX (developer experience).&lt;/p&gt;

&lt;p&gt;If you're learning programming for the first time, then the error is a bad experience on two levels:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;First, it doesn't tell you what just happened. Did I do something wrong? Did my program do something wrong? Or did Python do something wrong?&lt;/li&gt;
&lt;li&gt;Second, it offers no indication of what the reason for the error might be, or what I could try to do to fix it.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Now, the reality is that syntax errors happen all the time (even after years of experience) and that most of a developer's life is spent fixing bugs and troubleshooting all kinds of coding problems.&lt;/p&gt;

&lt;p&gt;But as a beginner, you don't know that.&lt;/p&gt;

&lt;p&gt;When you're a beginner, this error actually sounds like it's a big deal, and more critically, &lt;strong&gt;it sounds like you did something wrong&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  The problem: programming languages are created by programmers
&lt;/h2&gt;

&lt;p&gt;Programming languages are created by programmers, for programmers.&lt;/p&gt;

&lt;p&gt;That's a problem when you want to make programming more accessible and easier to learn. It's a target audience mismatch.&lt;/p&gt;

&lt;p&gt;On top of that, there are limitations that come from how programming languages are created. We end up with messages like "invalid syntax" not just because someone wrote the error message like that, but because of the way that the language grammar and parser work. Maybe the parser actually doesn't have access to the exact grammar rule that caused the syntax error, because it was coded that way. So the error message isn't capable of being more helpful for technical reasons.&lt;/p&gt;

&lt;p&gt;It's very likely that it just wasn't one of the priorities for Guido when he was writing the first version of the Python parser. He was writing it for himself and for other programmers.&lt;/p&gt;

&lt;p&gt;After all, when Python was first released in the early 1990s, it was already much simpler and easier to learn than most other languages at the time. (I think that might still be true today.)&lt;/p&gt;

&lt;h2&gt;
  
  
  A secondary problem: programming languages which are designed to be easy to learn tend to be useless
&lt;/h2&gt;

&lt;p&gt;There are lots of programming languages that are designed to be easier to learn and to be accessible to beginners. Very few of them are successful or popular, and the problem is that you can't do any serious work with them.&lt;/p&gt;

&lt;p&gt;They may achieve their goal of making it easier for people to get started with programming. But a lot of the time they fail to illustrate what problems programming can solve, and how it fits into a bigger picture.&lt;/p&gt;

&lt;p&gt;So in a way, they actually sabotage themselves before they can fulfill their goal.&lt;/p&gt;

&lt;p&gt;If you want to show people why programming is worthwhile and help them understand how they can use it, you need to show them how to solve a real-world problem. Otherwise, most of the time, it ends up looking like a toy.&lt;/p&gt;

&lt;h2&gt;
  
  
  HyperCard and Excel
&lt;/h2&gt;

&lt;p&gt;HyperCard was one of those applications that emerged in the late 1980s that had an influence on a huge number of computer users and I would bet that it inspired a lot of people to become programmers.&lt;/p&gt;

&lt;p&gt;The programming language that was available inside of HyperCard, called HyperTalk, wasn't particularly great. But it was aimed at non-programmers while at the same time being capable enough to solve real problems.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Many people who thought they would never be able to program a computer started using HyperCard for many automation and prototyping tasks, a surprise even to its creator. (Wikipedia)&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Excel is the other application that was huge in bringing programming to non-programmers.&lt;/p&gt;

&lt;p&gt;Based just on formulas and cells, Excel's model managed to be half-code and half-graphical. It's generic enough to solve a whole range of problems, but it still sticks to a sweet spot: it's specific to problems that can be expressed as a spreadsheet. That's what keeps Excel so powerful: it doesn't try to do everything. It's a spreadsheet.&lt;/p&gt;

&lt;h2&gt;
  
  
  Making a tool customizable until it becomes a poorly designed programming language
&lt;/h2&gt;

&lt;p&gt;In software, we're always faced with a trade-off between writing code that solves a specific solution, and writing code that allows the user enough customizability to solve a wide variety of problems.&lt;/p&gt;

&lt;p&gt;It's the tool specificity problem.&lt;/p&gt;

&lt;p&gt;Excel and HyperCard are tools, not programming languages. But both of them were pulled in the direction away from specificity, to try to solve all problems for everyone.&lt;/p&gt;

&lt;p&gt;What's the most customizable form of a piece of software? It's a programming language itself. So if you take those tools to an extreme point of customizability, they become poorly designed programming languages.&lt;/p&gt;

&lt;p&gt;Why is HyperCard dead today? I think it's because it was too generic and wasn't a perfect fit for any specific problem.&lt;/p&gt;

&lt;p&gt;While it did put a lot of power into the hands of non-programmers, eventually it turned out that the economics of software is such that it's usually more worthwhile to have specific tools built for specific problems.&lt;/p&gt;

&lt;h2&gt;
  
  
  Programmers solve their own problems
&lt;/h2&gt;

&lt;p&gt;It's normal to expect that if you leave programmers to their own devices, they're going to make tools to make their own work easier.&lt;/p&gt;

&lt;p&gt;Sometimes programmers are guilty of a certain kind of elitism, where they put up barriers to entry instead of making things easier for newcomers.&lt;/p&gt;

&lt;p&gt;Once you get past the initial hurdles and you learn how to write code, you start to forget what it felt like when you were just getting started.&lt;/p&gt;

&lt;p&gt;It's remarkably easy to forget how helpless you felt when you were trying to learn the basic syntax of your first programming language and everything seemed stacked against you.&lt;/p&gt;

&lt;p&gt;Everyone starts out as a beginner.&lt;/p&gt;

&lt;h2&gt;
  
  
  So, what can we do to make things better?
&lt;/h2&gt;

&lt;p&gt;Rants aside, here are some actionable suggestions.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;If you're an experienced coder, share stories about your first encounters with programming to show that we all start out clueless and intimidated before we got the hang of it.&lt;/li&gt;
&lt;li&gt;If you're a beginner, try to forgive the creators of programming languages for the cryptic and unhelpful error messages. Creating a programming language is a lot of work, and it's not always obvious how to make it easy for beginners while also making it useful for solving real problems.&lt;/li&gt;
&lt;li&gt;Also if you're a beginner, you can help the programming language community by sharing your experiences and your feedback. A lot of the time, the experienced programmers need a reminder that beginners don't see things the same way that they do, and they need to snap back to reality sometimes.&lt;/li&gt;
&lt;li&gt;Forgive the beginner-friendly programming languages if you can't make anything useful with them. They can still be worthwhile learning tools, and if they can get people excited to learn more about programming in general, then that's the best we can hope for.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Let me close with one last thing.&lt;/p&gt;

&lt;p&gt;I was too harsh above when I called those languages useless, but I meant it in relation to real-world, so-called "business" problems.&lt;/p&gt;

&lt;p&gt;If you can use a tool to make cool or creative things and then show those things off, then that tool is 100% useful and valuable to humanity. Let's make more of those.&lt;/p&gt;

</description>
      <category>programming</category>
      <category>beginners</category>
    </item>
    <item>
      <title>Three Arguments for Why You Should Write More</title>
      <dc:creator>Marek Zaluski</dc:creator>
      <pubDate>Mon, 28 Jan 2019 18:08:15 +0000</pubDate>
      <link>https://forem.com/marek/three-arguments-for-why-you-should-write-more-1no6</link>
      <guid>https://forem.com/marek/three-arguments-for-why-you-should-write-more-1no6</guid>
      <description>&lt;p&gt;Let me try to convince you to write more.&lt;/p&gt;

&lt;p&gt;I don't mean write more &lt;em&gt;code&lt;/em&gt;. I mean write for humans.&lt;/p&gt;

&lt;p&gt;There's a huge benefit to getting good at writing as a developer. And all it takes it practice.&lt;/p&gt;

&lt;p&gt;You don't have to be a good writer to write. In fact, it's the opposite: you have to write a lot first, and then with time it becomes easier and easier.&lt;/p&gt;

&lt;p&gt;Being good at writing isn't about writing high-quality stuff at all. Quality doesn't matter. You can have a crappy blog post and that's infintely better than no blog post at all.&lt;/p&gt;

&lt;p&gt;The goal of practicing writing is not to write high-quality material. The goal is to get efficient and fast at getting your thoughts into text. It's a skill that's for you first, and for the reader second.&lt;/p&gt;

&lt;p&gt;The more you write, the easier it will feel to just open up a blank page and write.&lt;/p&gt;

&lt;p&gt;You might tell me: I'm not a writer, I'm a developer. I don't have time for writing. Well, then this post is for you. Let's jump into 3 arguments for why you should do it.&lt;/p&gt;

&lt;h2&gt;
  
  
  An argument for the collaborators
&lt;/h2&gt;

&lt;p&gt;Writing is the most powerful way to boost your value as a collaborator.&lt;/p&gt;

&lt;p&gt;Most software teams aren't bottlenecked by how much code they're writing. They're bottlenecked by the bandwidth of the communication between team members.&lt;/p&gt;

&lt;p&gt;Here's a good strategy for any team of developers: over-communicate. You can't go wrong with over-communication, because you will eliminate a LOT of problems due to misunderstandings or miscommunications.&lt;/p&gt;

&lt;p&gt;Here are important things that you can do that involve writing:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Share progress reports with the rest of your team&lt;/li&gt;
&lt;li&gt;Write tutorials and onboarding checklists to help new team members get up to speed&lt;/li&gt;
&lt;li&gt;Describe obstacles that you encountered and how your team solved them&lt;/li&gt;
&lt;li&gt;Make bug reports better by writing about the fixes, the trade-offs and the lessons learned&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If some of your team members are remote, or if sometimes people on your team work from home, then written over-communication becomes critical.&lt;/p&gt;

&lt;p&gt;If you're having in-person conversations at the office and things don't get written down, then the team members who are absent are going to miss out on important information.&lt;/p&gt;

&lt;p&gt;Slack messages are OK for short-term ephemeral communication. But if you want your team to get serious about collaboration, write things down &lt;em&gt;for real&lt;/em&gt;. I mean outside of Slack: in a knowledge base, a wiki, or a documentation repo. Somewhere where you have to lay out your thoughts in a structured way.&lt;/p&gt;

&lt;h2&gt;
  
  
  An argument for the competitors
&lt;/h2&gt;

&lt;p&gt;Maybe collaboration doesn't get you motivated.&lt;/p&gt;

&lt;p&gt;Maybe you're competitive and you're more focused on career advancement right now.&lt;/p&gt;

&lt;p&gt;Getting good at writing as a developer is a remarkable way to stand out from the crowd.&lt;/p&gt;

&lt;p&gt;Communication is a skill that's overlooked a lot by developers. From the many conversations that I've had about this, I suspect that a lot of developers get into this line of work precisely because they'd rather interact with computers than with people. If you're competitive and you want to get ahead in the career game, then writing can be a huge advantage.&lt;/p&gt;

&lt;p&gt;Start a blog. Write about your projects. Share what you're learning with the world. These are powerful tactics for career advancement. This is how you get noticed and how you get your foot in the door at your dream company.&lt;/p&gt;

&lt;h2&gt;
  
  
  An argument for the introverts.
&lt;/h2&gt;

&lt;p&gt;I call this argument "for the introverts" for lack of a better term, but that's not exactly what I mean.&lt;/p&gt;

&lt;p&gt;Here's what I actually mean. If the above two arguments don't do it for you, then just write for yourself.&lt;/p&gt;

&lt;p&gt;A large part of software development is problem solving. And problem solving starts with identifying and verbalizing what kind of problem you're looking at in the first place.&lt;/p&gt;

&lt;p&gt;Describe the problem. Write it out. It'll force you to really think about what you already know, what you need to find out, and how to put the pieces together.&lt;/p&gt;

&lt;p&gt;It's amazing how much simpler most problems start to look once you write them out. Sometimes you figure out a solution before you're even done writing the problem down.&lt;/p&gt;

&lt;p&gt;It's like the concept of rubber duck debugging. It's helpful to talk through a problem with someone, because the act of talking helps your brain map out what's going on and it gets you closer to a solution.&lt;/p&gt;

&lt;p&gt;Writing is even better than talking to a rubber duck. It gives you a record of the problem that you can return to in the future. And you can share it with others who are facing a similar problem. That's a huge win right there.&lt;/p&gt;

&lt;h2&gt;
  
  
  It doesn't actually matter what you write
&lt;/h2&gt;

&lt;p&gt;I tried to lay out 3 perspectives on writing, to appeal to different motivations that might speak to you.&lt;/p&gt;

&lt;p&gt;Here's something that I've learned: if you want to get good at writing, it doesn't actually matter what you write. Just write.&lt;/p&gt;

&lt;p&gt;The practice adds up. And let me reiterate: don't worry too much about the quality of your writing. That kind of worry is what causes writer's block. I like Seth Godin's advice on this. He says: write like you talk. Nobody ever gets talker's block.&lt;/p&gt;

&lt;p&gt;Don't know what to write about? Pick things from your own daily experience. Write about what you learned today.&lt;/p&gt;

&lt;p&gt;Don't have anywhere to post it? Post it on &lt;a href="https://dev.to"&gt;dev.to&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;If you do this every day or every week, I guarantee that your writing ability will improve fast. It's all about quantity and consistency.&lt;/p&gt;

</description>
      <category>writing</category>
      <category>career</category>
      <category>discuss</category>
    </item>
    <item>
      <title>You Learn Faster in Messy Workplaces</title>
      <dc:creator>Marek Zaluski</dc:creator>
      <pubDate>Mon, 21 Jan 2019 16:20:47 +0000</pubDate>
      <link>https://forem.com/marek/you-learn-faster-in-messy-workplaces-4m8b</link>
      <guid>https://forem.com/marek/you-learn-faster-in-messy-workplaces-4m8b</guid>
      <description>&lt;p&gt;I've had the pleasure as a developer of working with some amazing teams on some beautiful projects. Their onboarding process was good, the documentation was complete, there was a full suite of automated tests, continuous integration and code reviews.&lt;/p&gt;

&lt;p&gt;Those kinds of projects are a joy.&lt;/p&gt;

&lt;p&gt;But that's not what this post is about.&lt;/p&gt;

&lt;p&gt;I've worked on some difficult projects that were the complete opposite. No testing, no automation, documentation that hadn't been updated in 6 months, and nobody knew what changes were being made because there were no pull requests or code reviews.&lt;/p&gt;

&lt;p&gt;There's usually a combination of typical reasons for this state of affairs. Often it was pressure from management or unrealistic changes in scope happening at the last minute. Some teams tried to use a Scrum process and succeeded in doing sprints and daily standup meetings but it didn't make things better.&lt;/p&gt;

&lt;p&gt;The root problem wasn't just the lack of a process, it was typically the lack of resources combined with an over-reliance on technical debt.&lt;/p&gt;

&lt;h2&gt;
  
  
  Best practices are useless in a vacuum
&lt;/h2&gt;

&lt;p&gt;I don't have the best memories of those terrible projects, but at the same time I realize that I learned a lot of important lessons.&lt;/p&gt;

&lt;p&gt;I learned things that I didn't even realize were important when I was working on well-organized projects.&lt;/p&gt;

&lt;p&gt;When we're thinking theoretically of "best practices", it's easy to think in a vacuum where real-world pressures and restrictions don't apply. But in reality, every project is a collection of trade-offs and compromises between different pressures being applied to it. There's never unlimited time or resources. You have to make a lot of difficult choices.&lt;/p&gt;

&lt;p&gt;Most technical debt out there doesn't happen because of ignorance or incompetence. It happens because of choices where sacrifices have to be made because of outside limitations and pressures.&lt;/p&gt;

&lt;h2&gt;
  
  
  Working for Startups
&lt;/h2&gt;

&lt;p&gt;Startups are a good place to find a lot of lessons to learn. I've worked for a few startups and a good number of them are now dead. I consider that a lucky outcome for me, because it has given me a glimpse into what &lt;em&gt;not&lt;/em&gt; to do as an entrepreneur.&lt;/p&gt;

&lt;p&gt;I've seen all kind of reasons for startup implosion: mis-management of resources, founder disputes and drama, lack of understanding of the target market, waiting too long to ship something.&lt;/p&gt;

&lt;p&gt;Interestingly, software development itself seems to be the least likely cause for failure in the cases that I've seen. The customer almost never cares about the code. They care about the problem that you're solving for them.&lt;/p&gt;

&lt;p&gt;Meanwhile, in the startups where I worked which did succeed, while I gained a lot of insight about entrepreneurship, I didn't learn as many deep, hard lessons.&lt;/p&gt;

&lt;p&gt;Maybe it's because there is really just one way to succeed in entrepreneurship. Make something that solves a real problem for real customers. But there are many ways to fail. There's a ton of ways to do it wrong, and so there's a ton of potential lessons there.&lt;/p&gt;

&lt;h2&gt;
  
  
  Be a Sponge
&lt;/h2&gt;

&lt;p&gt;I like to think of this as the &lt;em&gt;sponge principle&lt;/em&gt; for learning.&lt;/p&gt;

&lt;p&gt;What's the best way to learn on the job? Absorb everything you can. Like a sponge.&lt;/p&gt;

&lt;p&gt;Where is a sponge going to absorb the most? In places where it's wet and messy. Where there's stuff to absorb.&lt;/p&gt;

&lt;p&gt;In contrast, imagine trying to absorb anything by running your sponge over a clean, dry counter top. You're not going to get much out of it.&lt;/p&gt;

&lt;p&gt;Be a sponge and learn from what's happening around you. Not just from your own work: learn from your peers, from your managers. Learn from what the company founders are doing. Learn from what's going on in marketing and in customer support.&lt;/p&gt;

&lt;h1&gt;
  
  
  If in doubt, get out
&lt;/h1&gt;

&lt;p&gt;One last thing. All this has to come with a reminder. Don't stay at a shitty workplace for long. Leave when you can. Definitely leave if you're no longer learning anything.&lt;/p&gt;

&lt;p&gt;Watch out for people who talk about company loyalty or tell you that you should wait X amount of time before switching jobs. You don't owe your employer anything beyond  the work/salary transaction. If it's bad, get out of there. Burnout is never worth it.&lt;/p&gt;

</description>
      <category>career</category>
      <category>learning</category>
      <category>discuss</category>
    </item>
    <item>
      <title>There Are Many Ways to Have a Developer Career</title>
      <dc:creator>Marek Zaluski</dc:creator>
      <pubDate>Fri, 18 Jan 2019 16:50:32 +0000</pubDate>
      <link>https://forem.com/marek/there-are-many-ways-to-have-a-developer-career-elb</link>
      <guid>https://forem.com/marek/there-are-many-ways-to-have-a-developer-career-elb</guid>
      <description>&lt;p&gt;If you're looking for career advice as a developer, here's something you need to watch out for.&lt;/p&gt;

&lt;p&gt;There's a lot of great career advice out there. I definitely recommend reading career articles from experienced developers to learn about how they got where they are and what they learned along the way. That kind of knowledge can give you a huge career boost.&lt;/p&gt;

&lt;p&gt;The problem is that sometimes it sounds like there's such a thing as &lt;em&gt;"a developer career"&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;In reality, there's no one single path. There are many. And they can be wildly different.&lt;/p&gt;

&lt;p&gt;There are a LOT of career models that can be called a "developer career".&lt;/p&gt;

&lt;p&gt;You can be a salaried employee or you can be a freelancer.&lt;/p&gt;

&lt;p&gt;You can be full-time or part-time.&lt;/p&gt;

&lt;p&gt;You can be a generalist or you can be a specialist.&lt;/p&gt;

&lt;p&gt;You can work for startups or you can work for established businesses.&lt;/p&gt;

&lt;p&gt;You can work with the hot new tech or you can work with the tried and true stacks.&lt;/p&gt;

&lt;p&gt;You can even make a living writing open-source code.&lt;/p&gt;

&lt;p&gt;Or you can travel the world as a developer evangelist.&lt;/p&gt;

&lt;p&gt;There's a million ways to be a developer.&lt;/p&gt;

&lt;p&gt;But, when you're looking for resources online, it's easy to get trapped in a filter bubble if you don't get enough variety of information. It's easy to get bombarded with advice that applies to careers at the Big Tech giants or the Silicon Valley ecosystem.&lt;/p&gt;

&lt;p&gt;The world of tech startups, in particular, occupies a lot of the tech discussion online.&lt;/p&gt;

&lt;p&gt;The &lt;a href="https://medium.com/netflix-techblog" rel="noopener noreferrer"&gt;Netflix engineering blog&lt;/a&gt; is an excellent tech blog. But Netflix is a unique company with unique challenges. Same thing for Facebook and Google. These are not ordinary companies, but they get the majority of the attention (and you might say that it's for a good reason: they attract the top talent and they pay massive salaries).&lt;/p&gt;

&lt;p&gt;On the other end of the spectrum, away from the startup scene, there's the world of enterprise software development. It comes with an entirely different set of values and priorities. It's a different ecosystem. And there's a ton of amazing career opportunities there too.&lt;/p&gt;

&lt;p&gt;Being a developer can mean completely different things across different industries and geographies.&lt;/p&gt;

&lt;p&gt;In my city there's a solid ecosystem of tech companies and a great developer community. There are lots of opportunities and it's growing. But it's a very different ecosystem compared to Silicon Valley! You need a completely different career approach to succeed.&lt;/p&gt;

&lt;p&gt;My suggestion is: figure out your goals first. And try to filter career advice based on what your goals are.&lt;/p&gt;

&lt;p&gt;Find a mentor in your industry who has your dream job. Ask them how they got there. Ask them for specific advice that applies to the exact work that they're doing. That's always going to be best source of insight that you can find.&lt;/p&gt;

&lt;p&gt;And most importantly: don't listen to the gatekeeping. Sometimes people say things like "real developers do X" or "you're only a real developer if you Y". Build your own career and don't listen to those who tell you that being developer has to fit their particular definition.&lt;/p&gt;

&lt;p&gt;PS. I'm not saying that all developer career paths are equal. Some paths definitely are easier than others. Some paths are more rewarding than others (in terms of money and other benefits). Let's be real, not all industries are the same and not all opportunities are equal. The point is that you should look at your own goals, consider the entire realm of possibilities, and then choose what's right for you.&lt;/p&gt;

</description>
      <category>career</category>
      <category>beginners</category>
      <category>advice</category>
    </item>
    <item>
      <title>I threw it all away to become a developer</title>
      <dc:creator>Marek Zaluski</dc:creator>
      <pubDate>Fri, 04 Jan 2019 13:45:32 +0000</pubDate>
      <link>https://forem.com/marek/i-threw-it-all-away-to-become-a-developer-16c4</link>
      <guid>https://forem.com/marek/i-threw-it-all-away-to-become-a-developer-16c4</guid>
      <description>&lt;p&gt;I had completed 3 years of an undergraduate degree in biochemistry when I decided to drop it and become a developer.&lt;/p&gt;

&lt;p&gt;In retrospect it was a pretty crazy decision. I was really lucky because I had the family support that allowed me to do this, but it was still a risky move.&lt;/p&gt;

&lt;p&gt;The study of biochemistry is actually really interesting. It's all about the internal machinery of cells and how DNA works. I still love reading about life sciences news, especially with new developments like gene editing.&lt;/p&gt;

&lt;p&gt;But when I imagined myself working in a lab and building a career in academia, something was missing. I didn't just want to do research, I wanted to make things.&lt;/p&gt;

&lt;p&gt;That's what eventually brought me to software. In software I could pick up a computer and make things. There's something so powerful about that. And I didn't need anybody's permission.&lt;/p&gt;

&lt;p&gt;Compare that to the world of research and academia. You have to ask for permission, so to speak, at every step of your career. You ask to be accepted by a professor to work in their lab. You ask journals to publish a paper. You ask for funding for your research. You ask permission to speak at a conference. If your work is really good, then eventually it turns around and people start asking you for things, but it's a long path to get there.&lt;/p&gt;

&lt;p&gt;Here's why software is different and why it appealed to me. With software you don't need any institution or lab to learn it, you can do it yourself.&lt;/p&gt;

&lt;p&gt;You can build and publish your work and nobody's going to stop you.&lt;/p&gt;

&lt;p&gt;If your work is good, people will share it and even pay money for it.&lt;/p&gt;

&lt;p&gt;That's why I ended up becoming a software developer and it was exactly the kind of career that I was looking for.&lt;/p&gt;

</description>
      <category>career</category>
      <category>webdev</category>
    </item>
  </channel>
</rss>
