By Developers, For Developers

Historical errata for The Pragmatic Programmer, 20th Anniversary Edition

PDF PgPaper PgTypeDescriptionFixed onComments
49TYPO

Hide thirds-party APIs behind <- “third-party”
this approach is a lot easier that taking a monolithic <- easier “than”

2019-05-10
51TYPO

“interesting to consider how how to hit a target in a complex”
doubled “how”

2019-05-10
14SUGGEST

Under the tile “Your Knowledge Portfolio”:

An investment in knowledge always pays the best interest.

The word “interest” is split. If possible, I prefer the word would not be split, because there are spaces on the line.

2019-06-12Thanks. This is something we'll address when we do the final layout.
2TYPO

Last line of the page:

“They look at their skills become dated …” should be something like “They look on as their skills become dated and…” or something else. I can’t come up with a smooth way of saying this but I’m sure y’all can :)

2019-05-10
132TYPO

“All the cars in a train our coupled together”
our <- are?

2019-05-10
135TYPO

“Our experience is that this form of coupling is far less a barrier to changing
the code that the form introduced by train wrecks.”
“…than the form…”

2019-05-10
136TYPO

“And example of this comes when you’re writing unit tests for code that uses
global data. You’ll find yourself wiring a bunch of setup code to create a
global environment just to allow your test to run.”
“An example…”
“wiring” <- “writing”?

2019-05-10
10TYPO

at least on my kindle paperwhite, when i click the footnote, it shows:
Footnote
[3]
…since hyperlinks not allowed….pragprog.com/titles/tpp20Copyright 2019 The Pragmatic Bookshelf

there is a space missing after the url and before Copyright

2019-07-10
viiTYPO

First para of preface ends with quotation marks but there are no beginning quotation marks.

2019-05-10
ixTYPO

Move footnote notation #3 to after the period.

2019-05-10
14TYPO

2nd para - …than you would every use - -> s/b ever

2019-05-10
14TYPO

…day-to-day professional assets, - -> comma s/b a period

2019-05-14
18TYPO

Next to last paragraph - …read up on and it study it. - -> s/b read up on it and study it.

2019-05-14
19TYPO

Last paragraph. …. Always programmed in The same … - -> lowercase the

2019-05-14
0TYPO

in Topic 9, the last code section of “DRY Violations in Data” isn’t formatted as code. This is the epub version.
Specifically, I’m talking about the code that starts with this line:
“class Line { private double length; private Point start; private Point end;”
sorry since I’m reading the epub version, I don’t have a page # for you.

2019-05-14
41SUGGEST

You mention unit tests in “Simple components can be designed, coded, unit tested, and the forgotten […]”. I agree with the main point of orthogonal components being easier to implement. However I think only mentioning only unit tests is a bit narrow as integration tests should be run as well. Especially if you are about to forget everything about the component moments later :)

2019-05-15
84TYPO

In the “Shared Directories Are NOT Version Control” box, in the sentence: Some folks do use version control, and keep the repository (the location which contains the history of the changes on a network or cloud drive).

the closing paren should probably be after “changes” instead of at the end of the sentence

2019-05-15
22TYPO

second paragraph, last sentence: Sometimes all it takes is the simple question “Is this a good time to talk about…?” —> Sometimes all it takes is the simple question, (add a comma).

2019-05-14
23OK

After awl, their are spelling miss steaks that the checker can knot ketch. —> heh..cute. :-)

2019-05-14
23/24TYPO

Online Communication sidebar, in the tips:

Proofread before you hit SEND —> add a period at the end of this sentence

6th tip …If you wouldn’t say it someone’s face, —> to someone’s face

2019-05-14
36TYPO

The quoted text from Object-Oriented Software Construction has ending quotation marks but no beginning ones.

2019-05-15
37TYPO

Under heading Duplication Across External APIs, move footnote reference 2 to after the period.

2019-05-15
37TYPO

Under heading Duplication With Data Sources, 3rd para:

a simply table driven —> simple ?

2019-05-15
46TYPO

last para - You’re asked to read a file line at a time. —> …read a file a line at a time.

2019-05-15
49TYPO
  • and, inevitably, an apparent move back to big hunks of iron for some
    tasks. —— I don’t think the period is necessary since it’s the final item of the bulleted list and none of the other line have punctuation
2019-05-15
58TYPO

3rd para: You can prototype —> You can prototype: (add a colon)

2019-05-15
63TYPO

Ansible9 is a tool that configures software, typicaly on —> typically

2019-05-15
36ERROR

The source of class Line is not formatted as code, but normal text

2019-05-14
64OK

A Cucumber test is converted into code to be run or a datastructure —> should “or” be “on”?

2019-05-15
86TYPO

Version control system —> systems

2019-05-15
88TYPO

2nd paragraph under Challenges: …find a way add them —> …find a way to add them…

2019-05-15
92TYPO

Bad Results
What it it’s not a crash. —>. What if it’s not a crash?

2019-05-15
94TYPO

3rd paragraph: Being able to do this is just on of the many benefits —> “on” s/b “one”

2019-05-15
94TYPO

3rd paragraph: picking releases for your —> “your” s/b “you”

2019-05-15
94TYPO

2nd para under Logging and/or Tracing: “got here”” —> remove second " mark

2019-05-15
112TYPO

Exercise 12: Add appropriate pre- and postconditions —> post-conditions

2019-05-15ce
115TYPO

Footnote 2: flag to enabled them, and —> enable

2019-05-15
116TYPO

First line: add an descriptive —> add a descriptive

2019-05-15
116TYPO

writing code such as —> writing code such as: (add a colon)

2019-06-12
117TYPO

Should the be a colon at the end of each para, before the code examples?

