Okładka z trybikami, połamanymiPod koniec ubiegłego roku odezwało się do nas (tj. do mnie i j00ru) wydawnictwo PWN z propozycją napisania artykułu/raportu o ciekawych błędach popełnianych przez programistów. Jak wiecie, błędami zajmujemy się na co dzień, każdy z nas wygrzebał trochę swoich ulubionych anegdot i klas bugów, i stworzyliśmy coś, co ostatecznie przyjęło formę 40-stronicowego eBooka. Owy artykuł/mini-książkę można pobrać za darmo (registration-walled) na nowo otwartym serwisie IT PWN w dziale Download. Zachęcamy do lektury :)

Link raz jeszcze: http://it.pwn.pl/Raporty/Jak-uniknac-bledow-w-programowaniu

Obok naszego eBooka w serwisie można znaleźć jeszcze jeden - "Przyczyny niepowodzeń projektów IT", autorstwa Bartosza Chrabskiego oraz Karoliny Zmitrowicz (23 strony).

Komentarze / feedback jak zwykle bardzo mile widziane ;>

UPDATE: Kilka osób zgłosiło mi juz kilka błędów w naszym tekście o błędach (we must go deeper), więc... errata.



Comments:

2014-04-30 17:54:32 = Oskar
{
ebook w PDF? Witamy w latach 90'! :)
}
2014-04-30 18:02:53 = Gynvael Coldwind
{
@Oskar
Nieee no, lata 90' były fajne :)

A tak serio, zobaczymy, być może PWN złoży jeszcze w innych formatach (zapytam) ;)

Update: A btw, niektóre czytniki (np. ten defaultowy w Androidzie - QuickOffice) mając tzw. "read mode", w którym wyciągają tekst z oryginalnego layoutu i układają w formie znośnej do czytania na małych ekranach - może ujdzie jako tymczasowe rozwiązanie *nadzieja w oczach* ;>
}
2014-04-30 18:45:20 = Logan
{
Hey Gyn, mimo, że za darmo to i tak ponarzekam - czemu nie płatna? :)

Nie no serio, jestem pewien, że większość osób czytających twojego bloga z chęcią by zapłaciło, tym bardziej, że wszystkie twoje dotychczasowe materiały są za darmo. Ja bym wolał zapłacić kilka / kilkadziesiąt złotych niż wyrażać te zgody na otrzymywanie spamu :)

A tak przy okazji, to kiedy możemy oczekiwać jakieś 'grubszej' publikacji z Twojej strony? :)
}
2014-04-30 19:05:33 = Gynvael Coldwind
{
@Logan
> A tak przy okazji, to kiedy możemy oczekiwać jakieś 'grubszej' publikacji z Twojej strony? :)
http://gynvael.vexillium.org/dump/kto_wie.jpg ;)
}
2014-04-30 19:09:16 = ktoś
{
Świetny tekst, ale szkoda że tylko w pdf-ie. :(
}
2014-04-30 19:13:07 = Gynvael Coldwind
{
@ktoś
Thx ;)

Czym więcej głosów za mobi/epub, tym większa szansa, że PWN da się przekonać ;)
}
2014-04-30 19:18:52 = chris
{
Dołączam się do próśb - epub mile widziany:)
}
2014-04-30 19:52:12 = Logan
{
> http://gynvael.vexillium.org/dump/kto_wie.jpg

Czekam z niecierpliwością :)
}
2014-04-30 20:44:48 = Marszal
{
Już zastanawiałem się nad ceną, a tu miła niespodzianka ;)
}
2014-04-30 23:48:50 = KrzaQ
{
Chciałbym zgłosić poparcie dla idei opublikowania tego ebooka w formacie zgodnym z czytnikami mobilnymi.
}
2014-05-01 08:59:55 = polak
{
Przydałoby się nauczyć wyrażać poprawnie po polsku. Tych krzaków typu "register-walled" czy "defaultowe" po prostu się czytać nie da. Żenada.
}
2014-05-01 09:08:11 = agilob
{
@polak, zawsze lepsze to niż furtki wołania (https://pl.wikipedia.org/wiki/Furtka_wo%C5%82ania)
}
2014-05-01 09:10:31 = Logan
{
@polak

Wybacz, taka branża, nieda się tego uniknąć - już nie mówiąc o tym że jest łatwiej zrozumieć, no chyba że wiesz co to ZŚP?


Zintegrowane Środowisko Programistyczne :)
}
2014-05-01 09:12:06 = Servonen
{
Już nie płacz nad "defaultowe". W codziennej mowie programistów to częstsza forma niż "się nauczyć" zamiast "nauczyć się".
}
2014-05-01 09:41:39 = Animate
{
Nie karmcie trolla. Link pojawil sie na Wykopie, wiec pojawi sie ich teraz duzo.
}
2014-05-01 09:48:07 = Gynvael Coldwind
{
@polak
Hehe cóż mogę powiedzieć - jak stali czytelnicy mojego bloga wiedzą, mam strasznie dużo wtrętów z angielskiego.
Chyba najbardziej mi się oberwało za to: http://niebezpiecznik.pl/post/nowe-zabezpieczenie-supervisor-mode-execution-protection/#comment-36903 ;)

Przyznaję, że osobiście warstwa językowa jest dla mnie dużo mniej istotna, niż warstwa merytoryczna - troszeczkę bazuje na tym, że nasze mózgi działają dużo lepiej niż kompilatory - tj. nawet przy błędach językowych, wtrętach z obcych języków, itp. umieją wywnioskować sens bez większych przeszkód.
Natomiast zdaję sobie sprawę z tego, że dla niektórych osób warstwa językowa musi być jak najbardziej poprawna i staram się w oficjalnych publikacjach po polsku pisać bardziej po polsku niż po angielsku ;)

