<?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: lbvf50mobile</title>
    <description>The latest articles on DEV Community by lbvf50mobile (@lbvf50mobile).</description>
    <link>https://dev.to/lbvf50mobile</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.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F91635%2Fb87459a3-73b0-4f07-b15c-7a16bc8540d6.jpeg</url>
      <title>DEV Community: lbvf50mobile</title>
      <link>https://dev.to/lbvf50mobile</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/lbvf50mobile"/>
    <language>en</language>
    <item>
      <title>The General Mechanism of the UNIX Mainframe and the Go Runtime</title>
      <dc:creator>lbvf50mobile</dc:creator>
      <pubDate>Sat, 06 Jun 2026 16:20:23 +0000</pubDate>
      <link>https://dev.to/lbvf50mobile/the-general-mechanism-of-the-unix-mainframe-and-the-go-runtime-5h0p</link>
      <guid>https://dev.to/lbvf50mobile/the-general-mechanism-of-the-unix-mainframe-and-the-go-runtime-5h0p</guid>
      <description>&lt;p&gt;Go was created in the same place where UNIX was made — at Bell Labs. And after carefully studying the mechanics of the Go Runtime (the internal structure) of a running Go program, I have come to a conclusion: It is a miniature logical structure of UNIX.&lt;/p&gt;

&lt;p&gt;Or to put it another way, more succinctly: Go implements a Mainframe within a single program. This means it gives the programmer the same abstractions that UNIX programmers had in the 70s and 80s, when programs were mean and lean.&lt;/p&gt;

