<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Fagner Brack</title>
    <description>The latest articles on DEV Community by Fagner Brack (@fagnerbrack).</description>
    <link>https://dev.to/fagnerbrack</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F122%2F835857.jpeg</url>
      <title>DEV Community: Fagner Brack</title>
      <link>https://dev.to/fagnerbrack</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/fagnerbrack"/>
    <language>en</language>
    <item>
      <title>The US$4000 JavaScript Interview Question Nobody Could Answer</title>
      <dc:creator>Fagner Brack</dc:creator>
      <pubDate>Thu, 15 Jun 2023 22:07:27 +0000</pubDate>
      <link>https://dev.to/fagnerbrack/the-us4000-javascript-interview-question-nobody-could-answer-bck</link>
      <guid>https://dev.to/fagnerbrack/the-us4000-javascript-interview-question-nobody-could-answer-bck</guid>
      <description>&lt;p&gt;Imagine being presented with a challenge that could seriously make you earn 0.1 Bitcoin (roughly US$4000 at current rates) for simply answering a JavaScript interview question. A wave of enthusiasm rushes through you until you read the question:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;“From ES5 to ES6, was there any one website that would break due to the language update? If yes, which code?”&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;It wasn't a joke, and I actually had the money ready to transfer.&lt;/p&gt;

&lt;h3&gt;
  
  
  Fagner Brack on Twitter: "I've been giving hints in multiple places I posted this so people are starting to get closer to the actual answer so the 0.1BTC offer is over as that was only for those who could come up with the answer without hints, now it's easier knowing the wrong answers. / Twitter"
&lt;/h3&gt;

&lt;p&gt;I've been giving hints in multiple places I posted this so people are starting to get closer to the actual answer so the 0.1BTC offer is over as that was only for those who could come up with the answer without hints, now it's easier knowing the wrong answers.&lt;/p&gt;

&lt;p&gt;But here’s the catch: the question was never about a binary yes or no response. As an interview question, it was designed to be seen through the lens of tech interviews for business application development, their underlying purpose and their value to the organization.&lt;/p&gt;

&lt;p&gt;And so, to much surprise, the correct answer is:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;It doesn’t matter&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The second question is moot.&lt;/p&gt;

&lt;h4&gt;
  
  
  Here’s why:
&lt;/h4&gt;

&lt;p&gt;Interviews are supposed to hire new devs who can add more value to the organization. Better yet if they know more than the person interviewing them, that's what allows the organization to grow instead of becoming more of the same. Tech interviews, therefore, should focus on identifying developers who can proficiently code and design software, irrespective of the language, with perspectives that can add more value so the team grows. Instead, most interviews out there favour those who invest their time in learning programming niche specifics that play against real-world scenarios.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Imagine being a carpenter; you should be proficient in the techniques of building a house, not fixated on the brand of the hammer.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Using obscure JavaScript features in a way they could break when transitioning from older to newer language versions is an indication that the domain is too coupled to the language and there's a skill gap in software engineering expertise. The whole premise of the question, in the context of an interview, is misguided.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Unless you’re hiring for a cook, don't set up your questions to embrace those who can make more spaghetti.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  What We Learn from The Answers
&lt;/h3&gt;

&lt;p&gt;A series of insightful "great wrong answers" came up during this challenge, and they serve a valuable point. Typically, programming language designers would make breaking changes affecting code rarely used, usually when your domain models are coupled to the programming language.&lt;/p&gt;

&lt;p&gt;In the context of an interview, the knowledge that breaking changes exist is fundamental, the specifics are not as it's easy for anyone to spend 5 minutes googling them or looking at the language spec. However, the correct answer is to design systems at the correct level of abstraction, ensuring that such a problem wouldn’t arise. The correct answer is to ensure that a programming language update wouldn’t affect your code by writing simple, long-lasting code designed around Domain Models.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Probably this company is not for me"&lt;/p&gt;

&lt;p&gt;— One the answers that came the closest&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;For example, take the code below. It's coupled to the programing language Literals and would fail while trying to group based on a prop called 'toString', so it requires crazy hops to fix like the use of Object.prototype.call internally or TypeScript interfaces to limit the prop lookup:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const groupBy = &amp;lt;T extends AnyDomainInterfaceInThisCaseCartItem&amp;gt;(
  cartItems: T[],
  prop: keyof T
): Record&amp;lt;string, T[]&amp;gt; =&amp;gt; {
  ...
};
const cart = groupBy(cartItems, prop);
storage.save(cart);
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Instead, a decoupled design would be more domain-specific like this (in an object-based paradigm):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const cart = ShoppingCart(config);
cart.addItem(cartItem);
storage.save(cart);
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Or this (in an immutable functional-based paradigm), using the principles of state = fn(command, state):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;cart = execute(addToCart, cart);
storage.save(cart);
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;&lt;em&gt;NOTE:&lt;/em&gt;&lt;/strong&gt; &lt;em&gt;The examples above are NOT extensive, there are many ways to decouple Domain Models from the language, but those are just two out of many possible ways of doing this for the domain of e-commerce; there are tradeoffs on each approach. Regardless, the Domain Models will evolve over time and the final result tends to be much more specific than my examples, depending on which "kind" of e-commerce subdomain you're operating on. That's why many frameworks don't work together with Domain Models, they lock your code to the framework's domain, not your application's domain.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;In the examples above, can you see how the "groupBy" function has absolutely NO domain information other than variable names? The encapsulated function is too generic, designed for general reusability (&lt;a href="https://gordonc.bearblog.dev/dry-most-over-rated-programming-principle/"&gt;excessive DRY&lt;/a&gt;), and relies upon primitives (&lt;a href="https://refactoring.guru/smells/primitive-obsession"&gt;Primitive Obsession&lt;/a&gt;) as the function is coupled to an ArrayLiteral of ObjectLiteral, (Array[] for short). None of that has any meaning whatsoever in the context of e-commerce, only for those who contribute to an Open Source library like Lodash. In the context of application development, the model is too generic; it has no value.&lt;/p&gt;

&lt;p&gt;Ironically, those who provide complex interview answers or delve into very cryptic, underground knowledge about the language are often those who perform poorly in overall software engineering; yet, they're easier to get hired because the market is optimized for &lt;a href="https://fagnerbrack.com/the-senior-trendystuff-engineer-db98a5c5a50f"&gt;{TrendyStuff} roles&lt;/a&gt;. They focus excessively on language, frameworks, or technology, failing to comprehend that these elements constantly evolve and code that is coupled to them is a liability.&lt;/p&gt;

&lt;p&gt;As an interviewer, when you interview based on such grounds, you end up hiring people who think the same way, fostering groupthink, hindering innovation, and preventing the dissemination of knowledge of software design. Ultimately leading to a higher-than-necessary cost of development.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Hiring based on technology skills foster groupthink, hinder innovation, and prevent dissemination of software design knowledge.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This is the reason why most companies struggle to hire someone better than their existing workforce: they will test candidates against what they believe to be valuable, even if one can just google or write a test to check how the code works; not against an actual domain scenario.&lt;/p&gt;

&lt;p&gt;It eventually leads to layoffs, which is a reaction of organizations to the constant production of low-value software and infinite rewrite cycles. The irony is palpable when software engineers who have experience with Domain Modeling and software design fail an interview crafted by programmers who don't understand any of that. That happens even when those interviewers bear the title of Senior or Principal/Staff Engineers, which happens more often than not.&lt;/p&gt;

&lt;h4&gt;
  
  
  What can we learn from all this?
&lt;/h4&gt;

&lt;p&gt;So, as we look back at this exciting challenge, it’s clear that the real lesson lies not in knowing the intricacies of JavaScript’s evolution. It is in understanding what truly matters when it comes to hiring staff for the purpose to build competent, successful, adaptable and innovative software engineering teams. Those are things most people don't know how to do, as proven by the many attempts to answer this question in the context of the JavaScript language.&lt;/p&gt;

&lt;p&gt;Just like some devs lost the opportunity to win US$4000 here, organizations are missing the opportunity to turn millions due to their outdated tech interviewing practices.&lt;/p&gt;

&lt;p&gt;So here's one variation for a great answer to the original question:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;It doesn't matter.&lt;/p&gt;

&lt;p&gt;If the code breaks after an ES update it will probably break after a framework or library update and it will be hard to fix; depending on how coupled things are, we may have to rewrite the whole application. That also means the code is too smart and doesn't provide real-life value to the organization.&lt;/p&gt;

&lt;p&gt;I would design the code in such a way the domain is not coupled to the programming language, frameworks, libraries, etc. Therefore, updates or specific language/framework/libraries idiosyncrasies are NOT likely to break my code. In the rare cases where it does, the domain is encapsulated so third party code is easy to fix.&lt;/p&gt;

&lt;p&gt;Also, you might be able to easily hire programmers from other programming language communities who can perform with minimal quality impact, as long as they understand the fundamentals, patterns and paradigms of software engineering and domain modeling.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;THAT&lt;/strong&gt; is the answer.&lt;/p&gt;

&lt;p&gt;Domain Modeling skills for application development (such as Domain-Driven Design), obliterate the need for engineers to learn 90% of the features of any programming language or framework. In that context, interviews about the language make absolutely no sense. If the intention is to assess whether the engineer will perform in the organization technically, the question is wrong. They should assess basic patterns of the core paradigms, not cryptic underground language syntax puzzles.&lt;/p&gt;

&lt;p&gt;That's why tools like &lt;a href="https://www.hackerrank.com/request-demo-search/"&gt;HackerRank&lt;/a&gt; are the worst thing to ever happen in modern times to the software engineering industry.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;The right answer, in the context of qualifying a developer against application development experience, is to change the question…&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;… because after all, &lt;a href="https://fagnerbrack.com/the-problem-you-solve-is-more-important-than-the-code-you-write-d0e5493132c6"&gt;The Problem You Solve Is More Important Than The Code You Write&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Unfortunately, we all know other fellow programmers interviewing that person will lack the skills to understand the whole premise of the answer, which is to create software that has &lt;strong&gt;BUSINESS VALUE&lt;/strong&gt;. The interviewer will fail the interviewee probably for being scared of the unexpected answer, even if they have the ability to adapt to a less-than-ideal scenario.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;If an organization knows how to engineer good software, the only outcome for the interviewee should be: Congratulations, you passed!&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Unfortunately, those organizations (including teams within big ones) are very rare. I have been fortunate enough to work with a few of them in my career.&lt;/p&gt;

&lt;p&gt;And you, what was your experience in tech interviews?&lt;/p&gt;

&lt;p&gt;If you know an organization that would be friendly to valuable software development without forcing good engineers into a management role, I'm open to work. Get in touch with me via &lt;a href="https://www.linkedin.com/in/fagnerbrack/"&gt;LinkedIn&lt;/a&gt;!&lt;/p&gt;

&lt;p&gt;In the meantime, happy tech interviewing!&lt;/p&gt;

&lt;p&gt;Thanks to &lt;a href="https://www.linkedin.com/in/igorjosesantos/"&gt;Igor J. Santos&lt;/a&gt; for their insightful input on this post.&lt;/p&gt;

&lt;p&gt;Thanks for reading. If you have feedback, contact me on &lt;a href="https://twitter.com/FagnerBrack"&gt;Twitter&lt;/a&gt;, &lt;a href="https://www.linkedin.com/in/fagnerbrack/"&gt;LinkedIn&lt;/a&gt; or &lt;a href="http://github.com/FagnerMartinsBrack"&gt;Github&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>programming</category>
      <category>javascriptdevelopmen</category>
      <category>webdev</category>
      <category>softwareengineering</category>
    </item>
    <item>
      <title>I Made 7 Predictions For The Web For The Next 5 Years</title>
      <dc:creator>Fagner Brack</dc:creator>
      <pubDate>Thu, 01 Jun 2023 22:01:42 +0000</pubDate>
      <link>https://dev.to/fagnerbrack/i-made-7-predictions-for-the-web-for-the-next-5-years-2b8e</link>
      <guid>https://dev.to/fagnerbrack/i-made-7-predictions-for-the-web-for-the-next-5-years-2b8e</guid>
      <description>&lt;h4&gt;
  
  
  Now 7 Years Later, Here’s What Happened.
