David Deutsch - What is Truth?

Mike's Notes

This video interview came in the latest issue of Aeon.

Resources

References

  • Reference

Repository

  • Home > Ajabbi Research > Library > Subscriptions > Aeon
  • Home > Ajabbi Research > Library > Subscriptions > Closer to Truth
  • Home > Handbook > Ajabbi Research > Culture

Last Updated

02/07/2025

David Deutsch - What is Truth?
By: Lawrence Kuhn
Closer to Truth: 18/10/2016

David Elieser Deutsch, FRS is a British physicist at the University of Oxford. He is a Visiting Professor in the Department of Atomic and Laser Physics at the Centre for Quantum Computation (CQC) in the Clarendon Laboratory of the University of Oxford.

Deutsch pioneered the field of quantum computation by formulating a description for a quantum Turing machine, as well as specifying an algorithm designed to run on a quantum computer. He is a proponent of the many-worlds interpretation of quantum mechanics.

He was awarded the Dirac Medal and Prize of the International Centre for Theoretical Physics in 2017, the Isaac Newton Medal and Prize of the Institute of Physics in 2021, and the Breakthrough Prize in Fundamental Physics in 2022. His popular books The Fabric of Reality and The Beginning of Infinity have each been translated into 12 languages.

Why David Deutsch believes good explanations are the antidote to bad philosophy

In this interview from the long-running series Closer to Truth, the British theoretical physicist and philosopher David Deutsch makes the case that understanding the difference between good and bad explanations is central to advancing knowledge. In conversation with the US presenter Robert Lawrence Kuhn, Deutsch outlines what he believes makes for a convincing explanation – primarily, unprejudiced thinking, relevance and specificity. Further, he argues that this framework for explanations is a vital corrective to a century in which what he calls ‘bad philosophy’, including logical positivism, has dominated, constraining the search for good ideas.

Thinking about the next steps ahead

Mike's Notes

I had the regular meeting on Sunday night, which helped bounce ideas around. I would like to know what people think of what I have written. Just contact me for a chat.

Resources

References

  • Reference

Repository

  • Home > Ajabbi Research > Library >
  • Home > Handbook > 

Last Updated

01/07/2025

Thinking about the next steps ahead

By: Mike Peters
On a Sandy Beach: 01/07/2025

Mike is the inventor and architect of Pipi and the founder of Ajabbi.

Ajabbi uses Pipi 9 to run on, known as "dogfooding". Steady progress is being made with Pipi 9, and the first customer website, which is now well underway.

The customer's website required several reusable modules and utilises these engines and more.

  • Website Engine
  • Reference Engine
  • i18n Engine
  • Reference Engine

Documentation of these modules and engines is now required for developers and administrators.

Next Project

It was now time to determine a plan for the next project.

There are three options;

  • Finish the developer documentation
  • Complete the user workspace roadmap
  • Build a simple SaaS application

I will go into some detail about each option.

Finish the developer documentation.

No developer will be able to build anything with Pipi unless they have some documentation on how it works. 5% is documented.

Complete the user workspace roadmap.

This will enable users to log in and use the available features, but they will still require instructions in the form of documentation.

Build a simple SaaS application.

The Movie Industry SaaS application is straightforward and utilises a compact ontology. Its ontology is over 1,000 times smaller than SNOMED, so it's an easy place to start. It would be a way to test the Ontology API and Boro engines. It builds some more reusable modules. It also provides a helpful tool that people can use for their work.

This would generate more learning opportunities for me, as I do this work by the seat of my pants.

Discussion

The advantage of building a simple SaaS application is that it requires a user workspace and some relevant documentation. 

Being product-led, would only schedule work on any necessary background systems and documentation. It also makes things more manageable as Pipi slowly scales.

Over time, more modules will be completed, more engines will be documented, and the user workspace will expand.

Show and tell

Embedding short YouTube video recordings demonstrating workspace usage could be incorporated into training and contextual help documentation.

A longer, prerecorded technical demonstration video, accompanied by slides and a PDF white paper, could then be shared with the Ontolog Forum to solicit critical feedback. I suspect they would be curious about a novel use of Ontology technology as part of constraints in State Space.

Psychological Safety vs. High Standards: A Misunderstood Dynamic

Mike's Notes

This is an interesting take on learning from making mistakes. I make lots of errors because I try new things, always learn from them, and never repeat the same mistakes.

The main lesson here.

"Psychological safety and high standards are complementary, not contradictory."

Leadership is a fascinating subject. Many "leaders" I have seen in big companies act like psychopaths. And don't get me started on politicians of all stripes .......

I read the book Elon Musk (2023) by Isaacson. Musk is clearly a genius, but there is never an excuse to behave like an arsehole.

Resources

References

  1. Isaacson, W. (2023). Elon Musk.
  2. Edmondson, A. C. (2024). Interview. In Harvard Business Review, Psychological Safety (Emotional Intelligence Series).
  3. Edmondson, A. C. (2012). Teaming.
  4. Edmondson, A. C. (2018). The Fearless Organization.
  5. Edmondson, A. C. (2023). Right Kind of Wrong.
  6. Collins, J. (2020). Beyond Entrepreneurship 2.0.
  7. Argyris, C., & Schon, D. A. (1974). Theory in practice: Increasing professional effectiveness. 
  8. Duhigg, C. (2016). What Google Learned From Its Quest to Build the Perfect Team.
  9. Edmondson, A. C., & Lei, Z. (2014). Psychological Safety: The History, Renaissance, and Future of an Interpersonal Construct.
  10. Edmondson, A. (1999). Psychological Safety and Learning Behavior in Work Teams.

Repository

  • Home > Ajabbi Research > Library >
  • Home > Handbook > 

Last Updated

01/06/2025

Psychological Safety vs. High Standards: A Misunderstood Dynamic

By: Sheril Mathews
Leading Sapiens: 17/10/2024

The term “psychological safety” is often misleading. When managers hear safety, many dismiss it as a soft style that implies complacency. Meanwhile, psychology implies too much mumbo jumbo. High-profile figures like Elon Musk advocating for a “hardcore” style perpetuate this misconception. But this is a fundamental misunderstanding of the relationship between high standards and psychological safety.

In this piece, I unpack the confusion surrounding psychological safety and why you need both psychological safety and high standards to achieve high performance.

In his biography of Elon Musk, Walter Isaacson cites an exchange that’s telling. The backdrop is the initial days after Musk took over Twitter.

Between Twitterland and the Muskverse was a radical divergence in outlook that reflected two different mindsets about the American workplace. Twitter prided itself on being a friendly place where coddling was considered a virtue. “We were definitely very high-empathy, very caring about inclusion and diversity; everyone needs to feel safe here,” says Leslie Berland, who was chief marketing and people officer until she was fired by Musk. The company had instituted a permanent work-from-home option and allowed a mental “day of rest” each month. One of the commonly used buzzwords at the company was “psychological safety.” Care was taken not to discomfort.