&lt;p&gt;Specifically:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A Goroutine is an OS Process-Thread (from back when threads didn't exist yet and there were only processes)&lt;/li&gt;
&lt;li&gt;All I/O is blocking&lt;/li&gt;
&lt;li&gt;The so-called Channels in Go are Pipes with the abstraction of a Stream (a byte stream)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;They gave them different names, but the essence is exactly the same. Processes with 3 states and their own memory, and Streams of data as a means of communication between them.&lt;/p&gt;

&lt;p&gt;In other words, a Go program is a tiny 80s mainframe right under your fingertips. Everything is just as simple, clear, beautiful, and designed by the same Bell Labs team.&lt;/p&gt;

&lt;p&gt;This is why Go was so loved by grumpy programmers in the 2010s. It returned to an era where a handful of core abstractions solved every problem, instead of drowning developers in a bloated cloud of redundant tools.&lt;/p&gt;

&lt;p&gt;P.S.&lt;/p&gt;

&lt;p&gt;Why Go? To make the scale of abstractions human-sized again.&lt;/p&gt;

&lt;p&gt;In the 70s, mainframes received text and returned text to the user. HTTP servers do the same thing today, but the abstractions have multiplied tenfold: blocking vs non-blocking calls, processes vs threads, dozens of IPC mechanisms.&lt;/p&gt;

&lt;p&gt;Go returns the developer to the world of 70s UNIX, but leveraging all the benefits of modern OSes. For goroutines, all calls are blocking. The Go Scheduler handles both blocking and non-blocking operations through the complex G/P/M + NetPoller system - but the developer gets a clean, minimalist interface that echoes the "golden age" of UNIX, where everything was just files and streams.&lt;/p&gt;

&lt;p&gt;In short, Go is Plan9 in a single process.&lt;/p&gt;

</description>
      <category>go</category>
      <category>unix</category>
      <category>channels</category>
      <category>pipes</category>
    </item>
    <item>
      <title>The Mental Model of Go as a Simplified UNIX</title>
      <dc:creator>lbvf50mobile</dc:creator>
      <pubDate>Sat, 06 Jun 2026 08:57:56 +0000</pubDate>
      <link>https://dev.to/lbvf50mobile/the-mental-model-of-go-as-a-simplified-unix-29al</link>
      <guid>https://dev.to/lbvf50mobile/the-mental-model-of-go-as-a-simplified-unix-29al</guid>
      <description>&lt;p&gt;The Go runtime is essentially an implementation of UNIX ideas within a single OS process. The OS process becomes the "Host OS", while goroutines act as the process threads from early operating systems, blocking on any I/O operation.&lt;/p&gt;

&lt;p&gt;Above all, this perspective provides the developer with a simplified mental model. The developer works with a sort of "Proto-UNIX", where each goroutine is a "process" and "channels" are "byte streams." And all this abstraction operates entirely within a single OS process of the real underlying OS.&lt;/p&gt;

&lt;p&gt;This reduction and simplification is necessary as a design model for the programmer. It is like working at the high level of HTTP, where you don't think about packets. In essence, when we write in Go, we are writing for a "good old UNIX", where goroutines are "bash scripts" and channels are STDIN/STDOUT. This achieves complete abstraction from the underlying host OS.&lt;/p&gt;

&lt;p&gt;In this sense, a Go program is essentially an interaction with a virtual machine. It is very similar to JS. The Go Runtime is a classic Virtual Machine in Tanenbaum's terminology: a beautiful interface over a complex underlying implementation.&lt;br&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%2F5omrw8ubb1i5rnom4vyo.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%2F5omrw8ubb1i5rnom4vyo.png" alt="just a picture" width="798" height="217"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>unix</category>
      <category>go</category>
      <category>pike</category>
      <category>tanenmabum</category>
    </item>
    <item>
      <title>G/P/M Go Scheduler</title>
      <dc:creator>lbvf50mobile</dc:creator>
      <pubDate>Sat, 06 Jun 2026 03:58:31 +0000</pubDate>
      <link>https://dev.to/lbvf50mobile/gpm-go-scheduler-k08</link>
      <guid>https://dev.to/lbvf50mobile/gpm-go-scheduler-k08</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%2Faglehy88tmwasbsr18wv.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%2Faglehy88tmwasbsr18wv.png" alt="G/P/M relationships from Daniel Morsing and Bill Kennedy" width="800" height="767"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In the goroutine execution model, any I/O call appears blocking, halting the code execution for the goroutine. However, underneath, network calls in the OS are actually non-blocking. When a network call occurs, the goroutine transitions to a "waiting" state, and the call itself is registered with a Go Scheduler component called NetPoller.&lt;/p&gt;

&lt;p&gt;NetPoller itself is a wrapper, an interface over various implementations of non-blocking I/O in the host operating systems Go runs on: Windows, *BSD, Linux. In the case of Linux, NetPoller is a wrapper around epoll. When a response arrives for a non-blocking network call, NetPoller moves the goroutine to a "runnable" state and adds it to one of the queues of runnable goroutines.&lt;/p&gt;

&lt;p&gt;However, non-blocking calls are not the only type; there are also blocking system calls. In this case, the goroutine transitions to a waiting state along with the OS thread, which is known as "M" in the Go Scheduler's terminology. The OS thread remains blocked with the waiting goroutine. Meanwhile, the logical processor (P) and its local queue of runnable goroutines look for another OS thread, another M. When the response from the system call arrives, the M thread looks for a logical processor for its goroutine (or, like NetPoller, adds the goroutine in a "runnable" state to one of the queues), while the M thread itself goes to sleep in the OS Thread Cache.&lt;/p&gt;

&lt;p&gt;Finally, there is the logical processor, referred to as "P", which was mentioned earlier. It polls the queues of runnable goroutines, drains the local queues of other logical processors (P)—a mechanism known as Work Stealing—and checks the global queue of runnable goroutines. It also leaves OS threads (M) blocked by system calls, seeking out unblocked OS threads (M).&lt;/p&gt;

&lt;p&gt;Thus, between a goroutine and a physical core, there are two levels—P and M—which assist each other during different types of goroutine blocking. If a goroutine is paused by a non-blocking call, there is no need to free the OS thread (M); it can simply take another goroutine from the queue. If a goroutine blocks the thread (M), execution can switch to another thread to continue running other goroutines. As a result, the physical processor never idles during I/O-bound tasks.&lt;/p&gt;

&lt;p&gt;Based on articles about the Go Scheduler by Bill Kennedy and Daniel Morsing.&lt;/p&gt;

&lt;p&gt;P.S. An LLM corrected me, pointing out that when M is blocked by a system call, P detaches, and another M looks for it. It doesn't exactly "leave" on its own. But that's beside the point. In principle, this was already implied, and it doesn't change the overall mechanics.&lt;/p&gt;

&lt;p&gt;P.P.S. Here is what I realized: the Go runtime scheduler is not needed to "avoid physical cores going idle". It is needed to avoid a process written in Go falling into a waiting state, or avoid expensive context switching due to another system call or network request.&lt;/p&gt;

&lt;p&gt;Goroutines and G/P/M defragment the OS process. As a result, the OS process falls into the "wait" state less often, and context switches at the OS level happen less often. Because the M/P pair allows constantly feeding RUNNABLE units of execution (G) onto a running M. Context switching of goroutines in Userspace is cheap.&lt;/p&gt;

</description>
      <category>go</category>
      <category>goroutine</category>
      <category>scheduler</category>
      <category>netpoller</category>
    </item>
    <item>
      <title>Golang G/M/P Time Scale</title>
      <dc:creator>lbvf50mobile</dc:creator>
      <pubDate>Wed, 08 Apr 2026 09:09:43 +0000</pubDate>
      <link>https://dev.to/lbvf50mobile/golang-gmp-time-scale-4i85</link>
      <guid>https://dev.to/lbvf50mobile/golang-gmp-time-scale-4i85</guid>
      <description>&lt;p&gt;If we imagine that 1 millisecond is one “day”, then 1 second becomes about 3 years.&lt;/p&gt;

&lt;p&gt;1 s ≈ 3 “years”&lt;br&gt;
1 ms = 1 “day”&lt;br&gt;
2 µs ≈ 1 “minute”&lt;br&gt;
10 ns ≈ 1 “second”&lt;/p&gt;

&lt;p&gt;Thus, the RTT over 5000 km (~56 ms) is about 2 “months”.&lt;/p&gt;

&lt;p&gt;And G/M/P scheduling (context switching), which takes ~1000 ns, is about 30 “seconds” in this scale.&lt;/p&gt;

</description>
      <category>go</category>
      <category>concurrency</category>
      <category>networks</category>
      <category>tcp</category>
    </item>
    <item>
      <title>The Archetypal Go Program: Servers, Goroutines, and Scheduling</title>
      <dc:creator>lbvf50mobile</dc:creator>
      <pubDate>Thu, 02 Apr 2026 17:08:55 +0000</pubDate>
      <link>https://dev.to/lbvf50mobile/the-archetypal-go-program-servers-goroutines-and-scheduling-1dge</link>
      <guid>https://dev.to/lbvf50mobile/the-archetypal-go-program-servers-goroutines-and-scheduling-1dge</guid>
      <description>&lt;p&gt;This post gives an answer to the question: why Go is optimized for concurrent I/O-intensive systems such as network services.&lt;/p&gt;

&lt;p&gt;A programming language is not only syntax, but also a runtime implementation. Runtime is the part of the executing program where data structures and algorithms that support syntactic constructs of the language are implemented. Namely, the implementation of dictionaries (maps), sets, asynchrony, parallelism, and concurrency (which are not the same thing).&lt;/p&gt;

&lt;p&gt;Golang is unique, and for the 2010s revolutionary, in its implementation of the Syntax + Runtime combination for an ARCHETYPICAL program design. An archetypical Go program is a server running in a single OS process on multiple OS threads, which handles a flood of HTTP requests while maximizing the utilization of OS threads.&lt;/p&gt;

&lt;p&gt;As is known, the execution of a program’s algorithm can be blocked algorithmically (something is waiting for a response), or physically when an OS thread waits for I/O. In Go, both types of blocking are reduced to a minimum through the implementation of a virtual processor layer and lightweight goroutines. In this way, virtual processors are switched between OS threads, and goroutines that are waiting and ready to execute are shuffled, so that the real CPU is practically not idle. And the entire mechanism is described with simple and clear syntax.&lt;/p&gt;

&lt;p&gt;Thus, Go is designed for writing programs that, within a single OS process, process the maximum number of requests above the Transport Layer in the most optimal way. The archetypical program design is: a listening goroutine that launches handler goroutines for each connection. Everything else is delegated to the runtime. And the runtime, in turn, manages the execution sequence of goroutines across different virtual processors and different OS threads.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;    &lt;span class="c"&gt;// Core of the Archetypical Go Application &lt;/span&gt;
    &lt;span class="n"&gt;listener&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;_&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;net&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Listen&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"tcp"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;":8080"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; 
       &lt;span class="n"&gt;conn&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;_&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;listener&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Accept&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; 
       &lt;span class="k"&gt;go&lt;/span&gt; &lt;span class="n"&gt;handle&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;conn&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="s"&gt;`  
    }
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The Go scheduler model is called G/P/M — Goroutine / Processor Virtual / Machine Thread, or alternatively N:M, where N goroutines are executed on M OS threads. Sometimes it is also called M:N, but I prefer to keep the letter M for OS threads.&lt;/p&gt;

&lt;p&gt;The essence in one paragraph from ChatGPT:&lt;/p&gt;

&lt;p&gt;Go is designed to simplify the development of concurrent I/O-intensive systems. This is achieved through the built-in goroutine model and a runtime scheduler that distributes their execution across a limited number of OS threads (M:N scheduling). As a result, the developer writes simple synchronous code, while concurrency and task switching are handled by the runtime.&lt;/p&gt;

</description>
      <category>go</category>
      <category>concurrency</category>
      <category>process</category>
      <category>threads</category>
    </item>
    <item>
      <title>Golang HTTP handlers in Middleware</title>
      <dc:creator>lbvf50mobile</dc:creator>
      <pubDate>Sat, 28 Mar 2026 06:30:28 +0000</pubDate>
      <link>https://dev.to/lbvf50mobile/golang-http-handlers-in-middleware-2la4</link>
      <guid>https://dev.to/lbvf50mobile/golang-http-handlers-in-middleware-2la4</guid>
      <description>&lt;p&gt;IT IS A DRAFT CONSIDERATION. May has ERRORS.&lt;/p&gt;

&lt;p&gt;UPD: The main inside of this text is that Middleware mechanis in Golang is not write a chain of method that call each other. But! Return one method, that in it's core a wrapped "onion" of one closure calls anoter. If it's correct to say. We return a method, that calls a method, that calls a method, and all these methods are required from arguments of the call, and all are in Closure Scope.&lt;/p&gt;

&lt;p&gt;If start to consider OS Server Process as an average UNIX OS Process (using very rough simplification): that Process has STDOUT to Write Respond, and STDIN to Read Request from a client. That's clear STDOUT to Write and STDIN to Read.&lt;br&gt;
Next let's wrap these STDOUT  and STDIN in Objects described by Interfaces. STDOUT would be http.Respnose to Write, and STDIN would be http.Requst to read from.&lt;br&gt;
Eventually the handling of the request will be a single method ServerHTTP(w http.Responce, r * http.Request). It is a singe method with just two argument one for write and one for read.&lt;/p&gt;

&lt;p&gt;Having one method we able to add wrapping methods f1(w,r){ f2(w,r){ f3(w,r){ ServeHTTP(w,r)}}}}.&lt;br&gt;&lt;br&gt;
Also we could put w and r in closures that not writing methods all the time in one place but share them among each other.&lt;br&gt;
// w and r in the Closure.&lt;br&gt;
f1 := func(handler1){ do1(); handler1();}&lt;br&gt;
f2 := func(handler2){ do2(); handler2();}&lt;br&gt;
f3 := func(){ do3();  ServeHTTP(w,r);}&lt;br&gt;
f1(f2(f3()));&lt;br&gt;
Something like hat in a draft with a simplification.&lt;/p&gt;

&lt;p&gt;Something like hat in a draft with a simplification.&lt;br&gt;
Yes, it Has Errors. Need to clarify the way a Handler Called. And the way it Return. But the Idea is Correct.&lt;/p&gt;

&lt;p&gt;The main thing is: We just create a new Handler method by chain of calls of Middlware - that wrap, wrap, wrap, wrap initial ServeHTTP by Methods with Clouser. Middleware not a function to call, it is a funtion that crate function for call.&lt;br&gt;
That's it. Thanks God, Jesus Christ! The main issue of understanding is closed.&lt;/p&gt;

</description>
      <category>go</category>
      <category>http</category>
    </item>
    <item>
      <title>Mental Models from my Diary</title>
      <dc:creator>lbvf50mobile</dc:creator>
      <pubDate>Fri, 06 Mar 2026 13:38:41 +0000</pubDate>
      <link>https://dev.to/lbvf50mobile/mental-models-from-my-diary-598j</link>
      <guid>https://dev.to/lbvf50mobile/mental-models-from-my-diary-598j</guid>
      <description>&lt;p&gt;Just over viewing my Diary since September 2025 to March 2026 - I extracted next crucial mental models. These mental models are sharped during hard battles in local communities.&lt;/p&gt;

&lt;p&gt;Kernel &amp;lt;= SysCalls =&amp;gt; UserSpace;&lt;/p&gt;

&lt;p&gt;Kernel(TCP) &amp;lt;= Socket =&amp;gt; UserSpace(TLS)&lt;/p&gt;

&lt;p&gt;Kernel(OSI[1..4])&amp;lt;=Socket=&amp;gt; UserSpace(OSL[5..7])&lt;/p&gt;

&lt;p&gt;In common all these models tell about one concept Interface-Contract, that is implemented and kept for decades in UNIX TCP/IP stack. Where the socket interface is a contract between Kernel internal implementation and UserSpace internal implementation. As It is possible to observe these models [Internal]&amp;lt;=Interface=&amp;gt;[WorkingGround] are very similar, and could be found in different areas of Networks and Web Development.&lt;/p&gt;

&lt;p&gt;(HTTP.1/HTTP.2/QUIC)&amp;lt;==[request/response interface]==&amp;gt;(Ruby/PHP/Perl/Python frameworks)&lt;/p&gt;

&lt;p&gt;Starting from OS and keeping exploring up to App implementation it is required to do the same thing - define Interface-Contracts that would be stable for a long time.&lt;/p&gt;

</description>
      <category>devjournal</category>
      <category>linux</category>
      <category>networking</category>
      <category>softwareengineering</category>
    </item>
    <item>
      <title>The Golang</title>
      <dc:creator>lbvf50mobile</dc:creator>
      <pubDate>Tue, 03 Mar 2026 07:48:04 +0000</pubDate>
      <link>https://dev.to/lbvf50mobile/the-golang-d20</link>
      <guid>https://dev.to/lbvf50mobile/the-golang-d20</guid>
      <description>&lt;p&gt;After some thought about Golang and Schedulers, comparing with a Ruby scheme I made a next conclusion:&lt;/p&gt;

&lt;p&gt;The purpose of the Golang is to combine HTTP server with Business logic in bounds of one OS Process.&lt;/p&gt;

&lt;p&gt;Where as in Ruby, Python, PHP - HTTP server is a separate Process that requires expensive IPC.&lt;/p&gt;

&lt;p&gt;Golang model changes focus from the Process to Threads - because Threads are execution pathes, Process are more metadata structures that comprises shared data environment among several Threads. And Golang invents ultra light Threads called Goroutines - that allows to reduce cost of injecting new extcution path into the game.&lt;/p&gt;

&lt;p&gt;The key part of Golang is Scheduler that take a time-sharing burden of the programmer's shoulders. Now it is easy to write IO-bond programs, because Go Scheluer will manage all these suspended Goroutines automatically. &lt;/p&gt;

&lt;p&gt;Go solves a problem that rouse in 1960-1970 in the Mainframes: Optimal usage of CPU during IO-bound tasks, when a program just waits for an user input. Now it is the same condition - program just waits a response from the network. &lt;/p&gt;

&lt;p&gt;P.S. It is an overview of a language roots, back in 2009 Golang has it's architecture for that purpose, those times it was a common solution to separate HTTP server from the framework by a socket- or something like that. Today there are a plenty technologies to run all components in one process.&lt;/p&gt;

&lt;p&gt;For me it is an explanation of the Standard library model in the Golang.&lt;/p&gt;

</description>
      <category>go</category>
      <category>os</category>
      <category>process</category>
      <category>ipc</category>
    </item>
    <item>
      <title>Eventually I feel the true Essence of Go</title>
      <dc:creator>lbvf50mobile</dc:creator>
      <pubDate>Sun, 25 Jan 2026 22:59:43 +0000</pubDate>
      <link>https://dev.to/lbvf50mobile/eventually-i-feel-the-true-essence-of-go-375b</link>
      <guid>https://dev.to/lbvf50mobile/eventually-i-feel-the-true-essence-of-go-375b</guid>
      <description>&lt;p&gt;The core Idea - Go Scheduler is a Key to an entire Go structure: std lib and an app architecture.&lt;/p&gt;

&lt;p&gt;Long story short: I get into G/P/M model of the Go Scheduler, and found the back-bone model of the all Go programs: Separate Goroutine for each TCP connection. One Listening Goroutine with a "listening Socket", and bunch of others serving "connections Socket". Look at that model from the OS perspective and LRQ for P. Got aha moment of AUTO full-filling all CPU-cores with a Job and wrote the next post:&lt;/p&gt;




&lt;p&gt;Eventually I feel the true Essence of Go&lt;/p&gt;

&lt;p&gt;From the Scheduler mechanics I pick up the real essence of the TOOL - a server with multiple connections and automatic usage of all hardware-threads of a CPU cores. Only through the Scheduler I understood why the Go is really necessary. Go is a tool like an Axe, and I find what and how to chop wood by this axe. Go is a tool for creating a one executable file that starts well optimized server, and each connection to that server is handled by a light-weight UserSpace Thread.&lt;/p&gt;

&lt;p&gt;The Idea of Go itself - to write a server that going to handle multiple TCP connections and automate the process of selecting next goroutine to be executed, and leaving for a while goroutines that stalled in waiting of Network response or any other kind of IPC activity. Here is a Root - to create a server where goroutine would handle a connection, and when to execute that goroutine the Go Runtime would decide, Scheduler if be precise.&lt;/p&gt;

&lt;p&gt;This Idea become natural and could be literally touchable only after getting into the G/P/M model - where a Logical Processor P is an abstraction level between UserSpace Thread (a goroutine G) and OS Thread (M). Because each OS Thread M is halted/stopped when it waits for SystemCall to response, mean while P with it own G-swarm keep on "billowing". Thus Go - is a "swarm" or "club" of goroutings that pushed into CPU-cores by the Go Scheduler using P as middle slab abstraction of Logical Processor.&lt;/p&gt;

&lt;p&gt;All essence of this model, all value of Go as a language is covered inside the Scheduler that allows bot NOT SO AWARE about how to handle new TCP connection cheap. As the algorithm minimize amount of expensive M (OS threads), substituting them by cheap G (Goroutines).&lt;/p&gt;

&lt;p&gt;Go is not a modern C - how it use to be explained, Go is not a "Python". First of all Go is a cheap Goroutiens that are fit perfectly for serving HTTP requests. The aim of the Go is to reduce cost of a Concurrency Component on different platforms.&lt;/p&gt;

&lt;p&gt;Uh... it was Tough! Love you mates. I love Go and William Kennedy and Kavya Joshi&lt;/p&gt;

</description>
      <category>go</category>
    </item>
    <item>
      <title>Concurrency is a pattern, not execution.</title>
      <dc:creator>lbvf50mobile</dc:creator>
      <pubDate>Sun, 14 Sep 2025 04:49:18 +0000</pubDate>
      <link>https://dev.to/lbvf50mobile/concurrency-is-a-pattern-not-execution-5b7e</link>
      <guid>https://dev.to/lbvf50mobile/concurrency-is-a-pattern-not-execution-5b7e</guid>
      <description>&lt;h2&gt;
  
  
  Concurrency is a pattern, not execution.
&lt;/h2&gt;

&lt;p&gt;I  just read Jonathan Sande's &lt;a href="https://www.amazon.com/Dart-Apprentice-Object-Oriented-Programming-Concurrency/dp/1950325784" rel="noopener noreferrer"&gt;book&lt;/a&gt; about Dart. And found there an explanation of concurrency as a running code on one core, when parallelism execution on multiple cores. It is a "half-true" that may be useful for super-beginners who have Dart their first ever language, and have no CS background at all.&lt;/p&gt;

&lt;p&gt;But concurrency is a pattern you separate your pieces of code to be able run them independently.&lt;/p&gt;

&lt;p&gt;Here is a quote from Jonathan Bodner's "Learning Go" &lt;a href="https://www.amazon.com/Learning-Go-Idiomatic-Real-World-Programming/dp/1492077216" rel="noopener noreferrer"&gt;book&lt;/a&gt;:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Concurrency is the computer science term for breaking up a single process into independent components and specifying how these components safely share data. &lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I find it brilliant.&lt;/p&gt;

</description>
      <category>concurrency</category>
      <category>go</category>
      <category>dart</category>
      <category>parallelism</category>
    </item>
    <item>
      <title>Should You Learn Perl in 2025?</title>
      <dc:creator>lbvf50mobile</dc:creator>
      <pubDate>Fri, 05 Sep 2025 06:38:49 +0000</pubDate>
      <link>https://dev.to/lbvf50mobile/should-you-learn-perl-in-2025-1909</link>
      <guid>https://dev.to/lbvf50mobile/should-you-learn-perl-in-2025-1909</guid>
      <description>&lt;h2&gt;
  
  
  Perl in 2025 🐪
&lt;/h2&gt;

&lt;p&gt;In 2025, I unexpectedly find myself &lt;strong&gt;enjoying Perl&lt;/strong&gt; again — after years of Ruby and Go.&lt;br&gt;&lt;br&gt;
It sounds strange, but Perl hasn’t aged the way many people think. It’s not trendy, elegant, or fashionable — and yet, for certain kinds of work, &lt;strong&gt;it feels perfect&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  Don’t Learn Perl. Learn UNIX.
&lt;/h2&gt;

&lt;p&gt;Should you learn Perl in 2025?&lt;br&gt;&lt;br&gt;
Honestly — &lt;strong&gt;no&lt;/strong&gt;. At least, not directly.&lt;/p&gt;

&lt;p&gt;Start with &lt;strong&gt;UNIX system programming&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Work in the shell.&lt;/li&gt;
&lt;li&gt;Understand file descriptors and streams.&lt;/li&gt;
&lt;li&gt;Learn how processes are born, &lt;strong&gt;end&lt;/strong&gt;, and communicate.&lt;/li&gt;
&lt;li&gt;Get comfortable with Bash and other UNIX tools.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Once you understand these things, &lt;strong&gt;Perl becomes automatic&lt;/strong&gt;.&lt;br&gt;&lt;br&gt;
You don’t “study” Perl — you &lt;strong&gt;realize&lt;/strong&gt; you already understand it.&lt;/p&gt;




&lt;h2&gt;
  
  
  Perl Looks Messy — Until You See the Process
&lt;/h2&gt;

&lt;p&gt;Here’s the key insight:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;If you look at Perl from a syntax perspective, it looks messy.&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
But if you look at it &lt;strong&gt;through the lens of UNIX processes and streams&lt;/strong&gt;, it suddenly becomes &lt;strong&gt;crystal clear and intuitive&lt;/strong&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Perl isn’t designed like Python or Go, where you build large structures full of &lt;strong&gt;imports&lt;/strong&gt;, frameworks, and abstractions.&lt;br&gt;&lt;br&gt;
A Perl script is simply a &lt;strong&gt;process&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;born by the OS,&lt;/li&gt;
&lt;li&gt;with three streams (STDIN, STDOUT, STDERR),&lt;/li&gt;
&lt;li&gt;communicating with other processes,&lt;/li&gt;
&lt;li&gt;manipulating files, signals, and descriptors.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;When you see programs this way, Perl’s “cryptic” operators and shortcuts stop looking weird — they become &lt;strong&gt;beautifully compressed UNIX primitives&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  Perl Is a Tool, Not a System
&lt;/h2&gt;

&lt;p&gt;Modern languages — Python, Ruby, Go — often push you toward &lt;strong&gt;designing systems&lt;/strong&gt;.&lt;br&gt;&lt;br&gt;
Perl isn’t like that.&lt;/p&gt;

&lt;p&gt;Perl is a &lt;strong&gt;sharp tool&lt;/strong&gt; for &lt;strong&gt;solving tasks quickly&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Renaming hundreds of files? One-liner.&lt;/li&gt;
&lt;li&gt;Parsing gigabytes of logs? Two-liner.&lt;/li&gt;
&lt;li&gt;Automating a messy workflow? Done before lunch.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You don’t worry about architecture, imports, or frameworks.&lt;br&gt;&lt;br&gt;
You just write the code, run the process, and move on.&lt;/p&gt;

&lt;p&gt;Perl feels less like a language and more like an &lt;strong&gt;extension of your UNIX shell&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why Perl Lost Popularity
&lt;/h2&gt;

&lt;p&gt;Perl didn’t &lt;strong&gt;die&lt;/strong&gt; — it simply &lt;strong&gt;stepped aside&lt;/strong&gt;. The &lt;strong&gt;web changed&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;In the early days, the web was simple: HTML pages, images, and tables.&lt;br&gt;&lt;br&gt;
Perl thrived because it could glue things together effortlessly.&lt;/p&gt;

&lt;p&gt;But today’s web apps are &lt;strong&gt;massive&lt;/strong&gt;, layered systems with complex UIs, APIs, and distributed backends.&lt;br&gt;&lt;br&gt;
Perl was never designed for this — so it &lt;strong&gt;faded from the spotlight&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why Perl Will Never Fade Away
&lt;/h2&gt;

&lt;p&gt;Perl still matters because it’s tied to &lt;strong&gt;UNIX itself&lt;/strong&gt;.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Its syntax &lt;strong&gt;mirrors UNIX primitives&lt;/strong&gt; directly.&lt;/li&gt;
&lt;li&gt;It doesn’t hide processes and streams behind abstractions.&lt;/li&gt;
&lt;li&gt;It becomes intuitive &lt;strong&gt;only after&lt;/strong&gt; you understand the OS.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For sysadmins, DevOps engineers, and anyone who works close to the system, Perl remains &lt;strong&gt;reliable, concise, and insanely useful&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Perl doesn’t chase trends.&lt;br&gt;&lt;br&gt;
It doesn’t ship breaking changes every six months.&lt;br&gt;&lt;br&gt;
It’s like a &lt;strong&gt;ballpoint pen and a squared notebook&lt;/strong&gt;: simple, stable, always ready when you need it.&lt;/p&gt;




&lt;h2&gt;
  
  
  Final Thought
&lt;/h2&gt;

&lt;p&gt;Perl developers don’t see programs as abstract algorithms or piles of imports.&lt;br&gt;&lt;br&gt;
They see them as &lt;strong&gt;processes&lt;/strong&gt; — living entities with streams, signals, and descriptors, talking to other processes in a UNIX world.&lt;/p&gt;

&lt;p&gt;When you shift to this perspective, Perl syntax suddenly becomes &lt;strong&gt;obvious&lt;/strong&gt;.&lt;br&gt;&lt;br&gt;
It’s not cryptic anymore — it’s just &lt;strong&gt;UNIX in shorthand&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Perl isn’t a language you &lt;strong&gt;learn&lt;/strong&gt;.&lt;br&gt;&lt;br&gt;
It’s a language you &lt;strong&gt;grow into&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;And once you do, it feels like home. 🐪&lt;/p&gt;

</description>
      <category>perl</category>
      <category>unix</category>
      <category>systemprogramming</category>
      <category>bash</category>
    </item>
  </channel>
</rss>