&lt;/h4&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--k8kFlqjT--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn-images-1.medium.com/max/1024/1%2AkXWhQwoIm7a_aqmBXGmH0w.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--k8kFlqjT--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn-images-1.medium.com/max/1024/1%2AkXWhQwoIm7a_aqmBXGmH0w.png" alt="" width="800" height="382"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Google Trends "oracle" search term, it seems like I'm becoming less relevant Worldwide.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;There’s nothing more stupid than trying to make predictions. Humans are very bad at it, and speaking to myself in the third person at least allows me to make fun of my own stupidity without feeling bad.&lt;/p&gt;

&lt;p&gt;There's this illusion Venture Capitalists and Angel Investors have it all figured out; it turns out the rate of success of their predictions is &lt;a href="https://techcrunch.com/2017/06/01/the-meeting-that-showed-me-the-truth-about-vcs/"&gt;as precise as heads or tails&lt;/a&gt;. Who knew? I thought they were actually paid to know what they were doing.&lt;/p&gt;

&lt;p&gt;Regardless, 7 years ago I decided to make &lt;a href="https://fagnerbrack.com/7-predictions-for-the-web-in-the-next-5-years-d57322717df3"&gt;7 Predictions For The Web In The Next 5 Years&lt;/a&gt;. This post was in draft for some time so I guess I’m a little late to the party. Should probably have been 5 predictions for the next 7 years instead =/.&lt;/p&gt;

&lt;p&gt;The idea was to reflect on where things were heading so that I could revisit them again after the time elapsed.&lt;/p&gt;

&lt;p&gt;The time to reflect on that is now.&lt;/p&gt;

&lt;h4&gt;
  
  
  &lt;strong&gt;1. I predicted: Progressive Web Apps will overrun mobile apps R.O.I., but mobile apps won’t become obsolete (yet)&lt;/strong&gt;
&lt;/h4&gt;

&lt;p&gt;Mobile apps are not even close to becoming obsolete, nor "yet". We have Instagram, TikTok, UberEATS and a myriad of other apps primarily tailored and optimised for mobile phones outside the Web. It's not like you can't provide equivalent experiences on the web, it's just that the skills necessary to do so and the speed in which JavaScript-based Web Technologies move make it hard for the mobile web to be a viable business.&lt;/p&gt;

&lt;p&gt;Google Trends shows that the interest in &lt;a href="https://trends.google.com/trends/explore?date=2016-06-23%202023-05-27&amp;amp;q=%2Fg%2F11bzxympx6"&gt;Progressive Web Apps&lt;/a&gt; topped in 2018/2019/2020. However, it started to decrease quite significantly towards 2021 and came back in 2023.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--kajBIoI5--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn-images-1.medium.com/max/1024/1%2AopRCm61D9MV7LEOHOPnisw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--kajBIoI5--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn-images-1.medium.com/max/1024/1%2AopRCm61D9MV7LEOHOPnisw.png" alt="" width="800" height="295"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://trends.google.com/trends/explore?date=2016-06-23%202023-05-27&amp;amp;q=%2Fg%2F11bzxympx6,%2Fm%2F01qb67"&gt;Web Apps&lt;/a&gt;, though, never stop growing:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--qDhRYdxH--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn-images-1.medium.com/max/1024/1%2AkMhZ1hNc0vqih6daqohFBQ.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--qDhRYdxH--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn-images-1.medium.com/max/1024/1%2AkMhZ1hNc0vqih6daqohFBQ.png" alt="" width="800" height="371"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;By the way, what the hell with all those September spikes?&lt;/p&gt;

&lt;p&gt;&lt;a href="https://trends.google.com/trends/explore?date=2016-06-23%202023-05-27&amp;amp;q=%2Fg%2F11bzxympx6,%2Fm%2F01qb67,%2Fm%2F085n4"&gt;Websites&lt;/a&gt; don't seem to care very much:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--FtS3SfsT--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn-images-1.medium.com/max/1024/1%2A-BaaZLHz1bTuNea9ovkC9g.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--FtS3SfsT--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn-images-1.medium.com/max/1024/1%2A-BaaZLHz1bTuNea9ovkC9g.png" alt="" width="800" height="369"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Seems like the Web is having a naming crisis. What’s next, &lt;a href="https://trends.google.com/trends/explore?date=2016-06-23%202021-06-23&amp;amp;q=%2Fg%2F11bzxympx6,%2Fm%2F01qb67,%2Fm%2F085n4,%2Fm%2F0vpj4_b"&gt;Web Crypto&lt;/a&gt;?&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--pDSZdRP---/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn-images-1.medium.com/max/1024/1%2ADBugcMMeDnRAdgCUsLbu0A.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--pDSZdRP---/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn-images-1.medium.com/max/1024/1%2ADBugcMMeDnRAdgCUsLbu0A.png" alt="" width="800" height="381"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Only a 2021 fad it seems…&lt;/p&gt;

&lt;h4&gt;
  
  
  &lt;strong&gt;2.&lt;/strong&gt; I predicted: &lt;strong&gt;The web will be totally based on components&lt;/strong&gt;
&lt;/h4&gt;

&lt;p&gt;That one was a precise hit, though I should have added a few caveats.&lt;/p&gt;

&lt;p&gt;Nowadays everything is a component, as much as everything was a "class" 10 years ago. React, and JSX are the most popular toolings, though they come at the cost of JavaScript Everywhere™ (&lt;a href="https://www.reddit.com/r/programming/comments/12v1ev7/oracle_owns_javascript_and_is_sending_notices/"&gt;better be careful&lt;/a&gt;) and front-ends with minimum requirements of 2GB payload size in the first run.&lt;/p&gt;

&lt;p&gt;The "Modern Web" setup is completely feasible today, including React, Webpack and their 10¹³² dependencies. After all, every customer should be able to load your website with an iPhone 35 and the processing power of &lt;a href="https://www.zmescience.com/science/news-science/smartphone-power-compared-to-apollo-432/"&gt;trillions of Apollo Rockets in their pockets&lt;/a&gt;, including an internet connection as speedy as the &lt;a href="https://www.reviews.org/internet-service/how-many-us-households-are-without-internet-connection/"&gt;latest dial-up&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Every company seems to be copying Facebook’s tech stack in an apparent &lt;a href="https://en.wikipedia.org/wiki/Cargo_cult"&gt;attempt to copy its success&lt;/a&gt;. I'm not sure if that will work, but the question remains if React is the future because of components, or if components are the future because of React.&lt;/p&gt;

&lt;p&gt;Only time will tell.&lt;/p&gt;

&lt;h4&gt;
  
  
  &lt;strong&gt;3.&lt;/strong&gt; I predicted: &lt;strong&gt;Functional Programming will be the fundamental basis for writing JavaScript&lt;/strong&gt;
&lt;/h4&gt;

&lt;p&gt;Speaking of React, they changed from using the render() as a method within classes to use functions that accept props and return JSX. That was a long time ago. It was a significant improvement in simplicity towards the functional paradigm. As I wrote &lt;strong&gt;6 years ago&lt;/strong&gt; , &lt;a href="https://fagnerbrack.com/this-is-how-to-get-the-best-out-of-front-end-components-52ee29dfb4ae"&gt;A Front-End Component Is A Function that Returns the View&lt;/a&gt;, glad they made the move.&lt;/p&gt;

&lt;p&gt;In regards to Functional Programming reaching the mainstream, it seems like it hasn't outside the JS community. Luckily I didn't say it would:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--JhViljMi--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn-images-1.medium.com/max/1024/1%2ATWPKKxABPBLI-AXDCVp_Ng.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--JhViljMi--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn-images-1.medium.com/max/1024/1%2ATWPKKxABPBLI-AXDCVp_Ng.png" alt="" width="800" height="373"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I mean, Java and C# are still big things and Micro$oft is trying to eliminate the "Java" from JavaScript and replace it with "Type" on the likes of C#. Looks like there's &lt;a href="https://trends.google.com/trends/explore?date=2016-06-23%202023-05-27&amp;amp;q=typescript,javascript"&gt;some grudge there&lt;/a&gt;:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--HCfNXrbX--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn-images-1.medium.com/max/1024/1%2Aj36e7hgdQi0vKpRIlMRGsQ.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--HCfNXrbX--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn-images-1.medium.com/max/1024/1%2Aj36e7hgdQi0vKpRIlMRGsQ.png" alt="" width="800" height="388"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Watch out for the next news: "TC39 has been renamed to TS40".&lt;/p&gt;

&lt;h4&gt;
  
  
  &lt;strong&gt;4.&lt;/strong&gt; I predicted: &lt;strong&gt;The Brave browser will become the second most used browser in the world and will drive the ad-block philosophy the same way Opera drove the Tabs philosophy&lt;/strong&gt;
&lt;/h4&gt;