2019-05-15Dave: let's let the CE handle these... :) \n \nJanet: OK. There's a colon in some places and not in others. Seems like it needs to be consistent.
124TYPO

…environment with exceptions is —> need a colon after “is” before the code example?

2019-05-15
76OK

While we’re at it, FIELD10 doesn’t help much either. Something like —> add a : (colon) after like

2019-05-15I'll leave this for the CE: it's really just all one sentence with some funky formatting.
75TYPO

It can be as simple as a shopping list —> add a : (colon) after list

2019-05-15
71TYPO

repeating the following steps. —> : (colon) instead of a period? since it’s introducing a bulleted list

2019-05-15
67TYPO

All of the following examples should be accepted. —> : (colon) instead of a period?

2019-05-15
66TYPO

the following input would draw a rectangle. —> : (colon) instead of a period?

2019-05-15
127TYPO

designing for a uncertain —> an uncertain

2019-05-15
127TYPO

Around the time of the first edition of The Pragmatic Programmer —> should “The Pragmatic Programmer” be in title font?

2019-05-15
128TYPO

2nd line : …heard of these technologiesas —> technologies as

2019-05-15
129OK

In Decoupling we’ll show how to —> show you how to

2019-05-15
131TYPO

the A is actually —> “then” A is actually…

2019-05-15
131TYPO

• “Simple” changes to one module that:
– propagate through unrelated modules in the system; or
– break stuff elsewhere in the system. unrelated modules in the system.
• Developers who are afraid to change code because they aren’t sure what
might be affected.

—> for consistent spacing, add a blank line before the last bullet point.

2019-05-15
132TYPO

that cannot change in future —> “the” future

2019-05-15
132TYPO

TDA would make us add an a applyDiscountToOrder(order_id) —> delete “a”

2019-05-15
136TYPO

And example of this —> “An” example of this…

2019-05-15
139TYPO

last line: the the contents of that cell are the new state. —> remove duplicate “the”

2019-05-15
140TYPO

The code that implements the transitions between states on line 10. —> not sure what this sentence is supposed to say.

2019-05-15
140TYPO

It’s only output is the final… —> “Its”

2019-05-15
142TYPO

…using it to drive a state machines —> “machine”

2019-05-15
145TYPO

a result in only generated when data —> a result is only…

2019-05-15
147TYPO

…better decoupled that its more linear counterpart. —> “than” its more…

2019-05-15
150TYPO

For example, you want want to create a web —> delete duplicate “want”

2019-05-15
151TYPO

2 places:

… function on its right, so —> add a : (colon) after “so”

..is the same as writing —> add a : (colon) after “writing”

2019-05-15c/e
152TYPO

2 places - for consistency:

…flatten the nested lists into a single level. —> change the period to a colon

…are all words with that length. —> change the period to a colon

2019-06-12
156TYPO

…thinking that we’ve moved the burden or error handling —> should “or” be “of” ?

2019-05-15
158TYPO

Exercise 20: The overall transformation is described by —> add a : (colon) after “by”

2019-06-12
161TYPO

Not only is the child class coupled to the parent, the parent’s parent, and so on; but the code that uses the child is also coupled to all the ancestors. —>

I think it should be punctuated as follows:

Not only is the child class coupled to the parent, the parent’s parent, and so on, but the code that uses the child is also coupled to all the ancestors:

(change the semi-colon to a comma and the period to a colon)

2019-05-15
163TYPO

…in an list of locatable items: —> “an” s/b “a”

2019-05-15
162TYPO

…every item has getLocation and locationIsValid. —> period s/b a colon

2019-06-12
165TYPO

And we’ll focus on just the functional that all —> “functionality” or “function” or “functional something” ?

2019-05-15
165TYPO

…we can add the mixin to them, too. —> change period to colon

2019-06-12
166TYPO

Can you achieves what you want with —> “achieve”

2019-05-15
168TYPO

In the Sidebar: some 40,000 configuration —> is 40,000 supposed to be in italics?

2019-05-15
173TYPO

about, that that potentially —> remove duplicate “that”

2019-05-15
173TYPO

We’d like to find out what can happen at the same time and what must happen in a strict order. —> “can” is italicized. Do you want “must” in italics as well?

2019-05-15
174TYPO

…still have time to server another customer —> “serve”

2019-05-15
178TYPO

last para: She also see —> “sees”

2019-05-15
179TYPO

There’s are some —> There are some…

2019-05-15
179TYPO

2 places:

…take a slice of pie in a single call. —> change the period to a colon

—-protect it with a semaphore. —> change the period to a colon

2019-06-12
181TYPO

if something fails. —> change the period to a colon

2019-06-12
182TYPO

…for each. instead, —> capitalize “Instead”

2019-05-15
184TYPO

…in the definition of actors. —> change the period to a colon (introducing a bulleted list)

2019-05-15
185TYPO

waiter apologizes to the customer. —> remove period for consistency in the bulleted list

2019-05-15
185TYPO

Nact library4. —> move footnote 4 notation to after the period

2019-05-15
185TYPO

This code extends into the right margin:

return dispatch(state.waiter, { type: “order”, customer: ctx.self, wants: ‘pie’ })

2019-05-15
186/7TYPO

5 lines of code extend into the right margin on these two pages

2019-05-15
187TYPO

The order you see may well be different. —> change period to a colon

2019-06-12
189TYPO

Do you currently have does that uses mutual exclusion to protect shared
data. —> I’m not sure what this sentence is supposed to say.

2019-05-15
191TYPO

… the following problems to contend with. —> change period to a colon (introducing a bulleted list)

2019-06-12
192TYPO

