All we do is looking for some way to fulfill our needs.

czwartek, 21 maja 2009

Tagged under:

Działaj tak, jakbyś miał nieskończenie wiele czasu…

Tik, tak, tik, tak ... Zegar tyka nieuchronnie, czas płynie, deadline blisko, a zadań nie ubywa. Im bardziej się spieszysz, im bardziej idziesz na skróty tym więcej problemów się pojawia. Tymczasem odpowiedź jest prosta: Działaj tak, jakbyś miał nieskończenie wiele czasu!

No dobra, nie jest wcale taka prosta, przynajmniej nie jest prosta w realizacji. Zazwyczaj kierownik, klient, project manager lub analityk, stoi Ci nad głową i bezlitośnie przypomina o zbliżającym się terminie. Z pewnością nie oczekują po Tobie, że zaczniesz pracować jakbyś miał nieskończenie wiele czasu. W końcu zapewne znają prawo Parkinsona, że praca zajmuje tyle, ile jest na nią przeznaczonego czasu! I nie pozwolą Ci, abyś tego czasu miał zbyt dużo. Stąd taki nacisk na terminy, deadliney i zobowiązania.

Tymczasem programowanie to bardzo wrażliwa materia ... wiele zmiennych, dużo informacji, założona architektura, struktura projektu, wielość technologii i narzędzi, to wszystko nie sprzyja programiście, kiedy nie ma czasu. Parametrów jest bardzo wiele i łatwo o błędy, a pośpiech je mnoży. Kroki na skróty powodują więcej szkód niż pożytku, a paradoksalnie tymczasowe rozwiązania powstałe wskutek pośpiechu, stają się fundamentami produkcyjnego systemu.

Dlatego właśnie działaj tak, jakbyś miał nieskończenie wiele czasu! W takich momentach wmawiaj to sobie bez opamiętania i możesz mi wierzyć, że nie rozleniwisz się z tego powodu! Twój kierownik, klient, project manager lub analityk nie pozwolą Ci na to. Ważne jednak, żebyś zwolnił mentalnie, aby uchronić się przed autodestrukcją, zarwanymi nocami, zerwanymi kontaktami z rodziną czy znajomymi ... no może przesadzam! Ale czasami trzeba postraszyć ;-)

środa, 22 kwietnia 2009

Tagged under:

Rozmowa z klientem

Pierwsza rozmowa z klientem

Dzisiaj rozpoczyna się nowy projekt. Jak zawsze w takich przypadkach w zespole panuje nutka podniecenia i próby zgadywania, co będzie jego przedmiotem. Już są pewne informacje, ale to ciągle jeszcze nic pewnego.

Rozmowa z klientem zaczyna się. Po kilku minutach wstępnej rozmowy, przechodzimy do konkretów. (K - Klient, Z - Zespół).

Z: Jak moglibyśmy zdefiniować wizję projektu? Taką główną, nadrzędną myśl, ideę, która będzie mu przyświecać. Czemu ma służyć? Jest to o tyle ważne, że ta wizja, którą teraz zdefiniujemy, będzie głównym wyznacznikiem celowości podejmowanych działań. I oczywiście definiuje cel samego projektu. Motywuje do działania. Pozwala stworzyć końcowy obraz.

K: Chciałbym stworzyć system internetowy, który pozwoli w inteligentny sposób wyszukiwać przepisy kucharskie.

Z: To ciekawy pomysł i świetnie zdefiniowana wizja. Czy możemy mu się bliżej przyjrzeć?

K: Oczywiście. Istnieje wiele stron z przepisami kucharskimi i to nawet bardzo dobrych stron. Jednak mają one kilka wad. Są dość statyczne – nie pozwalają na bardziej zaawansowane przeszukiwanie przepisów. Zazwyczaj nie ma możliwości wybrania przepisów na bazie własnych upodobań czy wyszukania ich na bazie posiadanych składników. Brakuje swoistej inteligencji, która uprościłaby życiu użytkownikom portalu.