&lt;p&gt;Unless &lt;a href="https://medium.com/u/bcf2eaa79e8c"&gt;BrendanEich&lt;/a&gt; has changed the UserAgent of Brave to be exactly the one of Safari (&lt;a href="https://webaim.org/blog/user-agent-string-history/"&gt;there's some precedent there&lt;/a&gt;), the prediction has failed.&lt;/p&gt;

&lt;p&gt;Some places say Brave market share is 0.05%. However “Brave Browser Makes Tracking Market Share Difficult”: &lt;a href="https://kinsta.com/browser-market-share/"&gt;https://kinsta.com/browser-market-share/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;One thing I got it right: Chrome is dominating as the first.&lt;/p&gt;

&lt;p&gt;Safari on the other hand is the second.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Functional Programming will be the fundamental basis for writing JavaScript&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;React changed from classes to functions that accept props and return JSX. Functional Programming is everywhere, I haven't seen blog posts talking about Prototypal Inheritance in JS for a few years now.&lt;/p&gt;

&lt;p&gt;I guess I got this one right.&lt;/p&gt;

&lt;h4&gt;
  
  
  &lt;strong&gt;5.&lt;/strong&gt; I predicted: &lt;strong&gt;State-based architecture with Event Sourcing (AKA Redux) will be the standard pattern on how to design the front end.&lt;/strong&gt;
&lt;/h4&gt;

&lt;p&gt;For the web, the standard hasn’t changed. It continues being a spaghetti stored in S3 while architecture and design are thrown into the bin. Only the names of the tools are different, the mess is the same. If someone got it right, it was Kevlin Henney with “Old is the new New”: &lt;a href="https://www.youtube.com/watch?v=AbgsfeGvg3E"&gt;https://www.youtube.com/watch?v=AbgsfeGvg3E&lt;/a&gt;. Timeless!&lt;/p&gt;

&lt;p&gt;In hindsight, I was too optimistic something would have changed.&lt;/p&gt;

&lt;p&gt;The best way to measure Event Sourcing in the front end is by looking at the popularity of the Redux library, which is a half-baked functional event-sourcing implementation for the browser where "describing what happened" in an Object Literal is called an "action" instead of an "event".&lt;/p&gt;

&lt;p&gt;&lt;a href="https://star-history.com/#reduxjs/redux"&gt;Redux&lt;/a&gt; is on quite a constant star increase but seems to be reaching a plateau:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--jlMDyQbN--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn-images-1.medium.com/max/1024/1%2AMUwf3s00TW4WobEaXV00kw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--jlMDyQbN--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn-images-1.medium.com/max/1024/1%2AMUwf3s00TW4WobEaXV00kw.png" alt="" width="800" height="549"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://star-history.com/#reduxjs/redux&amp;amp;facebook/react"&gt;React&lt;/a&gt; grows more, easy to predict where the trend is going:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Z3qQkFqa--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn-images-1.medium.com/max/1024/1%2AI7O5STXim_ezJQxU7TEsig.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Z3qQkFqa--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn-images-1.medium.com/max/1024/1%2AI7O5STXim_ezJQxU7TEsig.png" alt="" width="800" height="512"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://star-history.com/#reduxjs/redux&amp;amp;facebook/react&amp;amp;vuejs/vue"&gt;Vue&lt;/a&gt; is quite following React, both trying to reach the skies like the opening of an anime episode:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--82dmgflS--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn-images-1.medium.com/max/1024/1%2ATdy9dxSsQqH-d6-lZWFlNw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--82dmgflS--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn-images-1.medium.com/max/1024/1%2ATdy9dxSsQqH-d6-lZWFlNw.png" alt="" width="800" height="552"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;On another note, people are getting tired of &lt;a href="https://star-history.t9t.io/#reduxjs/redux&amp;amp;facebook/react&amp;amp;vuejs/vue&amp;amp;twbs/bootstrap"&gt;Bootstrap&lt;/a&gt;:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--_IIAN3vN--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn-images-1.medium.com/max/1024/1%2Auf2CJEaNSguVykxUDfesgA.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--_IIAN3vN--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn-images-1.medium.com/max/1024/1%2Auf2CJEaNSguVykxUDfesgA.png" alt="" width="800" height="596"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://star-history.t9t.io/#reduxjs/redux&amp;amp;facebook/react&amp;amp;vuejs/vue&amp;amp;twbs/bootstrap&amp;amp;jquery/jquery"&gt;Redux&lt;/a&gt; is Following the same trend as jQuery:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--ILmu0RYC--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn-images-1.medium.com/max/1024/1%2AG4ln6dSFkiRYA6qx3TYFng.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--ILmu0RYC--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn-images-1.medium.com/max/1024/1%2AG4ln6dSFkiRYA6qx3TYFng.png" alt="" width="800" height="563"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;On a comparison, &lt;a href="https://star-history.t9t.io/#reduxjs/redux&amp;amp;facebook/react&amp;amp;vuejs/vue&amp;amp;twbs/bootstrap&amp;amp;jquery/jquery&amp;amp;bitcoin/bitcoin"&gt;Bitcoin&lt;/a&gt; did jump in 2017 so ppl seem to be more interested in Crypto and Distributed Systems.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--ZFpwfr7j--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn-images-1.medium.com/max/1024/1%2A2KKRNBVg6wEDGL3ROT2O8Q.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--ZFpwfr7j--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn-images-1.medium.com/max/1024/1%2A2KKRNBVg6wEDGL3ROT2O8Q.png" alt="" width="800" height="574"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Yet the popularity of the Bitcoin repo is still at the same level as that of jquery, probably the popularity of all crypto projects is spread around the other 9 million "coins" out there.&lt;/p&gt;

&lt;h4&gt;
  
  
  6. I predicted: the core of JavaScript libraries and projects will start to be built without being tied to a specific state-based architecture implementation or framework.
&lt;/h4&gt;

&lt;p&gt;I did that with &lt;a href="https://github.com/carhartl/jquery-cookie/issues/349"&gt;js-cookie&lt;/a&gt; a long time ago but it seems like the trend hasn't followed to other components, maybe a few here and there. Angular was the new jQuery, &lt;a href="https://fagnerbrack.com/there-is-an-npm-module-for-that-d6b384678f6c"&gt;NPM also became the new jQuery&lt;/a&gt;, and now React is the new NPM but it kind of uses NPM for distribution so it's weird. Everything is a "React" component. Building front-end components in JavaScript with frameworks and libraries "pluggable to it" doesn't seem to have picked up the pace and it probably never will. After all, creating JavaScript components doesn't help you being hired as &lt;a href="https://fagnerbrack.com/the-senior-trendystuff-engineer-db98a5c5a50f"&gt;The Next Senior {TrendyStuff} Engineer&lt;/a&gt;.&lt;/p&gt;

&lt;h4&gt;
  
  
  7. A standard pattern will emerge to write CSS concerns in JavaScript
&lt;/h4&gt;

&lt;p&gt;Ok, I know what you're thinking. I'm not even sure if the &lt;a href="https://star-history.com/#reduxjs/redux&amp;amp;facebook/react&amp;amp;vuejs/vue&amp;amp;twbs/bootstrap&amp;amp;jquery/jquery&amp;amp;bitcoin/bitcoin&amp;amp;styled-components/styled-components&amp;amp;Date"&gt;&lt;strong&gt;styled-components&lt;/strong&gt;&lt;/a&gt; trend actually made its way to the mainstream. React definitely did but very few people seem to be using styled-components nowadays, happy to be proven wrong:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--cZPqTigL--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn-images-1.medium.com/max/1024/1%2AXpAtHCnP3ZLvLjqhsyL2GA.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--cZPqTigL--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn-images-1.medium.com/max/1024/1%2AXpAtHCnP3ZLvLjqhsyL2GA.png" alt="" width="800" height="634"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;So let's wrap it up:&lt;/p&gt;

&lt;p&gt;I evaluated seven predictions about the web I made five years ago. The predictions included the rise of Progressive Web Apps, component-based web design, functional programming in JavaScript, the success of the Brave browser, the dominance of state-based architecture with Event Sourcing, and the incorporation of CSS in JavaScript.&lt;/p&gt;

&lt;p&gt;Reflecting on these, it appears that while mobile apps are not becoming obsolete, Progressive Web Apps did peak in interest, went down, and then back again. The web did indeed become largely component-based, with React and JSX gaining popularity. Functional programming is now fundamental to JavaScript and React. However, the Brave browser did not achieve the success that can be measured (maybe it's intentional as it's a privacy browser). The web’s architecture with React remains complex despite small Redux adoption, while CSS concerns in JavaScript didn’t become mainstream as expected.&lt;/p&gt;

&lt;p&gt;The predictions yielded a mixed bag of hits and misses. Which is expected when you try to be the Oracle. Speaking of which, I should also go and &lt;a href="https://www.reddit.com/r/programming/comments/12v1ev7/oracle_owns_javascript_and_is_sending_notices/"&gt;sue someone&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;I'll be right back…&lt;/p&gt;

&lt;p&gt;Thanks for reading. If you have feedback, contact me on &lt;a href="https://twitter.com/FagnerBrack"&gt;Twitter&lt;/a&gt;, &lt;a href="https://www.linkedin.com/in/fagnerbrack/"&gt;LinkedIn&lt;/a&gt; or &lt;a href="http://github.com/FagnerMartinsBrack"&gt;Github&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>frontend</category>
      <category>javascript</category>
      <category>webdev</category>
      <category>react</category>
    </item>
    <item>
      <title>Unlocking AI’s Potential for Programming Productivity and Flow Without the Pitfalls</title>
      <dc:creator>Fagner Brack</dc:creator>
      <pubDate>Sun, 28 May 2023 22:01:40 +0000</pubDate>
      <link>https://dev.to/fagnerbrack/unlocking-ais-potential-for-programming-productivity-and-flow-without-the-pitfalls-o5a</link>
      <guid>https://dev.to/fagnerbrack/unlocking-ais-potential-for-programming-productivity-and-flow-without-the-pitfalls-o5a</guid>
      <description>&lt;p&gt;Some developers might be sceptical about using AI tools like Github Copilot due to the occasional incorrect answers. However, my experience has been quite the opposite. Although I was very sceptical at the beginning, the real power of these tools lies in their ability to increase productivity and maintain the creative flow, not to provide correct answers. In this blog post, we’ll explore the ways in which AI tools can help you harness these benefits and transform your development process.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--L2UAJJJ8--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn-images-1.medium.com/max/1024/1%2AKrA2zXLieQYc9co0Bz3EJg.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--L2UAJJJ8--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn-images-1.medium.com/max/1024/1%2AKrA2zXLieQYc9co0Bz3EJg.jpeg" alt="" width="800" height="758"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Although AI tools like Copilot may sometimes provide incorrect answers, their real value lies in their ability to improve productivity and facilitate action and flow. By providing an initial approach to coding problems and keeping developers engaged, AI tools can help you stay focused and maintain your creative momentum.&lt;/p&gt;

&lt;p&gt;It’s been shown[1] that after only 20 minutes of interrupted performance, people reported significantly higher stress, frustration, workload, effort, and pressure. It can take 15 minutes or more for people to get back into the flow after being interrupted during a programming task [2]. However, what I noticed in my own experiments is that AI tools like Github Copilot help me regain my focus in a matter of seconds. By offering personalized suggestions within the IDE, the copilot can quickly bring me back to my task and minimize the time spent regaining my bearings.&lt;/p&gt;

&lt;p&gt;Here's an example: I was designing a simple validation function using &lt;a href="https://fagnerbrack.com/you-dont-know-tdd-691efe670094"&gt;TDD&lt;/a&gt; (Detroit School), and I got distracted by something outside and lost my focus. I asked ChatGPT to "continue TDD to build the next test from where I left off". After a few enter key presses, it suggested the wrong test based on the previous ones, but at least by analysing its suggestion, I managed to delete it and get back on track, knowing exactly what the next step was.&lt;/p&gt;

&lt;p&gt;Here's the thing: AI tools can provide a starting point for tackling familiar problems, even if their initial solutions are not perfect. This technique is reminiscent of psychological methods used to overcome procrastination and maintain action and flow [3]. By offering an imperfect solution, AI prompts developers to recall the correct approach, allowing them to efficiently tackle problems they’ve solved numerous times before.&lt;/p&gt;

&lt;h4&gt;
  
  
  Overcoming the Dreaded “Blank Page”
&lt;/h4&gt;

&lt;p&gt;The “blank page” refers to the overwhelming feeling of staring at an empty screen, unsure of how to start a project or tackle a problem. AI tools like Copilot can help developers overcome this barrier by providing initial suggestions and code snippets to kick-start the creative process.&lt;/p&gt;

&lt;p&gt;The convenience of staying within the IDE view and receiving personalized suggestions makes AI tools like Copilot invaluable for keeping developers on track and avoiding time-consuming rabbit holes. By providing targeted assistance within the familiar environment of the IDE, developers can maintain their focus and avoid distractions, which is very useful for those with ADHD.&lt;/p&gt;

&lt;p&gt;The benefits of using AI tools like copilot in software development extend far beyond their potential for generating code. Their real power lies in their ability to help developers regain their flow, maintain focus, and overcome common barriers such as the dreaded “blank page.” It allows for an accessible work environment for those with ADHD.&lt;/p&gt;

&lt;p&gt;So, maybe that tap on the shoulder won’t be so costly now that you have a tool that can help you get back into the flow?&lt;/p&gt;

&lt;p&gt;Thanks to &lt;a href="https://www.linkedin.com/in/nageljeremy/"&gt;Jeremy Nagel&lt;/a&gt; for their insightful input on this post.&lt;/p&gt;

&lt;p&gt;Thanks for reading. If you have feedback, contact me on &lt;a href="https://twitter.com/FagnerBrack"&gt;Twitter&lt;/a&gt;, &lt;a href="https://www.linkedin.com/in/fagnerbrack/"&gt;LinkedIn&lt;/a&gt; or &lt;a href="http://github.com/FagnerMartinsBrack"&gt;Github&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;References&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1:&lt;/strong&gt; &lt;a href="https://www.ics.uci.edu/~gmark/chi08-mark.pdf"&gt;Mark, G., Gudith, D., &amp;amp; Klocke, U. (2008). The cost of interrupted work: More speed and stress. &lt;em&gt;ACM&lt;/em&gt;.&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2:&lt;/strong&gt; &lt;a href="http://chrisparnin.me/pdf/parnin-sqj11.pdf"&gt;Parnin, C., &amp;amp; Rugaber, S. (2010). Resumption strategies for interrupted programming tasks. &lt;em&gt;Springer Science+Business Media, LLC&lt;/em&gt;.&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3:&lt;/strong&gt; Pychyl, T. A., &amp;amp; Flett, G. L. (2012). Procrastination and self-regulatory failure: An introduction to the special issue. &lt;em&gt;Journal of Rational-Emotive &amp;amp; Cognitive-Behavior Therapy, 30&lt;/em&gt;(4), 203–212. &lt;a href="https://psycnet.apa.org/doi/10.1007/s10942-012-0149-5"&gt;https://doi.org/10.1007/s10942-012-0149-5&lt;/a&gt;&lt;/p&gt;

</description>
      <category>flow</category>
      <category>artificialintelligen</category>
      <category>programming</category>
      <category>ai</category>
    </item>
    <item>
      <title>The FATE Metrics for Hiring</title>
      <dc:creator>Fagner Brack</dc:creator>
      <pubDate>Thu, 25 May 2023 22:02:11 +0000</pubDate>
      <link>https://dev.to/fagnerbrack/the-fate-metrics-for-hiring-2p9j</link>
      <guid>https://dev.to/fagnerbrack/the-fate-metrics-for-hiring-2p9j</guid>
      <description>&lt;p&gt;I've been speaking lately to a lot of engineers, and I tend to complain about the current state of interviewing without coming up with a solution for the technical interviews. For that reason, I am excited to introduce a concept I've been working on for 15+ years, observing and researching hiring and interviews. It's not a full solution, but another tool or your toolbelt.&lt;/p&gt;

&lt;h4&gt;
  
  
  Introducing the FATE Metrics
&lt;/h4&gt;

&lt;p&gt;An aggregate of metrics for engineers and hiring managers to assess their technical interview process.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--cqpAAzHC--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn-images-1.medium.com/max/1024/0%2AN53mY9kCRNrazkb3" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--cqpAAzHC--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn-images-1.medium.com/max/1024/0%2AN53mY9kCRNrazkb3" alt="" width="800" height="534"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Photo by Mikail McVerry on Unsplash&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;The &lt;strong&gt;FATE Metrics&lt;/strong&gt; , which stands for Feedback, Accuracy, Time, and Effort, is a set of metrics designed to benchmark a technical interview process by focusing on the candidate's experience, particularly in software engineering, but applicable across all roles and industries. By improving the hiring process, companies can ensure they’re attracting and retaining the best talent, ultimately shaping the FATE of their organization and the candidate’s career. In this blog post, I will provide an overview of the FATE Metrics and explain how they can benefit both candidates and organizations.&lt;/p&gt;

&lt;p&gt;Each metric has a score of 0–10. Where 0 is " &lt;strong&gt;Very low"&lt;/strong&gt; , 10 is " &lt;strong&gt;Very high"&lt;/strong&gt; , and 5 is " &lt;strong&gt;Medium"&lt;/strong&gt;.&lt;/p&gt;

&lt;h4&gt;
  
  
  Feedback (F)
&lt;/h4&gt;

&lt;p&gt;Feedback measures the usefulness of the feedback for rejections, both the company to the candidate and vice-versa. However, we'll focus on the candidate's experience.&lt;/p&gt;

&lt;p&gt;An ideal feedback score would include a detailed, personalized response from the hiring manager, helping the candidate understand why they did or did not secure the position. To provide effective feedback, it should be objective, constructive, guided, paced, and encouraging, as discussed in various research papers on effective feedback (see references).&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Useful Feedback translates to a high score.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Very low score:&lt;/strong&gt; The software engineering candidate receives a generic rejection email from a no-reply address with no information on their performance during the interview process.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Medium score:&lt;/strong&gt; The software engineering candidate receives feedback from the company that they decided not to continue with the process using an email that can be replied to. The candidate replies to the email asking for specific feedback on how they can improve; the company responds that they decided to go with another candidate. The candidate requests more specific feedback, but the company does not reply back.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Very high score:&lt;/strong&gt; A software engineering candidate receives a personalized email from the hiring manager detailing the strengths and areas for improvement observed during the interview process, with specific examples and guidance for future growth. It doesn't matter if the response is automated as long as it's crafted to the candidate's circumstances. The company asks for feedback from the candidate on how they can improve their own process.&lt;/p&gt;

&lt;h4&gt;
  
  
  Accuracy (A)
&lt;/h4&gt;

&lt;p&gt;Accuracy evaluates how closely the interview process aligns with the job requirements of the role the candidate is applying for.&lt;/p&gt;

&lt;p&gt;A high-accuracy interview process involves simulations or real-life problem-solving exercises that closely mirror the candidate’s future responsibilities rather than generic or unrelated code challenges. A low-accuracy interview is based on irrelevant l33t code and abstract technical questions that can be easily looked up online. High accuracy is based on real-life.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;High Accuracy translates to a high score.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Very low score:&lt;/strong&gt; A software engineering candidate is asked to solve abstract algorithmic problems during the interview, which are unrelated to the daily tasks they would perform in the role. In this kind of interview, interviewers send crazy questions and expect that the candidate would ask the right questions to remove ambiguity to get to the solution of the problem. It gives an unreasonable advantage to low-skill engineers that have trained for this kind of interview or read the book Cracking the Code Interview. Examples are "Given a bus, how many baseballs would you fit in them?" or "Given points x, y and z in a multi-dimensional dataset, what is the shortest distance between x and z?".&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Medium score:&lt;/strong&gt; A software engineer is shortlisted based on their CV by a human and is invited to participate in a coding session with another engineer and asked to solve a domain problem that is representative of the actual work they will be doing. However, the work does not match their skills or the expectations for the role.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Very high score:&lt;/strong&gt; A software engineering candidate is filtered through self-assessment of competencies and Big 5 assessment, and that information is compared to the team's requirements using the findings of the relevant scientific research on the topic. Once shortlisted, they participate in a pair programming or solo programming session with a member of the team they're applying for. The candidate is given a real-life domain scenario that is representative of the actual work they will be doing in the role, but without the interviewer knowing the solution for the problem.&lt;/p&gt;

&lt;p&gt;Examples are "We work in an internal developer tools team, and we've been asked by other devs to design an API to get information about the weather; where would you start?" or "We work in a customer-facing website for payments, we've been asked to implement a gateway to interact with multiple payment providers, where would you start?"&lt;/p&gt;

&lt;h4&gt;
  
  
  Time (T)
&lt;/h4&gt;

&lt;p&gt;Time refers to the duration of the interview process until both parties reach to an outcome.&lt;/p&gt;

&lt;p&gt;An efficient process is short, with minimal rounds and a limited number of people involved. Lengthy, convoluted processes can cause confusion and negatively impact the candidate’s experience.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;A quick process translates to a high score.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Very low score:&lt;/strong&gt; A software engineering candidate goes through multiple rounds of interviews, spanning several weeks or even months, with no clear communication regarding the next steps or timeline to the conclusion. Asking for feedback by email yields no reply.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Medium score:&lt;/strong&gt; A software engineering candidate goes through several rounds of interviews over the course of a few weeks, with some communication about the next steps and timeline. However, there may be occasional delays or lack of clarity, and the candidate might need to follow up with the company for updates.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Very high score:&lt;/strong&gt; A software engineering candidate completes a streamlined interview process. After their application, there's one shortlist stage and then one or two more stages to receive a decision within less than a week.&lt;/p&gt;

&lt;p&gt;Quicker interviews tend to yield low accuracy if done incorrectly. However, good interviews are quicker and with high accuracy.&lt;/p&gt;

&lt;h4&gt;
  
  
  Effort (E)
&lt;/h4&gt;

&lt;p&gt;Effort assesses the amount of work required from the candidate during the interview process. A low-effort process might involve answering pre-set questions and making a decision simply by talking to your peers. On another hand, a high-effort process could require take-home assignments or extensive open-ended questions and exercises like HackerRank.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;A low-effort process translates to a high score.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Very low score:&lt;/strong&gt; A software engineering candidate is asked to complete a lengthy HackerRank and take-home assignment with no compensation for their time and effort. Later, they need to travel in person to the company HQ to have a set of 6 interview rounds with 12 different people. The in-person interview spans multiple days.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Medium score:&lt;/strong&gt; A software engineering candidate goes through a moderately demanding interview process that includes a combination of online assessments and a few rounds of interviews with different team members. The process may require a reasonable amount of effort but is not overly demanding or time-consuming.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Very high score:&lt;/strong&gt; A software engineering candidate is shortlisted after a skill self-assessment and may get a response straight away with the possibility to talk to the hiring manager if there's a mistake. After being shortlisted, the remote interview process balances the candidate’s effort with the value of the insights gained, such as a well-structured technical interview. The interview with another engineer tests some of the aspects the candidate self-assessed to cross-verify some of the responses but not all, followed by a behavioural interview.&lt;/p&gt;

&lt;p&gt;The FATE Metrics provide an objective measurement tool for sensing the quality of the interview process in software engineering and beyond, with the ultimate goal of achieving a 10/10 score in each category.&lt;/p&gt;

&lt;p&gt;However, these should be used like the instruments of a plane where it helps you sense the environment, not evaluate it completely, as achieving 10/10 doesn't mean your interview becomes magically perfect. By embracing the FATE Metrics, companies can identify areas where their hiring process may be falling short and make targeted improvements that will benefit not only their organization but also the candidates and, potentially, the industry as a whole.&lt;/p&gt;

&lt;p&gt;As the landscape of software engineering and other industries continues to evolve rapidly, attracting and retaining top talent becomes increasingly crucial. By employing the FATE Metrics in the hiring process, companies can ensure they’re providing the best possible experience for candidates, creating a positive impression and setting the stage for a successful working relationship. In turn, this will help to shape the FATE of the organization, the candidate’s career, and even the industry as a whole, promoting growth and innovation in the long run.&lt;/p&gt;

&lt;p&gt;If you want me to come over and help you with your interview process, contact me on &lt;a href="https://twitter.com/FagnerBrack"&gt;Twitter&lt;/a&gt;, &lt;a href="https://www.linkedin.com/in/fagnerbrack/"&gt;LinkedIn&lt;/a&gt; or &lt;a href="http://github.com/FagnerMartinsBrack"&gt;Github&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Bonus:&lt;/strong&gt; I plan to publish an archive containing years of interview processes analysed using the FATE metrics. Also, a list of questions in which organizations can self-assess their interview process.&lt;/p&gt;

&lt;p&gt;Stay tuned by subscribing! 📻&lt;/p&gt;

&lt;p&gt;Thanks for reading. If you have feedback, contact me on &lt;a href="https://twitter.com/FagnerBrack"&gt;Twitter&lt;/a&gt;, &lt;a href="https://www.linkedin.com/in/fagnerbrack/"&gt;LinkedIn&lt;/a&gt; or &lt;a href="http://github.com/FagnerMartinsBrack"&gt;Github&lt;/a&gt;.&lt;/p&gt;

&lt;h4&gt;
  
  
  References
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Poston, K. L. (2013). Feedback That Sticks: The Art of Effectively Communicating Neuropsychological Assessment Results. Oxford University Press.&lt;/li&gt;
&lt;li&gt;Costa, Paul T., Jr., and Robert R. McCrae. “Personality in Adulthood: A Six-Year Longitudinal Study of Self-Reports and Spouse Ratings on the NEOPI.” Journal of Personality and Social Psychology, vol. 48, no. 2, 1984, pp. 159–165. JSTOR, &lt;a href="http://www.jstor.org/stable/2095160"&gt;www.jstor.org/stable/2095160&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Dreyfus, Hubert L., and Stuart E. Dreyfus. “A Five-Stage Model of the Mental Activities Involved in Directed Skill Acquisition.” Operations Research Center, University of California, Berkeley, 1980.&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>hiring</category>
      <category>technology</category>
      <category>softwareengineering</category>
      <category>tech</category>
    </item>
    <item>
      <title>You Won’t Believe What Comes Next: The Solution for Clickbait Headlines</title>
      <dc:creator>Fagner Brack</dc:creator>
      <pubDate>Sun, 21 May 2023 22:01:47 +0000</pubDate>
      <link>https://dev.to/fagnerbrack/you-wont-believe-what-comes-next-the-solution-for-clickbait-headlines-f71</link>
      <guid>https://dev.to/fagnerbrack/you-wont-believe-what-comes-next-the-solution-for-clickbait-headlines-f71</guid>
      <description>&lt;h4&gt;
  
  
  It’s time to prioritize substance over style and let AI take the reins in generating headlines that truly reflect the value of content.
&lt;/h4&gt;

&lt;p&gt;We’ve all fallen victim to the irresistible allure of clickbait headlines. Whether it’s “You won’t believe what happens next!” or “10 secrets you need to know,” these tantalizing titles are designed to capture our attention and encourage us to click. While they may be effective at driving traffic, they often lead us down a rabbit hole of low-quality content and endless scrolling.&lt;/p&gt;

&lt;p&gt;I've seen it firsthand on &lt;a href="https://news.ycombinator.com/user?id=fagnerbrack"&gt;HackerNews&lt;/a&gt; and &lt;a href="https://www.reddit.com/user/fagnerbrack"&gt;Reddit&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--GU2S4NLY--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn-images-1.medium.com/max/1024/0%2AcNIhOY8iAa23oTpj" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--GU2S4NLY--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn-images-1.medium.com/max/1024/0%2AcNIhOY8iAa23oTpj" alt="" width="800" height="534"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Photo by Andrey Metelev on Unsplash&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;I call it the “Law of Clickbait Headlines”, which is a variation of "&lt;a href="https://en.wikipedia.org/wiki/Goodhart%27s_law"&gt;Goodhart's Law&lt;/a&gt;" for the endless work of protecting communities from submitting links with clickbait headlines. The proposition is simple: as people block or ignore clickbait, another one tends to take its place over time. Consequently, it becomes an endless cycle, making it increasingly difficult for quality content to break through the noise as people continue to game the system.&lt;/p&gt;

&lt;p&gt;According to “&lt;a href="https://news.ycombinator.com/user?id=dredmorbius"&gt;dredmorbius&lt;/a&gt;” &lt;a href="https://news.ycombinator.com/item?id=35488770"&gt;on HackerNews&lt;/a&gt;:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Algolia, at this writing, the words “how did we get here” appear in HN submissions (net of flags and edits) 363 times. That’s exceeded by the even more tiresome “this changes everything” (571 results). Both should be hellbanned IMO. I’m having an email exchange with dang over this presently.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://hn.algolia.com/?dateRange=all&amp;amp;page=0&amp;amp;prefix=true&amp;amp;query=how%20did%20we%20get%20here&amp;amp;sort=byPopularity&amp;amp;type=story"&gt;— “How did we get here”&lt;/a&gt; search on hn.algolia.com&lt;/p&gt;

&lt;p&gt;— &lt;a href="https://hn.algolia.com/?dateRange=all&amp;amp;page=0&amp;amp;prefix=true&amp;amp;query=this%20changes%20everything&amp;amp;sort=byPopularity&amp;amp;type=story"&gt;“This changes everything”&lt;/a&gt; search on hn.algolia.com&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h4&gt;
  
  
  The Problem with User-Generated Headlines
&lt;/h4&gt;

&lt;p&gt;Headline-based websites like Hacker News and Reddit are notorious for their abundance of clickbait titles. These platforms favour advertisers and content creators who can craft attention-grabbing headlines, while quality content without the marketing flair often goes unnoticed.&lt;/p&gt;

&lt;p&gt;The &lt;a href="https://youtube.com/veritasium"&gt;Veritasium YouTube channel&lt;/a&gt;, for example, is a great channel that talks about real science and shares valuable and credible scientific research but &lt;a href="https://www.youtube.com/watch?v=S2xHZPH5Sng."&gt;is compelled to use clickbait-style headlines and images for its videos to attract viewers&lt;/a&gt;. Unfortunately, this means that many people from the general audience do not have access to well-delivered evidence-based research simply because the researchers either lack the skills or knowledge to create good headlines.&lt;/p&gt;

&lt;p&gt;But what if there was a way to break this cycle and prioritize valuable content over catchy headlines?&lt;/p&gt;

&lt;h4&gt;
  
  
  Enter &lt;strong&gt;Artificial Intelligence&lt;/strong&gt;.
&lt;/h4&gt;

&lt;p&gt;Instead of relying on user-generated headlines, AI could be employed to create titles that accurately represent the content’s relevance, leaving edits to trusted community members (high karma), which are fed back into the AI for tuning. By making AI responsible for crafting headlines, we can focus on the substance of the content rather than its click &lt;strong&gt;&lt;em&gt;bait&lt;/em&gt;&lt;/strong&gt; ability (is that an actual word? 🤔).&lt;/p&gt;

&lt;p&gt;AI-generated headlines have the potential to level the playing field, allowing quality content to shine regardless of the creator’s marketing prowess. Moreover, this approach could help discourage advertisers from exploiting clickbait strategies and instead motivate them to produce more valuable content.&lt;/p&gt;

&lt;p&gt;The internet is a treasure trove of incredible content, but it’s often hidden behind a wall of clickbait headlines. By leveraging AI to generate headlines that prioritize the content’s relevance over click &lt;strong&gt;&lt;em&gt;bait&lt;/em&gt;&lt;/strong&gt; ability, we can break the cycle of clickbait and ensure that valuable research and information are no longer overshadowed by flashy titles. It’s time to take a stand against clickbait culture and embrace the power of AI to promote quality content that truly deserves our attention.&lt;/p&gt;

&lt;p&gt;Don't be afraid of the crazy machines; the future is bright and full of colours.&lt;/p&gt;

&lt;p&gt;Thanks for reading. If you have feedback, contact me on &lt;a href="https://twitter.com/FagnerBrack"&gt;Twitter&lt;/a&gt;, &lt;a href="https://www.linkedin.com/in/fagnerbrack/"&gt;LinkedIn&lt;/a&gt; or &lt;a href="http://github.com/FagnerMartinsBrack"&gt;Github&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>technology</category>
      <category>artificialintelligen</category>
      <category>ai</category>
      <category>hackernews</category>
    </item>
    <item>
      <title>Finding the Sweet Spot: Pros and Cons of Mob Programming, Pair Programming, and Solo Work in…</title>
      <dc:creator>Fagner Brack</dc:creator>
      <pubDate>Thu, 18 May 2023 22:01:42 +0000</pubDate>
      <link>https://dev.to/fagnerbrack/finding-the-sweet-spot-pros-and-cons-of-mob-programming-pair-programming-and-solo-work-in-13co</link>
      <guid>https://dev.to/fagnerbrack/finding-the-sweet-spot-pros-and-cons-of-mob-programming-pair-programming-and-solo-work-in-13co</guid>
      <description>&lt;h3&gt;
  
  
  Finding the Sweet Spot: Pros and Cons of Mob Programming, Pair Programming, and Solo Work in Software Development
&lt;/h3&gt;

&lt;p&gt;In the dynamic world of software development, striking a balance between collaboration and autonomy is essential for optimizing productivity, knowledge sharing, and team cohesion. Various working styles, such as Mob Programming, Pair Programming, and Solo Work, exist to address these needs. Drawing from my 15+ years of experience managing teams and implementing these working styles in various settings, this blog post will delve into the pros and cons of each working style and provide insights on how to find the sweet spot between collaboration and autonomy within your team.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--ojLrb_qc--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn-images-1.medium.com/max/1024/0%2ACarkjX0Vu0A2KL3D" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--ojLrb_qc--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn-images-1.medium.com/max/1024/0%2ACarkjX0Vu0A2KL3D" alt="" width="800" height="534"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Photo by Chang Duong on Unsplash&lt;/em&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  My Experience with Mob Programming, Pair Programming, and Solo Work
&lt;/h4&gt;

&lt;p&gt;Throughout my career, I’ve had the great opportunity to work with teams that employed Mob Programming, Pair Programming, and Solo Work, witnessing the effectiveness of each approach firsthand:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;At MYOB, my team implemented Mob Programming, leading to a tenfold increase in performance and becoming the best-performing team in the company during my tenure.&lt;/li&gt;
&lt;li&gt;While working at Service NSW, I utilized principles of Mob Programming to teach Test-Driven Development (TDD) principles within five weeks for a team of 6 engineers.&lt;/li&gt;
&lt;li&gt;At Lexicon (while working at IAG), I acted as a Subject matter Expert on Mob Programming to help the teams with a successful migration project by orchestrating three Mob Programming groups simultaneously, achieving the desired results in an astonishing 3 months within the tight timeframes that many deemed impossible.&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  &lt;strong&gt;The Importance of Experience and Psychological Safety in Mob Programming&lt;/strong&gt;
&lt;/h4&gt;

&lt;p&gt;It’s crucial to have someone experienced in Mob Programming working with the team, as this ensures the approach is effectively implemented and increases the likelihood of success. Psychological Safety is a must, and the entire team needs to understand the value of trying Mob Programming for the task at hand, with a clear goal of solving the specific issues they are facing.&lt;/p&gt;

&lt;p&gt;A top-down imposition of a working style rarely works and often reduces psychological safety. &lt;a href="https://rework.withgoogle.com/print/guides/5721312655835136/"&gt;Google’s Project Aristotle&lt;/a&gt;, which studied the factors that contribute to team success, found that psychological safety was the most important element in high-performing teams.&lt;/p&gt;

&lt;p&gt;Ensuring that team members feel comfortable taking risks, sharing ideas, and voicing concerns is vital for the success of Mob Programming or any collaborative working style.&lt;/p&gt;

&lt;h4&gt;
  
  
  Pair Programming (2 people working simultaneously on one task on one screen)
&lt;/h4&gt;

&lt;p&gt;Pros:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Sharing Experience and knowledge and speeding up domain learning&lt;/li&gt;
&lt;li&gt;More ideas to solve complex issues / can speed up task solution&lt;/li&gt;
&lt;li&gt;Ensures focus on debugging / Exploratory work / less procrastination&lt;/li&gt;
&lt;li&gt;Early Feedback in the design and code to decrease the cost of change exponentially (instead of increasing the cost of change exponentially)&lt;/li&gt;
&lt;li&gt;Minimizes the &lt;a href="https://en.wikipedia.org/wiki/Bus_factor"&gt;Truck Factor&lt;/a&gt; (team resiliency) / Work continuity if one team member gets sick, goes on leave, or has jury duty&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Cons:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Less freedom to explore a problem space without communication overhead quickly&lt;/li&gt;
&lt;li&gt;Pressure from peers for work completion might compromise on quality&lt;/li&gt;
&lt;li&gt;Breaks, coffee, and other needs can disrupt the session&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Mob Programming (3+ people working simultaneously on one task on one screen)
&lt;/h4&gt;

&lt;p&gt;Pros:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Enhanced Sharing Experience, Knowledge Sharing, and Learning&lt;/li&gt;
&lt;li&gt;More ideas to solve complex issues than pairing/speed up task solutions significantly&lt;/li&gt;
&lt;li&gt;Ensures focus on debugging / Exploratory work / no procrastination&lt;/li&gt;
&lt;li&gt;Early Feedback in the design and code to decrease the cost of change&lt;/li&gt;
&lt;li&gt;Makes some rituals and meetings unnecessary; everyone is already together&lt;/li&gt;
&lt;li&gt;Nullifies the Truck Factor (team resiliency)&lt;/li&gt;
&lt;li&gt;Strong flow / Work continuity and easy context re-acquisition after breaks or absences&lt;/li&gt;
&lt;li&gt;Ensures team buy-in and early conflict resolution&lt;/li&gt;
&lt;li&gt;Breaks and personal needs can be managed individually without coordination&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Cons:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Not suitable for simple tasks&lt;/li&gt;
&lt;li&gt;The longer time spent on single tasks when multiple tasks could have been completed&lt;/li&gt;
&lt;li&gt;Staying in Mob Programming quiet for too long may hide individual performance problems and reduce accountability for an individual&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Solo Work (1 person working on one task on one screen)
&lt;/h4&gt;

&lt;p&gt;Pros:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Easy to get into the flow&lt;/li&gt;
&lt;li&gt;Context Switch costs less / is Easier to switch&lt;/li&gt;
&lt;li&gt;Short-term conflict avoidance&lt;/li&gt;
&lt;li&gt;Working on one’s own time without coordination&lt;/li&gt;
&lt;li&gt;Zero reliance on the Internet for remote work&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Cons:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Truck Factor maximized / Knowledge retained on individuals instead of shared as a team&lt;/li&gt;
&lt;li&gt;More PR Review comments / Issues are solved async and too late / Increase WIP&lt;/li&gt;
&lt;li&gt;Thoroughness/Team Alignment on the design is weaker than working together with all minds&lt;/li&gt;
&lt;li&gt;Easier to get blocked staring at the "blank screen" / Hindered in problem-solving&lt;/li&gt;
&lt;li&gt;Procrastination is more likely&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Finding the Right Balance
&lt;/h4&gt;

&lt;p&gt;To find the sweet spot between collaboration and autonomy, consider the following factors:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Task complexity: Opt for Mob or Pair Programming for complex tasks; that is, when the problem doesn't have a clear cause/effect, and Solo Work for simpler tasks; that is when the solution has a clear cause/effect.&lt;/li&gt;
&lt;li&gt;Team dynamics: Assess team members’ strengths, weaknesses, and communication styles to determine the most suitable working style.&lt;/li&gt;
&lt;li&gt;Personal preferences: Take individual preferences into account and provide incentives for team members to work in their preferred mode when appropriate.&lt;/li&gt;
&lt;li&gt;Time constraints: In time-sensitive situations where quality is not a goal, Solo Work or Pair Programming may be more suitable than Mob Programming.&lt;/li&gt;
&lt;li&gt;Project goals: Consider the overall objectives of the project and the need for collaboration, knowledge sharing, and team alignment to guide the choice of working style.&lt;/li&gt;
&lt;li&gt;Physical limits: Consider if the physical structure allows for a comfortable session for Pair Programming and Mob Programming. Most workspaces are optimised for siloed work.&lt;/li&gt;
&lt;/ol&gt;

&lt;h4&gt;
  
  
  Final Thoughts
&lt;/h4&gt;

&lt;p&gt;There is no one-size-fits-all approach to software development, and finding the sweet spot between collaboration and autonomy depends on various factors unique to each team and project. By understanding the tradeoffs associated with Mob Programming, Pair Programming, and Solo Work, teams can make informed decisions about their working styles and ultimately improve productivity, knowledge sharing, and team cohesion.&lt;/p&gt;

&lt;p&gt;My experience across different organizations, big and small, has reinforced the importance of tailoring these working styles to each team’s unique needs and circumstances to achieve the best possible outcomes.&lt;/p&gt;

&lt;p&gt;Dogmas should be off the table.&lt;/p&gt;

&lt;p&gt;Thanks for reading. If you have feedback, contact me on &lt;a href="https://twitter.com/FagnerBrack"&gt;Twitter&lt;/a&gt;, &lt;a href="https://www.linkedin.com/in/fagnerbrack/"&gt;LinkedIn&lt;/a&gt; or &lt;a href="http://github.com/FagnerMartinsBrack"&gt;Github&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>technology</category>
      <category>agile</category>
      <category>mobprogramming</category>
      <category>softwareengineering</category>
    </item>
    <item>
      <title>Book Summary: The Self-Taught Programmer</title>
      <dc:creator>Fagner Brack</dc:creator>
      <pubDate>Wed, 17 May 2023 22:01:57 +0000</pubDate>
      <link>https://dev.to/fagnerbrack/book-summary-the-self-taught-programmer-52le</link>
      <guid>https://dev.to/fagnerbrack/book-summary-the-self-taught-programmer-52le</guid>
      <description>&lt;h4&gt;
  
  
  by Cory Althoff
&lt;/h4&gt;

&lt;p&gt;“The Self-Taught Programmer” is a comprehensive guide to learning to code and becoming a successful software developer, even without a formal computer science degree. This book is particularly relevant to those who are embarking on a self-guided journey into programming.&lt;/p&gt;

&lt;p&gt;As a self-taught programmer, I can personally attest to the value of the strategies and concepts outlined in “The Self-Taught Programmer”. Early in my career, I found myself applying many of these ideas instinctively, even without a comprehensive guide to direct me. It’s truly gratifying to see a book like this that distils some of the core ideas of self-directed learning into a form that can be easily consumed and applied by future professionals in the field. While the book is a great starting point, remember that the journey of learning and growing in the field of programming is a continuous one.&lt;/p&gt;

&lt;p&gt;Keep exploring, keep coding, and keep learning!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--izH8398g--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn-images-1.medium.com/max/300/1%2AR-_uWwFcCQG4sFXtWv3P8g.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--izH8398g--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn-images-1.medium.com/max/300/1%2AR-_uWwFcCQG4sFXtWv3P8g.jpeg" alt="" width="300" height="459"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The most valuable points from the book are:&lt;/p&gt;

&lt;h4&gt;
  
  
  Understanding the Basics
&lt;/h4&gt;

&lt;p&gt;Althoff stresses the importance of thoroughly understanding the basics of programming, including variables, control structures, data structures, and syntax.&lt;/p&gt;

&lt;p&gt;For example, he provides exercises that help beginners grasp the concept of loops, a fundamental control structure in programming. However, in real-world coding, understanding the basics also involves knowing when and how to use these structures most effectively in different programming scenarios.&lt;/p&gt;

&lt;h4&gt;
  
  
  Learning a Programming Language
&lt;/h4&gt;

&lt;p&gt;The book guides readers through the process of learning Python, a versatile and beginner-friendly programming language. Althoff provides numerous practical examples and exercises to reinforce learning.&lt;/p&gt;

&lt;p&gt;For example, he introduces Python’s list data structure and demonstrates its use in various contexts. However, becoming proficient in a programming language also involves understanding its idiomatic usage and best practices, something that often comes with experience and is not covered extensively in the book.&lt;/p&gt;

&lt;h4&gt;
  
  
  Problem-Solving Skills
&lt;/h4&gt;

&lt;p&gt;The book emphasizes the importance of problem-solving skills and logical thinking in programming. It provides various problems and their solutions to help readers hone these skills.&lt;/p&gt;

&lt;p&gt;For example, Althoff presents a problem on finding the largest number in a list and walks through the solution. In real-world programming, problem-solving often involves understanding the requirements, breaking down the problem, and devising a solution step by step.&lt;/p&gt;

&lt;h4&gt;
  
  
  Understanding Algorithms and Data Structures
&lt;/h4&gt;

&lt;p&gt;Althoff introduces the concept of algorithms and data structures, providing several examples. He explains the basics of search algorithms, sorting algorithms, and common data structures.&lt;/p&gt;

&lt;p&gt;For instance, he demonstrates how to use a binary search algorithm in Python. However, in real-world software development, understanding algorithms and data structures also requires knowing when to use a specific algorithm or data structure to optimize performance or solve a particular problem.&lt;/p&gt;

&lt;h4&gt;
  
  
  Building Projects
&lt;/h4&gt;

&lt;p&gt;The book encourages readers to apply what they’ve learned by building projects. Althoff argues that building real-world projects is one of the best ways to learn and reinforce programming concepts, and it’s also crucial for building a portfolio to showcase to potential employers.&lt;/p&gt;

&lt;p&gt;For example, Althoff guides readers through building a web scraper using Python. However, in real-world projects, programmers also need to consider factors like code maintainability, scalability, and the use of version control systems, which are not extensively covered in the book.&lt;/p&gt;

&lt;h4&gt;
  
  
  Career Advice
&lt;/h4&gt;

&lt;p&gt;The book provides guidance on how to land a job as a programmer, including tips on networking, preparing for interviews, and writing a compelling resume.&lt;/p&gt;

&lt;p&gt;For instance, Althoff provides tips on preparing for common programming interview questions. However, breaking into the tech industry also involves continuous learning and adapting to new technologies, which is not a major focus of the book.&lt;/p&gt;

&lt;p&gt;“The Self-Taught Programmer” is a valuable resource for those looking to learn programming on their own. However, it’s important to supplement the knowledge gained from the book with additional resources and practical experience to fully prepare for a career in software development.&lt;/p&gt;

&lt;p&gt;Thanks for reading. If you have feedback, contact me on &lt;a href="https://twitter.com/FagnerBrack"&gt;Twitter&lt;/a&gt;, &lt;a href="https://www.linkedin.com/in/fagnerbrack/"&gt;LinkedIn&lt;/a&gt; or &lt;a href="http://github.com/FagnerMartinsBrack"&gt;Github&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>programming</category>
      <category>learnprogramming</category>
      <category>webdev</category>
      <category>technology</category>
    </item>
    <item>
      <title>Book Summary: Programming Pearls</title>
      <dc:creator>Fagner Brack</dc:creator>
      <pubDate>Tue, 16 May 2023 10:24:30 +0000</pubDate>
      <link>https://dev.to/fagnerbrack/book-summary-programming-pearls-47gn</link>
      <guid>https://dev.to/fagnerbrack/book-summary-programming-pearls-47gn</guid>
      <description>&lt;h4&gt;
  
  
  by Jon Bentley
&lt;/h4&gt;

&lt;p&gt;“Programming Pearls” is a classic text in the field of computer science, offering a series of practical problems and their solutions to foster problem-solving skills. The book holds substantial relevance for software engineers as it encourages critical and creative thinking to tackle complex programming challenges.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--KpRn1w2l--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn-images-1.medium.com/max/1024/1%2AwPhXSXpbEi9q1LlYeJ-oLQ.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--KpRn1w2l--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn-images-1.medium.com/max/1024/1%2AwPhXSXpbEi9q1LlYeJ-oLQ.jpeg" alt="" width="800" height="1084"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;However, it’s important to note that this text is more academically inclined, focusing heavily on algorithms and data structures. In real-life programming scenarios, especially given the processing power of modern computers, we don’t always need to rely on the most optimized algorithms. Often, understanding and solving the business problem at hand can lead to solutions that may not involve complex algorithms, an aspect not deeply explored in the book.&lt;/p&gt;

&lt;p&gt;The most valuable points from the book are:&lt;/p&gt;

&lt;h4&gt;
  
  
  Problem-Solving and Program Design
&lt;/h4&gt;

&lt;p&gt;The book emphasizes the importance of thoughtful problem-solving and careful program design, arguing that it’s not enough to write code that works but that good code should also be efficient, readable, and maintainable.&lt;/p&gt;

&lt;p&gt;For example, in one chapter, Bentley discusses the problem of sorting a large file of numbers and shows how a simple algorithm can be more efficient than a complex one when taking into account the constraints of the problem. Also, he demonstrates a case where a clever application of binary search can significantly speed up a seemingly simple text formatting task.&lt;/p&gt;

&lt;h4&gt;
  
  
  Efficiency and Performance
&lt;/h4&gt;

&lt;p&gt;Bentley discusses the importance of writing efficient code and understanding how different algorithms and data structures can affect the performance of a program. He provides a variety of examples and case studies to illustrate these points.&lt;/p&gt;

&lt;p&gt;For example, in one problem, he discusses the trade-offs between using an array or a linked list to implement a word processing program. Also, Bentley shows how small changes in an algorithm can lead to significant improvements in performance, such as the use of a binary search instead of a linear search in a word lookup program.&lt;/p&gt;

&lt;h4&gt;
  
  
  Testing and Debugging
&lt;/h4&gt;

&lt;p&gt;The book also focuses on the importance of rigorous testing and debugging, highlighting the need to consider edge cases and potential sources of error. Bentley provides a number of strategies for testing and debugging and emphasizes the value of a systematic approach to finding and fixing bugs.&lt;/p&gt;

&lt;p&gt;For example, in a chapter about testing, he describes a systematic approach to testing a binary search algorithm, using a set of carefully chosen test cases to ensure that all possible edge cases are covered. Also, Bentley illustrates how a methodical approach to debugging can help locate the source of an error in a complex program.&lt;/p&gt;

&lt;h4&gt;
  
  
  Algorithm Design and Data Structures
&lt;/h4&gt;

&lt;p&gt;“Programming Pearls” delves into various algorithm design techniques and data structures, providing practical applications and solutions. Bentley’s approach is to take a problem, analyze it, and solve it using the most appropriate data structures and algorithms.&lt;/p&gt;

&lt;p&gt;For example, he illustrates how using a heap data structure can help solve the problem of finding the kth largest number in an array efficiently. Also, Bentley demonstrates how a well-designed algorithm can drastically reduce the time complexity of a problem, such as finding anagrams.&lt;/p&gt;

&lt;p&gt;By focusing on practical problem-solving, thoughtful design, and careful implementation, “Programming Pearls” provides valuable insights for software engineers and anyone interested in improving their programming algorithm skills.&lt;/p&gt;

&lt;p&gt;Thanks for reading. If you have feedback, contact me on &lt;a href="https://twitter.com/FagnerBrack"&gt;Twitter&lt;/a&gt;, &lt;a href="https://www.linkedin.com/in/fagnerbrack/"&gt;LinkedIn&lt;/a&gt; or &lt;a href="http://github.com/FagnerMartinsBrack"&gt;Github&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>softwaredevelopment</category>
      <category>coding</category>
      <category>programming</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Detection of AI-Generated Text and the P vs NP Problem</title>
      <dc:creator>Fagner Brack</dc:creator>
      <pubDate>Sun, 14 May 2023 22:01:55 +0000</pubDate>
      <link>https://dev.to/fagnerbrack/detection-of-ai-generated-text-and-the-p-vs-np-problem-90c</link>
      <guid>https://dev.to/fagnerbrack/detection-of-ai-generated-text-and-the-p-vs-np-problem-90c</guid>
      <description>&lt;p&gt;The detection of AI-generated text has become a hot topic nowadays. However, the relationship between this challenge and the P vs NP problem, one of the most enigmatic questions in computer science, sheds light on the true complexity of the task. Dive into this captivating exploration to learn why AI-generated text detection may be an unattainable goal unless you've found the solution for the P vs NP problem.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--0XmAXo5k--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn-images-1.medium.com/max/1024/1%2AKFg_EDnDcbhLMWYPf7mVCQ.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--0XmAXo5k--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn-images-1.medium.com/max/1024/1%2AKFg_EDnDcbhLMWYPf7mVCQ.jpeg" alt="" width="800" height="800"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  The P vs NP Problem: A Brief Overview
&lt;/h4&gt;

&lt;p&gt;The P vs NP problem is a fundamental question in computer science that has puzzled mathematicians and programmers for decades. It revolves around the relationship between two classes of problems: those that are solvable in polynomial time (P) and those whose solutions can only be verified in polynomial time but are much harder to solve (NP).&lt;/p&gt;

&lt;p&gt;P problems are considered “easy” to solve because they can be tackled efficiently by algorithms. Examples include sorting a list of numbers, finding the shortest path between two points in a graph, or determining if a number is prime.&lt;/p&gt;

&lt;p&gt;NP problems, on the other hand, are those for which solutions can be verified quickly, but finding a solution may be time-consuming. Examples include the travelling salesperson problem, where the goal is to find the shortest route that visits a series of cities and returns to the starting point, or the subset sum problem, which involves finding a subset of numbers that sum to a given target value.&lt;/p&gt;

&lt;p&gt;The P vs NP question asks two questions:&lt;/p&gt;

&lt;p&gt;Is every problem in NP also in P &lt;strong&gt;(P = NP)&lt;/strong&gt;?&lt;/p&gt;

&lt;p&gt;In other words, does every problem whose solution can be quickly verified also has an efficient algorithm to find the solution? If P equals NP, it would mean that even the most complex problems have efficient algorithms to solve them, which would have profound implications for cryptography, optimization, and many other fields.&lt;/p&gt;

&lt;p&gt;Are some problems in NP but not in P &lt;strong&gt;(P ≠ NP)&lt;/strong&gt;?&lt;/p&gt;

&lt;p&gt;In other words, do some problems whose solution cannot be quickly verified NOT have an efficient algorithm to find the solution? If P does not equal NP, then there are problems that are inherently more difficult to solve than to check.&lt;/p&gt;

&lt;p&gt;Today, all of our cryptography infrastructure is built under the assumption that P ≠ NP, so anything that proves them wrong is worth global news for a long, long time. More than when we came up with the Theory of Relativity.&lt;/p&gt;

&lt;p&gt;The Clay Mathematics Institute has designated the P vs NP problem as one of its &lt;a href="https://www.claymath.org/millennium-problems"&gt;seven Millennium Prize Problems&lt;/a&gt;, offering a $1 million prize to anyone who can provide a correct solution. Despite decades of research, no one has been able to prove whether P equals NP or not, and the question remains one of the most significant open problems in computer science, with a million-dollar prize for whoever solves it.&lt;/p&gt;

&lt;h4&gt;
  
  
  The Connection between P vs NP and AI Text Detection
&lt;/h4&gt;

&lt;p&gt;One-way hashes are mathematical functions that take an input (or “message”) and return a fixed-size string of bytes, usually as a hash value. The output appears random and is uniquely associated with the input. Under the assumption of P ≠ NP, it’s impossible to reverse-engineer the input from the output and even small changes to the input result in vastly different hash values. One-way hashes are widely used in cryptography, password storage, and data integrity verification.&lt;/p&gt;

&lt;p&gt;hash = fn(message)&lt;/p&gt;

&lt;p&gt;Now, let’s connect one-way hashes, the P vs NP problem, and AI-generated text detection. AI-generated content is produced by complex algorithms, such as large language models (LLMs), which are designed to create human-like text. The process of generating text from these models is a black box and can be thought of as a one-way function, similar to a hash function. Under the P ≠ NP assumption, once the text is generated, it’s incredibly difficult to determine the exact model, its parameters, or the prompt used to create the text.&lt;/p&gt;

&lt;p&gt;content = fn(prompt)&lt;/p&gt;

&lt;p&gt;Detecting AI-generated text is an NP problem because, although it might be possible to verify whether a given text is AI-generated, finding an efficient algorithm to consistently and accurately identify AI-generated content remains elusive. If P were equal to NP, an efficient algorithm would exist, enabling us to accurately detect AI-generated text without false positives.&lt;/p&gt;

&lt;p&gt;However, since the P vs NP question remains unsolved, we don’t know if such an algorithm exists, and you have to be very sceptical of anyone who claims they found one and didn't win the million-dollar prize yet. They might have found an algorithm without touching the P/NP problem, but that discovery will be as groundbreaking. It's one thing to break a hash function that you can inspect and test reproducibly; another completely different is to reverse-engineer an LLM which is changing all the time and may not yield the same response for the same input prompt. You can use the same seed, but updates to the model will change the behaviour regardless.&lt;/p&gt;

&lt;h4&gt;
  
  
  Current AI Generation Tools and Their Limitations
&lt;/h4&gt;

&lt;p&gt;In practice, detecting AI-generated text is challenging because these algorithms produce increasingly human-like content, making it hard to differentiate from genuine human writing. Additionally, AI-generated text can be modified with simple edits, further evading detection. For example, give me any AI-generated content, and I can bypass any detector with less than 5 edits for every 1000 words.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://twitter.com/0xgaut/status/1648383977139363841"&gt;For example: According to the AI content detector, “ZeroGPT,” 92.26% of the United States Constitution was allegedly written by AI.&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;As a result, without a breakthrough in solving the P vs NP problem (such as proving P = NP) or a breakthrough in an AI detection algorithm (which is almost impossible because AI is a dynamic everchanging black box), it’s unlikely that we’ll develop a foolproof method to detect AI-generated content without false positives. It will be a game of catchup where every model update will change its default template and trigger a change to every AI Detection algorithm.&lt;/p&gt;

&lt;h4&gt;
  
  
  The Unlikely Solution: P = NP
&lt;/h4&gt;

&lt;p&gt;In the context of AI-generated text detection, proving that P equals NP could have significant implications. If P were equal to NP, it would mean that an efficient algorithm exists for all problems whose solutions can be verified quickly, including the detection of AI-generated text. This would allow for the development of a foolproof method to identify machine-generated content without false positives or false negatives, ultimately enhancing the accuracy and reliability of AI text detection.&lt;/p&gt;

&lt;p&gt;However, proving P = NP does not automatically provides the answer. It's possible to prove P = NP or P ≠ NP without actually providing an example.&lt;/p&gt;

&lt;p&gt;Also, the likelihood of proving P equals NP remains uncertain, as the question has persisted as one of the most challenging and enigmatic problems in computer science. If someone were to successfully demonstrate that P equals NP, they would not only revolutionize the field but also receive substantial rewards and recognition.&lt;/p&gt;

&lt;p&gt;Additionally, solving the problem would likely lead to international acclaim, a lasting impact on various industries, and potential advancements in cryptography, optimization, and other fields that rely on complex problem-solving algorithms. That person (or team) would definitely win a &lt;a href="https://en.wikipedia.org/wiki/Turing_Award"&gt;Turing Award&lt;/a&gt;.&lt;/p&gt;

&lt;h4&gt;
  
  
  An impossible task?
&lt;/h4&gt;

&lt;p&gt;The detection of AI-generated text remains an elusive goal, closely tied to the unsolved P vs NP problem. Until this enigma is unravelled, confidently identifying AI-generated content remains a distant dream. In the meantime, be very sceptical of those who promise to be "AI detectors", and how they managed to do so without solving a problem that nobody else was able to.&lt;/p&gt;

&lt;p&gt;Do you know anyone who claims who have developed an AI-generated text? Hit me up, and I will put them to the challenge.&lt;/p&gt;

&lt;p&gt;Thanks for reading. If you have feedback, contact me on &lt;a href="https://twitter.com/FagnerBrack"&gt;Twitter&lt;/a&gt;, &lt;a href="https://www.linkedin.com/in/fagnerbrack/"&gt;LinkedIn&lt;/a&gt; or &lt;a href="http://github.com/FagnerMartinsBrack"&gt;Github&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Related Material&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=-UrdExQW0cs"&gt;How quantum computers will be able to decrypt RSA in 10 years' time&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>computerscience</category>
      <category>ai</category>
      <category>programming</category>
      <category>technology</category>
    </item>
    <item>
      <title>Book Summary: Domain-Driven Design Distilled</title>
      <dc:creator>Fagner Brack</dc:creator>
      <pubDate>Sat, 13 May 2023 22:01:38 +0000</pubDate>
      <link>https://dev.to/fagnerbrack/book-summary-domain-driven-design-distilled-1760</link>
      <guid>https://dev.to/fagnerbrack/book-summary-domain-driven-design-distilled-1760</guid>
      <description>&lt;h4&gt;
  
  
  by Vaughn Vernon
&lt;/h4&gt;

&lt;p&gt;“Domain-Driven Design Distilled” (AKA DeDeDe-DeDe-DeDe…) is a sequel to the previous DDD book from Vaugh Vernon. It's a concise guide to understanding and implementing Domain-Driven Design (DDD) principles in software development. The book focuses on the core concepts of DDD, with practical examples to help developers apply these principles in real-world projects.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--ujtIOHZu--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn-images-1.medium.com/max/600/1%2A9-TX48GBKhooX1kDjQrxHQ.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--ujtIOHZu--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn-images-1.medium.com/max/600/1%2A9-TX48GBKhooX1kDjQrxHQ.jpeg" alt="" width="600" height="786"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The most valuable points from the book are:&lt;/p&gt;

&lt;h4&gt;
  
  
  Ubiquitous Language
&lt;/h4&gt;

&lt;p&gt;Ubiquitous Language is a shared vocabulary between domain experts and developers to facilitate clear communication and ensure a shared understanding of the domain. The book recommends this common language be used throughout the development process, from requirements gathering to implementation.&lt;/p&gt;

&lt;p&gt;For example, when developing an e-commerce system, domain experts and developers should use the same terms, such as “Order,” “Product,” and “Customer,” to avoid confusion and miscommunication.&lt;/p&gt;

&lt;h4&gt;
  
  
  Bounded Context
&lt;/h4&gt;

&lt;p&gt;Bounded Context is a concept that emphasizes the importance of defining clear boundaries around a particular domain or subdomain, ensuring that models and concepts within the context remain consistent and coherent.&lt;/p&gt;

&lt;p&gt;For example, in a large organization with multiple departments, each department might have its own Bounded Context, ensuring that the models and concepts within each department are consistent and do not leak into other departments. This is "loose coupling and cohesion".&lt;/p&gt;

&lt;h4&gt;
  
  
  Entities, Value Objects, and Aggregates
&lt;/h4&gt;

&lt;p&gt;DDD distinguishes between Entities, Value Objects, and Aggregates as the core building blocks of domain models. Entities have a unique identity and lifecycle, while Value Objects are immutable and represent a specific value. Aggregates are clusters of related domain objects that are treated as a single unit for consistency and transactional purposes.&lt;/p&gt;

&lt;p&gt;For example, in a banking system, an Account can be an Entity, a MonetaryAmount can be a Value Object, and a BankTransaction can be an Aggregate that consists of multiple related objects, such as Debit and Credit.&lt;/p&gt;

&lt;h4&gt;
  
  
  Domain Events
&lt;/h4&gt;

&lt;p&gt;Domain Events are occurrences within the domain that triggers a change in state or a business process. They are used to decouple components and promote a more modular, event-driven architecture. This is different than any other concept of "event", which may carry a different meaning, say a NodeJS event.&lt;/p&gt;

&lt;p&gt;For example, in an e-commerce system, a ProductSold event can be triggered when a customer completes a purchase, allowing other components to react to this event, such as updating inventory or sending a confirmation email.&lt;/p&gt;

&lt;h4&gt;
  
  
  Repositories and Factories
&lt;/h4&gt;

&lt;p&gt;Repositories and Factories are patterns used in DDD to manage the lifecycle of domain objects (usually Aggregates). Repositories are responsible for persisting and retrieving domain objects, while Factories handle the creation and initialization of domain objects.&lt;/p&gt;

&lt;p&gt;For example, an OrderRepository can be responsible for saving and retrieving Order domain objects, while an OrderFactory can create new Order objects based on specific business rules.&lt;/p&gt;

&lt;h4&gt;
  
  
  Strategic Design and Context Mapping
&lt;/h4&gt;

&lt;p&gt;Strategic Design and Context Mapping are techniques used in DDD to manage the complexity of large-scale systems and the relationships between different Bounded Contexts. Context Mapping helps identify dependencies, overlaps, and potential conflicts between different Bounded Contexts.&lt;/p&gt;

&lt;p&gt;For example, when integrating multiple systems, Context Mapping can be used to identify areas of potential misalignment or integration challenges.&lt;/p&gt;

&lt;p&gt;Related read: &lt;a href="https://ziobrando.blogspot.com/2013/11/introducing-event-storming.html"&gt;Event Storming&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;By understanding and applying the core principles of Domain-Driven Design, developers can create more maintainable, scalable, and robust software systems that accurately model complex business domains and facilitate better communication between domain experts and developers.&lt;/p&gt;

&lt;p&gt;Now you know when someone invokes DeDeDeDeDeDe… they're ok, and it's an actual thing; no need to call an ambulance.&lt;/p&gt;

&lt;p&gt;Thanks for reading. If you have feedback, contact me on &lt;a href="https://twitter.com/FagnerBrack"&gt;Twitter&lt;/a&gt;, &lt;a href="https://www.linkedin.com/in/fagnerbrack/"&gt;LinkedIn&lt;/a&gt; or &lt;a href="http://github.com/FagnerMartinsBrack"&gt;Github&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>softwareengineering</category>
      <category>softwaredevelopment</category>
      <category>programming</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Book Summary: Implementing Domain-Driven Design</title>
      <dc:creator>Fagner Brack</dc:creator>
      <pubDate>Fri, 12 May 2023 22:01:01 +0000</pubDate>
      <link>https://dev.to/fagnerbrack/book-summary-implementing-domain-driven-design-5egg</link>
      <guid>https://dev.to/fagnerbrack/book-summary-implementing-domain-driven-design-5egg</guid>
      <description>&lt;h4&gt;
  
  
  by Vaughn Vernon
&lt;/h4&gt;

&lt;p&gt;“Implementing Domain-Driven Design” is a comprehensive guide to applying Domain-Driven Design (DDD) principles in real-world software projects. The book provides practical examples, best practices, and in-depth explanations of DDD concepts to help developers create maintainable and scalable software systems.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--8hJ1hBHY--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn-images-1.medium.com/max/600/1%2AHTOYnkHPXXBkAFJMxpPAkw.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--8hJ1hBHY--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn-images-1.medium.com/max/600/1%2AHTOYnkHPXXBkAFJMxpPAkw.jpeg" alt="" width="600" height="818"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The most valuable points from the book are:&lt;/p&gt;

&lt;h4&gt;
  
  
  Building a Rich Domain Model
&lt;/h4&gt;

&lt;p&gt;Creating a rich domain model that accurately represents the business domain is crucial in DDD. This involves identifying key domain concepts, such as Entities, Value Objects, and Aggregates, and modelling their relationships, behaviours, and constraints.&lt;/p&gt;

&lt;p&gt;For example, in an e-commerce application, the domain model should represent concepts like Customer, Order, and Product, along with their respective behaviours and business rules.&lt;/p&gt;

&lt;h4&gt;
  
  
  Context Mapping and Integration Patterns
&lt;/h4&gt;

&lt;p&gt;Context Mapping is essential for understanding the relationships between different Bounded Contexts in a large-scale system. The book discusses various integration patterns for communication between Bounded Contexts, such as Shared Kernel, Customer-Supplier, and Anti-Corruption Layer.&lt;/p&gt;

&lt;p&gt;For example, an Anti-Corruption Layer can be used to isolate a legacy system from a new system, ensuring that the new system remains decoupled from the legacy system’s model and implementation details.&lt;/p&gt;

&lt;h4&gt;
  
  
  Domain Events and Event-Driven Architecture
&lt;/h4&gt;

&lt;p&gt;Domain Events represent significant occurrences in the domain and can be used to decouple components and create an event-driven architecture. The book explains how to design, publish, and handle Domain Events to improve system modularity and scalability.&lt;/p&gt;

&lt;p&gt;For example, an OrderShipped Domain Event can be published when an order is shipped, allowing other components to react to this event, such as updating the customer’s order history or sending a shipping confirmation email.&lt;/p&gt;

&lt;h4&gt;
  
  
  Applying DDD to Legacy Systems
&lt;/h4&gt;

&lt;p&gt;The book provides guidance on applying DDD principles to legacy systems, including strategies for refactoring, modularization, and incremental improvements while preserving existing functionality.&lt;/p&gt;

&lt;p&gt;For example, a monolithic legacy application can be gradually refactored into multiple Bounded Contexts, making it easier to manage, maintain, and evolve over time.&lt;/p&gt;

&lt;h4&gt;
  
  
  Team Collaboration and Organization
&lt;/h4&gt;

&lt;p&gt;Implementing DDD effectively can't be done in silos. It requires close collaboration between domain experts, developers, and other stakeholders. The book discusses techniques for fostering collaboration, such as Event Storming, which is a collaborative modelling technique that helps teams explore and understand complex business domains.&lt;/p&gt;

&lt;p&gt;For example, during an Event Storming session, domain experts and developers can work together to identify key domain events, commands, and aggregates, leading to a shared understanding of the domain and a more effective domain model.&lt;/p&gt;

&lt;h4&gt;
  
  
  Tactical Patterns and Techniques
&lt;/h4&gt;

&lt;p&gt;The book covers various tactical patterns and techniques for implementing DDD, such as Repository and Factory patterns, Specification pattern for complex validation and querying, and designing Aggregate roots for consistency and transactional boundaries.&lt;/p&gt;

&lt;p&gt;For example, a UserRepository can be used to manage the persistence of User Entities, while a UserFactory can handle the creation and initialization of User instances based on specific business rules.&lt;/p&gt;

&lt;p&gt;By providing practical examples, best practices, and in-depth explanations of DDD concepts, “Implementing Domain-Driven Design” serves as a valuable resource for developers looking to create maintainable, scalable, and robust software systems that accurately model complex business domains.&lt;/p&gt;

&lt;p&gt;Thanks for reading. If you have feedback, contact me on &lt;a href="https://twitter.com/FagnerBrack"&gt;Twitter&lt;/a&gt;, &lt;a href="https://www.linkedin.com/in/fagnerbrack/"&gt;LinkedIn&lt;/a&gt; or &lt;a href="http://github.com/FagnerMartinsBrack"&gt;Github&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>coding</category>
      <category>programming</category>
      <category>webdev</category>
      <category>softwareengineering</category>
    </item>
    <item>
      <title>Book Summary: RESTful Web Clients - Enabling Reuse Through Hypermedia</title>
      <dc:creator>Fagner Brack</dc:creator>
      <pubDate>Thu, 11 May 2023 22:01:38 +0000</pubDate>
      <link>https://dev.to/fagnerbrack/book-summary-restful-web-clients-enabling-reuse-through-hypermedia-2k1g</link>
      <guid>https://dev.to/fagnerbrack/book-summary-restful-web-clients-enabling-reuse-through-hypermedia-2k1g</guid>
      <description>&lt;h4&gt;
  
  
  by Mike Amundsen
&lt;/h4&gt;

&lt;p&gt;“RESTful Web Clients: Enabling Reuse Through Hypermedia” provides insights into designing and building RESTful web clients that effectively consume and interact with web services. The book emphasizes the importance of leveraging hypermedia and existing web standards to create reusable and flexible clients.&lt;/p&gt;

&lt;p&gt;It talks about REST as an Architectural Style for Distributed Systems based on &lt;a href="https://www.ics.uci.edu/~fielding/pubs/dissertation/top.htm"&gt;Roy Fielding's Dissertation&lt;/a&gt;, not the way REST is used in the wild, which is RPC over HTTP using JSON.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;DISCLAIMER:&lt;/strong&gt; The code examples are not taken from the book.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--4SzpT7_F--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn-images-1.medium.com/max/1024/1%2AGpwwdQ51DeyLezEVBy1VHg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--4SzpT7_F--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn-images-1.medium.com/max/1024/1%2AGpwwdQ51DeyLezEVBy1VHg.png" alt="" width="800" height="1050"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The most valuable points from the book are:&lt;/p&gt;

&lt;h4&gt;
  
  
  Understanding RESTful Web Services
&lt;/h4&gt;

&lt;p&gt;The book starts by providing a solid understanding of RESTful web services, focusing on the concepts of resources, representations, and hypermedia.&lt;/p&gt;

&lt;h4&gt;
  
  
  Hypermedia-Driven Web Clients
&lt;/h4&gt;

&lt;p&gt;Mike emphasizes the importance of designing web clients that are driven by hypermedia, allowing them to adapt to changes in the web service without requiring updates.&lt;/p&gt;

&lt;p&gt;For example, a web client uses hypermedia controls provided by the web service to navigate through resources and perform actions, ensuring that the client can adapt to changes in the API without breaking.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// Control response for media types with +json suffix
{
  actions: [{
    name: 'prev',
    target: 'http://server.com/resource-a',
    method: 'POST'
  }, {
    name: 'next',
    target: 'http://server.com/resource-b',
    method: 'PUT'
  }]
};
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Leveraging Web Standards
&lt;/h4&gt;

&lt;p&gt;The book highlights the importance of using existing web standards such as HTML, CSS, and JavaScript to build RESTful web clients, enabling reuse and reducing development effort.&lt;/p&gt;

&lt;p&gt;For example, a developer builds a web client using HTML and JavaScript, allowing it to be used across various platforms and devices without the need for additional development.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;!-- Navigation interception using Code on Demand --&amp;gt;
&amp;lt;script&amp;gt;
  [...document.querySelectorAll('form')].forEach((action) =&amp;gt; {
    action.addEventListener('submit', (event) =&amp;gt; {
      event.preventDefault();
      // Custom handling of navigation
    });
  });

&amp;lt;/script&amp;gt;

&amp;lt;!-- Control response for text/html media type --&amp;gt;
&amp;lt;form name="prev" method="POST" action="http://server.com/resource-a"&amp;gt;
  &amp;lt;button type="submit"&amp;gt;&amp;lt;/button&amp;gt;
&amp;lt;/form&amp;gt;
&amp;lt;form name="next" method="POST" action="http://server.com/resource-b"&amp;gt;
  &amp;lt;button type="submit"&amp;gt;&amp;lt;/button&amp;gt;
&amp;lt;/form&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Web Client Patterns and Anti-Patterns
&lt;/h4&gt;

&lt;p&gt;The author discusses various patterns and anti-patterns for building RESTful web clients, helping developers avoid common pitfalls and build more robust and maintainable clients.&lt;/p&gt;

&lt;p&gt;For example, a developer learns to avoid tightly coupling the web client to a specific API structure, ensuring that the client remains flexible and adaptable to changes in the web service.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const response = {
  actions: [{
    name: 'prev',
    target: 'http://server.com/resource-a',
    method: 'POST'
  }, {
    name: 'next',
    target: 'http://server.com/resource-b',
    method: 'PUT'
  }]
};

// This:
const query = queriable(response);
const action = {
  url: query('actions[name="prev"]-&amp;gt;["target"]') || '' // self,
  method: query('actions[name="prev"]-&amp;gt;["method"]') || 'GET'
};
const response = await fetch(action);

// Instead of this:
const action = {
  url: response.actions[0].target,
  method: response.actions[0].method
};
const response = await fetch(action);
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Building Custom Web Clients
&lt;/h4&gt;

&lt;p&gt;The book provides guidance on building custom web clients that can work with different media types and hypermedia controls, increasing the reusability and flexibility of the clients.&lt;/p&gt;

&lt;p&gt;For example, a developer creates a custom web client that can handle various media types through Content Negotiation, such as XML and JSON, allowing it to work with different web services without requiring significant modification.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const HALResponse = await fetch({
  ...
  headers: {
    'Accept': 'application/hal+json'
  }
});

const HTMLResponse = await fetch({
  ...
  headers: {
    'Accept': 'text/html'
  }
});
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;By applying the concepts and best practices presented in “RESTful Web Clients: Enabling Reuse Through Hypermedia,” developers can build more flexible, maintainable, and reusable web clients that effectively interact with RESTful web services inside and outside an organization.&lt;/p&gt;

&lt;p&gt;Thanks for reading. If you have feedback, contact me on &lt;a href="https://twitter.com/FagnerBrack"&gt;Twitter&lt;/a&gt;, &lt;a href="https://www.linkedin.com/in/fagnerbrack/"&gt;LinkedIn&lt;/a&gt; or &lt;a href="http://github.com/FagnerMartinsBrack"&gt;Github&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>rest</category>
      <category>softwareengineering</category>
      <category>programming</category>
      <category>frontend</category>
    </item>
  </channel>
</rss>
