<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[A Chapter Lead's blog]]></title><description><![CDATA[A Chapter Lead's blog]]></description><link>https://mesimian.com</link><generator>RSS for Node</generator><lastBuildDate>Sat, 18 Apr 2026 03:37:45 GMT</lastBuildDate><atom:link href="https://mesimian.com/rss.xml" rel="self" type="application/rss+xml"/><language><![CDATA[en]]></language><ttl>60</ttl><item><title><![CDATA[Constraints and creativity: Partial rollout feature without a server component]]></title><description><![CDATA[“I never castle” - Tom, chess player
“I never expand” - printf, Starcraft pro-player
Constraints lead to innovation. Without constrains, the road is paved and the best you can do is optimize and innovate on top of existing paradigms. That’s how, with...]]></description><link>https://mesimian.com/constraints-and-creativity-partial-rollout-feature-without-a-server-component</link><guid isPermaLink="true">https://mesimian.com/constraints-and-creativity-partial-rollout-feature-without-a-server-component</guid><category><![CDATA[#ABTesting]]></category><category><![CDATA[SRE]]></category><category><![CDATA[frontend]]></category><category><![CDATA[rollout strategy]]></category><dc:creator><![CDATA[Mihnea Simian]]></dc:creator><pubDate>Mon, 29 Sep 2025 20:00:48 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1759175154169/970185c3-3888-47b8-a819-17d625001d51.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>“I never castle” - <em>Tom</em>, chess player</p>
<p>“I never expand” - <em>printf</em>, Starcraft pro-player</p>
<p>Constraints lead to innovation. Without constrains, the road is paved and the best you can do is optimize and innovate on top of existing paradigms. That’s how, without having the option to implement a proper server-side service component, I was forced to design a way to implement partial rollout on the client side.</p>
<p>I teamed up with one of my colleagues and laid out the specs we wanted for our partial rollout feature: as a delivery squad, we wanted to give early access to a feature to a group of a limited amount of customers, so that we can monitor incidents while we increase the amount of customer that have access, or roll back the feature completely, in case of an unforeseen major failure:</p>
<ul>
<li><p>allocate <strong>a configurable percentage</strong> of total traffic that would experience the new feature - a percentage that we can change between 0 to 100, without redeploying the application</p>
</li>
<li><p><strong>don’t shuffle the users</strong> between the groups on a given configuration. Allocation should be sticky, so that users don’t see different features every time they log in</p>
</li>
<li><p>because of organizational constraints, we couldn’t build any backend service components. We had to figure out a <strong>quick, good-enough solution, in the client side</strong> code.</p>
</li>
</ul>
<p>We were lucky enough to find some piece of customer data that’s monotonic: unique and increasing - uniformly distributed. Once we had that, we were able to use it to distribute the individual users in a fixed amount of buckets (sharding), i.e. by modulo-operation. Imagine you have 200.000 users, which are allocated 200000 unique ID-s, integers, in consecutive sequence. You can choose to allocate them to 100 buckets, by computing their Modulo 100:</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1749041819716/dc78b8f1-287b-4930-a061-4008816e481a.png" alt class="image--center mx-auto" /></p>
<p>We then found a problem with this design - for every new feature we wanted to partially roll out, it was always the same users that got to be targeted:</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1749125943432/d45906ad-52a6-465f-a924-b291f1953447.png" alt class="image--center mx-auto" /></p>
<p>If your user identifiers are not countable and uniformly distributed, then you will need to come up with an additional stateless transformation that would directly convert the identifiers to a monotonic sequence. If the hash function does not distribute the users evenly into the buckets, you’d risk having significantly more traffic in one or more of the buckets, and thus, the percentage you configure can be a bad underestimation or overestimation.</p>
<p>The crux of this design is that it only works if the traffic is evenly distributed in the buckets, and you are comfortable having the frontend decide the configuration of your features or version of the features of your app.</p>
<p>For more advanced designs, you’d want to include this in your load balancer and handle the allocation logic there. Then, the frontend app can request the feature configuration, which may change based on how the user session is assigned to the control groups of your new features. This approach is not only more powerful but also more secure, as you can verify the feature configuration on the server, preventing malicious users from manually accessing a feature.</p>
<p>Creativity isn't always about revolutionary solutions. In this case, it was about a simple, easy-to-implement change in the frontend that helped us roll out gradually without much development effort.</p>
]]></content:encoded></item><item><title><![CDATA[How I changed a team meeting ritual so that I can grow]]></title><description><![CDATA[The more the team adopts behaviours from their leader, the more space the leader has to take on new challenges and explore wider horizons. However, it's only now, when I've pushed myself to expand my scope, that I've learned how to facilitate these c...]]></description><link>https://mesimian.com/how-i-changed-a-team-meeting-ritual-so-that-i-can-grow</link><guid isPermaLink="true">https://mesimian.com/how-i-changed-a-team-meeting-ritual-so-that-i-can-grow</guid><category><![CDATA[leadership]]></category><category><![CDATA[management]]></category><category><![CDATA[#growth]]></category><dc:creator><![CDATA[Mihnea Simian]]></dc:creator><pubDate>Tue, 02 Apr 2024 15:07:48 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1712069599462/e5c65b7b-a453-4889-a32e-f550c5ead577.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>The more the team adopts behaviours from their leader, the more space the leader has to take on new challenges and explore wider horizons. However, it's only now, when I've pushed myself to expand my scope, that I've learned how to facilitate these changes. I made a plan to clear my calendar and to-do list of tasks that my team can handle by April 1st. This way, starting from that date, I can concentrate on other projects in 2024..</p>
<blockquote>
<p>Once you're satisfied with a new process or ceremony that' you got it working well for your team, consider <strong>how much it depends on your involvement</strong>.</p>
<p>Your target is to lower that involvement to zero.</p>
</blockquote>
<p>In a previous article, I shared <a target="_blank" href="https://mesimian.com/ive-led-a-frontend-chapter-for-three-years-and-this-is-the-idea-im-most-proud-of">how I created a ceremony</a> for all Frontend chapter members to openly discuss and improve their frontend expertise and craftsmanship during a weekly "Frontend Open Office Hours". It was all hunky-dory until I realised how much the get-together relied on me to moderate, prepare the agenda, and conduct live presentations. This had to change - the frontends needed to self-organise so that I could step back from managing frontends exclusively and better mind my own development.</p>
<p>Reflecting back to the learnings in group-coaching sessions, I realised I needed to design <em>a role</em>. I called this new role <em>the Frontend Open Office Host</em>. This role would be designed to include all the tasks I was doing:</p>
<ol>
<li><p><strong>Gather agenda</strong> just before the meeting<br /> If the host is unable to make a non-empty list of topics, the meeting is skipped until the next week. Cycle repeats.</p>
</li>
<li><p>Launch and <strong>Moderate the meeting</strong></p>
</li>
<li><p><strong>Pick the next host!</strong><br /> This is the part that keeps the ball rolling. Make sure the hosts does this at the 55-minute mark, as some discussion tend to bleed over the time limit. Which is fine, we want people to engage - but we also want all people present when we randomly choose the next host.<br /> I particularly wanted to make this part fun - we ended up using a randomiser built by one of our frontends, as a frontend challenge - go <a target="_blank" href="https://github-vv.github.io/survivor/">check it here</a>.</p>
</li>
<li><p><strong>Record the topics &amp; references</strong> in our "Frontend Open Office Hours" one-pager.<br /> Always keep a public track of whom presented what. This helps us to jump back to the past presenters and topics, every time we need to remember something that was presented. It's also useful during mid-year or end-of-year review discussions to recognize those who have made significant contributions. Meeting logs don't lie!</p>
</li>
</ol>
<p>You know what happened? Suddenly, more and more diverse voices began to take the mic. Although the host's role was primarily organizational, to keep administrative responsibilities to one person, almost every time, the host also introduced a topic for discussion. It is true sometimes the meeting got delayed several weeks in a row - don't be shy and throw yourself some log to the fire to keep it running.</p>
<p>This is just an example on how to move the needle towards self-organization - and it won't happen overnight, but the benefits are clear: a more engaged team, a culture of shared responsibility, and the freedom for leaders to explore new horizons. As I reflect on changes like these, I am reminded that the essence of leadership lies in empowering others to grow and lead. True leadership is about the power of letting go, trusting your team, and the incredible outcomes of collective growth.</p>
]]></content:encoded></item><item><title><![CDATA[Leading Remote: Managing instant messaging interruptions]]></title><description><![CDATA[There's an undeniable surge in services trying to improve communication inside organizations, once these have shifted to hybrid or remote working. While efforts are made having communication and interactions take place easier remotely, there is anoth...]]></description><link>https://mesimian.com/leading-remote-managing-instant-messaging-interruptions</link><guid isPermaLink="true">https://mesimian.com/leading-remote-managing-instant-messaging-interruptions</guid><category><![CDATA[Productivity]]></category><category><![CDATA[leadership]]></category><category><![CDATA[management]]></category><category><![CDATA[communication]]></category><category><![CDATA[remote work]]></category><dc:creator><![CDATA[Mihnea Simian]]></dc:creator><pubDate>Wed, 31 Jan 2024 18:41:49 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1706724486854/ac8508a7-61b4-4979-8418-2ca6fea9b138.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>There's an undeniable surge in services trying to improve communication inside organizations, once these have shifted to hybrid or remote working. While efforts are made having communication and interactions take place easier remotely, there is another side to the coin: employers that were already acting as a 'communications hub' have to become even more skilled at balancing individual time versus outside interruptions, since the 'interrupters' have received the super-power of instant messaging on Slack / Teams / Hangouts.</p>
<p>Instant Push Notifications are a powerful tool. If you don't already do this, you can start by creating a "Work Focus mode" on your phone. Don't let random apps disturb you. If you're waiting for deliveries to your door, you can add delivery apps on your exception list, and enable receiving calls. Or simply put the phone in full-DND and only check on it during breaks. I'd argue the "Inbox Zero" habit should now be replaced by "Zero irrelevant push notifications"-mantra.</p>
<p>However, blocking or delaying colleagues that are trying to reach you is not a part of the solution, it just postpones the problems and clusters the interruptions on your own terms. I'm not saying it's a bad approach, but you still want to lead the persons that are trying to reach you, and in a timely manner. Sometimes answering a team member or reading a comment just in time may save yourself a lot of trouble in the future. What you need is <strong>a systematic, leadership-oriented approach</strong> by which you <em>elevate the quality and reduce the quantity</em> of your incoming interruptions. So whenever somebody buzzes you, you know it's worth switching context.</p>
<p>In 2021, as a Chapter Lead of 14 chapter members spread in 10 delivery squads in a large organization at full speed at leveraging Microsoft Teams, I had to find a way to cope with interruptions. It's true that leadership roles are mostly about communication, but <strong>structure is always preferred</strong>. The following method is what I personally developed and at least one peer successfully used it; so if you too are struggling with being interrupted at work by instant messages or impromptu calls, this is something for you to try.</p>
<h2 id="heading-the-log-method">The LOG Method</h2>
<p><strong>L-O-G:</strong> <strong>L</strong>og, <strong>O</strong>rganise, <strong>G</strong>et <em>:chocolate-soft-serve-swirl-emoji:</em> done</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1706725582145/3d789dab-34f1-4e92-bcd0-d75343121a71.jpeg" alt class="image--center mx-auto" /></p>
<p>Keep an instant messaging log, by writing down every time somebody starts up a convo or a call with you. You want to write who messaged you and why. I also label them "self-initiated" if I was the one to start the conversation.</p>
<h3 id="heading-step-1-log">Step 1: Log</h3>
<p>Make the habit of logging every conversation topic for 1-3 weeks. It helps keeping this file on your desktop, or open at all times. Although I'm a big fan of jotting down in markdown or in a structured data format (yml, json), I gave in and used a spreadsheet 'cause I always wanted to Excel at work 🥁.</p>
<p>I group interruptions <strong>by day</strong>, and always include <strong>who</strong> interrupted and the <strong>reason</strong> why.<br />Here's an example from mine, based on real data; persons and some details are made up.</p>
<div class="hn-table">
<table>
<thead>
<tr>
<td>Day</td><td>Who</td><td>Reason</td></tr>
</thead>
<tbody>
<tr>
<td>31.01</td><td>John</td><td>self initiated: spotted something in his PR that was worth debating in the chapter meeting</td></tr>
<tr>
<td></td><td>Danny</td><td>about our Edge browser support</td></tr>
<tr>
<td></td><td>Diddy</td><td>about an old user story on browser support</td></tr>
<tr>
<td></td><td>Joanne</td><td>pulled me in a design meeting</td></tr>
<tr>
<td></td><td>Jerry</td><td>shared news about that tech meetup I was interested in</td></tr>
<tr>
<td>30.01</td><td>Jade</td><td>self initiated: on that promote of insurance product that got us unprepared</td></tr>
<tr>
<td></td><td>Jordy</td><td>on why we thought we had a "lite" version of change management for tiny changes - to be used for that insurance product</td></tr>
<tr>
<td></td><td>Jamila</td><td>pulled in a meeting on planning promote of insurance product</td></tr>
</tbody>
</table>
</div><h3 id="heading-step-2-organise">Step 2: Organise</h3>
<p>Once you have enough data, start labeling logged interruptions. The category labels will come to you :) don't worry for that. You'll see how the interruptions cluster around topics.</p>
<p>Or don't label. Simply read them, one after another. Patterns will start talking to you.</p>
<p>I'd ask you to extract the categories in a separate list, and sort them descending, by how much they generate noise in your Messaging app. But that's not the case for me. I simply could pin-point 2-3 big issues that were generating noise, straight away.</p>
<p>For instance, if we had documented our browser support list and shared that with QA chapter, my 31st of January would have had 2 less interruptions. Not to mention 30th of January was a wreck simply because somebody in my team had misinfo on the change management process.</p>
<h3 id="heading-step-3-get-it-done-the-action-items">Step 3: Get it done - the action items</h3>
<p>For each category, it's you, the tech leader, that needs to come up with a plan to make your colleagues more autonomous and require your assistance less frequently. For me, that meant walking all of my chapter through change management process in all its intricacies, so at least they're aware of its steps and reasoning behind it. And made sure we have clear, up to date docs on the org wiki on what devices and browsers we support. At least these two shouldn't generate noise anymore in my Teams app.</p>
<p>In closing, there's no silver bullet for managing interruptions - it depends on the culture of the team, on the nature of your team's priorities and how good you can cope with context switch. When reaching for my Teams window, I prioritise my same reporting line peers (my <em>first</em> team), my direct reports and my manager. They should always hear back from me, <strong>almost immediately</strong>.</p>
<p>In large organisations, information overload is practically unavoidable: you have to turn off some channels to cope with it. If the info were important, it would eventually swing back to you. But as a leader, you are responsible for how you handle instant messaging and ad-hoc call interactions.</p>
]]></content:encoded></item><item><title><![CDATA[Rapidly boost code review efficiency for sizeable distributed teams]]></title><description><![CDATA[Not surprisingly, there's already a lot of literature on what makes a good Code Review - also known as Merge Request or Pull Request; e.g. "What to Look for in a Code Review" by Trisha Gee. Code Review can also be found as a part of a technical inter...]]></description><link>https://mesimian.com/rapidly-boost-code-review-efficiency-for-sizeable-distributed-teams</link><guid isPermaLink="true">https://mesimian.com/rapidly-boost-code-review-efficiency-for-sizeable-distributed-teams</guid><category><![CDATA[code review]]></category><category><![CDATA[Code Quality]]></category><category><![CDATA[leadership]]></category><category><![CDATA[technical leadership]]></category><dc:creator><![CDATA[Mihnea Simian]]></dc:creator><pubDate>Sat, 20 Jan 2024 15:42:53 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1705765310472/9619657f-f588-491b-ac43-f6dc9c38ed96.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Not surprisingly, there's already a lot of literature on what makes a good Code Review - also known as <em>Merge Request</em> or <em>Pull Request</em>; e.g. "What to Look for in a Code Review" by Trisha Gee. <em>Code Review</em> can also be found as a part of a technical interview.</p>
<p>However, what I want to focus on is the process of code review in its entirety that takes part in one or more teams - typically split into the following parts: the creation of the CR request, the actual act of giving feedback by one or more reviewers, the subsequent amendments as a result of applying the feedback and asking for a subsequent review and finally, closing the Code Review either through merging the changes into the target branch or abandoning the changes.</p>
<div class="embed-wrapper"><div class="embed-loading"><div class="loadingRow"></div><div class="loadingRow"></div></div><a class="embed-card" href="https://twitter.com/mihneasim/status/1745390144679530890">https://twitter.com/mihneasim/status/1745390144679530890</a></div>
<p> </p>
<p>Trouble is, once you have some sort of <strong>Code Review process guidelines</strong> in place, how do you get large teams to learn from these guidelines and change their behaviour during the Code review process accordingly? Yes, I know, I just stated pretty much the whole mission of technical leadership. Creating comprehensive guidelines on all of the steps of the code review process, for both actors - <em>code author</em> and <em>reviewer -</em> is a good start, but definitely not enough in order to yield results.</p>
<ul>
<li><p>Only a few will read the guidelines</p>
</li>
<li><p>The ones who do, will forget most of the details, without actively practicing. A few things will stick, depending on what each individual is prone to remember, and it can work as a "go-to" place for beginners. Still, as time passes, folks will forget they exist.</p>
</li>
<li><p>you can link them in the Code Review template; yet again, do not expect too many people to click and skim through them. Clicking and opening a new page from a CR is an effort most won't take.</p>
</li>
</ul>
<h2 id="heading-a-code-review-template-has-better-odds-to-yield-results-if-well-tailored">A <strong>Code Review template</strong> has better odds to yield results, if well tailored!</h2>
<p>There's a good read on templates <a target="_blank" href="https://dev.to/opensauced/how-to-create-a-good-pull-request-template-and-why-you-should-add-gifs-4i0l">here</a>, mentioning one example <a target="_blank" href="https://github.com/forem/forem/blob/main/.github/PULL_REQUEST_TEMPLATE.md">here</a> and another <a target="_blank" href="https://github.com/open-sauced/.github/blob/main/.github/PULL_REQUEST_TEMPLATE.md">here</a>. I won't share with you yet another template, but I'd like to walk you through the most important bits when designing it for your team. The purpose of the template is three-folded:</p>
<ul>
<li><p>👍 to inflict the <strong>good habits</strong> you listed down in the detailed guidelines that no-one reads</p>
</li>
<li><p>✌️ to as <strong>many people</strong> as possible</p>
</li>
<li><p>👌 on the <strong>long term</strong></p>
</li>
</ul>
<p>The CR template is the default free-text body of the Code Review. Therefore, it is probably the <em>most precious and "expensive" advertising place amongst engineers in your org</em>, so choose your words wisely, and don't overdo it. Keep it short and efficient. Give the authors the choice not to fill-in the template, instead erase it and do their own thing in the free-text area. I chose to mention that upfront, in the template.</p>
<h3 id="heading-author-should-be-reminded-about-creating-the-best-possible-experience-for-the-reviewer">Author should be reminded about creating the best possible experience for the reviewer</h3>
<p>The body should include any non-obvious reason <strong>what the code change is about</strong>, <strong>how</strong> it tries to achieve that and <strong>why</strong>. If the change is one commit with a good enough commit message, then fine, just point to it. I've heard engineers say "but I am already required to link a workitem on my backlog". I don't believe that's enough: we all know the User Story is not about the "codez" so much as the acceptance criteria and the business request; e.g. it won't mention the reason why the code author moved one class from one package to another. That's for the author to explain in the CR. And few reviewers will actually open and read the workitem to gain context (kudos to you if you do!).</p>
<p>The Code Change should be <em>as final as possible</em>. Don't submit code for review that's not production-ready - unless you're asking for a quick feedback, which is totally fine, but a different process. To check upon this, in my team's template we're asking the author to write exactly <strong>how the change was tested</strong>. Manually, with fabricated inputs? Unit-tested? End to end? On a feature-testing build? Which one?</p>
<h3 id="heading-reviewer-should-be-reminded-whats-important-to-touch-upon">Reviewer should be reminded what's important to touch upon</h3>
<p>And of course, to be kind 😊. Although I haven't seen this anywhere else, we chose to include a short <strong>checklist for the reviewer</strong>, as a <em>read-only section</em> in the template. The checklist will vary heavily on the nature of the project, so each technical lead or manager of a delivery team should have a strong say on what should be included here.</p>
<h3 id="heading-make-it-fun">Make it fun</h3>
<p>Or create some different intrinsic drive for both the author and the reviewer to put in the effort - don't make it sound like another chore. Ask for some creative input. Ask how they felt coding that. Occasionally publicly praise great Code Reviews, pointing to what made it stand out. Don't force it, pick genuinely good code review requests, or code reviews. I've seen people include before&amp;after screenshots, performance metrics, or JavaScript bundle sizes comparisons.</p>
<h2 id="heading-success-indicator">Success indicator?</h2>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1705765447603/8c69474a-0f6d-4cc5-b1be-6cea1f007497.jpeg" alt class="image--center mx-auto" /></p>
<p>When we started this out with multiple teams in my org, I received an interesting question: <em>How would we tell the template was successful? What would this metric be?</em><br />I would like to address this question in a separate follow-up post. Reviewing is not quantifiable. It's all up to professional judgement. What we would need to do is sample Code Reviews before and after using the template, and subjectively judge how much it made a difference.</p>
]]></content:encoded></item><item><title><![CDATA[Revojs: How a Local Conference in 🇷🇴 Romania turned into a Networking Gold Mine]]></title><description><![CDATA[Two large frontend events are happening in Romania each year, and one of them is revojs in Timisoara, which I attended for both of their on-site editions, that is October 2019 and October 2023.
The Talks
Let's jump right in, one by one. Note - my not...]]></description><link>https://mesimian.com/revojs-how-a-local-conference-in-romania-turned-into-a-networking-gold-mine</link><guid isPermaLink="true">https://mesimian.com/revojs-how-a-local-conference-in-romania-turned-into-a-networking-gold-mine</guid><category><![CDATA[frontend]]></category><category><![CDATA[conference]]></category><category><![CDATA[events]]></category><dc:creator><![CDATA[Mihnea Simian]]></dc:creator><pubDate>Mon, 11 Dec 2023 12:52:22 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1702299098647/94479037-b649-4957-91ec-0435e95b6f65.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Two large frontend events are happening in Romania each year, and one of them is <strong>revojs</strong> in Timisoara, which I attended for both of their on-site editions, that is October 2019 and October 2023.</p>
<h2 id="heading-the-talks">The Talks</h2>
<p>Let's jump right in, one by one. Note - my notes are written based on my memory of the presentation. Later I saw they were published on YouTube. Expect discrepencies.</p>
<h3 id="heading-tug-of-war-pushing-and-pulling-in-javascript-by-ben-lesh">Tug of War – Pushing and Pulling In JavaScript by Ben Lesh</h3>
<p>Ben is best known for his involvement in writing RxJS, but also a dad of three, living in Texas. He touched upon the topic of Signals with a creative approach, the one of data pull and pushing: <em>"Each line of code either pulls or pushes"</em>. He surprised us by creating a set of logical operations which represented syntactical transformations of Promises and Observables by the "pull or push"-pattern, which he then applied to model Signals after the same pattern - proving Signals are not, in essence, much more different than Observables.</p>
<div class="embed-wrapper"><div class="embed-loading"><div class="loadingRow"></div><div class="loadingRow"></div></div><a class="embed-card" href="https://www.youtube.com/watch?v=JbL_kqTZAc4">https://www.youtube.com/watch?v=JbL_kqTZAc4</a></div>
<p> </p>
<h3 id="heading-there-is-no-such-thing-as-a-generic-by-matt-pocock">There Is No Such Thing as a 'Generic' by Matt Pocock</h3>
<p>Matt is best known for his Typescript course called Total Typescript. <em>"Generic is overloaded"</em>: There is no such thing as a <em>Generic</em> (noun) because <em>generic</em> is an adjective, and it is used in constructs such as "generic functions" or "generic types". While the generic types have at least one parameter (type parameter), generic functions don't require type arguments, because they infer (resolve) the type.</p>
<div class="embed-wrapper"><div class="embed-loading"><div class="loadingRow"></div><div class="loadingRow"></div></div><a class="embed-card" href="https://www.youtube.com/watch?v=le5ciL1T7Hk">https://www.youtube.com/watch?v=le5ciL1T7Hk</a></div>
<p> </p>
<h3 id="heading-type-safe-style-systems-the-future-of-css-by-josh-goldberg-selected-from-cfp">Type-Safe Style Systems: The Future of CSS by Josh Goldberg, selected from ✍️ CFP</h3>
<p>CART: Convenient. Assistable. Refactorable. Themeable. (Performant).<br />We were presented with possible futures of CSS - circling around CSS modularizations, "themeable-ities" and developer experience while writing and organizing styles. I see I jotted down "@vanilla-extract/" and chackra-ui. Oh, and "squiglies".<br />Josh couldn't find his favourite button-down shirt because his luggage chose a different flight. Luckily he got that back for the next day, and he was the one to volunteer (I presume) for a second talk standing in for a speaker that couldn't make it to the conference anymore.</p>
<div class="embed-wrapper"><div class="embed-loading"><div class="loadingRow"></div><div class="loadingRow"></div></div><a class="embed-card" href="https://www.youtube.com/watch?v=XMn9JnPH9ic">https://www.youtube.com/watch?v=XMn9JnPH9ic</a></div>
<p> </p>
<h3 id="heading-new-css-features-you-can-use-today-by-rachel-andrew">New CSS Features You Can Use Today by Rachel Andrew</h3>
<p>Rachel is Content Lead for Chrome DevRel at Google, and yeah, you could tell she's a professional tech writer; I'm just reading on her website that she has authored or co-authored more than 20 books! I love how articulate she is, providing all the right info for the right purpose on her website.<br />But now back to her presentation. We got a primer on CSS latest standards adopted or soon to be adopted by browsers: sizing units based on viewport sizes (svw/svh, lvw/lvh, dvw/dvh), :focus-visible ("<em>browser: 'is focus ring required?'"</em>), Cascade Layers, @layer framework, layout, utilities, container queries, range operator for media queries, "High Definition CSS Color Guide", color-mix, gradient.style, :not(:has(img)), @property (type, initial - fallback), Web Platform Baseline.<br />Never have I thought I'd write down so many notes on a CSS presentation.</p>
<div class="embed-wrapper"><div class="embed-loading"><div class="loadingRow"></div><div class="loadingRow"></div></div><a class="embed-card" href="https://www.youtube.com/watch?v=dUz72A96qqg">https://www.youtube.com/watch?v=dUz72A96qqg</a></div>
<p> </p>
<h3 id="heading-understanding-rendering-patterns-by-atila-fassina-selected-from-cfp">Understanding Rendering Patterns by Atila Fassina, selected from ✍️ CFP</h3>
<p>Atila learns Rust, was born in Brazil and lives in Berlin. This talk was a walkthrough on rendering patterns - including a live demo sampling a performance optimization in reactivity based on signals (hope I don't mix up). My doodles:<br /><em>Abstract the DOM -&gt; batch changes -&gt; Reconcile</em><br /><em>prop drilling</em><br /><em>"tide" vs "wave" - the tide raises everyone, as opposed to the wave that only raises a subset</em></p>
<div class="embed-wrapper"><div class="embed-loading"><div class="loadingRow"></div><div class="loadingRow"></div></div><a class="embed-card" href="https://www.youtube.com/watch?v=ATXgJR1H7Cs">https://www.youtube.com/watch?v=ATXgJR1H7Cs</a></div>
<p> </p>
<h3 id="heading-demystifying-web-performance-tooling-by-anna-migas">Demystifying Web Performance Tooling by Anna Migas</h3>
<p>When you think you saw and read everything you could on web performance, then there's this presentation that can very well serve as a performance audit starting point. My doodles:</p>
<ol>
<li><p><em>Load web performance</em></p>
</li>
<li><p><em>Runtime web performance - jank, code splitting, animation optimization</em></p>
</li>
<li><p><em>Perceived web performance - Laboratory Data versus Field Data</em></p>
</li>
</ol>
<p><em>PageSpeed Insights, Webpack, Web Vitals extension, devTools: Network, Performance, Lighthouse.<br />Lighthouse: paint flashes, Layout Borders, Rendering tab -&gt; use a different Chrome Profile<br />Network tab: Priority column</em><br /><em>Time to first byte (waiting for the server to respond). SpeedCurve, Calibre</em></p>
<div class="embed-wrapper"><div class="embed-loading"><div class="loadingRow"></div><div class="loadingRow"></div></div><a class="embed-card" href="https://www.youtube.com/watch?v=X3PKBYmbTkU">https://www.youtube.com/watch?v=X3PKBYmbTkU</a></div>
<p> </p>
<h3 id="heading-no-bs-seo-for-web-developers-by-martin-splitt">No-BS SEO for web developers by Martin Splitt</h3>
<p>Martin put on a show. He made up (I think?) a website trying to sell toasters, in two flavours: the no-go one, and the SEO optimized. We had a good laugh since the <em>joke</em> was the brutal truth for many online businesses.<br />I appreciate how Martin creates his GIF-s out of his personal video content - and avoids any comments on licensing - I do the same Martin, with my image content. My doodles:<br /><em>content, strategy, technology<br />"protoduction", "build an aeroplane while in flight"<br />a fly on the wall of a company<br />efficient &amp; no sense of humour</em> (loved this joke - how many Germans do you need to change a💡? One. Because..)<em><br />evergreen, GoogleBot, crawl budget</em></p>
<div class="embed-wrapper"><div class="embed-loading"><div class="loadingRow"></div><div class="loadingRow"></div></div><a class="embed-card" href="https://www.youtube.com/watch?v=xgyvh9TOdYM">https://www.youtube.com/watch?v=xgyvh9TOdYM</a></div>
<p> </p>
<h3 id="heading-security-bye-design-by-benedek-gagyi-selected-from-cfp">Security by(e) Design? by Benedek Gagyi, selected from ✍️ CFP</h3>
<p>This talk draws attention to balancing web security and UX decisions. My doodles:<br /><em>tea brewing, gongfu<br />Devs &lt;-&gt; UX &lt;-&gt; Security<br />Credentials API, Web OTP API, WebAuthn -&gt; Passkeys</em></p>
<div class="embed-wrapper"><div class="embed-loading"><div class="loadingRow"></div><div class="loadingRow"></div></div><a class="embed-card" href="https://www.youtube.com/watch?v=O8LPgLTxKxk">https://www.youtube.com/watch?v=O8LPgLTxKxk</a></div>
<p> </p>
<h3 id="heading-you-could-lint-more-by-josh-goldberg">You Could Lint More by Josh Goldberg</h3>
<p>Josh, previously selected through CFP, stepped in to hold this second talk as a replacement for a speaker on the agenda who couldn't make it to Timisoara because of personal reasons. The title is spot-on: indeed, es-lint is a gold mine for teams. My doodles:<br /><code>--max-warnings</code> <em>- create a gate of a maximum number of warnings allowed in the CI pipeline. eslint-plugin-deprecated, eslint-comments, eslint-plugin-jsdoc, eslint-plugin-markdown, eslint-plugin-perfectionist, eslint-plugin-regexp regexp create-typescript-app, warp - terminal, vitest, pnpm</em></p>
<div class="embed-wrapper"><div class="embed-loading"><div class="loadingRow"></div><div class="loadingRow"></div></div><a class="embed-card" href="https://www.youtube.com/watch?v=voYSdj3Xqvc">https://www.youtube.com/watch?v=voYSdj3Xqvc</a></div>
<p> </p>
<h3 id="heading-the-ethical-choice-by-alex-moldovan-selected-from-cfp">The Ethical Choice by Alex Moldovan, selected from ✍️ CFP</h3>
<p>This goes beyond accessibility or UX: what choice does it <em>feel</em> to be good or bad for the interest of the user when designing web experiences? We all know the annoying tiny "unsubscribe" links lacking contrast. Or the "opt-in" default selection. Yeap, those. I'm happy somebody framed this topic in a talk.</p>
<div class="embed-wrapper"><div class="embed-loading"><div class="loadingRow"></div><div class="loadingRow"></div></div><a class="embed-card" href="https://www.youtube.com/watch?v=qGjJ6-xNfM0">https://www.youtube.com/watch?v=qGjJ6-xNfM0</a></div>
<p> </p>
<h3 id="heading-have-you-heard-the-joke-about-async-debugging-i-promise-it-is-good-by-jay-phelps">Have You Heard the Joke About Async Debugging? I Promise It Is Good. by Jay Phelps</h3>
<p>Async issues are the worst! Not to brag, but I spotted the one in the talk on time. Jay was top of the game on teaching - he led you in solving the mysterious bug by yourself. I can't wait to show this talk to my team. My doodles:<br /><em>"input" event - including Paste</em><br /><em>request coming back out of order</em><br /><em>typescript-eslint/return-await: "error"</em></p>
<div class="embed-wrapper"><div class="embed-loading"><div class="loadingRow"></div><div class="loadingRow"></div></div><a class="embed-card" href="https://www.youtube.com/watch?v=YOxgYrS4d8E">https://www.youtube.com/watch?v=YOxgYrS4d8E</a></div>
<p> </p>
<h3 id="heading-breaking-down-javascript-complexities-with-generative-art-by-ritvi-mishra-selected-from-cfp">Breaking Down JavaScript Complexities With Generative Art by Ritvi Mishra, selected from ✍️ CFP</h3>
<p>How many of you are visual learners? Ritvi showed us how one can learn Javascript as their first programming language by coding visualisations: such as visually describing the steps in repetitive structures or the call stack.</p>
<div class="embed-wrapper"><div class="embed-loading"><div class="loadingRow"></div><div class="loadingRow"></div></div><a class="embed-card" href="https://www.youtube.com/watch?v=MQ1slSVl2tE">https://www.youtube.com/watch?v=MQ1slSVl2tE</a></div>
<p> </p>
<h3 id="heading-nodejs-in-2023-whats-new-in-the-nodejs-native-test-runner-by-erick-wendel-selected-from-cfp">Node.js in 2023 – What’s New in the Node.js Native Test Runner by Erick Wendel, selected from ✍️ CFP</h3>
<p>I have to admit that this talk stretched my Javascript knowledge and attention. Erick is a high performing professional, contributing to nodejs's native test runner. Kudos for an enjoyable in-depth walk-through of such a difficult topic. My doodles:<br /><em>v-test</em><br /><em>TAP - protocol</em><br /><em>dot; spec; junit; lcov</em><br /><em>test sharding &amp; concurrency</em><br /><em>why-is-node-running</em></p>
<div class="embed-wrapper"><div class="embed-loading"><div class="loadingRow"></div><div class="loadingRow"></div></div><a class="embed-card" href="https://www.youtube.com/watch?v=q3OQz5E1OpI">https://www.youtube.com/watch?v=q3OQz5E1OpI</a></div>
<p> </p>
<h3 id="heading-testing-your-testing-strategy-by-trent-willis">Testing Your Testing Strategy by Trent Willis</h3>
<p>I empathised a lot with this topic: what types of testing and how much testing do you need? How do you know "<em>you're good</em>" or "<em>yikes, too many tests to maintain, are they really paying off..</em>"? My doodles:<br /><em>The value of testing is in quality, not in quantity</em><br /><em>Optimize invested time versus confidence. The trouble is - confidence can't be quantified  
</em><a target="_blank" href="http://noti.st/trentmwillis"><em>noti.st/trentmwillis</em></a></p>
<div class="embed-wrapper"><div class="embed-loading"><div class="loadingRow"></div><div class="loadingRow"></div></div><a class="embed-card" href="https://www.youtube.com/watch?v=kEkMqppoyHA">https://www.youtube.com/watch?v=kEkMqppoyHA</a></div>
<p> </p>
<h3 id="heading-requiem-for-apis-the-evolution-of-web-development-by-ciprian-caba">Requiem for APIs – The Evolution of Web Development by Ciprian Caba</h3>
<p>Ciprian created a sort of "time-lapse" for web development, showing us how the data rendering into the presentation layer has circled back from server to client to server, and pointing out API-s can get obsolete, once we use the full abilities of the new frameworks that can simply access the data model directly, on the server side.</p>
<div class="embed-wrapper"><div class="embed-loading"><div class="loadingRow"></div><div class="loadingRow"></div></div><a class="embed-card" href="https://www.youtube.com/watch?v=bmtW_IT63P4">https://www.youtube.com/watch?v=bmtW_IT63P4</a></div>
<p> </p>
<h3 id="heading-beyond-the-web-of-today-by-kenneth-rohde-christiansen">Beyond the Web of Today by Kenneth Rohde Christiansen</h3>
<p>I had no idea about all the work involved to better support high-level API-s from the producers of hardware processing units. We're talking hardware that can speed up software related to (but not limited to) computer vision: blurring background, virtual background, eye-following, real-time visual filters, as well as anything that involves tensor calculus &amp; whatnot. A hard subject. My dribbles:<br /><em>Project Fugu</em><br /><em>Web Codecs</em><br /><em>WebGPU, NPU / TPU, Web Neural Network API (Web NN)</em><br /><em>ONNXM, MediaPipe, OpenCV.js</em></p>
<div class="embed-wrapper"><div class="embed-loading"><div class="loadingRow"></div><div class="loadingRow"></div></div><a class="embed-card" href="https://www.youtube.com/watch?v=Vx-dlSUx18Y">https://www.youtube.com/watch?v=Vx-dlSUx18Y</a></div>
<p> </p>
<h2 id="heading-the-vibes">The Vibes</h2>
<p>I can't thank the community of professionals in Timisoara enough for making <strong>revojs</strong> happen. I know it isn't easy. It takes time, energy, commitment, lots of helping hands, and sponsors (and trust me they do need a lot of sponsorships for such a scale of an event). The thing is - their commitment and their helping hands are something money can't buy for a conference to take place - and that's what makes revojs so special.</p>
<div class="embed-wrapper"><div class="embed-loading"><div class="loadingRow"></div><div class="loadingRow"></div></div><a class="embed-card" href="https://twitter.com/revojsro/status/1714239446269280344">https://twitter.com/revojsro/status/1714239446269280344</a></div>
<p> </p>
<p>Most of the participants are part of the local community. Both of the times I travelled by myself to the conference and made friends on the spot. This time, however, I couldn't see anyone familiar at the after-beer outdoorsy party, and I was fortunate enough to bump into Jay while ordering drinks and, long story short, I ended up having a great time drinking and chatting with all the speakers at the party, for hours. I even realised I had been walking very close to Matt's home address in Oxford when attending RenderConf 2016. Such a small world, isn't it?</p>
<p>Who would have imagined I would one day have a drink with Matt and talk about that conference in his hometown? Can't wait to see what the next revojs has in store.</p>
<div class="embed-wrapper"><div class="embed-loading"><div class="loadingRow"></div><div class="loadingRow"></div></div><a class="embed-card" href="https://twitter.com/erickwendel_/status/1710364519208251625">https://twitter.com/erickwendel_/status/1710364519208251625</a></div>
]]></content:encoded></item><item><title><![CDATA[Hyrum's law in modern frontend]]></title><description><![CDATA[The best professional books for you are the books that are revealing situational problems that you will encounter in your engineering journeys. I had the fortune to read about Hyrum's law in Software Engineering at Google: Lessons Learned From Progra...]]></description><link>https://mesimian.com/hyrums-law-in-modern-frontend</link><guid isPermaLink="true">https://mesimian.com/hyrums-law-in-modern-frontend</guid><category><![CDATA[Software Engineering]]></category><category><![CDATA[Frontend Development]]></category><category><![CDATA[JavaScript]]></category><category><![CDATA[Web Components]]></category><category><![CDATA[General Programming]]></category><dc:creator><![CDATA[Mihnea Simian]]></dc:creator><pubDate>Tue, 30 May 2023 21:39:02 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1685482558666/3bde9d28-3b26-486b-abaf-378ef4c8d288.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>The best professional books for you are the books that are revealing situational problems that you will encounter in your engineering journeys. I had the fortune to read about Hyrum's law in <a target="_blank" href="https://www.google.ro/books/edition/Software_Engineering_at_Google/V3TTDwAAQBAJ">Software Engineering at Google: Lessons Learned From Programming Over Time</a> (Great one!) and see that law happening magically just before my eyes, in a team near me.</p>
<p>The law says that:</p>
<blockquote>
<p>With a sufficient number of users of an API, it does not matter what you promise in the contract: all observable behaviours of your system will be depended on by somebody</p>
</blockquote>
<p>One colleague (desperately) needed to access a couple of properties of a web component that was developed and maintained by a different team, but consumed in his own micro frontend. For the simplicity of the example, let's consider the default web component generated by OpenWC's npm generator:</p>
<pre><code class="lang-javascript"><span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">AppMain</span> <span class="hljs-keyword">extends</span> <span class="hljs-title">LitElement</span> </span>{
  <span class="hljs-keyword">static</span> properties = {
    <span class="hljs-attr">header</span>: { <span class="hljs-attr">type</span>: <span class="hljs-built_in">String</span> },
  }
...
   render() {
    <span class="hljs-keyword">return</span> html`<span class="xml">
      <span class="hljs-tag">&lt;<span class="hljs-name">main</span>&gt;</span>
        <span class="hljs-tag">&lt;<span class="hljs-name">h1</span>&gt;</span></span><span class="hljs-subst">${<span class="hljs-built_in">this</span>.header}</span><span class="xml"><span class="hljs-tag">&lt;/<span class="hljs-name">h1</span>&gt;</span>
       ....
     `</span>;
    }
}
</code></pre>
<p>Consider you'd be consuming this component in your template</p>
<pre><code class="lang-javascript">&lt;app-main&gt;&lt;/app-main&gt;
</code></pre>
<p>And you, as a consumer, imagine yourself not knowing the implementation of the component, but needing to access the data rendered through the means of the <code>header</code> property. You'd probably select the element in DevTools, then jump to Console, type <code>$0.</code> and see what properties pop up. That's the exact process one colleague followed and ended up using the <em>hidden</em> <em>dunder</em> property (double underscore property) - the equivalent <code>$0.__header</code> in our example.</p>
<h2 id="heading-lits-quirks">Lit's quirks</h2>
<p>So what's up with lit shadowing any <code>.property</code> in a <code>.__property</code>? Why is there a property called <code>__header</code> with, surprisingly-not-so-surprisingly, the same value as <code>header</code> property? Well, we've run into an implementation detail that at no point was intended to be used by component consumers, or any developer building web components on top of lit. But since I can't leave you wondering, lit's actual component properties are setters and getters, whilst the true value is stored in this hidden dunder property. By the use of this wrapping, at any point, lit can detect when the setter is writing something different than what it's already stored so that the rendering cycle, as well as update hooks are triggered only then. Simple and effective!</p>
<blockquote>
<p>Fun, hackish experiment: If you do set a value for __header, it won't trigger the render process, since you're bypassing lit's setter, so the template will not update. If you then do set the exact same value through the <em>header</em> property, again the render cycle will be skipped, because it would be compared against the value in __<em>header</em>.</p>
</blockquote>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1685481620317/4b9efb9f-b751-4c47-a594-25e3033d9b0f.gif" alt="Animation showing hidden lit element properties called accessors or descriptors" class="image--center mx-auto" /></p>
<h3 id="heading-advanced-deep-dive">Advanced Deep Dive</h3>
<p>If you reaaaally want to see the bottom of what I just explained, then head to lit-element's <a target="_blank" href="https://github.com/lit/lit-element/blob/v2.4.0/src/lib/updating-element.ts#L329">source code</a>. What we call properties, are actually called accessors or descriptors in lit, and one can implement and configure a custom accessor, should someone need a different one, for a given property, on a given component class. As far as I can see, the property itself, created on the prototype, is an <em>accessor</em>, while the assigned value is called a <em>property</em> <em>descriptor</em>.</p>
<pre><code class="lang-typescript">  <span class="hljs-keyword">static</span> createProperty(
      name: PropertyKey,
      options: PropertyDeclaration = defaultPropertyDeclaration) {
    <span class="hljs-comment">// Note, since this can be called by the `@property` decorator which</span>
    <span class="hljs-comment">// is called before `finalize`, we ensure storage exists for property</span>
    <span class="hljs-comment">// metadata.</span>
    <span class="hljs-built_in">this</span>._ensureClassProperties();
    <span class="hljs-built_in">this</span>._classProperties!.set(name, options);
    <span class="hljs-comment">// Do not generate an accessor if the prototype already has one, since</span>
    <span class="hljs-comment">// it would be lost otherwise and that would never be the user's intention;</span>
    <span class="hljs-comment">// Instead, we expect users to call `requestUpdate` themselves from</span>
    <span class="hljs-comment">// user-defined accessors. Note that if the super has an accessor we will</span>
    <span class="hljs-comment">// still overwrite it</span>
    <span class="hljs-keyword">if</span> (options.noAccessor || <span class="hljs-built_in">this</span>.prototype.hasOwnProperty(name)) {
      <span class="hljs-keyword">return</span>;
    }
    <span class="hljs-keyword">const</span> key = <span class="hljs-keyword">typeof</span> name === <span class="hljs-string">'symbol'</span> ? <span class="hljs-built_in">Symbol</span>() : <span class="hljs-string">`__<span class="hljs-subst">${name}</span>`</span>;
    <span class="hljs-keyword">const</span> descriptor = <span class="hljs-built_in">this</span>.getPropertyDescriptor(name, key, options);
    <span class="hljs-keyword">if</span> (descriptor !== <span class="hljs-literal">undefined</span>) {
      <span class="hljs-built_in">Object</span>.defineProperty(<span class="hljs-built_in">this</span>.prototype, name, descriptor);
    }
  }
