Tuesday, 18 August 2026

97 Things Every Programmer Should Know: Collective Wisdom from the Experts (Free PDF)

97 Things Every Programmer Should Know: Collective Wisdom from the Experts

Programming is often taught through syntax, algorithms, frameworks, and projects. But becoming a truly good programmer requires much more than knowing how to write code. It requires learning how to think about software, communicate with users and teammates, test ideas, maintain existing systems, choose appropriate tools, and continuously improve your engineering practices.

97 Things Every Programmer Should Know: Collective Wisdom from the Experts, edited by Kevlin Henney, is a collection of short essays that explores these broader aspects of professional programming. Published by O'Reilly in 2010, the book contains 97 contributions from experienced programmers and software practitioners. The O'Reilly edition is listed as 255 pages, while the ebook edition is listed at 258 pages.

The book is deliberately different from a traditional programming textbook. It does not teach one programming language or framework. Instead, it presents practical advice and principles that can be applied across programming languages, projects, teams, and technologies.

Download the PDF for free:

  97 Things Every Programmer Should Know: Collective Wisdom from the Experts (Free PDF)

What Is the Book About?

The central idea behind the book is simple: good programming is a craft.

Knowing syntax is only the beginning. A programmer also needs to understand how software behaves over time, how code affects other developers, how users interact with applications, and how seemingly small technical decisions can create long-term consequences.

The 97 essays cover topics such as:

  • Code quality

  • Simplicity

  • Testing

  • Refactoring

  • Software design

  • APIs

  • Databases

  • Algorithms

  • Data structures

  • Version control

  • Continuous learning

  • Debugging

  • Automation

  • User experience

  • Team collaboration

  • Professional development

The official contents include topics such as "Code Is Design," "Code Reviews," "Continuous Learning," "Deploy Early and Often," "Don't Repeat Yourself," "Improve Code by Removing It," "Put Everything Under Version Control," "Read Code," "The Single Responsibility Principle," and "Use the Right Algorithm and Data Structure."

Why This Book Is Different from a Programming Textbook

A conventional programming book may teach you:

def calculate_total(price, tax):
    return price + price * tax

But knowing how to write this function does not answer larger engineering questions.

Should the function be this small?

Should the tax calculation be separated?

How should the function be tested?

What happens if the input is invalid?

Will another developer understand the function six months later?

Should the function name reflect business terminology?

Should the behavior be documented?

These are the kinds of questions that distinguish writing code from engineering software.

That is where this book becomes useful.

The Book Is About Programming Beyond Syntax

One of the strongest themes throughout the collection is that programming is not simply about making a computer execute instructions.

Software exists to solve problems.

That means programmers need to understand:

Users

Business requirements

Domain concepts

System constraints

Technical trade-offs

Maintenance

Team communication

The book's essays encourage programmers to think about all of these dimensions rather than focusing exclusively on implementation.

Code Is Design

One of the important topics in the book is the idea that code itself represents design.

Design is sometimes treated as something that happens before programming begins.

In reality, implementation decisions continuously shape the architecture of a software system.

Choosing:

  • A class structure

  • A function boundary

  • An API

  • A database model

  • An abstraction

  • A module structure

is also a design decision.

This means developers should not think of coding as simply translating an already-finished design into syntax.

The code is part of the design.

Why This Matters

Poorly designed code can make future changes difficult.

For example, imagine a Python application where one enormous function handles:

  • User authentication

  • Database operations

  • Email notifications

  • Payment processing

  • Report generation

Even if the program works, maintaining it will become increasingly difficult.

Breaking responsibilities into meaningful components can make the system easier to understand and modify.

This is why software design and code quality are deeply connected.

Beauty Is in Simplicity

Another recurring lesson is the value of simplicity.

Programmers sometimes create complicated solutions because complicated solutions appear more sophisticated.

But complexity has a cost.

Every unnecessary abstraction can increase:

  • Maintenance effort

  • Cognitive load

  • Debugging difficulty

  • Testing requirements

  • Onboarding time

A simpler solution is often easier to understand and change.

This does not mean that every program should be simplistic.

The goal is appropriate simplicity.

A good programmer learns to distinguish between complexity that is necessary and complexity that exists only because of poor design.

The Boy Scout Rule

One of the well-known ideas associated with the book is the Boy Scout Rule.

The principle is commonly summarized as leaving the code in a slightly better condition than you found it.

Imagine opening an old function and noticing:

  • A confusing variable name

  • Unnecessary duplication

  • Poor formatting

  • An outdated comment

Instead of ignoring everything because "it was already like that," a developer can make a small improvement while working in the area.

Over time, many small improvements can significantly improve a codebase.

This is particularly useful in large and long-lived projects.

Why Small Improvements Matter

Software quality rarely improves through one gigantic cleanup operation.

Large refactoring projects can be risky and expensive.

