<?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: Void⚡</title>
    <description>The latest articles on DEV Community by Void⚡ (@codewithvoid).</description>
    <link>https://dev.to/codewithvoid</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%2F966087%2F35c583d1-ed03-4fc2-ab64-09d5172550ba.jpg</url>
      <title>DEV Community: Void⚡</title>
      <link>https://dev.to/codewithvoid</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/codewithvoid"/>
    <language>en</language>
    <item>
      <title>A Deep Dive Into Programming Language Coding in a Grid</title>
      <dc:creator>Void⚡</dc:creator>
      <pubDate>Fri, 08 Dec 2023 13:17:15 +0000</pubDate>
      <link>https://dev.to/codewithvoid/a-deep-dive-into-programming-language-coding-in-a-grid-1214</link>
      <guid>https://dev.to/codewithvoid/a-deep-dive-into-programming-language-coding-in-a-grid-1214</guid>
      <description>&lt;p&gt;What? A programming language coding in a grid?&lt;/p&gt;

&lt;p&gt;Yes, you read that right, SPL (Structured Process Language) is a programming language that codes in a grid, and specially used for processing structured data.&lt;/p&gt;

&lt;p&gt;We know that almost all programming languages write code as text, so what does SPL code look like, and what is the difference between the grid-style code and the text-style code? Let's take a look at the programming environment of SPL first.&lt;/p&gt;

&lt;p&gt;Before we dive deep into the details, do support esproc project by dropping them a star on GitHub&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/SPLWare/esProc" class="ltag_cta ltag_cta--branded" rel="noopener noreferrer"&gt;Star the esProc SPL project ⭐️&lt;/a&gt;
&lt;/p&gt;

&lt;h2&gt;
  
  
  Code in a grid
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fstunqunqpebpkqtu1qmp.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fstunqunqpebpkqtu1qmp.png" alt="Code in a grid"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The middle part is the grid-style code of SPL.&lt;/p&gt;

&lt;p&gt;What are the benefits of writing code in a grid?&lt;/p&gt;

&lt;p&gt;When programming, we always need to use intermediate variables and name them. However, when we program in SPL, naming variables is often unnecessary. SPL allows us to reference the name of previous cell directly in subsequent steps and get the calculation result of the cell (such as A1), for example, &lt;code&gt;=A2.align@a(A6:~,date(Datetime))&lt;/code&gt;. In this way, racking our brains to define variables is avoided (as the variable has to be given a meaningful name, which is annoying); Of course, SPL also supports defining variables, yet there is no need to define the type of variable, and hence we can name a variable and use it directly, for example: &lt;code&gt;=cod=A4.new(ID:Commodity,0:Stock,:OosTime,0:TotalOosTime)&lt;/code&gt;. In addition, we can temporarily define a variable in expression, for example: &lt;code&gt;=A1.group@o(a+=if(x,1,0))&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;You may worry that a problem will occur when using cell name as variable name, that is, cell’s name (position) will change after inserting or deleting a row and column, and the original name will be referenced. Don't worry, this problem is already solved in SPL’s IDE, and the cell name will automatically change when inserting or deleting a row. For example, when inserting a row, the name of cells (red underlined names) changes accordingly, is it convenient?&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzqdnvw6w5bfjjfvzp7t2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzqdnvw6w5bfjjfvzp7t2.png" alt="Coding in grid"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The grid-style code will make us feel that the code is very neat. Because code is written in cells, it is naturally aligned. For instance, the indentation of cells indicates it is a code block (the for loop statement from A12 to A18), and any modifier is not needed, and thus it looks very neat and intuitive. Moreover, when the code in a cell is long due to the processing of a complicated task, the code occupies one cell only and will not affect the structure of entire code (it will not affect the read of the codes on the right and below since the code in a certain cell will not exceed the boundary of cell even though it is too long). In contrast, the text-style code doesn’t have this advantage because it has to display entire code.&lt;/p&gt;

&lt;p&gt;Besides, it should be noted that there is a collapse button at the row where the for loop is located, this button can collapse entire code block. Although such button is available in the IDE of multiple text-style programming languages, it will make entire code more neat and easier to read when it is used in SPL.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fe2xv6v8m3cabagwcp8rh.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fe2xv6v8m3cabagwcp8rh.png" alt="Coding in grid"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now let's look at the debug function. In the IDE of SPL, the upper toolbar provides &lt;strong&gt;multiple execution/debugging buttons&lt;/strong&gt;, including run, debug, run to cursor, step in, as well as other buttons like set breakpoints, calculate current cell, which can fully meet the needs of editing and debugging program. It executes one cell in each step, the breakpoint of code is very clear. In contrast, the execution/debugging of text-style code is different, there may be multiple actions in one line, which are not easy to distinguish, and breakpoint is not easy to be located when some statements are too long and have to be divided into multiple lines.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fudmbrg4po80cmc4t713j.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fudmbrg4po80cmc4t713j.png" alt="Coding in a Grid"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Attention should also be paid to the &lt;strong&gt;result panel&lt;/strong&gt; on the right. Because SPL adopts grid-style programming, the result of each step (cell) is retained after execution/debugging, which allows the programmer to view the calculation result of that step (cell) in real time by clicking on a cell, so whether the calculation is correct or not is clear, and the convenience of debugging is further enhanced as a result of eliminating the need to export result manually and viewing the result of each step in real time.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5lrlk6qqnzhsojlnr1tn.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5lrlk6qqnzhsojlnr1tn.png" alt="Coding in a Grid"&gt;&lt;/a&gt;&lt;em&gt;&lt;center&gt;Multi-layer result set&lt;/center&gt;&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The benefits don't stop at grid-style programming
&lt;/h2&gt;

&lt;p&gt;Writing code in cells will make programming convenient, for example, it’s easier to edit or debug. However, it will not simplify writing each statement. Let's take a look at SPL syntax itself.&lt;/p&gt;

&lt;p&gt;When processing data, especially complex scenario, we will definitely use loop and branch, which are the relatively basic functionalities of a programming language. Of course, SPL provides such functionalities. In addition, SPL provides many features, such as &lt;strong&gt;option syntax, multi-layer parameters, and advanced Lambda syntax.&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Function option
&lt;/h3&gt;

&lt;p&gt;Each programming language has a large number of built-in library functions, and the richer the library functions, the more convenient it is for us to implement functionality. Functions are distinguished by different name or parameter (and parameter type). However, when it is impossible to distinguish even by parameter type sometimes, we need to explicitly add an option parameter to tell the compiler or interpreter what we want to do. For example, processing files in Java will involve multiple OpenOptions, when we want to create a file that does not exist, the code is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="nc"&gt;Files&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;write&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="no"&gt;DUMMY_TEXT&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getBytes&lt;/span&gt;&lt;span class="o"&gt;(),&lt;/span&gt; &lt;span class="nc"&gt;StandardOpenOption&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;CREATE_NEW&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;When we want to open an existing file and create a new one that does not exist, the code is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="nc"&gt;Files&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;write&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="no"&gt;DUMMY_TEXT&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getBytes&lt;/span&gt;&lt;span class="o"&gt;(),&lt;/span&gt; &lt;span class="nc"&gt;StandardOpenOption&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;CREATE&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;When we want to append data to a file and ensure that the data will not lose in the case of system crash, the code is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="nc"&gt;Files&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;write&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="no"&gt;ANOTHER_DUMMY_TEXT&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getBytes&lt;/span&gt;&lt;span class="o"&gt;(),&lt;/span&gt; &lt;span class="nc"&gt;StandardOpenOption&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;APPEND&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;StandardOpenOption&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;WRITE&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;StandardOpenOption&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;SYNC&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;As we can see from the above codes that if we want to implement different functionalities with the same function, we need to select different options. Usually, an option is regarded as a parameter, but this will result in complexity in use, and often makes us confused about the real purpose of these parameters, and for some functions with unfixed number of parameters, there is no way to represent option with parameter.&lt;/p&gt;

&lt;p&gt;SPL provides very unique &lt;strong&gt;function option&lt;/strong&gt;, which allow the functions with similar functionality to share one function name, and the difference between functions is distinguished with function option, thus really playing the role of function option. In terms of form of expression, it tends to be a two-layer classification, making both remembering and using very convenient. For example, the pos function is used to search for the position of substring in a parent string, if we want to search from back to front, we can use the option @z:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="n"&gt;pos&lt;/span&gt;&lt;span class="nd"&gt;@z&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"abcdeffdef"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="s"&gt;"def"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;To perform a case-insensitive search, we can use the option @c:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="n"&gt;pos&lt;/span&gt;&lt;span class="nd"&gt;@c&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"abcdef"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="s"&gt;"Def"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The two options can also be used in combination:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="n"&gt;pos&lt;/span&gt;&lt;span class="nd"&gt;@zc&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"abcdeffdef"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="s"&gt;"Def"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;With the function option, we only need to be familiar with fewer functions. When we use the same function with different functionalities, we just need to find a corresponding option, it is equivalent that SPL classifies the functions into layers, which makes it more convenient to search and utilize.&lt;/p&gt;

&lt;h3&gt;
  
  
  Cascaded parameter
&lt;/h3&gt;