Z: Powoli zaczyna mi się to wszystko układać. Może spróbujemy wyodrębnić najważniejsze funkcje systemu?

K: Mam sporo pomysłów, ale nieduży budżet. Dlatego na początek chciałbym, aby była możliwość wyszukania przepisu, bazując na liście składników, które posiadam w danym momencie. Załóżmy, że jest środa wieczór, mam jajka, mąkę, bakłażan, mleko, trochę masła i chciałbym zrobić coś z tego do jedzenia. Nie mam pomysłu na to, co to może być. Więc otwieram portal do wyszukiwania przepisów, wpisuję składniki, które posiadam oraz ewentualnie preferencje np. rodzaj potrawy – zupa, ciasto, zakąska, rodzaj kuchni – polska, azjatycka, francuska, włoska … W efekcie dostaję kilka przepisów, które mogę zrealizować z posiadanymi składnikami. I to wszystko.

Z: A w jaki sposób użytkownik będzie wpisywał dane?

K: Wszystko musi być jak najprostsze z punktu widzenia użytkownika. Użytkownik powinien jak najmniej myśleć i podejmować wysiłku. Dlatego wyobrażam sobie, że będą dwa pola tekstowe – jedno do wpisywania składników, wiersz po wierszu, drugie do wpisania preferencji, to drugie będzie opcjonalne. Minimum wpisywania i konfiguracji. Oczywiście mogą być dodatkowe opcje, ale dostępne pod przyciskiem „Zaawansowane”. W domyślnej formie musi do być uproszczone do minimum. Pewnie przydawałaby się jakaś forma podpowiadania, żeby użytkownik nie musiał zbyt wiele pisać.

Z: Interesujące. Jak w tym polu tekstowym będzie użytkownik wpisywał składniki? W jakim formacie. Może tutaj napisze pan przykład na kartce.

K: Na przykład tak:
1/2 kg mąki
pół kostki masła
1/3 litr mleka
5 jaj

Z: Muszę przyznać, że to spore wyzwanie. Będzie wymagać analizy tego typu zapisu. Czy nie możemy zrobić tego w inny sposób, np. przez odpowiednie pola wyboru?

K: Nie, zdecydowanie nie. Komu by się chciało to robić w taki sposób. Musi to być zrealizowane w taki sposób. Kiedy w przypadku wizji użyłem słowo inteligentny, to właśnie to miałem na myśli. Rozumiem, że będzie to dość pracochłonne.

Z: Tak, bardzo pracochłonne. Ale jeśli jest to warunek konieczny, to oczywiście możemy to zrealizować w taki sposób. Przedstawimy później wstępne oszacowaniu złożoności problemu i zdecyduje Pan, czy chce realizować to w ten sposób.

K: Jeśli się zdecyduję, to tylko w ten sposób!

Z: Widzę zatem, że zapis składników może być dość dowolny – mogą to być takie jednostki jak kilogramy pisane w całości lub skrótowo, a nawet bardziej umowne jednostki jak pół kostki.

K: Tak, to też jest warunek konieczny.

No cóż, zapowiada się niebanalny projekt - myślę. Robi się coraz bardziej skomplikowany. Ciekawe co jeszcze wymyśli nasz Klient.

Z: Czy coś jeszcze może być wpisywane do tego pola? Może w jakiejś innej formie?

K: Wydaje mi się, że nie.

Z: A co zatem z drugim polem – Preferencje? Też powiedział Pan, że ma to być pole tekstowe.

K: Tak, zdecydowanie. Również tutaj chciałbym, aby była możliwość swobodnego wpisania swoich preferencji np. zupa, kuchnia azjatycka.

Z: Czyli poszczególne elementy rozdzielane przecinkami?

K: Tak, mogą być przecinki albo nowy wiersz.

Z: Jakiego typu preferencje przychodzą panu do głowy?

K: Rodzaj kuchni – region, typ potrawy – np. zupa, ciasto, może rodzaj diety, w której jest dozwolona, czas wykonania.