(A useful technique is to add a unique trace id when a particular
business function is initiated and then propagate it to all the actors involved.
You’ll then be able to reconstruct what happens from the log files.

There’s an opening paren, but no closing one.

2019-05-15
192OK

Finally, these kinds of system can —> “systems”

2019-05-15I _think_ this is OK
192TYPO

To some extend this —> “extent,”

2019-05-15
199TYPO

Do the following. —> change the period to a colon

2019-06-12
199TYPO

what you what to learn or do. —> what you “want” to learn or do.

2019-05-15
200TYPO

and look for patterns, If you can —> comma s/b a period, or lowercase “if”

2019-05-31
207TYPO

Your have written an app —> “You”

2019-05-15
207TYPO

But you’re getting complaints that the the —> remove duplicate “the”

2019-05-15
208TYPO

That’s when Big-O notation notation comes in useful. —> is “notation notation” correct?

2019-05-15
210TYPO

where mand n are —> “m and”

2019-05-15
210TYPO

it is likely to be logarithmic, O (lg(n)) A —> add a period before “A”

2019-05-15
217TYPO

Sidebar: propagating the required changes changes, —> remove duplicate “changes”

2019-05-15
219TYPO

…that performs the query. —> period s/b a colon

2019-06-12
219TYPO

…change it while testing. —> period s/b a colon

2019-06-12
219TYPO

potentially change it later. —> period s/b a colon

2019-06-12
221TYPO

4. Write the smallest amount of code needed to get the test to pass, and
verify that the tests now run cleanly —> sentence needs a period

2019-05-15
222TYPO

Sidebar: flesh out the code, Involve the customer at each step, and have them guide the process. —> lowercase “involve”

2019-05-15
227TYPO

sidebar: I believe the answer —> should “believe” be italicized?

2019-05-15
229TYPO

In instead we wrote: —> “If instead we wrote:”

2019-05-15
230TYPO

…so that —> “so that:”

2019-06-12
230TYPO

We wrote a basic unit test, which passes. —> period s/b a colon

2019-06-12
231TYPO

…quantity chosen from 1 to 4. —> period s/b a colon

2019-05-15
232TYPO

Our property testing found an faulty assumption —> “an” s/b “a”

2019-05-15
233TYPO

…you this about what must not change… —> you think about … ??

2019-05-15
234TYPO

Can you use a property-based testing framework to verify these automatically. —> period s/b a ?

2019-05-15
235TYPO

2 items:

But perhaps you protest, “Oh no one will… —-> ”Oh, no one will…

…its not important —-> it’s

2019-05-15
236TYPO

A nefarious user could do damage with like this: —> delete “with” ??

2019-05-15
240TYPO

Sidebar: …with some recommendations from the NIST. —> period s/b a colon

2019-05-15
242TYPO

name of each color as written.18 —> footnote 18 is blank

2019-05-15
243TYPO

4 items:

Let’s look at a couple of examples. —> period s/b a colon

First, deductPercent is what is does… —> “is” s/b “it”

We’ve also change the… —-> “changed”

…we never know it the value… —> “it” s/b “if”

2019-05-15
245TYPO

Another way is top have … —-> “to” have

2019-05-15
246TYPO

What other names to you habitually use… —> “to” s/b “do”

2019-05-15
252TYPO

January 1999 Wired magazine2, —> move footnote 2 notation after the comma

2019-06-12
254TYPO

3 items:

…asking them code the video game from —-> “to” code

…need to know what they’ll be doing during. —-> during “what”?

You’re enhancing the the feedback process —> delete duplicated “the”

2019-05-15
256TYPO

noncomputer solution. —> “non-computer” ?

2019-06-12
259TYPO

And we describe a great way to do that in is to keep an Engineering Daybook — > delete “in” ??

2019-05-15
18TYPO

The second paragraph from the bottom, second line:

read up on and it study it.

Should “it study it” read “study it”?

2019-05-14
270TYPO

All of these different role and activities..—> “roles”

2019-05-15
272TYPO

turned into six or eight-week —> “six-”

2019-05-15
273TYPO

Sidebar: their staff “We should… —-> their staff, ”We should…

2019-05-15
274TYPO

2 items:

You need the able to … —> You need “to be” able…

“do Lean,” or whatehaveyou. —> what have you

2019-05-15
275TYPO

…being able to delivery on —> “deliver”

2019-05-15
278TYPO

…are triggered via a commits —-> delete “a”

2019-05-15
23OK

After awl, their are spelling miss steaks that the chequer can knot ketch.

->

After all, they are spelling mistakes that the checker can not catch

(I’m not sure)

2019-05-14Intentional irony.
280TYPO

…number from 0 to 999. —> period s/b a colon

2019-05-15
284TYPO

…can deliver against them. —> period s/b a colon

2019-05-15
287TYPO

…curiosity to an modern… —> “a” modern…

2019-05-15
298TYPO

Answer 10: about 9, 000 seconds —> looks like there’s an extra space between the 9 and the comma

Answer 12: pre- and postconditions —> post-conditions

2019-06-20
300TYPO

Answer 19:

1. Shipping and sales tax are added to an order —> add a colon

2. …external file —> add a colon

3. … web application —> add a colon

Answer 20: could be broken down into —> add a colon

2019-05-15
21SUGGEST

“You’re communicating only if you’re conveying information.”

Perhaps a better way of expressing this is with one of the Neurolinguistic Programming presuppositions: “The meaning of your communication is the response you get”. Conveying information is one thing, but as your section heading implies you need to tailor it for your audience.

2019-05-14Indeed. I added a refererence
30SUGGEST

“…avoid the negatives and (as they say) accentuate the positives”?

If this is an allusion to the old Bing Crosby & Andrew Sisters song, it’s “eliminate the negative [and] accentuate the positive”. :-)

