www.indiaatthessalonikifair.com
okladka
To właśnie programista może w znacznym stopniu przyczynić się do tego, iż wykrywanie błędów i walka z nimi staną się zadaniami łatwiejszymi i bardziej skutecznymi -- tę właśnie tezę Autor stara się udowodnić w niniejszej książce, ilustrując swe wywody konkretnymi przykładami.

Niektóre ze wskazówek i zaleceń zawartych w treści niniejszej książki sprzeciwiają się wielu powszechnie przyjętym praktykom programowania i jako takie prowokować mogą do stwierdzeń w rodzaju "nikt tak nie pisze" lub "wszyscy łamią tę regułę". Warto wówczas zastanowić się nad przyczyną -- jeżeli "nikt tak nie pisze", to dlaczego? Czy przypadkiem stare nawyki nie okazują się silniejsze od racjonalności?

Odpowiedź na te i inne pytania Czytelnik znajdzie w tej książce.


Przedmowa do wydania polskiego (9)
Wstęp (15)

  • Dwa najważniejsze pytania (16)
  • Nazewnictwo (17)
Rozdział 1. Hipotetyczny kompilator (21)
  • Poznaj swój język programowania (23)
  • Pożyteczne Narzędzie - Lint (27)
  • To tylko kosmetyczne zmiany (27)
  • Nigdy więcej błędów (28)
Rozdział 2. Sprawdzaj samego siebie (31)
  • Przypowieść o dwóch wersjach (32)
  • Asercje (33)
  • "Niezdefiniowane" oznacza "nieprzewidywalne" (36)
  • Zagadkowe asercje (37)
  • Kompatybilność kontrolowana (39)
  • Gdy niemożliwe staje się możliwe (43)
  • Nic o nas bez nas (45)
  • Co dwa algorytmy, to nie jeden (48)
  • Usuwaj błędy jak najwcześniej (52)
Rozdział 3. Ufortyfikuj swoje podsystemy (59)
  • Jest błąd, nie ma błędu (60)
  • Zutylizuj swoje śmieci (62)
  • Jestem już gdzie indziej (66)
  • Kontroluj wykorzystanie pamięci (69)
  • Spójrz na to, czego nie widać (72)
  • Wybieraj rozsądnie (76)
  • Szybki czy bezbłędny (77)
  • Teraz lub później (77)
Rozdział 4. Jak wykonuje się Twój kod (81)
  • Uwiarygodnij swój kod (82)
  • Przetestuj wszystkie rozgałęzienia (83)
  • Żywotne znaczenie przepływu danych (85)
  • Czy czegoś nie przeoczyłeś (87)
  • Spróbuj, a polubisz (88)
Rozdział 5. Niekomunikatywne interfejsy (91)
  • getchar() zwraca liczbę, nie znak (92)
  • realloc() a gospodarka pamięcią (94)
  • Uniwersalny menedżer pamięci (96)
  • Nieprecyzyjne parametry (98)
  • Fałszywy alarm (101)
  • Czytanie pomiędzy wierszami (103)
  • Ostrzegaj przed niebezpieczeństwem (105)
  • Diabeł tkwi w szczegółach (108)
Rozdział 6. Ryzykowny biznes (111)
  • int intowi nierówny (112)
  • Nadmiar i niedomiar (116)
  • "Projekt" czy "prawie projekt" (118)
  • Po prostu robią, co do nich należy (120)
  • Przecież to to samo (124)
  • ?: to także if (125)
  • Precz z redundancją (128)
  • Wysokie ryzyko, bez odwrotu (129)
  • Przeklęta niespójność (133)
  • Nie przypisuj zmiennym informacji diagnostycznych (135)
  • Nie warto ryzykować (137)
Rozdział 7. Dramaturgia rzemiosła (141)
  • Szybkość, szybkość (142)
  • Złodziej otwierający zamek kluczem nie przestaje być złodziejem (144)
  • Każdemu według potrzeb (146)
  • Nie uzewnętrzniaj prywatnych informacji (148)
  • Funkcje-pasożyty (150)
  • Programistyczne śrubokręty (153)
  • Syndrom APL (155)
  • Bez udziwnień, proszę (156)
  • Na śmietnik z tymi wszystkimi trikami (158)
Rozdział 8. Reszta jest kwestią nawyków (163)
  • Hokus-pokus, nie ma błędu (163)
  • Zrób dziś, co masz zrobić jutro (165)
  • Doktora!!! (166)
  • Jeśli działa, nie poprawiaj (167)
  • Funkcja z wozu, koniom lżej (169)
  • Elastyczność rodzi błędy (169)
  • Spróbuj (171)
  • Święty Harmonogram (172)
  • "Tester" - nazwa w sam raz dla testera (173)
  • Programista zawinił, testera powiesili (175)
  • Zdefiniuj swe priorytety (176)
Epilog (181)
Dodatek A Lista kontrolna kodowania (183)
Dodatek B Podprogramy zarządzania pamięcią (189)
Dodatek C Odpowiedzi (197)
Skorowidz (225)