<?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: Mišo</title>
    <description>The latest articles on DEV Community by Mišo (@misobelica).</description>
    <link>https://dev.to/misobelica</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%2F217789%2Fa900b199-ccaa-46f0-bbdd-9e737004bd40.jpeg</url>
      <title>DEV Community: Mišo</title>
      <link>https://dev.to/misobelica</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/misobelica"/>
    <language>en</language>
    <item>
      <title>Correct exception names in Javascript</title>
      <dc:creator>Mišo</dc:creator>
      <pubDate>Wed, 22 Nov 2023 16:56:04 +0000</pubDate>
      <link>https://dev.to/misobelica/correct-exception-names-in-javascript-1md7</link>
      <guid>https://dev.to/misobelica/correct-exception-names-in-javascript-1md7</guid>
      <description>&lt;p&gt;If you have your own exception hierarchy in the app you probably noticed your perfectly named exceptions show like this in the console or &lt;a href="https://sentry.io/" rel="noopener noreferrer"&gt;Sentry&lt;/a&gt;: &lt;code&gt;Error: something happened and I don't like it&lt;/code&gt;. The &lt;code&gt;Error&lt;/code&gt; prefix is the name of the exception. I would expect something like this &lt;code&gt;MalformedData: I like different data more. Got: "bad data"&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;The trick is to set a &lt;code&gt;name&lt;/code&gt; attribute of the &lt;code&gt;Error&lt;/code&gt;. People do it in every exception in constructor like this.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;AppException&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="nc"&gt;Error&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;ResourceNotFound&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="nc"&gt;AppException&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nf"&gt;constructor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="nx"&gt;resource&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;unknown&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;super&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`The resource '&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;resource&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;' with id &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; is not found.`&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;ResourceNotFound&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;MalformedData&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="nc"&gt;AppException&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nf"&gt;constructor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;unknown&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;super&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`I like different data more. Got: &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;stringify&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;)}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;MalformedData&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It is very repetitive and you can forget to do it easily. Also, if you don't need a special constructor for your exception it adds some boiler plate. It can be shortened by setting the name directly:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;ResourceNotFound&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="nc"&gt;AppException&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;override&lt;/span&gt; &lt;span class="k"&gt;readonly&lt;/span&gt; &lt;span class="nx"&gt;name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;ResourceNotFound&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;But the ultimate solution for me is to set it once in the top-level exception and let it be derived automatically. Setting it to &lt;code&gt;readonly&lt;/code&gt; prevents people overwriting it too.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;AppException&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="nc"&gt;Error&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;override&lt;/span&gt; &lt;span class="k"&gt;readonly&lt;/span&gt; &lt;span class="nx"&gt;name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="kd"&gt;constructor&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
      <category>javascript</category>
    </item>
    <item>
      <title>AI tools to try</title>
      <dc:creator>Mišo</dc:creator>
      <pubDate>Sun, 30 Apr 2023 17:19:55 +0000</pubDate>
      <link>https://dev.to/misobelica/ai-tools-to-try-a4o</link>
      <guid>https://dev.to/misobelica/ai-tools-to-try-a4o</guid>
      <description>&lt;p&gt;&lt;a href="https://learnprompting.org/" rel="noopener noreferrer"&gt;https://learnprompting.org/&lt;/a&gt; - how to write good prompts to get best results from AI chatbots.&lt;br&gt;
&lt;a href="https://www.perplexity.ai/" rel="noopener noreferrer"&gt;https://www.perplexity.ai/&lt;/a&gt; - AI powered search engine.&lt;br&gt;
&lt;a href="https://consensus.app/" rel="noopener noreferrer"&gt;https://consensus.app/&lt;/a&gt; - AI powered search engine in the research papers.&lt;br&gt;
&lt;a href="https://www.d-id.com/" rel="noopener noreferrer"&gt;https://www.d-id.com/&lt;/a&gt; - animated avatars from text to image without any technical knowledge.&lt;br&gt;
&lt;a href="https://paintbytext.chat/" rel="noopener noreferrer"&gt;https://paintbytext.chat/&lt;/a&gt; - edit images by text.&lt;br&gt;
&lt;a href="https://this-person-does-not-exist.com/" rel="noopener noreferrer"&gt;https://this-person-does-not-exist.com/&lt;/a&gt; - generate random face photo of person.&lt;br&gt;
&lt;a href="https://askyourpdf.com/" rel="noopener noreferrer"&gt;https://askyourpdf.com/&lt;/a&gt; - upload PDF and ask any questions about its content.&lt;br&gt;
&lt;a href="https://lexica.art/" rel="noopener noreferrer"&gt;https://lexica.art/&lt;/a&gt; - generate or search previously generated images.&lt;br&gt;
&lt;a href="https://play.vercel.ai/" rel="noopener noreferrer"&gt;https://play.vercel.ai/&lt;/a&gt; - try and compare the prompt by different models.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>tooling</category>
    </item>
    <item>
      <title>Alternative services without tracking</title>
      <dc:creator>Mišo</dc:creator>
      <pubDate>Sun, 30 Apr 2023 16:37:52 +0000</pubDate>
      <link>https://dev.to/misobelica/alternative-services-without-tracking-1f20</link>
      <guid>https://dev.to/misobelica/alternative-services-without-tracking-1f20</guid>
      <description>&lt;p&gt;&lt;a href="https://fonts.bunny.net/" rel="noopener noreferrer"&gt;https://fonts.bunny.net/&lt;/a&gt; - Google Fonts without tracking by switching the domain only.&lt;br&gt;
&lt;a href="https://www.simpleanalytics.com/" rel="noopener noreferrer"&gt;https://www.simpleanalytics.com/&lt;/a&gt; - The privacy-first&lt;br&gt;
Google Analytics alternative.&lt;br&gt;
&lt;a href="https://nolog.cz/" rel="noopener noreferrer"&gt;https://nolog.cz/&lt;/a&gt; - Czech movement managing and offering services without collecting user's data.&lt;/p&gt;

</description>
      <category>gdpr</category>
      <category>privacy</category>
    </item>
    <item>
      <title>How I hire Anyor developers to not regret</title>
      <dc:creator>Mišo</dc:creator>
      <pubDate>Sat, 09 Apr 2022 18:10:46 +0000</pubDate>
      <link>https://dev.to/misobelica/how-i-hire-anyor-developers-to-not-regret-bko</link>
      <guid>https://dev.to/misobelica/how-i-hire-anyor-developers-to-not-regret-bko</guid>
      <description>&lt;p&gt;I did quite a lot of technical interviews and I wanted to keep some guidelines to my future myself and improve it over time. The most of the interviews I did was for backend positions (Kotlin, Java, Python, Node.js) but I also did some frontend interviews (TypeScript, React.js).&lt;/p&gt;

&lt;p&gt;I believe that no interview gives 100% proof that the candidate is a good fit. The point of my interviews was to know if the candidate has really basic understanding of the technology used and fits into the team personally. But that don't mean to refuse the candidate with different thinking. The diversity is also important in the team. For anything more deep the transition period is needed unfortunately.&lt;/p&gt;

&lt;p&gt;I start with some not so interesting preparation notes here but you can jump directly to the technical section.&lt;/p&gt;

&lt;h2&gt;
  
  
  Preparation
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Check the CV profile if the candidate sent one.&lt;/li&gt;
&lt;li&gt;Check the GitHub code or example code sent by the candidate. If there is something interesting (positive or negative) make a note so you can talk about it during the interview.&lt;/li&gt;
&lt;li&gt;Check LinkedIn, Facebook, Twitter, StackOverflow profiles. I usually google the candidate to get as many info as I can.&lt;/li&gt;
&lt;li&gt;Tell the candidate the interview usually takes from 1 to 1.5 hours and he will be writing basic the Python/Java/Kotlin/JS and SQL in an online editor. It's good to set expectations.&lt;/li&gt;
&lt;li&gt;Ask the candidate if he can bring his own notebook for it. It's better because he knows the keyboard and settings there so the code writing will be smoother. Writing on the paper or the whiteboard is not good because it is usually not readable and it takes much longer time.

&lt;ol&gt;
&lt;li&gt;If he brings it, then prepare WiFi password for him to connect to the internet during the interview.&lt;/li&gt;
&lt;li&gt;If the candidate does not bring his own notebook you need to prepare the interview notebook. Always &lt;strong&gt;check if it works and does not need updates&lt;/strong&gt;. Is there EN/DE/... keyboard installed?. Is the battery charged or is there an electric socket in the room? Are WiFi and the browser working? You will need &lt;a href="https://codeshare.io/" rel="noopener noreferrer"&gt;https://codeshare.io/&lt;/a&gt; or &lt;a href="http://collabedit.com/" rel="noopener noreferrer"&gt;http://collabedit.com/&lt;/a&gt; document prepared there (syntax highlighting for the language). You can copy and run the code in &lt;a href="https://repl.it/languages" rel="noopener noreferrer"&gt;https://repl.it/languages&lt;/a&gt;. For FE the good tool is &lt;a href="https://codesandbox.io/" rel="noopener noreferrer"&gt;CodeSandbox&lt;/a&gt;
&lt;/li&gt;
&lt;/ol&gt;


&lt;/li&gt;

&lt;li&gt;Prepare anything so you can write notes there about the interview.&lt;/li&gt;

&lt;li&gt; The good thing is to set some "secret" signal with other people if the candidate will be really bad and you will want to finish the interview as soon as possible. In that case you simply stop asking more questions, move to the outro and I often just ask him if he has any questions and let him go.&lt;/li&gt;

&lt;li&gt;Prepare a glass of clean water for the candidate and ask him if he wants coffee/tea/... :)&lt;/li&gt;

&lt;/ol&gt;

&lt;h2&gt;
  
  
  Introduction + questions
&lt;/h2&gt;

