An excerpt from the repository, fetched Nov 13, 2026.
Read the project’s introduction
How to be a Programmer: Community Version
Robert L. Read with Community
Copyright 2002, 2003, 2016 Robert L. Read
Licensed under Creative Commons Attribution-ShareAlike 4.0 International License.
Available on gitbook to read
Available to buy as a hardcover book (cost covers production & shipping only) - Edition 1, published 04/01/16
Contributing
NOTE: What follows is the essay mostly as it was written in 2002. However, the community has provided some improvements, and all of the translations. Please submit a pull request or create an issue to make major or minor changes, respectively.
Introduction
To be a good programmer is difficult and noble. The hardest part of making real a collective vision of a software project is dealing with one's coworkers and customers. Writing computer programs is important and takes great intelligence and skill. But it is really child's play compared to everything else that a good programmer must do to make a software system that succeeds for both the customer and myriad colleagues for whom he or she is partially responsible. In this essay I attempt to summarize as concisely as possible those things that I wish someone had explained to me when I was twenty-one.
This is very subjective and, therefore, this essay is doomed to be personal and somewhat opinionated. I confine myself to problems that a programmer is very likely to have to face in her work. Many of these problems and their solutions are so general to the human condition that I will probably seem preachy. I hope in spite of this that this essay will be useful.
Computer programming is taught in courses. The excellent books: The Pragmatic Programmer [Prag99], Code Complete [CodeC93], Rapid Development [RDev96], and Extreme Programming Explained [XP99] all teach computer programming and the larger issues of being a good programmer. The essays of Paul Graham [PGSite] and Eric Raymond [Hacker] should certainly be read before or along with this article. This essay differs from those excellent works by emphasizing social problems and comprehensively summarizing the entire set of necessary skills as I see them.
In this essay the term boss is used to refer to whomever gives you projects to do. I use the words business, company, and tribe, synonymously except that business connotes moneymaking, company connotes the modern workplace and tribe is generally the people you share loyalty with.
Welcome to the tribe.
Contents
Also available in Chinese, Japanese,Spanish, and Russian
Beginner
Personal Skills
Learn to Debug
How to Debug by Splitting the Problem Space
How to Remove an Error
How to Debug Using a Log
How to Understand Performance Problems
How to Fix Performance Problems
How to Optimize Loops
How to Deal with I/O Expense
How to Manage Memory
How to Deal with Intermittent Bugs
How to Learn Design Skills
How to Conduct Experiments
Team Skills
Why Estimation is Important
How to Estimate Programming Time
How to Find Out Information
How to Utilize People as Information Sources
How to Document Wisely
How to Work with Poor Code
How to Use Source Code Control
How to Unit Test
Take Breaks when Stumped
How to Recognize When to Go Home
How to Deal with Difficult People
Intermediate
Personal Skills
How to Stay Motivated
How to be Widely Trusted
How to Tradeoff Time vs. Space
How to Stress Test
How to Balance Brevity and Abstraction
How to Learn New Skills
Learn to Type
How to Do Integration Testing
Communication Languages
Heavy Tools
How to analyze data
Team Skills
How to Manage Development Time
How to Manage Third-Party Software Risks
How to Manage Consultants
How to Communicate the Right Amount
How to Disagree Honestly and Get Away with It
Judgment
How to Tradeoff Quality Against Development Time
How to Manage Software System Dependence
How to Decide if Software is Too Immature
How to Make a Buy vs. Build Decision
How to Grow Professionally
How to Evaluate Interviewees
How to Know When to Apply Fancy Computer Science
How to Talk to Non-Engineers
Mentoring
How to Be Mentored
How to Mentor Others
Advanced
Technological Judgment
How to Tell the Hard From the Impossible
How to Utilize Embedded Languages
Choosing Languages
Compromising Wisely
How to Fight Schedule Pressure
How to Understand the User
How to Get a Promotion
Serving Your Team
How to Develop Talent
How to Choose What to Work On
How to Get the Most From Your Team-mates
How to Divide Problems Up
How to Handle Boring Tasks
How to Gather Support for a Project
How to Grow a System
How to Communicate Well
How to Tell People Things They Don't Want to Hear
How to Deal with Managerial Myths
How to Deal with Organizational Chaos
Glossary
Appendix A - Bibliography/Websiteography
Appendix B - History (As of January 2016)
Appendix C - Contributions (As of January 2016)
How To Be A Programmer: Community Version by Robert L. Read with Community is licensed under a Creative Commons Attribution-ShareAlike 4.0 International License.
Read the full README on GitHub