Z: Czy coś jeszcze można wpisać w to pole?

K: Wydaje mi się, że nie.

Z: Dobrze, zatem mamy dwa pola tekstowe – w jednym wpisujemy składniki, które mamy do dyspozycji, w drugim preferencje oraz przycisk wyszukiwania.

K: Dokładnie! Powinno się to odbywać tak jak w typowych wyszukiwarkach internetowych – minimalny, ale inteligentny interfejs.

Z: Dobrze, zatem przypuśćmy, że użytkownik wpisuje dane oraz wciska przycisk szukaj. I co dalej się dzieje?

K: Następnie jest strona z wynikami! Zupełnie jak w klasycznej wyszukiwarce. Dobrze by było, gdyby lista wyników pokazywała się w dwóch formach: w postaci skróconej – tylko nazwa potrawy oraz informacje związane z preferencjami czyli rodzaj kuchni, rodzaj potrawy; w postaci rozszerzonej – to co w postaci skróconej i dodatkowo jeszcze lista składników. W jednym i drugim przypadku, nazwa potrawy to link, do strony, na której znajdują się szczegóły przepisu.

Z: Jeszcze wrócę na chwilę do wspomnianych list – jak użytkownik będzie wybierał rodzaj listy?

K: Hmm… Domyślnie niech będzie wersja skrócona, ale na liście wyników będzie do dyspozycji przycisk do zmiany formy wyników. A… i jeszcze wyniki powinny być stronicowane tak jak w przeglądarce i uszeregowane od najlepszego do najsłabszego.

Z: A co będzie decydować o tym, że jeden przepis jest lepszy od drugiego?

K: H… dobre pytanie. Może niech to będzie minimalne lub maksymalne zużycie produktów.

Z: Czyli jaka część produktów zostanie zużyta?

K: Tak?

Z: A co będzie domyślną opcją?

K: … Niech będzie minimalne zużycie. No i jakiś przycisk do zmiany tego sortowania.

Z: Świetnie! A czy coś jeszcze ma być na tej stronie wyników?

K: Chyba nie..

Z: A jeszcze wspomniał Pan o przycisku „Zaawansowane”…

K: Tak, ale jeszcze nie mam pomysłu, co tam miało by być. No w zasadzie jeden. Otóż można by wprowadzić taki parametr, który określałby jakie elementy miałyby nie być brane pod uwagę. Na przykład sól i pieprz, woda czy inne tego typu rzeczy, które każdy ma, nie powinno się wpisywać. Dlatego ustawienia zaawansowane mogłyby określać, co jest, a co nie jest brane pod uwagę.

Z: A jak miałoby to wyglądać? Myślę, że byłaby to lista z odhaczeniami, gdzie można by zaznaczać, to co nie jest brane pod uwagę.

K: A co to mogłoby być?

Z: Na obecną chwilę, to co mi przychodzi do głowy to: woda, sól, pieprz, inne przyprawy. Ale ta lista może ulec rozszerzeniu.

K: Czy coś jeszcze powinno się znaleźć w sekcji zaawansowane?

Z: Chyba nie…

Potem podsumowaliśmy rozmowę oraz kluczowe informacje, które z niej wyniknęły. Jest zatem zarys wymagań. Teraz czas uporządkowanie tychże wymagań.

Kilka wskazówek związanych z rozmową z klientem

Klientem może być każdy: kierownik, szef, wykładowca, kolega, reprezentant klienta. Początek projektu to przede wszystkim czas na określenie wizji – oświadczeniu czemu system ma służyć. Jest to nadrzędny cel projektu. Na nim będziemy bazować, określając z klientem, które działania mają sens.

Następnie staramy się zebrać kluczowe wymagania na ogólnym poziomie – jakie konkretne funkcje system ma realizować. Kiedy już je mamy, rozkładamy na czynniki pierwsze. Bardzo przydatne będą pytania:

Czy coś jeszcze powinno się tu znaleźć …

Co jest ważne w następnej kolejności …