Musk let loose a bitter laugh when he heard the phrase “psychological safety.” It made him recoil. He considered it to be the enemy of urgency, progress, orbital velocity. His preferred buzzword was “hardcore.” Discomfort, he believed, was a good thing. It was a weapon against the scourge of complacency. Vacations, flower-smelling, work-life balance, and days of “mental rest” were not his thing. Let that sink in.

Musk had wrought one of the greatest shifts in corporate culture ever. Twitter had gone from being among the most nurturing workplaces, replete with free artisanal meals and yoga studios and paid rest days and concern for “psychological safety,” to the other extreme. He did it not only for cost reasons. He preferred a scrappy, hard-driven environment where rabid warriors felt psychological danger rather than comfort. [1]

Amy Edmondson of Harvard, the leading researcher in psychological safety, defines it as the belief that you won't be punished or humiliated for speaking up with ideas, questions, concerns, or mistakes. It encourages intelligent risk-taking by reducing interpersonal anxiety.

Hundreds of studies, including Google’s Project Aristotle, show that psychological safety is essential for high performance in the modern workplace. Given its importance, you’d think managers would actively work to enable it.

Yet, in practice, these findings often fall on deaf ears. Why is this so?

In my experience, there are two main confusions that muddle the message: “comfort” and “safe spaces.” Let’s examine the two.

Psychological safety is not “comfort”

In Isaacson’s exchange, psychological safety is conflated with “coddling” and “not to discomfort”. Meanwhile, “hardcore” is considered the opposite. The implied message? "Psych safety is for losers; we are hardcore here".

Musk's disdain for the term "safety" stems from its association with a lack of urgency, complacency, and laziness. For him, discomfort drives productivity, where fear and stress combat complacency and push people toward "orbital velocity."

From his perspective, psychological safety is the opposite of high performance. It hinders accountability and the "hardcore" mindset required for rapid innovation. Comfort is anathema to performance, and psychological safety is about free artisanal meals and a lax work attitude.

Musk isn’t alone in making this mistake. As a manager, when I myself came across the concept in 2018 I dismissed it as “soft” and another management fad destined to die.

Edmondson herself acknowledges the problem with terminology:

The term implies to people a sense of coziness — “Oh, everything’s going to be great” — and that we’re all going to be nice to each other. That’s not what it’s really about. It’s about candor, about being direct, taking risks, and being willing to say, “I screwed that up.” It’s being willing to ask for help when you’re in over your head. [2]

Maybe that’s why she called her 2018 book “Fearless Organization” instead of “The Psychologically Safe Organization.”

She clarifies:

Psychological safety is not an “anything goes” environment where people are not expected to adhere to high standards or meet deadlines. It is not about becoming “comfortable” at work.

This is particularly important to understand because many managers appreciate the appeal of error-reporting, help-seeking, and other proactive behavior to help their organizations learn. At the same time, they implicitly equate psychological safety with relaxing performance standards – that is, with an inability to, in their words, “hold people accountable.” This conveys a misunderstanding of the nature of the phenomenon. [4]

Psychological Safety is not about comfort.

Such a climate does not, however, deny failure and whitewash poor results but examines them to see how they can be eliminated or reduced. The reinforcement that comes initially from others and later from oneself is the knowledge that one has made a genuine attempt and that failure occurred only because one's goals were beyond one's current abilities. Failure to perform beyond one's limits is not the same as failure to perform what one is capable of performing. 

— Chris Argyris, Donald Schon, Theory in Practice

Let’s look at the next culprit.

It’s not about “safe spaces” either

Another term that adds to the confusion is 'safe spaces.' Although sounding similar, they serve different purposes and come from different contexts. Even experienced practitioners get these two mixed up.

Safe spaces originated in social movements and are designed to be environments free of conflict. They're found in educational settings or communities dealing with sensitive issues, where the goal is to protect individuals from potentially harmful situations. Discomfort is intentionally minimized, and clear boundaries are set from the outset.

Meanwhile, psychological safety emerged in the context of organizations and team dynamics. It focuses on creating environments where people feel safe to speak up, make mistakes, and take risks, especially in challenging, high-stakes situations.

Unlike safe spaces, psychological safety doesn't aim to eliminate discomfort. Instead, it ensures discomfort is productive — an essential part of learning and growth.

Safe spaces are about protection from external judgment by removing threats or negative stimuli. In contrast, psychological safety encourages risk-taking for group performance and learning.

This distinction is crucial. Equating psychological safety with safe spaces creates the misconception that it means avoiding accountability or difficult feedback. In reality, it is compatible with high standards and challenging expectations.

The role of leadership also differs. In safe spaces, leaders act as guardians, setting and enforcing norms to protect members. In psychologically safe workplaces, they model fallibility, ensure open dialogue, practice humble inquiry, and frame failures as learning opportunities.

A psychologically safe workplace isn't devoid of challenge or discomfort; it ensures that discomfort is generative, not destructive.

What Psychological Safety really is

Psychological safety isn't about avoiding discomfort; it's about ensuring that discomfort — what Musk calls "hardcore"— fosters growth, intelligent risk-taking, and learning. He is half-right: there's no growth without discomfort. But for people to embrace it productively, you need psychological safety. This means creating an environment where people feel secure enough to fully engage, experiment, make mistakes, and challenge themselves and their leaders.

Contrary to misconceptions, psychological safety enables — not hinders — the "discomfort" and "hardcore" approach that Musk advocates. It's not about removing accountability or avoiding challenges, but supporting people to confidently face them head-on.

To use one of Edmondson's analogies: psychological safety is like removing the brakes that keep a car from moving, while high standards act as the steering mechanism. Without it, even with high standards, you risk chaos—team members may be too afraid to accelerate, or if they do, they might crash due to uncertainty.

While discomfort is indeed a powerful catalyst, it's an error to assume stress and fear are the only ways to generate urgency. High standards are most effective when people feel supported in reaching them. Without psychological safety, innovation suffers as people avoid exposing their vulnerabilities or lack of skills, fearing ridicule and punishment.

High-performance teams understand that excellence requires iterative failures. They don't demand perfection; instead, they encourage trial, error, and adjustment. In this environment, failure isn't just tolerated; it's an integral part of the process.

Expectations remain high, and people work hard. However, the crucial difference is that it's safe to fail and learn, driving both individual and organizational growth.

The 4 organizational archetypes

Elon Musk's management of Twitter is an extreme example of coercive power. He let go 75% of the workforce to ensure only the "hardcore" survived. The idea was that discomfort would push the remaining employees to innovate and execute faster, which, to some extent, did happen. Twitter continued to operate, albeit in a diminished form, and introduced new features with a much smaller staff.

