Preface
Acknowledgments
ListofChecklists
ListofTables
ListofFigures
PartI LayingtheFoundation
1 WelcometoSoftwareConstruction
1.1 WhatIsSoftwareConstruction?
1.2 WhyIsSoftwareConstructionImportant?
1.3 HowtoReadThisBook
2 MetaphorsforaRicherUnderstandingofSoftwareDevelopment
2.1 TheImportanceofMetaphors
2.2 HowtoUseSoftwareMetaphors
2.3 CommonSoftwareMetaphors
3 MeasureTwice,CutOnce:UpstreamPrerequisites
3.1 ImportanceofPrerequisites
3.2 DeterminetheKindofSoftwareYou'reWorkingOn
3.3 Problem-DefinitionPrerequisite
3.4 RequirementsPrerequisite
3.5 ArchitecturePrerequisite
3.6 AmountofTimetoSpendonUpstreamPrerequisites
4 KeyConstructionDecisions
4.1 ChoiceofProgrammingLanguage
4.2 ProgrammingConventions
4.3 YourLocationontheTechnologyWave
4.4 SelectionofMajorConstructionPractices
PartII CreatingHigh-QualityCode
5 DesigninConstruction
5.1 DesignChallenges
5.2 KeyDesignConcepts
5.3 DesignBuildingBlocks:Heuristics
5.4 DesignPractices
5.5 CommentsonPopularMethodologies
6 WorkingClasses
6.1 ClassFoundations:AbstractDataTypes(ADTs)
6.2 GoodClassInterfaces
6.3 DesignandImplementationIssues
6.4 ReasonstoCreateaClass
6.5 Language-SpecificIssues
6.6 BeyondClasses:Packages
7 High-QualityRoutines
7.1 ValidReasonstoCreateaRoutine
7.2 DesignattheRoutineLevel
7.3 GoodRoutineNames
7.4 HowLongCanaRoutineBe?
7.5 HowtoUseRoutineParameters
7.6 SpecialConsiderationsintheUseofFunctions
7.7 MacroRoutinesandInlineRoutines
8 DefensiveProgramming
8.1 ProtectingYourProgramfromInvalidInputs
8.2 Assertions
8.3 Error-HandlingTechniques
8.4 Exceptions
8.5 BarricadeYourProgramtoContaintheDamageCausedbyErrors
8.6 DebuggingAids
8.7 DeterminingHowMuchDefensiveProgrammingtoLeaveinProductionCode
8.8 BeingDefensiveAboutDefensiveProgramming
9 ThePseudocodeProgrammingProcess
9.1 SummaryofStepsinBuildingClassesandRoutines
9.2 PseudocodeforPros
9.3 ConstructingRoutinesbyUsingthePPP
9.4 AlternativestothePPP
PartIII Variables
10 GeneralIssuesinUsingVariables
10.1 DataLiteracy
10.2 MakingVariableDeclarationsEasy
10.3 GuidelinesforInitializingVariables
10.4 Scope
10.5 Persistence
10.6 BindingTime
10.7 RelationshipBetweenDataTypesandControlStructures
10.8 UsingEachVariableforExactlyOnePurpose
11 ThePowerofVariableNames
11.1 ConsiderationsinChoosingGoodNames
11.2 NamingSpecificTypesofData
11.3 ThePowerofNamingConventions
11.4 informalNamingConventions
11.5 StandardizedPrefixes
11.6 CreatingShortNamesThatAreReadable
11.7 KindsofNamestoAvoid
12 FundamentalDataTypes
12.1 NumbersinGeneral
12.2 integers
12.3 Floating-PointNumbers
12.4 CharactersandStrings
12.5 BooleanVariables
12.6 EnumeratedTypes
12.7 NamedConstants
12.8 Arrays
12.9 CreatingYourOwnTypes(TypeAliasing)
13 UnusualDataTypes
13.1 Structures
13.2 Pointers
13.3 GlobalData
PartIV Statements
14 OrganizingStraight-LineCode
14.1 StatementsThatMustBeinaSpecificOrder
14.2 StatementsWhoseOrderDoesn'tMatter
15 UsingConditionals
15.1 ifStatements
15.2 caseStatements
16 ControllingLoops
16.1 SelectingtheKindofLoop
16.2 ControllingtheLoop
16.3 CreatingLoopsEasily--FromtheInsideOut
16.4 CorrespondenceBetweenLoopsandArrays
17 UnusualControlStructures
17.1 MultipleReturnsfromaRoutine
17.2 Recursion
17.3 goto
17.4 PerspectiveonUnusualControlStructures
18 Table-DrivenMethods
18.1 GeneralConsiderationsinUsingTable-DrivenMethods
18.2 DirectAccessTables
18.3 IndexedAccessTables
18.4 Stair-StepAccessTables
18.5 OtherExamplesofTableLookups
19 GeneralControlIssues
19.1 BooleanExpressions
19.2 CompoundStatements(Blocks)
19.3 NullStatements.
19.4 TamingDangerouslyDeepNesting
19.5 AProgrammingFoundation:StructuredProgramming
19.6 ControlStructuresandComplexity
PartV CodeImprovements
20 TheSoftware-QualityLandscape
20.1 CharacteristicsofSoftwareQuality
20.2 TechniquesforImprovingSoftwareQuality
20.3 RelativeEffectivenessofQualityTechniques
20.4 WhentoDoQualityAssurance
20.5 TheGeneralPrincipleofSoftwareQuality
21Co llaborativeConstruction
21.1 OverviewofCollaborativeDevelopmentPractices
21.2 PairProgramming
21.3 FormalInspections
21.4 OtherKindsofCollaborativeDevelopmentPractices
22 DeveloperTesting
22.1 RoleofDeveloperTestinginSoftwareQuality
22.2 RecommendedApproachtoDeveloperTesting
22.3 BagofTestingTricks
22.4 TypicalErrors
22.5 Test-SupportTools
22.6 ImprovingYourTesting
22.7 KeepingTestRecords
23 Debugging
23.1 OverviewofDebuggingIssues
23.2 FindingaDefect
23.3 FixingaDefect
23.4 PsychologicalConsiderationsinDebugging
23.5 DebuggingTools--ObviousandNot-So-Obvious
24 Refactoring
24.1 KindsofSoftwareEvolution
24.2 IntroductiontoRefactoring
24.3 SpecificRefactorings
24.4 RefactoringSafely
24.5 RefactoringStrategies
25 Code-TuningStrategies
25.1 PerformanceOverview
25.2 IntroductiontoCodeTuning
25.3 KindsofFatandMolasses
25.4 Measurement
25.5 Iteration
25.6 SummaryoftheApproachtoCodeTuning
26 Code-TuningTechniques
26.1 Logic
26.2 Loops
26.3 DataTransformations
26.4 Expressions
26.5 Routines
26.6 RecodinginaLow-LevelLanguage
26.7 TheMoreThingsChange,theMoreTheyStaytheSame
PartVI SystemConsiderations
27 HowProgramSizeAffectsConstruction
27.1 CommunicationandSize
27.2 RangeofProjectSizes
27.3 EffectofProjectSizeonErrors
27.4 EffectofProjectSizeonProductivity
27.5 EffectofProjectSizeonDevelopmentActivities
28 ManagingConstruction
28.1 EncouragingGoodCoding
28.2 ConfigurationManagement
28.3 EstimatingaConstructionSchedule
28.4 Measurement
28.5 TreatingProgrammersasPeople
28.6 ManagingYourManager
29 Integration
29.1 ImportanceoftheIntegrationApproach
29.2 IntegrationFrequency--PhasedorIncremental?
29.3 IncrementalIntegrationStrategies
29.4 DailyBuildandSmokeTest
30 ProgrammingTools
30.1 DesignTools
30.2 Source-CodeTools
30.3 Executable-CodeTools
30.4 Tool-OrientedEnvironments
30.5 BuildingYourOwnProgrammingTools
30.6 ToolFantasyland
Part VII SoftwareCraftsmanship
31 LayoutandStyle
31.1 LayoutFundamentals
31.2 LayoutTechniques
31.3 LayoutStyles
31.4 LayingOutControlStructures
31.5 LayingOutIndividualStatements
31.6 LayingOutComments
31.7 LayingOutRoutines
31.8 LayingOutClasses
32 Self-DocumentingCode
32.1 ExternalDocumentation
32.2 ProgrammingStyleasDocumentation
32.3 ToCommentorNottoComment
32.4 KeystoEffectiveComments
32.5 CommentingTechniques
32.6 IEEEStandards
33 PersonalCharacter
33.1 Isn'tPersonalCharacterOfftheTopic?
33.2 IntelligenceandHumility
33.3 Curiosity
33.4 IntellectualHonesty
33.5 CommunicationandCooperation
33.6 CreativityandDiscipline
33.7 Laziness
33.8 CharacteristicsThatDon'tMatterAsMuchAsYouMightThink
33.9 Habits
34 ThemesinSoftwareCraftsmanship
34.1 ConquerComplexity
34.2 PickYourProcess
34.3 WriteProgramsforPeopleFirst,ComputersSecond
34.4 ProgramintoYourLanguage,NotinIt
34.5 FocusYourAttentionwiththeHelpofConventions
34.6 PrograminTermsoftheProblemDomair
34.7 WatchforFallingRocks
34.8 Iterate,Repeatedly,AgainandAgain
34.9 ThouShaltRendSoftwareandReligionAsunder
35 WheretoFindMoreInformation
35.1 InformationAboutSoftwareConstruction
35.2 TopicsBeyondConstruction
35.3 Periodicals
35.4 ASoftwareDeveloper'sReadingPlan
35.5 JoiningaProfessionalOrganization
Bibliography
Index