The Pragmatic Programmer: From Journeyman to Master
Rate it:
4%
Flag icon
We who cut mere stones must always be envisioning cathedrals. —Quarry worker's creed
4%
Flag icon
Great lawns need small amounts of daily care, and so do great programmers. Management consultants like to drop the word kaizen in conversations. "Kaizen" is a Japanese term that captures the concept of continuously making many small improvements.
5%
Flag icon
If the disk crashes—taking all of your source code with it—and you don't have a backup, it's your fault. Telling your boss "the cat ate my source code" just won't cut it.
17%
Flag icon
If the tracers are hitting the target, then so are the regular bullets.
17%
Flag icon
Like the gunners, you're trying to hit a target in the dark. Because your users have never seen a system like this before, their requirements may be vague.
17%
Flag icon
Tracer code is not disposable: you write it for keeps. It contains all the error checking, structuring, documentation, and self-checking that any piece of production code has. It simply is not fully functional. However, once you have achieved an end-to-end connection among the components of your system, you can check how close to the target you are, adjusting if necessary. Once you're on target, adding functionality is easy.
18%
Flag icon
With a prototype, you're aiming to explore specific aspects of the final system. With a true prototype, you will throw away whatever you lashed together when trying out the concept, and recode it properly using the lessons you've learned.
18%
Flag icon
The tracer code approach addresses a different problem. You need to know how the application as a whole hangs together. You want to show your users how the interactions will work in practice, and you want to give your developers an architectural skeleton on which to hang code.
18%
Flag icon
Prototyping generates disposable code. Tracer code is lean but complete, and forms part of the skeleton of the final system. Think of prototyping as the reconnaissance and intelligence gathering that takes place before a single tracer bullet is fired.
18%
Flag icon
prototyping is much cheaper than full-scale production.
18%
Flag icon
We tend to think of prototypes as code-based, but they don't always have to be. Like the car makers, we can build prototypes out of different materials. Post-it notes are great for prototyping dynamic things such as workflow and application logic. A user interface can be prototyped as a drawing on a whiteboard, as a nonfunctional mock-up drawn with a paint program, or with an interface builder.
18%
Flag icon
Prototyping is a learning experience. Its value lies not in the code produced, but in the lessons learned. That's really the point of prototyping.
18%
Flag icon
When building a prototype, what details can you ignore? Correctness. You may be able to use dummy data where appropriate. Completeness. The prototype may function only in a very limited sense, perhaps with only one preselected piece of input data and one menu item. Robustness. Error checking is likely to be incomplete or missing entirely. If you stray from the predefined path, the prototype may crash and burn in a glorious display of pyrotechnics. That's okay. Style. It is painful to admit this in print, but prototype code probably doesn't have much in the way of comments or documentation. You ...more
19%
Flag icon
Since a prototype should gloss over details, and focus in on specific aspects of the system being considered, you may want to implement prototypes using a very high-level language—higher than the rest of the project (maybe a language such as Perl, Python, or Tcl). A high-level scripting language lets you defer many details (including specifying data types) and still produce a functional (albeit incomplete or slow) piece of code.
19%
Flag icon
Scripting languages work well as the "glue" to combine low-level pieces into new combinations.
19%
Flag icon
When used properly, a prototype can save you huge amounts of time, money, pain, and suffering by identifying and correcting potential problem spots early in the development cycle—the time when fixing mistakes is both cheap and easy.
19%
Flag icon
The limits of language are the limits of one's world. • Ludwig Wittgenstein
19%
Flag icon
Computer languages influence how you think about a problem, and how you think about communicating.
19%
Flag icon
Designing a solution with Lisp in mind will produce different results than a solution based on C-style thinking, and vice versa.
19%
Flag icon
We always try to write code using the vocabulary of the application domain (see The Requirements Pit, page 210, where we suggest using a project glossary). In some cases, we can go to the next level and actually program using the vocabulary, syntax, and semantics—the language—of the domain.
21%
Flag icon
What's the value of π? If you're wondering how much edging to buy to put around a circular flower bed, then "3" is probably good enough.[10] If you're in school, then maybe "22/7" is a good approximation. If you're in NASA, then maybe 12 decimal places will do.
22%
Flag icon
a basic estimating trick that always gives good answers: ask someone who's already done it. Before you get too committed to model building, cast around for someone who's been in a similar situation in the past.
22%
Flag icon
You are trading off model simplicity for accuracy. Doubling the effort on the model may give you only a slight increase in accuracy. Your experience will tell you when to stop refining.
22%
Flag icon
Once you have a model, you can decompose it into components.
22%
Flag icon
In fact, you'll often find yourself basing an estimate on other subestimates. This is where your largest errors will creep in.