&lt;p&gt;The parameters of some functions are very complex and may be divided into multiple layers. In view of this situation, conventional programming languages do not have a special syntax solution, and can only generate multi-layer structured data object and then pass them in, which is very troublesome. For example, the following code is to perform a join operation in Java (inner join between Orders table and Employee table):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="nc"&gt;Map&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Integer&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;Employee&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nc"&gt;EIds&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Employees&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;collect&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Collectors&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;toMap&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nl"&gt;Employee:&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="nc"&gt;EId&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;Function&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;identity&lt;/span&gt;&lt;span class="o"&gt;()));&lt;/span&gt;
&lt;span class="n"&gt;record&lt;/span&gt; &lt;span class="nf"&gt;OrderRelation&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="nc"&gt;OrderID&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="nc"&gt;Client&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;Employee&lt;/span&gt; &lt;span class="nc"&gt;SellerId&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;double&lt;/span&gt; &lt;span class="nc"&gt;Amount&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;Date&lt;/span&gt; &lt;span class="nc"&gt;OrderDate&lt;/span&gt;&lt;span class="o"&gt;){}&lt;/span&gt;
&lt;span class="nc"&gt;Stream&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;OrderRelation&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="no"&gt;ORS&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nc"&gt;Orders&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;map&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;r&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
   &lt;span class="nc"&gt;Employee&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nc"&gt;EIds&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;get&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;SellerId&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
   &lt;span class="nc"&gt;OrderRelation&lt;/span&gt; &lt;span class="n"&gt;or&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;OrderRelation&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;OrderID&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;Client&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;Amount&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;OrderDate&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;or&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="o"&gt;}).&lt;/span&gt;&lt;span class="na"&gt;filter&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;SellerId&lt;/span&gt;&lt;span class="o"&gt;!=&lt;/span&gt;&lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It can be seen that it needs to pass a multi-layer (segment) parameter to Map to perform association, which is hard to read, let alone write. If we perform a little more calculations (other calculations are often involved after association), for example, group the Employee.Dept and sum the Orders.Amount, the code is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="nc"&gt;Map&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="nc"&gt;DoubleSummaryStatistics&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="no"&gt;ORS&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;collect&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Collectors&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;groupingBy&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;SellerId&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;Dept&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="nc"&gt;Collectors&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt; &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;summarizingDouble&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;Amount&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="nc"&gt;String&lt;/span&gt; &lt;span class="nl"&gt;dept:&lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;keySet&lt;/span&gt;&lt;span class="o"&gt;()){&lt;/span&gt;
 &lt;span class="nc"&gt;DoubleSummaryStatistics&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;get&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;dept&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
 &lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"group（dept）："&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="n"&gt;dept&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="s"&gt;" sum（Amount）："&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getSum&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;p&gt;There is no need to explain more about the complexity of such function because programmers have deep experience. In contrast, SQL is more intuitive and simpler.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;select&lt;/span&gt; &lt;span class="n"&gt;Dept&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="k"&gt;sum&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Amount&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="n"&gt;Orders&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt; &lt;span class="k"&gt;inner&lt;/span&gt; &lt;span class="k"&gt;join&lt;/span&gt; &lt;span class="n"&gt;Employee&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt; &lt;span class="k"&gt;on&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;SellerId&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt; &lt;span class="n"&gt;SellerId&lt;/span&gt; &lt;span class="k"&gt;group&lt;/span&gt; &lt;span class="k"&gt;by&lt;/span&gt; &lt;span class="n"&gt;Dept&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;SQL employs some keywords (from, join, etc.) to divide the calculation into several parts, which can be understood as a multi-layer parameter. Such parameters are just disguised as English for easy reading. However, this way is much less universal, because it needs to select special keywords for each statement, resulting in inconsistent statement structure.&lt;/p&gt;

&lt;p&gt;Instead of using keyword to separate parameters like SQL, and nesting multiple layers like Java, SPL creatively invents &lt;strong&gt;cascaded parameter&lt;/strong&gt;. SPL specifies that three layers of parameters are supported, and they are separated by semicolon, comma, and colon respectively. Semicolon represents the first level, and the parameters separated by semicolon form a group. If there is another layer of parameter in this group, separate them with comma, and if there is third-layer parameter in this group, separate them with colon. To implement the above association calculation in SPL, the code is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Orders&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;o&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;SellerId&lt;/span&gt; &lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;Employees&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;EId&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="n"&gt;groups&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Dept&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="k"&gt;sum&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;o&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Amount&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This code is simple and straightforward, and has no nested layer and inconsistent statement structure. Practice shows that three layers can basically meet requirement, we hardly meet a relationship of parameters which cannot be clearly described in three layers.&lt;/p&gt;

&lt;h3&gt;
  
  
  Advanced Lambda syntax
&lt;/h3&gt;

&lt;p&gt;We know that Lambda syntax can simplify coding, some programming languages have begun to support this syntax. For example, counting the number of empty strings in Java8 or higher version can be coded like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="nc"&gt;List&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;strings&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Arrays&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;asList&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"abc"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s"&gt;""&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"bc"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"efg"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"abcd"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="s"&gt;""&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"jkl"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;span class="kt"&gt;long&lt;/span&gt; &lt;span class="n"&gt;count&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;strings&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;stream&lt;/span&gt;&lt;span class="o"&gt;().&lt;/span&gt;&lt;span class="na"&gt;filter&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;string&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;string&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;isEmpty&lt;/span&gt;&lt;span class="o"&gt;()).&lt;/span&gt;&lt;span class="na"&gt;count&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This “(parameter)-&amp;gt; function body” Lambda expression can simplify the definition of anonymous function and is easy to use.&lt;/p&gt;

&lt;p&gt;Nevertheless, for some slightly complex calculations, the code will be longer. For example, perform a grouping and aggregating calculation on two fields:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="nc"&gt;Calendar&lt;/span&gt; &lt;span class="n"&gt;cal&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nc"&gt;Calendar&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getInstance&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;

&lt;span class="nc"&gt;Map&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Object&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;DoubleSummaryStatistics&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nc"&gt;Orders&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;collect&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Collectors&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;groupingBy&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;
   &lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;{&lt;/span&gt;
     &lt;span class="n"&gt;cal&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;setTime&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;OrderDate&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;cal&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;get&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Calendar&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;YEAR&lt;/span&gt;&lt;span class="o"&gt;)+&lt;/span&gt;&lt;span class="s"&gt;"_"&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;SellerId&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
   &lt;span class="o"&gt;},&lt;/span&gt;

   &lt;span class="nc"&gt;Collectors&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;summarizingDouble&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;{&lt;/span&gt;
     &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;Amount&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="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="nc"&gt;Object&lt;/span&gt; &lt;span class="nl"&gt;sellerid:&lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;keySet&lt;/span&gt;&lt;span class="o"&gt;()){&lt;/span&gt;
  &lt;span class="nc"&gt;DoubleSummaryStatistics&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;get&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sellerid&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
  &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;year_sellerid&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;sellerid&lt;/span&gt;&lt;span class="o"&gt;).&lt;/span&gt;&lt;span class="na"&gt;split&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"_"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
  &lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"group is (year):"&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="n"&gt;year_sellerid&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="err"&gt;\&lt;/span&gt;&lt;span class="o"&gt;]+&lt;/span&gt;&lt;span class="s"&gt;"\t(sellerid):"&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="n"&gt;year_sellerid&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="s"&gt;"\t sum is："&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getSum&lt;/span&gt;&lt;span class="o"&gt;()+&lt;/span&gt;&lt;span class="s"&gt;"\t count is："&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getCount&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;p&gt;In this code, any field name is preceded by a table name, i.e., “table name.field name”, and the table name cannot be omitted. The syntax of anonymous function is complex, and the complexity increases rapidly as the amount of code increases. Two anonymous functions will form a nested code, which is harder to understand. Implementing a grouping and aggregating calculation will involve multiple functions and libraries, including groupingBy, collect, Collectors, summarizingDouble, DoubleSummaryStatistics, etc., the complexity is very high.&lt;/p&gt;

&lt;p&gt;SPL also supports Lambda syntax, and the support degree is more thoroughly than other languages like Java. Now let's perform the above calculations in SPL.&lt;/p&gt;

&lt;p&gt;Count the number of empty strings:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;"abc"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;""&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;"bc"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;"efg"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;"abcd"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nv"&gt;""&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;"jkl"&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="k"&gt;count&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;~==&lt;/span&gt;&lt;span class="nv"&gt;""&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;SPL directly simplifies A.(x).count() to A.count(x), which is more convenient. However, this code doesn't seem to differ much from Java code. Let's see another calculation:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;Orders&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;groups&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;year&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;OrderDate&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;&lt;span class="n"&gt;Client&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;sum&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Amount&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;&lt;span class="k"&gt;count&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;See the difference? There are many advantages when performing grouping and aggregating calculation in SPL: i)it doesn’t need to define data structure in advance; ii) there is no redundant functions in the whole code; iii) the use of sum and count is simple and easy to understand, it is even difficult to perceive it is a nested anonymous function.&lt;/p&gt;

&lt;p&gt;Let's look at another example:&lt;/p&gt;

&lt;p&gt;There is a set in which a company's sales from January to December are stored. Based on this set, we can do the following calculations:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;A&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;=[820,459,636,639,873,839,139,334,242,145,603,932]&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;=A1.select(#%2==0)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;=A1.(if(#&amp;gt;1,~-~[-1],0))&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;A2: filter out the data of even-numbered months; A3: calculate the growth value of monthly sales.&lt;/p&gt;

&lt;p&gt;Here we use # and [-1], the former represents the current sequence number, and the latter means referencing the previous member. Similarly, if we want to compare the current member with next member, we can use [1]. The symbol #, [x], together with ~ (current member) are what make SPL unique in enhancing Lambda syntax. With these symbols, any calculation can be implemented without adding other parameter definition, and the description ability becomes stronger, and writing and understanding are easier.&lt;/p&gt;

&lt;p&gt;Function option, multi-layer parameters and advanced Lambda syntax are another aspect that sets SPL apart.&lt;/p&gt;

&lt;h2&gt;
  
  
  Structured data computing ability comparable to SQL
&lt;/h2&gt;

&lt;p&gt;SPL's grid-style coding and code features (function syntax, multi-layer parameter, Lambda syntax) make SPL look interesting. However, the invention of SPL is not for attracting attention but processing data efficiently. For this purpose, SPL provides a specialized structured data object: &lt;strong&gt;table sequence&lt;/strong&gt; (record) and provides rich computing library based on the table sequence. In addition, SPL supports dynamic data structure, which makes SPL have the same complete structured data processing ability as SQL.&lt;/p&gt;

&lt;p&gt;In contrast, Java, as a compiled language, is very cumbersome in data calculation due to the lack of necessary structured data object. Moreover, since Java doesn’t support dynamic data structure, the data cannot be generated dynamically during computation and has to be defined in advance, this problem was not well solved even after the emergence of Stream. In short, these shortcomings are all due to the fact that the base of Java doesn't provide sufficient support.&lt;/p&gt;