Small, continuous improvements are often easier to review and integrate.

The idea is:

Touch code → Understand it → Improve it → Leave it cleaner

This creates a culture of continuous improvement.

Don't Repeat Yourself

The book also includes the familiar principle Don't Repeat Yourself, commonly known as DRY.

The fundamental idea is that duplicated knowledge creates maintenance problems.

Consider:

price = quantity * unit_price

If the same business rule is duplicated across ten different locations, changing that rule later becomes difficult.

However, DRY should not be interpreted as "never write similar-looking code."

Two pieces of code may look similar while representing different business concepts.

The deeper lesson is to avoid duplicating knowledge and responsibility, not simply identical lines of syntax.

Testing Is a Core Engineering Practice

Testing receives substantial attention throughout the book.

The contents include topics such as:

  • Testers Are Your Friends

  • Test for Required Behavior Not Incidental Behavior

  • Test Precisely and Concretely

  • Testing Is the Engineering Rigor of Software Development

  • Write Tests for People

Testing is not merely about checking whether a program currently works.

Good tests can also communicate what the software is supposed to do.

For example:

def add(a, b):
    return a + b

A test such as:

assert add(2, 3) == 5

does more than verify a calculation.

It also communicates expected behavior.

Testing as Documentation

Well-designed tests can act as executable documentation.

A developer reading:

assert calculate_discount(100, 10) == 90

can immediately understand one expected behavior of the function.

This is particularly useful when requirements are complicated or when the original developer is no longer working on the project.

Code Reviews

Code review is another important software-engineering practice represented in the book.

A code review provides an opportunity for another developer to examine changes before they become part of the system.

Reviewers may identify:

  • Bugs

  • Security issues

  • Poor naming

  • Duplicated logic

  • Architectural problems

  • Missing tests

  • Unnecessary complexity

But effective code reviews should not become competitions about who knows more.

The objective is to improve the software.

A Good Code Review Culture

A healthy review process focuses on questions such as:

Does the code solve the problem?

Is the design understandable?

Is it tested?

Could it introduce a regression?

Will future developers be able to maintain it?

This creates a collaborative engineering environment rather than a personal criticism system.

Continuous Learning

Technology changes rapidly.

Programming languages evolve.

Frameworks become obsolete.

New architectures emerge.

Development tools improve.

The book includes Continuous Learning among its topics, reinforcing the idea that professional programmers need to keep developing their knowledge.

Continuous learning does not necessarily mean learning every new framework.

Instead, programmers should develop durable fundamentals while selectively learning technologies that are relevant to their work.

For example, a Python developer might focus on:

Python → APIs → Databases → Testing → Git → Cloud → AI/ML

rather than attempting to learn every programming language available.

Learn More Than One Language

The book also contains Know Well More Than Two Programming Languages.

Learning multiple languages can expose developers to different programming paradigms and ways of thinking.

For example:

Python emphasizes readability and flexibility.

JavaScript provides a strong foundation for web development.

Java emphasizes object-oriented and enterprise programming.

C provides insight into lower-level programming and memory.

Functional languages can introduce different approaches to state and computation.

The objective is not to collect programming languages as trophies.

The objective is to expand your understanding of programming itself.

Know the Language's Culture

Learning syntax is not enough.

Every programming language has its own ecosystem, conventions, idioms, tools, and community practices.

For example, Python programmers commonly value readability and idiomatic simplicity.

A programmer who knows Python syntax but ignores Python conventions may still write technically valid code that feels unnatural to experienced Python developers.

Understanding a language's culture therefore becomes part of becoming proficient in that language.

Choose Your Tools with Care

Modern developers have access to thousands of tools.

Editors, IDEs, libraries, frameworks, databases, cloud services, testing tools, CI/CD platforms, containers, and AI assistants can all improve productivity.

But tools should solve problems rather than create unnecessary complexity.

A good question is not:

"What is the newest tool?"

Instead:

"What problem am I trying to solve?"

This prevents technology choices from becoming driven purely by trends.

Know Your IDE and Command-Line Tools

The book also emphasizes practical development skills such as knowing your IDE and command-line tools.

This may seem less exciting than learning a new framework, but productivity often depends heavily on how efficiently a developer can navigate their development environment.

Understanding features such as:

  • Debugging

  • Search

  • Refactoring

  • Navigation

  • Code inspection

  • Version-control integration

  • Terminal commands

can save enormous amounts of time.

Automation

The book repeatedly highlights automation.

Automation can remove repetitive manual work from development workflows.

For example:

Manual testing

→ Run tests one by one

versus

Automated testing

→ Run the entire test suite automatically

Similarly:

Manual deployment

→ Developer performs deployment steps

versus

Automated CI/CD

→ Pipeline builds, tests, and deploys automatically

Automation allows developers to spend more time solving meaningful problems.