Co do konkretnego przypadku - co do "defaultowe" - zgadzam się, mogłem napisać "domyślne". Natomiast "registration-walled" to nie do końca "wymaga rejestracji", a lepsze tłumaczenie mi nie przyszło do głowy (pomysły?).

In the end (celowy zwrot po angielsku) to jest blog techniczny, nie polonistyczny, a śmiem twierdzić, że pewne zapożyczenia z faktycznie używanego języka obcego są w tym przypadku dopuszczalne. I zdaję sobie sprawę, że się ze mną nie zgadzasz ;)

@agilob
Ahahaha OK, Twój link wygrał ;)
}
2014-05-01 10:30:17 = pats
{
Dzięki za darmową wiedzę, ale myślę, że jest na stronie 11 literówka, w zdaniu:
"Wiele istniejących implementacji memcpy.."
a ciekawostka opisuje memcmp
}
2014-05-01 13:17:45 = Xianxi
{
W tabelce z porównaniem systemów plików są dwa błędy:

"Znaku <> oraz \ nie mogą wystąpić..."

Oczywiście, powinno być "Znaki".
}
2014-05-01 16:17:37 = wmu
{
Jeśli chodzi o błędy arytmetyki, to zabrakło informacji o błędach liczb zmiennoprzecinkowych, choćby najprostszych, np. porównywanie ze względu na równość, albo zapominanie, że liczba ma skończoną dokładność.

Jeśli chodzi o kolizje w tablicach mieszających, to jednak te problemy wnikają z popularnych implementacji, które nie wychodzą poza szkolny schemat. Równie dobrze można kolidujące elementy umieszczać w drzewie samobalansującym (AVL, czy r-b) i wtedy operacja na tablicy mają oczekiwaną złożoność O(1), a pesymistyczną O(log n).

Trochę rozczarowuje sekcja "wielowątkowość", w której opisujcie jedną klasę błędów. A przecież popularnym rodzajem błędów to brak właściwej synchronizacji (sekcji krytycznej) czy zakleszczenia, nie mówiąc o bardziej subtelnych błędach, jak np. nieuwzględnienie barier pamięci.

Brakuje mi tam jeszcze co najmniej jednego elementu, mianowicie niewłaściwej obsługi błędów, tj. albo ignorowanie kodów błędów w C (errno, GetLastError() itp.) albo ignorowanie wyjątków w C++/Java/etc. przez catch-all. Ignorowanie błędu jest gorszym błędem niż zgłoszenie błędu. :)