&lt;p&gt;SPL provides rich calculation functions, allowing us to calculate structured data conveniently. The functions include but not limited to:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nc"&gt;Orders&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;sort&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Amount&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;   &lt;span class="c1"&gt;// sort&lt;/span&gt;
&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nc"&gt;Orders&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;select&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Amount&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="nc"&gt;Quantity&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="mi"&gt;3000&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;like&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Client&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="s"&gt;"*S*"&lt;/span&gt;&lt;span class="o"&gt;))&lt;/span&gt;   &lt;span class="c1"&gt;// filter&lt;/span&gt;
&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nc"&gt;Orders&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;groups&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Client&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt; &lt;span class="n"&gt;sum&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Amount&lt;/span&gt;&lt;span class="o"&gt;))&lt;/span&gt;   &lt;span class="c1"&gt;// group&lt;/span&gt;
&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nc"&gt;Orders&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Client&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;   &lt;span class="c1"&gt;// distinct&lt;/span&gt;
&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;join&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nl"&gt;Orders:&lt;/span&gt;&lt;span class="n"&gt;o&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="nc"&gt;SellerId&lt;/span&gt; &lt;span class="o"&gt;;&lt;/span&gt; &lt;span class="nl"&gt;Employees:&lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="nc"&gt;EId&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;   &lt;span class="c1"&gt;// join&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now let’s see a double-field sorting example:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;A&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;=file("Orders.txt").import@t()&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;=A1.sort(-Client, Amount)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;In this code, @t means that the first row is read as field name, and subsequent rows are calculated directly with the field name rather than data object; -Client means reverse order.&lt;/p&gt;

&lt;p&gt;The code can also be written in one line on the premise of not affecting reading, which will make code shorter.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;file&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;"Orders.txt"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="n"&gt;import&lt;/span&gt;&lt;span class="o"&gt;@&lt;/span&gt;&lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="n"&gt;sort&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;Client&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Amount&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Let's recall the example in the previous section. When Java performs a grouping and aggregating calculation on two fields, it needs to write a long two-layer nested code, this will increase the cost of learning and use. For the same calculation, coding in SPL is the same as coding in SQL, whether it is to group one field or multiple fields:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;Orders&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;groups&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;year&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;OrderDate&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;&lt;span class="n"&gt;Client&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;sum&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Amount&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Similarly, for inner join calculation (then aggregation), coding in SPL is much simpler than other high-level languages:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Orders&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;o&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;SellerId&lt;/span&gt; &lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;Employees&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;EId&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="n"&gt;groups&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Dept&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;sum&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;o&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Amount&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Similar to SQL, SPL can change the association type with little modifications, and there is no need to modify other codes. For example, join@1 means left join, and join@f means full join.&lt;/p&gt;

&lt;p&gt;Rich data objects and libraries make SPL not only have the data processing ability comparable to SQL, but inherit some good features of high-level languages (such as procedural computing), thus making it easy for SPL to process data.&lt;/p&gt;

&lt;h2&gt;
  
  
  Computing abilities that surpass SQL
&lt;/h2&gt;

&lt;p&gt;From what we've discussed above (interesting grid-style programming, features like option syntax, and complete structured data objects and library), we know that SPL has the structured data processing ability comparable to SQL, allowing programmers to perform a lot of structured data processing and computation tasks in the absence of database.&lt;/p&gt;

&lt;p&gt;Then, does SPL merely play the role of “SQL” without database?&lt;/p&gt;

&lt;p&gt;Not really! SPL's ability is more than that. In fact, SPL has many advantages over SQL in terms of structured data computation.&lt;/p&gt;

&lt;p&gt;In practice, we often meet some scenarios that are difficult to code in SQL, and multiply-level nested SQL code with over a thousand lines are very common. For such scenarios, not only is it difficult to code in SQL, but it is also not easy to modify and maintain. Such SQL code is long and troublesome.&lt;/p&gt;

&lt;p&gt;Why does this happen?&lt;/p&gt;

&lt;p&gt;This is due to the fact that SQL doesn’t support certain features well, or even doesn’t support at all. Let’s look at a few examples to compare SPL and SQL.&lt;/p&gt;

&lt;h3&gt;
  
  
  Ordered computing
&lt;/h3&gt;

&lt;p&gt;Calculate the maximum number of trading days that a stock keeps rising based on stock transaction record table.&lt;/p&gt;

&lt;p&gt;Coding in SQL:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;select&lt;/span&gt; &lt;span class="k"&gt;max&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;continuousDays&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;from&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;select&lt;/span&gt; &lt;span class="k"&gt;count&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="n"&gt;continuousDays&lt;/span&gt;
   &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;select&lt;/span&gt; &lt;span class="k"&gt;sum&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;changeSign&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;over&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;order&lt;/span&gt; &lt;span class="k"&gt;by&lt;/span&gt; &lt;span class="n"&gt;tradeDate&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;unRiseDays&lt;/span&gt;
   &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;select&lt;/span&gt; &lt;span class="n"&gt;tradeDate&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
     &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="k"&gt;when&lt;/span&gt; &lt;span class="n"&gt;closePrice&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;lag&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;closePrice&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;over&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;order&lt;/span&gt; &lt;span class="k"&gt;by&lt;/span&gt; &lt;span class="n"&gt;tradeDate&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
     &lt;span class="k"&gt;then&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="k"&gt;end&lt;/span&gt; &lt;span class="n"&gt;changeSign&lt;/span&gt;
     &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="n"&gt;stock&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;group&lt;/span&gt; &lt;span class="k"&gt;by&lt;/span&gt; &lt;span class="n"&gt;unRiseDays&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This code nests 3 layers. Firstly, mark each record with a rising or falling flag through window function (mark 0 if the price rises, otherwise mark 1), and then accumulate by date to get the intervals with same rising flag (the accumulated value will change if the price doesn’t rise), and finally group by flag, count and find out the maximum value, which is the result we want.&lt;/p&gt;

&lt;p&gt;How do you feel about this code? Do you think it is tortuous? Does it take a while to understand? In fact, this is not a very complicated task, but even so, it is so difficult to code/read. Why does this happen? The is due to the fact that SQL’s set is unordered, and the members of set cannot be accessed by sequence number (or relative position). In addition, SQL doesn’t provide ordered grouping operation. Although some databases support window function and support order-related operations to a certain extent, it is far from enough (such as this example).&lt;/p&gt;

&lt;p&gt;Actually, this task can be implemented in a simpler way: sort by date; compare the price of the day with that of the previous day (order-related operation), and add 1 if the price rises, otherwise reset the current value as 0; find the maximum value.&lt;/p&gt;

&lt;p&gt;SPL directly supports ordered data set, and naturally supports order-related operations, allowing us to code according to natural thinking&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;A&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;=stock.sort(tradeDate)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;=0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;=A1.max(A2=if(closePrice&amp;gt;closePrice[-1],A2+1,0))&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Backed by ordered operation, and procedural computing (the advantage of Java), it is very easy for SPL to express, and the code is easy to write and understand.&lt;/p&gt;