Deploy Early and Often

The book includes the principle Deploy Early and Often.

This challenges the idea that software should remain hidden until everything is perfect.

Early deployment can reveal:

  • Integration problems

  • Performance issues

  • User misunderstandings

  • Infrastructure limitations

  • Unexpected edge cases

The earlier these problems become visible, the less expensive they can be to fix.

This principle connects naturally with modern practices such as:

  • Continuous Integration

  • Continuous Delivery

  • Continuous Deployment

  • Automated Testing

Put Everything Under Version Control

Version control is one of the most fundamental practices in software development.

A version-control system allows developers to track changes and collaborate safely.

Git is now widely used for this purpose.

A simple workflow might look like:

Create branch
     ↓
Make changes
     ↓
Run tests
     ↓
Commit
     ↓
Push
     ↓
Code review
     ↓
Merge

Version control also provides historical information.

If something breaks, developers can investigate what changed.

Without version control, tracking the evolution of a project becomes much harder.

Read Code

Writing code is only part of a programmer's job.

Developers spend substantial amounts of time reading:

  • Existing applications

  • Libraries

  • APIs

  • Documentation

  • Pull requests

  • Logs

  • Tests

  • Configuration files

The book includes Read Code as a dedicated topic.

Learning to read unfamiliar code is therefore a critical programming skill.

Why Reading Code Is Difficult

Writing new code gives you control over the structure.

Reading existing code means entering someone else's mental model.

You need to determine:

What does this code do?

Why was it written this way?

What assumptions does it make?

What depends on it?

What could break if I change it?

These questions are central to maintenance and debugging.

Improve Code by Removing It

More code does not necessarily mean better software.

Every additional line creates another opportunity for:

  • Bugs

  • Complexity

  • Maintenance

  • Testing

  • Misunderstanding

Sometimes the best improvement is removing unnecessary code.

For example, if a complicated implementation can be replaced with a simpler standard-library function, the resulting system may be easier to maintain.

This is an important mindset shift:

Programming is not about maximizing the amount of code you write.

It is about creating the simplest reliable solution to the problem.

Use the Right Algorithm and Data Structure

Performance often depends more on the algorithm and data structure than on small code-level optimizations.

For example, searching for an item in a list generally requires different work from checking membership in a set.

Conceptually:

items = [1, 2, 3, 4, 5]

and:

items = {1, 2, 3, 4, 5}

represent different data structures with different characteristics.

Understanding:

  • Arrays

  • Lists

  • Sets

  • Dictionaries

  • Trees

  • Graphs

  • Queues

  • Stacks

helps developers choose appropriate solutions.

The book explicitly includes Use the Right Algorithm and Data Structure among its 97 topics.

Comments Should Add Meaning

The book also discusses comments and emphasizes that comments should explain things that the code itself cannot communicate clearly.

Consider:

# Add 1 to count
count += 1

This comment adds little value because the code already communicates the operation.

A more useful comment might explain why something unusual is being done.

For example:

# API returns timestamps in UTC, so convert before comparison.

The code may not make that business or technical assumption obvious.

This leads to a useful rule:

Use code to explain what. Use comments to explain why.

Think About the User

One of the book's listed topics asks:

"What Would the User Do?" — You Are Not the User.

Developers naturally understand their own software differently from first-time users.

A developer may know exactly where a feature is located.

A new user does not.

Therefore, assumptions based on the developer's own behavior can be misleading.

Good software development requires observing actual users and understanding their workflows.

This is especially important for:

  • Web applications

  • Mobile applications

  • SaaS products

  • Forms

  • Dashboards

  • APIs

  • Developer tools

Code Is Written for the Future

One of the most practical lessons in the book is the importance of writing code that other people can understand and maintain.

The book includes:

Write Code As If You Had to Support It for the Rest of Your Life

This is a powerful mindset.

Instead of asking:

"Can I make this work?"

ask:

"Will someone else understand this six months from now?"

That changes programming decisions.

You start paying greater attention to:

  • Naming

  • Structure

  • Tests

  • Documentation

  • Error handling

  • Simplicity

  • Dependencies

Professional Programming

The book also includes The Professional Programmer as one of its topics.

Professionalism in software development is not simply about technical ability.

It also involves:

  • Taking responsibility

  • Communicating clearly

  • Meeting commitments

  • Learning from mistakes

  • Respecting teammates

  • Writing maintainable software

  • Understanding business requirements

  • Thinking about users

A programmer can write highly optimized code and still be ineffective if they cannot collaborate with others.

Who Should Read This Book?

Beginners

Beginners can use the book to develop good habits early.

However, it works best when read alongside actual programming practice.

Intermediate Programmers

Intermediate developers may get even more value because they already have enough experience to recognize the problems discussed in the essays.

Experienced Developers

