Preface.
[1] If, over the years, every component of a ship is replaced as it fails, is the resulting vessel the same ship?
[2]
https://pragprog.com/titles/tpp20Chapter 1.
[3]
http://wiki.c2.com/?ChangeYourOrganization[4] See, for example, a good meta-analysis at Trust and team performance: A meta-analysis of main effects, moderators, and covariates,
http://dx.doi.org/10.1037/apl0000110[5] See The police and neighborhood safety [WH82]
[6] See Contagious depression: Existence, specificity to depressed symptoms, and the role of reassurance seeking [Joi94]
[7] While doing this, you may be comforted by the line attributed to Rear Admiral Dr. Grace Hopper: "It's easier to ask forgiveness than it is to get permission."
[8] That was supposed to be a joke!
[9] An expiring asset is something whose value diminishes over time. Examples include a warehouse full of bananas and a ticket to a ball game.
[10] We may be biased, but there's a fine selection available at
https://pragprog.com.
[11] Never heard of any of these languages? Remember, knowledge is an expiring asset, and so is popular technology. The list of hot new and experimental languages was very different for the first edition, and is probably different again by the time you read this. All the more reason to keep learning.
[12] The word annoy comes from the Old French enui, which also means "to bore."
Chapter 2.
[13] To paraphrase the old Arlen/Mercer song...
[14] Or, perhaps, to keep your sanity, every 10th time...
[15]
https://github.com/OAI/OpenAPI-Specification[16] In reality, this is naive. Unless you are remarkably lucky, most real-world requirements changes will affect multiple functions in the system. However, if you analyze the change in terms of functions, each functional change should still ideally affect just one module.
[17] In fact, this book is written in Markdown, and typeset directly from the Markdown source.
[18] Take a nonlinear, or chaotic, system and apply a small change to one of its inputs. You may get a large and often unpredictable result. The cliched butterfly flapping its wings in Tokyo could be the start of a chain of events that ends up generating a tornado in Texas. Does this sound like any projects you know?
[19]
https://rspec.info[20]
https://cucumber.io/[21]
https://phoenixframework.org/[22]
https://www.ansible.com/[23]
https://yaml.org/Chapter 3.
[24] All software becomes legacy software as soon as it's written.
[25] Although the Elm language does have a time-traveling debugger.
[26] Why "rubber ducking"? While an undergraduate at Imperial College in London, Dave did a lot of work with a research assistant named Greg Pugh, one of the best developers Dave has known. For several months Greg carried around a small yellow rubber duck, which he'd place on his terminal while coding. It was a while before Dave had the courage to ask....
[27] Earlier versions of the book talked about talking to your pot plant. It was a typo. Honest.
[28] Here router means the tool that spins cutting blades very, very fast, not a device for interconnecting networks.
[29] There is some evidence that doodling helps focus and improves cognitive skills, for example, see What does doodling do? [And10].
Chapter 4.
[30] Based in part on earlier work by Dijkstra, Floyd, Hoare, Wirth, and others.
[31] In C and C++ these are usually implemented as macros. In Java, assertions are disabled by default. Invoke the Java VM with the -enableassertions flag to enable them, and leave them enabled.
[32]
http://www.eps.mcgill.ca/jargon/jargon.html#heisenbug[33] For a discussion of the dangers of coupled code, see Topic 28, "Decoupling".
[34] See the tip here.
[35] Per the NHTSA, Stopping Distance = Reaction Distance + Braking Distance, assuming an average reaction time of 1.5s and deceleration of 17.02ft/s^2.
[36] Motif and OpenLook were GUI standards for X-Window based Unix workstations.
Chapter 5.
[37] So it's not really a law. It's more like The Jolly Good Idea of Demeter.
[38]
https://media.pragprog.com/articles/jan_03_enbug.pdf[39] Yes, we know that Ruby already has this capability with its at_exit function.
[40]
https://media.pragprog.com/titles/tpp20/cod...ommon/logger.js[41] It seems that the first use of the characters |> as a pipe dates to 1994, in a discussion about the language Isobelle/ML, archived at
https://blogs.msdn.microsoft.com/dsyme/2011...ne-symbol-1994/[42] We've taken a liberty here. Technically we do execute the following functions. We just don't execute the code in them.
[43] In fact you could add such an operator to Elixir using its macro facility; an example of this is the Monad library in hex. You could also use Elixir's with construct, but then you lose much of the sense of writing transformations that you get with pipelines.
[44]
https://www.quora.com/What-does-Alan-Kay-th...ted-programming[45] It didn't help that the settlers beat the placid (read: stupid) birds to death with clubs for sport.
Chapter 6.
[46] Although UML has gradually faded, many of its individual diagrams still exist in one form or another, including the very useful activity diagram. For more information on all of the UML diagram types, see UML Distilled: A Brief Guide to the Standard Object Modeling Language [Fow04].
[47] The names P and V come from the initial letters of Dutch words. However there is some discussion about exactly which words. The inventor of the technique, Edsger Dijkstra, has suggested both passering and prolaag for P, and vrijgave and possibly verhogen for V.
[48]
https://github.com/ncthbrt/nact[49] In order to run this code you'll also need our wrapper functions, which are not shown here. You can download them from
https://media.pragprog.com/titles/tpp20/cod...actors/index.jsChapter 7.
[50] Note from the battle-scarred: UTC is there for a reason. Use it.
[51]
https://en.wikipedia.org/wiki/Correlation_d...imply_causation[52] See Topic 50, "Coconuts Don't Cut It".
[53] You can also go too far here. We once knew a developer who rewrote all source he was given because he had his own naming conventions.
[54]
https://media-origin.pragprog.com/titles/tp...ort/src/main.rs[55] And yes, we did voice our concerns over the title.
[56] Originally spotted in UML Distilled: A Brief Guide to the Standard Object Modeling Language [Fow00].
[57] This is excellent advice in general (see Topic 27, "Don't Outrun Your Headlights").
[58] Some folks argue that test-first and test-driven development are two different things, saying that the intents of the two are different. However, historically, test-first (which comes from eXtreme Programming) was identical to what people now call TDD.
[59]
https://ronjeffries.com/categories/sudoku. A big "thank you" to Ron for letting us use this story.
[60]
http://norvig.com/sudoku.html[61] We've been trying since at least 1986, when Cox and Novobilski coined the term "software IC" in their Objective-C book Object-Oriented Programming Object-Oriented Programming: An Evolutionary Approach [CN91].
[62] See Topic 20, "Debugging".
[63] Remember our good friend, little Bobby Tables (https://xkcd.com/327)? While you're reminiscing have a look at
https://bobby-tables.com, which lists ways of sanitizing data passed to database queries.
[64] This technique has proven to be successful at the CPU chip level, where well-known exploits target debugging and administrative facilities. Once cracked, the entire machine is left exposed.
[65] NIST Special Publication 800-63B: Digital Identity Guidelines: Authentication and Lifecycle Management, available free online at
https://doi.org/10.6028/NIST.SP.800-63b[66] Unless you have a PhD in cryptography, and even then only with major peer review, extensive field trials with a bug bounty, and budget for long-term maintenance.
[67] Studies of Interference in Serial Verbal Reactions [Str35]
[68] We have two versions of this panel. One uses different colors, and the other uses shades of gray. 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
https://pragprog.com/the-pragmatic-programmer/stroop-effect.
[69] Do you know why i is commonly used as a loop variable? The answer comes from over 60 years ago, when variables starting with I through N were integers in the original FORTRAN. And FORTRAN was in turn influenced by algebra.
Chapter 8.
[70] Does a week sound like a long time? It really isn't, particularly when you're looking at processes in which management and workers occupy different worlds. Management will give you one view of how things operate, but when you get down on the floor, you'll find a very different reality-one that will take time to assimilate.
[71]
https://www.wired.com/1999/01/eno/[72]
https://www.psychologytoday.com/us/blog/you...-solve-problems[73]
https://agilemanifesto.org[74] For more on just how bad that approach can be, see The Tyranny of Metrics [Mul18].
Chapter 9.
[75] As team size grows, communication paths grow at the rate of , where is the number of team members. On larger teams, communication begins to break down and becomes ineffective.
[76] A burnup chart is better for this than the more usual burndown chart. With a burnup chart, you can clearly see how the additional features move the goalposts.
[77] The team speaks with one voice-externally. Internally, we strongly encourage lively, robust debate. Good developers tend to be passionate about their work.
[78] Andy has met teams who conduct their daily Scrum standups on Fridays.
[79] See
https://en.wikipedia.org/wiki/Cargo_cult.
[80] We've seen this first-hand more times than you'd think.
[81]
https://netflix.github.io/chaosmonkey[82] For an interesting study of the correlation between test coverage and defects, see Mythical Unit Test Coverage [ADSS18].
[83] Always remember Topic 3, "Software Entropy". Always.
[84]
http://www.extremeprogramming.orgAppendix 2.
Footnotes
[85] Thanks for this bit of trivia goes to Avi Bryant (@avibryant)
Комментарии
Код при печати весь смешается в кучу. Здесь вряд ли что-то можно сделать без доработок на сайте. В случае python-кода надо чтобы текст отображался с переносами строк и табами. Могу посоветовать следить за кодом в книге на отдельной вкладке браузера.