&lt;p&gt;Even we follow the thinking of above SQL solution to code in SPL, it will be easier.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="n"&gt;stock&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sort&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;trade_date&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="k"&gt;group&lt;/span&gt;&lt;span class="o"&gt;@&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;close_price&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;close_price&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="k"&gt;max&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="n"&gt;len&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This code still makes use of the characteristic of orderliness. When a record meets the condition (stock price doesn't rise), a new group will be generated, and each rising interval will be put into a separate group. Finally, we only need to calculate the number of members of the group with maximum members. Although the thinking is the same as that of SQL, the code is much simpler.&lt;/p&gt;

&lt;h3&gt;
  
  
  Understanding of grouping
&lt;/h3&gt;

&lt;p&gt;List the last login interval of each user based on a user login record table:&lt;/p&gt;

&lt;p&gt;Coding in SQL:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;WITH&lt;/span&gt; &lt;span class="n"&gt;TT&lt;/span&gt; &lt;span class="k"&gt;AS&lt;/span&gt;
 &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="n"&gt;RANK&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="n"&gt;OVER&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;PARTITION&lt;/span&gt; &lt;span class="k"&gt;BY&lt;/span&gt; &lt;span class="n"&gt;uid&lt;/span&gt; &lt;span class="k"&gt;ORDER&lt;/span&gt; &lt;span class="k"&gt;BY&lt;/span&gt; &lt;span class="n"&gt;logtime&lt;/span&gt; &lt;span class="k"&gt;DESC&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;rk&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;T&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;t_loginT&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="n"&gt;uid&lt;/span&gt;&lt;span class="p"&gt;,(&lt;/span&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="n"&gt;TT&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;logtime&lt;/span&gt; &lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;TT&lt;/span&gt; &lt;span class="k"&gt;where&lt;/span&gt; &lt;span class="n"&gt;TT&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;uid&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;TTT&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;uid&lt;/span&gt; &lt;span class="k"&gt;and&lt;/span&gt; &lt;span class="n"&gt;TT&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;rk&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="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;SELET&lt;/span&gt; &lt;span class="n"&gt;TT&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;logtim&lt;/span&gt; &lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;TT&lt;/span&gt; &lt;span class="k"&gt;WHERE&lt;/span&gt; &lt;span class="n"&gt;TT&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;uid&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;TTT&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;uid&lt;/span&gt; &lt;span class="k"&gt;and&lt;/span&gt; &lt;span class="n"&gt;TT&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;rk&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;interval&lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;t_login&lt;/span&gt; &lt;span class="n"&gt;TTT&lt;/span&gt; &lt;span class="k"&gt;GROUP&lt;/span&gt; &lt;span class="k"&gt;BY&lt;/span&gt; &lt;span class="n"&gt;uid&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;To calculate the interval, the last two login records of user are required, which is essentially an in-group TopN operation. However, SQL forces aggregation after grouping, so it needs to adopt a self-association approach to implement the calculation indirectly.&lt;/p&gt;

&lt;p&gt;Coding in SPL:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;A&lt;/th&gt;
&lt;th&gt;B&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;=t_login.groups(uid;top(2,-logtime))&lt;/td&gt;
&lt;td&gt;Last 2 login records&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;=A1.new(uid,#2(1).logtime-#2(2).logtime:interval)&lt;/td&gt;
&lt;td&gt;Calculate interval&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;SPL has a new understanding on aggregation operation. In addition to common single value like SUM, COUNT, MAX and MIN, the aggregation result can be a set. For example, SPL regards the common TOPN calculation as an aggregation calculation like SUM and COUNT, which can be performed either on a whole set or a grouped subset (such as this example).&lt;/p&gt;

&lt;p&gt;In contrast, SQL does not regard TOPN operation as aggregation. For the TOPN operation on a whole set, SQL can only implement by taking the first N items after sorting the outputted result set, while for the TOPN operation on a grouped subset, it is hard for SOL to implement unless turning to a roundabout way to make up sequence numbers. Since SPL regards TOPN as aggregation, it is easy to implement some calculations (such as this example) after making use of the characteristic of ordered data, and this approach can also avoid sorting all data in practice, thereby achieving higher performance.&lt;/p&gt;

&lt;p&gt;Furthermore, the grouping of SPL can not only be followed by aggregation, but retain the grouping result (grouped subset), i.e., the set of sets, so that the operation between grouped members can be performed.&lt;/p&gt;

&lt;p&gt;Compared with SPL, SQL does not have explicit set data type, and cannot return the data types such as set of sets. Since SQL cannot implement independent grouping, grouping and aggregating have to be bound as a whole.&lt;/p&gt;

&lt;p&gt;From the above two examples, we can see the advantages of SPL in &lt;strong&gt;ordered&lt;/strong&gt; and &lt;strong&gt;grouping&lt;/strong&gt; computations. In fact, many of SPL's features are built on the deep understanding of structured data processing. Specifically, the &lt;strong&gt;discreteness&lt;/strong&gt; allows us to separate the records that from the data table and compute them independently and repeatedly; the &lt;strong&gt;universal set&lt;/strong&gt; supports the set composed of any data, and participating in computation; the &lt;strong&gt;join operation&lt;/strong&gt; distinguishes three different types of joins, allowing us to choose a join operation according to actual situation; the feature of supporting &lt;strong&gt;cursor&lt;/strong&gt; enables SPL to have the ability to process big data... By means of these features, it will be easier and more efficient for us to process data.&lt;/p&gt;

&lt;p&gt;For more information, refer to: &lt;a href="http://c.scudata.com/article/1668134856969" rel="noopener noreferrer"&gt;SPL Operations for Beginners&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Unexpectedly, SPL can also serve as a data warehouse
&lt;/h3&gt;

&lt;p&gt;Supporting both in-memory computing and external storage computing means SPL can also be used to process big data, and SPL is higher in performance compared with traditional technologies. SPL provides dozens of high-performance algorithms with “lower complexity” to ensure computing performance, including:&lt;/p&gt;

&lt;p&gt;In-memory computing: binary search, sequence number positioning, position index, hash index, multi-layer sequence number positioning...&lt;/p&gt;

&lt;p&gt;External storage search: binary search, hash index, sorting index, index-with-values, full-text retrieval...&lt;/p&gt;

&lt;p&gt;Traversal computing: delayed cursor, multipurpose traversal, parallel multi-cursor, ordered grouping and aggregating, sequence number grouping...&lt;/p&gt;

&lt;p&gt;Foreign key association: foreign key addressization, foreign key sequence-numberization, index reuse, aligned sequence, one-side partitioning...&lt;/p&gt;

&lt;p&gt;Merge and join: ordered merging, merge by segment, association positioning, attached table...&lt;/p&gt;

&lt;p&gt;Multidimensional analysis: partial pre-aggregation, time period pre-aggregation, redundant sorting, boolean dimension sequence, tag bit dimension...&lt;/p&gt;

&lt;p&gt;Cluster computing: cluster multi-zone composite table, duplicate dimension table, segmented dimension table, redundancy-pattern fault tolerance and spare-wheel-pattern fault tolerance, load balancing...&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkraz9bb3o00np3zfui74.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkraz9bb3o00np3zfui74.png" alt="Comparison Table"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;As we can see that SPL provides so many algorithms (some of which are pioneered in the industry), and also provide corresponding guarantee mechanism for different computing scenarios. As a programming language, SPL provides not only the abilities that are unique to database but other abilities, which can fully guarantee computing performance.&lt;/p&gt;

&lt;p&gt;In addition to these algorithms (functions), storage needs to be mentioned. Some high-performance algorithms work only after the data is stored as a specified form. For example, the ordered merge and one-side partitioning algorithms mentioned above can be performed only after the data is stored in order. In order to ensure computing performance, SPL designs a specialized binary file storage. By means of this storage, and by adopting the storage mechanisms such as code compression, columnar storage and parallel segmentation, and utilizing the approaches like sorting and index, the effectiveness of high-performance algorithms is maximized, thus achieving higher computing performance.&lt;/p&gt;

&lt;p&gt;High-performance algorithms and specialized storage make SPL have all key abilities of data warehouse, thereby making it easy to replace traditional relational data warehouses and big data platforms like Hadoop at lower cost and higher efficiency.&lt;/p&gt;

&lt;p&gt;In practice, when used as a data warehouse, SPL does show different performance compared with traditional solutions. For example, in an e-commerce funnel analysis scenario, SPL is nearly 20 times faster than Snowflake even if running on a server with lower configuration; in a computing scenario of NAOC on clustering celestial bodies, the speed of SPL running on a single server is 2000 times faster than that of a cluster composed of a certain top distributed database. There are many similar scenarios, basically, SPL can speed up several times to dozens of times, showing very outstanding performance.&lt;/p&gt;

&lt;p&gt;In summary, SPL, as a specialized data processing language, adopts very unconventional grid-style programming, which brings convenience in many aspects such as format and debugging (of course, those who are used to text-style programming need to adapt to this change). Moreover, in terms of syntax, SPL incorporates some new features such as option, multi-layer parameters and Lambda syntax, making SPL look interesting. However, these features actually serve data computing, which stem from SPL's deep understanding of structured data computing (deeper and more complete than SQL). Only with the deep understanding can these interesting features be developed, and only with these features can data be processed more simply, conveniently and quickly. Simpler in coding and faster in running is what SPL aims to achieve, and in the process, the application framework can also be improved (not detailed here).&lt;/p&gt;

&lt;p&gt;In short, SPL is a programming language that is worth trying.&lt;/p&gt;

&lt;p&gt;And if you found this article helpful:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/SPLWare/esProc" class="ltag_cta ltag_cta--branded" rel="noopener noreferrer"&gt;Star the esProc SPL project ⭐️&lt;/a&gt;
&lt;/p&gt;

</description>
      <category>programming</category>
      <category>tutorial</category>
      <category>opensource</category>
      <category>database</category>
    </item>
    <item>
      <title>Non-coders Guide to Contributing to Open Source</title>
      <dc:creator>Void⚡</dc:creator>
      <pubDate>Thu, 27 Apr 2023 13:28:51 +0000</pubDate>
      <link>https://dev.to/codewithvoid/non-coders-guide-to-open-source-contributions-pbo</link>
      <guid>https://dev.to/codewithvoid/non-coders-guide-to-open-source-contributions-pbo</guid>
      <description>&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--vm9bRZoz--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/m3qd96pnvmw2yxh5qhyy.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--vm9bRZoz--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/m3qd96pnvmw2yxh5qhyy.png" alt="Tweet Text" width="800" height="353"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In 2023, I can't think of a better way to showcase your skills than contributing to open source.&lt;/p&gt;

&lt;p&gt;And that's not only for experienced programmers, but ANYONE having a career in tech. &lt;/p&gt;

&lt;p&gt;In this post, I will cover contributions that non-coders can make to started with their open source journey (right away).&lt;/p&gt;

&lt;p&gt;Let's dive in! 🚀 &lt;/p&gt;




&lt;h2&gt;
  
  
  TL;DR
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Report Issues 🐞&lt;/li&gt;
&lt;li&gt;Suggest Improvements 💡&lt;/li&gt;
&lt;li&gt;Participate in Discussions 💬&lt;/li&gt;
&lt;li&gt;Improve Documentation 📝&lt;/li&gt;
&lt;li&gt;Spread the Word 🗣️&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Report Issues 🐞
&lt;/h2&gt;

&lt;p&gt;Every project has some areas of improvement.&lt;/p&gt;

&lt;p&gt;• Broken links&lt;br&gt;
• UI glitch&lt;br&gt;
• Cryptic error messages&lt;/p&gt;

&lt;p&gt;You can battle-test the product&lt;br&gt;
And help maintainers identify bugs.&lt;/p&gt;

&lt;p&gt;Make sure you provide context and steps to reproduce the issue.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://i.giphy.com/media/ghUYvOphX3RKaeWNlO/giphy.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://i.giphy.com/media/ghUYvOphX3RKaeWNlO/giphy.gif" alt="report issues" width="480" height="360"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Suggest Improvements 💡
&lt;/h2&gt;

&lt;p&gt;If you can’t find any obvious bugs...&lt;/p&gt;

&lt;p&gt;Think what could have improved your user experience?&lt;/p&gt;

&lt;p&gt;How is app rendering on mobile?&lt;br&gt;
Is page load speed ok?&lt;br&gt;
Any instructions which are not clear?&lt;/p&gt;

&lt;p&gt;Raise improvements as feature requests.&lt;/p&gt;

&lt;h2&gt;
  
  
  Participate in Discussions 💬
&lt;/h2&gt;

&lt;p&gt;Collaboration is key in open source.&lt;/p&gt;

&lt;p&gt;Be active in project related discussions.&lt;/p&gt;

&lt;p&gt;Depending on the project it can be over:&lt;br&gt;
• Discord/Slack&lt;br&gt;
• Mailing Lists&lt;br&gt;
• GitHub Issues&lt;/p&gt;

&lt;p&gt;See where you can add value or share a perspective.&lt;/p&gt;

&lt;h2&gt;
  
  
  Improve Documentation 📝
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://i.giphy.com/media/xT4uQwLt2AyurOGWFW/giphy.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://i.giphy.com/media/xT4uQwLt2AyurOGWFW/giphy.gif" alt="improve documentation" width="480" height="264"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Open source projects should be easy to use and understand.&lt;/p&gt;

&lt;p&gt;Lot of it depends on the documentation.&lt;/p&gt;

&lt;p&gt;You can audit project repo to know what’s missing.&lt;br&gt;
And contribute in form of:&lt;/p&gt;

&lt;p&gt;• User Guides&lt;br&gt;
• Demo Videos&lt;br&gt;
• FAQs&lt;/p&gt;

&lt;h2&gt;
  
  
  Spread the Word 🗣️
&lt;/h2&gt;

&lt;p&gt;Lastly..every open source project needs evangelism.&lt;/p&gt;

&lt;p&gt;Share your experience of using it in a:&lt;br&gt;
Tweet&lt;br&gt;
Blogpost&lt;br&gt;
Or a YouTube video&lt;/p&gt;

&lt;p&gt;That’s how projects get visibility and reach.&lt;br&gt;
And you’ll learn some marketing 🙂&lt;/p&gt;

&lt;h2&gt;
  
  
  Wrapping Up 🎬
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://i.giphy.com/media/1XdfVRTyn5d31Q1lG0/giphy.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://i.giphy.com/media/1XdfVRTyn5d31Q1lG0/giphy.gif" alt="wrapping up" width="416" height="371"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;That's it!&lt;/p&gt;

&lt;p&gt;These are some ideas on how can you make valuable no-code contributions to an open source project.&lt;/p&gt;

&lt;p&gt;BTW - If you’re looking for an open source project...&lt;/p&gt;

&lt;p&gt;Here’s mine: &lt;a href="https://github.com/codewithvoid/AskDevs"&gt;AskDevs&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you liked this post, follow me for more of these 🙂&lt;/p&gt;

&lt;p&gt;Also, would love to hear any no-code contribution I missed in comments 👇&lt;/p&gt;

</description>
      <category>opensource</category>
      <category>tutorial</category>
      <category>beginners</category>
      <category>career</category>
    </item>
    <item>
      <title>Beyond Google: How to Ask Good Questions as a Developer</title>
      <dc:creator>Void⚡</dc:creator>
      <pubDate>Tue, 07 Mar 2023 18:09:18 +0000</pubDate>
      <link>https://dev.to/codewithvoid/beyond-google-how-to-ask-good-questions-as-a-developer-2jaa</link>
      <guid>https://dev.to/codewithvoid/beyond-google-how-to-ask-good-questions-as-a-developer-2jaa</guid>
      <description>&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--RJbxc372--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/xksst4d49fnm6y652wqn.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--RJbxc372--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/xksst4d49fnm6y652wqn.png" alt="underrated skill as a programmer - knowing when to ask for help" width="800" height="364"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;As junior developer, asking for help can be hard.&lt;/p&gt;

&lt;p&gt;But it's also a low effort way to level up IMO.&lt;/p&gt;

&lt;p&gt;In this article, sharing a 4-step checklist that I have refined over the years in my software career.&lt;/p&gt;

&lt;p&gt;By putting these checks before asking questions will:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Improve quality of your questions.&lt;/li&gt;
&lt;li&gt;Get you more responses.&lt;/li&gt;
&lt;li&gt;Build credebility in community.
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Let's dive in 🚀&lt;/p&gt;




&lt;h2&gt;
  
  
  TL;DR
&lt;/h2&gt;

&lt;p&gt;✔️ Did I try googling?&lt;br&gt;
✔️ Have I provided enough context?&lt;br&gt;
✔️ Have I shared what I have tried?&lt;br&gt;
✔️ Is the question specific and readable?&lt;/p&gt;

&lt;h3&gt;
  
  
  ✔️ Did I try googling?
&lt;/h3&gt;

&lt;p&gt;Why wait for someone else to respond when you can help yourself. &lt;/p&gt;

&lt;p&gt;Being able to find answers on your own will make you more independent and instill confidence in your skill.&lt;/p&gt;

&lt;h3&gt;
  
  
  ✔️ Have I provided enough context?
&lt;/h3&gt;

&lt;p&gt;Without enough background, there's a high chance your question will be misunderstood.&lt;/p&gt;

&lt;p&gt;By giving detailed context you will invite more helpful responses and better feedback.&lt;/p&gt;

&lt;h3&gt;
  
  
  ✔️ Have I shared what I have tried?
&lt;/h3&gt;

&lt;p&gt;Others will be more willing to help you if they see you putting effort. &lt;/p&gt;

&lt;p&gt;With your examples, people will get a better understanding of your problem and suggest solutions which you haven't already tried.&lt;/p&gt;

&lt;h3&gt;
  
  
  ✔️ Is the question specific and readable?
&lt;/h3&gt;

&lt;p&gt;Specific and readable questions will get you a faster and more accurate response.&lt;/p&gt;

&lt;p&gt;It shows professionalism and attention to detail which builds positive rapport in the developer community.&lt;/p&gt;




&lt;h2&gt;
  
  
  Wrapping Up
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://i.giphy.com/media/l0IycQmt79g9XzOWQ/giphy.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://i.giphy.com/media/l0IycQmt79g9XzOWQ/giphy.gif" alt="wrapping up" width="480" height="270"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Hope you found this checklist helpful.&lt;/p&gt;

&lt;p&gt;If you liked this post, follow me for more of these 🙂&lt;/p&gt;

&lt;p&gt;Also, would love to hear if anything you would like to add or remove in it 👇&lt;/p&gt;

</description>
      <category>beginners</category>
      <category>codenewbie</category>
      <category>tutorial</category>
      <category>webdev</category>
    </item>
    <item>
      <title>22 Valuable Lessons From Decade of Software Engineering</title>
      <dc:creator>Void⚡</dc:creator>
      <pubDate>Tue, 28 Feb 2023 18:16:46 +0000</pubDate>
      <link>https://dev.to/codewithvoid/22-valuable-lessons-from-decade-of-software-engineering-7g2</link>
      <guid>https://dev.to/codewithvoid/22-valuable-lessons-from-decade-of-software-engineering-7g2</guid>
      <description>&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fa38vnj1ee3zriw4fz8lm.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fa38vnj1ee3zriw4fz8lm.png" alt="Programming life lesson"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Career of a software developer is a journey of life long learning. So, I took sometime off to lookback and reflect. &lt;/p&gt;

&lt;p&gt;In this article, I have documented my learnings in 22 lessons that will guide those who are starting or early in their tech career. &lt;/p&gt;

&lt;p&gt;Let's go! 🚀&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Start applying for interviews before you think you are ready. &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The tech world moves quickly. Make learning a habit.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Consistency and patience will help your career more than any technology.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Train your mind to see failure as feedback.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Building in public is the cheat code to new opportunities.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Getting a job with your network &amp;gt;&amp;gt;&amp;gt; Sending resumes.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Doing tutorials hide knowledge gaps. Building projects expose them. &lt;br&gt;
&lt;a href="https://i.giphy.com/media/v1.Y2lkPTc5MGI3NjExNDIyNThjMjc3Njg3OTgzNThmYmY1YzAyMWY2N2NiOTM3NjIzZjcwYiZjdD1n/scZPhLqaVOM1qG4lT9/giphy.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://i.giphy.com/media/v1.Y2lkPTc5MGI3NjExNDIyNThjMjc3Njg3OTgzNThmYmY1YzAyMWY2N2NiOTM3NjIzZjcwYiZjdD1n/scZPhLqaVOM1qG4lT9/giphy.gif" alt="coding cat"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Working on a project that you are passionate about will 10x your learning.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Your time estimations will be way off. Underpromise and over-deliver.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Be comfortable with not knowing everything. Be confident that you will figure it out. &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Career growth without acquiring soft skills can be hard.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Learning to ask for help is an underrated skill.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Learn googling. You don’t need to build what you can search for. &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Don’t fear mistakes. Fear not trying.&lt;a href="https://i.giphy.com/media/v1.Y2lkPTc5MGI3NjExYmNiYzZjMmJiMGQ0Mjc5NjQ3M2QzZTRjOWVlYTYwOWI5MzAxYTdiNiZjdD1n/fwbZnTftCXVocKzfxR/giphy.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://i.giphy.com/media/v1.Y2lkPTc5MGI3NjExYmNiYzZjMmJiMGQ0Mjc5NjQ3M2QzZTRjOWVlYTYwOWI5MzAxYTdiNiZjdD1n/fwbZnTftCXVocKzfxR/giphy.gif" alt="we can code this"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Avoid over-engineering as much. It will distract you from the main task.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;You don’t need more courses. You need to build projects. &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;You can only improve what you measure.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Make time to unwind and recharge.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;A good portfolio brings contacts, clients and potential employers. &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Knowing how to code is not enough. You need to create something.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;You learn by &lt;em&gt;finishing&lt;/em&gt; projects, not by starting them.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Working on an exciting project is a form of self-care. &lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;That's it!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://i.giphy.com/media/v1.Y2lkPTc5MGI3NjExYWUwY2IzMjQwNmY5NDM1OWFiOTIxNjc3ZWJjNDA2YWJjNmYyNDA2YiZjdD1n/KfwyWfTwMu1FG0XhO8/giphy.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://i.giphy.com/media/v1.Y2lkPTc5MGI3NjExYWUwY2IzMjQwNmY5NDM1OWFiOTIxNjc3ZWJjNDA2YWJjNmYyNDA2YiZjdD1n/KfwyWfTwMu1FG0XhO8/giphy.gif" alt="That's it"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I hope you found these lessons helpful.&lt;/p&gt;

&lt;p&gt;Give me a follow for more of these. 😊&lt;/p&gt;

&lt;p&gt;If you personally had contrary experience, I would love to know about that. Share in comments. 💬&lt;/p&gt;

</description>
      <category>beginners</category>
      <category>programming</category>
      <category>codenewbie</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Avoid These 10 Blunders In Your Next Coding Interview</title>
      <dc:creator>Void⚡</dc:creator>
      <pubDate>Tue, 21 Feb 2023 18:26:07 +0000</pubDate>
      <link>https://dev.to/codewithvoid/avoid-these-10-blunders-in-your-next-coding-interview-1f7i</link>
      <guid>https://dev.to/codewithvoid/avoid-these-10-blunders-in-your-next-coding-interview-1f7i</guid>
      <description>&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fugndwatl2c3olnx5yr07.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fugndwatl2c3olnx5yr07.png" alt="How to fail a coding interview"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In my software engineering career I have taken 200+ coding interviews. &lt;/p&gt;

&lt;p&gt;In this article, sharing top 10 most common blunders interviewees make in the interviews and tips on fixing them.&lt;/p&gt;

&lt;h2&gt;
  
  
  TL;DR
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Not understanding the problem&lt;/li&gt;
&lt;li&gt;Not asking questions&lt;/li&gt;
&lt;li&gt;Not planning before coding&lt;/li&gt;
&lt;li&gt;Not thinking out loud&lt;/li&gt;
&lt;li&gt;Not using hints&lt;/li&gt;
&lt;li&gt;Not giving brute-force solution&lt;/li&gt;
&lt;li&gt;Not optimizing the solution&lt;/li&gt;
&lt;li&gt;Not speaking while coding&lt;/li&gt;
&lt;li&gt;Not knowing Big O notation&lt;/li&gt;
&lt;li&gt;Not testing the solution&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  ❌ Not understanding the problem
&lt;/h2&gt;

&lt;p&gt;Fix:&lt;/p&gt;

&lt;p&gt;✅ Re-read the question until you understand constraints and edge cases.&lt;/p&gt;

&lt;p&gt;✅ Re-phrase question in your own words and verify understanding with the interviewer.&lt;/p&gt;

&lt;h2&gt;
  
  
  ❌ Not asking questions
&lt;/h2&gt;

&lt;p&gt;Fix:&lt;/p&gt;

&lt;p&gt;✅ Clarify any detail about the problem you find ambiguous. &lt;/p&gt;

&lt;p&gt;✅ Ask for problem constraints. Range of values, size of input, etc.&lt;/p&gt;

&lt;p&gt;✅ Ask the interviewer if they prefer time or space optimized solution.&lt;/p&gt;

&lt;h2&gt;
  
  
  ❌ Not planning before coding
&lt;/h2&gt;

&lt;p&gt;Fix:&lt;/p&gt;

&lt;p&gt;✅ Determine starting and ending points for solving the problem. &lt;/p&gt;

&lt;p&gt;✅ Develop a high level algorithm before refining details.&lt;/p&gt;

&lt;h2&gt;
  
  
  ❌  Not thinking out loud
&lt;/h2&gt;

&lt;p&gt;Fix:&lt;/p&gt;

&lt;p&gt;✅ Discuss solution approach with the interviewer.&lt;/p&gt;

&lt;p&gt;✅ Walk them through your implementation by dry running code.&lt;/p&gt;

&lt;h2&gt;
  
  
  ❌  Not using hints
&lt;/h2&gt;

&lt;p&gt;Fix:&lt;/p&gt;

&lt;p&gt;✅ Acknowledge the hint and how does it help.&lt;/p&gt;

&lt;p&gt;✅ Expand on hint and see where else can it improve the solution.&lt;/p&gt;

&lt;h2&gt;
  
  
  ❌ Not giving brute-force solution
&lt;/h2&gt;

&lt;p&gt;Fix:&lt;/p&gt;

&lt;p&gt;✅ Start by sharing simplest brute force solution.&lt;/p&gt;

&lt;p&gt;✅ Explain why the approach is sub-optimal.&lt;/p&gt;

&lt;h2&gt;
  
  
  ❌ Not optimizing the solution
&lt;/h2&gt;

&lt;p&gt;Fix:&lt;/p&gt;

&lt;p&gt;✅ Go through the solution step by step and identify the inefficiencies.&lt;/p&gt;

&lt;p&gt;✅ Resolve inefficiencies by using right data structure or algorithm for the task.&lt;/p&gt;

&lt;h2&gt;
  
  
  ❌ Not speaking while coding
&lt;/h2&gt;

&lt;p&gt;Fix:&lt;/p&gt;

&lt;p&gt;✅ Keep explaining to the interviewer what you are coding.&lt;/p&gt;

&lt;p&gt;✅ Don’t speak code verbatim, also explain why you made a decision.&lt;/p&gt;

&lt;h2&gt;
  
  
  ❌  Not knowing Big O notation
&lt;/h2&gt;

&lt;p&gt;Fix:&lt;/p&gt;

&lt;p&gt;✅ Know time and space complexity of classic algorithms.&lt;/p&gt;

&lt;p&gt;✅ Practice calculating complexity of your code.&lt;/p&gt;

&lt;h2&gt;
  
  
  ❌  Not testing the solution
&lt;/h2&gt;

&lt;p&gt;Fix:&lt;/p&gt;

&lt;p&gt;✅ Dry run the code with sample inputs and edge cases.&lt;/p&gt;

&lt;p&gt;✅ If code doesn’t work, show that you understand why is that so.&lt;/p&gt;

&lt;h2&gt;
  
  
  Wrapping up 📝
&lt;/h2&gt;

&lt;p&gt;Hope you will avoid these blunders in your next coding interview.&lt;/p&gt;

&lt;p&gt;If you liked this post, follow me for more of these. 🙂&lt;/p&gt;

&lt;p&gt;Also, share ONE interview mistake that you never want to repeat in comments. 👇&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>tutorial</category>
      <category>career</category>
      <category>programming</category>
    </item>
    <item>
      <title>Obvious Mistakes Every Junior Developer Should Avoid</title>
      <dc:creator>Void⚡</dc:creator>
      <pubDate>Tue, 14 Feb 2023 18:23:28 +0000</pubDate>
      <link>https://dev.to/codewithvoid/obvious-mistakes-every-junior-developer-should-avoid-1bc9</link>
      <guid>https://dev.to/codewithvoid/obvious-mistakes-every-junior-developer-should-avoid-1bc9</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcb5idogbnhukq7rbwt1z.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcb5idogbnhukq7rbwt1z.png" alt="Mistake every developer should avoid" width="800" height="407"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I asked tech twitter to share ONE mistake they wish they had avoided in their developer journey. I have documented the top responses in this article. Hope these will be helpful — &lt;strong&gt;especially for beginner devleopers&lt;/strong&gt;. &lt;/p&gt;

&lt;p&gt;Let's dive in! 🚀 &lt;/p&gt;

&lt;h2&gt;
  
  
  TL;DR
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Overwhelming yourself 😟&lt;/li&gt;
&lt;li&gt;Setting unrealistic goals 🎯&lt;/li&gt;
&lt;li&gt;Not tracking progress 📈&lt;/li&gt;
&lt;li&gt;Not being consistent 🗓️&lt;/li&gt;
&lt;li&gt;Not taking breaks ☕&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Overwhelming yourself 😟
&lt;/h2&gt;

&lt;p&gt;In tech there is always:&lt;/p&gt;

&lt;p&gt;A new library&lt;br&gt;
A new framework&lt;br&gt;
A new buzz word&lt;/p&gt;

&lt;p&gt;…to overwhelm you.&lt;/p&gt;

&lt;p&gt;It’s ok to not know everything.&lt;/p&gt;

&lt;p&gt;Learn to take things 1 at a time.&lt;/p&gt;

&lt;h2&gt;
  
  
  Setting unrealistic goals 🎯
&lt;/h2&gt;

&lt;p&gt;No, you can’t learn JavaScript in 1 month.&lt;/p&gt;

&lt;p&gt;Or Python. Or Kubernetes.&lt;/p&gt;

&lt;p&gt;You want accomplishment, but you will get anxiety.&lt;/p&gt;

&lt;p&gt;Instead:&lt;/p&gt;

&lt;p&gt;Set small goals. Have low expectations.&lt;/p&gt;

&lt;p&gt;And scale slowly as you gain momentum.&lt;/p&gt;

&lt;h2&gt;
  
  
  Not tracking progress 📈
&lt;/h2&gt;

&lt;p&gt;Measuring progress doesn’t come naturally.&lt;/p&gt;

&lt;p&gt;But, without it you will reach nowhere.&lt;/p&gt;

&lt;p&gt;Track finished projects.&lt;br&gt;
Track time taken for tasks.&lt;br&gt;
Track happiness levels.&lt;/p&gt;

&lt;p&gt;Remember:&lt;/p&gt;

&lt;p&gt;You can only improve what you measure.&lt;/p&gt;

&lt;h2&gt;
  
  
  Not being consistent 🗓️
&lt;/h2&gt;

&lt;p&gt;If you want to be good at something,&lt;/p&gt;

&lt;p&gt;you need to stick to it.&lt;/p&gt;

&lt;p&gt;Long term consistency &amp;gt; Short term intensity.&lt;/p&gt;

&lt;p&gt;Don’t overcomplicate it.&lt;/p&gt;

&lt;p&gt;Start today. Repeat tomorrow.&lt;/p&gt;

&lt;h2&gt;
  
  
  Not taking breaks ☕
&lt;/h2&gt;

&lt;p&gt;Working without breaks leads to burnout.&lt;/p&gt;

&lt;p&gt;So, disconnect from work.&lt;/p&gt;

&lt;p&gt;Often.&lt;/p&gt;

&lt;p&gt;Listen to music&lt;br&gt;
Go for a walk&lt;br&gt;
Talk to your friend.&lt;/p&gt;

&lt;p&gt;Make time to recharge.&lt;/p&gt;

&lt;h2&gt;
  
  
  Wrapping up 📝
&lt;/h2&gt;

&lt;p&gt;Hope you will learn from these mistakes and avoid them in your career.&lt;/p&gt;

&lt;p&gt;If you liked this post, follow me for more of these. 🙂&lt;/p&gt;

&lt;p&gt;Share a mistake that you wish you had avoided. Would love to hear it. 👇&lt;/p&gt;

</description>
      <category>algorithms</category>
      <category>python</category>
      <category>career</category>
      <category>productivity</category>
    </item>
    <item>
      <title>How to Get Mentorship — Without Hiring a Mentor</title>
      <dc:creator>Void⚡</dc:creator>
      <pubDate>Tue, 07 Feb 2023 18:20:58 +0000</pubDate>
      <link>https://dev.to/codewithvoid/how-to-get-mentorship-without-hiring-a-mentor-5ahk</link>
      <guid>https://dev.to/codewithvoid/how-to-get-mentorship-without-hiring-a-mentor-5ahk</guid>
      <description>&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--p4Zc3byH--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/cbrjqccsf1cr23nmpyaf.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--p4Zc3byH--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/cbrjqccsf1cr23nmpyaf.png" alt="How to delay your growth: Take feedback lightly" width="800" height="364"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;#1 mistake I made as a developer:&lt;/p&gt;

&lt;p&gt;Not seeking feedback&lt;/p&gt;

&lt;p&gt;In this article, I am sharing 5 ways you can get guidance and valuable feedback in your developer journey without 1:1 mentorship.&lt;/p&gt;

&lt;p&gt;Let's go! 🚀&lt;/p&gt;

&lt;h2&gt;
  
  
  TL;DR
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Open source your code 📖&lt;/li&gt;
&lt;li&gt;Pair program with peers 👥&lt;/li&gt;
&lt;li&gt;Join Developer Communities 👪&lt;/li&gt;
&lt;li&gt;Build in public 🔨&lt;/li&gt;
&lt;li&gt;Get your code reviewed by peers 🖥️&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Open source your code 📖
&lt;/h2&gt;

&lt;p&gt;Open source refers to making code publicly accessible for people to use and contribute under a license&lt;/p&gt;

&lt;p&gt;Benefits of open source:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Proof of skills&lt;/li&gt;
&lt;li&gt;Genuine Networking&lt;/li&gt;
&lt;li&gt;Better software quality&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--IyMaeg2k--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ipuzky5nhp4xlhqkxef5.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--IyMaeg2k--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ipuzky5nhp4xlhqkxef5.png" alt="open source everywhere" width="500" height="381"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Pair program with peers 👥
&lt;/h2&gt;

&lt;p&gt;Every developer has a different approach to problem solving.&lt;/p&gt;

&lt;p&gt;Coding with a peer will expose you to their techniques.&lt;/p&gt;

&lt;p&gt;While pair programming you get to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Learn&lt;/li&gt;
&lt;li&gt;Teach&lt;/li&gt;
&lt;li&gt;Practice communication skills&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;which solidifies your understanding of the topic&lt;/p&gt;

&lt;h2&gt;
  
  
  Join Developer Communities 👪
&lt;/h2&gt;

&lt;p&gt;Communities are the easiest way to grow as a developer.&lt;/p&gt;

&lt;p&gt;In a community, you can get feedback by:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Working with senior devs&lt;/li&gt;
&lt;li&gt;Asking technical questions&lt;/li&gt;
&lt;li&gt;Sharing your work&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You will learn a lot more than just coding.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--DiJp-QlL--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/881bueyzm5osbx0uihr0.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--DiJp-QlL--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/881bueyzm5osbx0uihr0.png" alt="you don't have to code alone" width="600" height="343"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Build in public 🔨
&lt;/h2&gt;

&lt;p&gt;Building in public is building software with transparently sharing the behind scenes.&lt;/p&gt;

&lt;p&gt;You get to brainstorm with people following your journey; On any topic such as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Feature ideas&lt;/li&gt;
&lt;li&gt;Tech stack&lt;/li&gt;
&lt;li&gt;Website design, etc&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It's a collaboration of highest order.&lt;/p&gt;

&lt;h2&gt;
  
  
  Get your code reviewed by peers 🖥️
&lt;/h2&gt;

&lt;p&gt;Code review is a practice of other developers checking your code after you write it.&lt;/p&gt;

&lt;p&gt;Code reviews are a great way to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Learn from peers&lt;/li&gt;
&lt;li&gt;Reduce bugs in code&lt;/li&gt;
&lt;li&gt;Improve code quality&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You get better with each code review.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Sn9M7xX4--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/rhc62aewib5dwceleryp.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Sn9M7xX4--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/rhc62aewib5dwceleryp.png" alt="code wtfs" width="550" height="433"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Wrapping Up
&lt;/h2&gt;

&lt;p&gt;Hope you found these tips helpful.&lt;/p&gt;

&lt;p&gt;If you liked this post, follow me for more of these 🙂&lt;/p&gt;

&lt;p&gt;Also, share what kind of mentorship are you seeking in your career?👇&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>career</category>
      <category>beginners</category>
      <category>codenewbie</category>
    </item>
    <item>
      <title>How to Ace Coding Interviews — 21 Problem Solving Lessons</title>
      <dc:creator>Void⚡</dc:creator>
      <pubDate>Tue, 31 Jan 2023 16:54:05 +0000</pubDate>
      <link>https://dev.to/codewithvoid/21-problem-solving-lessons-to-ace-coding-interviews-268n</link>
      <guid>https://dev.to/codewithvoid/21-problem-solving-lessons-to-ace-coding-interviews-268n</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fu2wir9mwrjuf6dhveldg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fu2wir9mwrjuf6dhveldg.png" alt="Programming is less about learning syntax and more about problem solving." width="800" height="353"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In the last 5 years, I have given &lt;strong&gt;20+ coding interviews&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Reflecting back, I have documented my learnings in 21 lessons that improved my problem solving skills significantly.&lt;/p&gt;

&lt;p&gt;These will help you in your upcoming coding interviews.&lt;/p&gt;

&lt;p&gt;Let's go! 🚀&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Problem solving skill = Knowing toolbox of techniques + Practice of applying it in different situations&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Understanding the problem is the most important step of problem solving.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Don’t rush into solving. Before that ask:&lt;br&gt;
Can I simplify the problem?&lt;br&gt;
Can I break the problem into easier problems?&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;When stuck on the problem. Be curious, not frustrated.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Spend some time thinking about more examples and edge cases of the problem.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Forget code first. Consider how a human can ‘systematically’ solve the problem.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;It’s ok to temporarily ignore the difficult parts and approach them later.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Solving on whiteboard is 10x easier than keyboard.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Diving into code without planning will only give you stress.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Think of multiple solutions, before committing to one.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Start with brute-force solution and then fix the suboptimal parts.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Create step by step high level plan and validate if it leads you to desired solution.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Try simplifying the solution. Simpler solutions are easier to code.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;If you are struggling with implementing your plan, write pseudo-code first.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Use pseudo-code as program comments and while coding translate each comment into code.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Focus on making a solution work before making any improvements.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Verify if your solution works for all possible scenarios and edge cases.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;You only get better by solving lot of problems. Cliche for a reason.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;For interviews, prioritize practicing most asked and frequently asked problems by the company.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Don’t stop at working solution. Learn other ways of solving the same problem.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Relax and see failure as feedback. It just tells you what NOT to do.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;That's it!&lt;/p&gt;

&lt;p&gt;Hope you found these lessons helpful.&lt;/p&gt;

&lt;p&gt;If you liked this post, follow me for more of these 🙂&lt;br&gt;
Also, share ONE lesson from your failed programming interview👇&lt;/p&gt;

</description>
      <category>crypto</category>
      <category>blockchain</category>
      <category>web3</category>
      <category>offers</category>
    </item>
    <item>
      <title>Should Developers Specialize or Generalize?</title>
      <dc:creator>Void⚡</dc:creator>
      <pubDate>Tue, 24 Jan 2023 13:18:14 +0000</pubDate>
      <link>https://dev.to/codewithvoid/career-question-to-specialize-or-not-to-specialize-dfd</link>
      <guid>https://dev.to/codewithvoid/career-question-to-specialize-or-not-to-specialize-dfd</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnqbsjbb414gmsqdnkknj.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnqbsjbb414gmsqdnkknj.png" alt="what's better - to specialize or generalize?" width="800" height="320"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I dared initiating the age old debate on twitter — to specialize or generalize?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;86 replies&lt;/strong&gt; later I think I have a better understanding of the best course of action for me.  &lt;/p&gt;

&lt;p&gt;My goal with this article is to summarize the discussion and present arguments people have for their choice. Hope this will help you in making an informed decision that is ideal for your career stage.&lt;/p&gt;

&lt;p&gt;Let’s dive in! 🚀&lt;/p&gt;

&lt;h2&gt;
  
  
  TL;DR
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Poll Results&lt;/li&gt;
&lt;li&gt;Rationale For Specialization&lt;/li&gt;
&lt;li&gt;Rationale For Generalization&lt;/li&gt;
&lt;li&gt;Conclusion&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Poll Results
&lt;/h2&gt;

&lt;p&gt;Here’s a quick summary of the responses.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fs9gpx412x32so9k2w4va.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fs9gpx412x32so9k2w4va.png" alt="Twitter Poll Results Pie chart" width="800" height="520"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Looking at the results &lt;em&gt;~45%&lt;/em&gt; of developers believe that specialization is the way to go, while &lt;em&gt;~29%&lt;/em&gt; are inclined towards generalization. &lt;/p&gt;

&lt;p&gt;While we have a clear winner, it’s important to examine the reasoning and motivations behind these responses.&lt;/p&gt;

&lt;h2&gt;
  
  
  Rationale For Specialization
&lt;/h2&gt;

&lt;p&gt;🔸 &lt;strong&gt;More job opportunities.&lt;/strong&gt; Specializing can lead to more opportunities and success as a freelancer or contractor. It’s also clear to your employer what value you bring to the table. &lt;br&gt;
🔸 &lt;strong&gt;Building credibility.&lt;/strong&gt; With specialization you build credibility by developing a deep understanding of the subject matter. It gives you the ability to solve complex problems and create innovative solutions. &lt;br&gt;
🔸 &lt;strong&gt;To show expertise.&lt;/strong&gt;  If you are working on a specific area or technology for 3-4 years, you naturally build a reputation as an expert.&lt;/p&gt;

&lt;h2&gt;
  
  
  Rationale For Generalization
&lt;/h2&gt;

&lt;p&gt;🔸 &lt;strong&gt;More flexibility.&lt;/strong&gt; With your ability to quickly understand and work with multiple technologies as a generalist, you can move into different roles and industries.&lt;br&gt;
🔸 &lt;strong&gt;Better adaptability.&lt;/strong&gt; You will easily adapt to new situations or technologies that you will encounter in your work.&lt;br&gt;
🔸 &lt;strong&gt;To find passion.&lt;/strong&gt; Generalizing at first can help in finding what you love. Something that you can focus on for a long period of time and make it your speciality.&lt;/p&gt;

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

&lt;p&gt;Major takeaway for me from the discussion is - there is no RIGHT answer to this question. Also, your choice can change as you will progress in career.&lt;/p&gt;

&lt;p&gt;Having said that, share in comments what do you think — should developers specialize or generalize?&lt;/p&gt;

&lt;p&gt;If you liked this discussion, follow me for more of these.&lt;/p&gt;

</description>
      <category>discuss</category>
      <category>cloud</category>
    </item>
    <item>
      <title>Resume Writing Secrets: 25 Tips to Get You Hired</title>
      <dc:creator>Void⚡</dc:creator>
      <pubDate>Tue, 17 Jan 2023 17:02:10 +0000</pubDate>
      <link>https://dev.to/codewithvoid/resume-writing-secrets-25-tips-to-get-you-hired-5bp6</link>
      <guid>https://dev.to/codewithvoid/resume-writing-secrets-25-tips-to-get-you-hired-5bp6</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F91zjwcaexnm71nva4dw3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F91zjwcaexnm71nva4dw3.png" alt="Hot resume tip" width="800" height="396"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In the last 5 years I received interview calls from 200+ tech companies.&lt;/p&gt;

&lt;p&gt;Over this period I perfected my resume one tiny improvement at a time.&lt;/p&gt;

&lt;p&gt;I have documented my learnings in 25 tips that I learnt too late. 🥲&lt;/p&gt;

&lt;p&gt;These will help you in leveling up your resume and help past mandatory screening test from recruiters.&lt;/p&gt;

&lt;p&gt;Let's dive in 🚀&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Projects + Results &amp;gt; Any college degree.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Prove with your resume that you read the job description.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Best resumes are highly scannable.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Your resume should be visually appealing.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Just mention things that are required for the job role.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add project links in your resume for employers to know more.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Technical skills is the most important section. Put it first.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Use numbers to quantify your experience but avoid percentages.&lt;br&gt;
&lt;a href="https://i.giphy.com/media/jwFbMfYthIM6pttfjF/giphy.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://i.giphy.com/media/jwFbMfYthIM6pttfjF/giphy.gif" width="480" height="400"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Avoid use of pronouns, long paragraphs, change of tenses.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Aim to make your resume 1 page long. Max 2.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Spelling mistakes can cost you an interview. Use spell checker.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Gather feedback on your resume from peers.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Keep information in reverse chronological order. I.e most recent detail first.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Don’t try to mislead with your resume. It will hurt in the long term.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Less general claims. More specific outcomes.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Always test all the mentioned links before sharing your resume.&lt;br&gt;
&lt;a href="https://i.giphy.com/media/l2R098V90nJfuHKg0/giphy.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://i.giphy.com/media/l2R098V90nJfuHKg0/giphy.gif" width="529" height="298"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;You look more qualified by being concise.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Use consistent layout and typography.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Outdated resume = Missed opportunity.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;More than work, highlight what measurable impact it created.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Mention explicitly if you are proficient or just familiar with the technology.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Make sure stuff in your resume matches with your LinkedIn.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Any open source or community contribution is a BIG plus. &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Cut the fluff. Aim for simple and to the point details.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;And most importantly — Be yourself.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;That's it!&lt;/p&gt;

&lt;p&gt;Hope you found these tips helpful.&lt;/p&gt;

&lt;p&gt;If you liked this post, follow me for more of these 🙂&lt;br&gt;
Also, would love to hear your best resume tip in comments 👇&lt;/p&gt;

</description>
      <category>discuss</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Debugging Like a Boss: A Decade's Worth of Tips</title>
      <dc:creator>Void⚡</dc:creator>
      <pubDate>Tue, 10 Jan 2023 12:32:40 +0000</pubDate>
      <link>https://dev.to/codewithvoid/debugging-like-a-boss-a-decades-worth-of-tips-1439</link>
      <guid>https://dev.to/codewithvoid/debugging-like-a-boss-a-decades-worth-of-tips-1439</guid>
      <description>&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fyg6me0y5b4orcxcu6fbh.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fyg6me0y5b4orcxcu6fbh.png" alt="Debugging code is harder than writing it"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you're a developer, chances are you've spent countless hours debugging code. Debugging can be time-consuming, frustrating and fun at the same time.&lt;/p&gt;

&lt;p&gt;In my career as a developer, I've encountered my fair share of bugs. From minor issues to major production outages, I've tackled them all.&lt;/p&gt;

&lt;p&gt;Here are my learnings in 25 lessons that will help you elevate your debugging game.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Bugs are inevitable. You just get better at fixing them.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Train your mind to see debugging as an opportunity to learn.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Start with breaking down the problem. Obvious but overlooked.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Understand what happened &lt;em&gt;before&lt;/em&gt; trying to fix the bug.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;“But things are randomly failing” No, there’s always a reason. You just don’t know it yet.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Assume nothing. Bugs can come from ANYWHERE.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Identify “what’s wrong” before “where it’s wrong”.&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fi.giphy.com%2Fmedia%2FNAiVkVJnlGyDC%2Fgiphy.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fi.giphy.com%2Fmedia%2FNAiVkVJnlGyDC%2Fgiphy.webp"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Investigate - When did the code work last? What has changed since then?&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Never skip reading the error message.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Google it. Your issue is (most likely) faced by thousands everyday.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;When debugging code, never try to prove yourself right.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Stop blaming JavaScript runtime. It’s your code that needs fixing.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Debugging is hard if you do it without a plan.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Explain your code out loud. Step by step. (Check Rubber-Duck-Debugging).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;When things stop making sense, start thinking on paper.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Getting stuck is normal. It’s a signal to approach the problem differently.&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fmedia.giphy.com%2Fmedia%2FMHwZHOPD8ol4k%2Fgiphy.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fmedia.giphy.com%2Fmedia%2FMHwZHOPD8ol4k%2Fgiphy.webp"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Ultimate debugging hack is taking a walk.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Debugging tools are your best friend if you value your time.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Fixing a bug with a friend or colleague is criminally underrated.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Learn to ask for help on an issue. Give back by helping others.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Bug in production? Revert breaking change rather than pushing a fix.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Debugging a production system is an independent skill.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Document your learnings and share them with the community.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Debugging teaches you what you &lt;em&gt;should&lt;/em&gt; know but don't.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;To improve debugging skills — fix more bugs. Cliche for a reason.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;That's it!&lt;/p&gt;

&lt;p&gt;Hope you found these lessons helpful.&lt;/p&gt;

&lt;p&gt;If you liked this post, follow me for more of these 🙂&lt;br&gt;
Also, would love to hear your best debugging tip in comments 👇&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>programming</category>
      <category>beginners</category>
      <category>codenewbie</category>
    </item>
    <item>
      <title>7 Subtle Signs of Developer Burnout — And How to Recover From It</title>
      <dc:creator>Void⚡</dc:creator>
      <pubDate>Tue, 03 Jan 2023 13:12:23 +0000</pubDate>
      <link>https://dev.to/codewithvoid/7-subtle-signs-of-developer-burnout-and-how-to-recover-from-it-3klj</link>
      <guid>https://dev.to/codewithvoid/7-subtle-signs-of-developer-burnout-and-how-to-recover-from-it-3klj</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjp32jjxsfq48m7srg1of.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjp32jjxsfq48m7srg1of.png" alt="Burnout is not a badge of honour" width="800" height="320"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Burnouts are inevitable in a long career in tech.&lt;/p&gt;

&lt;p&gt;These 7 signs will help you in identifying it early and love your work again&lt;/p&gt;

&lt;p&gt;Let’s dive in ↓&lt;/p&gt;

&lt;h2&gt;
  
  
  TL;DR
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;You feel isolated&lt;/li&gt;
&lt;li&gt;You regularly miss deadlines&lt;/li&gt;
&lt;li&gt;You don’t get proper sleep&lt;/li&gt;
&lt;li&gt;You are being overworked&lt;/li&gt;
&lt;li&gt;You constantly lack motivation&lt;/li&gt;
&lt;li&gt;You don’t take breaks&lt;/li&gt;
&lt;li&gt;You often feel distracted&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  You feel isolated 😓
&lt;/h2&gt;

&lt;p&gt;1 in 5 people deal with workplace loneliness.&lt;/p&gt;

&lt;p&gt;Feeling disconnected from peers is a terrible feeling.&lt;/p&gt;

&lt;p&gt;Make new connections and find opportunities to collaborate.&lt;/p&gt;

&lt;p&gt;Volunteer and rise by lifting others.&lt;/p&gt;

&lt;h2&gt;
  
  
  You regularly miss deadlines 🤦
&lt;/h2&gt;

&lt;p&gt;We all suffer with optimism bias.&lt;/p&gt;

&lt;p&gt;That makes us underestimate time and roadblocks in completing the tasks.&lt;/p&gt;

&lt;p&gt;Schedule &lt;em&gt;buffer time&lt;/em&gt; and cut yourself some slack.&lt;/p&gt;

&lt;p&gt;While planning, assume the worst.&lt;/p&gt;

&lt;h2&gt;
  
  
  You don’t get proper sleep 🥱
&lt;/h2&gt;

&lt;p&gt;You find yourself in a state of stress — or have poor sleep habits.&lt;/p&gt;

&lt;p&gt;Lack of sleep costs you more than just drowsiness.&lt;/p&gt;

&lt;p&gt;For better sleep:&lt;br&gt;
Avoid large meals&lt;br&gt;
Get some exercise&lt;br&gt;
Limit Caffeine&lt;/p&gt;

&lt;p&gt;Most importantly, make time for sleep.&lt;/p&gt;

&lt;h2&gt;
  
  
  You are being overworked 😥
&lt;/h2&gt;

&lt;p&gt;Ever felt that you lack energy for simplest tasks?&lt;/p&gt;

&lt;p&gt;That’s because your mind is overwhelmed.&lt;/p&gt;

&lt;p&gt;Take time to plan and set realistic expectations.&lt;/p&gt;

&lt;p&gt;Value health before sickness.&lt;/p&gt;

&lt;h2&gt;
  
  
  You constantly lack motivation 😕
&lt;/h2&gt;

&lt;p&gt;So you feel you are NOT making progress.&lt;/p&gt;

&lt;p&gt;Revive your motivation by:&lt;br&gt;
Learning new things&lt;br&gt;
Side projects&lt;br&gt;
Collaborating&lt;/p&gt;

&lt;p&gt;Have goals, not chores.&lt;/p&gt;

&lt;h2&gt;
  
  
  You don’t take breaks ☕️
&lt;/h2&gt;

&lt;p&gt;By not taking breaks,&lt;/p&gt;

&lt;p&gt;You are starving your body and mind from recharge.&lt;/p&gt;

&lt;p&gt;Add &lt;em&gt;effective&lt;/em&gt; breaks to your work routine:&lt;br&gt;
Standup and stretch&lt;br&gt;
Breathing exercises&lt;br&gt;
Short walks&lt;/p&gt;

&lt;p&gt;Learn to rest your mind.&lt;/p&gt;

&lt;h2&gt;
  
  
  You often feel distracted 😖
&lt;/h2&gt;

&lt;p&gt;You are constantly bombarded by:&lt;br&gt;
Messages&lt;br&gt;
Notifications&lt;br&gt;
Interruptions&lt;/p&gt;

&lt;p&gt;Identify and eliminate distractions from your work environment.&lt;/p&gt;

&lt;p&gt;Block time for what needs to be done.&lt;/p&gt;

&lt;p&gt;Focus and win.&lt;/p&gt;

&lt;h2&gt;
  
  
  Wrapping up 📝
&lt;/h2&gt;

&lt;p&gt;That's it!&lt;/p&gt;

&lt;p&gt;I hope you found these tips helpful.&lt;/p&gt;

&lt;p&gt;If you liked this post, follow me for more of these 🙂&lt;/p&gt;

&lt;p&gt;Also, share how do you avoid or recover from burnout in comments 👇&lt;/p&gt;

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