Ale w sumie to dobry artykuł, szczególnie dla menadżerów, którzy potrafią przyjść i wk***wić pytaniem "czemu nie piszecie bez błędów?". :)
}
2014-05-01 19:11:15 = RaveStar
{
Bardzo ciekawy opis dot. przewalutowania, gdyż nie zależy od użytego języka programowania. Oby więcej takich. Reszta to problemy typowe dla starych już języków typu Java, C++ i można by je pominąć, bo starsi programiści je znają, a młodzi raczej sięgną po takie języki jak Scala, Clojure, Haskell, etc, które informują o typowych lasach błędów lub nie pozwalają na łatwe ich powstanie...


}
2014-05-02 10:22:13 = Gynvael Coldwind
{
@pats, @Xianxi
Thx! Dodane do erraty.

@wmu
Nieee no, do ostatecznej wersji artykułu nie trafiła cała masa rzeczy. Założenie jednak brzmiało - weźmy kilka ciekawych naszym zdaniem błędów / klas błędów i je opiszmy (byliśmy też trochę ograniczeni jeśli chodzi o docelową wielkość artykułu) ;)

Co do sekcji wielowątkowość - to niestety/stety bardzo nas ciągnie do błędów, które mają konsekwencje związaną z bezpieczeństwem (szczególnie jeśli konsekwencją jest coś ciekawszego niż DoS). Stąd też do wielowątkowości trafił TOCTTOU a nie zakleszczenia.
Myślałem, żeby wrzucić też TOCTTOU na przykładzie podnoszenia uprawnień w systemach operacyjnych (patrz np. nasz Bochspwn), ale ostatecznie zrezygnowałem z tego pomysłu (to dość szczególny przypadek, który w zasadzie dotyczy głównie programistów tworzących drivery lub kernele, i przez to wydało mi się to trochę zbyt techniczne jak na tą publikację).

Natomiast ogólnie się z tobą zgadzam - czegoś w tej sekcji zabrakło, szczególnie bardziej związanego z programowaniem, a mniej z bezpieczeństwem.

Co do niewłaściwej obsługi błędów - dobry pomysł, w sumie mogło to tam trafić. Na liście mieliśmy coś podobnego - używanie ASSERTów w C++ do testów walidujących dane od użytkownika (co ofc nie ma sensu, bo ASSERTy są usuwane z buildów w release mode, więc te testy znikają), ale też nie trafiło do dokumentu.

Co do floatów, faktycznie trochę ich tam brakuje (szczególnie, że to bardzo ciekawy temat). Jest jeden przykład na stronie 33:
9223372036854775807 == “9223372036854775808” (dla 64-bitowych wersji PHP)
ale nie jest on należycie wytłumaczony (tj. czytelnik może się nie domyślić, że chodzi tam o konwersje long na double i stratę precyzji).

Co do hashy - yep, zgoda. Tak mogłoby to zostać rozwiązane ;)

@RaveStar
Mam nadzieje, że będzie w przyszłości tak jak piszesz - tj. coraz więcej nowych projektów będzie powstawać w językach, w których trudniej sobie strzelić w stopę niż w C/C++ czy PHP :)
Pozostanie wtedy tylko problem istniejących produktów napisanych w tych bardziej błędogennych językach, z którym pewnie jeszcze długie lata będziemy się męczyć.
}
2014-05-02 11:32:32 = kry5
{
Hey Gynvael,
bardzo ciekawa lektura ;) będą jakieś nowe filmiki wkrótce na Twoim kanale? ;>
}
2014-05-02 11:45:42 = Gynvael Coldwind
{
@kry5
Thx ;)
Niestety nie w najbliższym czasie (chce najpierw uporać się z tym co hintowałem w odpowiedzi na komentarz Logana). Ale później tak, planuje więcej czasu na to poświęcić.
}
2014-05-02 13:09:18 = kry5
{
W takim razie czekam z niecierpliwością, na obie rzeczy :)
}
2014-05-05 07:01:09 = noisy
{
Czekamy na wersję w PDFie :)
}
2014-05-10 20:55:46 = Sp00f3r
{
Cześć Gynvael, powiedz mi czy znalazłem już wszystko :-)
Link : <cut>
}
2014-05-14 13:06:40 = ao_29.5
{
Rzecz ciekawa, dziękuję,choć szkoda,że wymagała zapisania się na listę spamową PWNu ;) Ale trudno,ja nie o tym... Chodzi tą odpowiedź: "@RaveStar
Mam nadzieje, że będzie w przyszłości tak jak piszesz - tj. coraz więcej nowych projektów będzie powstawać w językach, w których trudniej sobie strzelić w stopę niż w C/C++ czy PHP :)" - I wszystko pięknie-ładnie,tylko że żeby przekonać ludzi do odejścia od kompatybilności wstecznej trzeba dać im narzędzie lepsze od C/C++ czy PHP albo pozwalające przepisać te rzeczy szybciej na nowo.Żeby się streścić jak to ja,newbie widzę w wypadku C/C++: Java ? bez żartów. Język E ? Pomysł chyba fajny,ale mało popularny i interpretowalny na Javie. Ada ? bezpieczniejszy język,ale komplikacje i ograniczenia duże,wiec lenistwo wygrywa.Inne języki ? Ba,które ? Samo Google wypuściło "go" co do którego porządnych opinii nie sposób zebrać bo nie jest chyba skończone.Tak samo jak D które miało zastąpić C/C++.