High pressure and discomfort can indeed lead to bursts of productivity, especially in a crisis where the stakes are high and the need for immediate action is clear. However, sustained pressure without psychological safety leads to burnout, reduced creativity, and reluctance to take risks. People focus on avoiding failure rather than striving for excellence. This anxiety undermines the creativity that companies like Twitter need to thrive.

This interplay between high standards and psychological safety is depicted by Edmondson’s 4 organizational archetypes:

Psychological safety and high standards.

High Safety, Low Standards (Comfort Zone)

This is the version of psychological safety Musk imagined — one where no one is pushed to excel. Teams enjoy a collegial atmosphere and are comfortable but lack challenge.

While this might seem pleasant on the surface, it's not conducive to learning, innovation, or high engagement. Without a compelling reason to push boundaries, teams don't grow or achieve significant results.

It’s a breeding ground for complacency. There’s a lack of healthy conflict or debate, with people agreeing too readily to maintain the status quo. Without a pressing need to improve or take risks, innovation stagnates. The desire for harmony overrides critical thinking, leading to groupthink. This results in a decline in competitive edge and market relevance.

Low Safety, High Standards (Anxiety Zone)

This quadrant epitomizes Musk's "hardcore" management. It's a common pitfall in modern workplaces, where leaders demand excellence but fail to cultivate psychological safety. The result is an anxiety-inducing environment that undermines the very performance it seeks to enhance.

There’s often a veneer of productivity masking deeper issues. Teams may seem to be highly productive, but there's increasing signs of burnout – absenteeism, declining work quality, and a blame culture. Information is hoarded for job security instead of shared for collective benefit.

Teams retreat to the status quo, paralyzed by the fear of failure. Crucial questions remain unvoiced, stifling quality and ingenuity. The organization inadvertently cultivates a risk-averse workforce, favoring "safe" decisions over potentially transformative ones.

People work hard, but primarily out of fear. While it may yield short-term results, it limits an organization's capacity for breakthroughs and sustained growth.

High Safety, High Standards (Learning Zone)

This is the sweet spot where psychological safety and high standards coexist. In this quadrant, people feel empowered to take calculated risks, voice unconventional ideas, and own up to mistakes without fear of repercussions.

It balances both comfort and challenge. Ideas are challenged respectfully, regardless of the source. Feedback flows freely and constructively in all directions, regardless of hierarchy. Teams feel secure enough to push boundaries and tackle complex problems, knowing they have support.

Failures aren't career-ending; they're viewed as learning opportunities. Cross-functional collaboration happens organically, as people seek diverse viewpoints to solve problems. Innovation thrives because people feel safe to experiment. They're not paralyzed by fear of failure but energized by the possibility of breakthrough. This creates a dynamic, engaged workforce pushing the envelope.

Low Safety, Low Standards (Apathy Zone)

Without safety or standards, people do the bare minimum to stay employed. Team members may engage in “presenteeism” or “quiet quitting” - showing up physically but not mentally. They likely prioritize self-protection over extra effort, leading to unproductive behaviors and conflicts. This is common in large, bureaucratic organizations where people have figured out how to do their jobs with minimal effort.

In these places, mediocrity takes root along with passive-aggressive behavior, office politics, and a lack of initiative. There’s also high turnover rates and strong resistance to change.

People develop learned helplessness, believing their efforts won't matter. It creates a destructive cycle where low expectations lead to low performance, reinforcing apathy.

The paradox of “hard” and “soft”

Psychological safety and accountability are not two ends of a continuum, but rather two distinct attributes of a work environment. [3]

The dichotomy of either psychological safety or high standards is a classic case of “either/or” thinking. Effective leadership requires an “and” approach: integrating both psychological safety and high standards to create places where people can take risks and be challenged simultaneously.

A culture that makes it safe to talk about failure can coexist with high standards… This is as true in families as it is at work. Psychological safety isn’t synonymous with “anything goes.”

A workplace can be psychologically safe and still expect people to do excellent work or meet deadlines. A family can be psychologically safe and still expect everyone to wash dishes and take out the trash. It’s possible to create an environment where candor and openness seem feasible: an honest, challenging, collaborative environment. I’d go so far as to say that insisting on high standards without psychological safety is a recipe for failure— and not the good kind. [5]

Psychological safety and high standards are complementary, not contradictory. The job of leadership is to both challenge and support. It allows people to fully commit to high standards because they trust they won't be penalized for mistakes or deviations during the learning process.

Jim Collins calls this leadership dynamic “the paradox of hard and soft”:

A good leader doesn’t demand high performance (demanding implies that people are basically lazy and are inclined to withhold their best effort—that it must be extracted out of them, like pulling teeth). No, a good leader offers people the opportunity to test themselves, to grow, and to do their best work.

There is no shortage of people interested in doing something in which they can take pride. But there is a vast shortage of leaders who provide the stimulation of stiff challenge and high standards, combined with the uncompromising belief that seemingly ordinary people can do extraordinary things.

Leaders who build great companies master the paradox of hard and soft. They hold people to incredibly high standards of performance (hard) yet they go to great lengths to build people up—to make them feel good about themselves and about what they are capable of achieving (soft). [6]

As leaders, the challenge is to create an environment for team members feel secure enough while pushing to meet ambitious goals. It's not about implementing policies, but about modeling and reinforcing behaviors that support both safety and excellence.

Pay attention to subtle indicators. Are team members engaging in candid discussions about failures? Do they proactively seek feedback? These signs can help you gauge if you're in a "Learning Zone" or "Anxiety Zone".

The goal isn't to eliminate discomfort, but to ensure it serves a productive purpose. Mastering this balance sets the stage for excellence.

How Databases Store Your Tables on Disk

Mike's Notes

Fascinating article, especially the storage differences between Postgres and InnoDB.

Resources

References

  • Reference

Repository

  • Home > Ajabbi Research > Library > Subscriptions > DeepIntoDev
  • Home > Handbook > 

Last Updated

29/06/2025

How Databases Store Your Tables on Disk

By: 
DeepIntoDev: 25/05/2025

After you complete this article, you will have a solid understanding of:

  • How is a table you create in a database stored behind the scenes?
  • What are pages and heap files, and how do they work?
  • What are indexes and clustered indexes, and how do they provide optimization?
  • How do databases work internally?

When you're building a project and set up a database, creating a table with rows and columns feels pretty straightforward. You define the structure, add some data, and it just works. But have you ever stopped to think about what’s actually going on under the hood? How does your computer store all that information behind the scenes?

After all, computers don’t really “know” what a table is, they only deal with 0s and 1s. So how do they take that nicely structured data and translate it into something they can work with?

If you’ve ever created a database and found yourself wondering how rows, columns, and individual cells are really stored in memory, then you’re in the right place. In this article, we will break it all down in a way that’s easy to follow.