</code></pre>
<h2 id="heading-but-what-about-hyrums-law">But what about Hyrum's law?</h2>
<p>Lit dunder properties were never meant to be used. However, since they're observable, and usable, voilà.</p>
<p>Strongly typed, mature, compiled, object oriented programming languages like C++ or Java employ the use of <em>Access Modifiers</em>, offering developers the possibility to precisely define which members of a class can be <em>used</em> (depending on its type, you can read it, set it, execute it etc.). All you need is the following cheatsheet:</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1685479387436/4277783f-2ea7-46a6-9579-b951a6a5a6b2.png" alt="Access modifiers in Java" class="image--center mx-auto" /></p>
<p>Typescript uses access modifiers as presented before, but the concept is called <strong>Member Visibility</strong>, and the list is shorter, only three - private, protected, public - where <em>public</em> is the default and no sane person specifies it explicitly in code. There's no need for "default", as Typescript does not have such a strong notion as <em>packages</em> in C#/Java. Moreover, as stated in their docs,</p>
<blockquote>
<p>Like other aspects of TypeScript’s type system, private and protected are only enforced during type checking.</p>
</blockquote>
<p>Javascript itself didn't have any encapsulation, until recently. It's called <a target="_blank" href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Classes/Private_class_fields">Private class fields</a> and .. you guessed it, it allows you to explicitly prevent your consumers from directly accessing specified members of your class.</p>
<blockquote>
<p>Class fields are <a target="_blank" href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Classes/Public_class_fields">public</a> by default, but <strong>private class members</strong> can be created by using a hash <code>#</code> prefix. The privacy encapsulation of these class features is enforced by JavaScript itself.</p>
</blockquote>
<pre><code class="lang-javascript"><span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">ClassWithPrivate</span> </span>{
  #privateField;
  #privateFieldWithInitializer = <span class="hljs-number">42</span>;

  #privateMethod() {
    <span class="hljs-comment">// …</span>
  }

  <span class="hljs-keyword">static</span> #privateStaticField;
  <span class="hljs-keyword">static</span> #privateStaticFieldWithInitializer = <span class="hljs-number">42</span>;

  <span class="hljs-keyword">static</span> #privateStaticMethod() {
    <span class="hljs-comment">// …</span>
  }
}
</code></pre>
<p>The browser support is good, but not fabulous. The syntax is understood by Chrome &gt;= 74 (April 2019), Safari &gt;= 14.1 (April 2021), so if you want to go lower with supported clients, consider transpiling your production code using babel &gt;= 7.14 which enables the required plugins by default, or include them yourself in the transpiling configuration.</p>
<p>I've seen great enthusiasm throughout my team for adopting this level of encapsulation, despite adding one more concern (class member access) to the JavaScript developer; a developer previously spoiled with simplicity, but simplicity that may backfire on long-lived software. As they say in Google, <em>"Software engineering is programming integrated over time".</em></p>
]]></content:encoded></item><item><title><![CDATA[What are some obscure technologies you once learnt and don't expect to use them again]]></title><description><![CDATA[I start!
At my first (actual) job, I used Zope2, a Python framework that, for that version, was able to hold code and templates in its database. The database was not relational, but instead, a tree-like structure of objects, called ZODB - zope object...]]></description><link>https://mesimian.com/what-are-some-obscure-technologies-you-once-learnt-and-dont-expect-to-use-them-again</link><guid isPermaLink="true">https://mesimian.com/what-are-some-obscure-technologies-you-once-learnt-and-dont-expect-to-use-them-again</guid><category><![CDATA[Discuss]]></category><category><![CDATA[learning]]></category><category><![CDATA[programming languages]]></category><dc:creator><![CDATA[Mihnea Simian]]></dc:creator><pubDate>Wed, 24 May 2023 19:09:29 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1684954681790/1c1a4b85-1424-4042-ba45-78bb960ae455.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>I start!</p>
<p>At my first (actual) job, I used <a target="_blank" href="https://www.zope.dev/">Zope2</a>, a Python framework that, for that version, was able to hold code and templates in its database. The database was not relational, but instead, a tree-like structure of objects, called <a target="_blank" href="https://zodb.org/en/latest/">ZODB</a> - zope object database. I see both projects are actively maintained.</p>
<p>In a big tech I had to migrate some API clients that were written in Perl, while some template rendering was done in <a target="_blank" href="https://metacpan.org/pod/Mason">Mason</a>. What stuck with me, was that Mason scripts had some kind of delimitation of execution context; they had some kind of header that was being executed in a faster manner than the rest of the script. Can't remember much.</p>
<p>In spring 2022, I went through Primeagen's <a target="_blank" href="https://soliditylang.org/">Solidity</a> class on frontendmasters when I was doing "my research" on non-fungible tokens and blockchain tech. I don't see myself coming back to that language, but it did showcase a framework in which operations matter in terms of cost. Directly. In 2022 I also watched Richard Feldman's class on <a target="_blank" href="https://www.rust-lang.org/">Rust</a> - the way you could "cast" the life span (<em>lifetime</em>) of the allocated memory for a variable to an annotation (<em>'a</em>) - that, that stuck with me. Probably, on this list, Rust has the highest potential to find its way into my keystrokes again.</p>
<p>Reminding myself of computational cost and memory brings me back memories of all the obscure development environments I went through in my 4-year Computer Science Bsc - <a target="_blank" href="https://en.wikipedia.org/wiki/Assembly_language">Assembly</a> (mnemonic processor instructions), Matlab (actually <a target="_blank" href="https://octave.org/">Octave</a>, useful for running numerical algorithms that approximate or sample continuous signals), <a target="_blank" href="https://en.wikipedia.org/wiki/Verilog">Verilog</a> (simulating simple logical circuits or more advanced electronics, using static gates as well as clock based circuits). Then we have the other programming paradigms that we experimented in, as students: <a target="_blank" href="https://www.swi-prolog.org/features.html">Prolog</a> (solving the Wolf, Sheep And Cabbage Game), <a target="_blank" href="https://www.clipsrules.net/">Clips</a> and <a target="_blank" href="https://www.haskell.org/">Haskell</a> (functional programming).</p>
<p>Can you top it? :) What's your less-popular development experience?</p>
]]></content:encoded></item><item><title><![CDATA[Your last read before your next great idea of an app using OpenAI APIs]]></title><description><![CDATA[Sooner rather than later, you will face the fact that you'll want to experiment with building a project on top of open ai. Let's face it - we've all been sick of building Todo apps just for the sake of learning a new language or framework; and guess ...]]></description><link>https://mesimian.com/your-last-read-before-your-next-great-idea-of-an-app-using-openai-apis</link><guid isPermaLink="true">https://mesimian.com/your-last-read-before-your-next-great-idea-of-an-app-using-openai-apis</guid><category><![CDATA[design thinking]]></category><category><![CDATA[AI]]></category><category><![CDATA[openai]]></category><category><![CDATA[chatgpt]]></category><dc:creator><![CDATA[Mihnea Simian]]></dc:creator><pubDate>Sun, 07 May 2023 18:44:42 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1683484669980/6987f787-7046-41f1-a74f-6ce76995cc3d.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Sooner rather than later, you will face the fact that you'll want to experiment with building a project on top of open ai. Let's face it - we've all been sick of building Todo apps just for the sake of learning a new language or framework; and guess what, this time, not even a Hello World or a Todo-App will cut it! I'm going to provide you with a simple framework for coming up with a product idea if asked to build a project based on OpenAI's APIs.</p>
<p>As I was saying, this is a framework for brainstorming <strong>initial ideas</strong>. Don't rush me into theory on Product design. It's up to you to iterate on the ideas you will produce, by using Design Thinking and other techniques as such. You're free to start writing your business canvas.</p>
<p>But before experimenting and pivoting on a solution, you first need to find the problem to address. And that's why <em>"thinking of an idea of an app that does something"</em> just so you can practice or learn a new technology is so difficult: because <strong>rarely</strong> do we search for a market of customers, just because we have a certain technology at hand. It's like buying a fancy hammer, before knowing whether you'd have any bolts to hammer in.</p>
<h2 id="heading-offers-vs-ameliorates">Offers vs Ameliorates</h2>
<p>It comes down to understanding what the technology <em>offers</em> and what problems it <em>ameliorates</em>. It's a subtle difference, and it's easier to explain by using an example. If we look at Dall-E, it offers a way to generate images based on a natural language definition. But it can ameliorate a lot of needs, such as obtaining images based on a brief description, ready to be used, without the hassle of contracting and/or paying for a license. Maybe you're a magazine editor or a publisher looking for your next cool book cover. The cover of this article was generated by Dall-E using the prompt "a lightbulb surfing a wave".</p>
<p>Once we figured that out, we move on to synergies: yes, you guessed it, combining the technology advantage with your added value, if they're a good mix!</p>
<h2 id="heading-your-added-value">Your Added Value</h2>
<p>A good example of added value here is unique data. Something no other possesses. Do you have an encyclopedia you built on all possible water sprinklers ever produced? Do you have unique cooking recipes from your ancestors? Extensive documents of architecture in your organisation? All of these may be the subject of your next unique idea. It doesn't even need to be structured data, because that's something OpenAI can do for you. Just try to match your data with the technology <strong>offerings</strong> in order to list <strong>new problems</strong> your potential solution <strong>ameliorates</strong>.</p>
<h2 id="heading-water-with-a-drop-of-dish-soap">Water with a drop of dish soap</h2>
<p>When practising the steaming of the milk for latte art, using an espresso, a fairly good replacement for actual milk is water plus a drop of dish soap. Works like a charm fairly similar to milk.</p>
<p>You can do the same by looking for synthetic data or producing it yourself. And you can do that with GPT itself ;) I found this <a target="_blank" href="https://data.world/datafiniti/consumer-reviews-of-amazon-products">data set</a> on <a target="_blank" href="http://data.world">data.world</a> (under BY-NC-SA license by Datafiniti). It contains a bunch of customer reviews of their purchases - mainly Amazon hardware products, such as Kindle. I created a prompt where I asked for the topic to be changed to something that I needed the reviews to be about.</p>
<p>I.e., if we consider this real review of Kindle Paperwhite:</p>
<blockquote>
<p>Great for those that just want an e-reader I am enjoying it so far. Great for reading. Had the original Fire since 2012. The Fire used to make my eyes hurt if I read too long. Haven't experienced that with the Paperwhite yet.</p>
</blockquote>
<p>..when asked to change the topic to a <strong>restaurant</strong>, "text-davinci-003" model will return:</p>
<blockquote>
<p>Great for those that just want a meal I am enjoying it so far. Great for dining. Had the original restaurant since 2012. The restaurant used to make my stomach hurt if I ate too much. Haven't experienced that with this restaurant yet.</p>
</blockquote>
<p>The repo is <a target="_blank" href="https://github.com/mihneasim/synthetic-reviews">on my Github</a>; please pardon my clumsiness in Python and pandas - it's been a while (about 8 years since I last wrote some py; but not much has changed I see).</p>
<h2 id="heading-iterate">Iterate</h2>
<p>This. This is the part where you dive into Design thinking methodology; of course, if you want to go out there and build a service for actual users.<br />Otherwise, if you just want to try out your technology of choice, simply start prototyping your fresh idea.</p>
<p>How did you find your latest idea?</p>
]]></content:encoded></item><item><title><![CDATA[Cracked: Why Will's JavaScript The Hard Parts class is so efficient]]></title><description><![CDATA[I've watched Will Sentance's class JavaScript, The Hard Parts v2, and I liked it - without knowing who he is and how much experience he invested in teaching - I didn't only like it as a virtual participant, but especially as a lead and a trainer wann...]]></description><link>https://mesimian.com/cracked-why-wills-javascript-the-hard-parts-class-is-so-efficient</link><guid isPermaLink="true">https://mesimian.com/cracked-why-wills-javascript-the-hard-parts-class-is-so-efficient</guid><category><![CDATA[teaching]]></category><category><![CDATA[leadership]]></category><category><![CDATA[JavaScript]]></category><category><![CDATA[learning]]></category><dc:creator><![CDATA[Mihnea Simian]]></dc:creator><pubDate>Thu, 20 Apr 2023 18:21:05 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1682014571505/4139d1d9-9f2d-46a8-b196-9080a45a7902.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>I've watched Will Sentance's class JavaScript, The Hard Parts v2, and I liked it - without knowing who he is and how much experience he invested in teaching - I didn't only like it as a virtual participant, but especially as a lead and a trainer wannabe. I would like one day to be able to replicate, in my own style, of course, some of his strategies.</p>
<p>Will is CEO of <a target="_blank" href="https://www.codesmith.io">codesmith.io</a>, a <em>top-ranked coding school, online and in NYC</em>. That's the bit I didn't know about when I came up with the idea of documenting his class.</p>
<h2 id="heading-how-i-stumbled-upon-javascript-the-hard-parts-v2-class">How I stumbled upon JavaScript: The Hard Parts v2 class</h2>
<p>In my organisation, we dedicate about 1 day out of 10 sprint days for self-development; yes, that's during office hours, I'm not talking about moonlight coding - or at least that's the <em>deal on paper</em>. You probably heard of something similar taking place at Google, on Fridays - that's how Gmail was born. But here, we choose to invest it in the development of our craftsmanship. We're taking this study time in an organised fashion, in alignment with one's development plan. Otherwise, it would just sound like a day off to read online content.</p>
<p>As a Chapter Lead, I struggled to make my chapter take this seriously. Engineers have a greater incentive to perform to the goals of the tribe, so they often commit to the delivery for the entire sprint-time, rather than saving some for their own learning and development. Of course, it is a trap; in the long run, we're rotting as engineers, becoming blind to innovation opportunities and growth. Becoming better professionals would benefit the organisation, the projects, and the effectiveness of the delivery, as a whole.</p>
<p>To move the needle, I become more aggressive in decisions: I asked a colleague to pick a class on Frontend Masters (really, <em>any</em> class), by 5 pm the same day, or else I would make this choice for him. So I chose <a target="_blank" href="https://frontendmasters.com/courses/javascript-hard-parts-v2/">JavaScript: The Hard Parts, v2</a>. Since we're working a lot with web components, and we're converting business logic from AngularJs to Vanilla Js classes, it looked like we need strong JavaScript-skilled engineers with proper ownership of the fundamentals of the language. Not just frameworks.</p>
<p>And so, a couple of weeks later, my colleague returned to provide his thoughts. Bracing myself for harsh feedback on my choice of topic, I got particularly enthusiastic to hear that he considered the class <em>amazing</em>. <em>"We all use and think we know those things, but it helps to understand their underlying reasoning once again"</em>.</p>
<p>Just after Christmas of '22, I had some spare time and gave it a shot. I went through the class myself. The content - indeed, fundamentals of Js. But I was immensely impressed by the manner the class was built and delivered.</p>
<p>I studied Will, I decomposed his style, his setup, and his props, and I reverse-engineered his recipe to three key advantages:</p>
<ol>
<li><p>Distraction-free teaching "props"</p>
</li>
<li><p>Live audience - In-person participants</p>
</li>
<li><p>Smart use of creativity</p>
</li>
</ol>
<h2 id="heading-distraction-free-teaching-props">Distraction-free teaching props</h2>
<p>Will is using a blackboard and white or colourful markers. He's not employing any digital means. He's not typing code, he's writing it, by hand. The representations limit themselves to basics: global scope, local scope, and execution stack. When needed, a slide with code pops up.</p>
<h2 id="heading-live-audience-in-person-participants">Live audience - In-person participants</h2>
<p>Will is not recording himself teaching the class to a camera, or to a virtual participant. He has actual participants sitting and learning physically in the same room. They don't appear in the footage, maybe just rarely when one is "called to the blackboard". You get to be an actual spectator to the learning activities taking part between Will and his trainees. I've seen this before and it's highly beneficial:</p>
<ul>
<li><p>you get a sense of what is expected to understand or to have trouble with, in each moment, because the real people in the class will articulate that. You will <em>feel</em> what they feel. You will share their silence when some concept needs time <em>to sink in</em>.</p>
</li>
<li><p>it's auto-paced by the audience. The trainer will adjust speed and level according to a tight, real-time feedback loop with the audience. Will stops after every milestone, to ask how much they understand:</p>
<ul>
<li><p>thumb up = I got it, move on</p>
</li>
<li><p>thumb down = I don't get it</p>
</li>
<li><p>horizontal thumb = I need to ask a question</p>
</li>
</ul>
</li>
</ul>
<p>I said I saw this before - ages ago when I started learning German, I ran into the so-called <a target="_blank" href="https://www.youtube.com/watch?v=U9Xh-by50pI">Michel Thomas Method</a> which, besides many other techniques specific to foreign language learning, also leverages the power of having actual people participate in the act of teaching together with the trainer, while the class is being recorded for a much larger, remote, audience.</p>
<h2 id="heading-smart-use-of-creativity">Smart use of creativity</h2>
<p>Many engineers display passion, but it takes skill and creativity to convey it in a <em>catchy</em> manner, in a phrasing that <em>sticks</em>. It takes some degree of creativity and lateral thinking to portray a JavaScript closure as <em>a backpack</em> that gets carried by a function that's returned as a value.</p>
<h2 id="heading-teaching-styles-are-different">Teaching styles are different,</h2>
<p>But some stand out. And by no accident, with solid experience in his backpack, Will Sentance is a model for the teacher in me. I wouldn't rush out the door, into buying and installing a blackboard. It's not about techniques one can copy. It's about having the act of teaching in the centre, with a spotlight on the main actor - the trainee, not the trainer. Whenever you're building a new product, all decisions revolve around the potential customer. If you look at teaching as a product, then yes, you have to put the participants first, preferably in person, in the same room with you.</p>
]]></content:encoded></item><item><title><![CDATA[I've led a Frontend Chapter for three years and this is the idea I'm most proud of]]></title><description><![CDATA[A chapter is very much different from a squad or a delivery team, especially when it comes to collaboration channels and time spent together.
Let's see how each type of team has the privilege of a collaboration scene:




SquadChapter



Agile Ceremo...]]></description><link>https://mesimian.com/ive-led-a-frontend-chapter-for-three-years-and-this-is-the-idea-im-most-proud-of</link><guid isPermaLink="true">https://mesimian.com/ive-led-a-frontend-chapter-for-three-years-and-this-is-the-idea-im-most-proud-of</guid><category><![CDATA[management]]></category><category><![CDATA[engineering-management]]></category><category><![CDATA[organization]]></category><category><![CDATA[chapter lead]]></category><category><![CDATA[tribal model]]></category><dc:creator><![CDATA[Mihnea Simian]]></dc:creator><pubDate>Sun, 09 Apr 2023 13:31:52 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1681047015985/b82e9172-d1ac-496c-a7d9-92b586a5ab64.webp" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>A chapter is very much different from a squad or a delivery team, especially when it comes to collaboration channels and time spent together.</p>
<p>Let's see how each type of team has the privilege of a collaboration scene:</p>
<div class="hn-table">
<table>
<thead>
<tr>
<td>Squad</td><td>Chapter</td></tr>
</thead>
<tbody>
<tr>
<td>Agile Ceremonies</td><td>Repositories and Projects</td></tr>
<tr>
<td>Backlog</td><td>Working Guidelines</td></tr>
<tr>
<td>Product Owner</td><td>Technology</td></tr>
<tr>
<td>(Production) Incidents</td><td>CI/CD procedures</td></tr>
</tbody>
</table>
</div><p>If we take a two-week sprint, the squad has a net advantage on time spent together: 1-hour planning + 2h grooming(s) + 1h retrospective we get 4h, not to mention the daily stand-ups, 10 x 10mins equaling almost another 1 hour and a half.</p>
<p>The chapter has its chapter meeting which can be weekly or once per sprint .. and, that's it. I needed to address two issues the chapter faced in the tribal model, that few talk about:</p>
<ol>
<li><p><strong>The chapter is disadvantaged on time spent together.</strong> It can never compare to the time spent in the squad. The squad takes first place in the hearts of the people. It's hard to compete with people striving together in the same sprints, the same backlog, and that get to hear one another every. single. day.</p>
</li>
<li><p><strong>When domains of ownership fall short in between squads, the Chapter (Lead) is the one all people reach for.</strong> I've seen it too many times - the Chapter Lead becomes a proxy for any chapter inquiries from other areas.</p>
</li>
</ol>
<p>I felt there was room for something that can address both, so I created a public, free-to-attend, 2-hour weekly meeting with all frontends, having them work in one big room, which I called <strong>Frontend Open Office Hours</strong>. When we transitioned to hybrid work (read "remote work"), we switched to an online Teams get-together meeting which proved to be well-suited for code sharing and live peer programming with an audience.</p>
<p>As I much later read about it, in "An Elegant Puzzle" by Will Larson, one of the time thieves, interruptions, can be fought with</p>
<blockquote>
<p>"A strategy here is to funnel interruptions into an increasingly small area, and then automate that area as much as possible."</p>
</blockquote>
<p>Yes, he was referring to cookbooks, opening request tickets and such, but this weekly meeting was my way of funnelling questions.<br />To make it successful, you need to tick the following boxes:</p>
<ul>
<li><p>make it accessible to <strong>anyone</strong> in your organisation. I organised the meeting under a public Teams channel, and the chat is also visible to anyone.</p>
</li>
<li><p>invite other people to join, but <strong>don't push the meeting into their calendars</strong>. Simply advertise it every time they have a question - "Why don't you come by during our Open Office Hours? And ask us there, I bet my colleagues can help you even better". Make it grow organically. People will talk about your Open Office hours!</p>
</li>
<li><p>invite your chapter to bring up questions or impediments in their work. Create the necessary psychological safety to ask <em>any questions</em>.</p>
</li>
</ul>
<p>This is the <em>exact</em> wording of our Open Office Hours, which runs weekly, on Wednesdays, from 3 to 5 pm.</p>
<blockquote>
<p>Weekly, during this interval, the Frontend One chapter is available to all colleagues, in this Teams call, to answer any frontend-related questions. Best to send us your questions beforehand, but we also welcome spontaneous walk-ins. If there are no questions from guests, we'll just mind our own business and share our project-related issues during the call. You are nevertheless welcome to attend, Thank you, Mihnea</p>
</blockquote>
<p><img src="https://dev-to-uploads.s3.amazonaws.com/uploads/articles/xd4k6qg8v7b8xmbomnbp.png" alt="Frontend Open Office Hours Chapter meeting ad" /></p>
<p>Things I observed after running it for so long:</p>
<ul>
<li><p>don't expect too many visitors. People will get very excited that they too can join this get-together of developers, and that they can ask any questions - but they won't :) We're all so very busy with our work; at least there's no slack for that in my org.</p>
</li>
<li><p>some open-hours will be crazy short. It's not a problem, some weeks are dull, and others are more eventful</p>
</li>
<li><p>other times people will take the opportunity to chit-chat. Let them be; people need rapport, especially when working with remote teams.</p>
</li>
<li><p>take the opportunity to spice up the series with interesting talks and showcases. Show them interesting cutscenes of online classes, or short conference talks on youtube. Show them <a target="_blank" href="https://www.destroyallsoftware.com/talks/wat">the Wat talk</a>. Have fun as a team!</p>
</li>
<li><p>everyone in the organization will talk positively about the transparency and collaboration of your chapter. Great teams are teams that make room to help others.</p>
</li>
</ul>
<p>If you lead a chapter, let me know how else you encourage efficient collaboration and transparency. If you're not doing it already, would you dare create a recurrent call for Open Office Hours and advertise it to the other chapters?</p>
]]></content:encoded></item><item><title><![CDATA[Accessibility 101]]></title><description><![CDATA[I spent about 10-15 hours on edx's online course on Introduction to Web Accessibility, authored by W3Cx, which seems to be a collection of courses straight from the people in W3C (in W3C's WAI for this one, to be more precise).
I'm writing this so yo...]]></description><link>https://mesimian.com/accessibility-101</link><guid isPermaLink="true">https://mesimian.com/accessibility-101</guid><category><![CDATA[a11y]]></category><category><![CDATA[Accessibility]]></category><category><![CDATA[Frontend Development]]></category><category><![CDATA[Design]]></category><category><![CDATA[Product Design]]></category><dc:creator><![CDATA[Mihnea Simian]]></dc:creator><pubDate>Thu, 06 Apr 2023 18:13:51 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1680804534200/322da26b-2c8f-4d24-912c-95f453d86f92.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>I spent about 10-15 hours on edx's <a target="_blank" href="https://learning.edx.org/course/course-v1:W3Cx+WAI0.1x+3T2019/home">online course</a> on <em>Introduction to Web Accessibility</em>, authored by W3Cx, which seems to be a collection of courses straight from the people in W3C (in W3C's <a target="_blank" href="https://www.w3.org/WAI/">WAI</a> for this one, to be more precise).</p>
<p>I'm writing this so you don't have to spend the same amount of time on the course; although if you care about the Web and its fundamental principles, I strongly encourage you to do so. It's free and it's enlightening.</p>
<p>My prior knowledge of Accessibility, before attending this course:</p>
<ul>
<li><p>there are contrast thresholds readable text should meet</p>
</li>
<li><p>use descriptive <code>alt</code> attribute for images</p>
</li>
<li><p>use appropriate css units for sizing font (<code>em</code>)</p>
</li>
<li><p>one should be able to browse a website or use a web app without a pointing device (keyboard only)</p>
</li>
<li><p>something with <code>aria</code></p>
</li>
<li><p>some online evaluation tools can score the accessibility of your website</p>
</li>
<li><p>a11y is the <a target="_blank" href="https://en.wikipedia.org/wiki/Numeronym">numeronym</a> for accessibility</p>
</li>
</ul>
<p>And that was it.</p>
<p>What I was looking for:</p>
<ol>
<li><p>Theory, but in a practical approach. The school was cool, but we need real-life usable stuff shipped</p>
</li>
<li><p>Structure</p>
</li>
<li><p>Fundamentals on which to build upon - not just <em>tips and tricks</em></p>
</li>
</ol>
<h2 id="heading-theory">Theory</h2>
<p>All great stories start with a history lesson, and accessibility makes no exception.</p>
<blockquote>
<p>The power of the Web is in its universality. Access by everyone regardless of disability is an essential aspect said Tim Berners-Lee, W3C Director and inventor of the World Wide Web.</p>
</blockquote>
<p>And because we're greedy and hungry for the greatest, the fastest, the bestest ways to grow a business, policies and laws were required to come in place and protect <strong>people</strong>. People are imperfect - we don't see, hear, move, or infer with the same acuity, and most often than not, not because of their own fault; not that it would matter. People are people, and in the society we want to live in, we ought to use technology in the <em>interest of all human beings</em>. Not just the young, the sharp, the healthy, the genetically lucky ones, the ones privileged in society. Let's remove the word <em>privileged</em> as much as we can.</p>
<p>The course is not intentionally sentimental, but it does showcase people with all sorts of disabilities. You will step into the shoes of disadvantaged people. You will become emotional, realising how lucky you most probably are. Statistically, there's an 85% chance you have all your senses and your motor function in good shape to browse and to read and understand the content on, say, this Hashnode blog. Some people would have to use a keyboard with the aid of a stick in their mouth to get here.</p>
<p>WCAG - Web Content Accessibility Guidelines version 2.1 is what you're aiming to adhere to when offering your services on the web. I like how the course is spot on from the start: <em>Don't jump to the standard</em>. Half of it explains how the other half should be read. It's a show-stopper. Instead, the course introduces a less scary approach. And provides structure.</p>
<h2 id="heading-structure">Structure</h2>
<p>There are two types of approaches people use to improve the way they interact with technology:</p>
<ol>
<li><p>Through the means of <em>assistive technologies</em>, meaning software or hardware that helps people more easily operate. I.e. a screen reader, a switch control, or even ordinary glasses!</p>
</li>
<li><p>By employing <em>adaptive strategies</em> such as enlarging font size, changing contrast or resizing a window. Some people need to enlarge the font and window width, others, surprisingly, read better when the text is smaller and the line length is much shorter.</p>
</li>
</ol>
<p>The second module of the course focuses on these two, grouped by the types of disabilities: physical and visual, hearing and speech, cognition and learning.</p>
<p>The third module is all about business cases and benefits; probably the dullest, at least for me. Accessibility needs no business case, but in case you need some, they can be easily found.</p>
<p>The fourth module is the real deal, diving into <em>WCAG 2.1</em> fundamentals.</p>
<p>And the fifth is just as dull as the third. It's how to lure the important stakeholders in the organisation into accessibility. How to <em>get started</em>. I'm not sure one can make a real-life working guide on that, but I should however appreciate the <em>Shift-left</em> recommendation. I'm seriously starting to laugh every time I hear <em>shift-left</em>. So much shifting that one starts to wonder what's left on the <em>right-side</em> of the delivery, but that's for another story.</p>
<p>The key takeaway on the shifting is probably that particularly the persons involved at the start of the product design process (product designers, UX architects, project managers) <strong>need</strong> to have a working literacy on Accessibility, so issues are addressed earlier in the process. Don't leave Accessibility for the last week before the first MVP go-live.</p>
<h2 id="heading-fundamentals">Fundamentals</h2>
<p>W3C WAI contributes with not one, but three guidelines:</p>
<ol>
<li><p>WCAG - Web Content Accessibility Guidelines; the most popular ones, regarding Web Content.</p>
</li>
<li><p>ATAG - Authoring Tool Accessibility Guidelines; guidance in building accessible software used by content creators. Imagine the admin panel of a blogging platform. Or the "Create a Post" page of a social network.</p>
</li>
<li><p>UAAG - User Agent Accessibility Guidelines - for browsers, media players and other user agents.</p>
</li>
</ol>
<p>WCAG defines four principles:</p>
<ol>
<li><p><strong>Perceivable</strong> - techniques for making information available in different ways.</p>
</li>
<li><p><strong>Operable</strong> - In addition to perceiving info, users should be able to operate, navigate, fill in and submit forms, and have some sort of interactivity with the application; to do so, they might employ a mouse, or no mouse at all and stick to keyboard only, sip and puff, speech input; yes, some people are limited to simple switches because of their lack of mobility and their difficulty in speaking.</p>
</li>
<li><p><strong>Understandable</strong> - both information and functionality; use simple vocabulary, make intentions clear, and be explicit on what is required and in which form. Don't make the user think or guess what is expected on his/her side.</p>
</li>
<li><p><strong>Robust</strong> - Reliability when rendering the content or running the application on a variety of platforms. If it's web content or an app, it should run without issues in any present or future version of a major browser. If it's multimedia content, we should expect to behave the same on multiple players.</p>
</li>
</ol>
<h3 id="heading-technical-dive-in">Technical dive-in</h3>
<p>On a scale of 1 to 5 on technical expertise, you need a 2, but it's not a hard requirement to follow through. The course only scratches the surface, for both web content and mobile apps - iOS and Android.</p>
<p>You will need some tiny knowledge of HTML and to be able to grasp basic native UI elements, like backward and forward navigation, gestures and haptic. That's it. The material <em>is not designed</em> for engineers. It's universal.</p>
<h2 id="heading-key-takeaways">Key takeaways</h2>
<p><strong>Accessibility</strong> is important for anyone who cares <strong>about people</strong>, before any policy or checkbox that we need to tick off, in our large business or for our small project. Following accessibility guidelines never stops, it's not a one-time process. It needs to be embedded in the design and delivery process. The sooner, the better, the cheaper. Just like you strive to do with your other non-functional requirements.</p>
<p>You only truly know your accessibility makes a difference when testing with <strong>real people</strong>. Evaluation tools can mislead. Ask for feedback from people having trouble using technology, older people, your grandparents; reach out to organisations for people with disabilities. I bet they can't wait to help with feedback.</p>
<p>Thank you for reading, and keep caring!</p>
]]></content:encoded></item><item><title><![CDATA[How my Frontend skills helped me pass a sailing exam]]></title><description><![CDATA[In 2022 I decided to pick up sailing classes and get the skipper license, for leisure sailing, and little have I known that engineering skills would help me get the permit more easily. Let's dive in!
In my country, the exam has two parts: a "road" te...]]></description><link>https://mesimian.com/how-my-frontend-skills-helped-me-pass-a-sailing-exam</link><guid isPermaLink="true">https://mesimian.com/how-my-frontend-skills-helped-me-pass-a-sailing-exam</guid><category><![CDATA[Frontend Development]]></category><category><![CDATA[Web Components]]></category><category><![CDATA[frontend]]></category><category><![CDATA[Open Source]]></category><category><![CDATA[lit]]></category><dc:creator><![CDATA[Mihnea Simian]]></dc:creator><pubDate>Mon, 13 Mar 2023 12:50:59 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1678711725571/a5eab539-692e-46a1-86d7-2c06d2355a3c.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>In 2022 I decided to pick up sailing classes and get the skipper license, for leisure sailing, and little have I known that engineering skills would help me get the permit more easily. Let's dive in!</p>
<p>In my country, the exam has two parts: a "road" test on the sea and a written examination, a lot like the one for the driving licence - it's composed out of 26 multiple-choice questions. For each question, there are three answer choices, one and only one is correct. The authorities were kind enough to offer for free download a large batch of sample questions. However, all the data is presented in a big big table spread in a multi-page PDF file. Which looks like this, and goes on for 20-30 pages:</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1678710868854/a26f839e-ebbd-4f3e-99cc-64c081606de5.png" alt class="image--center mx-auto" /></p>
<p>Each line in the table represents a question. Then, each column represents an answer choice, each choice followed by another column - with values 0 or 1, whether the choice is correct or not. Luckily, I managed to take all that data by using the Preview app in MacOS - I simply Selected All -&gt; Copy -&gt; Paste (in vim or any other text editor), and I was able to make some sense of the data.</p>
<p>I did so by writing a nodejs script that would create an Array of meaningful objects. Typescript types are simple enough to use them in order to demonstrate my modelling:</p>
<pre><code class="lang-typescript"><span class="hljs-keyword">type</span> Answer = {
    text: <span class="hljs-built_in">string</span>,
    correct: <span class="hljs-built_in">boolean</span>
}
<span class="hljs-keyword">type</span> Choices = [Answer, Answer, Answer]

