acm-header
Sign In

Communications of the ACM

Blogroll


Refine your search:
datePast Year
authorDaniel Lemire
bg-corner

Why measuring productivity is hard
From Daniel Lemire's Blog

Why measuring productivity is hard

Studying productivity is challenging. About 15-20 years ago, I was obsessed over my own productivity. I created a spying agent to monitor my activities and time...

Memory-level parallelism :: Apple M2 vs Apple M4
From Daniel Lemire's Blog

Memory-level parallelism :: Apple M2 vs Apple M4

The Apple M2, introduced in 2022, and the Apple M4, launched in 2024, are both ARM-based system-on-chip (SoC) designs featuring unified memory architecture. That...

Just say no to broken JSON
From Daniel Lemire's Blog

Just say no to broken JSON

JSON, or JavaScript Object Notation, is a lightweight data-interchange format. It is widely used for transmitting data between a server and a web application, due...

Base64 for compression
From Daniel Lemire's Blog

Base64 for compression

C and C++ compilers like GCC first take your code and produce assembly, typically a pure ASCII output (so just basic English characters). This assembly code isContinue...

From code reuse to the impact of generative AI
From Daniel Lemire's Blog

From code reuse to the impact of generative AI

Back when I started programming, project teams were large. Organizations had dozens of programmers on sprawling projects. Reusing code was not trivial. SharingContinue...

Life expectancy of men in Canadian provinces
From Daniel Lemire's Blog

Life expectancy of men in Canadian provinces

In North America, my home province of Quebec has a slightly higher life expectancy than the rest of the country. It is also a poorer-than-average province, so that...

Let us bury the linear model of innovation
From Daniel Lemire's Blog

Let us bury the linear model of innovation

There is an extremely naive model of science and innovation called the linear model: The model postulated that innovation starts with basic research, is followed...

Fast character classification with z3
From Daniel Lemire's Blog

Fast character classification with z3

We often need to quickly classify characters. For example, consider how the binary data that you send by email is converted to an ASCII string made of 64 distinct...

Is the job market for software developers collapsing?
From Daniel Lemire's Blog

Is the job market for software developers collapsing?

Concerns persist that artificial intelligence (AI) could render software developers obsolete, particularly with tools like GitHub Copilot and Cursor streamlining...

Models and science
From Daniel Lemire's Blog

Models and science

The ancient Greeks crafted extraordinary models that continue to resonate. For instance, Ptolemy’s geocentric model, with Earth at the core and planets tracingContinue...

Dividing an array into fair sized chunks
From Daniel Lemire's Blog

Dividing an array into fair sized chunks

Suppose that you have an array of N elements and you want to divide it into M chunks. It is a common task when trying to spread N units of work over M threads,Continue...

Returning several values from a function in C++ (C++23 edition)
From Daniel Lemire's Blog

Returning several values from a function in C++ (C++23 edition)

Many programming languages such as the Go programming language are designed to make it easy to return several values at once from a function. In Go, it is often...

Producing useful commands on the go using C++ and AI
From Daniel Lemire's Blog

Producing useful commands on the go using C++ and AI

A few weeks ago, I attended a software engineering seminar focused on the role of large language models in programming. The distinguished software engineering professors...

C++20 concepts for nicer compiler errors
From Daniel Lemire's Blog

C++20 concepts for nicer compiler errors

In C++, templates enable generic programming by allowing functions and classes to operate on different data types without sacrificing type safety. Defined using...

Streamlined iteration: exploring keys and values in C++20
From Daniel Lemire's Blog

Streamlined iteration: exploring keys and values in C++20

In software, we often use key-value data structures, where each key is unique and maps to a specific value. Common examples include dictionaries in Python, hash...

How can really smart people appear totally incompetent?
From Daniel Lemire's Blog

How can really smart people appear totally incompetent?

It is often puzzling to encounter organizations run by highly capable and ambitious people… appear dysfunctional. An example that I like are colleges that claim...

How helpful is AI?
From Daniel Lemire's Blog

How helpful is AI?

Do large language models (AI) make you 3x faster or only 3% faster? The answer depends on the quality of the work you are producing. If you need something likeContinue...

Faster shuffling in Go with batching
From Daniel Lemire's Blog

Faster shuffling in Go with batching

Random integer generation is a fundamental operation in programming, often used in tasks like shuffling arrays. Go’s standard library provides convenient toolsContinue...

Mixing ARM NEON with SVE code for fun and profit
From Daniel Lemire's Blog

Mixing ARM NEON with SVE code for fun and profit

Most mobile devices use 64-bit ARM processors. A growing number of servers (Amazon, Microsoft) also use 64-bit ARM processors. These processors  have special instructions...

Unsigned comparisons using signed types
From Daniel Lemire's Blog

Unsigned comparisons using signed types

There are two main types of fixed-precision integers in modern software: unsigned and signed. In C++20 and above, the signed integers must use the two’s complement...
Sign In for Full Access
» Forgot Password? » Create an ACM Web Account