Skip to main content

History

The human civilization has been developed from its infancy, by which it has accumulated knowledge and wisdom throughout the human history. Those fruits spur the exponential development since the invention of modern computer. We have been able to transfer our knowledge by populating the memory with binary data. This digital brain makes information easier to access and store. However, as the binary data consists of 0 and 1, humans can't read digital data without computers. This is where the programs and programmers emerge. They are translators between binary and human-readable data.

Since the machine and humans are far apart, programmers have put multiple layers between them. In the early days of modern computing, programmers whispered directly to the bare metal by using assembly language. But this practice had hit a wall, as the programs got complicated, it was getting hard to code in assembly.

In the 1970s, Dennis Ritchie and his team invented the C programming language, and this invention drove programmers to focus on higher layer. In the assembly era, programmers focused on primitives: procedures or instructions such as moving binary data from RAM to CPU. In contrast, C made programmers deal with more abstractions, such as data shapes and mathematical algorithms, under which they could build programs in more human-readable ways.

Software developers created increasingly sophisticated applications and tools after the introduction of C. In the meantime, hardware engineers advanced the ability of machines, especially improving the performance of the CPUs. This divergence layered numerous abstractions between programmers and machines, making the underlying principles of machinery hard to understand.

The desire to have clean interfaces and abstractions became more important since that divergence. No more low-level optimization was needed, because hardware became cheaper and faster, and the software became more complicated and abstracted.

In the early of 2000s, hardware companies such as Intel dreamed of their rosy future, believing in accomplishing 10GHz on performance of CPU in 2005. But they suddenly hit the wall; the faster cpu got, the more electricity needed, the hotter it got. This phenomenon brought the emergence of multicores.

For decades, programming languages have added more abstractions and layers to hide this complexity. They changed both their internal mechanisms to exploit parallel hardware, but also introduced higher level concurrency APIs for programmers to utilize CPU cores more effectively. In other words, concurrency is more about abstractions and shaping how the data flows, less about execution details that bother programmers.