2019-05-14
25SUGGEST

In “Challenges” section, the second edition of “Peopleware” is referred, but the third edition should be.

2019-05-14
227SUGGEST

“Confession”: automated tests are also necessary to safely upgrade dependencies - which is a continuous process on its own.

2019-06-12
302TYPO

…may well be used it lots —> “it” s/b “in”

2019-05-15
305TYPO
  • is it’s part of the requirement —> “it’s” s/b “its”
2019-05-15
305TYPO

2. On it’s own, —> “it’s” s/b “its”

2019-05-15
297TYPO

These Exercise Answers are still needed:

#’s 5, 7, 8

2019-06-12
291TYPO

Bib entry: [Arm07] Joe Armstring. Programming Erlang: Software for a Concurrent World_. —>

s/b Joe Armstrong

and

“_” (underscore) is coming through after “World”

2019-05-15
288TYPO

There is an order of magnitude more computers in embedded devices than
there are in laptops, desktops, and data centers. —-> is there a word missing in this sentence?

2019-05-15
147TYPO

“code that’s crafted around events can be more responsive and better decoupled that its more linear counterpart.”
… than its more …

2019-05-15
161ERROR
  1. top-level code
    my_ride = Car.new
    my_car.move_at(30)

Should be my_ride.move… ? Or my_car = Car.new?

2019-05-15
173OK

There is no step 6, though step 6 is referred to in the text.

We’re told that the steps are:
1. Open blender 7. Close blender
2. Open piña colada mix 8. Liquefy for 1 minute
3. Put mix in blender 9. Open blender
4. Measure 1/2 cup white rum 10. Get glasses
5. Pour in rum 11. Get pink umbrellas

2019-05-15I see it (and step 12) in my copy...
292TYPO

Bibliography: [And10] Jackie Andrade. What does doodling do?. —> if possible, delete the period after the question mark

2019-06-20
292TYPO

Bibliography: [Bro95] Frederick P. Brooks Jr. —> Frederick P. Brooks, Jr.

2019-06-20
13OK

…overembellishment and overrefinement. —> over-embellishment and over-refinement

2019-05-14Apparently correct as is
88TYPO

nonproject —> non-project

2019-05-15Left for CE
174TYPO

…can get the glassses and —> glasses (delete extra “s”)

2019-05-15
175TYPO

…in which case it’s compilation —> “its”

2019-05-15
176TYPO

sidebar: …on muticore machines. —> “multicore”

2019-05-15
178TYPO

in footnote: Edsgar Dijkstra —> check spelling - Edsger?

2019-05-15
179TYPO

…stored in the variable case_semapohore. —> “semaphore” ?

2019-05-15
181TYPO

“apple pie à la mode” is it’s own resource —> “its”

2019-05-15
191TYPO

…was Gelertner’s Linda. —> Gelernter ?

2019-05-15
36OK

As well as the lost code formatting that someone else has reported, a minor inconsistency in the code sample: you’ve declared the commented-out setStart() method to be public, but not the other class methods setEnd(), getStart(), getEnd(), and getLength().

2019-05-15
192TYPO

“They look at their skills become dated and” should be “The look on as their skills go out of date”?

2019-05-15
204TYPO

The cat was playing with the red dot and I left it home. —> “at home”

2019-05-15
237OK

The broken windows theory is debatable, may not age well. Makes intuitive sense though.
Google wiki Broken_windows_theory #Criminology

2019-05-15There's been a lot of discussion on this, but the upshot seems to be that the psychological features of hopeless spreading in the same manner as a disease vector is pretty solid, and anecdotal evidence is strong that the broken windows dynamic is very powerful on development teams. Plus, we've used this metaphor for 20 years and it's become part of the programmer's vocabulary, so I hesitate to change it at this point.
2711OK

boiling frog story is not literally true, point out that it’s a metaphor.
People can get used to anything, even oppression.

2019-05-15I think "fabled" frog makes it clear the story is apocryphal in nature.
3014TYPO

you would every use, —> ever

2019-05-15
3115SUGGEST

oddly worded
The good news is that doing this investment is a skill just like any other—it
can be learned. The trick is to make yourself do it initially.

2019-05-15
3TYPO

Last line structure
They look at their skills become dated and …
Could be either
They look as their skills become dated and
or
They look at their skills becoming dated and

2019-05-15
3418TYPO

we encourage you to read up on and it study it . > delete “to read up on and it”

2019-05-15
3519OK

which is why “one size fits all”
solutions often don’t. ->work

2019-05-15The implication reads as "one size fits all" do not "fit all." \n
362oOK

A good idea is an orphan without effective communication.
Orphans without effective communication are a bad idea :-)

Without effective communication, your best ideas remain a well kept secret.
Writing is thinking. To write well is to think clearly. quote David McCullough
You get paid to think clearly.

2019-05-28
116ERROR

replace ch by ans
assert((ans 'Y') || (ans ‘N’)) # Very bad idea!

2019-05-31
227OK

If this guy is to be believed (www.leadingagile.com/2018/04/step-by-step-toward-property-based-testing/), you seem to have undersold the difficulty of doing Property-based testing well and perhaps choosing appropriate situations in which to apply it.

Feels like the advice should be more like “Understand property-based testing and know when it’s the economic approach”.

2019-06-12As with all our advice, it's contextual. It works for some, and not for others. But we feel everyone should at least try it and make up their own mind.
3450OK

resident know-all bounces this code, claiming it’s a —> know-it-all
DRY violation: both function bodies are the same.
They are wrong. —> The know-it-all doesn’t know at all. He/she is wrong.

