Professional Documents
Culture Documents
PRZYKADOWY ROZDZIA
SPIS TRECI
KATALOG KSIEK
KATALOG ONLINE
ZAMW DRUKOWANY KATALOG
TWJ KOSZYK
DODAJ DO KOSZYKA
Zarzdzanie projektami
informatycznymi. Subiektywne
spojrzenie programisty
Autor: Joel Spolsky
Tumaczenie: Mikoaj Szczepaniak
ISBN: 83-7361-869-4
Tytu oryginau: Joel on Software: And on Diverse and
Occasionally Related Matters That Will Prove of Interest
to Software Developers, Designers, and Managers, and to Those
Who, Whether by Good Fortune or Ill Luck, Work with Them in Some Capacity
Format: B5, stron: 360
Poznaj skuteczne i techniki kierowania prac zespou programistw
CENNIK I INFORMACJE
ZAMW INFORMACJE
O NOWOCIACH
ZAMW CENNIK
CZYTELNIA
FRAGMENTY KSIEK ONLINE
Wydawnictwo Helion
ul. Chopina 6
44-100 Gliwice
tel. (32)230-98-63
e-mail: helion@helion.pl
Spis treci
O Autorze ......................................................................................... 9
Wprowadzenie ................................................................................ 11
Cz I
Cz II
Spis treci
Dodatki .......................................................................................331
Dodatek A Najlepsze pytania do Joela ............................................................ 333
Skorowidz ..................................................................................... 347
Rozdzia 1.
Wybr jzyka
programowania
Niedziela, 5 maja 2002 roku.
Dlaczego programici wybieraj do realizowanych przez siebie zada pewne jzyki
programowania, rezygnujc z wszystkich pozostaych?
Kiedy potrzebuj przede wszystkim szybkoci, czsto wybieram surowy jzyk C.
Kiedy chc opracowa moliwie may program, ktry bdzie dziaa w systemie operacyjnym Windows, zazwyczaj decyduj si na jzyk C++ ze statycznie doczanymi
klasami biblioteki MFC.
Jeli jednak potrzebuj graficznego interfejsu uytkownika (GUI), ktry bdzie prawidowo funkcjonowa w systemach Mac, Windows i Linux, zazwyczaj wybieram Jav.
Chocia mechanizmy obsugi tego typu interfejsw dostpne w tym jzyku nie s doskonae, utworzone rozwizanie z pewnoci bdzie przenone.
Kiedy niezbdne jest zastosowanie techniki szybkiego tworzenia oprogramowania
z odpowiednim interfejsem GUI, zwykle uywam Visual Basica, chocia mam wiadomo zwizanych z tym ogranicze oraz cisych zwizkw z jedn platform (systemem operacyjnym Windows).
W przypadku narzdzi wykonywanych w wierszu polece, ktre bd uruchamiane
wycznie na komputerach z systemami UNIX i ktre nie musz by specjalnie szybkie,
moemy uy Perla.
Jeli tworzone oprogramowanie ma by wykonywane w przegldarce internetowej,
jedynym sensownym rozwizaniem jest zastosowanie jzyka JavaScript. Natomiast
w przypadku procedury skadowanej SQL-a przewanie musimy wybra odpowiedni
pochodn standardu jzyka SQL stosowan w danym serwerze bazy danych.
18
Co jest najwaniejsze?
Prawda jest taka, e najczciej wybieramy jzyk programowania, kierujc si wycznie
jego skadni. Zawsze wolaem jzyki z nawiasami klamrowymi wyznaczajcymi
poszczeglne bloki kodu (C/C++, C# i Jav). Syszaem ju mnstwo opinii na temat
czynnikw decydujcych o tym, czy skadnia jzyka programowania jest dobra czy za.
Nie dabym si jednak przekona do skadni, ktra wymusza zajmowanie 20 MB przez
same redniki.
Szczeglnie interesujcym elementem technologii .NET jest strategia programowania
dla wielu platform w rnych jzykach. Jej ide jest moliwo wybrania dowolnego,
odpowiadajcego nam jzyka programowania (ktrych jest mnstwo) i napisania oprogramowania, ktrego dziaanie nie bdzie si rni od funkcjonowania odpowiednich
programw napisanych w innych jzykach.
Jzyki VB.NET i C#.NET s niemal identyczne wszelkie niezgodnoci midzy nimi
wynikaj z drobnych rnic skadniowych. Wszystkie pozostae jzyki programowania,
ktre maj ambicje wkroczy do wiata technologii .NET, musz obsugiwa przynajmniej minimalny zestaw mechanizmw i typw, ktry bdzie wspdziaa z innymi
elementami tej technologii. Jednak w jaki sposb mona tworzy w technologii .NET
programy wiersza polece dla systemu UNIX? Czy ta technologia umoliwia tworzenie maych (mniejszych od 16 KB) programw dla systemu Windows?
Wydaje si zatem, e technologia .NET umoliwia wybr jzyka na podstawie jego
cechy, ktra interesuje nas najbardziej skadni.
Rozdzia 2.
Powrt do podstaw
Wtorek, 5 grudnia 2001 roku.
Znaczna cz dyskusji prowadzonych na mojej witrynie internetowej dotyczya oglnych kwestii, takich jak: analiza porwnawcza technologii .NET i jzyka Java, omwienie strategii XML, problem przechodzenia na nowe technologie, zestawianie konkurencyjnych strategii, projektowanie oprogramowania, architektur itp. Kade z tych
zagadnie w pewnym sensie przypomina przekadaniec (rodzaj ciasta). Na najwyszym
poziomie jest oglna strategia oprogramowania, bezporednio pod ni architektura
(np. .NET), pod ktr dziaaj poszczeglne produkty, np. narzdzia wytwarzania
oprogramowania (jak Java lub platformy, np. Windows).
Chcesz pozna kolejne warstwy? Prosz bardzo: biblioteki DLL, obiekty, funkcje.
Jeszcze niej? W kocu dotrzemy do pojedynczych wierszy kodu napisanych w wybranym jzyku programowania.
Poziom wyrae jzyka programowania jest dla Ciebie zbyt wysoki? Poniej chciabym
si zaj procesorami, czyli kawakiem krzemu przetwarzajcym bajty. Przypumy,
e jeste pocztkujcym programist. Zapomnij o wszystkim, czego dowiedziae si
o programowaniu, oprogramowaniu i zarzdzaniu, aby wrci na najniszy poziom
podstawowego modelu Von Neumanna. Wyrzu z pamici wszelkie dowiadczenia
zwizane z prac w rodowisku J2EE. Myl tylko o bajtach.
Dlaczego w ogle to robimy? Sdz, e najwikszym bdem popenianym przez programistw nawet na najwyszych poziomach architektur oprogramowania jest
niedostateczna lub obarczona bdami wiedza na temat procesw zachodzcych na
najniszych poziomach. Mona w ten sposb zbudowa wspaniay paac na grzskim
gruncie; zamiast betonowych fundamentw powstanie niestabilne rumowisko. Taki
paac co prawda adnie wyglda, ale od czasu do czasu popkaj kafelki w azience i nie
bdzie wiadomo, co jest rdem braku stabilnoci naszego dziea.
Sprbuj wic, przynajmniej teraz, si odpry zapraszam na krtki spacer z atrakcjami w postaci praktycznych wicze stosowania jzyka programowania C.
20
Wystarczy krtka analiza tej funkcji, aby przekona si, jakie jest jej faktyczne dziaanie. Po pierwsze, przegldnij pierwszy acuch w poszukiwaniu koczcego znaku
null. Kiedy uda si to zrobi, zobacz iteracyjnie znaki drugiego acucha i kolejno je
skopiuj do pierwszego.
Takie podejcie do problemu obsugi i konkatenacji acuchw byo moe dobre w czasie,
gdy swoje opracowanie przygotowywali Kernighan i Ritchie2, ale w rzeczywistoci
stwarza mnstwo problemw. Oto jeden z nich. Przypumy, e chcesz umieci zbir
imion w jednym, duym acuchu:
char bigString[1000]; /* Nigdy nie wiem, ile przydzieli pamici... */
bigString[0] = '\0';
strcat(bigString, "Jan, ");
strcat(bigString, "Pawe, ");
strcat(bigString, "Jerzy, ");
strcat(bigString, "Jzef ");
B. Kernighan, D. Ritchie, The C Programming Language, Second Edition, Prentice Hall 1988.
21
Powyszy przykad powinien dziaa, prawda? Tak. Raczej nie bdzie z nim adnych
problemw.
Jaka jest efektywno zastosowanej techniki? Czy nasz program jest wystarczajco
szybki? Czy nie mona zrobi tego szybciej? Czy jest skalowalny? Czy majc milion
acuchw, powiniene uy analogicznego rozwizania?
Nie. Zaprezentowany kod wykorzystuje algorytm roztargnionego malarza. Czym malarz
zasuy sobie na ten przydomek? Powinien to wyjani poniszy dowcip:
Malarz dosta zlecenie pomalowania jezdni narysowania linii przerywanej na
rodku ulicy. Pierwszego dnia pooy na krawniku puszk farby i pomalowa
100 metrw. Niele! usysza od swojego szefa. Jeste naprawd szybki!.
Do kieszeni malarza trafia zotwka premii.
Nastpnego dnia udao mu si pomalowa tylko 50 metrw drogi. C, dzi nie
byo tak dobrze jak wczoraj, ale nadal jeste wydajnym pracownikiem. 50 metrw
to take sporo. Malarz znowu dosta zotwk premii.
Nastpnego dnia pomalowa tylko 10 metrw jedni. Co? 10 metrw? krzykn
rozzoszczony szef. To nie do przyjcia! Pierwszego dnia pomalowae 10 razy
duszy odcinek! Co si dzieje?.
Nic na to nie poradz odpar malarz. Codziennie mam dalej do mojej
puszki z farb!.
22
23
Zwr uwag, e mamy w tym przypadku do czynienia zarwno z acuchem zakoczonym znakiem null (za wstawienie tego znaku odpowiada kompilator), jak i z acuchem Pascala. Zwykle nazywaem tego typu konstrukcje cholernymi acuchami,
poniewa uywanie sformuowania acuchy Pascala zakoczone znakiem null zajmowao zbyt wiele czasu. Poniewa jednak ta ksika moe trafi take w rce dzieci,
trzeba raczej uywa tego drugiego, do niezrcznego okrelenia.
Odszedem troch od zagadnienia, ktre interesuje nas najbardziej. Pamitasz ten
wiersz kodu?
char bigString[1000];
Ile pamici powinno si przydzieli? Sprbuj zrobi to zadanie w jedyny suszny sposb:
char bigString;
int i = 0;
i = strlen("Jan, ");
+ strlen("Pawe, ");
+ strlen("Jerzy, ");
24
Nie wierz wasnym oczom! Myl, e jednak nie powiniene pokazywa tej ksiki
swoim dzieciom. Nie chc zrzuca winy na Ciebie, wic trzymaj si blisko, bo mamy
do czynienia z czym naprawd interesujcym.
Musisz przeglda wszystkie acuchy wejciowe tylko po to, by okreli, jak dugi
powinien by acuch wyjciowy, dopiero potem przegldaj je ponownie w trakcie
waciwej operacji ich czenia. W przypadku acuchw Pascala przynajmniej operacja
strlen bya szybka. Moe powiniene sprbowa napisa tak wersj funkcji strcat,
ktra bdzie automatycznie przydzielaa odpowiedni obszar pamici?
Przedstawione rozwizanie wywouje kolejne problemy tym razem puapk jest
przydzielanie pamici (tzw. alokatorw pamici). Czy wiesz, jak dziaa funkcja malloc?
Jej dziaanie bazuje na utrzymywanej jednokierunkowej licie dostpnych blokw pamici
nazywanej wolnym acuchem. Kiedy wywoujesz funkcj malloc, lista ta jest przegldana w poszukiwaniu pierwszego bloku pamici, ktry bdzie odpowiednio duy,
by zrealizowa biece danie (pomieci wskazan struktur danych). Wybrany
blok jest nastpnie dzielony na dwa jeden o danym rozmiarze i drugi zawierajcy
bajty nadmiarowe. Pierwszy blok przechowuje nasz struktur danych, drugi (jeli istnieje) jest z powrotem umieszczany na licie wolnych blokw. Kiedy wywoasz funkcj
free, zwolniony blok zostanie ponownie doczony do listy wolnych blokw pamici.
Z czasem bloki pamici s wic dzielone na coraz mniejsze kawaki i kiedy zadasz
wikszego obszaru pamici, moe si okaza, e odpowiedni blok nie istnieje. Funkcja malloc poprosi wwczas o czas i zacznie naprawia wolny acuch, sortujc ca
list (wedug adresw) i czc ssiadujce ze sob mae bloki danych w coraz wiksze
obszary. Moe to zabra mnstwo czasu. Efekt jest taki, e funkcja malloc nigdy nie
gwarantuje naleytej szybkoci, poniewa za kadym razem musi przeszuka list wolnych blokw pamici, a niekiedy (w trudnych do przewidzenia momentach) dodatkowo
porzdkuje t list i wydajno caej funkcji jest bardzo maa (wydajno funkcji malloc
przypomina wwczas raczej mechanizmy czyszczenia pamici, zatem wszelkie teorie
na temat niepotrzebnych opnie powodowanych przez procedury czyszczenia pamici
s nie do koca prawdziwe, poniewa typowa implementacja funkcji malloc jest obarczona ryzykiem bardzo podobnych opnie, chocia by moe w mniejszym zakresie).
Sprytniejsi programici minimalizuj potencjalne opnienia generowane przez
funkcj malloc, stosujc operacje przydzielania blokw pamici, ktrych rozmiary s zawsze potgami liczby 2; wiadomo: 2 bajty, 4 bajty, 8 bajtw, 16 bajtw,
18446744073709551616 bajtw itd. Z oczywistych wzgldw (przynajmniej dla osb,
ktre kiedykolwiek bawiy si klockami lego) w ten sposb mona zminimalizowa
liczb niepodanych operacji fragmentowania blokw z wolnego acucha. Chocia
takie dziaania s z pozoru niepotrzebn strat przestrzeni pamiciowej, nietrudno
obliczy, e maksymalna nadwyka tej przestrzeni nigdy nie przekroczy 50 procent.
Nasz program nie zajmie wic wicej ni dwukrotno pamici, ktrej rzeczywicie
potrzebuje, co w wikszoci przypadkw nie stanowi wikszego problemu.
25
26
<author>Joel Spolsky</author>
</book>
<book>
<title>The Chop Suey Club</title>
<author>Bruce Weber</author>
</book>
</books>
27
decyzji odnonie strategii i architektury nowoczesnych rozwiza na podstawie technologii XML. Jako zadanie domowe zastanw si, dlaczego ukady firmy Transmeta s
tak powolne. Sprbuj take stwierdzi, dlaczego oryginalna specyfikacja jzyka
HTML dla tabel zostaa tak skonstruowana, e uytkownicy modemw analogowych
trac mnstwo czasu, czekajc na otwarcie stron z wielkimi tabelami. Odpowiedz te
na pytanie, dlaczego komponenty modelu COM s bardzo szybkie tylko do momentu,
w ktrym zmusisz je do przetwarzania midzyprocesowego. I dlaczego programici,
ktrzy zaprojektowali system NT, umiecili sterowniki ekranu w przestrzeni jdra
zamiast w przestrzeni uytkownika?
Wszystkie te kwestie wymagaj przeprowadzenia odpowiedniej analizy na poziomie
bajtw, a uzyskane w ten sposb odpowiedzi maj zasadniczy wpyw na decyzje podejmowane na najwyszym poziomie podczas doboru architektury i strategii. Dlatego
wanie moja wizja nauczania studentw pierwszego roku informatyki przewiduje
konieczno wprowadzania technik programowania od podstaw, czyli najlepiej od
jzyka programowania C wraz z wyjanieniem rozkazw procesora kryjcych si za
poszczeglnymi funkcjami tego jzyka. Jestem szczerze zatroskany, kiedy sysz, e
wiele programw nauczania informatyki traktuje Jav jako dobry jzyk do nauki, tylko
dlatego e Java jest prosta nie wymaga analizy tych wszystkich kwestii zwizanych
z acuchami i przydzielaniem pamici, a pozwala szybko budowa programy obiektowe zoone z wielu moduw. Takie podejcie jest z pedagogicznego punktu widzenia
nie do przyjcia i w niedugim czasie doprowadzi do katastrofy. Cae pokolenia magistrw informatyki bd na kadym kroku wprowadzay do oprogramowania algorytmy roztargnionego malarza, nawet nie zdajc sobie z tego sprawy, poniewa bdzie im
brakowao elementarnej wiedzy na temat faktycznych technik reprezentowania acuchw, ktre nie s przecie widoczne w kodzie Perla. Jeli chcesz kogo nauczy czego
naprawd poytecznego, musisz rozpocz zajcia od wprowadzenia zagadnie zwizanych z najniszym poziomem funkcjonowania oprogramowania. Trzeba najpierw
przez trzy tygodnie przekazywa najprostsze i jednoczenie najistotniejsze informacje,
aby przygotowa waciwy grunt do skutecznego rozwizywania naprawd trudnych
problemw.