Senior developers can use the essays as reminders and discussion starters.

Some ideas may feel familiar, but revisiting familiar principles from a different perspective can still be useful.

Software Engineering Students

Students can use the book to complement technical courses on programming languages, algorithms, databases, and software engineering.

Developers Switching Languages

Because the advice is largely language-independent, the book is useful when moving between programming ecosystems.

How to Read the Book

You do not necessarily need to read all 97 essays in order.

Because the chapters are short and relatively independent, the book works well as a reference.

For example, if you are currently struggling with testing, you can focus on the testing-related essays.

If you're working on a large legacy project, read the chapters about refactoring, code quality, version control, and maintenance.

If you're beginning your career, start with:

Continuous Learning

Read Code

The Professional Programmer

Code Reviews

Testing

Simplicity

This makes the book useful both as a linear read and as a professional reference.

Key Lessons for Modern Programmers

Although the book was published in 2010, many of its principles remain relevant because they concern fundamental software-engineering practices rather than temporary technologies.

Here are some of the most valuable lessons:

Write Less, Better Code

More code creates more maintenance.

Prefer Simplicity

Simple systems are generally easier to understand and change.

Test Behavior

Tests should verify what the software is supposed to accomplish.

Read Existing Code

Professional development involves much more reading than beginners expect.

Keep Learning

Programming is a constantly evolving profession.

Automate Repetitive Work

Computers are excellent at repetitive tasks.

Use Version Control

Track changes and make collaboration safer.

Think About Users

Developers are not automatically representative of users.

Choose Appropriate Abstractions

Abstraction should reduce complexity, not hide it behind unnecessary layers.

Treat Code as a Long-Term Asset

The code you write today may need to be maintained by someone else years later.

Is the Book Still Relevant?

Yes, particularly at the level of software-engineering principles.

The book does not teach modern frameworks such as React, FastAPI, PyTorch, Kubernetes, or today's generative-AI tooling. Those technologies have changed significantly since the book's publication.

But concepts such as:

  • Testing

  • Simplicity

  • Code review

  • Version control

  • Refactoring

  • Automation

  • Domain understanding

  • Good APIs

  • Appropriate algorithms

  • Continuous learning

remain fundamental.

The O'Reilly catalog still presents the book as a beginner-level programming title, and its table of contents continues to emphasize these language-independent engineering principles.

Hard Copy:  97 Things Every Programmer Should Know: Collective Wisdom from the Experts

Kindle: 97 Things Every Programmer Should Know: Collective Wisdom from the Experts

Download the PDF for free:

 https://github.com/Babunashvili/Books-To-Read-Before-You-Die/blob/master/Ebooks/97%20Things%20Every%20Programmer%20Should%20Know%20-%20%5BHenney%5D.pdf

Final Verdict

97 Things Every Programmer Should Know is not a book about learning Python, Java, C++, JavaScript, or any other specific programming language.

It is a book about becoming a better software developer.

Its greatest strength is its variety. Ninety-seven short contributions provide different perspectives on programming, software design, testing, debugging, collaboration, tools, maintenance, and professional growth. The contributors include experienced practitioners such as Michael Feathers, Pete Goodliffe, Diomidis Spinellis, Cay Horstmann, and Verity Stob.

Some chapters may feel obvious to experienced developers. Others may challenge assumptions or provide a new way of thinking about familiar problems. That variety is part of the book's appeal.

The most important takeaway is that programming is not simply about making code run.


0 Comments:

Post a Comment

Popular Posts

Categories

100 Python Programs for Beginner (119) AI (335) Android (25) AngularJS (1) Api (7) Assembly Language (2) aws (31) Azure (12) BI (10) Books (335) Bootcamp (14) C (78) C# (12) C++ (83) cloud (1) Course (88) Coursera (302) Cybersecurity (34) data (10) Data Analysis (46) Data Analytics (31) data management (16) Data Science (418) Data Strucures (18) Deep Learning (215) Django (16) Downloads (3) edx (21) Engineering (15) Euron (30) Events (7) Excel (24) Finance (13) flask (4) flutter (1) FPL (17) Generative AI (77) Git (13) Google (54) Hadoop (3) HTML Quiz (1) HTML&CSS (48) IBM (43) IoT (3) IS (25) Java (99) Leet Code (4) Machine Learning (383) Meta (24) MICHIGAN (5) microsoft (13) Nvidia (8) Pandas (16) PHP (20) Projects (34) Python (1359) Python Coding Challenge (1218) Python Mathematics (10) Python Mistakes (51) Python Quiz (603) Python Tips (99) Questions (3) R (72) React (7) Scripting (3) security (4) Selenium Webdriver (4) Software (21) SQL (55) Udemy (19) UX Research (1) web application (11) Web development (9) web scraping (3)

Followers

Python Coding for Kids ( Free Demo for Everyone)