<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Alex Lakatos - JavaScript, DevTools &amp; DevRel</title><description>Alex Lakatos is a reformed JavaScript person. Currently a Developer Relations Manager 🥑 @ Fidel API by day, Speaker and Mozilla Reps Mentor by night.</description><link>https://alexlakatos.com/</link><atom:link href="https://alexlakatos.com/feed.xml" rel="self" type="application/rss+xml"/><pubDate>Thu, 22 Jul 2021 00:00:00 +0000</pubDate><lastBuildDate>Thu, 22 Jul 2021 00:00:00 +0000</lastBuildDate><item><title>Don’t be THAT guy</title><link>https://alexlakatos.com/personal/2021/05/28/dont-be-that-guy/</link><pubDate>Fri, 28 May 2021 09:00:00 +0000</pubDate><guid isPermaLink="true">https://alexlakatos.com/personal/2021/05/28/dont-be-that-guy/</guid><description>&lt;p>A little while ago, &lt;a href="https://twitter.com/whitep4nth3r/status/1395304339229581312">whitep4nth3r reached out on Twitter&lt;/a> asking for support from men for a better future. I didn’t know why, but I signed up head first, because who wouldn’t want a better future?&lt;/p>
&lt;p>I didn’t know what sparked the plea, but I could have guessed. Men being assholes, live on stream. I was watching her stream again today, when “THAT guy” striked again. Somehow, a dude thought it would be acceptable to compliment someone based on looks. I was stunned. My first response was eaten away by the obscenity filter in the chat.&lt;/p>
&lt;p>I hate the fact that I live in a world where this needs to be said. And we’re all part of the problem! Because we don’t say it often enough - “Don’t be THAT fucking guy!”.&lt;/p>
&lt;p>You know exactly what I’m talking about.&lt;/p>
&lt;blockquote class="twitter-tweet">&lt;p lang="en" dir="ltr">Not the kind of connection request I was looking to get on LinkedIn &lt;a href="https://t.co/Kxww7LZqTN">pic.twitter.com/Kxww7LZqTN&lt;/a>&lt;/p>&amp;mdash; Emma Bostian 🐞 (@EmmaBostian) &lt;a href="https://twitter.com/EmmaBostian/status/1274679283567546370?ref_src=twsrc%5Etfw">June 21, 2020&lt;/a>&lt;/blockquote>
&lt;blockquote>
&lt;p>THAT guy that’s going to “slide into your DMs”. Social media networks are not dating apps! If there were no dating apps left in this world, it still wouldn’t be OK to make unwanted advances in there. Or send dick pics. Tech isn’t there to enable you to be a bigger sleazeball.&lt;/p>
&lt;/blockquote>
&lt;blockquote class="twitter-tweet">&lt;p lang="en" dir="ltr">Me: what he said was so sexist and racist&lt;br>&lt;br>WM: it was so sexist &lt;br>&lt;br>Me: and racist&lt;br>&lt;br>WM: it’s misogyny &lt;br>&lt;br>Me: and racism&lt;br>&lt;br>WM: I didn’t see racism&lt;br>&lt;br>Me: exactly bc if you saw it you wouldn’t be the star victim and are avoiding your own role and implication in these systems&lt;br>&lt;br>WM: *cries*&lt;/p>&amp;mdash; Tatiana Mac (@TatianaTMac) &lt;a href="https://twitter.com/TatianaTMac/status/1390312174866735114?ref_src=twsrc%5Etfw">May 6, 2021&lt;/a>&lt;/blockquote>
&lt;blockquote>
&lt;p>THAT “I’m not a racist” guy. The moment you spew some shit and then try to defend it with “I’m not a racist”, you are. Just don’t spew that shit. Forget about making excuses. No excuses are needed if you really weren’t making a racist comment.&lt;/p>
&lt;/blockquote>
&lt;blockquote class="twitter-tweet">&lt;p lang="en" dir="ltr">it&amp;#39;s wild to me how guys with &amp;#39;learning how to code&amp;#39; in their bio get treated like experts and i get python 101 resources sent to me lol&lt;/p>&amp;mdash; Ali Spittel 🐞 (@ASpittel) &lt;a href="https://twitter.com/ASpittel/status/1390300774228443141?ref_src=twsrc%5Etfw">May 6, 2021&lt;/a>&lt;/blockquote>
&lt;blockquote>
&lt;p>THAT guy that thinks only other dudes can code. I swear everyone has this thing called a brain. And I’m 100% sure brainpower is in no way connected to gender. Programming uses your brain but is also not a skill that in any way relates to gender. So why would you keep on assuming only other “dudes” can code better than neanderthals like you?&lt;/p>
&lt;/blockquote>
&lt;p>The list goes on, and there are so many instances of “THAT guy”. The post is triggering enough as it is. It burns my soul to write about all the shitty things “dudes” online do because they hide behind anonymity. Let’s all agree right here and now that if you wouldn’t say it in person, in front of a room full of people, just don’t say it online. FFS!&lt;/p>
&lt;p>There is absolutely no context, online or not, where it’s OK to be abusive, misogynistic, racist or in any other way disrespectful to another human being! No, not even if it’s “a joke”. Seriously!&lt;/p>
&lt;p>And even if you’ve read all this and think to yourself: “I wasn’t any of those guys”. Were you actually respectful? I know I’m not always respectful. So I pledge to do better, right here, right now! How about you?&lt;/p>
&lt;p>We’ve all seen “THAT guy” regularly, you might even know that guy, but we somehow convince ourselves to not say anything. Because it’s uncomfortable. Or because we’ve convinced ourselves that it doesn’t really affect us. But it affects “someone”. It affects someone quite a lot! If you saw anyone being treated this way on the street next to you, you’d speak up, right? So why is it OK if it happens online? If the past year taught us anything, it’s that more and more of our life happens online.&lt;/p>
&lt;p>Let’s all treat online with the same standards, especially when it comes to harassment, bullying and discrimination. I understand confrontation is hard. But reporting or education work just as well as confrontation.&lt;/p>
&lt;blockquote>
&lt;p>If you’re “THAT guy”, but somehow you didn’t want to take my word for it, check out &lt;a href="https://unbreak.tech/">https://unbreak.tech/&lt;/a>. There’s a lot of other people that would like to have a word with you!&lt;/p>
&lt;/blockquote>
&lt;script async src="https://platform.twitter.com/widgets.js" charset="utf-8">&lt;/script></description></item><item><title>How to Disable Notification Requests in Modern Browsers</title><link>https://alexlakatos.com/devtricks/2021/05/21/browsers-disable-notification-requests/</link><pubDate>Fri, 21 May 2021 00:00:00 +0000</pubDate><guid isPermaLink="true">https://alexlakatos.com/devtricks/2021/05/21/browsers-disable-notification-requests/</guid><description>&lt;p>I absolutely hate it when web pages ask me for permission to send notifications. Most often, the same web pages ask me for an email as well. That&amp;rsquo;s incredibly spammy. I understand their &amp;ldquo;Marketing&amp;rdquo; department is struggling, but this really isn&amp;rsquo;t the way to go. Browser notifications are all kinds of spammy, the same way push notifications on the phone are.&lt;/p>
&lt;p>I&amp;rsquo;ve been ignoring the requests for the most part, but inevitably a few of them made it through. A lot of these spammy websites are using dark patterns in terms of where the buttons are placed. I inadvertently clicked in the wrong place at the wrong time. You&amp;rsquo;d think it wasn&amp;rsquo;t that big of a problem. Still, with me using 4 different browsers consistently (because I&amp;rsquo;m comparing their Developer Tools for a course), it did mean I now have multiple notifications for the same website popping up.&lt;/p>
&lt;p>Well, I&amp;rsquo;ve had enough! I spent a little time figuring out how to block modern browsers from sending notification requests. And I thought I&amp;rsquo;d eventually need to block them again, so I should document the process. If it happens to be helpful to someone else, that&amp;rsquo;s even better.&lt;/p>
&lt;h2 id="google-chrome">Google Chrome&lt;/h2>
&lt;img src="https://alexlakatos.com/img/posts/devtricks/notifications/chrome-block-notifications.gif" alt="Disable Push Notifications in Google Chrome">
&lt;ul>
&lt;li>Go to &lt;em>chrome://settings/content/notifications&lt;/em>&lt;/li>
&lt;li>Disable &lt;em>Sites can ask to send notifications&lt;/em>&lt;/li>
&lt;/ul>
&lt;p>Chrome has a softer option to use quieter messaging. It blocks notification prompts from interrupting you, but I haven&amp;rsquo;t been brave enough to try it. &lt;a href="https://twitter.com/avolakatos">Let me know&lt;/a> if you use it.&lt;/p>
&lt;h2 id="mozilla-firefox">Mozilla Firefox&lt;/h2>
&lt;img src="https://alexlakatos.com/img/posts/devtricks/notifications/firefox-block-notifications.gif" alt="Disable Push Notifications in Mozilla Firefox">
&lt;ul>
&lt;li>Go to &lt;em>about:preferences#privacy&lt;/em>&lt;/li>
&lt;li>Scroll to the &lt;em>Permissions&lt;/em> section&lt;/li>
&lt;li>Click on the Notifications &lt;em>Settings&lt;/em>&lt;/li>
&lt;li>Check the &lt;em>Block new requests asking to allow notifications&lt;/em> box&lt;/li>
&lt;/ul>
&lt;h2 id="microsoft-edge">Microsoft Edge&lt;/h2>
&lt;img src="https://alexlakatos.com/img/posts/devtricks/notifications/edge-block-notifications.gif" alt="Disable Push Notifications in Microsoft Edge">
&lt;ul>
&lt;li>Go to &lt;em>edge://settings/content/notifications&lt;/em>&lt;/li>
&lt;li>Disable &lt;em>Ask before sending&lt;/em>&lt;/li>
&lt;/ul>
&lt;p>Edge has a softer option to use quiet notification requests. It prevents notification requests from interrupting you, but I haven&amp;rsquo;t been brave enough to try it. &lt;a href="https://twitter.com/avolakatos">Let me know&lt;/a> if you use it.&lt;/p>
&lt;h2 id="safari">Safari&lt;/h2>
&lt;img src="https://alexlakatos.com/img/posts/devtricks/notifications/safari-block-notifications.gif" alt="Disable Push Notifications in Apple Safari">
&lt;ul>
&lt;li>Select &lt;em>Preferences&lt;/em> in the Menu bar&lt;/li>
&lt;li>Click on the &lt;em>Websites&lt;/em> tab&lt;/li>
&lt;li>Scroll to &lt;em>Notifications&lt;/em>&lt;/li>
&lt;li>Deselect &lt;em>Allow websites to ask for permission to send notifications&lt;/em>&lt;/li>
&lt;/ul>
&lt;h2 id="brave">Brave&lt;/h2>
&lt;img src="https://alexlakatos.com/img/posts/devtricks/notifications/brave-block-notifications.gif" alt="Disable Push Notifications in Brave Browser">
&lt;ul>
&lt;li>Go to &lt;em>brave://settings/content/notifications&lt;/em>&lt;/li>
&lt;li>Disable &lt;em>Sites can ask to send notifications&lt;/em>&lt;/li>
&lt;/ul>
&lt;p>Brave has a softer option to use quieter messaging. It blocks notification prompts from interrupting you, but I haven&amp;rsquo;t been &amp;ldquo;brave&amp;rdquo; enough to try it. &lt;a href="https://twitter.com/avolakatos">Let me know&lt;/a> if you use it.&lt;/p>
&lt;p class="header-decoration">&lt;br>&lt;/p>
&lt;br>
&lt;p>Have you found this article at all useful? If you did, &lt;a href="https://twitter.com/avolakatos">follow me on Twitter&lt;/a>. It would make my day! Oh, that&amp;rsquo;s where I also regularly share tips and tricks for getting the most out of your browsers 😅.&lt;/p></description></item><item><title>The Accidental Public Speaker or How I Got Over My Fear of Public Speaking</title><link>https://alexlakatos.com/avocados/2021/05/14/accidental-public-speaker/</link><pubDate>Fri, 14 May 2021 00:00:00 +0000</pubDate><guid isPermaLink="true">https://alexlakatos.com/avocados/2021/05/14/accidental-public-speaker/</guid><description>&lt;p>&lt;strong>I&amp;rsquo;ve given over a hundred talks in the past few years&lt;/strong>. Why? Because I think it&amp;rsquo;s perfectly OK for me to be terrified, but it&amp;rsquo;s not OK for me to stay that way. My biggest fear? Same as you, same as everybody else. I was afraid to speak in front of people. A hundred talks later, &lt;strong>I&amp;rsquo;m still terrified every time I go on stage&lt;/strong>. How did I ever get on stage, though? Well, here&amp;rsquo;s a little trip down memory lane, the series of unfortunate events that got me up on stage. I entirely blame &lt;a href="https://twitter.com/ioana_cis">Ioana&lt;/a> and &lt;a href="https://twitter.com/pensacolla">Marcela&lt;/a> for this btw, if you want the tl;dr. 😅&lt;/p>
&lt;p>Why did I do over a hundred talks, you might ask? Well, I do a bunch of things in this world. In my free time, I&amp;rsquo;m a Mozilla Tech Speaker. I also volunteer for the Mozilla Reps program, and I&amp;rsquo;m a Mentor in that program. Both of those programs are geared towards speaking to tech audiences and building communities. But I do like the idea of a paycheck and getting paid, so I work for Fidel as a Developer Relations Manager. And speaking in public is part of the job. I know, I must be a masochist. There&amp;rsquo;s no other explanation. 🤦&lt;/p>
&lt;p>With Mozilla or work, I&amp;rsquo;ve met a lot of great people, Developer Advocates, Community Builders, and Developers getting over their fear of speaking so they could share their knowledge. Because there is not a lot to do in the &amp;ldquo;Speakers Room&amp;rdquo; at conferences, and because misery loves company, the question I always asked was: &amp;ldquo;How did you get here&amp;rdquo;. Everybody I&amp;rsquo;ve asked has a different origin story. There&amp;rsquo;s no common denominator, really. I will tell you a bit of my story, how I started out.&lt;/p>
&lt;p>It all started about 10 years ago, there was an event called Open Source Open Mind in Romania, and I was working for Mozilla at the time. They asked our team to talk about Mozilla. Still, I was terrified of public speaking, so it definitely wasn&amp;rsquo;t going to be me. Ioana said she&amp;rsquo;d do it, but she was travelling to the US and didn&amp;rsquo;t have time to do the slides. I volunteered to do slides; that was the easy part; I didn&amp;rsquo;t actually have to go in front of 100 something people. So I did the slides. &lt;strong>This was my first mistake&lt;/strong>. 😅&lt;/p>
&lt;p>On the morning of the event, I was waiting at the airport for Ioana to land when she calls me to tell me her flight got delayed, so I should go to the event and stall; she&amp;rsquo;ll get there on the next flight. I get to the event. &lt;strong>This was my second mistake&lt;/strong>. Marcela, the organizer, is a friend and a really nice person; she kept pushing our time slot later and later in the day. It came to the last time slot of the day. Someone had to go up on stage.&lt;/p>
&lt;p>Marcela goes up on stage, looks for Ioana in the audience, but Ioana isn&amp;rsquo;t there yet. She then utters the words that sealed my fate: &amp;ldquo;And now, from Mozilla&amp;hellip; Alex! Alex is going to come and speak about it!&amp;quot;. It took me a while to process. I went up on stage, I put my hands in my pockets, I kept bouncing from one foot to the other, and it took a good minute until I started speaking. It was horrible. I couldn&amp;rsquo;t face my audience. I was looking halfway at my slides, halfway at the sidewall. Sadly, the experience is recorded and &lt;a href="https://www.youtube.com/watch?v=pMnwjpy_3J0&amp;amp;t=5s">still up on YouTube&lt;/a>. I still use it as an example of what not to do when I try to help other people get over their fear of public speaking. Luckily, the experience isn&amp;rsquo;t in English, so you can&amp;rsquo;t really understand how bad it was unless you speak Romanian. 😅&lt;/p>
&lt;p>The problem was, &lt;strong>once I started speaking, I couldn&amp;rsquo;t stop&lt;/strong>—no questions from the audience, no nothing. After I finished my presentation, there was a Q&amp;amp;A part. For every question I got, I kept stepping further and further into the audience space. At a certain point, when the Q&amp;amp;A portion was finished, I was literally in the middle of the room.&lt;/p>
&lt;p>By the time I finished my talk, Ioana actually showed up at the conference. But the damage was already done. &lt;strong>I had spoken in public without dying in the process&lt;/strong>. After that first experience, I was horrified, nervous and &lt;strong>vowed never to do it again&lt;/strong>.&lt;/p>
&lt;p>Two weeks later, I was doing it again, speaking in front of 50 other people. That&amp;rsquo;s how I got started into all this. Turns out, peer pressure is a strong motivating force, especially if done live in front of hundreds of strangers. I&amp;rsquo;m being sarcastic here. Please don&amp;rsquo;t do this to your friends. I highly doubt it&amp;rsquo;s going to work a second time. You might call me the &amp;ldquo;Accidental Public Speaker&amp;rdquo;.&lt;/p>
&lt;p>The other hundred or so talks that followed, I have no excuse for those. 😅 In the meantime, I&amp;rsquo;ve learned a lot about things that help me get on stage and power through fear. I do some embarrassing things before I go on stage now. But they work for me, so I&amp;rsquo;ve &lt;strong>learned to accept the process&lt;/strong> and don&amp;rsquo;t fix it if it&amp;rsquo;s not broken.&lt;/p>
&lt;p>One of the things that work for me has to do with the &amp;ldquo;Psychology of Winning&amp;rdquo;. If I make myself believe I&amp;rsquo;ve &amp;ldquo;won&amp;rdquo; this talk before it even starts, there no pressure to hype my fear levels. It sort of takes the edge off enough for me to start. And once I start, and get through the first 2 minutes of it, practice and a lot of other things kick in, and it&amp;rsquo;s all the better from there.&lt;/p>
&lt;p>How do I trick myself into believing I &amp;ldquo;won&amp;rdquo; something before it happened? Well, this is where the embarrassing things happen. The &amp;ldquo;Psychology of Winning&amp;rdquo; says winning is a state of mind that correlates to physical reactions to winning. The reverse is also true to some extent, so mimicking those physical reactions will induce a mild &amp;ldquo;winning&amp;rdquo; mental state. You see where I&amp;rsquo;m going with this.&lt;/p>
&lt;p>Before my talks, I find a quiet corner at the conference or an empty bathroom stall 😳. And I do winning gestures, like pumping my chest forward, raising my fists in the air, jumping up and down, and screaming my lungs out. In case you&amp;rsquo;ve been at a conference with me before and you&amp;rsquo;ve &amp;ldquo;experienced&amp;rdquo; the ritual, I&amp;rsquo;d like to profusely apologize. 😅 &lt;strong>I hope we can still be friends&lt;/strong>.&lt;/p>
&lt;p>If this all inspired or convinced you to try speaking in front of people, &lt;a href="https://twitter.com/avolakatos">reach out on Twitter&lt;/a>. I&amp;rsquo;m putting together a list of other things I tried to get over my fear of public speaking, some of which actually worked.&lt;/p></description></item><item><title>Meet zx: A Better Way to Write Scripts with Node.js</title><link>https://alexlakatos.com/node/2021/05/11/better-way-to-script/</link><pubDate>Tue, 11 May 2021 00:00:00 +0000</pubDate><guid isPermaLink="true">https://alexlakatos.com/node/2021/05/11/better-way-to-script/</guid><description>&lt;p>Bash is great and all, but it&amp;rsquo;s not something I&amp;rsquo;ll pick up in a day. I was looking for something a little bit more convenient to write scripts in. While looking, I&amp;rsquo;ve stumbled upon this little &lt;a href="https://github.com/google/zx">utility from Google&lt;/a> called &lt;code>zx&lt;/code>. And it&amp;rsquo;s a better way to write scripts using JavaScript.&lt;/p>
&lt;p>I thought I&amp;rsquo;d give &lt;code>zx&lt;/code> a try. It comes with a bunch of things out of the box, like &lt;code>chalk&lt;/code> and &lt;code>fetch&lt;/code>. I know, Node.js already lets me write scripts, but dealing with a bunch of the crap around escaping and sanitizing inputs was painful.&lt;/p>
&lt;h2 id="the-script-way">The Script Way&lt;/h2>
&lt;p>Before I talk about all the great things &lt;code>zx&lt;/code> promised, let&amp;rsquo;s talk about the basics of writing and using scripts first.&lt;/p>
&lt;p>Scripts are all text files and need to start with a shebang at the top (also known as sha-bang, hashbang, pound-bang or hash-pling). The shebang tells the operating system to interpret the rest of the file using that interpreter directive, effectively starting the interpreter and passing the text file along as a parameter.&lt;/p>
&lt;p>So, when scripts start with &lt;code>#!/bin/bash&lt;/code> or &lt;code>#!/bin/sh&lt;/code>, the OS actually runs &lt;code>$ /bin/bash /path/to/script&lt;/code> behind the scenes every time you execute the script.&lt;/p>
&lt;p>Before you can execute the script, you need to declare it in the system as executable. On Unix systems (macOS included), running &lt;code>$ chmod +x ./script.sh&lt;/code> or &lt;code>$ chmod 775 ./script.sh&lt;/code> will do the trick.&lt;/p>
&lt;p>After you&amp;rsquo;ve given permissions to your script to be executed, you can run it with &lt;code>$ ./script.sh&lt;/code>.&lt;/p>
&lt;h2 id="bash-scripts">Bash Scripts&lt;/h2>
&lt;p>A Bash script starts with the bash shebang, followed by a lot of black magic. 😅 For example, to add two numbers that are given as command-line arguments, a script looks like this:&lt;/p>
&lt;div class="highlight">&lt;pre style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4">&lt;code class="language-sh" data-lang="sh">&lt;span style="color:#75715e">#!/bin/bash
&lt;/span>&lt;span style="color:#75715e">&lt;/span>
echo &lt;span style="color:#e6db74">&amp;#34;&lt;/span>$1&lt;span style="color:#e6db74"> + &lt;/span>$2&lt;span style="color:#e6db74"> = &lt;/span>&lt;span style="color:#66d9ef">$((&lt;/span>$1 &lt;span style="color:#f92672">+&lt;/span> $2&lt;span style="color:#66d9ef">))&lt;/span>&lt;span style="color:#e6db74">&amp;#34;&lt;/span>
&lt;/code>&lt;/pre>&lt;/div>&lt;p>To run it, save it as &lt;code>add.sh&lt;/code> and then run the following commands in your Terminal:&lt;/p>
&lt;div class="highlight">&lt;pre style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4">&lt;code class="language-sh" data-lang="sh">$ chmod +x ./add.sh
$ ./add.sh &lt;span style="color:#ae81ff">5&lt;/span> &lt;span style="color:#ae81ff">7&lt;/span>
&lt;/code>&lt;/pre>&lt;/div>&lt;p>The output is going to be &lt;code>5 + 7 = 12&lt;/code>.&lt;/p>
&lt;p>It looks pretty simple if you&amp;rsquo;ve figured out that &lt;code>$index&lt;/code> is the command-line argument. I&amp;rsquo;ve had to look that up while learning shell scripting.&lt;/p>
&lt;h2 id="zx-scripts">&lt;code>zx&lt;/code> Scripts&lt;/h2>
&lt;p>Before you can use &lt;code>zx&lt;/code> to run scripts, you&amp;rsquo;ll need to install it globally via npm, with &lt;code>$ npm i -g zx&lt;/code>. Why didn&amp;rsquo;t you need to install &lt;code>bash&lt;/code>? Because &lt;code>bash&lt;/code> comes installed by default with Unix systems.&lt;/p>
&lt;p>Similarly to all other scripts, a &lt;code>zx&lt;/code> script will start with a shebang. This time, a little more complicated, the &lt;code>zx&lt;/code> shebang. Followed by a lot of JavaScript. Let&amp;rsquo;s try to recreate the above shell script that adds two numbers given as command-line arguments.&lt;/p>
&lt;div class="highlight">&lt;pre style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4">&lt;code class="language-javascript" data-lang="javascript">&lt;span style="color:#75715e">#!/usr/bin/env zx
&lt;/span>&lt;span style="color:#75715e">&lt;/span>
&lt;span style="color:#a6e22e">console&lt;/span>.&lt;span style="color:#a6e22e">log&lt;/span>(&lt;span style="color:#e6db74">`&lt;/span>&lt;span style="color:#e6db74">${&lt;/span>&lt;span style="color:#a6e22e">process&lt;/span>.&lt;span style="color:#a6e22e">argv&lt;/span>[&lt;span style="color:#ae81ff">0&lt;/span>]&lt;span style="color:#e6db74">}&lt;/span>&lt;span style="color:#e6db74"> + &lt;/span>&lt;span style="color:#e6db74">${&lt;/span>&lt;span style="color:#a6e22e">process&lt;/span>.&lt;span style="color:#a6e22e">argv&lt;/span>[&lt;span style="color:#ae81ff">1&lt;/span>]&lt;span style="color:#e6db74">}&lt;/span>&lt;span style="color:#e6db74"> = &lt;/span>&lt;span style="color:#e6db74">${&lt;/span>&lt;span style="color:#a6e22e">process&lt;/span>.&lt;span style="color:#a6e22e">argv&lt;/span>[&lt;span style="color:#ae81ff">0&lt;/span>] &lt;span style="color:#f92672">+&lt;/span> &lt;span style="color:#a6e22e">process&lt;/span>.&lt;span style="color:#a6e22e">argv&lt;/span>[&lt;span style="color:#ae81ff">1&lt;/span>]&lt;span style="color:#e6db74">}&lt;/span>&lt;span style="color:#e6db74">`&lt;/span>)
&lt;/code>&lt;/pre>&lt;/div>&lt;p>To run it, save it as &lt;code>add.mjs&lt;/code> and then run the following commands in your Terminal:&lt;/p>
&lt;div class="highlight">&lt;pre style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4">&lt;code class="language-sh" data-lang="sh">$ chmod +x ./add.mjs
$ ./add.mjs &lt;span style="color:#ae81ff">5&lt;/span> &lt;span style="color:#ae81ff">7&lt;/span>
&lt;/code>&lt;/pre>&lt;/div>&lt;p>The output is going to be &lt;code>/Users/laka/.nvm/versions/node/v16.1.0/bin/node + /usr/local/bin/zx = /Users/laka/.nvm/versions/node/v16.1.0/bin/node/usr/local/bin/zx&lt;/code> 😅. And that&amp;rsquo;s because &lt;code>process.argv&lt;/code>, another Node.js wonder, gets called with three extra arguments before you get to 5 and 7. Let&amp;rsquo;s re-write the script to account for that:&lt;/p>
&lt;div class="highlight">&lt;pre style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4">&lt;code class="language-javascript" data-lang="javascript">&lt;span style="color:#75715e">#!/usr/bin/env zx
&lt;/span>&lt;span style="color:#75715e">&lt;/span>
&lt;span style="color:#a6e22e">console&lt;/span>.&lt;span style="color:#a6e22e">log&lt;/span>(&lt;span style="color:#e6db74">`&lt;/span>&lt;span style="color:#e6db74">${&lt;/span>&lt;span style="color:#a6e22e">process&lt;/span>.&lt;span style="color:#a6e22e">argv&lt;/span>[&lt;span style="color:#ae81ff">3&lt;/span>]&lt;span style="color:#e6db74">}&lt;/span>&lt;span style="color:#e6db74"> + &lt;/span>&lt;span style="color:#e6db74">${&lt;/span>&lt;span style="color:#a6e22e">process&lt;/span>.&lt;span style="color:#a6e22e">argv&lt;/span>[&lt;span style="color:#ae81ff">4&lt;/span>]&lt;span style="color:#e6db74">}&lt;/span>&lt;span style="color:#e6db74"> = &lt;/span>&lt;span style="color:#e6db74">${&lt;/span>&lt;span style="color:#a6e22e">process&lt;/span>.&lt;span style="color:#a6e22e">argv&lt;/span>[&lt;span style="color:#ae81ff">3&lt;/span>] &lt;span style="color:#f92672">+&lt;/span> &lt;span style="color:#a6e22e">process&lt;/span>.&lt;span style="color:#a6e22e">argv&lt;/span>[&lt;span style="color:#ae81ff">4&lt;/span>]&lt;span style="color:#e6db74">}&lt;/span>&lt;span style="color:#e6db74">`&lt;/span>)
&lt;/code>&lt;/pre>&lt;/div>&lt;p>If you run the script now with &lt;code>$ ./add.mjs 5 7&lt;/code>, the output is going to be &lt;code>5 + 7 = 57&lt;/code>. Because JavaScript 🤦. And JavaScript thinks those are strings and concatenates them instead of doing math. Re-writing the script again to deal with numbers instead of strings, it looks like:&lt;/p>
&lt;div class="highlight">&lt;pre style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4">&lt;code class="language-javascript" data-lang="javascript">&lt;span style="color:#75715e">#!/usr/bin/env zx
&lt;/span>&lt;span style="color:#75715e">&lt;/span>
&lt;span style="color:#a6e22e">console&lt;/span>.&lt;span style="color:#a6e22e">log&lt;/span>(&lt;span style="color:#e6db74">`&lt;/span>&lt;span style="color:#e6db74">${&lt;/span>&lt;span style="color:#a6e22e">process&lt;/span>.&lt;span style="color:#a6e22e">argv&lt;/span>[&lt;span style="color:#ae81ff">3&lt;/span>]&lt;span style="color:#e6db74">}&lt;/span>&lt;span style="color:#e6db74"> + &lt;/span>&lt;span style="color:#e6db74">${&lt;/span>&lt;span style="color:#a6e22e">process&lt;/span>.&lt;span style="color:#a6e22e">argv&lt;/span>[&lt;span style="color:#ae81ff">4&lt;/span>]&lt;span style="color:#e6db74">}&lt;/span>&lt;span style="color:#e6db74"> = &lt;/span>&lt;span style="color:#e6db74">${&lt;/span>parseInt(&lt;span style="color:#a6e22e">process&lt;/span>.&lt;span style="color:#a6e22e">argv&lt;/span>[&lt;span style="color:#ae81ff">3&lt;/span>], &lt;span style="color:#ae81ff">10&lt;/span>) &lt;span style="color:#f92672">+&lt;/span> parseInt(&lt;span style="color:#a6e22e">process&lt;/span>.&lt;span style="color:#a6e22e">argv&lt;/span>[&lt;span style="color:#ae81ff">4&lt;/span>], &lt;span style="color:#ae81ff">10&lt;/span>)&lt;span style="color:#e6db74">}&lt;/span>&lt;span style="color:#e6db74">`&lt;/span>)
&lt;/code>&lt;/pre>&lt;/div>&lt;p>The Bash script looked a lot cleaner, right? I agree. And if I ever need to add two numbers from the command line, a Bash script would be a way better option! Bash doesn&amp;rsquo;t shine in a lot of other areas, though. Like parsing JSON files. I gave up trying to figure how to parse JSON files halfway through &lt;a href="https://stackoverflow.com/questions/1955505/parsing-json-with-unix-tools">the StackOverflow post explaining it&lt;/a>. But this is where &lt;code>zx&lt;/code> shines.&lt;/p>
&lt;p>I already know how to parse JSON in JavaScript. And here is what the &lt;code>zx&lt;/code> script for it looks like, using the built-in &lt;code>fetch&lt;/code> module:&lt;/p>
&lt;div class="highlight">&lt;pre style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4">&lt;code class="language-javascript" data-lang="javascript">&lt;span style="color:#75715e">#!/usr/bin/env zx
&lt;/span>&lt;span style="color:#75715e">&lt;/span>
&lt;span style="color:#66d9ef">let&lt;/span> &lt;span style="color:#a6e22e">response&lt;/span> &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#a6e22e">await&lt;/span> &lt;span style="color:#a6e22e">fetch&lt;/span>(&lt;span style="color:#e6db74">&amp;#39;https://raw.githubusercontent.com/AlexLakatos/computer-puns/main/puns.json&amp;#39;&lt;/span>)
&lt;span style="color:#66d9ef">if&lt;/span> (&lt;span style="color:#a6e22e">response&lt;/span>.&lt;span style="color:#a6e22e">ok&lt;/span>) {
&lt;span style="color:#66d9ef">let&lt;/span> &lt;span style="color:#a6e22e">puns&lt;/span> &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#a6e22e">await&lt;/span> &lt;span style="color:#a6e22e">response&lt;/span>.&lt;span style="color:#a6e22e">json&lt;/span>()
&lt;span style="color:#66d9ef">let&lt;/span> &lt;span style="color:#a6e22e">randomPun&lt;/span> &lt;span style="color:#f92672">=&lt;/span> Math.&lt;span style="color:#a6e22e">floor&lt;/span>(Math.&lt;span style="color:#a6e22e">random&lt;/span>() &lt;span style="color:#f92672">*&lt;/span> &lt;span style="color:#a6e22e">puns&lt;/span>.&lt;span style="color:#a6e22e">length&lt;/span>)
&lt;span style="color:#a6e22e">console&lt;/span>.&lt;span style="color:#a6e22e">log&lt;/span>(&lt;span style="color:#a6e22e">chalk&lt;/span>.&lt;span style="color:#a6e22e">red&lt;/span>(&lt;span style="color:#a6e22e">puns&lt;/span>[&lt;span style="color:#a6e22e">randomPun&lt;/span>].&lt;span style="color:#a6e22e">pun&lt;/span>))
&lt;span style="color:#a6e22e">console&lt;/span>.&lt;span style="color:#a6e22e">log&lt;/span>(&lt;span style="color:#a6e22e">chalk&lt;/span>.&lt;span style="color:#a6e22e">green&lt;/span>(&lt;span style="color:#a6e22e">puns&lt;/span>[&lt;span style="color:#a6e22e">randomPun&lt;/span>].&lt;span style="color:#a6e22e">punchline&lt;/span>))
}
&lt;/code>&lt;/pre>&lt;/div>&lt;p>Because I was fancy and used the built-in &lt;code>chalk&lt;/code> module, this &lt;code>zx&lt;/code> script outputs a random pun from &lt;a href="https://puns.dev">https://puns.dev&lt;/a> in the command-line.&lt;/p>
&lt;img
sizes="(min-width: 35em) 720px, 100vw"
srcset='
/img/posts/node/node-json-zx_hu6c8bfe90e18c3e7215fc4b1510c986c8_101088_500x0_resize_lanczos_2.png 500w
, /img/posts/node/node-json-zx_hu6c8bfe90e18c3e7215fc4b1510c986c8_101088_800x0_resize_lanczos_2.png 800w
, /img/posts/node/node-json-zx_hu6c8bfe90e18c3e7215fc4b1510c986c8_101088_1200x0_resize_lanczos_2.png 1200w
'
src="https://alexlakatos.com/img/posts/node/node-json-zx.png"
alt="Computer Pun in Terminal via zx">
&lt;p>Building something similar in &lt;code>shell&lt;/code> had me rage-quit halfway through the process. And that&amp;rsquo;s OK. Finding the right tool for the job is what this post was all about.&lt;/p></description></item><item><title>How to Get Your First Job in Developer Relations</title><link>https://alexlakatos.com/avocados/2021/05/04/breaking-into-devrel/</link><pubDate>Tue, 04 May 2021 00:00:00 +0000</pubDate><guid isPermaLink="true">https://alexlakatos.com/avocados/2021/05/04/breaking-into-devrel/</guid><description>&lt;p>Hi, my name is Alex, and I&amp;rsquo;m an&amp;hellip; Advocate. A Developer Advocate. With Developer Advocates being one of the most sought out commodities on the market this year, I thought I&amp;rsquo;d write up the answer to one of the questions that I answer frequently in my DMs - mostly because I &lt;a href="https://www.swyx.io/three-strikes/">read this thing&lt;/a> from &lt;a href="https://twitter.com/swyx">@swyx&lt;/a>.&lt;/p>
&lt;blockquote>
&lt;p>How did you break into Developer Relations?&lt;/p>
&lt;/blockquote>
&lt;p>If I knew what I did exactly to end up here, it would probably be an easy answer. But it isn&amp;rsquo;t because I didn&amp;rsquo;t wake up one day and decided this was what I wanted to be when I grew up. My idols and role models were Developer Advocates, and I didn&amp;rsquo;t think I was good enough to be the same. On top of that, I was a Senior Developer with quite a few years of experience under my belt. I didn&amp;rsquo;t feel like giving that up to be a &amp;ldquo;&lt;em>Junior&lt;/em>&amp;rdquo; anything again.&lt;/p>
&lt;p>If you ask other people in the industry - and I asked quite a few of them in a survey - everybody has a different story. Because &lt;strong>Developer Relations is such a new industry&lt;/strong>. Even defining it is tricky because it depends on which side of the aisle you&amp;rsquo;re asking. &lt;a href="https://www.leggetter.co.uk/2016/02/03/defining-developer-relations.html">Phil tried to define Developer Relations&lt;/a> a while back, and when you look at it, it&amp;rsquo;s got so many roles that overlap. &lt;strong>Evangelism versus Advocacy, Marketing versus Community, Technical Writing versus Developer Experience&lt;/strong>. And they&amp;rsquo;re all a part of DevRel, but &lt;strong>the skills required for the role depend from company to company&lt;/strong>, not necessarily from role to role.&lt;/p>
&lt;p>&lt;a href="https://medium.com/@dzello/how-i-got-into-developer-advocacy-93bad1678a67">Josh said that not all journeys are the same&lt;/a>, and I tended to agree with him. But then I got the chance to meet and interview many other Developer Advocates, Community Managers and Technical Writers, and some patterns emerged. Turns out, &lt;a href="https://www.youtube.com/watch?v=Frt_fvEfROU">while not all journeys were the same, all roads lead to Rome&lt;/a>.&lt;/p>
&lt;p>I&amp;rsquo;ve spent some time identifying a set of skills each of us in DevRel had before joining the industry. Here&amp;rsquo;s a list that also tells you how you can acquire them now, outside of DevRel. Because it turns out &lt;strong>you don&amp;rsquo;t have to give up your career progression&lt;/strong> and start all over, &lt;strong>you can break in&lt;/strong>. Not a single one of us had all the skills we use today.&lt;/p>
&lt;blockquote>
&lt;p>We&amp;rsquo;ve all started out with only one or two of the required skills and learned the rest on the job. So don&amp;rsquo;t worry, you can make do with picking up only a few of these skills!&lt;/p>
&lt;/blockquote>
&lt;h2 id="community-building">Community Building&lt;/h2>
&lt;p>There are open-source programs explicitly designed for building community. I&amp;rsquo;ll share a list of my favourites, but I&amp;rsquo;m pretty sure most open-source projects won&amp;rsquo;t say no if you start helping out. It doesn&amp;rsquo;t have to be something as minor as code. It can be something truly helpful, like commenting on old issues to see if people still care about them. Or getting together with some people to test a project. For example, the Reps program even sponsored pizza or coffee for people to get together and help out around the Mozilla mission. Fedora does the same for its Ambassadors. I&amp;rsquo;m pretty sure I missed a few, &lt;a href="https://twitter.com/avolakatos">so let me know on Twitter, and I&amp;rsquo;ll add more&lt;/a>.&lt;/p>
&lt;ul>
&lt;li>&lt;a href="https://wiki.mozilla.org/Reps">Mozilla Reps&lt;/a> are passionate Mozillians who mobilize and develop functional and local/regional Mozilla communities. They are committed to educate and empower people to support Mozilla&amp;rsquo;s mission and contribute to the project based on Mozilla&amp;rsquo;s leadership agreements.&lt;/li>
&lt;li>&lt;a href="https://fedoraproject.org/wiki/Ambassadors">Fedora Ambassadors&lt;/a> are responsible for helping to grow the contributor base and act as a liaison between other FLOSS projects and the Fedora community.&lt;/li>
&lt;/ul>
&lt;h2 id="public-speaking">Public Speaking&lt;/h2>
&lt;p>With a pandemic, travel bans and no in-person events, public speaking is a different beast than when I started. There are different challenges involved in speaking in front of a live audience as opposed to a camera. Most learning communities there haven&amp;rsquo;t yet adapted to online speaking, so if you find yourself stuck while picking this one up, &lt;a href="https://twitter.com/avolakatos">please reach out&lt;/a>. I&amp;rsquo;m more than happy to have learning sessions. We&amp;rsquo;ve been training people online to speak in public for a few years with Mozilla Tech Speakers, happy to pick it up again.&lt;/p>
&lt;ul>
&lt;li>&lt;a href="https://www.globaldiversitycfpday.com/">Global Diversity CFP Day&lt;/a> is a tech-wide cross-community event based on the successful workshops held in advance of ScotlandCSS and ScotlandJS in 2016. Over the years it has evolved into a focused 1-day event designed to help you go from an idea to skills and a talk ready to submit to a conference.&lt;/li>
&lt;li>&lt;a href="https://www.toastmasters.org/">Toastmasters&lt;/a> is a nonprofit educational organization that teaches public speaking and leadership skills through a worldwide network of clubs. While they focus more on improvised topics, it will get you comfortable to step up in front of strangers and try to keep a straight face while you&amp;rsquo;re talking about a random topic. This will later evolve into not being afraid of the Q&amp;amp;A session of your talks.&lt;/li>
&lt;li>&lt;a href="https://wiki.mozilla.org/TechSpeakers">Mozilla Tech Speakers&lt;/a> started as an experiment in 2015 designed by &lt;a href="https://twitter.com/freshelectrons">Havi Hoffman&lt;/a> and &lt;a href="https://twitter.com/dietrich">Dietrich Ayala&lt;/a> from the Mozilla Developer Relations team. They invited a handful of volunteers who were passionate about giving talks at conferences on Mozilla-related technologies and the Open Web in general to trial a program that would support their conference speaking activities and amplify their impact. It scaled to 100 people, &lt;a href="https://discourse.mozilla.org/t/pausing-tech-speaker-program-support/66157/8">but sadly in 2020, it was axed&lt;/a> when &lt;a href="https://blog.mozilla.org/blog/2020/08/11/changing-world-changing-mozilla/">Mozilla did their second round of layoffs&lt;/a>. However, the resources developed for the program are still some of the best around, so check them out.&lt;/li>
&lt;/ul>
&lt;h2 id="technical-writing">Technical Writing&lt;/h2>
&lt;p>I must admit, writing, in general, was something I struggled with. But new resources and communities for technical writing keep popping up. It&amp;rsquo;s getting easier to get started. What helped me was &lt;strong>transforming the writing bit from a skill into a habit&lt;/strong>. I&amp;rsquo;ve struggled with writing consistently for 3 years, tried various things, but I think I&amp;rsquo;ve finally figured it out. For the past 189 days, I&amp;rsquo;ve challenged myself to write at least 100 words every day. And you (and me both) would think that&amp;rsquo;s not a lot. It seemed like a manageable quantity when I started. Turns out those 100 words add up when you do it every day. So far, it&amp;rsquo;s been 42687 words and 19 articles published in those 189 days. I&amp;rsquo;ve &lt;a href="https://twitter.com/avolakatos/status/1321423080095469568">used Twitter as a way to hold myself publicly accountable&lt;/a>, but there are other communities to help you be accountable while you learn or to help improve your writing style.&lt;/p>
&lt;ul>
&lt;li>&lt;a href="https://www.writethedocs.org/">Write the Docs&lt;/a> is a global community of people who care about documentation. They consider everyone who cares about communication, documentation, and their users to be a member of their community. This can be programmers, tech writers, developer advocates, customer support, marketers, and anyone else who wants people to have great experiences with software.&lt;/li>
&lt;li>&lt;a href="https://bloggingfordevs.com/">Blogging for Devs&lt;/a> is both a free email course and a paid community. Whether you&amp;rsquo;re just starting out, trying to revive an existing blog, or want to get past a plateau, this course and newsletter is going to help.&lt;/li>
&lt;li>&lt;a href="https://developers.google.com/tech-writing/overview">Google has a collection of courses&lt;/a> and learning resources that aims to help you improve your technical documentation. Learn how to plan and author technical documents. You can also learn about the role of technical writers at Google.&lt;/li>
&lt;/ul>
&lt;h2 id="event-organizing">Event Organizing&lt;/h2>
&lt;p>The barrier to start organizing events has considerably lowered with the onset of the pandemic. Before, it involved finding a physical space, a speaker, an audience and a sponsor for the refreshments. It was a lot easier to find an established group and help out instead of starting your own. I went at it the hard way, starting a London JavaScript meetup with &lt;a href="https://twitter.com/chris_noring">Chris&lt;/a> and &lt;a href="https://twitter.com/simona_cotin">Simona&lt;/a>. Chris and I convinced our employer to let us use the office during the weekend, and we asked our friends, like Simona, to come in and do free Angular workshops for people. After the meetup group got enough people, sponsors and venues started contacting us, so we didn&amp;rsquo;t have to run around looking for them. But with our attendee numbers multiplying fast, the three of us weren&amp;rsquo;t enough to get everything done, so we were always on the lookout for people to help us out. Be those people for other groups! I highly doubt anyone is going to turn you down.&lt;/p>
&lt;p>If helping out a group isn&amp;rsquo;t your thing, you can always put on a show of your own. In the age of online events, you don&amp;rsquo;t need a space or a sponsor. You can do it with a Zoom call, a speaker, and an audience. If you&amp;rsquo;re looking for groups or a place to find your audience, here&amp;rsquo;s a list.&lt;/p>
&lt;ul>
&lt;li>&lt;a href="https://techtalks.io/">techtalks.io&lt;/a> is a new tool for community building that evolved from the need for a better Meetup. I honestly think it&amp;rsquo;s the natural progression of Meetup. You can join a community of engineering, design, product and UX experts, organize, watch and discuss talks, get involved with a community and share your ideas.&lt;/li>
&lt;li>&lt;a href="https://www.meetup.com">Meetup&lt;/a> is a platform for finding and building local communities. People use Meetup to organize events, meet new people, learn new things, find support, get out of their comfort zones, and pursue their passions, together.&lt;/li>
&lt;/ul>
&lt;h2 id="builders">Builders&lt;/h2>
&lt;p>I&amp;rsquo;m afraid I don&amp;rsquo;t have a lot of options here. &lt;strong>The only thing I can tell you is to build things&lt;/strong>. What things? It doesn&amp;rsquo;t really matter. The goal is to &lt;strong>pick up something new&lt;/strong>, &lt;strong>experiment with it&lt;/strong> for a few days, and then &lt;strong>tell other people what you did&lt;/strong>. It doesn&amp;rsquo;t have to be a next career move, it doesn&amp;rsquo;t have to be useful to anyone but yourself, and it doesn&amp;rsquo;t have to be maintained for years to come. Build things, and that&amp;rsquo;s it.&lt;/p>
&lt;p>If you&amp;rsquo;ve stumbled upon my &lt;a href="https://github.com/AlexLakatos/">GitHub profile&lt;/a>, you&amp;rsquo;ll see I&amp;rsquo;m part of a dozen organizations, most of them abandoned, and that&amp;rsquo;s ok. I&amp;rsquo;ve also got almost 100 repositories that are just there, with only a handful actively maintained. Some of them are so cringe-worthy, with hacked-together code, that I still haven&amp;rsquo;t made public. And that&amp;rsquo;s ok.&lt;/p>
&lt;p>All these got me a valuable skill: I can build something with a clearly defined scope and throw it away as soon as it served its purpose. I don&amp;rsquo;t get overly attached to a piece of code or a project just because. And it doesn&amp;rsquo;t have to be perfect.&lt;/p>
&lt;h2 id="can-you-be-a-junior-developer-advocate">Can You Be a Junior Developer Advocate?&lt;/h2>
&lt;blockquote>
&lt;p>Yes, definitely, of course!&lt;/p>
&lt;/blockquote>
&lt;p>I know this might sound controversial. A lot of the Developer Advocates out there will tell you to be a Solution Architect before thinking about being a Developer Advocate. I&amp;rsquo;d like to formally and unequivocally call &amp;ldquo;BullShit!&amp;rdquo; here. Just because it took some people forever to get here (me included), it doesn&amp;rsquo;t mean it was right or that you should suffer. No! There are Junior Developer Advocates, Junior Community Managers. I&amp;rsquo;m not sure about Junior Technical Writers, but surely there are some, so let me know in the comments section below!&lt;/p>
&lt;p>The quality that makes a successful &lt;em>devrella&lt;/em> is being able to &lt;strong>understand developers pain points&lt;/strong>. Sure, some slower people like me need to suffer first before we can understand the problems, so we can fix them. Some smarter people, like &lt;a href="https://twitter.com/mary_grace/">Mary&lt;/a>, could figure out this one without going through the grind. That means anyone can get there, so Junior Developer Advocates are a thing! Next time you see an opening, don&amp;rsquo;t let the fact that you haven&amp;rsquo;t suffered in the industry for the past ten years discourage you from applying. &lt;strong>This field needs a fresh perspective&lt;/strong> a lot more than it needs dinosaurs like me.&lt;/p>
&lt;h2 id="bonus-round">Bonus Round&lt;/h2>
&lt;p>As Shawn put it, &amp;ldquo;DevRel is a not generalizable skill, or rather, there&amp;rsquo;s such a thing as devrel-company fit&amp;rdquo;. You might have noticed this blog post was technology agnostic. And that&amp;rsquo;s because it requires a great deal of passion and empathy. Those skills are not as easy to acquire as functional skills. Try to find a product or community you&amp;rsquo;re passionate about or something you&amp;rsquo;ve used or been part of before. It&amp;rsquo;s easier to get your first job in Developer Relations for a company when you&amp;rsquo;ve already got some domain knowledge. There&amp;rsquo;s also some degree of credibility involved. I couldn&amp;rsquo;t get a job advocating for an iOS company, for example. You should try to get some experience in your space, really understand the domain you&amp;rsquo;re trying to break in as a &lt;em>devrella&lt;/em>.&lt;/p>
&lt;p>I also co-curate alongside &lt;a href="https://twitter.com/iza_biro">Julia&lt;/a>, a weekly email roundup of Developer Avocados 🥑 Call-For-Papers, resources and articles. If you want to learn more about DevRel, you &lt;strong>should definitely subscribe&lt;/strong> to &lt;a href="https://developeravocados.net/">Developer Avocados 🥑 Weekly&lt;/a>!&lt;/p>
&lt;p>If you&amp;rsquo;ve read this far, or you&amp;rsquo;re considering getting into Developer Relations, &lt;a href="https://twitter.com/avolakatos">reach out on Twitter&lt;/a>! I&amp;rsquo;m always happy to answer your questions or help you land your first role in DevRel.&lt;/p></description></item><item><title>2020, Thank You!</title><link>https://alexlakatos.com/personal/2021/01/09/2020-thank-you/</link><pubDate>Sat, 09 Jan 2021 09:00:00 +0000</pubDate><guid isPermaLink="true">https://alexlakatos.com/personal/2021/01/09/2020-thank-you/</guid><description>&lt;p>2020 was kind of shit. Go on, it&amp;rsquo;s OK to admit it. But when I look in the mirror, 2020 was a lot healthier for me than usual. I&amp;rsquo;ve seen quite a few 2020 reviews this past week. It&amp;rsquo;s the fashionable thing to do. Hence this is my first yearly review. I&amp;rsquo;m going to try to use this as a sort of guide for next year. Now, whilst most reviews I&amp;rsquo;ve read highlighted the things people couldn&amp;rsquo;t do in 2020, or the exact ways in which it sucked, I made a conscious decision to try to find things that actually went well for me in 2020, and not even mention any of the negative shit 2020 is famous for.&lt;/p>
&lt;p>It turns out, I didn&amp;rsquo;t have to look that hard for things to be thankful for. The &lt;a href="https://twitter.com/hashtag/DevRelLife">DevRel life&lt;/a> is full of chaos, so the fact that I didn&amp;rsquo;t travel for most of 2020 unlocked a lot of possibilities. A lot of those things that kept being pushed to &amp;ldquo;when I get a change&amp;rdquo; got done, so truly, thank you, 2020, you haven&amp;rsquo;t been all shit. And I honestly think I couldn&amp;rsquo;t have done most of these things if I wasn&amp;rsquo;t forced to stop travelling. I certainly couldn&amp;rsquo;t have stopped travelling on my own. My idea of &amp;ldquo;taking it easy&amp;rdquo; this year was to have a flight booked every two weeks, instead of the usual two flights a week.&lt;/p>
&lt;h2 id="first-of-all-what-happened-in-2020">First of All, What Happened in 2020?&lt;/h2>
&lt;blockquote align="center" class="twitter-tweet" data-theme="dark">&lt;p lang="en" dir="ltr">💃The last 3 years have been a wild ride, I loved being part of the award winning &lt;a href="https://twitter.com/hashtag/DevRel?src=hash&amp;amp;ref_src=twsrc%5Etfw">#DevRel&lt;/a> team at &lt;a href="https://twitter.com/VonageDev?ref_src=twsrc%5Etfw">@VonageDev&lt;/a>, I&amp;#39;m so proud of how much we grew!&lt;br>&lt;br>🏄It&amp;#39;s my last week here, and I&amp;#39;ll miss every one in our amazing team, but I&amp;#39;m also super excited about the next adventure.&lt;br>&lt;br>🙇‍♂️Thanks! &lt;a href="https://t.co/Ct6xbQFmVk">pic.twitter.com/Ct6xbQFmVk&lt;/a>&lt;/p>&amp;mdash; Alex Lakatos 🥑🇬🇧 (@avolakatos) &lt;a href="https://twitter.com/avolakatos/status/1270113634245660674?ref_src=twsrc%5Etfw">June 8, 2020&lt;/a>&lt;/blockquote>
&lt;h3 id="switched-over-to-the-dark-side">👷Switched Over to the Dark Side&lt;/h3>
&lt;p>There were no cookies🤷. I&amp;rsquo;ve moved from an individual contributor role at Vonage this year to a manager position at Fidel. And in true Laka fashion, I still refuse to manage people. OK, I did manage a few people for a little while, but I&amp;rsquo;ve since spent most of my time trying to make myself redundant. Instead of building a team of Developer Advocates, like it&amp;rsquo;s the fashion, I&amp;rsquo;ve spent the past six months building a &lt;a href="https://alexlakatos.com/avocados/2020/12/06/creating-devrel-culture/">DevRel Culture&lt;/a> inside Fidel, trying to make myself redundant.&lt;/p>
&lt;blockquote align="center" class="twitter-tweet" data-theme="dark">&lt;p lang="en" dir="ltr">How it started: How it&amp;#39;s going: &lt;a href="https://t.co/tFKsi3WQ3H">pic.twitter.com/tFKsi3WQ3H&lt;/a>&lt;/p>&amp;mdash; Alex Lakatos 🥑🇬🇧 (@avolakatos) &lt;a href="https://twitter.com/avolakatos/status/1315613201703329792?ref_src=twsrc%5Etfw">October 12, 2020&lt;/a>&lt;/blockquote>
&lt;h3 id="33-less-laka">🏋️33% Less Laka&lt;/h3>
&lt;p>I lost quite a bit of weight this year. 52 KG (110 Pounds) to be exact, which amounted to 33% of my body mass. There were a few factors that contributed to this one:&lt;/p>
&lt;ul>
&lt;li>
&lt;p>I started looking at what I ate. No, it&amp;rsquo;s not a figure of speech. I literally take a picture of my food before I eat it. It forces me to pause, and figure out if what I have on my plate is right for me. I also used to send that picture to a random stranger I found on the internet and was paying to give me advice about my nutrition. It worked from the very first picture because I was so ashamed with the quantity on my plate, I took part of it off and re-did the picture. Didn&amp;rsquo;t put the food back on the plate afterwards. The only thing that kept me honest was the eye-watering amount of money I paid for the service, I wasn’t going to pay to cheat.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>I started going to the gym. Maybe a little too much, and it&amp;rsquo;s turning into an addiction. I&amp;rsquo;ve got 3 sessions a week with a personal trainer, and another 7 without one. The PT sessions are all focused on functional training, while the ones without are all about burning fat in steady-state cardio, usually on a treadmill. Because that allows me to listen to audiobooks or watch things on YouTube, it feels less boring, and it&amp;rsquo;s currently my happy place.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>I did the math. With lockdown happening, I started cooking all my meals instead of eating out. That made it easy to better track what I ate in MyFitnessPal. My Fitbit watch tracks my calories burned during the day, so I started paying closer attention to the difference between what I ate and what I burn. I try really, really hard to make sure I&amp;rsquo;ve got a deficit of at least 1000 calories a day.&lt;/p>
&lt;/li>
&lt;/ul>
&lt;blockquote align="center" class="twitter-tweet" data-theme="dark">&lt;p lang="en" dir="ltr">🤔I gave up smoking two months ago, but I think I just traded that for a new vice. That&amp;#39;s a lot of &lt;a href="https://twitter.com/audibleuk?ref_src=twsrc%5Etfw">@audibleuk&lt;/a> I&amp;#39;ve listened to in these past two months... &lt;a href="https://twitter.com/hashtag/ThursdayThoughts?src=hash&amp;amp;ref_src=twsrc%5Etfw">#ThursdayThoughts&lt;/a> &lt;a href="https://t.co/uCxJJqMbRS">pic.twitter.com/uCxJJqMbRS&lt;/a>&lt;/p>&amp;mdash; Alex Lakatos 🥑🇬🇧 (@avolakatos) &lt;a href="https://twitter.com/avolakatos/status/1311639609068212224?ref_src=twsrc%5Etfw">October 1, 2020&lt;/a>&lt;/blockquote>
&lt;h3 id="gave-up-smoking">💨Gave up Smoking&lt;/h3>
&lt;p>As we started going to the gym more and more, the cigarettes began to affect our training. Julia was the first to quit, her training program is a lot more intense than mine. But after a few months of smoking alone, I just didn&amp;rsquo;t get the same benefits out of it. The negative impact of being the only smoker in the house outweighed the stress release aspect of it. So one day I decided to quit, cold turkey. Of course, that didn&amp;rsquo;t happen. Just the idea that I was running out of cigarettes sent me into a mild panic attack. I think that&amp;rsquo;s been hardwired into any smoker out there so deep, that just the idea I was running low was too much to bear.&lt;/p>
&lt;p>So I tried tricking the lizard brain inside and bought a fresh pack of smokes. Of which I smoked exactly 5 cigarettes over the course of 3 days. And those were the last I&amp;rsquo;ve smoked. But I still carry around that unfinished pack of cigarettes with me, everywhere I go. I can smoke any time I want to, I just &lt;em>choose&lt;/em> not to smoke. I think that&amp;rsquo;s the trick that finally helped me to quit smoking. The other time I tried, I lasted a whole of 10 hours without smoking, after which I proceeded to make up for it. It&amp;rsquo;s been 5 months this time, and hopefully, this one is for good.&lt;/p>
&lt;blockquote align="center" class="twitter-tweet" data-theme="dark">&lt;p lang="en" dir="ltr">🥳For he&amp;#39;s a jolly good fellow, and it&amp;#39;s his birthday today, we thought it fitting today&amp;#39;s &lt;a href="https://twitter.com/hashtag/adventcado?src=hash&amp;amp;ref_src=twsrc%5Etfw">#adventcado&lt;/a> was &lt;a href="https://twitter.com/avolakatos?ref_src=twsrc%5Etfw">@avolakatos&lt;/a>.&lt;br>&lt;br>🎂He talks about a lot of things in there, but what he really means is: eat more cake today!&lt;a href="https://t.co/A7rsa2jSIC">https://t.co/A7rsa2jSIC&lt;/a>&lt;/p>&amp;mdash; Developer Avocados 🥑 (@DevRelAvocados) &lt;a href="https://twitter.com/DevRelAvocados/status/1337717723158241280?ref_src=twsrc%5Etfw">December 12, 2020&lt;/a>&lt;/blockquote>
&lt;h3 id="36-issues-of-the-developer-avocados-weekly-newsletter">🥑36 Issues of the Developer Avocados Weekly Newsletter&lt;/h3>
&lt;p>As you&amp;rsquo;ve probably figured out by now, a year has a bit more than 36 weeks. 52 if you must be exact. Why am I celebrating this, though? Because it&amp;rsquo;s a hell of a lot more than 0. That&amp;rsquo;s right, in a shit year, with taking a month at a time off from the newsletter, we kept finding the strength and motivation to keep coming back to send it again. Eventually. While we technically made no money from it.&lt;/p>
&lt;p>And the fact that we could still find passion in something pre-pandemic, that&amp;rsquo;s definitely worth celebrating in my book. Oh, and towards the end of the year, we found the energy to run an &lt;a href="https://avocados.dev/">advent calendar with 24 Developer Avocados&lt;/a>, which required us to get out of our comfort zone and reach out to people we haven&amp;rsquo;t met. Especially in a time when people can&amp;rsquo;t be expected to give a damn.&lt;/p>
&lt;blockquote align="center" class="twitter-tweet" data-theme="dark">&lt;p lang="en" dir="ltr">👩‍🎨It took a while, but &lt;a href="https://t.co/6YcRBkfRXP">https://t.co/6YcRBkfRXP&lt;/a> finally has a new sexy look, all thanks to &lt;a href="https://twitter.com/hj_chen?ref_src=twsrc%5Etfw">@hj_chen&lt;/a> ! &lt;br>&lt;br>🦸‍♀️She did wonders with the CSS and inspired me to ditch Jekyll &amp;amp; GH Pages in favor of &lt;a href="https://twitter.com/GoHugoIO?ref_src=twsrc%5Etfw">@GoHugoIO&lt;/a> &amp;amp; &lt;a href="https://twitter.com/Netlify?ref_src=twsrc%5Etfw">@Netlify&lt;/a> .&lt;/p>&amp;mdash; Alex Lakatos 🥑🇬🇧 (@avolakatos) &lt;a href="https://twitter.com/avolakatos/status/1257642627702325250?ref_src=twsrc%5Etfw">May 5, 2020&lt;/a>&lt;/blockquote>
&lt;h3 id="got-a-new-website">🎨Got a New Website&lt;/h3>
&lt;p>After 4 years, I&amp;rsquo;ve finally got the time to make a new website. Or at least, I had the time to stand there and look pretty while &lt;a href="https://chenhuijing.com/">Hui Jing&lt;/a> did all the work. But it&amp;rsquo;s happened, and it made me want to add more to the website, regularly. I&amp;rsquo;ve written more articles for it this year than any other so far. The new &lt;a href="https://twitter.com/avolakatos/status/1321423080095469568">habit-forming routine&lt;/a> I&amp;rsquo;ve got might have something to do with this as well. So far, I&amp;rsquo;ve got 73 days in a row of writing 100 words or more. &amp;ldquo;Science&amp;rdquo; says that if I got to 66, it&amp;rsquo;s a habit and here to stay. No matter the outcome, it has certainly helped me write more this year. I think my goal was 12 articles a year for the past few years, but this is the first year I&amp;rsquo;ve actually managed to do it. And then some. I think I managed to publish 4 articles in a single week, and that’s something I didn’t think I could do.&lt;/p>
&lt;h2 id="what-about-2021">What About 2021?&lt;/h2>
&lt;h3 id="survive">😷Survive&lt;/h3>
&lt;p>Get to the next level, year, whatever. That&amp;rsquo;s it. That&amp;rsquo;s the resolution.&lt;/p>
&lt;p>If survival seems too achievable, I&amp;rsquo;ve got a few other things I could try doing.&lt;/p>
&lt;ul>
&lt;li>Create a best-in-class Developer Portal. Open-source it from day 1, so other people could easily use it. I&amp;rsquo;ll consider this a success if it&amp;rsquo;s as easy to deploy as it would be to do one of the static-site generators.&lt;/li>
&lt;li>Publish every week. I&amp;rsquo;ve started early on this one. I&amp;rsquo;ve started writing a minimum of 100 words every day. &lt;a href="https://twitter.com/avolakatos">You can follow along with my progress on Twitter&lt;/a>. But I&amp;rsquo;m hoping that&amp;rsquo;s going to help me publish 52 articles this year. I&amp;rsquo;ll consider this goal a success even if it&amp;rsquo;s 52 articles, and not necessarily one every single week.&lt;/li>
&lt;/ul>
&lt;script async src="https://platform.twitter.com/widgets.js" charset="utf-8">&lt;/script></description></item><item><title>Creating a DevRel Culture</title><link>https://alexlakatos.com/avocados/2020/12/06/creating-devrel-culture/</link><pubDate>Sun, 06 Dec 2020 23:56:00 +0000</pubDate><guid isPermaLink="true">https://alexlakatos.com/avocados/2020/12/06/creating-devrel-culture/</guid><description>&lt;p>How big is your Developer Relations team? I&amp;rsquo;m betting it&amp;rsquo;s small, same as mine. Unless you work for Microsoft, Google, Amazon, Twillio or Vonage(The Artists Formerlly Known as Nexmo), it&amp;rsquo;s pretty hard to justify a double-digits DevRel team. And that&amp;rsquo;s OK; not everyone needs 70 people to do Developer Relations. It wouldn&amp;rsquo;t hurt though. Probably that&amp;rsquo;s why everyone is scrambling to justify their program right about now and to increase their budget for next year.&lt;/p>
&lt;p>What happens if you work for a company that can&amp;rsquo;t afford 10 Developer Advocates? I happen to work for a startup with 60 people; it&amp;rsquo;s been tough to sell a big team to my CEO. And trust me, I&amp;rsquo;ve tried.&lt;/p>
&lt;p>I talked last week about starting a Developer Relations Program, but it’s still a lot of work for a team of one. My challenge was scaling a DevRel program without increasing the headcount. I&amp;rsquo;ve achieved that by creating a DevRel Culture instead.&lt;/p>
&lt;p>Yeah, you’ve read that right. And it’s not some HR hocus pocus. Creating a DevRel Culture turns out to be highly effective. While you probably can’t have anyone else inside your company that can do all the things you do, it doesn’t mean that you can’t find someone that is more suited to do a little slice of what you do. The trick is finding multiple people, each able to do one aspect of your job better than you. There are quite a few skills required of a Developer Advocate, but most of them are found in other roles within a company. So why not use those for help?&lt;/p>
&lt;p>If you haven’t read about &lt;a href="https://alexlakatos.com/avocados/2020/11/24/building-first-year-devrel-program/">my journey to build a 1st-year DevRel Program&lt;/a>, let give you some context. I’ve identified a few day-to-day activities that I should be doing, to make a difference. Let’s take a look at those activities, and then see where in the company you could find people to do a better job than you. Basically doing 20% DevRel for 80% of the impact.&lt;/p>
&lt;ul>
&lt;li>Writing the &lt;a href="https://fidel.uk/docs/">Documentation&lt;/a> and &lt;a href="https://reference.fidel.uk/reference">API Reference&lt;/a> - The engineers writing the feature are good people to document it. Or the product manager that wrote the use case for it. Or the Quality Assurance Engineer that tested it. Depending on the size of your company, you might even have all three of those people to help.&lt;/li>
&lt;li>Building &lt;a href="https://fidel.uk/docs/web-sdk">SDKs&lt;/a> - The engineers that wrote the code for the API can build the SDK wrapper for it as well. And since they write production code every week, they&amp;rsquo;ll most likely do a better job of it than you.&lt;/li>
&lt;li>Create demo applications - You guessed it by now. If it has to do with coding, your Engineering department can probably do a better job than you.&lt;/li>
&lt;li>Write &lt;a href="https://fidel.uk/blog/author/laka">blog posts&lt;/a> - Anyone, and I mean literally, anyone in the company can write a blog post. Now, it might not come as easy or natural for everyone, but here is where you come in. You&amp;rsquo;re used to lowerering barriers to entry for developers using your product, why not apply the same principles for writing articles for your blog?
No one can fake the authenticity of the people building your product, not even you. So why not have them tell their stories, instead of you? Sure, you&amp;rsquo;ll get enough pushback, everyone is afraid of writing. So make it easy for them. It&amp;rsquo;s your job to guide people in writing that first blog post. And try to make it as easier for them as possible. For example, I&amp;rsquo;ve used &lt;a href="https://fidel.uk/blog/we-the-people-katherine-degnen/">an interview format&lt;/a> to get people to write their first blog post. I&amp;rsquo;ve had 30-minute calls with people where they presented their idea, and I&amp;rsquo;ve had those transcribed and edited into a blog post. I&amp;rsquo;ve also had people come up with their own ideas and writing them inside the week because they were passionate about it. But most importantly, I&amp;rsquo;ve bribed everyone involved with limited edition quality swag 😊&lt;/li>
&lt;li>Sponsor online events - Your marketing team has probably sponsored a lot more events than you. They’ve been around longer. And their events cost a hell of a lot more than yours. They’ve got all that experience dealing with the event organizers. So ask them for help here!&lt;/li>
&lt;li>live-stream on Twitch / Youtube - You&amp;rsquo;ve got another group of people in the company that are trained for speaking at online events, mainly webinars. And that&amp;rsquo;s your Sales team. So get them to stream some of their webinars live on Twitch, and see the magic happen.&lt;/li>
&lt;li>Give talks at online events - Your CEO probably has a lot of experience pitching your investors. And they probably deliver a quarterly update to your Board of Directors. They’ve also probably dealt with the press before. So they’ve got all the training they need in order to go on stage and tell a compelling story, backed with data. If time is a constraint, you’ve got a backup here. Your Sales team is also used to speaking in front of small groups of people, with lots of slides. Get them to drop the sales pitch, and you&amp;rsquo;ve got a talk ready to be given, with a trained person ready to do it.&lt;/li>
&lt;li>Answer support queries - Your engineers are the people you usually go to with the support queries. So why not eliminate the intermediary (yes, that&amp;rsquo;s you), and have the support queries go to the on-call engineers right away?&lt;/li>
&lt;li>Have customer calls - Your Product Manager is the person you go to with feedback after each call. So why not save yourself the hassle, and have them join those calls to begin with? Sure, maybe they’re not trained to gather feedback, but you can help them out during the first calls, do a bit of handholding, and then take the whole thing off your plate. It’s going to help free you for other things.&lt;/li>
&lt;li>Maintain the &lt;a href="https://community.fidel.uk/">developer community&lt;/a> forum - In here, most questions have to deal with using your product. Your Support people are probably your best bet. They are trained to answer questions coming from existing customers, they can do the same for people who aren’t exactly customers, but who have questions around your APIs.&lt;/li>
&lt;li>Create a feedback mechanism between the product and developers using the product - This can be easily solved with technology. Changing the Developer Experience of your product to have a feedback mechanism will save yourself the hassle. The only trick is getting your Product Manager to actually read and action that feedback. I’m kidding, it’s not a trick at all, and they’ll probably thank you for making it easier for them to do their job.&lt;/li>
&lt;li>Help with &lt;a href="https://careers.fidel.uk/">recruitment efforts&lt;/a> - Your HR person is better equipped for recruitment purposes, so why not have them help?&lt;/li>
&lt;/ul>
&lt;p>I&amp;rsquo;ve spent the past 6 months at Fidel trying to help other people to do my job, basically trying to make myself redundant. And it&amp;rsquo;s worked brilliantly! It doesn&amp;rsquo;t mean I do absolutely nothing now, but it does mean that I provide guidance and review most things before we put them out, instead of trying to do everything, and badly!&lt;/p>
&lt;p>I should also mention I come from a culture that relies heavily on… incentive. They’ve tried to legalize bribes a few years back. So I’m quite familiar with using incentives to motivate reluctant people.So if you can’t convince your coworkers that the satisfaction of a job well done is enough&amp;hellip;. bribe them! I&amp;rsquo;m currently using swag as bribes, Rona is preventing me from using a more traditional approach: free lunches and a round at the pub.&lt;/p>
&lt;p>If you need help figuring out how to convince people to help, or to introduce you to The Way of The Bribe™️, feel free to &lt;a href="https://twitter.com/avolakatos">DM me on Twitter&lt;/a>.&lt;/p></description></item><item><title>Building a 1st Year Developer Relations Program</title><link>https://alexlakatos.com/avocados/2020/11/24/building-first-year-devrel-program/</link><pubDate>Tue, 24 Nov 2020 10:05:00 +0000</pubDate><guid isPermaLink="true">https://alexlakatos.com/avocados/2020/11/24/building-first-year-devrel-program/</guid><description>&lt;p>Congratulations, you&amp;rsquo;ve just got a job as the first Developer Relations person in a company. It&amp;rsquo;s your job to build a Developer Program. Where do you start? When you try googling that, you’ll discover Google isn’t always your friend.&lt;/p>
&lt;p>Fear not though, I&amp;rsquo;m here to help. I&amp;rsquo;ve been in the same boat this year, and I&amp;rsquo;ve had to figure it all out. I’ve joined the team behind the &lt;a href="https://fidel.uk/docs/">Fidel API&lt;/a> in the middle of a pandemic, and I’ve started building a Developer Relations program. I&amp;rsquo;ll share my process, and I&amp;rsquo;ll tell you how I chose my blueprint. So bare with me. It&amp;rsquo;s going to be one wild ride.&lt;/p>
&lt;p>First of all, when I tried to Google my way out of this particular bind, I found very little on the topic. So I started looking at what other people were using for their DevRel programs. Two contending models emerged, and they are fairly popular in some DevRel circles. &lt;a href="https://www.leggetter.co.uk/2016/02/03/defining-developer-relations.html">AAARRRP&lt;/a> and the &lt;a href="https://github.com/orbit-love/orbit-model">Orbit Model&lt;/a>. So let&amp;rsquo;s take a quick look at them.&lt;/p>
&lt;h2 id="aaarrrp">AAARRRP&lt;/h2>
&lt;img
sizes="(min-width: 35em) 720px, 100vw"
srcset='
/img/posts/avocados/aaarrrp_hu70035365038ce480359ed7b5717ebc5a_30497_500x0_resize_lanczos_2.png 500w
, /img/posts/avocados/aaarrrp_hu70035365038ce480359ed7b5717ebc5a_30497_800x0_resize_lanczos_2.png 800w
'
src="https://alexlakatos.com/img/posts/avocados/aaarrrp.png"
alt="AAARRRP Graphic">
&lt;p>AAARRRP, also referred to as Pirate Metrics, comes from &lt;a href="https://twitter.com/leggetter">Leggetter&lt;/a>. And Marketing, but we’ll not dwell on that too much. It’s an acronym for &lt;em>Awareness&lt;/em>, &lt;em>Acquisition&lt;/em>, &lt;em>Activation&lt;/em>, &lt;em>Revenue&lt;/em>, &lt;em>Retention&lt;/em>, &lt;em>Referral&lt;/em> and &lt;em>Product&lt;/em>. And while they may be meaningless words on their own, they actually stand for both metrics and goals for a developer relations programme. If you look closely at the definition Phil has for them, you’ll notice they are highly generic because they are meant to fit different products.&lt;/p>
&lt;p>I’ll share what AAARRRP means for me, at Fidel, so we’re all on the same page. By looking at Phil’s generalisation and my specific adaptation of it, you should be able to adapt them for your product.&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Awareness&lt;/strong> stands for how many people have heard about our product. Or are aware of it. We consider blog post views, documentation, API reference, and social media views in this metric.&lt;/li>
&lt;li>&lt;strong>Acquisition&lt;/strong> is used to track signups.&lt;/li>
&lt;li>&lt;strong>Activation&lt;/strong> refers to people actually having used your product. Once. So we consider people that have created their first test transaction as activated.&lt;/li>
&lt;li>&lt;strong>Revenue&lt;/strong> means people are not just testing it, but using it, so we’re making money. People in the revenue band have gotten past the sandbox mode and are using the API live.&lt;/li>
&lt;li>&lt;strong>Retention&lt;/strong> comes from people that have used it for a while, and they aren&amp;rsquo;t switching to something else. This stage is where the model stops looking like a funnel.&lt;/li>
&lt;li>&lt;strong>Referral&lt;/strong> means people are telling other people about our product. This is one of the parts of the model that can happen at any previous stage. We don’t necessarily start measuring this metric only after people have passed the retention stage. Most of our customers become referrals even before they have left the acquisition stage.&lt;/li>
&lt;li>&lt;strong>Product&lt;/strong> refers to the feedback mechanism that makes our product better. We measure not only the amount of feedback we get but also the quality of the feedback we get. Again, another one that can happen at any stage.&lt;/li>
&lt;/ul>
&lt;p>This model is often referred to as a funnel, which is not accurate, it&amp;rsquo;s partially a funnel, with 2 pillars (Referral and Product) on the side. Because those metrics/goals can be influenced at any point in the funnel. The only metrics that fit in a funnel are Awareness, Acquisition, Activation, Revenue, and Retention.&lt;/p>
&lt;h2 id="orbit">Orbit&lt;/h2>
&lt;img
sizes="(min-width: 35em) 720px, 100vw"
srcset='
/img/posts/avocados/orbit-model_hu01ac62e255cd3c7369bb242de79363f0_1775806_500x0_resize_lanczos_2.png 500w
, /img/posts/avocados/orbit-model_hu01ac62e255cd3c7369bb242de79363f0_1775806_800x0_resize_lanczos_2.png 800w
, /img/posts/avocados/orbit-model_hu01ac62e255cd3c7369bb242de79363f0_1775806_1200x0_resize_lanczos_2.png 1200w
'
src="https://alexlakatos.com/img/posts/avocados/orbit-model.png"
alt="Orbit Model Graphic">
&lt;p>The Orbit Model, on the other hand, is a model for building communities. It was created by &lt;a href="https://twitter.com/dzello">Josh Dzielak&lt;/a> and &lt;a href="https://twitter.com/patrickjwoods">Patrick Woods&lt;/a>. It defines four main concepts and depending on where you get it from, the orbit levels are called differently.&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Love&lt;/strong> is a person’s level of engagement in the community.&lt;/li>
&lt;li>&lt;strong>Reach&lt;/strong> represents the size of a member&amp;rsquo;s audience or sphere of influence.&lt;/li>
&lt;li>&lt;strong>Gravity&lt;/strong> is an equation of love and reach. Anyone in your community has a gravity defined by &lt;em>love x reach&lt;/em>.&lt;/li>
&lt;li>&lt;strong>Orbit Levels&lt;/strong> are defined depending on the gravity number. They are segmented into 4 bands, closer or farther away from your product, depending on gravity. The closest ones are Advocates or Ambassadors, followed by Fans or Contributors and Users or Participants, with the ones furthest from you being Observers.&lt;/li>
&lt;/ul>
&lt;p>This model&amp;rsquo;s biggest selling point is that it&amp;rsquo;s not a funnel. But then again, AAARRRP isn&amp;rsquo;t exactly a funnel either. If you want to be pedantic though, you could correlate Orbit Levels to AAARRRP, where Observers account for Awareness, Users are Acquisition, Activation, and Revenue. Fans are Retention, and Ambassadors are Referral and Product. And the whole reason for segmenting your community like this is so you can interact with parts of it in different ways.&lt;/p>
&lt;p>Orbit is a great model if you want to build your community, segment it, and create a strategy around that segmentation. But here&amp;rsquo;s my problem with Orbit. When my entire Ambassadors pool is 1, and my Observers are barely 1000, there is no statistical relevance I can use. Sure, it&amp;rsquo;s a great model when you have a huge user base or a vast community. But when you&amp;rsquo;re a startup with 1000 users, not so much.&lt;/p>
&lt;h2 id="what-did-i-choose">What Did I Choose?&lt;/h2>
&lt;p>Drumroll, please! …I chose …Neither. Because AAARRRP is massive, hard to measure accurately across all in-person activities, and doesn&amp;rsquo;t really work for a one-person show. And Orbit doesn&amp;rsquo;t work for a small community. This was a bit anticlimactic, wasn’t it? And it probably didn’t solve your initial question either.&lt;/p>
&lt;p>So what did I do, as someone who has a small team and a small community? I scaled down. Instead of using AAARRRP as my model, I trimmed it down to something I can achieve in this first year, with a small team. &lt;em>I went for a scaled-down version I call AARP&lt;/em>. or &lt;strong>Baby Pirate Metrics&lt;/strong>. It&amp;rsquo;s an acronym for &lt;em>Awareness&lt;/em>, &lt;em>Activation&lt;/em>, &lt;em>Referral&lt;/em> and &lt;em>Product&lt;/em>. I only chose the top 2 layers of the funnel, because the more significant the addressable audience, the higher the chances I can eventually impact the Revenue bit. And Referral and Product are what ultimately touch everything else in the model, so I need to take care of at least part of it in the first year.&lt;/p>
&lt;p>Those 4 goals still have quite a few activities tied to them though, and it&amp;rsquo;s a tall order. Let’s look at some of those day-to-day activities and which of the 4 goals they help achieve.&lt;/p>
&lt;ul>
&lt;li>writing the &lt;a href="https://fidel.uk/docs/">Documentation&lt;/a> and &lt;a href="https://reference.fidel.uk/reference">API Reference&lt;/a> (acquisition, product)&lt;/li>
&lt;li>building &lt;a href="https://fidel.uk/docs/web-sdk">SDKs&lt;/a> (product)&lt;/li>
&lt;li>create demo applications (product)&lt;/li>
&lt;li>write &lt;a href="https://fidel.uk/blog/author/laka">blog posts&lt;/a> (awareness, acquisition)&lt;/li>
&lt;li>sponsor online events (awareness, product)&lt;/li>
&lt;li>live-stream on Twitch / Youtube (awareness, acquisition, product)&lt;/li>
&lt;li>give talks at online events (awareness, acquisition)&lt;/li>
&lt;li>answer support queries (referral, product)&lt;/li>
&lt;li>have customer calls (acquisition, product)&lt;/li>
&lt;li>maintain the &lt;a href="https://community.fidel.uk/">developer community&lt;/a> forum (referral)&lt;/li>
&lt;li>create a feedback mechanism between the product and developers using the product (product)&lt;/li>
&lt;li>help with &lt;a href="https://careers.fidel.uk/">recruitment efforts&lt;/a> (awareness)&lt;/li>
&lt;/ul>
&lt;p>It&amp;rsquo;s still a very long to-do list for a small team. It seemed way more manageable when there were only 4 letters, didn&amp;rsquo;t it? How are you going to do this all alone? Well, if you stick around until next week, I’ll tell you how I solved this particular conundrum in my next blog post. If you just can’t wait that long, feel free to &lt;a href="https://twitter.com/avolakatos">DM me on Twitter&lt;/a>.&lt;/p></description></item><item><title>10 Things I Wish I’d Learned Sooner After Being a Developer for 10 Years</title><link>https://alexlakatos.com/coding/2020/11/17/ten-things-learned-ten-years-developer/</link><pubDate>Tue, 17 Nov 2020 16:30:00 +0000</pubDate><guid isPermaLink="true">https://alexlakatos.com/coding/2020/11/17/ten-things-learned-ten-years-developer/</guid><description>&lt;p>Exactly 10 years ago today, I was starting my first job in the software industry. I’ve spent my career being a Software Developer in Test, Performance Engineer, Lead &amp;amp; part-time CTO, JavaScript Developer, Contractor, Entrepreneur, Developer Advocate &amp;amp; Manager. I’ve also worked for companies on 4 continents, on products that were used by hundreds of millions of people. You could say I did a bit of everything. But I would say my career was anything but boring.&lt;/p>
&lt;p>I’m prone to reminiscing, especially while being stuck in the house in the middle of a global pandemic, so I sat down and revisited my greatest hits. I’ll always be grateful my very first job was working with Mozilla, that shaped the way I approached software development in so many ways. I’ve got my love of open-source from there, and my drive to always learn from the people around me. It did help that everyone I worked with was amazing! I’ve also thought about my 3-month stint as a CTO, after which I rage-quit on the spot because money isn’t everything. Or the nine months I spent with my partner, living out of a suitcase, through hotels and AirBnBs in Asia.&lt;/p>
&lt;p>This trip down memory lane also made me realise, there are a bunch of things I wish I would have known before I started. Or at least I wish I would have learned them sooner than I did. I made a list with the top ten, but I’m fairly certain I could get to 100. So if you’ve read them and want to know more, &lt;a href="https://twitter.com/avolakatos">ping me on Twitter&lt;/a>, and I’ll oblige.&lt;/p>
&lt;img
sizes="(min-width: 35em) 720px, 100vw"
srcset='
/img/posts/coding/1_hud85654cd6cf8491f19d598676b7b2d24_121191_500x0_resize_q85_lanczos.jpg 500w
, /img/posts/coding/1_hud85654cd6cf8491f19d598676b7b2d24_121191_800x0_resize_q85_lanczos.jpg 800w
, /img/posts/coding/1_hud85654cd6cf8491f19d598676b7b2d24_121191_1200x0_resize_q85_lanczos.jpg 1200w
'
src="https://alexlakatos.com/img/posts/coding/1.jpg"
alt="Soft Skills Are the Toughest Skills">
&lt;p>Everyone calls things not related to writing code soft skills. And here&amp;rsquo;s the most mind-boggling thing. It&amp;rsquo;s easier to teach someone a skill, like coding, than to change their behaviour, the way they communicate. And yet, communication is considered a “soft skill”. So when companies look for a developer, most of the time, the differentiator is in those soft skills. There are only so many ways you can code your way out of a tech test. When the field is narrow enough, it all comes down to those extra bits. Acquire as many soft skills as you can, it pays off more than adding another programming language or framework to your toolbox.&lt;/p>
&lt;img
sizes="(min-width: 35em) 720px, 100vw"
srcset='
/img/posts/coding/2_hucdf15e46e7c225a6e4c7c6e3fb6df10e_108963_500x0_resize_q85_lanczos.jpg 500w
, /img/posts/coding/2_hucdf15e46e7c225a6e4c7c6e3fb6df10e_108963_800x0_resize_q85_lanczos.jpg 800w
, /img/posts/coding/2_hucdf15e46e7c225a6e4c7c6e3fb6df10e_108963_1200x0_resize_q85_lanczos.jpg 1200w
'
src="https://alexlakatos.com/img/posts/coding/2.jpg"
alt="Google is Your Friend">
&lt;p>I come from a culture that values memorisation over creativity and problem-solving. Fuck that. To this day, I still Google how to bubble sort. I’ve probably used it no more than five times in 10 years—and that was because I had to pass some sort of interview test. It doesn&amp;rsquo;t pay to memorise everything, as long as you know where to get the answers from. In this day and age, that usually means Googling stuff. It&amp;rsquo;s not a weakness, even if some people are ashamed to openly admit it. With my memory not being what it used to be, I Google even simple things I’ve probably done dozens of times in the past. And there’s no shame in that!&lt;/p>
&lt;img
sizes="(min-width: 35em) 720px, 100vw"
srcset='
/img/posts/coding/3_hud85654cd6cf8491f19d598676b7b2d24_106054_500x0_resize_q85_lanczos.jpg 500w
, /img/posts/coding/3_hud85654cd6cf8491f19d598676b7b2d24_106054_800x0_resize_q85_lanczos.jpg 800w
, /img/posts/coding/3_hud85654cd6cf8491f19d598676b7b2d24_106054_1200x0_resize_q85_lanczos.jpg 1200w
'
src="https://alexlakatos.com/img/posts/coding/3.jpg"
alt="Ask for Help">
&lt;p>This might have started as &amp;ldquo;Don&amp;rsquo;t be afraid to ask for help&amp;rdquo;. But that&amp;rsquo;s because I&amp;rsquo;m stubborn like that, and asking for help doesn’t come naturally in my culture. Again, that damn upbringing.&lt;/p>
&lt;p>Asking for help is not something you should do only in dire need. Ask for help as often as you can get it. It frees you up to do the things you&amp;rsquo;re most passionate about. And the whole reason you work in a team and not on your own is so you can help each other! Hence, ask for help from day 1, not only when the shit hits the fan.&lt;/p>
&lt;img
sizes="(min-width: 35em) 720px, 100vw"
srcset='
/img/posts/coding/4_hud85654cd6cf8491f19d598676b7b2d24_111201_500x0_resize_q85_lanczos.jpg 500w
, /img/posts/coding/4_hud85654cd6cf8491f19d598676b7b2d24_111201_800x0_resize_q85_lanczos.jpg 800w
, /img/posts/coding/4_hud85654cd6cf8491f19d598676b7b2d24_111201_1200x0_resize_q85_lanczos.jpg 1200w
'
src="https://alexlakatos.com/img/posts/coding/4.jpg"
alt="Keep Learning">
&lt;p>Like most things in this world, the realm of Developers, or &amp;ldquo;Software Engineers&amp;rdquo; keeps evolving. So you should evolve with it if you want to stay relevant. Or employable. Sure, you see the &lt;a href="https://www.cnbc.com/2020/04/06/new-jersey-seeks-cobol-programmers-to-fix-unemployment-system.html">odd news about people looking for COBOL developers&lt;/a> in 2020. But you have to think about it this way: How many COBOL developers are still doing COBOL 60 years later? So yes, keep learning new things.&lt;/p>
&lt;p>It doesn&amp;rsquo;t necessarily have to be &amp;ldquo;work-related&amp;rdquo;. The purpose here is to develop a process for learning. Because as a whole, our learning mechanism (also known as the education system) is fucked up. I mean, most things you learn in school are thought by an average theoretician. And that’s supposed to give you the practitioner skills you&amp;rsquo;d need. It doesn&amp;rsquo;t work like that, especially in the world of Programming, where dedicated Experts are few and far between. But figuring out what method of learning works for you means you can literally pick anything up in a matter of time. You want that fancy new job? Start learning, acquire the skills you need, and get it! But if you don&amp;rsquo;t even know how to approach it, then the whole task of learning a new skill, any skill, becomes insurmountable. And you&amp;rsquo;ll find reasons to quit before you even begin.&lt;/p>
&lt;p>What&amp;rsquo;s my way of learning? Well, I find someone who&amp;rsquo;s a bit further ahead than me, listen and then start asking questions. They don&amp;rsquo;t need to be an expert, just better at it than me. Eventually, those questions become discussions, and that&amp;rsquo;s when I look for the next person to help our discussions move along. Rinse, repeat, voila!&lt;/p>
&lt;img
sizes="(min-width: 35em) 720px, 100vw"
srcset='
/img/posts/coding/5_hud85654cd6cf8491f19d598676b7b2d24_105595_500x0_resize_q85_lanczos.jpg 500w
, /img/posts/coding/5_hud85654cd6cf8491f19d598676b7b2d24_105595_800x0_resize_q85_lanczos.jpg 800w
, /img/posts/coding/5_hud85654cd6cf8491f19d598676b7b2d24_105595_1200x0_resize_q85_lanczos.jpg 1200w
'
src="https://alexlakatos.com/img/posts/coding/5.jpg"
alt="Say No More Often">
&lt;p>This is one I struggle with the most. And the reason I can&amp;rsquo;t seem to say No is because deep, deep down, I&amp;rsquo;m just a nice person. Or that I would like for people to like me back. Or that I love helping people. Or that I&amp;rsquo;m just a pushover, and I&amp;rsquo;m not confrontational. Pick whatever reason makes this more relatable to any particular situation. Not saying No has made me a lot of friends along the way, but at the same time, it has meant I disappointed just as many people as I helped along the way. And that&amp;rsquo;s because it was physically impossible to do all the things I agreed to.&lt;/p>
&lt;p>It also meant I might have accomplished some irrelevant feats, in the grand scheme of things. For example, I&amp;rsquo;m a registered casino dealer. Sure, it&amp;rsquo;s a cool party trick, but I could have spent that summer graduating early. I could also have said no to writing a book for a project that died just before the book was supposed to be published (R.I.P. Firefox OS). In the same vein, I could have also said No to living out of a suitcase for 9 months, and missed out on amazing memories. But hey, you live, and you learn.&lt;/p>
&lt;img
sizes="(min-width: 35em) 720px, 100vw"
srcset='
/img/posts/coding/6_hud85654cd6cf8491f19d598676b7b2d24_86448_500x0_resize_q85_lanczos.jpg 500w
, /img/posts/coding/6_hud85654cd6cf8491f19d598676b7b2d24_86448_800x0_resize_q85_lanczos.jpg 800w
, /img/posts/coding/6_hud85654cd6cf8491f19d598676b7b2d24_86448_1200x0_resize_q85_lanczos.jpg 1200w
'
src="https://alexlakatos.com/img/posts/coding/6.jpg"
alt="Build a T / Create a Brand">
&lt;p>If you&amp;rsquo;re not familiar with the concept of T-shaped skills, or T-shaped people, don’t worry, most people are not. It’s an HR metaphor used to describe the skills of candidates. So if you think of your skills as plotted on a graph, you&amp;rsquo;ll notice you&amp;rsquo;ve got different levels in each. And if you unite those levels, you&amp;rsquo;d want them to create a T-shape instead of anything else.&lt;/p>
&lt;p>For example, know a little bit of everything, with 2-3 core skills where you&amp;rsquo;d be considered an &amp;ldquo;Expert&amp;rdquo;. And there are quotes there because “expert” is a relative term. Relative to your other skills. For example, when I was a JavaScript Developer, the reason I kept getting job offers was because of my level of knowledge around performance optimisations, and Angular. So while I could do vanilla JS to a passable degree, I had a lot more to offer when it came to Angular applications and optimising the performance of most websites.&lt;/p>
&lt;p>Now you&amp;rsquo;ll wonder. Why was I a JavaScript Developer, and not an Angular Developer? And that&amp;rsquo;s because I had more than one JavaScript skill under my belt, as opposed to just that one tool, Angular. Hence, I was a lot more employable because of that T shape.&lt;/p>
&lt;p>In the world of Developer Advocates though, that also translates to building a brand. The same way you&amp;rsquo;re building that T, you can create a personal brand. Start writing about Angular and Performance Optimisations, and that would be my “personal brand”. If you follow me around the internet, you’ll have noticed I don’t do that, and I don’t have a personal brand though. I guess it’s something I have to work on.&lt;/p>
&lt;img
sizes="(min-width: 35em) 720px, 100vw"
srcset='
/img/posts/coding/7_hud85654cd6cf8491f19d598676b7b2d24_126207_500x0_resize_q85_lanczos.jpg 500w
, /img/posts/coding/7_hud85654cd6cf8491f19d598676b7b2d24_126207_800x0_resize_q85_lanczos.jpg 800w
, /img/posts/coding/7_hud85654cd6cf8491f19d598676b7b2d24_126207_1200x0_resize_q85_lanczos.jpg 1200w
'
src="https://alexlakatos.com/img/posts/coding/7.jpg"
alt="People Can&amp;#39;t Read Minds">
&lt;p>Especially yours. So if you don&amp;rsquo;t tell people what you want, or what you need, then it&amp;rsquo;s pointless to get upset when they don&amp;rsquo;t give it to you. Because they can&amp;rsquo;t read your mind. You think you deserve that promotion? Tell your boss. You want to get promoted in 6 months? Tell your boss, and if they&amp;rsquo;re any good, they&amp;rsquo;ll tell you how to get it.&lt;/p>
&lt;p>In most cases, people are more than happy to give you what you want, as long as you tell them. Most managers don&amp;rsquo;t really have a clue on what they&amp;rsquo;re doing, so they&amp;rsquo;re more than happy to get it done when they actually know what it is they need to get done.&lt;/p>
&lt;img
sizes="(min-width: 35em) 720px, 100vw"
srcset='
/img/posts/coding/8_hud85654cd6cf8491f19d598676b7b2d24_102191_500x0_resize_q85_lanczos.jpg 500w
, /img/posts/coding/8_hud85654cd6cf8491f19d598676b7b2d24_102191_800x0_resize_q85_lanczos.jpg 800w
, /img/posts/coding/8_hud85654cd6cf8491f19d598676b7b2d24_102191_1200x0_resize_q85_lanczos.jpg 1200w
'
src="https://alexlakatos.com/img/posts/coding/8.jpg"
alt="Vote With Your Feet">
&lt;p>This is one I&amp;rsquo;ve learnt late in my career. Turns out, when you don&amp;rsquo;t agree with something, you can always leave. Practically, voting with your feet. Instead of huffing and puffing, or worse, picking a grudge, it&amp;rsquo;s a lot better to just walk away.&lt;/p>
&lt;p>Don’t like your new boss? Just quit. Enough people do it, and their boss will fix it. You don&amp;rsquo;t like your company&amp;rsquo;s policies around privacy, diversity, inclusion, human rights? Quit. In an industry where there is more demand than people available, you can always find a better deal.&lt;/p>
&lt;p>There are such things as golden handcuffs, but if you&amp;rsquo;re part of the few that have them, you&amp;rsquo;ll understand that you can find them anywhere you go.&lt;/p>
&lt;p>I&amp;rsquo;m not saying you should quit without a plan here, in a tantrum. That&amp;rsquo;s not voting, that&amp;rsquo;s rage quit. No, by all means, treat this as a rational endeavour, and not emotional. Line up the next gig first.&lt;/p>
&lt;img
sizes="(min-width: 35em) 720px, 100vw"
srcset='
/img/posts/coding/9_hu9abea20a08ef3581c51b0c750a29cf44_119186_500x0_resize_q85_lanczos.jpg 500w
, /img/posts/coding/9_hu9abea20a08ef3581c51b0c750a29cf44_119186_800x0_resize_q85_lanczos.jpg 800w
, /img/posts/coding/9_hu9abea20a08ef3581c51b0c750a29cf44_119186_1200x0_resize_q85_lanczos.jpg 1200w
'
src="https://alexlakatos.com/img/posts/coding/9.jpg"
alt="Know Your Worth">
&lt;p>It pays to know exactly how much your skills are worth. Sure, you have a salary. But if you got that salary more than 6 months ago, it&amp;rsquo;s not an accurate representation of how much you are worth to your employer. And it probably means a yearly review is just around the corner. That&amp;rsquo;s the perfect time to make your compensation accurately reflect your worth. You could come up with a formula of how much an hour of your time is worth to your employer, make your case, and hope your boss can do something about it.&lt;/p>
&lt;p>Or you could shop around. Maybe you&amp;rsquo;re worth more to the next employer. On top of the fact that interviewing helps you stay in touch with the market, it also helps you practice at it. Interviewing is a skill, same as anything else you do. It’s good to sharpen this particular skill, especially since it’s a significant factor for your initial compensation package. Without actually testing your newly acquired skills, and their relevance in the market, it&amp;rsquo;s hard to gauge your worth.&lt;/p>
&lt;img
sizes="(min-width: 35em) 720px, 100vw"
srcset='
/img/posts/coding/10_hud85654cd6cf8491f19d598676b7b2d24_103714_500x0_resize_q85_lanczos.jpg 500w
, /img/posts/coding/10_hud85654cd6cf8491f19d598676b7b2d24_103714_800x0_resize_q85_lanczos.jpg 800w
, /img/posts/coding/10_hud85654cd6cf8491f19d598676b7b2d24_103714_1200x0_resize_q85_lanczos.jpg 1200w
'
src="https://alexlakatos.com/img/posts/coding/10.jpg"
alt="It&amp;#39;s Not All About the Money">
&lt;p>I know, I told you all about how to get paid more until here. But those skills also translate into options. The more you can make, the more options you have. And because of those options, getting paid more stops being a factor. I know, it’s counterintuitive. But after a certain amount, money doesn&amp;rsquo;t account for happiness just as much. You&amp;rsquo;ll value the mission, or the work-life balance, or the empathetic boss, or the cool team a lot more than an extra 10% on your yearly salary.&lt;/p>
&lt;p>I&amp;rsquo;ve kept yo-yo-ing between high paid jobs and keeping my soul happy, and I&amp;rsquo;ve finally settled somewhere in the middle. Sure, I could make an extra 10% every year, but would that make me happier than working from home, on my own terms?&lt;/p></description></item><item><title>How To Add Image Processing to Your Hugo Website and Improve Performance</title><link>https://alexlakatos.com/web/2020/07/17/hugo-image-processing/</link><pubDate>Fri, 17 Jul 2020 08:10:00 +0000</pubDate><guid isPermaLink="true">https://alexlakatos.com/web/2020/07/17/hugo-image-processing/</guid><description>&lt;p>I&amp;rsquo;ve recently &lt;a href="https://dev.to/lakatos88/new-personal-site-who-this-55f1">moved my personal website to Hugo&lt;/a>, and it&amp;rsquo;s been mostly a pleasant experience switching over from Jekyll. I got tons of improvements in build time. But what didn&amp;rsquo;t work so well for me was the &lt;a href="https://gohugo.io/documentation/">Hugo documentation&lt;/a>. It all relies on the idea that you&amp;rsquo;ll install Hugo, create a new site, and then add a theme. Here is where the problem starts. I didn&amp;rsquo;t want a stock theme, it&amp;rsquo;s my &lt;strong>personal&lt;/strong> website after all, so it should be an expression of myself, right? Well, I was lucky enough to catch &lt;a href="https://twitter.com/hj_chen">Hui Jing&lt;/a> in a benevolently, slightly bored, mood. She created all the custom CSS for it, with &lt;a href="https://chenhuijing.com/blog/the-one-in-black-and-orange/#%F0%9F%91%9F">a fantastic Masonry layout&lt;/a>.&lt;/p>
&lt;p>But that meant from this point forward the Hugo docs were mostly useless. They are geared towards helping you either develop a theme or change your theme to accomplish something new. Mine wasn&amp;rsquo;t a very complicated Hugo website, to begin with, so following in Hui Jing&amp;rsquo;s footsteps, we made it work without docs. Now that the “MVP” has been released for a few months, I keep finding small, little things to improve with it. Or if you look at my &lt;a href="https://web.dev/measure/">web.dev&lt;/a> scores, not so little. 😏&lt;/p>
&lt;img
sizes="(min-width: 35em) 720px, 100vw"
srcset='
/img/posts/web/hugo-performance-before_hu7517706bbf20c9e59f7720f23a028b9a_70263_500x0_resize_lanczos_2.png 500w
, /img/posts/web/hugo-performance-before_hu7517706bbf20c9e59f7720f23a028b9a_70263_800x0_resize_lanczos_2.png 800w
'
src="https://alexlakatos.com/img/posts/web/hugo-performance-before.png"
alt="Lighthouse Performance">
&lt;h2 id="before">Before&lt;/h2>
&lt;p>I had my cover image in the post front matter, under the &lt;code>images&lt;/code> list, because that was the Hugo way to automatically make that image a Twitter social card as well. Me being lazy, I considered that a win 🤦‍♂️. I also had my images stored in the &lt;code>static/&lt;/code> folder, because that made sense? I mean images are not exactly content or assets, right? Turns out it&amp;rsquo;s wrong, but more on that later.&lt;/p>
&lt;p>That meant using images in my articles was easy. I write them in &lt;code>markdown&lt;/code>, so adding an image was just a matter of putting the right path in there:&lt;/p>
&lt;div class="highlight">&lt;pre style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4">&lt;code class="language-markdown" data-lang="markdown">![&lt;span style="color:#f92672">I wish all my images had alt text 🤦‍♂️&lt;/span>](&lt;span style="color:#a6e22e">/image.png&lt;/span>)
&lt;/code>&lt;/pre>&lt;/div>&lt;p> &lt;/p>
&lt;p>For the layouts, that&amp;rsquo;s where things became tricky. Technically the front matter &lt;code>images&lt;/code> are an array, even if it only ever had one element. That meant I had to cycle through those elements when I displayed them on the &lt;code>list&lt;/code> layouts. Or get the item at index 0. So the code ended up looking a little messy.&lt;/p>
&lt;div class="highlight">&lt;pre style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4">&lt;code class="language-markdown" data-lang="markdown">&amp;lt;&lt;span style="color:#f92672">img&lt;/span> &lt;span style="color:#a6e22e">class&lt;/span>&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#e6db74">&amp;#34;post-image&amp;#34;&lt;/span> &lt;span style="color:#a6e22e">src&lt;/span>&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#e6db74">&amp;#34;{{ range .Params.images }}{{ . }}{{ end }}&amp;#34;&lt;/span> &lt;span style="color:#a6e22e">alt&lt;/span>&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#e6db74">&amp;#34;{{ .Title }}&amp;#34;&lt;/span> /&amp;gt;
&lt;/code>&lt;/pre>&lt;/div>&lt;p> &lt;/p>
&lt;p>There were a few problems with this approach.&lt;/p>
&lt;ol>
&lt;li>I was too lazy to bother resizing all the images for the &lt;code>list&lt;/code> layout, so most of them were quite big and loaded all at once on the home page. Slow was an understatement.&lt;/li>
&lt;li>I couldn&amp;rsquo;t be bothered to resize images multiple times to do responsive images. Ideally 3-4 times. Hence the horrible performance score on Lighthouse.&lt;/li>
&lt;/ol>
&lt;p>There seemed to be a light at the end of this tunnel though. Skimming through the docs, it looked like there was something called &lt;a href="https://gohugo.io/content-management/image-processing/">Image Processing&lt;/a> in Hugo, and that was supposed to help fix all my problems. I could resize my images at build time while compressing them and changing the encoding quality. It all sounded like an easy fix for my laziness. Except the docs are a bit on the slim side, and they weren&amp;rsquo;t really useful for a website without a Hugo theme. I&amp;rsquo;ve given it a try twice so far with no luck, but it looks like third time is the charm.&lt;/p>
&lt;h2 id="how-to-add-image-processing-to-hugo">How to Add Image Processing to Hugo&lt;/h2>
&lt;p>The first thing I was doing wrong was the fact that images were in the &lt;code>static&lt;/code> folder. Image Processing in Hugo works on Resources, and for it to work, the image has to be either a Page Resource or a Resource. Page Resources have to live in the same folder as the markdown file, so that was out of the question. There were way too many images to move around, and too many paths to change in every article. The other option, Resource, meant the images have to live in the &lt;code>assets&lt;/code> folder, so that was an easy drag-and-drop. Didn&amp;rsquo;t even have to change the relative paths in the articles front matter.&lt;/p>
&lt;p>First thing I did was to move my images into the &lt;code>assets&lt;/code> folder instead of &lt;code>static&lt;/code>. I changed my images to live from &lt;code>/static/img&lt;/code> to &lt;code>/assets/img&lt;/code>. Which meant my image sources in articles stopped working altogether. The assets don&amp;rsquo;t get generated at build time unless they&amp;rsquo;re processed. And even then, their file name is dynamically generated with every build. So I had to change all image occurrences in the articles and templates to use the Resource instead.&lt;/p>
&lt;p>For that to work in my content files, I had to create a &lt;a href="https://gohugo.io/content-management/shortcodes/#readout">shortcode&lt;/a>, it&amp;rsquo;s the Hugo way to have snippets inside Markdown. Here&amp;rsquo;s how mine looks like, I&amp;rsquo;ve taken the responsive images shortcode &lt;a href="https://twitter.com/LauraKalbag">Laura Kalbag&lt;/a> blogged about and changed it to suit my layout. And because I have animated GIFs in my &lt;a href="https://alexlakatos.com/devtricks/">DevTricks series&lt;/a>, I&amp;rsquo;m not resizing those, just passing the relative permalink to an image tag. I&amp;rsquo;m also not doing anything to external images. Still, I figured making everything play nicely with alt tags would score me some Lighthouse points.&lt;/p>
&lt;div class="highlight">&lt;pre style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4">&lt;code class="language-HTML" data-lang="HTML">{{/* get file that matches the filename as specified as src=&amp;#34;&amp;#34; in shortcode */}}
{{ $src := resources.GetMatch (.Get &amp;#34;src&amp;#34;) }}
{{ if in (.Get &amp;#34;src&amp;#34;) &amp;#34;http&amp;#34; }}
&amp;lt;&lt;span style="color:#f92672">img&lt;/span> &lt;span style="color:#a6e22e">src&lt;/span>&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#e6db74">&amp;#34;{{$src}}&amp;#34;&lt;/span> &lt;span style="color:#960050;background-color:#1e0010">{{&lt;/span> &lt;span style="color:#a6e22e">with&lt;/span> &lt;span style="color:#960050;background-color:#1e0010">.&lt;/span>&lt;span style="color:#a6e22e">Get&lt;/span> &lt;span style="color:#960050;background-color:#1e0010">&amp;#34;&lt;/span>&lt;span style="color:#a6e22e">alt&lt;/span>&lt;span style="color:#960050;background-color:#1e0010">&amp;#34;&lt;/span> &lt;span style="color:#960050;background-color:#1e0010">}}&lt;/span>&lt;span style="color:#a6e22e">alt&lt;/span>&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#e6db74">&amp;#34;{{.}}&amp;#34;&lt;/span>&lt;span style="color:#960050;background-color:#1e0010">{{&lt;/span> &lt;span style="color:#a6e22e">else&lt;/span> &lt;span style="color:#960050;background-color:#1e0010">}}&lt;/span>&lt;span style="color:#a6e22e">alt&lt;/span>&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#e6db74">&amp;#34;&amp;#34;&lt;/span>&lt;span style="color:#960050;background-color:#1e0010">{{&lt;/span> &lt;span style="color:#a6e22e">end&lt;/span> &lt;span style="color:#960050;background-color:#1e0010">}}&lt;/span>&amp;gt;
{{ else }}
{{ if in (.Get &amp;#34;src&amp;#34;) &amp;#34;.gif&amp;#34; }}
&amp;lt;&lt;span style="color:#f92672">img&lt;/span> &lt;span style="color:#a6e22e">src&lt;/span>&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#e6db74">&amp;#34;{{$src.RelPermalink}}&amp;#34;&lt;/span> &lt;span style="color:#960050;background-color:#1e0010">{{&lt;/span> &lt;span style="color:#a6e22e">with&lt;/span> &lt;span style="color:#960050;background-color:#1e0010">.&lt;/span>&lt;span style="color:#a6e22e">Get&lt;/span> &lt;span style="color:#960050;background-color:#1e0010">&amp;#34;&lt;/span>&lt;span style="color:#a6e22e">alt&lt;/span>&lt;span style="color:#960050;background-color:#1e0010">&amp;#34;&lt;/span> &lt;span style="color:#960050;background-color:#1e0010">}}&lt;/span>&lt;span style="color:#a6e22e">alt&lt;/span>&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#e6db74">&amp;#34;{{.}}&amp;#34;&lt;/span>&lt;span style="color:#960050;background-color:#1e0010">{{&lt;/span> &lt;span style="color:#a6e22e">else&lt;/span> &lt;span style="color:#960050;background-color:#1e0010">}}&lt;/span>&lt;span style="color:#a6e22e">alt&lt;/span>&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#e6db74">&amp;#34;&amp;#34;&lt;/span>&lt;span style="color:#960050;background-color:#1e0010">{{&lt;/span> &lt;span style="color:#a6e22e">end&lt;/span> &lt;span style="color:#960050;background-color:#1e0010">}}&lt;/span>&amp;gt;
{{ else }}
{{/* set image sizes, these are hardcoded for now */}}
{{ $tinyw := default &amp;#34;500x&amp;#34; }}
{{ $smallw := default &amp;#34;800x&amp;#34; }}
{{ $mediumw := default &amp;#34;1200x&amp;#34; }}
{{/* resize the src image to the given sizes */}}
{{ .Scratch.Set &amp;#34;tiny&amp;#34; ($src.Resize $tinyw) }}
{{ .Scratch.Set &amp;#34;small&amp;#34; ($src.Resize $smallw) }}
{{ .Scratch.Set &amp;#34;medium&amp;#34; ($src.Resize $mediumw) }}
{{/* add the processed images to the scratch */}}
{{ $tiny := .Scratch.Get &amp;#34;tiny&amp;#34; }}
{{ $small := .Scratch.Get &amp;#34;small&amp;#34; }}
{{ $medium := .Scratch.Get &amp;#34;medium&amp;#34; }}
{{ $large := .Scratch.Get &amp;#34;large&amp;#34; }}
{{/* only use images smaller than or equal to the src (original) image size */}}
&amp;lt;&lt;span style="color:#f92672">img&lt;/span>
&lt;span style="color:#960050;background-color:#1e0010">{{&lt;/span> &lt;span style="color:#a6e22e">with&lt;/span> &lt;span style="color:#960050;background-color:#1e0010">.&lt;/span>&lt;span style="color:#a6e22e">Get&lt;/span> &lt;span style="color:#960050;background-color:#1e0010">&amp;#34;&lt;/span>&lt;span style="color:#a6e22e">sizes&lt;/span>&lt;span style="color:#960050;background-color:#1e0010">&amp;#34;&lt;/span> &lt;span style="color:#960050;background-color:#1e0010">}}&lt;/span>&lt;span style="color:#a6e22e">sizes&lt;/span>&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#e6db74">&amp;#39;{{.}}&amp;#39;&lt;/span>
&lt;span style="color:#960050;background-color:#1e0010">{{&lt;/span> &lt;span style="color:#a6e22e">else&lt;/span> &lt;span style="color:#960050;background-color:#1e0010">}}&lt;/span>
&lt;span style="color:#a6e22e">sizes&lt;/span>&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#e6db74">&amp;#34;(min-width: 35em) 720px, 100vw&amp;#34;&lt;/span>&lt;span style="color:#960050;background-color:#1e0010">{{&lt;/span> &lt;span style="color:#a6e22e">end&lt;/span> &lt;span style="color:#960050;background-color:#1e0010">}}&lt;/span>
&lt;span style="color:#a6e22e">srcset&lt;/span>&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#e6db74">&amp;#39;
&lt;/span>&lt;span style="color:#e6db74"> {{ if ge $src.Width &amp;#34;500&amp;#34; }}
&lt;/span>&lt;span style="color:#e6db74"> {{ with $tiny.RelPermalink }}{{.}} 500w{{ end }}
&lt;/span>&lt;span style="color:#e6db74"> {{ end }}
&lt;/span>&lt;span style="color:#e6db74"> {{ if ge $src.Width &amp;#34;800&amp;#34; }}
&lt;/span>&lt;span style="color:#e6db74"> {{ with $small.RelPermalink }}, {{.}} 800w{{ end }}
&lt;/span>&lt;span style="color:#e6db74"> {{ end }}
&lt;/span>&lt;span style="color:#e6db74"> {{ if ge $src.Width &amp;#34;1200&amp;#34; }}
&lt;/span>&lt;span style="color:#e6db74"> {{ with $medium.RelPermalink }}, {{.}} 1200w{{ end }}
&lt;/span>&lt;span style="color:#e6db74"> {{ end }}&amp;#39;&lt;/span>
&lt;span style="color:#960050;background-color:#1e0010">{{&lt;/span> &lt;span style="color:#a6e22e">if&lt;/span> &lt;span style="color:#960050;background-color:#1e0010">.&lt;/span>&lt;span style="color:#a6e22e">Get&lt;/span> &lt;span style="color:#960050;background-color:#1e0010">(&lt;/span>&lt;span style="color:#a6e22e">print&lt;/span> &lt;span style="color:#960050;background-color:#1e0010">$&lt;/span>&lt;span style="color:#a6e22e">medium&lt;/span>&lt;span style="color:#960050;background-color:#1e0010">)&lt;/span> &lt;span style="color:#960050;background-color:#1e0010">}}&lt;/span>
&lt;span style="color:#a6e22e">src&lt;/span>&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#e6db74">&amp;#34;{{ $medium.RelPermalink }}&amp;#34;&lt;/span>
&lt;span style="color:#960050;background-color:#1e0010">{{&lt;/span> &lt;span style="color:#a6e22e">else&lt;/span> &lt;span style="color:#960050;background-color:#1e0010">}}&lt;/span>
&lt;span style="color:#a6e22e">src&lt;/span>&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#e6db74">&amp;#34;{{ $src.RelPermalink }}&amp;#34;&lt;/span>
&lt;span style="color:#960050;background-color:#1e0010">{{&lt;/span> &lt;span style="color:#a6e22e">end&lt;/span> &lt;span style="color:#960050;background-color:#1e0010">}}&lt;/span>
&lt;span style="color:#960050;background-color:#1e0010">{{&lt;/span> &lt;span style="color:#a6e22e">with&lt;/span> &lt;span style="color:#960050;background-color:#1e0010">.&lt;/span>&lt;span style="color:#a6e22e">Get&lt;/span> &lt;span style="color:#960050;background-color:#1e0010">&amp;#34;&lt;/span>&lt;span style="color:#a6e22e">alt&lt;/span>&lt;span style="color:#960050;background-color:#1e0010">&amp;#34;&lt;/span> &lt;span style="color:#960050;background-color:#1e0010">}}&lt;/span>&lt;span style="color:#a6e22e">alt&lt;/span>&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#e6db74">&amp;#34;{{.}}&amp;#34;&lt;/span>&lt;span style="color:#960050;background-color:#1e0010">{{&lt;/span> &lt;span style="color:#a6e22e">else&lt;/span> &lt;span style="color:#960050;background-color:#1e0010">}}&lt;/span>&lt;span style="color:#a6e22e">alt&lt;/span>&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#e6db74">&amp;#34;&amp;#34;&lt;/span>&lt;span style="color:#960050;background-color:#1e0010">{{&lt;/span> &lt;span style="color:#a6e22e">end&lt;/span> &lt;span style="color:#960050;background-color:#1e0010">}}&lt;/span>&amp;gt;
{{ end }}
{{ end }}
&lt;/code>&lt;/pre>&lt;/div>&lt;p> &lt;/p>
&lt;p>To use this image shortcode in my content, I had to change the way my links were called from the default markdown syntax to something in between Hugo and HTML:&lt;/p>
&lt;div class="highlight">&lt;pre style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4">&lt;code class="language-markdown" data-lang="markdown">{{&amp;lt; &lt;span style="color:#f92672">img&lt;/span> &lt;span style="color:#a6e22e">src&lt;/span>&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#e6db74">&amp;#34;img/posts/web/hugo-performance-before.png&amp;#34;&lt;/span> &lt;span style="color:#a6e22e">alt&lt;/span>&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#e6db74">&amp;#34;Bad Lighthouse Performance&amp;#34;&lt;/span> &amp;gt;}}
&lt;/code>&lt;/pre>&lt;/div>&lt;p> &lt;/p>
&lt;p>The output of the &lt;code>{{&amp;lt; img &amp;gt;}}&lt;/code> shortcode looks a bit similar to this:&lt;/p>
&lt;div class="highlight">&lt;pre style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4">&lt;code class="language-HTML" data-lang="HTML">&amp;lt;&lt;span style="color:#f92672">img&lt;/span> &lt;span style="color:#a6e22e">sizes&lt;/span>&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#e6db74">&amp;#34;(min-width: 35em) 720px, 100vw&amp;#34;&lt;/span> &lt;span style="color:#a6e22e">srcset&lt;/span>&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#e6db74">&amp;#34;
&lt;/span>&lt;span style="color:#e6db74">/img/posts/web/hugo-performance-before_hu187b84b0088ba519b328cb2126b97350_79974_500x0_resize_lanczos_2.png 500w,
&lt;/span>&lt;span style="color:#e6db74">/img/posts/web/hugo-performance-before_hu187b84b0088ba519b328cb2126b97350_79974_800x0_resize_lanczos_2.png 800w,
&lt;/span>&lt;span style="color:#e6db74">/img/posts/web/hugo-performance-before_hu187b84b0088ba519b328cb2126b97350_79974_1200x0_resize_lanczos_2.png 1200w&amp;#34;&lt;/span>
&lt;span style="color:#a6e22e">src&lt;/span>&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#e6db74">&amp;#34;/img/posts/web/hugo-performance-before.png&amp;#34;&lt;/span> &lt;span style="color:#a6e22e">alt&lt;/span>&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#e6db74">&amp;#34;Bad Lighthouse Performance&amp;#34;&lt;/span>&amp;gt;
&lt;/code>&lt;/pre>&lt;/div>&lt;p> &lt;/p>
&lt;p>It looked like I could resize my images inside content. So why wouldn&amp;rsquo;t I be able to do the same in my layouts? Because somewhere in the fine print on the docs it says I can&amp;rsquo;t use shortcodes outside of content files. Still, the same functionality is available in layout templates via partial templates. As it turns out, I don&amp;rsquo;t need responsive images on my list views, I just need way smaller images. So I didn&amp;rsquo;t bother recreating the whole shortcode logic in partial templates. Instead, I had a less complicated, lazier approach. I get the image Resource, I resize it to 360px, with a quality of 85%, using a Box filter. It all translates to smaller, faster, poorer quality images on the home page.&lt;/p>
&lt;div class="highlight">&lt;pre style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4">&lt;code class="language-HTML" data-lang="HTML">{{ if .Params.images }}
{{ $image := index .Params.images 0 }}
{{ $src := resources.Get $image }}
{{ $small := $src.Resize &amp;#34;360x q85 Box&amp;#34; }}
&amp;lt;&lt;span style="color:#f92672">img&lt;/span> &lt;span style="color:#a6e22e">class&lt;/span>&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#e6db74">&amp;#34;post-image&amp;#34;&lt;/span> &lt;span style="color:#a6e22e">alt&lt;/span>&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#e6db74">&amp;#34;{{ .Title }}&amp;#34;&lt;/span> &lt;span style="color:#a6e22e">src&lt;/span>&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#e6db74">&amp;#34;{{ $small.RelPermalink }}&amp;#34;&lt;/span> &amp;gt;
{{ end }}
&lt;/code>&lt;/pre>&lt;/div>&lt;p> &lt;/p>
&lt;h2 id="after">After&lt;/h2>
&lt;p>With these changes, I was ready to test my Lighthouse score again. You can try as well, my website is &lt;a href="https://alexlakatos.com/">alexlakatos.com&lt;/a>.&lt;/p>
&lt;p>
&lt;img
sizes="(min-width: 35em) 720px, 100vw"
srcset='
/img/posts/web/hugo-performance-after_hu0c0ab8061d39808040d146166d12a0fc_69149_500x0_resize_lanczos_2.png 500w
, /img/posts/web/hugo-performance-after_hu0c0ab8061d39808040d146166d12a0fc_69149_800x0_resize_lanczos_2.png 800w
'
src="https://alexlakatos.com/img/posts/web/hugo-performance-after.png"
alt="Good Lighthouse Performance">
 &lt;/p>
&lt;p>You&amp;rsquo;ll notice my &lt;code>Largest Contentful Paint&lt;/code> went down by about three and a half seconds. I&amp;rsquo;d call that a win. The Performance score also went up to 99, which I&amp;rsquo;d call pretty darn good. The fact that both my Accessibility and SEO scores jumped to 100 is because the new shortcode made me re-write all my image tags. I took the time to update them to have an &lt;code>alt&lt;/code> attribute, so I wouldn&amp;rsquo;t have to go through them again.&lt;/p>
&lt;p>Now if I wanted to do more, I would have to figure out a way to make Hugo&amp;rsquo;s Image Processing pipeline work with next-gen image formats. But that&amp;rsquo;s a story for another time. In the meantime, feel free to &lt;a href="https://twitter.com/avolakatos">reach out on Twitter&lt;/a>, and let me know if you&amp;rsquo;ve found this useful. Or at least mildly entertaining.😅&lt;/p></description></item></channel></rss>