2019-05-28
3450OK

Eat your vegetables. Get 8 hours sleep. Comment your functions.
And so we often see something like this:

Feels like a sentence is missing. “Time honoured advice…”?

2019-05-28
3753OK

Many data sources allow you to introspect on their data schema. —> to inspect their

2019-05-29
37ERROR

Footnote 3 the link for the OpenAPI is broken 404 error

2019-05-28
6OK

I think the content is good, but I recommend removing the references to the broken windows theory in the context of policing and law enforcement. It’s something that has been questioned and isn’t widely accepted. I do think that it’s true in the context of software.

I think the changes are mostly removals on Page 6 - remove the paragraph that starts “In inner cities…” and the footnote link associated with this paragraph. There may be some more clean up on page 7. Once you get to the content about psychologists and their studies, I think it’s good.

2019-06-12We have cut it down, but we still like the theory. Remember that "broken windows" is not the same as "zero tolerance"
213TYPO

broken link
5. pragprog.com/tpp20/code/algorithm_speed/sort/

2019-06-20
70ERROR

Tip 11 -> Know Your Audience-> You’re communicating only if you’re conveying when you mean to convey—just talking isn’t enough.

I think it should be “conveying what you mean to convey” rather than when.

2019-05-29Dupe of 85318.
32TYPO

Looks like in the code duplication example, in the original code, the else in the first if/else block should have account.fees as the argument. Otherwise the duplication is hard to see.

2019-05-29
36TYPO

In the code for class Line containing the method calculateLength, in the interest of uniformity, I think all the calculate_length (snake case) should be changed to calculateLength (camel case).

2019-05-28
5369SUGGEST

I like that you are reconsidering the tendency to express ideas in military terms.
Even the word target implies something that you are aiming at, something that you will shoot for.

Most people have experienced learning to ride a bicycle. To ride in a straight line you must take feedback from where you are and adjust to reach your destination.
But, tracer bullets do look cool.

2019-05-28
8165SUGGEST

parser generators such as bison or
ANTLR, and parsing frameworks such as the many PEG parsers out there.

First time mention of bison include link www.gnu.org/software/bison/
First time use acronym, expand on it and include link
ANother Tool for Language recognition (ANTLR) www.antlr.org/
Parsing Expression Grammar (PEG)

2019-05-29We're going to take a different approach to using actual links, as we've learned things go stale over 20 years or more.
8165ERROR

In general, use off-the-shelf external languages (such as YAML, JSON, or CSV)
I think of JSON and CSV (comma separated values) as data formats, not programming languages.

2019-06-12
8367SUGGEST

First use of the acronym BNF —> Backus normal form (BNF)

2019-06-12We kinda think that it's like SQL
60SUGGEST

Regarding, how not to use prototypes, I offer a story: back in the 80s I met a consultant called Steve Weiss, who in a previous career had been a dentist.

When Steve made dental crowns, he took great care in matching the colour of the temporary crown to the rest of the patients’ teeth so they would be happy with their appearance while they waited for the permanent crown to arrive.

To his dismay, many patients never came back for the permanent crown, because the temporary one was good enough. Eventually he started making the temps several shades lighter than the rest of the teeth, making them look dark, so the patient would be unhappy enough to come back for the permanent one. (Had he made the temp darker, he might be accused of producing bad work.) The patients came back for the permanent crowns much more often. The lesson is Don’t Let Your Prototype Get Mistaken for the Real Thing.

Another lesson on prototyping is that in an effort to please, we often make prototypes fancier than they need to be, which causes delays and often a needlessly more complex end product. I suggest that the GOTO Berlin 2015 conference presentation, “To the Moon” by Russ Olsen is worth a look (it’s on YouTube, but I’m not allowed to add a link). The lesson from the early days of the USA’s mission to land on the Moon is at each stage Do The Simplest Thing That Could Possibly Work. This of course ties into mechanism of Test Driven Development.

2019-05-29
10286TYPO

is the way then let you isolate ->they

2019-05-29
10892TYPO

interest_rate is 4.5 and should be 0.045. -> The 4.5 should be in the font of 0.045?
let’s see -> Let’s

2019-05-31
116100TYPO

You company has now standardized -> Your

2019-05-31
122107OK

This is a better approach than simply checking your inputs; in this case, you
simply can not call this function if your arguments are out of range. -> I’ve missed the point here. I think of the preconditions as checking the inputs in a language specified way. How is it better than an IF? Failing on the call makes it clear that the function is not wrong, the caller is?

2019-06-12It's better because it makes it clear that the caller is in error.
125110OK

For languages without built-in support, you
would need to bracket the called routine with a preamble and/or postamble that
checks these assertions.)—>
Without build-in support, I continue to miss the point regarding preconditions. I’d rather validate my parameters in one place, within the sqrt function, than duplicate checking for a negative number everywhere sqrt is called.

2019-06-12We bracket the called routine, not the caller.
128113SUGGEST

Maybe we’ve passed in a nil value, or an empty list. —> Same thing. nil is null with a LISP. ha ha

2019-05-31
138123SUGGEST

However, there is a catch. -> I laughed out loud (LOL) at that one.

2019-05-28
142127SUGGEST

Results in a REPL provide -> Read Evaluate Print Loop (REPL)

2019-06-12
235222TYPO

but how can they decide of the functionality of layers when they don’t know where they are heading?
Replace first of with on

2019-05-31
65OK

Top of page: “flexible in this regards”, I think should be “flexible in this regard”, i.e. singular (unless this is an American English usage with which I’m unfamiliar.)

2019-05-28
286274TYPO

whatehaveyou. -> what have you

2019-06-04
289278SUGGEST