Along the way, we’ll also explore some key concepts (Heap file, Index, Clustered Index…) from the world of databases, either you’ll learn something new, or you’ll get a clearer understanding of stuff you might’ve already heard of.

First, let’s start by clearing up some concepts. These concepts are essential to truly understand what’s really happening behind the scenes when it comes to storing your database in a computer’s memory.

A table in PostgreSQL

So basically, in a table, we have rows and columns. The photo shown above has rows and columns defined by us.

But in some popular databases, there’s also a column that’s hidden from us. For example, databases like PostgreSQL have a system column called row_id (tuple_id,ctid). So databases create their own internal system to track your table’s rows.

A table with tuple_id in PostgreSQL

Note: A tuple ID is a pair (block number, tuple index within block) that identifies the physical location of the row within its table. (From postgresql documentation)

But not all databases handle things the same way.

For example, in InnoDB (MySQL's default storage engine);

If the table has a PRIMARY KEY, InnoDB uses the PRIMARY KEY as the row ID.

In this case, the data is physically stored on disk in the order of the PRIMARY KEY (as a clustered index -you will learn what a clustered index in this blog later-). No additional internal row ID is created, the PRIMARY KEY is sufficient to uniquely and physically identify each row.

So if there is primary key: PRIMARY KEY = Internal row ID.

If the table does NOT have a PRIMARY KEY, InnoDB automatically creates a hidden 6-byte row ID (an internal integer column). This hidden column is not visible to the user, but it is assigned to every row. This internal row ID is used to uniquely identify and reference rows internally.

If there is no PRIMARY KEY or even a UNIQUE key, this internal ID becomes essential for performance and referencing.

So If there’s no PRIMARY KEY: InnoDB creates a hidden internal row ID.

This row_id concept is important to know because as we go further, we’ll see actual use cases of these row IDs.

Alright, so now our database has a way to uniquely identify each row, whether through a primary key or a hidden internal ID. That means we’re ready to start thinking about how all this data actually gets stored in memory.

Pages

Okay, now we have a logical table with rows and columns. But how is it actually stored on disk? Obviously, our disk doesn’t store this table as a “table” - it doesn’t even know what a table is.

Depending on the storage model (row vs. column storage), the rows are stored and read in logical pages.

If you don’t know what a storage model is, I’ll briefly interrupt your reading to explain it.

Storage model means that how data is physically stored.

Row Store (Row-based storage)

  • This is the most classic and widely used storage model. (Used in systems like MySQL InnoDB, PostgreSQL, etc.)
  • In a row store, all the column values for a single row are stored together. Example:

Row 1: [id=1, name="Ali", age=25]
Row 2: [id=2, name="Ayşe", age=30]

Advantage: Very fast for row-based queries (like SELECT * FROM table)

Column Store (Column-based storage)

Here, data is stored by columns instead of rows. Example (physically stored):

Column id:   [1, 2]
Column name: ["Ali", "Ayşe"]
Column age:  [25, 30]

Advantage: Much faster for analytical queries (like SELECT AVG(age)) because only the needed columns are read.

Examples of column store systems: Amazon Redshift, ClickHouse, Apache Parquet files, Google BigQuery, Apache Cassandra (partially).

Now you know what a storage model means. So let’s get back to pages. What does a logical page actually mean?

A page is basically a fixed-size block of data, either in memory or on disk.

Databases don’t read a single row; instead, they read a page or more in a single I/O, giving us many rows at once. RAM (as the name says, Random Access Memory) allows direct access to any specific memory address, enabling efficient reading of small or individual data blocks. On the other hand, disk storage reads and writes data in fixed-size pages, not individual bytes.

The database allocates a pool of memory, often called buffer pool. Pages read from disk are placed in the buffer pool.

Once a page is loaded into the buffer pool, you don’t just get the specific row you asked for, you also get all the other rows stored on that same page. So depending on how much space each row takes up, you might end up with several useful rows already in memory, basically for free.

This makes reading data much more efficient, especially when doing index range scans. If the rows are small, more of them can fit into a single page. That means each time we read a page from disk, we get more useful data out of it, making every I/O operation more valuable.

The same goes for writes, when a user updates a row, the database finds the page where the row lives, pull the page in the buffer pool and update the row in memory and make a journal entry of the change (often called WAL) persisted to disk. The page can remain in memory so it may receive more writes before it is finally flushed back to disk, minimizing the number of I/Os. Deletes and inserts work the same but implementation may vary.

Note: What is WAL? When a user updates data, the database doesn’t write the change to the data file immediately. Instead, it first records the change in a special log file called the Write-Ahead Log (WAL), also known as the journal. This log is written to disk right away, ensuring the change isn’t lost if the system crashes. Later, the actual data file is updated based on the WAL entry.

Each page usually has a fixed size depending on which database you’re using (for example, 8KB in PostgreSQL, 16KB in MySQL…)

Let’s assume each page holds 4 rows, and we have a table with 1000 rows. That means we will have a total of 250 pages storing our rows.

Page 0 → holds the first 4 rows, Page 1 → holds rows 5-8, and so on…

Pages in Disk
(This photo is a simplified example of a pages in row-based storage databases.)

So, in short, a database stores its data in small, fixed-size pieces called pages.

Understanding pages is really important because they are the fundamental factor that can make your queries slow or fast.

Earlier, we said the database doesn’t read a single row; instead, it reads a page or more in a single I/O, giving us many rows at once. But what does I/O really mean in this specific context?

When we say an I/O (Input/Output) operation, we’re talking about any interaction with the disk, whether it’s reading data or writing it. We try to minimize these as much as possible, the fewer I/Os we make, the faster our queries run. An I/O can fetch one page or more, depending on disk partitions and other factors.

Like we said before, an I/O can’t read a single row; it reads a whole page with many rows in it, so basically, we get a lot of rows for free.

But I/O doesn’t always mean going all the way to the disk. Some I/Os interact with the operating system’s cache, which definitely makes your queries faster.

Heap

From now on, we’ll also talk about the “heap” (which usually refers to a heap file). So let’s quickly introduce what that means.

Actually, the heap is exactly what we’ve talked about so far. It’s a data structure where the table’s pages are stored one after another. This is where the actual data lives. Everything in the table is in the heap.

In a heap, pages aren’t stored in any particular order. Data gets placed wherever there’s space, so pages can be scattered and unordered. This means searching through a heap usually means scanning the entire table. (If you use a clustered index, pages are stored in a sorted, organized way based on the index key. You’ll learn what a clustered index is later in this blog.)

So basically,

Heap File → Contains Pages,

Page → Contains Records(rows)

Traversing the heap is an expensive operation since it contains everything. That’s why we need some kind of logic to help us find exactly which page we’re interested in, in other words, which page holds the data we’re looking for. That’s where indexes come in. Indexes help us to tell exactly what part of the heap we need to read, or in other words, which page(s) of the heap to pull.

If we know exactly what page to pull to get what we want, the operation becomes much less expensive, as you can probably guess. But how do we actually do that?

Index

An index is just another data structure - usually a B-Tree - separate from the heap that holds pointers to the heap. So indexes aren’t stored in the heap itself, but in their own structure, pointing to the actual data in the heap.

An index contains parts of the data and is used to quickly search for something. You can create an index on one column or multiple columns.

Indexes tell us EXACTLY which page to fetch from the heap, instead of scanning every page and taking a big performance hit.

But indexes aren’t a magical thing, they’re also stored as pages and require I/O to read their entries. So we need to be careful with indexes. The smaller the index, the more of it can fit in memory, and the faster the search will be.

Now, let’s do a simplified example so you can fully understand what an index really is.

Let’s say we’ve indexed the person_id column in our table. (If you forgot how our table looked, check the first photo.)

So, in the heap section, we have pages, right?

Pages in Disk

Since we indexed the person_id column, now there’s another data structure that holds the index information, not in the heap, but somewhere else. (The image below isn’t a B-Tree, we don’t store indexes sequentially like in the photo, but it’s meant to help you get the idea. In the real world, indexes are usually stored in B-Trees.)

After indexing person_id, outside the heap file, we have another data structure now;

Indexes in Disk

Here, since we indexed the person_id, we store the value of person_id for each row. Along with this value, we also keep information about where to find that row. For example, for employee_id 1200, we know it has a row_id of 1 and lives on page 0.

For employee_id 1204, we know it has a row_id of 5 and is on page 1.

So basically, these numbers mean → employee_id (row_id, which page the row lives on).

The row_id and page info act as the pointers we talked about earlier, directing us to the right spot in the heap section.

Let’s say we want to get the name for person_id 1202. First, we make an I/O request to the index page to find the exact location of that person in the heap. Now that we know the exact location, we make another I/O request to the heap, for example, “give me page 0 and row_id 3.” (We’ll actually pull all the rows in page 0 too, since we can’t read a single row alone, but we only use the data with row_id 3.)

Like I mentioned before, indexes aren’t stored sequentially like in the simple example, they’re stored in a much more efficient structure. So with the right setup, making an I/O request to the index page and finding the correct person_id is very fast, thanks to B-Trees.

Clustered Index

There is also something called a clustered index, which I’ve mentioned earlier in this article. Since it can be really helpful sometimes, I want to explain a bit more about clustered indexes. Like we said before, normally a heap table stores data in no particular order. But if you create a clustered index on a column, the table’s data will be physically organized based on that index.

As you might guess, a table can have only one clustered index because the data can be physically sorted in only one way.

Let's consider a table: Users(id, name, age)

  • If this table has no indexes, it is called a heap table. (like we said earlier.)
  • If we create a clustered index on the id column:
  • The table is now physically sorted based on the id column.
  • The database stores the data according to this order.
  • This makes queries like WHERE id = 100 much faster.
  • And in some databases, like InnoDB, every table is actually stored as a clustered index structure as default.

This is because InnoDB physically sorts and stores the data based on the table’s primary key.

If the table has a PRIMARY KEY, InnoDB creates the clustered index on that column, and the data is organized according to that order.

If the table does not have a PRIMARY KEY, InnoDB automatically creates a hidden clustered index, usually based on a unique row ID generated internally in the order the rows were inserted.

So, every table in InnoDB always has a clustered index.

This is actually very important to understand. Let’s say you’re using InnoDB and you have a completely random value like a UUID as the primary key of your table.

Believe it or not, this can seriously hurt your performance. Why? Because since a UUID is completely random, each new row gets inserted somewhere in the middle or a random place in the table. This causes InnoDB to constantly reorganize data, leading to page splits and fragmentation.

As a result, disk and memory accesses increase, and both write and read performance degrade.

So, if you must use UUIDs, it’s better to use them as a non-clustered index, not as the PRIMARY KEY.

For the PRIMARY KEY, using auto-increment integer values is usually better because inserts happen at the end of the table, reducing the need for reorganization.

In InnoDB, other indexes (secondary indexes) do not point directly to the row data, but instead point to the primary key of that row.

In other words:

Secondary index → primary key value → actual row data.

Note: The term "other indexes" refers to the indexes you create using CREATE INDEX or by defining a column as UNIQUE or INDEX.

Example:

CREATE INDEX idx_name ON users(name);

Here, idx_name becomes a secondary index, and InnoDB uses this index to find the primary key value first, then accesses the actual row using that primary key.

But in Postgres, everything is actually a secondary index. Remember, we have row_id (or tuple_id, ctid) in Postgres. All indexes point directly to the row_id which lives in the heap.

So, indexes show row_ids, and row_ids show the exact location of the row.

But there is also an important thing you should know. This might be a bit off-topic for this article, but if you’re a curious and want to research more about database implementations, you can keep reading. After that, you can do your own research on this topic.

ANY update in Postgres will update all the indexes corresponding to that table. Why? Because when you make an update in Postgres, you actually do a DELETE + INSERT. So you create a new row with a different tuple_id. And all the indexes, since they point to that tuple_id, have to know about this new tuple_id, which is why they need to get updated.

Why did I say that when you make an update, you actually do a delete + insert though?

PostgreSQL does not update a table row in place. Rather, it writes a new version of the row (the PostgreSQL term for a row version is “tuple”) and leaves the old row version in place to serve concurrent read requests. VACUUM later removes these “dead tuples”.

If you delete a row and insert a new one, the effect is similar: we have one dead tuple and one new live tuple. This is why people say that “an UPDATE in PostgreSQL is almost the same as a DELETE, followed by an INSERT

Why? Because PostgreSQL uses an MVCC (Multi-Version Concurrency Control) architecture. MVCC allows multiple transactions to read and write data concurrently in a consistent and non-conflicting way by keeping old and new versions of rows. If you’re curious, you can continue researching this topic further. I’m not going into the details here to avoid going too far off the main subject of this article.

I hope after reading this article, you have gained some insight into how databases work internally.

Ruthless prioritization while the dog pees on the floor

Mike's Notes

Some handy insights from Jason Cohen from his weekly newsletter, A Smart Bear. Much of Jason's approach also applies to Ajabbi, a non-profit organisation established to support socially necessary critical infrastructure and culture, including;

  • Hospitals
  • Rail
  • Ports
  • Public transport
  • Drinking water
  • Museums
  • Electricity distribution
  • etc

No Innovation Theatre

Jason Cohen has a lot of sensible things to say without the bullshit. Kromatic and IT Revolution also have excellent articles.

His articles always include humorous cartoons from Andertoons.

I left out 95% of his reference links to other articles on his website. See the original article to follow them.

Resources

References

  • Reference

Repository

  • Home > Ajabbi Research > Library > Subscriptions > A Smart Bear
  • Home > Handbook > 

Last Updated

28/06/2025

Ruthless prioritization while the dog pees on the floor

By: Jason Cohen
A Smart Bear: 22/06/2025

The Chief Innovation Officer of WP Engine.

Because time is zero-sum, prioritization is mandatory. This is an index of purpose-built prioritization frameworks, and an overarching one to optimize your life.

The prioritization mandate

Time is a zero-sum resource: An hour spent on one thing necessarily means not spending an hour on the entire universe of alternative things. Every minute is a choice. Every choice is a trade-off.

Time is a hard limit. We can maximize productive time through better habits: good sleep, sensible diet, reasonable exercise, restorative rest, reading books instead of doom-scrolling Twitter, sleeker task-management, fewer meetings, shorter meetings. But even here we’re prioritizing within 24 hours each day, choosing how we labor and rest to maximize our effectiveness. There isn’t enough time for more than two big things in your life.

All we have to decide is what to do with the time that is given us.

—Gandalf the Wizard

We need more time. Not 30% more, but 3000% more.

Every company proves that statement with a data repository called “the issue tracker”. We accumulate thousands of valid items over the years: Little ideas that would be nice to do; big features that would create differentiation; bugs that paying customers actually experience; design tweaks that make the team proud of their craft. You will never complete all these; completing even 10% would be a miracle, the ratio worsening every week as more items are added than removed. The better you listen to customers and the more creative your teams, the worse the ratio becomes. You hire more people to get more done, but new talent have new ideas, and the ratio worsens again. Inspiring, and maddening.

So, time is a fixed constraint that limits us to 1%-10% of what we “need” to execute. Unintuitively, the fraction diminishes with scale; we will never defeat it.

The inescapable conclusion is the trite statement that “We must prioritize”—intelligently determining which precious few things we will actually do.

In fact we can’t help but prioritize, even if mindlessly. Since we can only do one thing at a time, whatever we’re doing now is definitionally our “highest priority.” Reading this sentence is currently your highest priority. While “prioritizing” doom-scrolling is obviously faulty decision-making, there’s the more insidious cases of prioritizing things that are fun but only somewhat useful, or of prioritizing things due to necessity but not importance (e.g. paying taxes on time). Indeed, a common complaint of prioritization is that we’re only doing things that happen to have deadlines, instead of things that matter. “Urgent, but not important” tends to win over “Important, but not urgent,” if we’re not paying attention.

Prioritization is a choice, and more often than we’d like to admit, the choice was thoughtless. We’ve all lost a few hours to doom-scrolling or YouTube or TV (if you were born before 1990). Maybe that activity was useful for “restorative rest.” Maybe it was just a poor choice. Maybe we should give ourselves grace. Maybe.

Prior art

There are, of course, myriad prioritization frameworks. On this site alone I’ve detailed many of my own:

  • Fermi ROI: Replacing rubrics, especially “ROI”-style
  • Binstack: Making significant choices with incomparable dimensions
  • Adjacency Matrix: How to expand an existing product
  • Investment Criteria: When to invest significant time and money
  • Rocks, Pebbles, Sand: Analyzing and prioritizing three sizes of work
  • Satisficing vs Maximizing: Prioritizing some things as “good enough,” others as “never good enough”
  • Leverage Points: Where incremental change yields large results
  • Cleaving: Separating upside from downside, treating each differently
  • Fairytale Quarterly Planning: Prioritizing work against strategic objectives and the obstacles that are preventing us from winning
  • JIT streams: Handling multiple, incomparable inputs, separating prioritization from work-planning

I don’t like anything with a rubric or a computed score (this is why). I don’t like anything with a “confidence level” (because you can’t discuss it accurately). I don’t like anything that is built to produce symmetry for consultants’ slides rather than reflecting the messiness of the real world. I don’t like anything that purports to compare incomparable things (e.g. scoring “more growth” with the same made-up number as we score “don’t run out of money” or “make employees happy”).

Beyond the built-for-purpose frameworks above, there’s a simple overarching framework that applies to every type of prioritization, foisted upon us through the observation that we have time for less than 10% of what we’d like to accomplish.

Here is that framework.

10x / 0.1x Prioritization

10x tasks

Despite how precious time is, some tasks are so valuable, so impactful, that the return on your investment is an order of magnitude more than what you put in, even if you valued your time at (say) $1000/hour.

You must seek out these “10x things” that can transform the company. Examples:

  • The few features that win the majority of sales, whether through pure delight or because of a combination of utility and uniqueness among the competition. Rule of thumb: Impactful features are actively used by at least 40% of customers, or are a critical reason-to-buy or reason-to-stay for at least 15%.
  • Finding the ideal marketing positioning and wording where advertisements convert 2x higher and people landing on the home page buy 2x more often. (Not 10% higher—you can’t actually measure that.)
  • Finding the pricing model that maximizes profitable growth while maintaining fairness for customers.
  • Taking the time to correctly identify the next strategic objective or biggest obstacle, so everyone can prioritize their own time towards this most-important thing; working on the wrong thing is a 100% waste of time, even if efficiently- and perfectly-executed.
  • Hiring the next critical employee who dramatically increases the company’s throughput and work-quality and decision-making-quality, while adding a skill-set that was previously missing, a skill-set needed to overcome the current obstacle or the next strategic objective.
  • Applying energy to a Leverage Point—an area where even small changes have a large impact on growth or profitability.
  • Addressing the single biggest drag on growth.
  • Deciding how to expand the business into the next adjacency.

If you don’t know what one or two 10x tasks you should be working on, then identifying that is your highest priority. Otherwise you are certainly not prioritizing properly; the entire company is misusing their time. This is my method for determining what those things are.

If you have too many 10x choices, the Binstack prioritization framework is designed for this type of decision, where the inputs are incomparable, and you want to maximal impact.

It’s rare, however, to actually have too many 10x possibilities. If you think you do, it’s likely that you are being too generous in declaring things “10x”. They need to literally “10x” a key metric, or be the difference between survival or bankruptcy. Their upside must be so massive, that even when it inevitably takes 2x longer to implement and is \frac{1}{2} as impactful as you thought, it was still worth it. To take that 4x hit and still have a great outcome requires starting at 10x.

To further refine your thinking, treats these are investments—i.e. applying significant time, expecting an out-sized return, but with uncertainty. Here is a guide for making good investments.

0.1x tasks

Most activities are worth far less than $1000/hour, even if they are mandatory. These are the “0.1x tasks.” You must minimize these through several strategies:

Eliminate them completely by structuring your life, product, target-customer-selection, or company strategy to avoid them. Here is a guide for inventing ways to avoid them.

Delegate, even if the result is worse than what you’d do yourself (e.g. grocery delivery being both more expensive, and not picking the same apples you would have picked). It’s not worth the time to do everything (your definition of) “perfect.” You need to be in command instead of in control.

Batch or automate, accepting minor penalties (e.g. paying bills only once per month and risking occasional late fees, or batching security patches, since you can’t ignore them forever but each one is unlikely to be exploited in the next few weeks).

Archive loose tickets that are older than 100 days. Because of the rule that more than 90% of our ideas will never be done, realize that these are already among that 90%; deleting them will help you prioritize the remainder. If something is truly important, it will come up again in future. (Hence “archive”, not “delete”.)

It’s tempting to assume that small, easy tasks are automatically 0.1x tasks, but that is a fallacy of conflating “impact” with “effort”. Easy things can have a large impact (making them 10x almost definitionally), and complex things can have no impact on revenue or employee happiness.

In some regimes, many small tasks add up to a 10x impact; I call this “life by a thousand sparks”.[1] A common example is “great design”. While amazing design is not required for success, there are many examples of products winning primarily because of beloved design. Great design is not “one thing,” however. There are macro-scale architectural decisions, but also it emerges from thousand details: subtle color choices, pixel-perfect layout, font and word selection, aspect ratios, play of white space, satisfyingly snappy interactivity, a design system for comprehensive consistency, fixing every last bug that is aesthetic rather than functional, and harmony between the website, the product, the emails, and the material for marketing, sales, and support. These myriad tasks should not be dismissed as individually 0.1x, if they are specifically in service to a 10x concept that is also the primary way you win customers in a competitive market.

[1] A facetious inverse of “death by a thousand cuts”.

What if there were no 1x tasks?

Prioritization isn’t a dichotomy, but I encourage you to act is if it were, forcing yourself to make clearer decisions. Idea-abundance is beautiful, but we must be ruthless, final, and precious with our time.

You will inevitably label things as “10x” which are really 1x. You will spend too much time on 0.1x things; after all, there are so many. Forcing this binary choice is reductive, but helps us be ruthless.

Of course in reality there is a spectrum of ideas, sizes, impacts, risks, and confidence. Our ability to measure any of that even post facto is laughably poor, and our ability to predict any of them is even more pitiful. If you insist on the existence of 1x tasks,2 use the Rocks, Pebbles, Sand Framework which explains how to segment by size, how to prioritize each size differently, and how to resolve the common conflicts that arise as you schedule work in the messy real world.

[2] Another exponent of 10x / 1x / 0.1x is the great Product Management teacher Shreyas Doshi with his excellent LNO framework.

Dealing with the fallout: Dogs peeing on the floor

In a well-lit living room, a dog is peeing on the floor while a man sits in a chair, reading a book. The man doesn’t react. You’re watching from a window, concluding that this man must be ignorant, crazy, or at least a poor decision-maker. Put down the book and take that dog for a walk, idiot!

Except, you don’t know the full story.

In one hour, the man has the most important meeting of his life. His performance in this meeting will dictate the next ten years of his career. Everything he needs to know to be successful in this meeting, is in that book. Yes the dog should have been taken for a walk, but the penalty of having to clean up the pee is worth it, because the call is that important.

The decision is rational. Yet the observer sees only irrationality. This is caused by two things:

  1. The observer doesn’t know the complete story.
  2. The observer has trouble accepting that something bad/stupid can nevertheless be the right decision, because the alternative is even worse.

This inevitably happens at your company when you ruthlessly prioritize. Because you’re so focused on the most important thing, other things lay fallow. Important things. Fires burning that you’re intentionally ignoring because although they are fires, they still aren’t as important as the Most Important Thing. Dogs peeing on the floor. On purpose.

bear working while fire burns

But others see the fires burning, the dogs peeing, for months, for years, and then lose faith in leadership. They complain—understandably, and accurately—and lose morale. Worse, they start believing that The Deciders must be crazy, just as the window-peeker believed. Loss of trust and respect leads to talent leaving, which leads to the death of an organization.

“They never listen to my ideas,” the most prolific idea-creators complain. They’re right, too; after all, mathematically you could never implement more than a few percent of those ideas. Not because you’re “not listening,” but because of inexorable math. You have to focus on the peeing dogs, and you can’t do most other things.

The way you combat this natural progression is to address the two points above. You have to transmit the complete story, not just the few priorities, but also why they are the top ones. You have to acknowledge the twenty things other that also deserve attention, explaining why we’re intentionally letting those fires burn, those dogs pee, because the top priorities are even more important. This is why the “not doing” list is such an important part of the plan.

And you can retell the story of the dog peeing on the floor, acknowledging that it feels bad watching the dogs pee, especially when you know how to prevent it. I don’t remember the origin of this particular parable, but I’ve retold it many times at WP Engine, and it sticks. It works.

This is what prioritization actually looks like. The full picture, not just the social media admonitions that you “have to focus!”.

The full story requires constant, repetitive communication. Because it is bad to see the pee; we can rationalize it only when we see that the pee buys us time to do the most important things—the things that leverage our precious, woefully limited time, for out-sized results.

No one said it would be easy. Good luck.

Creating Design Specs for Development

Mike's Notes

This needs to be added to the UI design copy of Workflow Engine (wfl). Also, to auto-generate UI documentation. This could be useful in many places.

Resources

References

  • Reference

Repository

  • Home > Ajabbi Research > Library > Subscriptions > NNGroup
  • Home > Handbook > 

Last Updated

27/06/2025

Creating Design Specs for Development

By: Kelley Gordon
NNGroup: 20/06/2025

Kelley Gordon is the Director of Product at Nielsen Norman Group. She plays a crucial role in driving the success of NN/g’s digital products, including the strategy, design, development, and management of it.

Summary:

Design specifications should provide all the relevant information needed to align the design and development teams.

You work tirelessly on a new design project. It’s your masterpiece… until the dev team says it isn’t possible. Most designers have experienced this situation at some point in their careers. As frustrating as it may be, there are many ways to avoid this situation from happening. Clear design specs are a good place to start.

In This Article:

  • What Are Design Specs?
  • The Components of a Design Spec
  • Examples of Specs
  • Tips for Aligning with Developers

What Are Design Specs?

Design specifications are a way to align on and efficiently communicate designs to a software-development team. 

Design specifications (specs) are documents that provide all relevant information on the functionality, behavior, and appearance of a design, so that developers can implement the design into a real, functioning product.

Design specs allow the design and development teams to have productive conversations and align on user needs, design feasibility, and design and technical requirements.

Depending on the project needs, design specs can be focused on one design aspect. For example, for a visual-refresh project, the design spec may include only information about the appearance of the different design elements, rather than on their functionality. 

For many teams, this documentation takes the form of a Figma (or other design tool) link with additional project and development details, organized in a development issue or ticket in a development tool, like GitHub or Linear. The development issue would include relevant contextual information, like the goal, use case or requirements the design solves for, so that developers can implement the design.

Design specifications include a design file and a development issue.” Shown are labeled mockups of a GitHub issue and a Figma webpage design file.


Design specifications include a design file and development issue that contains additional context.

The Components of a Design Spec

Remember, the spec has two big components: the design file (e.g., Figma) and the development issue.

What Is Included in the Design File

The design file is what designers typically think of when they hear the phrase “design spec.” It specifies the design work that the design team produces, broken down into consumable pieces for the development team. 

This portion of the spec should include information about:

  • Interaction flows: Define what happens when users click or tap on interactive elements.
  • Visual design: Define the color palette, typography styles, and icons used in the design. Color palettes and typographic styles should be set up separately in the design file, with each style named appropriately, so developers and other designers can easily use them.
  • Layout: Define the grid system used, as well as various breakpoints.
  • Interaction elements: Provide components for any user-interface elements, like buttons and input fields. Include any details about associated microinteractions, like animations or transitions.
  • Content: Use real text and multimedia content in the design mockups, not placeholders, providing details needed for image sizes. 
  • Specific accessibility needs: Your designs should comply with accessibility standards; however,  specific items (e.g., tabbing order on a page or alt text) may need to be called out explicitly.

What Is Included in the Development Issue

A lot of development teams see the development issue as a “contract” between the dev and design teams. What is outlined in the issue is what the developer is on the hook for delivering.

Issues typically include a lot of context needed to understand the designs and the project: the goal of the design, what is in and out of the project’s scope, a description of the functional (e.g., system features) and nonfunctional (e.g., performance) requirements, any use cases the design touches on, and potential risks and mitigations. This information should be specific to the design that is getting implemented and should come from the product owner or tech lead. 

A screenshot of the design may also be included in the development issue, to communicate what the dev and design team agreed on when the issue was written. The screenshot also allows development to quickly see what the issue is about. However, if screenshots are included, they should be consistent with the designs in the design file. 

If the design gets updated, the design team will need to discuss the update and an implementation timeline with the development team. Depending on how big the update is, an additional development issue might be created. Any discrepancies between the screenshots in the development issue and the Figma file should be noted to prevent confusion about what needs to be implemented. 

Linear issue view showing objectives, scope, assumptions, success metrics, and a Figma design link under “Wireframes / Design References.”


A Linear issue contains context and design details, including a link to the Figma design file.

Small specs are much easier to create and implement than one very large spec. If a design spec is getting too large and difficult to organize and maintain, it might be a sign that it needs to be broken down into smaller, more digestible pieces. Include the dev team in this decision, as the ease of implementation will be affected by how the design is further broken down.

Specs Are Created in the Design Phase

In the end-to-end product-design process, design specs are created during the design phase, after substantial work has already been completed. Before creating a spec, your team should:

  1. Define the product's strategic context 
  2. Conduct any necessary discovery research 
  3. Create and prototype flows and interactions based on user needs 
  4. Carry out usability testing on the designs you or your team has created 
  5. Apply findings discovered through usability testing to designs

It takes a lot of time to create a spec and then implement the designs. You want to make sure the designs are worth the effort and they address the right user needs. That is why a lot of upfront work is needed before even getting to spec your design work.     

Diagram of the product design process: Define, Discover, Design (Ideate, Prototype, Test, Spec), then Develop. “Spec” is highlighted.


Design specs are created in the design phase of the end-to-end product design process.

Who Is Responsible for Writing Design Specs? 

The design team (whether made up of one designer or several designers with specialized roles such as visual designer or content designer) is in charge of creating the design file in the spec, as well as annotating it with any details that may be important for the developers. 

The development issue is usually created by the product owner or a member of the development team (even though that may vary depending on the team and its specific context).

Examples of Specs

Example 1: Small Mobile Design

In this spec, the design is perfectly sized and portioned for a developer to understand the full design and implement it in a timely manner. The design is about how navigation for a website works on a mobile device. Sufficient contextual information is provided directly in Linear, as opposed to the Figma file, providing organization for the development team. The context supplies information on design goals, user needs and use cases, as well as any preliminary research findings. You will also notice that the Figma file is linked, ensuring that developers always have access to the latest version of the design.

Linear issue titled “Create new mobile navigation” includes goals, scope, research, design notes, and a Figma file link for developer reference.


The Linear issue contains a link to the Figma file, as well as additional context for the development team to use when coding.

In the linked Figma file, the relationships among different screens are mapped out  through annotations, allowing developers to easily understand how users might interact with them.

Figma prototype showing mobile navigation flow, including interactions for tapping the hamburger menu and search icon on the NN/g homepage.


The Figma file shows what happens when a user taps the hamburger and search icons.

Example 2: Large Webpage Design

The Figma file of this spec includes details on layout, content, and visual design of an entire webpage. The design shows the webpage at various breakpoints, as well as color variations that the page will need to support.

Annotations are color-coded, allowing developers to easily scan and see what is important for their specific coding work. For example, back-end-specific annotations are red, so backend developers can quickly find pertinent information to their work. Figma comments are also used to asynchronously align on design feedback and questions.

Figma file showing webpage spec with page structure, color variants, and readiness indicators for developers in green, yellow, and red.


The Figma file for a webpage spec shows the page breakpoints and color variations. In the left side panel,  green, yellow, and red indicators let developers know whether those pages are ready for them.

Example 3: Component Spec

This button component spec from Google’s Material Design provides details about each button style, including different states and values for various attributes (e.g., the button’s height is 40dp), as well as references for both designers and developers.

Material Design webpage showing specs for an elevated button, with labeled parts, button states, and navigation for other button types.


Google’s Material Design button component spec is presented on a website, instead of just a Figma file.

Tips for Aligning with Developers

Designers and developers do not always agree on designs. Each brings a unique and needed perspective to create and develop useful experiences. Here are some tips to improve communication and working relationship with developers:

Include the development team in design conversations way before your design is “done.” Ideally, the design spec documents previously agreed-upon information on behavior, functionality, and visual design. 

Allow time for developers to leave comments in your design file. This needs to happen before the design-review meeting with your developers. It will give them time to think about the design and its feasibility. In your design-review meeting, focus the conversation around any comments made in the design file, making the meeting much more productive and effective.

Be prepared to make tradeoffs. There are times to push back on development and times where tradeoffs are needed. This is a natural part of working with a development team. Designers should ensure that critical user needs are being met and should not give in to everything the development team brings up, but, if a certain aspect of the design is going to take substantial development effort, and is not critical for your user, revisiting it may be worth it.

Make sure design updates are documented and communicated to developers. You would be shocked how many times a lack of documentation has created confusion and frustration in design and development teams. Communicate design changes in your design specs as well as through other communication channels that your team may use.