<span class="hljs-keyword">type</span> Question = {
    text: <span class="hljs-built_in">string</span>,
    answers: Choices
}

<span class="hljs-comment">// some sample data</span>
<span class="hljs-comment">// only for the sake of the example</span>
<span class="hljs-keyword">const</span> answers : Choices = [
  {text: <span class="hljs-string">'fine'</span>, correct: <span class="hljs-literal">false</span>},
  {text: <span class="hljs-string">'awesome'</span>, correct: <span class="hljs-literal">true</span>},
  {text: <span class="hljs-string">'great'</span>, correct: <span class="hljs-literal">false</span>}
];

<span class="hljs-keyword">const</span> question : Question = {text: <span class="hljs-string">'how are you'</span>, answers}
</code></pre>
<p>It looks fancy in Typescript, but honestly, I simply wrote a <a target="_blank" href="https://github.com/mihneasim/sailing-exam-questionnaire/blob/main/to-json.js">node script</a> to dump it all in a big JSON file and get the job done. I believe <strong>proper domain modelling is key</strong> to a successful system - whatever engineering you'd be doing.</p>
<p>Nice. We have data with meaning. Now let's create the presentation layer (aka the UI!) and then let's add interactivity to the UI, so we can have feedback when actually simulating an exam (aka the Frontend!). Since in ING we are advocates of Web Components, I always wanted to give this stack a try for side projects. I jumped right into <a target="_blank" href="http://open-wc.org">open-wc.org</a> and used the npm generator. Everything worked precisely as expected. It was a breeze since my Chapter is using lit every. single. day. So I could finally get some mileage myself, in writing lit. At work, as a Chapter Lead, I prefer to spend my time more effectively for the team, rather than coding new features by myself; my chapter does it better anyway (#proud).</p>
<p>You can take a look at the <a target="_blank" href="http://mesimian.com/anr/simulator/">simulator here</a>. There are also quick deployments for each topic - <a target="_blank" href="http://mesimian.com/anr/marinarie/">seamanship</a>, <a target="_blank" href="http://mesimian.com/anr/navigatie/">navigation</a>, <a target="_blank" href="http://mesimian.com/anr/manevra/">maneuver</a>, <a target="_blank" href="http://mesimian.com/anr/colreg/">COLREG</a>, <a target="_blank" href="http://mesimian.com/anr/rnd/">RND - fresh water regulations</a>. Caution: all texts are in Romanian since the data source is in Romanian anyway. But you get the gist.</p>
<h2 id="heading-what-i-saved-for-later-read-never">What I saved for later (read: never)</h2>
<p>Things I skipped on purpose, because #shipping:</p>
<ul>
<li><p>unit testing</p>
</li>
<li><p>styling</p>
</li>
<li><p>creating a proper API, rather than big bulky json-s sent to the client</p>
</li>
</ul>
<p>It's funny cause when I put a screenshot in here, my design looks like a big billboard ad 🤭</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1678711198783/85dcfd15-7e6a-4a9c-8734-ede4e8b33771.jpeg" alt class="image--center mx-auto" /></p>
<h2 id="heading-no-compromise-on">No compromise on</h2>
<p>Things I did not want to skip, no-matter-what:</p>
<ul>
<li><p>create a minimum viable product, have it <strong>attain its purpose</strong>: helping people learn for the test (d'oh!)</p>
</li>
<li><p>deploy it on a webserver and <strong>share it</strong> with my awesome sailing class colleagues</p>
</li>
<li><p>make it Open Source on <a target="_blank" href="https://github.com/mihneasim/sailing-exam-questionnaire/">github</a>. However, you have to download the full PDFs and run the data conversion yourself. I did not want to include that in the project for a couple of reasons:</p>
<ol>
<li><p>it's not my data, I do not have a license to distribute it. Best I could do is package it differently and use it as a support for a free, non-commercial web-app.</p>
</li>
<li><p>hey, data may change anyway</p>
</li>
</ol>
</li>
<li><p>sharing this diary page with you 🤗. I didn't want to skip that.</p>
</li>
</ul>
<p><strong>When did your engineering skills help you get through with something totally unrelated?</strong></p>
]]></content:encoded></item></channel></rss>