Tip 89 Use Version Control to Drive Build, Test, and Releases ->
Use Version Control to Drive the Build, Test, and Release Process

2019-06-12
92OK

I’m not sure but “nuf said” under the Tip 32 should read “nuff said”.

2019-05-29
67SUGGEST

May I suggest another estimating tip?

“Never provide a single number” - it can give the illusion of certainty, even you provide less precise time units as suggested on page 68.

Where I work, we provide three numbers: Nano, Probable, and Catastrophic (or Ideal, Probably, Worst Case if you prefer). The low and high figure would roughly mark the 5% and 95% marks on the probability curve.

There’s still no guarantee that a manager won’t take your “two or three months”, convert it to “eight to twelve weeks”, and then reduce it to “ten weeks”. This happened to me many years ago; when I finished the job in nine weeks, the manager said “great, you’re a week early”, having never had any conversation with me about his time conversions.

But it also offers some protection again the manager starting the “are we there yet?” routine at the nine weeks plus one day mark. :-)

2019-06-13
84SUGGEST

In the callout box, “Shared Directories Are Not Version Control”, the last two paragraphs are a bit confusing.

Does “repository […] on a network or cloud drive” refer to an actual VCS repo, or a just shared directory that people are accessing as if it were a VCS repo? If the latter, then I agree with you, but the second last paragraph says that some people are using version control. Sharing a (say) Git repo is of course the normal way of using Git.

Of course, if some people are accessing the repo via a VCS, and some are using the files directly through the file system, that’s clearly insane. :-)

(Side note: in macOS Preview, highlighting the last paragraph in the callout across the page break is broken. When you go to the next page it highlights the entire page text instead of the continued callout text. Works fine when viewing in Chrome though, so not sure if this is a coding issue in the PDF or a Preview bug.)

2019-05-29
106SUGGEST

some stylistic suggestions regarding the accept_deposit function:
1a. Change the name to “accept-deposit”. In my experience, hyphens are preferred to underscores in names (they are also used consistently in all the other names in the example).
1b. The name suggests that the code will have side effects. In clojure, functions that have side effects tend to end in “!” (i wasn’t able to provide a link here, search for bbatsov’s clojure community style guide for more details) - However, this may be confusing to the unfamiliar reader.
2. change “is-open-account” to “account-open?” - like ruby, clojure allows the question mark in names, imho it improves code readability to use it. (“contains?” in the line below illustrates this nicely)
3. Formatting of keywords. Clojure syntax highlighting tends to highlight keywords (:pre, :post, :deposit etc) in some way. This improves readability (see eg github formatting of clojure code)

2019-05-31
28TYPO

Very bottom of the page, sentence containing “helping you chose”: I think you meant “helping you choose” (present tense verb rather than past tense).

2019-05-28
163TYPO

tail –5 will write the last 5 lines to stdout

2019-05-31
94OK

“Logging and/or Tracing” seems to cover some of the ground already dealt with by “Trace Bullets” on p51.

That notwithstanding, it might be worth mentioning that some IDEs offer conditional breakpoints, that can display and/or log messages when a breakpoint has been hit. This save making possibly invasive (or forgotten) code changes that can alter the behaviour of the code.

Example: back in the mid-80s, I found a bug in Microsoft’s MASM that appeared only when the code ended exactly at a 1K byte boundary. Adding any code to determine what was happening - even a NOP - would make the problem disappear.

2019-06-12Not sure I see the relationship between logging and the iterative development style of tracer bullets? \n
95SUGGEST

Regarding “pot plant”. In the Queen’s English, “pot plant” has the same meaning as “potted plant”. I would have thought that in modern 4/20 America such usage would also be acceptable. Especially when using a “high” level language. :-)

2019-05-29
107TYPO

Second bullet point in the “DBC and Test-Driven Development” box: “where as” should be “whereas”.

2019-05-31
301289SUGGEST

“If you enable a scumbag, you are a scumbag”
doesn’t quite fit with the message of “Imagine the future you want” .
Also, something about the scumbag reasoning seems illogical, but I like the direction.
“if you enable an acoloholic, you are an acoloholic?”

2019-06-12No: the difference is that an alcoholic does it to themselves. If you enable a murderer, you're an accessory.
316TYPO

“you this about what must not change, and what must be true.”

This should be think

2019-05-31
86TYPO

Second line of first paragraph:
“the way then let you”

“then” should be “they”

2019-05-29
92SUGGEST

Fourth paragraph under “Bad Results”, there are two values cited, 4.5 and 0.045. The two numbers appear to be shown in different fonts. I assume you intended them to be using the same font as the name of the variable cited in that sentence.

2019-05-29
94TYPO

There is an errant equal sign in the last sentence of the page.

2019-05-29
186TYPO

the error is in this sentence: Concurrency is when the execution of two or more pieces of code act as if they
run at the same time time.

time twice

2019-05-31
5034SUGGEST

“Eat your vegetables. Get 8 hours sleep. Comment your functions.” —>
Unfortunately, people read and remember what you lead with; I’ve seen this first-hand. They will come back and say “Andy Hunt said to make sure I comment all my functions.”

2019-06-12
4630SUGGEST

DRY: I think it’s worth expounding just a bit on why duplication is evil—something as wrong as “evil” warrants it, and I wasn’t really sold quickly on why it mattered. Duplicate code:

  • represents increased effort to find and change, as you mention in the book. This also includes increased effort to test.
  • increases risk: If you must change 50 places, and find only 49, you have now likely shipped a defect
  • if you find 49 places, and they are all the same, great; what if that 50th place is slightly different? Is the variant purposeful or accidental? Now you’re either wasting time figuring that out, or potentially shipping a defect (if the 50th place is purposeful).
  • increases the time to read the code