Tak więc mam pytanie @Gynvael Coldwind (takie co to tylko tak niedouczony newbie jak ja może zadać wkładając przysłowiowy "kij w mrowisko" :) ): To jakie języki są wg. ciebie bezpieczniejsze od odpowiednio C/C++ i porównywalnie wydajne jeśli chodzi o napisanie i wykonanie itd i można by je uznać za coś lepszego ? Widzisz już teraz godnych konkurentów dla C ?
}
2014-05-14 14:31:49 = Gynvael Coldwind
{
@ao_29.5
Haha trafiłeś w sedno ;)
Z każdym językiem jest jakiś problem. Jak już są w pełni zdefiniowane, bufory mają kontrolowaną wielkość, etc, to się okazuje, że są albo wolne, albo mają słabej jakości standardową bibliotekę (np. częściowo zaimplementowaną w C/C++ z typowymi dla tych języków błędami), albo same w sobie pozostawiają wiele do życzenia, albo programiści ich nie lubią "bo tak". Jak nie są w pełni zdefiniowane, to sobie ludzie notorycznie robią te same błędy. Do tego prawie zawsze dochodzi problem jakości ekosystemu, z czym bywa słabo chyba we wszystkich językach jakie mi przychodzą do głowy (chociaż OK, przyznaję, że jest coraz lepiej w tym względzie).

Natomiast na obecną chwilę trudno mi podać jakiś przykład języka, który wymusza/gwarantuje super bezpieczny kod (pomijam ofc błędy logiczne, bo te można popełnić w każdym języku). Póki co chyba jesteśmy zmuszeni trzymać się tego co jest, dorzucając do tego pair-programming/peer-review kodu wrzucanego na produkcje, dobry style-guide zabraniający używać części języka/biblioteki standardowej, które są uznane za niebezpieczne + zestawy dobrych frameworków i bibliotek, z których można korzystać (o ile takie się znajdzie ;p).
}
2014-05-14 15:23:50 = Gynvael Coldwind
{
@Sp00f3r
Brakuje Ci (jak wiesz) 5/7 i 6/7 - oba są związane z komentarzami, a do tego 5/7 można na dwa sposoby triggernąć.
Jest jeszcze -1/7 związany z download ;)
Hmm, skoro 8/7 masz, to rozumiem, że panel admina też znalazłeś ;)

Cheers,
}
2014-05-24 11:56:32 = X
{
Hej,

Wiesz może dlaczego PDF jest niedostępny??

Dzięki za dobra robotę.
Pozdrawiam
}
2014-05-24 11:56:44 = X
{
Hej,

Wiesz może dlaczego PDF jest niedostępny??

Dzięki za dobra robotę.
Pozdrawiam
}
2014-06-23 12:03:15 = Bartek
{
Szkoda, że strona PWNu nie działa...
}
2014-11-18 07:40:42 = Taziff
{
Chciałem pobrać PDFa ale niestety coś nie działa to na stronie PWN, jest jakiś inny sposób aby go pobrać?
}
2014-11-18 09:37:25 = Gynvael Coldwind
{
@Taziff
Hmm, sprawdziłem przed chwilą i wydaje się wszystko działać.
}

Add a comment:

Nick:
URL (optional):
Math captcha: 4 ∗ 10 + 4 =