oraz pytania za pomocą, które przechodzimy od ogólnych stwierdzeń do stwierdzeń konkretnych:

Co konkretnie musi zajść/jak to ma działać/jak to ma być zorganizowane, aby wymaganie X zostało spełnione…

Co musi być spełnione, aby można było stwierdzić, że dana funkcja została zrealizowana…

Oczywiście powyższy scenariusz jest mocno uproszczony, ale daje pewien pogląd na przebieg tego typu rozmowy.

piątek, 23 stycznia 2009

Tagged under:

Jak odmienić sposób programowania używając refaktoryzacji

Z przyjemnością informuję, że BNS IT wydało swoją pierwszą książkę, mojego autorstwa.
Nosi tytuł "Jak całkowicie odmienić sposób programowania używając REFAKTORYZACJI".

Szczegóły na stronie mistrzprogramowania.pl

Możesz pobrać wersję bezpłatną (jest to ok. połowa książki i zawiera trochę reklam BNS IT).

Poniżej zamieszczam krótki fragment - wstęp ...


Na płycie nagrobnej pewnego anglikańskiego biskupa (ok. 1100 r.)
spoczywającego w krypcie Opactwa Westminsterskiego widnieją następujące słowa:

Kiedy byłem młody i wolny, a moja wyobraźnia nie znała granic, marzyłem o tym, by zmienić świat.

Gdy wzrosłem w latach i mądrości, zrozumiałem, że świata nie da się zmienić.

Więc przykróciłem nieco swe zamiary, i postanowiłem zmienić jedynie swój kraj.

Lecz i on także pozostał niezmienny.

Gdy dożyłem swego zmierzchu, w ostatnim, rozpaczliwym zrywie zdecydowałem zmienić choć swoją rodzinę, istoty mi najbliższe.

Lecz niestety! Na nic się to zdało!

Teraz zaś, gdy spoczywam na łożu śmierci, nagle zdałem sobie sprawę, że
jeślibym zmienił najpierw tylko samego siebie, to być może swym przykładem
zmieniłbym i swą rodzinę. Przy jej inspiracji i wsparciu byłbym w stanie ulepszyć swój kraj, i kto wie, może zmieniłbym wówczas cały świat.

Zacząć od siebie

Rzeczywistość projektowa jest złożona.
  • Zazwyczaj brakuje czasu
  • Trzeba pracować na starym kodzie, który pozostawia wiele do życzenia
  • Koledzy z biurka obok nie kwapią się do tego, żeby zacząć lepiej pisać programy
  • Klienci nie widzą czego chcą
  • Szefowi zależy tylko i wyłącznie na najszybszym wykonywaniu zadań
  • Biblioteki są źle udokumentowane i zawierają błędy
  • Narzędzia nie działają do końca tak jak powinny
Jest wiele przeszkód, które utrudniają tworzenie oprogramowania i niestety
zawsze tak będzie. Chcielibyśmy, żeby wszystko dookoła nas się
zmieniło, żebyśmy mogli w końcu zacząć programować w przyzwoity sposób. Czy
nie przypomina to trochę sytuacji biskupa z Opactwa Westminster?

Czego można się spodziewać?

Ta książka jest inna. Nie
będzie tu kwiecistych wyjaśnień wszystkich możliwych refaktoryzacji, nie
będzie przykładów wyrwanych z kontekstu. W zamian za to poznasz wiele rzeczy,
o których nikt nawet nie wspomina w innych książkach --- dowiesz się, jak
używać omawiane techniki w praktyce i jak zastosować je od zaraz. Poznasz
te, które są najbardziej użyteczne. Jeśli podążysz za autorem, twój sposób programowania całkowicie się odmieni.

Pierwsze trzy rozdziały stanowią wstęp do refaktoryzacji i absolutne minimum,
które musisz wiedzieć na jej temat. Kolejne rozdziały, to już techniki mistrzów.

Chcesz przeczytać więcej? mistrzprogramowania.pl