2019-06-12We think this is covered
00DEFER

I’m not sure if it’s in here, but “reading the API code” is a very useful skill in 2019—particularly since many environments (Java, Javascript, Clojure, …) allow you to get at the underlying source. In addition to teaching me interesting things about how to code (sometimes good things), step-debugging the library code helps me at times figure out why things aren’t working in my code.

2019-10-27
3721TYPO

in the first sentence of the “Know Your Audience” section, I
think you meant to say “what” instead of “when” after the word “conveying”. It sounds better
to me if you say, “You’re communicating only if you’re conveying what you mean to convey …”.

2019-05-29
168153TYPO

in the first sentence of “Putting It All Together”, the word
“We’re” should be “We’ve”. It should say, “We’ve written each of the individual transformations.”.

2019-05-31
189175ERROR

in the UML activity diagram, it appears that the line from
box 6 to the syncronization bar below it is missing.

2019-05-31
199185TYPO

On PDF page 199, paper page 185, in the three bullet points describing the messages that the
customer can receive, for the first and third bullet points, “send” should be “sent”. The
list should be:

* you’re hungry (sent by the external context)
* there’s pie on the table (sent by the pie case)
* sorry, there’s no pie (sent by the waiter)

2019-05-31
204190TYPO

in the paragraph after the bullet points, second sentence, the
word “progresses” should be “processes”. It should say, “The detectives are independent
processes, agents, actors, and so on.”.

2019-05-31
276263TYPO

the first paragraph of the section “And This Drives Design”, near
the end of the only sentence, the word “that” should be “than”. It should say, “… a good design
produces something that’s easier to change than a bad design.”

2019-05-31
0OK

A chapter or even section about personal wellbeing (mental and physical) would be a good addition.

2019-06-12We actually have a full book in this :)
134TYPO

In the first sentence under “The Law of Demeter” there is a lone closing parenthesis.

2019-06-12
61TYPO

Let’s look a a few examples where folks have done just that.

To

Let’s look at a….

2019-06-12
143TYPO

“[…]pattern had been used for decades[…]”

I think “has” is more grammatically correct here than “had”.

2019-06-12
150SUGGEST

While “lin” might be a word in whatever version of the macOS dictionary you have, I couldn’t find it on Mojave, at least in any of the Oxford dictionary offerings. Just sayin’ :-)

2019-06-12~~~ \n$ egrep '^lin$' /usr/share/dict/words \nlin \n~~~
23SUGGEST

Section: Be A Listener.

In the section be a listener the authors suggest that the reader “Encourage people to talk by asking questions, or have them summarize what you tell them.” in order to help establish a dialog in a conversation. I understand what the authors are attempting to communicate, and in personal experience have found summary a helpful way to convey understanding. My question to the authors is:

Could you provide some examples of ways to ask for summary in a conversation or meeting that do not come off as condescending? When I imagine scenarios with a coworker or superior, the question “Could you summarize that back to me?” seems very condescending. While you certainly wouldn’t pose the question in this way, are there any examples of ways to lead others to summarize in respectful ways?

2019-06-12
212199TYPO

Page 212 in the PDF (page 199 printed on that page), I think “Andy and Dave have both spent hours looking an empty editor buffers” should be changed to “Andy and Dave have both spent hours looking AT empty editor buffers”.

2019-06-12
165SUGGEST

Bullet point at the bottom of the page: “validating a hashed password matches…”. I had to read this a few times to understand it.

I think that “Verifying that a hashed password matches…” would be a bit clearer. Or at least including the word “that” in the original sentence. (May be an American- vs Queen’s- English thing)

2019-06-13
275263TYPO

in teams where no one talks to each OTHER at all,
resulting in siloed, “stove-pipe” systems. Or teams that were split into two, resulting
in a client/server or frontend/backend division.

2019-06-20
11SUGGEST

In the preface it is mentioned that a seperate document of the tips exist / should exist. can we please have that together with the PDF document etc. as well?

2019-06-13Yes, but it will have to wait until the book goes into production.
263TYPO

the the

Pair programming is one the the practices of eXtreme Programming

2019-06-20
268256TYPO

In the PDF, on page # 268 (says page # 256 at the top ) - under “Requirement Documents are for Planning”, in the second paragraph, “when” should be replaced with “what”, i.e. “They describe when a small portion of the application should do from the perspective of” -> “They describe WHAT a small portion of the application should do from the perspective of”

2019-06-20
107ERROR

The ordering of the “accept_deposit” function definitions within the Deposit module should be reversed: as it is now, the second and third function clauses can never be called.

2019-06-20
293ERROR

Page doesn’t break on EPub and Mobi versions between footnotes for Chapter 9 and the quote and title for Chapter 10

2019-07-10
8OK

Hi, I’m actually reading throught the free sample chapters of this book. I found a technical error on the 8-9 page of chapter the evils of duplication. Here the code is not properly highlighted. This is last code example of page 8.

2019-07-10
228SUGGEST

Last paragraph: “One way around this is to have different people write tests and the code under test, but we don’t like this[…]”

Suggestion: it might be a good time to suggest that pair programming can be useful, with one person creating tests (in consultation with the other, as they tease out the requirements for the code to be written), and the other making the test pass.

This can be especially useful when one of the parties does not yet understand the benefits of TDD, or is otherwise in a bit of a rush to implement.

The parties can also switch roles during this process.

2019-07-10
231SUGGEST

proptest/stock.py, take_from_stock method:

Maybe you just omitted it to keep the code simple, but there is no guard clause to catch quantity < 0, which could play havoc with your stock levels. :-)

2019-07-10
240SUGGEST