&lt;p&gt;Interview starts with small talk about the candidate and the company. I usually ask some questions below and tell the candidate about the company/architecture/tech. stack. You don't need to ask all the questions. Just those which make sense of course. And you can ask more questions specific for the candidate.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Introduction of the people&lt;/strong&gt; in the room and the team.&lt;/li&gt;
&lt;li&gt;We have a few questions for you to know you better but &lt;strong&gt;feel free to interrupt us and ask your own questions&lt;/strong&gt; anytime. Or you can start asking if you have something on your mind already.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Did you check something about the company? Maybe our websites?&lt;/strong&gt; - if yes ask the candidate to tell you what he knows so you can only clarify where he is not completely right. If not just tell him something interesting and not too long :)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;What are you working on now?.&lt;/strong&gt; - If the candidate is a student he can tell you about school and the projects there. &lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Why are you considering to leave your current company? What do you like/dislike on your current job and/or the project(s)?&lt;/strong&gt; If the candidate hates the company it's a bad sign. There will always be something what could be better but the candidate should be able to list also good things. The worst of all is when the candidate tells you how all the people there are assholes and he is the only one who saves the whole company every time. It's probably the opposite. I would probably ask for specific example of the problems or the situations when the candidate saved the company. And more than one specific example. Also, it's good to explicitly ask for good things.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;What's the most/least exciting thing you worked on?&lt;/strong&gt; - I usually ask if there were some big issues (least exciting thing :) he caused in the past and what would he change on the issue to make it properly next time?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;What do you expect from work here? What makes it an interesting company for you?&lt;/strong&gt; - You probably want to know how he knows about the company, what he thinks is better here than in other companies, ...&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Are you looking for a long term cooperation (years) or the short term (less than a year)? How long do you think you are going to stay here if the job will be OK for you?&lt;/strong&gt; - You probably want long term candidates. If the candidate tells you he plans to travel around the world in 6 months you should really consider if it's OK for you to spend 6 months with teaching him and then he leaves.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Where do you learn new things about the technology? Blogs, books, twitter, podcasts, RSS, Reddit, StackOverflow, side-projects?&lt;/strong&gt; - What book are you reading right now or you read the last time? What is your favorite blog/podcast. Simply ask about specifics of the channel he mentions. This is because everybody says they learn and read books. But you want to see which one. Even non-technical. Maybe even if you don't hire him at the end he can recommend you something inetresting :)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Is there anything what would annoy you in the office?&lt;/strong&gt; Dogs, open-space, air conditioning, noise, ... Is there anything you need to have in the office?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Was there any disagreement about what technology should be used, or about the process in the company you've been involved? How was it resolved?&lt;/strong&gt; - This is something I don't ask often, but if I feel the candidate is more conflicting type or he mentions something from the past I want to know something about these things. He should not be stubborn, but assertiveness is good.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Introduce the company tech. stack
&lt;/h2&gt;

&lt;p&gt;After all the questions it's good to tell the candidate again something about the company and more in-depth technologies used.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;The languages and the main frameworks used (Kotlin, Python, Spring, Flask, Celery, React.js, Redux, TypeScript, ...). It's good to mention also versions if that matters.&lt;/li&gt;
&lt;li&gt;GitHub/GitLab/BitBucket/&lt;a href="https://www.jetbrains.com/space/" rel="noopener noreferrer"&gt;Space&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;CI - GitHub, GitLab, Travis, Jenkins, ....&lt;/li&gt;
&lt;li&gt;Slack, M$ Teams, Space, ...&lt;/li&gt;
&lt;li&gt;Trello, Jira, Product board, Redmine, Asana, ...&lt;/li&gt;
&lt;li&gt;ELK, Graylog, Grafana&lt;/li&gt;
&lt;li&gt;Intellij IDEs/VS Code&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Ask if the candidate knows the tools. If no, it does not matter, but if yes, ask about how he used it in the work. The &lt;strong&gt;big warning sign&lt;/strong&gt; is if the &lt;strong&gt;candidate knows everything&lt;/strong&gt;. It's so called superman (with small s) and you should ask him about really specific things like:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;In what project did you used the technology? What was the use-case?&lt;/li&gt;
&lt;li&gt;Why did you choose this technology and not any other similar?&lt;/li&gt;
&lt;li&gt;What were the problems you had with the technology?&lt;/li&gt;
&lt;li&gt;What do you like about the technology?&lt;/li&gt;
&lt;li&gt;When would you use it again and when not?&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;If he knows the answers on all of them then it's probably Superman (with capital S :) but really make sure. If you hire a superman it's really painful to fire him because they know everything in theory but nothing in practice. Of course every new person should be hired only if you are at least 90% sure you want to work with the candidate, but the candidate who knows every technology is very suspicious.&lt;/p&gt;

&lt;h2&gt;
  
  
  Hard core skills&lt;a&gt;&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;This is a part where I really want to see what the candidate knows and how confident he is with his decisions and knowledge. Sometimes (OK, almost every time) I play dumb here and pretend I don't know about the answer the candidate is asking. Instead, suggest to the candidate to Google it - it's part of our job anyway. If the candidate is really confident and I would like to stress him a little I would ask him if he can find the bug in the code even if the code is absolutely OK. I ask questions like: "Are you sure? Any flaw?" To see how he reacts. But I tell him at the end that the code is really OK and it is nice job :)&lt;/p&gt;

&lt;p&gt;If you spot any minor issue, like typo in the variable name, just tell the candidate. Don't stress him/her with silly things that IDE can warn him about. This is not a school. But don't answer him a questions like "Is this OK? Is it like that?" If (s)he is not sure about what he wrote he can Google it. When the candidate is writing the code you see how it goes immediately. My strategy is to make the requirements harder and harder until I hit the spot when the candidate does not know. This spot is different for everybody. Simply stop asking when you feel you know where is the upper limit of the candidate's skills. Bellow are the questions I ask along with my favorite exercise tasks.&lt;/p&gt;

&lt;h3&gt;
  
  
  Python/Java/Kotlin/TypeScript
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Java/Kotlin: What is the (functional) interface and why does it exist? What's difference between interface and abstract class?&lt;/strong&gt; - If the candidate does not what the interface is, I would not waste the time and don't hire the candidate. The good place for the secret signal and finish the interview as soon as possible. Otherwise keep going to check the candidate's seniority :)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;What is the decorator (Python/JS) / annotation (JVM)? Can you name any? Did you write your own already?&lt;/strong&gt; - This question is about to find out if the candidate knows some more advanced features of the language, but not too advanced. I can decide within one minute based on answers if I can give him harder coding exercise or not. Also if it makes sense to ask about generics during the coding.

&lt;ul&gt;
&lt;li&gt;Java/Kotlin - &lt;code&gt;@Override&lt;/code&gt;, &lt;code&gt;@SuppressWarnings&lt;/code&gt;, &lt;code&gt;@Deprecated&lt;/code&gt; in Kotlin, &lt;code&gt;@JsonProperty&lt;/code&gt; from Jackson&lt;/li&gt;
&lt;li&gt;Python - &lt;code&gt;@property&lt;/code&gt;, &lt;code&gt;@classmethod&lt;/code&gt;, &lt;code&gt;@app.route&lt;/code&gt; from Flask&lt;/li&gt;
&lt;li&gt;Javascript - &lt;code&gt;@connect&lt;/code&gt; from Redux, &lt;code&gt;@Component&lt;/code&gt; from Angular, &lt;code&gt;@withRouter&lt;/code&gt; from React router&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;When would you use thread and when the process to scale the application and why? &lt;/li&gt;
&lt;li&gt;(Python) Do you know GIL? Can you tell us about it?&lt;/li&gt;
&lt;li&gt;Do you know any library, standard or 3rd-party, to scale your application?&lt;/li&gt;
&lt;li&gt;Do you have experience with tests? Which ones (unit, integration, E2E)? What is your favorite framework?&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Code
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Write function &lt;code&gt;find_max({1, 2, 3, 4, 5})&lt;/code&gt; (or &lt;code&gt;find_min&lt;/code&gt;) that accepts an array of numbers and returns maximum (or minimum) from them.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Can you find any issues in your implementation?&lt;/strong&gt; - Common bugs here are: 

&lt;ol&gt;
&lt;li&gt;People don't consider empty array can come - results in the Out-of-range errors.&lt;/li&gt;
&lt;li&gt;Sometimes the candidate does not know what to do when the array is empty - raising an exception or returning &lt;code&gt;null&lt;/code&gt; is OK IMHO. &lt;code&gt;NaN&lt;/code&gt; is kind of half-OK because it does not work with other objects (read later). I try to ask for something else. But returning some special string or &lt;code&gt;INT_MAX&lt;/code&gt;/&lt;code&gt;INT_MIN&lt;/code&gt;/&lt;code&gt;0&lt;/code&gt; or another weird things are no-go. Any number can be the valid result so we can't use it like special value for empty array.&lt;/li&gt;
&lt;li&gt;People don't consider negative/real numbers - these are also numbers and the function should work with them.&lt;/li&gt;
&lt;li&gt;People try to find some &lt;code&gt;MIN_INT&lt;/code&gt;/&lt;code&gt;MIN_FLOAT&lt;/code&gt; or something to initialize the maximum value - the 1st item from the array should picked instead because it can be &lt;code&gt;Decimal&lt;/code&gt; number or &lt;code&gt;complex&lt;/code&gt; number or we could change the function to accept also &lt;code&gt;DateTime&lt;/code&gt; and there is no minimal/maximal value.&lt;/li&gt;
&lt;/ol&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;strong&gt;Can you write some basic tests for your code?&lt;/strong&gt; What values makes sense to test? How many tests are enough?&lt;/li&gt;

&lt;li&gt;

&lt;strong&gt;If the basic code is OK and has no issues I change requirements a little.&lt;/strong&gt; For example, what if I wanted to call the function like &lt;code&gt;find_max(1, 2, 3, 4, 5)&lt;/code&gt; what do I need to change? You can use Google if don't know. The right term to search is "variable arguments".

&lt;ul&gt;
&lt;li&gt;Java &lt;code&gt;private static int findMax(int... items)&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Kotlin &lt;code&gt;fun findMax(vararg items: Int): Int&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Python &lt;code&gt;def find_max(*items)&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;TypeScript &lt;code&gt;function findMax(...items: number[])&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;strong&gt;What if I would like to use the function for non-number objects? Can I do it? How?&lt;/strong&gt; I want to hear about generics, comparators in Java or magic methods (for operator overloading) in Python/Kotlin/TypeScript.

&lt;ul&gt;
&lt;li&gt;Java &lt;code&gt;private static &amp;lt;T&amp;gt; T findMax(T... items, Comparator&amp;lt;T&amp;gt; comparator)&lt;/code&gt; and then &lt;code&gt;if (comparator.compare(item, maximum) &amp;gt; 0) { maximum = item; }&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Kotlin &lt;code&gt;fun &amp;lt;T&amp;gt; findMax(items: Array&amp;lt;T&amp;gt;, isFirstGreater: (a: T, b: T) -&amp;gt; Int): T&lt;/code&gt; and then &lt;code&gt;if (isFirstGreater(item, maximum)) { maximum = item }&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Python &lt;code&gt;def find_max(items, is_first_greater)&lt;/code&gt; and then &lt;code&gt;if is_first_greater(item, maximum): maximum = item&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight kotlin"&gt;&lt;code&gt;&lt;span class="cm"&gt;/** Kotlin */&lt;/span&gt;
&lt;span class="k"&gt;fun&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;Array&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nf"&gt;assert&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;findMax&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;arrayOf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;Int&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;Int&lt;/span&gt; &lt;span class="p"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt; &lt;span class="p"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;fun&lt;/span&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;T&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;findMax&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;items&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;Array&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;T&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;,&lt;/span&gt; &lt;span class="n"&gt;isFirstGreater&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;T&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;T&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nc"&gt;Boolean&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="nc"&gt;T&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;items&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;isEmpty&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="nc"&gt;IllegalArgumentException&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Empty array is not allowed"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="py"&gt;maximum&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;items&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;item&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="n"&gt;items&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;isFirstGreater&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;item&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;maximum&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;maximum&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;item&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;maximum&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Main&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
  &lt;span class="cm"&gt;/** Java */&lt;/span&gt;
  &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="o"&gt;[]&lt;/span&gt; &lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="nc"&gt;Integer&lt;/span&gt;&lt;span class="o"&gt;[]&lt;/span&gt; &lt;span class="n"&gt;numbers&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="o"&gt;};&lt;/span&gt;
    &lt;span class="k"&gt;assert&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;findMax&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;numbers&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
  &lt;span class="o"&gt;}&lt;/span&gt;

  &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="no"&gt;T&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="no"&gt;T&lt;/span&gt; &lt;span class="nf"&gt;findMax&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="no"&gt;T&lt;/span&gt;&lt;span class="o"&gt;[]&lt;/span&gt; &lt;span class="n"&gt;items&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;java&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;util&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;Comparator&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="no"&gt;T&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;comparator&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;items&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;length&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;IllegalArgumentException&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Empty array is not allowed"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;

    &lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;maximum&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;items&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;];&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;item&lt;/span&gt; &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;items&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;comparator&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;compare&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;item&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;maximum&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;maximum&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;item&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
        &lt;span class="o"&gt;}&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;maximum&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
  &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;pytest&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;find_max&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;items&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;is_first_greater&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;lambda&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;items&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;raise&lt;/span&gt; &lt;span class="nc"&gt;ValueError&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Empty array is not allowed&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="n"&gt;maximum&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;items&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;items&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;item&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;items&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nf"&gt;is_first_greater&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;item&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;maximum&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
            &lt;span class="n"&gt;maximum&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;item&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;maximum&lt;/span&gt;

&lt;span class="k"&gt;assert&lt;/span&gt; &lt;span class="nf"&gt;find_max&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
&lt;span class="k"&gt;assert&lt;/span&gt; &lt;span class="nf"&gt;find_max&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;
&lt;span class="k"&gt;assert&lt;/span&gt; &lt;span class="nf"&gt;find_max&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;
&lt;span class="k"&gt;assert&lt;/span&gt; &lt;span class="nf"&gt;find_max&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;42&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;42&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;42&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;42&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;42&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;42&lt;/span&gt;
&lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="n"&gt;pytest&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;raises&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;ValueError&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="nf"&gt;find_max&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;If I feel the developer is more experienced or he claim he is senior in CV, or has "excellent" Python/Kotlin skills I have more advanced task prepared - &lt;strong&gt;length&lt;/strong&gt; of the longest &lt;strong&gt;continuous&lt;/strong&gt; non-descending subsequence (sub-array). I ask him if he knows what it is, if not he can google it or you can tell him. The steps are the same as for the previous example. I can add generics or comparator. Also the common bugs are usually similar. But people also forget about &lt;code&gt;previous = item&lt;/code&gt; often :)
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;longest_increasing_subsequence&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;items&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;is_first_increasing&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;lambda&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;items&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;  &lt;span class="c1"&gt;# longest sequence for empty list is zero
&lt;/span&gt;
    &lt;span class="n"&gt;length&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
    &lt;span class="n"&gt;max_length&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
    &lt;span class="n"&gt;previous&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;items&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;items&lt;/span&gt;
    &lt;span class="c1"&gt;# for previous, item in zip(items, items[1:]):
&lt;/span&gt;    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;item&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;items&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nf"&gt;is_first_increasing&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;item&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;previous&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
            &lt;span class="n"&gt;length&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
        &lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="n"&gt;max_length&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;max&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;max_length&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;length&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  &lt;span class="c1"&gt;# can be if length &amp;gt; max_length: max_length = length
&lt;/span&gt;            &lt;span class="n"&gt;length&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;

        &lt;span class="n"&gt;previous&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;item&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;max&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;max_length&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;length&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;assert&lt;/span&gt; &lt;span class="nf"&gt;longest_increasing_subsequence&lt;/span&gt;&lt;span class="p"&gt;([])&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;
&lt;span class="k"&gt;assert&lt;/span&gt; &lt;span class="nf"&gt;longest_increasing_subsequence&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
&lt;span class="k"&gt;assert&lt;/span&gt; &lt;span class="nf"&gt;longest_increasing_subsequence&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;
&lt;span class="k"&gt;assert&lt;/span&gt; &lt;span class="nf"&gt;longest_increasing_subsequence&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
&lt;span class="k"&gt;assert&lt;/span&gt; &lt;span class="nf"&gt;longest_increasing_subsequence&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;
&lt;span class="k"&gt;assert&lt;/span&gt; &lt;span class="nf"&gt;longest_increasing_subsequence&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="mi"&gt;42&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;42&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;42&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;42&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;
&lt;span class="k"&gt;assert&lt;/span&gt; &lt;span class="nf"&gt;longest_increasing_subsequence&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;
&lt;span class="k"&gt;assert&lt;/span&gt; &lt;span class="nf"&gt;longest_increasing_subsequence&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Can the candidate design some relational DB? Postgres, MySQL?&lt;/strong&gt; The candidate doesn't need to know the DDL for the tables from memory. Can just write what are the tables, columns and types - pseudo-code. You have system with users and departments. User has name and the salary and department has only name. User can be in no department or in more than one.
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;CREATE&lt;/span&gt; &lt;span class="k"&gt;TABLE&lt;/span&gt; &lt;span class="nv"&gt;"user"&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;id&lt;/span&gt; &lt;span class="nb"&gt;BIGINT&lt;/span&gt; &lt;span class="k"&gt;PRIMARY&lt;/span&gt; &lt;span class="k"&gt;KEY&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="nb"&gt;VARCHAR&lt;/span&gt; &lt;span class="k"&gt;NOT&lt;/span&gt; &lt;span class="k"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;salary&lt;/span&gt; &lt;span class="nb"&gt;NUMERIC&lt;/span&gt; &lt;span class="k"&gt;NOT&lt;/span&gt; &lt;span class="k"&gt;NULL&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="k"&gt;CREATE&lt;/span&gt; &lt;span class="k"&gt;TABLE&lt;/span&gt; &lt;span class="nv"&gt;"department"&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;id&lt;/span&gt; &lt;span class="nb"&gt;INT&lt;/span&gt; &lt;span class="k"&gt;PRIMARY&lt;/span&gt; &lt;span class="k"&gt;KEY&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="nb"&gt;VARCHAR&lt;/span&gt; &lt;span class="k"&gt;NOT&lt;/span&gt; &lt;span class="k"&gt;NULL&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="k"&gt;CREATE&lt;/span&gt; &lt;span class="k"&gt;TABLE&lt;/span&gt; &lt;span class="nv"&gt;"user_in_department"&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;id_user&lt;/span&gt; &lt;span class="nb"&gt;BIGINT&lt;/span&gt; &lt;span class="k"&gt;REFERENCES&lt;/span&gt; &lt;span class="nv"&gt;"user"&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="n"&gt;id_department&lt;/span&gt; &lt;span class="nb"&gt;INT&lt;/span&gt; &lt;span class="k"&gt;REFERENCES&lt;/span&gt; &lt;span class="nv"&gt;"department"&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;Can you find all users with salary bigger than 100k? &lt;code&gt;SELECT * FROM "user" WHERE "salary" &amp;gt; 100000&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Can you find all users with name starting with "M"? &lt;code&gt;SELECT * FROM "user" WHERE "name" LIKE 'M%'&lt;/code&gt; I meant any "m" ;) &lt;code&gt;ILIKE&lt;/code&gt; or &lt;code&gt;"name" LIKE 'M%' OR "name LIKE 'm%'&lt;/code&gt;. There is also function to search substring in PG &lt;code&gt;position&lt;/code&gt; or the candidate can use regular expressions.&lt;/li&gt;
&lt;li&gt;Can you find all names of the user who are not in any department? &lt;code&gt;SELECT "user"."name" FROM "user" LEFT JOIN "user_in_department" ON "id_user" = "id" WHERE "id_user" IS NULL&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Can you find users who are in "IT" department? &lt;code&gt;SELECT "user"."name" FROM "user" JOIN "user_in_department" ON "id_user" = "user"."id" JOIN "department" ON "id_department" = "department"."id" WHERE "department"."name" = 'IT'&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Can you list the average salary in every department? Including average salary of the people without assigned department? &lt;code&gt;SELECT "deaprtment"."name", AVG("salary") FROM "user" LEFT JOIN "user_in_department" ON "id_user" = "user"."id" LEFT JOIN "department" ON "id_department" = "department"."id" GROUP BY "department"."name"&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Can you sort departments by the count of the users? The biggest departments first? If there is the same amount of the users can then alphabetically according to department name? &lt;code&gt;SELECT "deaprtment"."name" FROM "user" JOIN "user_in_department" ON "id_user" = "user"."id" JOIN "department" ON "id_department" = "department"."id" GROUP BY "department"."id" ORDER BY COUNT("user"."id") DESC, "department"."name"&lt;/code&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  JavaScript (frontend)
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;What kind of object inheritance is used in JS and how it works?&lt;/li&gt;
&lt;li&gt;What is "pure" function? Why we should use it?&lt;/li&gt;
&lt;li&gt;What is "lambda" function? How is it written? What are (dis)advantages?&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Code
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Write function &lt;code&gt;sum(a, b)&lt;/code&gt; that returns &lt;code&gt;a + b&lt;/code&gt; if 2 arguments are given and another binded function if only one is given so I can call it either as &lt;code&gt;sum(2, 3) === 5&lt;/code&gt; or as &lt;code&gt;sum(2)(3) === 5&lt;/code&gt;. What if we would like to support impossible number of parameters like &lt;code&gt;sum(2, 3, 4)(4, 5)(1, 1, 1, 1)(3, 7)() === 32&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;What happens when you execute the following code?&lt;/strong&gt; How would you fix the code if we would like to alert all values in &lt;code&gt;i&lt;/code&gt;?
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;for &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nf"&gt;setTimeout&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;function &lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nf"&gt;alert&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;1000&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;Find even minimum in the array of the numbers. Can you write it in the functional way? (if the candidate does not know how, you can suggest him to use &lt;code&gt;Array.filter&lt;/code&gt;, &lt;code&gt;Array.map&lt;/code&gt;, &lt;code&gt;Array.reduce&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;If the &lt;strong&gt;candidate is really good and confident&lt;/strong&gt;, try to ask what will be stored in &lt;code&gt;numbers&lt;/code&gt; in this code &lt;code&gt;const numbers = ["10", "10", "10"].map(parseInt)&lt;/code&gt;? The correct answer is &lt;code&gt;[10, NaN, 2]&lt;/code&gt; because &lt;code&gt;parseInt(number, radix)&lt;/code&gt; accepts also &lt;code&gt;radix&lt;/code&gt; from array index so the call will be &lt;code&gt;["10", "10", "10"].map((value, index) =&amp;gt; parseInt(value, index)&lt;/code&gt; and &lt;code&gt;radix = 1&lt;/code&gt; does not exist and &lt;code&gt;10&lt;/code&gt; in &lt;code&gt;radix = 2&lt;/code&gt; is &lt;code&gt;2&lt;/code&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Outro (practicalities)
&lt;/h2&gt;

&lt;p&gt;This is the section I skip if I know right away we don't want the candidate because we all gave each other the secret signal.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;When can you start working with us?&lt;/li&gt;
&lt;li&gt;What contract do you prefer?&lt;/li&gt;
&lt;li&gt;What is your expected salary? In gross (or net if he's student - students don't pay taxes if they meet certain conditions :).&lt;/li&gt;
&lt;li&gt;List the company benefits. It's questionable if you want to list the things everyone in the industry has like flexi-time, home-office. It's good to mention some activities people in the company do like football, board games, movie nights.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;More sources:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.blog/2022-03-31-how-github-does-take-home-technical-interviews/" rel="noopener noreferrer"&gt;https://github.blog/2022-03-31-how-github-does-take-home-technical-interviews/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://newsletter.posthog.com/p/43-things-weve-learned-about-hiring" rel="noopener noreferrer"&gt;https://newsletter.posthog.com/p/43-things-weve-learned-about-hiring&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>development</category>
      <category>hiring</category>
      <category>team</category>
    </item>
    <item>
      <title>Python chained comparisons with == and !=</title>
      <dc:creator>Mišo</dc:creator>
      <pubDate>Tue, 26 Oct 2021 08:21:23 +0000</pubDate>
      <link>https://dev.to/misobelica/python-chained-comparisons-with-and--4l2d</link>
      <guid>https://dev.to/misobelica/python-chained-comparisons-with-and--4l2d</guid>
      <description>&lt;p&gt;&lt;a href="https://www.jetbrains.com/idea/" rel="noopener noreferrer"&gt;IDEA (PyCharm)&lt;/a&gt; suggested me today to simplify one condition in Python &lt;code&gt;count &amp;gt; 0 and count != prev_count&lt;/code&gt;. I was asking myself how? And it was transformed to &lt;code&gt;0 &amp;lt; count != prev_count&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;I knew this is possible in Python but because every example out there always shows something like &lt;code&gt;min &amp;lt; value &amp;lt;= max&lt;/code&gt; I somehow never realized this is possible too. It makes sense because according to documentation &lt;a href="https://docs.python.org/3/reference/expressions.html#comparisons" rel="noopener noreferrer"&gt;all comparison operators are supported for chained comparison&lt;/a&gt;. Have it in mind next time :)&lt;/p&gt;

</description>
      <category>python</category>
    </item>
    <item>
      <title>Online interactive playground for Nginx and more</title>
      <dc:creator>Mišo</dc:creator>
      <pubDate>Wed, 06 Oct 2021 19:20:00 +0000</pubDate>
      <link>https://dev.to/misobelica/online-interactive-playground-for-nginx-and-more-5a4d</link>
      <guid>https://dev.to/misobelica/online-interactive-playground-for-nginx-and-more-5a4d</guid>
      <description>&lt;p&gt;A few days ago I read an &lt;a href="https://jvns.ca/blog/2021/09/24/new-tool--an-nginx-playground/" rel="noopener noreferrer"&gt;article about the ability to test Nginx configs online&lt;/a&gt;. &lt;strong&gt;In your browser!&lt;/strong&gt; I use &lt;a href="https://caddyserver.com/v2" rel="noopener noreferrer"&gt;Caddy&lt;/a&gt; these days but there are still some "old" Nginx servers running so I need to change them from time to time. While Caddy has a super easy setup that's not true for Nginx. Online &lt;a href="https://www.digitalocean.com/community/tools/nginx" rel="noopener noreferrer"&gt;Nginx config generator&lt;/a&gt; from Digital Ocean is a great help but to test the config and &lt;a href="https://nginx-playground.wizardzines.com/" rel="noopener noreferrer"&gt;experiment while tuning it&lt;/a&gt; for a specific application is even better. But that's not all. There are more similar playgrounds in the article, so I decided to pin them here for my future self. Feel free to suggest some if you know more.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://codapi.org/try/" rel="noopener noreferrer"&gt;Codeapi&lt;/a&gt; as interactive version of &lt;a href="https://learnxinyminutes.com/" rel="noopener noreferrer"&gt;Learn X in Y minutes&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://nginx-playground.wizardzines.com/" rel="noopener noreferrer"&gt;nginx playground&lt;/a&gt; and &lt;a href="https://nginx.viraptor.info/" rel="noopener noreferrer"&gt;nginx location matcher&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://sql-playground.wizardzines.com/" rel="noopener noreferrer"&gt;SQL playground&lt;/a&gt; and &lt;a href="https://www.db-fiddle.com/" rel="noopener noreferrer"&gt;DB fiddle&lt;/a&gt; or &lt;a href="http://sqlime.org/" rel="noopener noreferrer"&gt;SQLime&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://dev.to/supabase/postgresnew-in-browser-postgres-with-an-ai-interface-3d6n"&gt;postgres.new&lt;/a&gt; or &lt;a href="https://www.crunchydata.com/blog/learn-postgres-at-the-playground" rel="noopener noreferrer"&gt;PostgreSQL in the browser&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://regex101.com/" rel="noopener noreferrer"&gt;Regex101&lt;/a&gt; or &lt;a href="https://regexr.com/" rel="noopener noreferrer"&gt;Regexr&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://httpbin.org/" rel="noopener noreferrer"&gt;HTTPbin&lt;/a&gt;, &lt;a href="https://jakearchibald.com/2021/cors/" rel="noopener noreferrer"&gt;CORS playground&lt;/a&gt; and &lt;a href="https://badssl.com/" rel="noopener noreferrer"&gt;bad SSL&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>nginx</category>
      <category>caddy</category>
      <category>database</category>
    </item>
    <item>
      <title>The living list of "tech" I would like to try</title>
      <dc:creator>Mišo</dc:creator>
      <pubDate>Sun, 08 Nov 2020 13:40:26 +0000</pubDate>
      <link>https://dev.to/misobelica/the-living-list-of-tech-i-would-like-to-try-4c9d</link>
      <guid>https://dev.to/misobelica/the-living-list-of-tech-i-would-like-to-try-4c9d</guid>
      <description>&lt;p&gt;Once in a while, I read about some new technology that excites me. But I can't just jump in and if I don't make a note then I can't remind the name when it would be handy. So I decided to gather it here and when I start doing something where I can use the technology I can come here to just click and decide if it is a good fit for my current needs.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.graalvm.org/" rel="noopener noreferrer"&gt;GraalVM&lt;/a&gt; - Fast (not only) JVM runtime written in Java. Runs and &lt;strong&gt;compiles&lt;/strong&gt; Java, Kotlin, Ruby, C/C++ (or any LLVM based language), Python, JavaScript, ... in one VM and even allows to use all of these languages in one codebase without the runtime overhead. In fact, it is faster than native C bindings from Node.js, Ruby, ... it seems like a great future to me. I could develop my React app in Kotlin and use some ML Python library here and some secure and fast Rust library to hash passwords there while targeting browsers and using critical parts in &lt;a href="https://webassembly.org/" rel="noopener noreferrer"&gt;WebAssembly&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.rust-lang.org/" rel="noopener noreferrer"&gt;Rust&lt;/a&gt; - very interesting alternative to C++ and &lt;a href="https://golang.org/" rel="noopener noreferrer"&gt;Go&lt;/a&gt;. Very fast, &lt;strong&gt;secure&lt;/strong&gt; by default, and with a mix of the best of both FP and OOP worlds.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://ziglang.org/" rel="noopener noreferrer"&gt;Zig&lt;/a&gt; - next gen C language that claims to be better compiler for C than C compilers. Consider comparison with &lt;a href="https://vlang.io/" rel="noopener noreferrer"&gt;https://vlang.io/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://deno.land/" rel="noopener noreferrer"&gt;Deno&lt;/a&gt; with &lt;a href="https://alephjs.org/" rel="noopener noreferrer"&gt;https://alephjs.org/&lt;/a&gt; as an alternative to Next.js.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://elm-lang.org/" rel="noopener noreferrer"&gt;Elm&lt;/a&gt; or &lt;a href="https://github.com/gcanti/fp-ts" rel="noopener noreferrer"&gt;fp-ts&lt;/a&gt;/&lt;a href="https://github.com/gcanti/io-ts" rel="noopener noreferrer"&gt;io-ts&lt;/a&gt; - I was cought by Elm's no runtime exceptions, but TypeScript feels more natural these days.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://fauna.com/" rel="noopener noreferrer"&gt;FaunaDB&lt;/a&gt; - NoSQL relational ACID database with &lt;a href="https://fauna.com/blog/the-worlds-best-serverless-database-now-with-native-graphql" rel="noopener noreferrer"&gt;&lt;strong&gt;native&lt;/strong&gt; GraphQL API&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://firebase.google.com" rel="noopener noreferrer"&gt;Firebase&lt;/a&gt; - Set of services (auth, store, hosting, ...) built on top of Google cloud.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://supabase.io/" rel="noopener noreferrer"&gt;Supabase&lt;/a&gt; - an open-source alternative to &lt;a href="https://firebase.google.com/" rel="noopener noreferrer"&gt;Firebase&lt;/a&gt; built on top of PostgreSQL. And maybe &lt;a href="https://github.com/supabase/supabase/discussions/6#discussioncomment-80183" rel="noopener noreferrer"&gt;also other databases&lt;/a&gt; in the future.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://neon.tech/" rel="noopener noreferrer"&gt;Neon&lt;/a&gt; - Truly serverless PostgreSQL with generous free tier.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.yugabyte.com/yugabyte-db-vs-cockroachdb/" rel="noopener noreferrer"&gt;YugabyteDB or CockroachDB&lt;/a&gt;, TerminusDB, or &lt;a href="https://harperdb.io/" rel="noopener noreferrer"&gt;HarperDB&lt;/a&gt; - simply some alternative to PostgreSQL ready for a really big data. I have quite an experience with ElasticSearch and very little MongoDB, but those do not feel right. Especially the lack of JOINs and no ACID guarantee.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/evoluhq/evolu" rel="noopener noreferrer"&gt;evolu.dev&lt;/a&gt; - Privacy-focused local‑first platform that scales. Basically local-first E2EE SQLite DB compiled to WebAssembly with reactive state. Synced to other devices through server. Uses &lt;a href="https://kysely.dev/" rel="noopener noreferrer"&gt;https://kysely.dev/&lt;/a&gt; to query data in a type-safe way.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/liquidata-inc/dolt" rel="noopener noreferrer"&gt;Dolt&lt;/a&gt; - git for relational data. Versioned database with branching all of the good from git.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://airtable.com/" rel="noopener noreferrer"&gt;Airtable&lt;/a&gt; - part spreadsheet, part database.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://postgres.ai/blog/joe-0.5/" rel="noopener noreferrer"&gt;Postgres.ai's Joe bot&lt;/a&gt; - Joe bot, an SQL query optimization assistant. Joe works on top of the Database Lab. Every time when an engineer starts communicating with Joe, a new full-size copy of the database is provisioned. This process is fully automated and takes only a few seconds, even for multi-terabyte databases. Such database copies are called “thin clones” because multiple clones share the same data blocks, so provisioning is super fast, and disk space consumption is very low. The clones are fully independent, so developers can modify databases. Finally, SQL execution plans are identical to production, which makes it possible to troubleshoot and optimize queries reliably without involving production databases. Thin provisioning in seconds thanks to copy-on-write (CoW) provided by ZFS and special methodology of preparing PostgreSQL database snapshots. There is also an option to use LVM instead of ZFS.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://steampipe.io/" rel="noopener noreferrer"&gt;Steampipe&lt;/a&gt; or &lt;a href="https://anyquery.dev/" rel="noopener noreferrer"&gt;AnyQuery&lt;/a&gt; is Foreign Data Wrapper for PostgreSQL that automatically unifies APIs from various sources and exposes them as a set of tables/views. You can fetch data from API through your DB. Something similar is &lt;a href="https://superface.ai/" rel="noopener noreferrer"&gt;Superface&lt;/a&gt; that is another attempt to unify APIs into one cohesive library.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://testing-library.com/docs/react-testing-library/intro" rel="noopener noreferrer"&gt;React Testing Library&lt;/a&gt; - the only right way to test React.js apps without implementation details.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/davidkpiano/xstate" rel="noopener noreferrer"&gt;XState&lt;/a&gt; and &lt;a href="https://css-tricks.com/model-based-testing-in-react-with-state-machines/" rel="noopener noreferrer"&gt;https://css-tricks.com/model-based-testing-in-react-with-state-machines/&lt;/a&gt; - alternative to Redux with the ability to draw your business logic as a chart.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://redux-toolkit.js.org/" rel="noopener noreferrer"&gt;Redux-toolkit&lt;/a&gt; - Redux with boilerplate reduced.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.snowpack.dev/" rel="noopener noreferrer"&gt;Snowpack&lt;/a&gt; or &lt;a href="https://vitejs.dev/" rel="noopener noreferrer"&gt;Vite&lt;/a&gt; - Fast replacement for &lt;a href="https://webpack.js.org/" rel="noopener noreferrer"&gt;Webpack&lt;/a&gt; used for development. Production build still uses Webpack, but development is blazingly fast.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.npmjs.com/package/bundle-wizard" rel="noopener noreferrer"&gt;bundle-wizard&lt;/a&gt; - webpack analyzer for live websites&lt;/p&gt;

&lt;p&gt;&lt;a href="https://caddyserver.com/v2" rel="noopener noreferrer"&gt;Caddy server&lt;/a&gt; - HTTPS first, a no-boilerplate alternative to Nginx written in Go. Actually, I use this one already and I am pretty happy with it. The auto TLS certificate renewal is awesome.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://glitch.com/help/" rel="noopener noreferrer"&gt;Glitch&lt;/a&gt; - have no idea what it is but I hit it regularly and it seems like some hybrid of Vercel/Netlify and &lt;a href="https://codesandbox.io/" rel="noopener noreferrer"&gt;CodeSandbox&lt;/a&gt;/&lt;a href="https://repl.it/" rel="noopener noreferrer"&gt;repl.it&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://htmx.org/" rel="noopener noreferrer"&gt;HTMX&lt;/a&gt; - minimalistic HTML framework for enhancing static pages with interactivity. Similar to &lt;a href="https://doc.nette.org/en/application/components#toc-signal" rel="noopener noreferrer"&gt;Signals and snippets in Nette&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.gatsbyjs.com" rel="noopener noreferrer"&gt;Gatsby&lt;/a&gt; - Next.js alternative for building static sites. But I want to just explore it because I think Next.js is still better. But Gatsby is known for its amazing plugins.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://blitzjs.com/" rel="noopener noreferrer"&gt;Blitz.js&lt;/a&gt; - full-stack React framework. Good old web framework without REST/GraphQL API but with the power of React.js.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://fly.io/" rel="noopener noreferrer"&gt;Fly.io&lt;/a&gt; - cloud without the ops. Not like AWS, GCP, Azure and others.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://logrocket.com/" rel="noopener noreferrer"&gt;LogRocket&lt;/a&gt; - &lt;a href="https://www.fullstory.com/" rel="noopener noreferrer"&gt;FullStory&lt;/a&gt; and &lt;a href="https://sentry.io/" rel="noopener noreferrer"&gt;Sentry&lt;/a&gt; in one package. There are self-hoste alternatives, even open source, &lt;a href="https://www.rrweb.io/" rel="noopener noreferrer"&gt;https://www.rrweb.io/&lt;/a&gt; and &lt;a href="https://openreplay.com/" rel="noopener noreferrer"&gt;https://openreplay.com/&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://posthog.com/" rel="noopener noreferrer"&gt;PostHog&lt;/a&gt; - Mixpanel, Sentry, AB testing, full story, and others all together in single package. With a generous free tier.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://dev.to/bearer/why-you-should-monitor-apis-that-your-app-relies-on-1g8"&gt;bearer.sh&lt;/a&gt; - third-party APIs real-time monitoring in a few lines of code.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://stackblitz.com/" rel="noopener noreferrer"&gt;StackBlitz&lt;/a&gt; - full stack Node.js dev environment &lt;strong&gt;running in the browser&lt;/strong&gt;. Node.js is compiled to WebAssembly to run in the browser. Alternatives are &lt;a href="https://github.com/features/codespaces" rel="noopener noreferrer"&gt;Codespaces&lt;/a&gt; and &lt;a href="https://www.gitpod.io/" rel="noopener noreferrer"&gt;GitPod&lt;/a&gt; but I am excited about StackBlitz because it &lt;a href="https://blog.stackblitz.com/posts/introducing-webcontainers/" rel="noopener noreferrer"&gt;runs in the browser, even backend, has virtual TCP stack, ...&lt;/a&gt;. On the other hand it supports only Node.js now, and not Kotlin, Python, ... as GitPod.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.jetbrains.com/space/" rel="noopener noreferrer"&gt;Space&lt;/a&gt; - kind of GitHub, Slack, Wiki, ... combined into one application. The presentation looks really great and it's from JetBrains so it could really cool app.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://super-productivity.com/" rel="noopener noreferrer"&gt;Super productivity&lt;/a&gt; - time tracker and TODO list on steroid. I use &lt;a href="https://toggl.com/track/" rel="noopener noreferrer"&gt;Toggl&lt;/a&gt; currently, but I would like to have something with integration to GitHub and Trello.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://gitprime.com" rel="noopener noreferrer"&gt;https://gitprime.com&lt;/a&gt; - now bought by &lt;a href="https://www.pluralsight.com/product/flow" rel="noopener noreferrer"&gt;https://www.pluralsight.com/product/flow&lt;/a&gt; - advanced developer metrics&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.kialo.com/" rel="noopener noreferrer"&gt;Kialo&lt;/a&gt; - discussion with thread supporting arguments and discovering fallacies. Discussion as a tree of pros/cons.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://pipedream.com/" rel="noopener noreferrer"&gt;https://pipedream.com/&lt;/a&gt; - like &lt;a href="https://zapier.com/" rel="noopener noreferrer"&gt;Zappier&lt;/a&gt;/&lt;a href="https://www.make.com/" rel="noopener noreferrer"&gt;Make&lt;/a&gt; but with full code control. &lt;a href="https://www.napkin.io" rel="noopener noreferrer"&gt;https://www.napkin.io&lt;/a&gt; and &lt;a href="https://www.val.town" rel="noopener noreferrer"&gt;https://www.val.town&lt;/a&gt; are other alternatives.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/huginn/huginn" rel="noopener noreferrer"&gt;Huginn&lt;/a&gt; - self-hosted Zappier/IFTTT. There is also &lt;a href="https://blog.logrocket.com/workflow-automation-with-n8n-io/" rel="noopener noreferrer"&gt;one alternative in n8n&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://zeromq.org/" rel="noopener noreferrer"&gt;ZeroMQ&lt;/a&gt; - broker less messaging framework or sockets on steroids.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.blinkist.com/" rel="noopener noreferrer"&gt;Blinkist&lt;/a&gt; - all the best book summaries in 15 minutes. It's a little bit controversial because it's questionable if you can get all from the book in a summary from a stranger, but worth to try because I think some books are really good but too verbose for me.&lt;/p&gt;

&lt;p&gt;Blockchain - just to work more closely with the crypto stuff.&lt;/p&gt;

</description>
      <category>list</category>
      <category>tips</category>
    </item>
    <item>
      <title>Full-text search of all git branches</title>
      <dc:creator>Mišo</dc:creator>
      <pubDate>Tue, 06 Oct 2020 13:49:25 +0000</pubDate>
      <link>https://dev.to/misobelica/full-text-search-of-all-git-branches-10b4</link>
      <guid>https://dev.to/misobelica/full-text-search-of-all-git-branches-10b4</guid>
      <description>&lt;p&gt;When I want to quickly search for something in the code I use &lt;a href="https://github.com/search" rel="noopener noreferrer"&gt;GitHub search&lt;/a&gt; page. With the prefixes like &lt;code&gt;org:&amp;lt;organization-name&amp;gt;&lt;/code&gt; it's really great and I have even defined custom browser search engines for different organizations. Then I can simply write something like &lt;code&gt;org "127.0.0.1"&lt;/code&gt; into my browser and it finds all localhosts in my &lt;code&gt;org&lt;/code&gt; in all repositories.&lt;/p&gt;

&lt;p&gt;The problem is that GitHub indexes only the main branch (whatever you name it). But when there are more branches with active development I want to search even those. And that's why I have a simple batch script to achieve that. Now I can go to any local repo and run &lt;code&gt;git-search "127.0.0.1"&lt;/code&gt; or &lt;code&gt;git-search "\b_source\b"&lt;/code&gt; and I get all unique lines matching the RE pattern. Here is the magic script to do that.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight batchfile"&gt;&lt;code&gt;@echo &lt;span class="na"&gt;off&lt;/span&gt;
&lt;span class="c"&gt;rem https://stackoverflow.com/questions/7151311/using-git-how-could-i-search-for-a-string-across-all-branches&lt;/span&gt;
&lt;span class="kd"&gt;git&lt;/span&gt; &lt;span class="kd"&gt;fetch&lt;/span&gt; &lt;span class="kd"&gt;origin&lt;/span&gt;
&lt;span class="kd"&gt;git&lt;/span&gt; &lt;span class="kd"&gt;remote&lt;/span&gt; &lt;span class="kd"&gt;prune&lt;/span&gt; &lt;span class="kd"&gt;origin&lt;/span&gt;
&lt;span class="kd"&gt;git&lt;/span&gt; &lt;span class="kd"&gt;branch&lt;/span&gt; &lt;span class="na"&gt;--remote &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="kd"&gt;grep&lt;/span&gt; &lt;span class="na"&gt;-v &lt;/span&gt;&lt;span class="s2"&gt;" -&amp;gt; "&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="kd"&gt;xargs&lt;/span&gt; &lt;span class="kd"&gt;git&lt;/span&gt; &lt;span class="kd"&gt;grep&lt;/span&gt; &lt;span class="err"&gt;%&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="kd"&gt;cut&lt;/span&gt; &lt;span class="na"&gt;--delimiter&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;":"&lt;/span&gt; &lt;span class="na"&gt;--fields&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;2&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="m"&gt;3&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="kd"&gt;uniq&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="kd"&gt;grep&lt;/span&gt; &lt;span class="na"&gt;--color&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kd"&gt;always&lt;/span&gt; &lt;span class="na"&gt;-E &lt;/span&gt;&lt;span class="err"&gt;%&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
      <category>github</category>
      <category>git</category>
      <category>search</category>
      <category>fulltext</category>
    </item>
    <item>
      <title>Is an exception less (pure) than a Result?</title>
      <dc:creator>Mišo</dc:creator>
      <pubDate>Thu, 17 Sep 2020 18:07:46 +0000</pubDate>
      <link>https://dev.to/misobelica/is-an-exception-less-pure-than-a-result-58hb</link>
      <guid>https://dev.to/misobelica/is-an-exception-less-pure-than-a-result-58hb</guid>
      <description>&lt;p&gt;Recently I saw a video about the &lt;a href="https://fsharpforfunandprofit.com/rop/" rel="noopener noreferrer"&gt;Railway Oriented Programming&lt;/a&gt; and I can't help myself but I ask "why"? So I searched and found &lt;a href="https://fsharpforfunandprofit.com/posts/against-railway-oriented-programming/" rel="noopener noreferrer"&gt;Against Railway-Oriented Programming&lt;/a&gt; from the same author. Still, I have to ask: "&lt;strong&gt;Why should I teach how to compose functions that don't match&lt;/strong&gt; when I can simply throw an exception and &lt;strong&gt;have all of this for free&lt;/strong&gt;? And it is not just this video. With recent OOP hate and functional passion, I hear it all the time how the &lt;a href="https://dev.to/wemake-services/python-exceptions-considered-an-anti-pattern-17o9"&gt;explicit result is better&lt;/a&gt; because then the function is pure and returns always the same output data for the same input data. And then I come to the question. Is that different from the exceptions?&lt;/p&gt;

&lt;p&gt;From what I know the function is pure when it returns the same result for the same arguments. And if the function always throws the same exception for the same input arguments &lt;a href="https://stackoverflow.com/questions/40305162/can-a-pure-function-throw-an-exception" rel="noopener noreferrer"&gt;it is pure&lt;/a&gt;. Even &lt;a href="https://redux.js.org/basics/reducers" rel="noopener noreferrer"&gt;reducers in Redux&lt;/a&gt; are considered pure if they don't have side-effects and they throw exceptions all the time (famous &lt;em&gt;undefined is not an object/function/...&lt;/em&gt;). So there has to be something else. Something why one would like to abandon the simplicity of throwing exceptions with the whole railway and even call it a better approach. Below is an example to try to find it.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;type&lt;/span&gt; &lt;span class="nx"&gt;Result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; 
  &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="na"&gt;success&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;processedData&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;ProcessedData&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="na"&gt;success&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;error&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="cm"&gt;/**
 * Pure function with the "Result" type.
 */&lt;/span&gt;
&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;pureFunction&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;?:&lt;/span&gt; &lt;span class="nx"&gt;User&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;Data&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="nx"&gt;Result&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="na"&gt;success&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;error&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;User is not authenticated&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="na"&gt;success&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;processedData&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{...&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;processed&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;}}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="cm"&gt;/**
 * The same function but "returning" an error as an exception.
 */&lt;/span&gt;
&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;maybePureFunction&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;?:&lt;/span&gt; &lt;span class="nx"&gt;User&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;Data&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="nx"&gt;ProcessedData&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;UserNotAuthenticated&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{...&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;processed&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Can you spot the difference? I can. It's hidden in types. &lt;strong&gt;I don't know any language out there checking the types of the exceptions.&lt;/strong&gt; Java somehow tried with the &lt;a href="https://dev.to/chochos/i-hate-checked-exceptions-43lj"&gt;checked exceptions and failed&lt;/a&gt;, &lt;a href="https://github.com/python/typing/issues/71" rel="noopener noreferrer"&gt;Python don't plan it&lt;/a&gt;. Nobody wants to write all the possible exceptions thrown from every function (sorry, method). And still, it is the same as to write all the return types. So this is a &lt;strong&gt;big advantage of the &lt;code&gt;Return&lt;/code&gt; type - type safety&lt;/strong&gt;. The compiler will tell you that you don't handle some possible error but don't warn you about uncaught exceptions.&lt;/p&gt;

&lt;p&gt;And then I had to ask again. Why? Why can't we have both advantages? &lt;strong&gt;Why can't I just throw an exception and let the compiler infer the exceptions&lt;/strong&gt; for the function and &lt;strong&gt;warn me about possibilities&lt;/strong&gt;? Then I don't need to learn how to combine functions by &lt;code&gt;bind&lt;/code&gt;, &lt;code&gt;&amp;gt;&amp;gt;=&lt;/code&gt;, etc. I think the idea of checked/unchecked exceptions in Java is good. Only I would name them &lt;code&gt;BusinessException&lt;/code&gt; and &lt;code&gt;ProgrammerError&lt;/code&gt; or something like that. And they would be inferred by the compiler.&lt;/p&gt;

&lt;p&gt;In fact, I am not afraid to consider exceptions to be algebraic data types, &lt;a href="https://guide.elm-lang.org/appendix/types_as_sets.html#addition-custom-types" rel="noopener noreferrer"&gt;sum types&lt;/a&gt; or &lt;a href="https://doc.rust-lang.org/book/ch06-00-enums.html" rel="noopener noreferrer"&gt;enums as defined by Rust&lt;/a&gt;. Here is my ideal API.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;maybePureFunction&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;catch &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// here the compiler knows "e" is "UserNotAuthenticated"&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;DATA_FOR_ANONYMOUS_USER&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// OR&lt;/span&gt;

&lt;span class="c1"&gt;// compiler infers here the function return type is kind-of "Result&amp;lt;ResourceNotFound | DangerousError, string&amp;gt;"&lt;/span&gt;
&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;something&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;fileName&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;dangerousCall&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;fileName&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  &lt;span class="c1"&gt;// throws "DangerousError" unhandled here&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;catch &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;FileDoesNotExist&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="nx"&gt;InsufficientPermissions&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;ResourceNotFound&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;fileName&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;catch &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;FileLocked&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;  &lt;span class="c1"&gt;// isn't this actually pattern matching?&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="dl"&gt;""&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;What do you think about it? And more importantly, &lt;strong&gt;do you know such a language where exceptions are a proper part of the type system&lt;/strong&gt; and are treated as a result of the function?&lt;/p&gt;

&lt;h4&gt;
  
  
  Interesting sources
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://softwareengineering.stackexchange.com/a/334682/225599" rel="noopener noreferrer"&gt;A pure function must have Referential Transparency&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://stackoverflow.com/questions/12335245/why-is-catching-an-exception-non-pure-but-throwing-an-exception-is-pure" rel="noopener noreferrer"&gt;Why is catching an exception non-pure, but throwing an exception is pure?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://stackoverflow.com/questions/10703232/why-is-the-raising-of-an-exception-a-side-effect" rel="noopener noreferrer"&gt;https://stackoverflow.com/questions/10703232/why-is-the-raising-of-an-exception-a-side-effect&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/wemake-services/python-exceptions-considered-an-anti-pattern-17o9"&gt;Python exceptions considered an anti-pattern&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://stackoverflow.com/questions/36597079/what-is-the-purpose-of-throwing-exceptions-in-pure-functions" rel="noopener noreferrer"&gt;https://stackoverflow.com/questions/36597079/what-is-the-purpose-of-throwing-exceptions-in-pure-functions&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.reddit.com/r/scala/comments/a2odjb/can_a_pure_function_throw_exceptions/" rel="noopener noreferrer"&gt;https://www.reddit.com/r/scala/comments/a2odjb/can_a_pure_function_throw_exceptions/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.reddit.com/r/haskell/comments/7wblve/exceptions_in_pure_functions/" rel="noopener noreferrer"&gt;https://www.reddit.com/r/haskell/comments/7wblve/exceptions_in_pure_functions/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://lambda-the-ultimate.org/node/4544" rel="noopener noreferrer"&gt;http://lambda-the-ultimate.org/node/4544&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://blog.jooq.org/javas-checked-exceptions-are-just-weird-union-types/" rel="noopener noreferrer"&gt;https://blog.jooq.org/javas-checked-exceptions-are-just-weird-union-types/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://itnext.io/my-personal-definitive-guide-to-java-exceptions-d2e4131393c7" rel="noopener noreferrer"&gt;https://itnext.io/my-personal-definitive-guide-to-java-exceptions-d2e4131393c7&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>discuss</category>
      <category>functional</category>
    </item>
    <item>
      <title>Python features by version</title>
      <dc:creator>Mišo</dc:creator>
      <pubDate>Mon, 24 Aug 2020 19:10:14 +0000</pubDate>
      <link>https://dev.to/misobelica/python-features-by-version-3318</link>
      <guid>https://dev.to/misobelica/python-features-by-version-3318</guid>
      <description>&lt;p&gt;From time to time I need to poke someone to use a new version of Python but I couldn't find the list of main features one gets by this. There is &lt;a href="https://docs.python.org/3/whatsnew/index.html" rel="noopener noreferrer"&gt;https://docs.python.org/3/whatsnew/index.html&lt;/a&gt; but that is too much info. So here is my concise list. Also, there is an &lt;a href="https://en.wikipedia.org/wiki/History_of_Python#Table_of_versions" rel="noopener noreferrer"&gt;EOL (End of Life) date for every version&lt;/a&gt; in the brackets. More visual EOF site at &lt;a href="https://devguide.python.org/versions/" rel="noopener noreferrer"&gt;https://devguide.python.org/versions/&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Python 3.13 (2029-10)
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;New colorful &lt;a href="https://docs.python.org/3.13/whatsnew/3.13.html#a-better-interactive-interpreter" rel="noopener noreferrer"&gt;interactive REPL&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Experimental &lt;a href="https://docs.python.org/3.13/whatsnew/3.13.html#free-threaded-cpython" rel="noopener noreferrer"&gt;GIL removal&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Experimental &lt;a href="https://docs.python.org/3.13/whatsnew/3.13.html#an-experimental-just-in-time-jit-compiler" rel="noopener noreferrer"&gt;JIT compiler&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Support for &lt;a href="https://docs.python.org/3.13/whatsnew/3.13.html#support-for-mobile-platforms" rel="noopener noreferrer"&gt;mobile platforms&lt;/a&gt; like iOS and Android soon&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Python 3.12 (2028-10)
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;New &lt;a href="https://docs.python.org/3.12/whatsnew/3.12.html#pep-695-type-parameter-syntax" rel="noopener noreferrer"&gt;Type Parameter Syntax&lt;/a&gt; for generics in functions &lt;code&gt;def max[T](args: Iterable[T]) -&amp;gt; T:&lt;/code&gt; classes &lt;code&gt;class list[T]:&lt;/code&gt; and types &lt;code&gt;type Point[T] = tuple[T, T]&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://docs.python.org/3.12/whatsnew/3.12.html#pep-701-syntactic-formalization-of-f-strings" rel="noopener noreferrer"&gt;Nested f-strings&lt;/a&gt; &lt;code&gt;f"{f"{f"{f"{f"{f"{42-36}"}"}"}"}"}"&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.python.org/3.12/whatsnew/3.12.html#pep-684-a-per-interpreter-gil" rel="noopener noreferrer"&gt;A per-interpreter GIL&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Python 3.11 (2027-10)
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;between 10-60% speedup&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.python.org/3.11/whatsnew/3.11.html#pep-657-fine-grained-error-locations-in-tracebacks" rel="noopener noreferrer"&gt;Fine-grained error locations in tracebacks&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.python.org/3.11/whatsnew/3.11.html#enhanced-error-locations-in-tracebacks" rel="noopener noreferrer"&gt;Enhanced error locations in tracebacks&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Support for parsing TOML files in the Standard Library&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Python 3.10 (2026-10)
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://docs.python.org/3.10/whatsnew/3.10.html#pep-634-structural-pattern-matching" rel="noopener noreferrer"&gt;Pattern matching&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;    &lt;span class="n"&gt;match&lt;/span&gt; &lt;span class="n"&gt;point&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;case&lt;/span&gt; &lt;span class="nc"&gt;Point&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
            &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Origin is the point&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;s location.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;case&lt;/span&gt; &lt;span class="nc"&gt;Point&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
            &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Y=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; and the point is on the y-axis.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;case&lt;/span&gt; &lt;span class="nc"&gt;Point&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
            &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;X=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; and the point is on the x-axis.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;case&lt;/span&gt; &lt;span class="nc"&gt;Point&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
            &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;The point is located somewhere else on the plane.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;case&lt;/span&gt; &lt;span class="n"&gt;_&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Not a point&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://docs.python.org/3.10/whatsnew/3.10.html#pep-613-typealias-annotation" rel="noopener noreferrer"&gt;Type alias&lt;/a&gt; &lt;code&gt;StrCache: typing.TypeAlias = "Cache[str]"&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://docs.python.org/3.10/whatsnew/3.10.html#pep604-new-type-union-operator" rel="noopener noreferrer"&gt;Union type operator&lt;/a&gt; &lt;code&gt;def square(number: int | float) -&amp;gt; int | float:&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://docs.python.org/3.10/whatsnew/3.10.html#better-error-messages-in-the-parser" rel="noopener noreferrer"&gt;Better error messages&lt;/a&gt; with precise line numbers for debugging and other tools&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://docs.python.org/3.10/whatsnew/3.10.html#parenthesized-context-managers" rel="noopener noreferrer"&gt;Parenthesized context managers&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="nf"&gt;with &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="nc"&gt;CtxManager1&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
    &lt;span class="nc"&gt;CtxManager2&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="bp"&gt;...&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Python 3.9 (2025-10)
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://docs.python.org/3.10/whatsnew/3.9.html#dictionary-merge-update-operators" rel="noopener noreferrer"&gt;Dictionary merge&lt;/a&gt; &lt;code&gt;assert {"a": 1} | {"b": 2} == {"a": 1, "b": 2}&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://docs.python.org/3.10/whatsnew/3.9.html#pep-616-new-removeprefix-and-removesuffix-string-methods" rel="noopener noreferrer"&gt;New string methods&lt;/a&gt;&lt;code&gt;str.removeprefix(prefix)&lt;/code&gt; and &lt;code&gt;str.removesuffix(suffix)&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://docs.python.org/3.10/whatsnew/3.9.html#pep-585-builtin-generic-types" rel="noopener noreferrer"&gt;Builtin Generics&lt;/a&gt; &lt;code&gt;list[dict[str, int]]&lt;/code&gt; vs. &lt;code&gt;typing.List[typing.Dict[str, int]]&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.python.org/3.10/whatsnew/3.9.html#pep-617-new-parser" rel="noopener noreferrer"&gt;New PEG parser&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://docs.python.org/3.10/whatsnew/3.9.html#zoneinfo" rel="noopener noreferrer"&gt;New module &lt;code&gt;zoneinfo&lt;/code&gt;&lt;/a&gt; for timezones information&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Python 3.8 (2024-10)
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://docs.python.org/3.10/whatsnew/3.8.html#assignment-expressions" rel="noopener noreferrer"&gt;The walrus operator&lt;/a&gt; &lt;code&gt;if (n := len(a)) &amp;gt; 10: print(f"List is too long ({n} elements, expected &amp;lt;= 10)")&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://docs.python.org/3.10/whatsnew/3.8.html#positional-only-parameters" rel="noopener noreferrer"&gt;Positional-only parameters&lt;/a&gt; &lt;code&gt;len(obj, /)&lt;/code&gt; which prevents awkward calls such as &lt;code&gt;len(obj="Hello")&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://docs.python.org/3.10/whatsnew/3.8.html#f-strings-support-for-self-documenting-expressions-and-debugging" rel="noopener noreferrer"&gt;Self documenting f-strings&lt;/a&gt; &lt;code&gt;f"{user=} {member_since=}" # "user='eric_idle' member_since=datetime.date(1975, 7, 31)"&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://docs.python.org/3.10/whatsnew/3.8.html#functools" rel="noopener noreferrer"&gt;&lt;code&gt;cached_property&lt;/code&gt;&lt;/a&gt; is finally in the standard library&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Python 3.7 († 2023-06)
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://docs.python.org/3.10/whatsnew/3.7.html#contextvars" rel="noopener noreferrer"&gt;contextvars&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://docs.python.org/3.10/whatsnew/3.7.html#dataclasses" rel="noopener noreferrer"&gt;dataclasses&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="nd"&gt;@dataclass&lt;/span&gt;
&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Point&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;float&lt;/span&gt;
    &lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;float&lt;/span&gt;
    &lt;span class="n"&gt;z&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;float&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;0.0&lt;/span&gt;

&lt;span class="n"&gt;p&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Point&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;1.5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;2.5&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;   &lt;span class="c1"&gt;# produces "Point(x=1.5, y=2.5, z=0.0)"
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://docs.python.org/3.10/whatsnew/3.7.html#pep-553-built-in-breakpoint" rel="noopener noreferrer"&gt;Built-in breakpoint&lt;/a&gt; function&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Python 3.6 († 2021-12)
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://docs.python.org/3.10/whatsnew/3.6.html#pep-498-formatted-string-literals" rel="noopener noreferrer"&gt;f-strings&lt;/a&gt; &lt;code&gt;f'Hello {name}'&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://docs.python.org/3.10/whatsnew/3.6.html#pep-515-underscores-in-numeric-literals" rel="noopener noreferrer"&gt;undescores in number literals&lt;/a&gt; &lt;code&gt;10_000_000&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://docs.python.org/3.10/whatsnew/3.6.html#pep-526-syntax-for-variable-annotations" rel="noopener noreferrer"&gt;variable annotations&lt;/a&gt; &lt;code&gt;variable: Type = 29&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://docs.python.org/3.10/whatsnew/3.6.html#pep-525-asynchronous-generators" rel="noopener noreferrer"&gt;asynchronous generators and comprehensions&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;ticker&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;delay&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;Yield numbers from 0 to *to* every *delay* seconds.&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nf"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;to&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="k"&gt;yield&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;
        &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;asyncio&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sleep&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;delay&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nf"&gt;aiter&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;fun&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;fun&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;funcs&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;condition&lt;/span&gt;&lt;span class="p"&gt;()]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;New &lt;a href="https://docs.python.org/3.10/whatsnew/3.6.html#secrets" rel="noopener noreferrer"&gt;module "secrets"&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Type &lt;code&gt;dict&lt;/code&gt; is &lt;a href="https://docs.python.org/3.10/whatsnew/3.6.html#new-dict-implementation" rel="noopener noreferrer"&gt;more compact and ordered by default&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Python 3.5 († 2020-09-30)
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://docs.python.org/3.10/whatsnew/3.5.html#pep-492-coroutines-with-async-and-await-syntax" rel="noopener noreferrer"&gt;&lt;code&gt;async/await&lt;/code&gt; syntax&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://docs.python.org/3.10/whatsnew/3.5.html#pep-465-a-dedicated-infix-operator-for-matrix-multiplication" rel="noopener noreferrer"&gt;matrix multiplication operator&lt;/a&gt; &lt;code&gt;M @ N&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://docs.python.org/3.10/whatsnew/3.5.html#pep-448-additional-unpacking-generalizations" rel="noopener noreferrer"&gt;Additional Unpacking Generalizations&lt;/a&gt; &lt;code&gt;print(*[1], *[2], 3, *[4, 5])&lt;/code&gt; and &lt;code&gt;function(**{'a': 1, 'c': 3}, **{'b': 2, 'd': 4})&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://docs.python.org/3.10/library/http.html#http.HTTPStatus" rel="noopener noreferrer"&gt;New enum for HTTP statuses&lt;/a&gt; &lt;code&gt;http.HTTPStatus.OK&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://docs.python.org/3.10/whatsnew/3.5.html#whatsnew-pep-484" rel="noopener noreferrer"&gt;Type hints&lt;/a&gt; &lt;code&gt;typing.Dict[str, typing.Any]&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Python 3.4 († 2019-03-18)
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://docs.python.org/3.10/whatsnew/3.4.html#pep-453-explicit-bootstrapping-of-pip-in-python-installations" rel="noopener noreferrer"&gt;built-in pip&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.python.org/3.10/whatsnew/3.4.html#asyncio" rel="noopener noreferrer"&gt;New module &lt;code&gt;asyncio&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.python.org/3.10/whatsnew/3.4.html#enum" rel="noopener noreferrer"&gt;Support for enums&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.python.org/3.10/whatsnew/3.4.html#pathlib" rel="noopener noreferrer"&gt;New module &lt;code&gt;pathlib&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.python.org/3.10/library/statistics.html#module-statistics" rel="noopener noreferrer"&gt;New module &lt;code&gt;statistics&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Python 3.3 († 2017-09-29)
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://docs.python.org/3.10/whatsnew/3.3.html#pep-405-virtual-environments" rel="noopener noreferrer"&gt;Built-in virtualenv&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://docs.python.org/3.10/whatsnew/3.3.html#pep-380-syntax-for-delegating-to-a-subgenerator" rel="noopener noreferrer"&gt;Generator delegation&lt;/a&gt; &lt;code&gt;yield from another_generator()&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://docs.python.org/3.10/whatsnew/3.3.html#pep-409-suppressing-exception-context" rel="noopener noreferrer"&gt;Exception context suppresion&lt;/a&gt; &lt;code&gt;raise Exception("Ooops") from None&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://docs.python.org/3.10/whatsnew/3.3.html#pep-414-explicit-unicode-literals" rel="noopener noreferrer"&gt;Explicit unicode literals&lt;/a&gt; are back to make migration from Python 2 easier &lt;code&gt;u"I am unicode in both Python 2 and 3"&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.python.org/3.10/library/unittest.mock.html#module-unittest.mock" rel="noopener noreferrer"&gt;New module &lt;code&gt;unittest.mock&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.python.org/3.10/library/ipaddress.html#module-ipaddress" rel="noopener noreferrer"&gt;New module &lt;code&gt;ipaddress&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Python 3.2 († 2016-02-20)
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://docs.python.org/3.10/whatsnew/3.2.html" rel="noopener noreferrer"&gt;¯_(ツ)_/¯&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Python 3.1 († 2012-04-09)
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://docs.python.org/3.10/whatsnew/3.1.html#pep-372-ordered-dictionaries" rel="noopener noreferrer"&gt;&lt;code&gt;OrderedDict&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;with&lt;/code&gt; handles multiple context managers in single statement&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Python 3.0 († 2009-06-27)
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://docs.python.org/3.10/whatsnew/3.0.html" rel="noopener noreferrer"&gt;Big pile of incompatibility&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>python</category>
      <category>features</category>
    </item>
    <item>
      <title>My language score-board</title>
      <dc:creator>Mišo</dc:creator>
      <pubDate>Mon, 13 Jul 2020 16:29:39 +0000</pubDate>
      <link>https://dev.to/misobelica/my-language-score-board-3hmp</link>
      <guid>https://dev.to/misobelica/my-language-score-board-3hmp</guid>
      <description>&lt;p&gt;From time to time someone asks me about my opinion about the programing languages I "know". Here is my ordered list as I would recommend them to learn or choose to build something. And to clear the things a little: I am a full-stack web developer. You can look at this as my personal &lt;a href="https://www.tiobe.com/tiobe-index/" rel="noopener noreferrer"&gt;TIOBE index&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Kotlin
&lt;/h3&gt;

&lt;p&gt;When I read/write in it I have a feeling like I could use Python syntax with extra features on the JVM platform. And that is great symbiosis. Support for &lt;a href="https://webassembly.org" rel="noopener noreferrer"&gt;WebAssembly&lt;/a&gt; and the &lt;a href="https://play.kotlinlang.org/hands-on/Building%20Web%20Applications%20with%20React%20and%20Kotlin%20JS/01_Introduction" rel="noopener noreferrer"&gt;compilation to JavaScript with the React.js&lt;/a&gt; in the Kotlin DSL makes this language my replacement candidate for Python &amp;amp; TypeScript in the future. And &lt;a href="https://www.zdnet.com/article/google-were-using-kotlin-programming-language-to-squash-the-bugs-that-cause-most-crashes" rel="noopener noreferrer"&gt;Google agrees&lt;/a&gt; with me 😉&lt;/p&gt;

&lt;h3&gt;
  
  
  Python
&lt;/h3&gt;

&lt;p&gt;The most readable syntax, plenty of great libraries, and a good community. I use it professionally and also personally for the automation (with the help of the &lt;a href="http://www.fabfile.org" rel="noopener noreferrer"&gt;Fabric&lt;/a&gt;). It is considered slow but the critical libraries are written in C so it does not matter much IMHO.&lt;/p&gt;

&lt;h3&gt;
  
  
  Go
&lt;/h3&gt;

&lt;p&gt;Actually, I never did anything in this language except for the &lt;a href="https://play.golang.org" rel="noopener noreferrer"&gt;The Go Playground&lt;/a&gt;. But I like static "duck typing", &lt;code&gt;defer&lt;/code&gt;, go-routines. I guess the lack of the exceptions was surprising for me, but the missing generics is probably the reason I never really tried it for a bigger project.&lt;/p&gt;

&lt;h3&gt;
  
  
  Typescript
&lt;/h3&gt;

&lt;p&gt;This is my choice when I need to do any app in the browser. I think it's the best, typed, browser language today. Even if I can imagine a much better type-system I really like how it can be incorporated incrementally and use familiar JS syntax. I don't want to go back to pure JS. But still, I am ready to switch it for something better in the future because it's far from the best.&lt;/p&gt;

&lt;h3&gt;
  
  
  Java
&lt;/h3&gt;

&lt;p&gt;I worked in the ecosystem for a few years. Java definitely gave me a range of visions I use in Python and other languages. But the language itself is simply old. The new features just copy other languages that are years ahead. The problem is that at the same time the legacy is not let in the past. The thing I didn't like the most was the community. I felt like there are a lot of arrogant people who believe Java is the best forever and if you can't solve the problem without the help you are a bad programmer. Also, I had that feeling that a lot of things are overengineered (not ready for the common simple cases). I would suggest learning Kotlin.&lt;/p&gt;

&lt;h3&gt;
  
  
  PHP
&lt;/h3&gt;

&lt;p&gt;The language I started with seriously (I don't count &lt;a href="https://cs.wikipedia.org/wiki/Balt%C3%ADk" rel="noopener noreferrer"&gt;Baltík&lt;/a&gt;, Assembler, and Pascal in the school). In the time, it was kind of starter language the JS is today, but even if I don't work with it a few years now I see it evolved into a good language with a nice community. I have learned a lot from &lt;a href="https://nette.org/en/" rel="noopener noreferrer"&gt;Nette comunity&lt;/a&gt;. Still, I would suggest to learn Python instead. &lt;/p&gt;

&lt;h3&gt;
  
  
  Javascript
&lt;/h3&gt;

&lt;p&gt;The starter language of today. I use it just because it is the only widely supported language in the browser. The strength is that it is also in the server so you can share the code. The built-in async support is great and fast for the IO-bound apps and the path from when I started hacking with it in 2005 and now is incredible. A lot of great tools and progress were made and even language evolved into something totally different.&lt;/p&gt;

&lt;h3&gt;
  
  
  Elm
&lt;/h3&gt;

&lt;p&gt;Elm is many things better than JS/TS. Maybe in all. But there is a missing ecosystem of the libraries the JS has. I recommend to watch at least the community and some videos about the nicest error messages, NO runtime errors, type system, and other ideas. I learned a lot from it and I am not alone. A lot of good things in JS is inspired here.&lt;/p&gt;

&lt;h3&gt;
  
  
  Haskell
&lt;/h3&gt;

&lt;p&gt;The real functional programming language. And I don't mean functions + &lt;code&gt;.map/.filter/.reduce&lt;/code&gt; as in JS. The built-in immutability, great type-inference, pattern-matching, recursion, lazy evaluation, pure functions, Monads, ... I tried the language once at the school for one semester and wrote one project. And even I would not recommend it for the beginner it was really great to learn it. It opened my eyes in many ways and I try to follow some patterns from it until today in other languages.&lt;/p&gt;

&lt;h3&gt;
  
  
  C++
&lt;/h3&gt;

&lt;p&gt;Another dinosaur as Java. At the school, I was glad every time I could use it but it was just because the alternative was C. It's widely used and I don't believe it will disappear anytime soon, but I guess &lt;a href="https://www.rust-lang.org" rel="noopener noreferrer"&gt;Rust&lt;/a&gt; or Go will be growing and cutting the C++ usage.&lt;/p&gt;

&lt;h3&gt;
  
  
  C
&lt;/h3&gt;

&lt;p&gt;Simple language with good access to the bare metal. That's why it is not used too much today when the web dominates. If you don't need any specific feature or are not forced to use it use Rust/Go/C++ instead.&lt;/p&gt;

&lt;h3&gt;
  
  
  Prolog
&lt;/h3&gt;

&lt;p&gt;The interesting language that is able to solve many goal-oriented problems with the strict rules very efficiently. Think of any logic puzzle for example. But I tried to solve the maze game and was very frustrated because it was hard to debug. Not my cup of cake 😀&lt;/p&gt;

&lt;h3&gt;
  
  
  VHDL
&lt;/h3&gt;

&lt;p&gt;Just used it at the school for one project and it was not my taste of cake :) This is something I don't know anything about. Just here because I want to remember I used it.&lt;/p&gt;

&lt;h3&gt;
  
  
  Assembler
&lt;/h3&gt;

&lt;p&gt;Hard to learn, hard to use, but with the good macros, it feels like C with more control. But still, I would probably use Rust/Go/C++/C with some bits of ASM today instead.&lt;/p&gt;

&lt;h3&gt;
  
  
  Perl
&lt;/h3&gt;

&lt;p&gt;Write-only language. Really unreadable mess. Try to avoid it. Fortunately, it is slowly dying.&lt;/p&gt;

&lt;h3&gt;
  
  
  Brainfuck/chicken/whitespace
&lt;/h3&gt;

&lt;p&gt;Not real languages, but &lt;a href="https://en.wikipedia.org/wiki/Esoteric_programming_language#Brainfuck" rel="noopener noreferrer"&gt;crazy experiments&lt;/a&gt;. I hope nobody is forced to do real work with these.&lt;/p&gt;

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

&lt;p&gt;If you are backend/mobile/desktop developer try Kotlin and/or Python. If you are full stack and are brave enough try &lt;a href="https://play.kotlinlang.org/hands-on/Building%20Web%20Applications%20with%20React%20and%20Kotlin%20JS/01_Introduction" rel="noopener noreferrer"&gt;Kotlin even on frontent&lt;/a&gt;. Still brave but not so much? Try &lt;a href="https://elm-lang.org" rel="noopener noreferrer"&gt;Elm&lt;/a&gt;. Otherwise, Typescript/React.js combo is good enough. I recommend &lt;a href="https://nextjs.org" rel="noopener noreferrer"&gt;Next.js framework&lt;/a&gt; to skip the boring stuff and start developing quickly. If you need the speed and/or low memory footprint try Rust and/or Go.&lt;/p&gt;

&lt;h3&gt;
  
  
  Links
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://drewdevault.com/2019/09/08/Enough-to-decide.html" rel="noopener noreferrer"&gt;https://drewdevault.com/2019/09/08/Enough-to-decide.html&lt;/a&gt;&lt;/p&gt;

</description>
      <category>languages</category>
    </item>
    <item>
      <title>JustDeleteMe in the real world</title>
      <dc:creator>Mišo</dc:creator>
      <pubDate>Sat, 04 Jul 2020 16:21:09 +0000</pubDate>
      <link>https://dev.to/misobelica/justdeleteme-in-the-real-world-21e9</link>
      <guid>https://dev.to/misobelica/justdeleteme-in-the-real-world-21e9</guid>
      <description>&lt;p&gt;Recently I was canceling some contracts with my internet provider, insurance, mobile operator, ... Unfortunately, it was not always easy and fast. I was wondering if there is some site for it. There are sites like &lt;a href="https://backgroundchecks.org/justdeleteme/" rel="noopener noreferrer"&gt;JustDeleteMe&lt;/a&gt; with the guides on how to cancel virtual accounts, but I would like to see the same for the real contracts.&lt;/p&gt;

&lt;p&gt;I know this is not so easy because the real world has borders and in every country, the rules are different even for the same company. But I hear from all sides how hard is to cancel some contract just because the company has some absurd rules, the intentionally complicated process, etc.&lt;/p&gt;

&lt;p&gt;I heard that the EU plans to force organizations to not make canceling harder than it has to be. But it's not the thing today and the countries outside the EU will be probably out of luck.&lt;/p&gt;

&lt;p&gt;Do you know such a site? Do you think it would be useful? I found &lt;a href="https://www.cleevio.com/" rel="noopener noreferrer"&gt;https://www.cleevio.com/&lt;/a&gt; but it's not the same thing I guess.&lt;/p&gt;

</description>
      <category>bureaucracy</category>
    </item>
  </channel>
</rss>