I know you already included one XKCD reference in this chapter, but I think your Password Antipatterns list entry on composition rules warrants a reference to the XKCD comic on password strength (xkcd.com/936/).

2019-07-10
260OK

I’m all for thinking outside the box, so the phrasing of Tip 81 disappoints me. But your point about knowing your constraints and assumptions is a good one.

May I suggest, “Tip 81: Find the box before you think outside it.”

2019-07-10
263SUGGEST

A facsimile of Mel Conway’s article, “How do Committees Invent?” [Con68] is also available on Conway’s website, at www.melconway.com/Home/pdf/committees.pdf, so perhaps it would be worth including the link as well as the bibliography entry.

2019-07-10
302TYPO

In the following sentence, I believe “event” is supposed to be “even”.
“We could event swap the order of remove_comments and find_matching_lines and it would still work.”

2019-10-27
170TYPO

I believe “feed” should be “feel”.
“If that makes you feed sad, nil desperandum!”

2019-10-27
298TYPO

Answer 10: 1TGB should be 1TB

2019-10-27
151SUGGEST

“…Many languages have something similar: Elm, F#, and Swift have |>.”
It’s possible to define pipeline operator in Swift, but it isn’t predefined like in other mentioned languages, so I think it’s good to either exclude Swift from this list, or add a footnote about the ability to define such operator in Swift.

2019-10-27
127TYPO

throw out your code and replace it with something better suited. Making code replaceable will also help with cohesion, “coupling”, and DRY, leading to a better design overall.

->“decoupling”

2019-10-27
149SUGGEST

in the Note 7

Motif and OpenLook were GUI standards for “X-Windows” based Unix workstations.

X-Windows->X-Window without s

2019-10-27
140ERROR

in the 3nd paragraph, talking about a table of FSM
but under the paragraph, is not a table, is the content of event/strings_fsm.rb

Is it a table generating error?? or this is by design?

2019-10-28I don't see that. I see \n \n> The neat thing about FSMs is that we can express them purely as data. Here’s a table representing our message parser: \n \nfollowed by a blue/cya table.
163TYPO

a Typo??
in the 3rd paragraph

We now expose none of the framework API to the clients of our Account class: that “decoupling” is now broken.

“coupling”??

2019-10-27
238SUGGEST

in Note 18
“If you’re seeing this in black and white and want the color version, or if you’re having trouble distinguishing colors and want to try the grayscale version, pop over to ….”

and i think the version in the book is grayscale version??? is it?

2020-01-17Effectively, the book version is grayscale (although technically it is dither black and white).
315TYPO

2 typo i think:

in page 315
1 ovicide, 187
there is no “ovicide” in page 187

No, but the index is of concepts, not words…..

in page 316
Program Evaluation Review
Technique, see PERT“The ii tag should not be here.”

in the index, there is one for “Program Evaluation Review
Technique, see PERT” which followed by a sentence “The ii tag should not be here.”

i think the second line is a mistake.

2020-01-22Ovicide: but the index is of concepts, not words..... \n \nPert: indeed it is. fixed in next printing
134SUGGEST

“Don’t chain method calls” tip should really be expanded out more or be removed. With the revitalization of functional programming, chaining becomes common practice. I assumed the issue before would have been over null pointers, but nulls are blasphemous in FP style coding. Focusing the topic on applications volatility is a red herring for a reason not to chain. Type-safe languages will easily pick up issues at compile time.

2020-01-17The discussion in the book is in the context of OO languages, where chaining means objects are passed around. \n \nIn functional languages, pipelines pass values, divorced from the functions themselves, so the issue is different (although still there).
151TYPO

PG 151, Footnote 5, typo in name of the language

… Isobelle/ML … ->
… Isabelle/ML …

2020-01-22
79ERROR

In the `packages.sh` example script:

The regex used to find import statements is ` ‘^import ’, which will match lines that begin with `import`. But the sed command will match on `’.import …’. The ’.’ will probably never match and can be omitted.

2020-01-22Good catch
8ERROR

In the topic “DRY - The Evils of Duplication”, in the subtopic “DRY Violations in Data”, there is a non formatted code. I am not sure whether it was the intention or not.

2020-01-22I don't see this in my copy. Is your's up to date?
120OK

In update_customer() function, you forgot to add write_customer() function after changing the balance.
i.imgur.com/JzLSfaw.png

2020-01-22Good catch
233TYPO

It looks like something when wrong when formatting a code block, on page 233 about Ruby

The code:
$SAFE = 1

puts “Enter a file name to count: ”
name = gets
system(“wc -c #{name}”)

appears as a formatted code block, however right below it, I see the following text:
~ session $ ruby taint.rb Enter a file name to count: test.dat: rm -rf /
code/safety/taint.rb:5:in system’: Insecure operation - system (SecurityError) from code/safe-
ty/taint.rb:5:in main’ ~

That section looks like it should have been formatted in some way (Also given away by the triple tilde before and after the section), but was not.

2020-01-22
290TYPO

In citation [WH82], the last name of author George L. Kelling is misspelled as “Helling”

29SUGGEST

Add “Topic 22, Engineering Daybook, on page 100”, to the “Related Sections Include” section, because p.29, paragraph 5 mentions an engineering daybook.

8ERROR

Page 8 of the sample for DRY at media.pragprog.com/titles/tpp20/dry.pdf

Source code is not formatted under DRY Violations in Data

305289TYPO

Tom DeMacro -> Tom DeMarco

299SUGGEST

This might be nitpicking, but the introduction of the Gregorian calendar has nothing to do with the Gregorian Reform(ation). Also, the September 1752 issue only applies to Britain and the colonies.

Categories: