Showing posts with label customer collaboration. Show all posts
Showing posts with label customer collaboration. Show all posts

Saturday, November 18, 2017

Co z tym analitykiem?

Kiedyś napisałem na gorąco o kilku sprawach, o których powinien wiedzieć analityk. Już po siedmiu latach mam kolejną refleksję o roli analityka :)

Jak wiadomo konsultanci nigdy nie mówią wprost, zacznijmy zatem od pewnej historii...

Jak urządzić mieszkanie?

Sęk w tym, że nie bardzo wiem jak. Moje kawalerskie kwatery przypominały koszary. Z tego względu dla uwicia rodzinnego gniazda postanowiłem skorzystać z profesjonalnej pomocy.

Projekt wykonawczy - bo o tym mowa - został wyceniony przez architektów na 6,1k. OK, pomyślałem, jeśli ma być dobrze i full profeska, to niech będzie.

Akcja rozpoczęła się od inwentaryzacji, a efektem - jak mnie pouczono - miał być PROJEKT WYKONAWCZY. Kompleksowa dokumentacja dla wykonawcy wykończenia, dzięki któremu będzie on mógł "zrobić" mieszkanie kropka w kropkę w zgodzie z zamysłem architektów.

-- Czyli moja ekpia będzie wszystko wiedziała co i jak z tego projektu?
-- Tak! - zdecydowanie potwierdzili architekci - Nie będą musieli zadawać żadnych pytań.

Skąd ja to znam - przemknęło mi przez głowę.

-- Więcej wiary! - skrytykowałem się w myślach - przecież budowle wznosi się od tysięcy lat. Architekci nie są w ciemię bici i wyłożyłem pierwszą ratę - 3,3k.

Co z tą fugą?

Projekt rzeczywiście robił wrażenie: gruby z zewnątrz, a w środku wszystko szczegółowo rozrysowane. Nawet rozłożenie płytek w łazienkach zostało precyzyjnie zaplanowane tak, że odniosłem wrażenie, iż sam bym sobie wykończył to mieszkanie, posługując się rzeczonym projektem. Bez słowa wyłożyłem drugą ratę - 2,8k.

Któregoś dnia zadzwonił do mnie Pan Czarek - główny specmajster z ekipy wykonawczej.

--Panie Michale, fugi się nie schodzą...

Fugi nie schodziły w dolnej łazience. Rząd płytek drewnianych jakoś nie chciał spasować się z płytkami ceramicznymi. Ale łaj?

Wnikliwa analiza w składzie: ja, ekipa i architekt zaowocowała oczywistą odpowiedzią - do projektu wkradł się błąd. Płytki drewniane miały wysokość nie 30cm lecz 31,5cm !

Jak to możliwe - zachodziłem w głowę. W projekcie za prawie 7 klocków takie rzeczy? Architektom trzeba oddać jedno, że sytuację uratowali - i tym razem i w kolejnych przypadkach.

Panie Michale, nie jesteśmy idiotami

-- Panie Michale, nie jesteśmy idiotami - zaczął majster Czarek. -- Przecież ja wiem, jak położyć płytki. No, ale kazał Pan robić wg projektu, a ja z projektem nie będę się kłócił. Po co oni tu piszą, że "drzwi mają być z podcięciem wentylacyjnym? Przecież wiadomo, że mają być podcięte. Po co piszą, że kibel ma być wiszący? Przecież jak go Pan przywiezie, to się okaże czy wiszący, czy stojący.

Tu Pan Czarek pokazał mi, jak wyobraża sobie projekt wykonawczy.

-- A gdzie reszta szczegółów? - zapytałem zdziwiony.
-- Resztę, to sobie dogadamy.

Coś tu poszło nie tak

Mieszkanie zostało wykończone jak trzeba. Siedziałem zadumany na schodach, trzymając w ręku PROJEKT WYKONAWCZY - plik kartek, za który zapłaciłem 6,6k. Coś tu jednak poszło nie tak.

Nie kwestionuję ceny za pracę architektów, wiadomo, że robota kosztuje. Kwestionuję cel, do którego wspólnie się skomitowaliśmy. Nie chciałem płacić za projekt, bo te rysunki nie mają dla mnie żadnej wartości. Chciałem zapłacić za doprowadzenie mieszkania do takiego stanu, jaki spodobał mi się na rysunkach. O to mi chodziło!

A co z tym analitykiem?

Analityk w zespole, analityk jako PO, analityk jako Proxy PO...itd. Każda z tych konfiguracji ma sens. Tyle, że analityku! Twoim celem nie jest wysmażenie BPMNów, UMLi, czy cholera wie czego tam jeszcze. Twoim celem jest dostarczenie tego, czego chce klient. Wespół z innymi wykonawcami na przykład z zespołem deweloperskim. Nie bez powodu na rynku pojawiły się biura architektoniczne mające własne ekipy.

Zauważ, że w opisanym przykładzie nie można mieć żalu ani do architektów, ani do ekipy. Problem leżał w tym, że setup organizacyjny pracy był niewłaściwy. Architekci poprzez zakontraktowanie PROJEKTU mieli inny cel niż ekpia.

Chociaż sam prowadziłem wiele szkoleń z UML, jestem raczej niechętny tego rodzaju formalnym notacjom. Ich intencja jest szczytna, ale prowokują one sytuacje, w których to chęć stworzenia poprawnego modelu zastępuje cele klienta. O wiele bardziej przemawiają do mnie nieformalne notacje "free form diagrams" prezentowane chociażby przez Simona Browna w "Software Architecture for Developers".

O tym, że, mało który deweloper używa UMLa zgodnie ze specyfikacją, nawet nie wspominam.

Wednesday, July 23, 2014

A Word on Business-IT Collaboration

However there is bunch of strict means related to business-IT collaboration, the effectiveness of collaboration is often understood as a very subjective sensation.

When business and IT play together there are well defined process and rules, but these are second-order things. What people value the most is mutual involvement in a collective goal.

In these situations I've noticed that:
  • collaboration rules are given explicite in a visible way
  • there are also explicit rules in case of emergency
  • the rules are for better collaboration not for accounting sb. for tasks
  • when one doesn't follow the rules this means the rules don't fit to the worklflow and must be changed
  • rules come from workplace and people who do work not from management
  • rules are changing because reality is changing and that is OK
  • the rules above are written in hearts not always on the paper

Saturday, April 5, 2014

We Need You to Draw Seven Red Lines (...) Can You Do That?

This article is part of my work on Conversation Patterns for Software Professionals

Never, ever answer this kind of question! But let's start from the top.

I think that every single software professional has seen this movie.



Beauty of this show is the Authors extremely clearly grab the structure of the communication gap between business and technical folks. Probably you have also experienced conversation similar to the one above.

But there was the critical moment which determined the conversation flow went toward the absurd. This is the moment I'm writing about:


Look at the Expert eyes. When the question was asked, he stoped breathing for while and he slightly moved eyes up. What did that mean? Well, this is not Math, but I recognized that he fired up BusinesRuleValidator and he started thinking about a solution.

His intention was obviously positive - he tried to answer the question. There are couple things need to be emphasised in this case to help the Expert to handle the situation.

They didn't want seven lines to be drawn

Really, they didn't want those lines at all. The wanted to achieve some benefits (but not this general blah blah from the beginning :) ) and they want their problems to be solved. The lines were just only their idea to meet these needs.

So it would be more comfortable for the Expert to discover these needs first instead of explaining them what is possible or what is not. The Upward Generalisation Pattern was designed for that purpose.

Keep technicals for your teammates

Don't explain geometry rules to people who are unable to distinguish colours and perpendicularity :) When you are attendee of that meeting, collect as much information as you're able to. Answer some questions (basically using metaphors or analogies), but for God's sake don't dive deep into technical details.

They're not partners to this kind of conversation. They are excellent source of needs and business cases, but keep technical details for your teammates.

They reframed contexts to push the Expert into commitment

Task is clear! How do you know before you try? Now you've confused everyone! What exactly stop us? Just ignore it! Seven red lines it's not twenty! You don't see overall picture! It's not a difficult task! Suggest a solution! Any fool can criticize!

Statement's above are so-called reframings. In general reframing is a technique to stretch your perspective by swapping context behind your point of view. The operation challenges your beliefs related to the situation and gives you a deeper insight into the one.

But you may also backstab with a reframing. In the sketch business people use the statements above (which may be true in some contexts) to gain their persuasion power and push the Expert into commitment. Of course the statements are not valid in the context of the conversation, but this was concealed.

Don't ask this kind of questions

Always commit yourself by three phases: Listen-Analyse-Commit. That's ok to refuse the commitment question till you analyse the situation.

It's not a big deal to commit oneself to do something. The challenge is to bring the thing done. My practice is: commit myself on the next meeting :)

You are definitely the Expert, you should know better

So, if you say you need more details - you definitely need it!
If you say you need an specific example or use case - you definitely need it!
If you say you are unable to answer now - you're definitely right!

You are part of the meeting not because of nodding but because of your expertise. You are trustworthy because you are able to say both: 'Yes' or 'No' if needed.

Tuesday, January 28, 2014

It's Not Pround To Be Geek

Although 'Geek' defines some identity for a developer, being geek doesn't sound proundly for me. One having accepted this identity delimits oneself at the same time.

When you think you are Geek also create responsibility related to being Geek. Then it is easy to say: I am Geek, expecting an excellent requirements to start working or I don't wanna talk to stakeholders, this analyst's job, I am Geek or something else.

I've seen many IT-related conferences speeches. My observation is lots of speakers builds their authority around of being Geek. They leverage IT-business cooperation problems, present business-IT relationships with distorting mirror and think it's funny. Well, that is funny for geeks, but not for agilist.

Differentiating from 'Others' is a very powerful strategy for a speaker or for an individual in general. This strategy underlines what a group of individuals have in common and how they differ from 'Others' (read: business), helps to feel more self-confident. But this strategy doesn't help to be more open to a relationship with 'Others'.

So don't be Geek, but Agilist :)

Wednesday, November 27, 2013

Conversation Patterns: Don't Confuse a Need with a Feature

This article is part of my work on Conversation Patterns for Software Professionals

I have used an Inverted User Story presented in User Story Template Revisited during some workshops with teams and I want to add a tip.

How to recognize you discovered the right benefit or problem to be solved. Well, you can't. You should stay aware of a conversation flow and test a timeliness of stakeholder needs. So the core need driving a user story doesn't escape your notice. Try to implement the Heart beat design pattern in your mind :)

But you should distinguish between "need" and "feature". A Stakeholder often confuse these two. For example:

As a Logged user I want to generate salary report so that I will know who is a VIP

Without a wider context it's difficult to validate the story. But, "I will know who is a VIP" is probably a feature, not a need. It's because it points a system feature, but not a stakeholder benefit or problem to be solved.

I want to score under this is my supposition and I would fire up my Heart beat pattern asking a stakeholder about a need details.

In general you may use following heuristics to recognise stakeholder need:
  • Benefits you discover, mostly fits to the template: I want to achieve...[benefit]
  • Problems to be solved you discover, mostly fits to the templates: I want to avoid....[problem to be solved]

Friday, August 2, 2013

Bug-Driven Development

- Ale tego nie było w specyfikacji.
- Ok, ale to przecież oczywiste, że powinniście to zrobić.
- Jak to oczywiste?
- No, kurcze...


Niezliczoną ilość razy z pewnością słyszałeś powyższy dialog.
Chyba wciąż chodzi o to samo - o niedostateczne sprecyzowanie wymagań, a potem o zepchnięcie odpowiedzialności. Przyczyny wspomnianego stanu rzeczy są znane i maglowane wciąż na nowo: trudności komunikacyjne, brak czasu, brak zaangażowania klienta itd, itp. Pewnie chodzi o to, że z wymienionych powodów wymagania nie zostały dobitnie i jednoznacznie sformułowane.

A jeśliby tak ustawić sposób współpracy, że brutforsowo wymusi jednoznaczne formułowanie wymagań? który nie będzie polegał na dobrej woli i chęci zaangażowania, ale po prostu uniemożliwi sformułowanie niejednoznacznych wymagań? I tu jest właśnie miejsce dla Bug-Driven Development :)

No, wyobraź sobie następującą scenę:

Zaczyna się rozmowa z PO na temat nowego sprintu
- Skończyliśmy! - krzyczy uradowany Zespół
- Jak to? Pokażcie!

Zespół z namaszczeniem odpala przeglądarkę, na której widać...białą przestrzeń.
Zmieszany PO jąka - Ale tu nic nie ma...
- Jak to nie ma? - odpowiada pewny jak McGyver siebie Zespół.
- No, nie mogę się zalogować.
- Ok, mamy pierwszy bug - zespół skrupulatnie notuje coś na kartce.
- Czekaj, wrócimy za dziesięć minut.
- ?? - odpowiada PO.

Po chili grupa programistów wpada do sali spotkań.
- Już mamy! - wrzeszczą uradowani.
- Czyli co?
- Jak to co? Soft dla Ciebie! Co z tobą, Łosiu?

Odpalają przeglądarkę z pięknym ekranem logowania. PO z nadzieją w oczach loguje się do systemu i....
- Aaaa! $^!@#&(!
- Czy coś nie tak? - pytają z zaciekawieniem programiści.
- A gdzie panel użytkownika, do cholery!!

Na to szczęśliwy jak nigdy dotąd SM:
- Ok, chłopaki mamy drugiego buga!, spadamy.
Po czym rzuca przez ramię, do oniemiałego PO.
- Pół godzinki i jesteśmy, buźka!

i tak przez najbliższe cztery tygodnie.


To tak, pół żartem, pół serio, ale czuję, że coś w tym jest :)

Thursday, April 18, 2013

Stakeholder Stories

User stories eksponują tę pracę do wykonania, która ma dawać business value dla sponsora. Zauważyłem że, zespołom, które posługują się US brakuje czasem szerszego kontekstu dookoła historyjek. Mam tu na myśli rzeczy takie jak:
  • wymagania niefunkcjonalne - są dopisywane gdzieś na boku US, spisywane w SRSach albo są w głowach
  • to, że nie wszystkie "wymagania" przekładają się na konkretne funkcjonalności
  • epiki mogą dotyczyć rzeczy przekrojowych przez funkcjonalności (btw: dobra definicja epika "Since an epic becomes an epic if the team can’t commit to it")
  • to, że wymagania mogą pochodzić z różnych źródeł i świadomość istnienia wszystkich interesariuszy wnosi lepsze zrozumienie pracy

Dla w/w rzeczy jakby nie było miejsca w backlogu, więc plątają się to tu to tam i każdy ma własny pomysł na ich przechowywanie. Brak jednolitego sposobu na przechowywanie wszystkich wymagań utrudnia ich komunikowanie, a zespołowi utrudnia złapanie szerszego kontekstu tego, co ma do zrobienia.

Format historyjki świetnie nadaje się do spisanie wszystkich punktów widzenia na tworzony produkt. Poniżej przykłady:
  • Jako Klient chcę zamówić szkolenie, aby wziąć w nim udział
  • Jako Zarząd chcemy dowiadywać się, jaki jest aktualny obrót, aby mieć informacje o aktualnych przychodach z portalu
  • Jako Architekt chcę, aby system S czerpał informacje o klientach z naszego systemu V nadzorującego procesy biznesowe
  • Jako Zespół chcemy pozbyć się ORMa, bo do tego typu projektu kompletnie się nie nadaje i spowalnia naszą pracę
  • Jako Grafik, chcę aby używano Velocity zamiast JSP, abym mógł szybciej przygotowywać widoki

Jasne, że nie wszystkie wymienione historyjki idą na tablicę. Przynajmniej nie w pierwotnej postaci. Przede wszystkim:
  • Zespołowi dają szerszy ogląd projektu
  • Nie uciekają historyjki techniczne; niby powinny być podczepione pod US, ale zauważyłem, że jak coś nie jest wprost nazwane, to lubi się zagubić w mrokach niepamięci

Po za w/w wspomaganie się hisotryjową strukturą (Jako X, chcę Y, aby Z, bardzo pomaga w zbieraniu wymagań. Zazwyczaj jeśli, ktoś nie potrafi sformułować Z, czyli konkretnego powodu powiązanego z projektem, to sam z wymagania rezygnuje, bez większej przykrości.

Tuesday, February 5, 2013

Test biznesowy

Od paru wieczorów, moja żona usypiająca naszą paromiesięczną córkę, zgłaszała pewien problem: Klamka w drzwiach skrzypi. Gdy dziś zamknąwszy za sobą drzwi, zobaczyłem na lodówce kartkę w kolorze czerwonym, wiedziałem, że wymaganie otrzymało status blocker.

Z namaszczeniem rozłożyłem skrzynkę z narzędziami, oliwę do maszyn, szmatkę przeciw zabrudzeniom i przystąpiłem do dzieła. Powoli, aby nie stracić żadnej chwili przyjemności rozmontowałem wszystkie śrubki i kropla po kropelce wsączałem oliwę w wadliwy mechanizm.

Nagle przyszło mi do głowy, żeby odstawić popisówkę i zademonstrować żonie, jak to profesjonalnie powinno się współpracować z klientem, jak formułować kryteria akceptacji.
- Słuchaj - powiedziałem - ile razy musisz nacisnąć klamkę, aby się przekonać, że już nie skrzypi i jest naprawiona?
Żona zastanowiła się krótko i odpowiedziała:
- Klamka będzie naprawiona, jeśli Nadia nie będzie się budzić, gdy będę od niej wychodzić.

Morał: Żaden gadżet ani wybajerzona metodyka nie mają uzasadnienia, jeśli klient za pomocą funkcjonalności nie może rozwiązać swoich problemów.

Morał2: Nie zmuszaj klienta do myślenia o technikaliach. Raczej myśl tak jak on.

Tuesday, June 26, 2012

Ludzie książki piszą

Dwa lata temu pewna firma postanowiła wesprzeć swoje procesy za pomocą systemu ERP. Mieli wiele małych systemów, ale marzyło się im kompleksowe rozwiązanie. Tak się złożyło, że dostałem zlecenie zebrania wymagań, a następnie zaprojektowania architektury owego.

Dwa tygodnie później zachodziłem w głowę jak to się mogło stać, że uzbrojony w całą wiedzę z wiązaną z UMLem (i zakupionym na tę okazję EA), architekturą, programowaniem i doświadczeniem związanym z wytwarzaniem oprogramowania, poniosłem katastrofalną Klęskę. Dokładnie tak Klęskę przed duże "K". Czułem podskórnie, że ten projekt się nie uda i po jakimś czasie okazało się, że miałem rację. Lecz co z tego, ze miałem rację, skoro klient był niezadowolony? Pozostał z nierozwiązanym problem. Problem, którego ja nie potrafiłem namierzyć oraz nazwać.

Kilka tygodni później przypadkiem brałem udział w szkoleniu i prowadzący niby przypadkiem powiedział takie zdanie: "Problem jest początkiem rozwiązania". Do końca szkolenia nie mogłem się już skupić na niczym innym niż to, kołaczące mi w głowie zdanie: "problem jest początkiem rozwiązania".

Po powrocie do domu napisałem ten post. Potem obsesyjne zacząłem zastanawiać się nad moim problem związanym ze zbieraniem wymagań do wspomnianego systemu ERP. Potem w trakcie kolejnych rozmów z klientami zacząłem zauważać coraz więcej reguł jakimi rządzą się takie rozmowy. Powoli włączałem moje odkrycia do swoich szkoleń. W końcu postanowiłem napisać książkę.

Dlaczego ta książka warta jest Twojego czasu? Zwróć uwagę, że wszystkie popularne metodyki w inżynierii oprogramowania: począwszy na OOD a na DDD skończywszy mówią o: odwzorowywaniu rzeczywistości, modelowaniu procesów biznesowych, modelowaniu dziedziny, kruszeniu dziedziny, itd. I tylko drobnym druczkiem jest w tych książkach napisane, że zakłada się, iż wiadomo, co trzeba zrobić. A guzik prawda! Nie bez powodu narzekamy na nieprecyzyjne wymagania. Zapewniam Cię, że gdybyś dokładnie wiedział, co należy zrobić, to nie miałbyś najmniejszych kłopotów z zastosowaniem OOD, TDD, BDD, DDD, DDDD i jeszcze więcej "D". Z architekturą i późniejszym utrzymaniem też by nie było kłopotów.

Metody inżynierii oprogramowania zajmują się modelowaniem rzeczywistości. Ta rzeczywistość znajduje się w głowach Twoich klientów. I o odkrywaniu właśnie tej rzeczywistości jest książka Oprogramowanie szyte na miarę. Jak rozmawiać z klientem, który nie wie, czego chce?.



Tuesday, October 18, 2011

Nic tak nie zaciemnia sprawy jak dobry przykład

jak ponoć mawiał szacowny nauczyciel.

Czasem mam wrażenie, że to powiedzenie odbija się echem w trakcie zbierania wymagań (w sumie odbija się echem w ogóle w kontaktach międzyludzkich, ale do zbierania wymagań się zawężę).

Próbujesz się dogadać, dowiedzieć co trzeba zrobić, aż tu nagle pojawia się tekst "to ja może podam Panu taki przykład....", który to przykład dokumentnie burzy moje zrozumienie problemu.

Podam taki przykład :), żeby doprecyzować o co mi chodzi. W ramach treningu poprosiłem osobę biznesową o opisanie "myszki do kompa" (rzecz jasna bez używania słów "mysz" i "komputer"). Otrzymałem odpowiedź: „To jest miłe w dotyku jak moje kapcie pluszowe. Jak to głaskam to sprawia mi to przyjemność. Służy to do wyrażania myśli. Wygląda jak zwierze ale na wyższym stopniu ewolucji. Jest większe od biedronki ale mniejsze od psa”.

Wychodzę z założenia, że za efektywność zbierania wymagań odpowiada zbierający. To jego zadaniem jest w porę zauważyć, że przykład/metafora zmierza z zaawansowane pułapy abstrakcji. Tylko co trzeba umieć, żeby na taki przykład się nie złapać?

Przypomina mi się jeden wykładowca matematyki, który słynął z pytań pomocniczych zwanych również pogrążającymi. Student męczy się przy tablicy z przebiegiem zmienności funkcji wykładniczej. Męczy się męczy. A wykładowca na to: "No, no to może ja pomogę. Niech Pan się zastanowi jak wygląda krzywa ładowania kondensatora"....

Thursday, September 29, 2011

Wednesday, July 28, 2010

Conversation Patterns: Kilka spraw, o których powinien wiedzieć analityk

This article is part of my work on Conversation Patterns for Software Professionals


Gdy wchodzisz do firmy jako zewnętrzny analityk, czasem dzieją się dziwne rzeczy...Zebrałem parę punktów, o których warto wiedzieć przed przystąpieniem do pracy. (to luźne, nieposegregowane notatki, więc bez pedantyzmu, pliz ;))

  1. Rozpoznaj strukturę organizacyjną - przed spotkaniem warto wiedzieć kto jest kim i za co odpowiada; pozwoli to lepiej ułożyć grafik rozmów
  2. Ustal wcześniej grafik spotkań - w większości firm nie można wyciągnać ludzi na rozmowę ot tak sobie, trzeba się najpierw umówić
  3. Zawsze ustalaj, czego chcesz się dowiedzieć - bo może się zdarzyć, że po całym dniu spotkań, będziesz przeglądać notatki i zastanawiać się, czego się właściwie dowiedziałeś
  4. Trudno wyciągnąć wymagania od osoby nastawionej na różnice - czasem zdarzy się klient, który wymagania formułuje poprzez wyjątki od reguł; baaaardzo trudno ustalić jak właściwie ma działać wspomagający go system, bo w sposobie myślenia klienta większość rzeczy, którymi zajmuje się w pracy nie ma ze sobą nic wspólnego (np.: nastawiony na różnice doradca bankowy "potrzebuje" oddzielnego systemu dla każdego klienta
  5. System wciąga - gdy przebywasz więcej niż 1 dzień w firmie klienta, zaczynasz wciągać się w ich problemy; ludzie z którymi się spotykasz bezwiednie próbują umieścić w środowisku, w którym się znajdują, próbują cię zaklasyfikować, nadać jakąś etykietkę, jakąś rolę; np. zaczynają cię traktować jako podwładnego Dyrektora IT; jeśli dasz się wciągnąć w tę grę to po tobie, bo stracisz perspektywę "kogoś z boku"
  6. Prowadź spotkanie - bo jeśli ty nie będziesz kierował jego przebiegiem, to na pewno zrobi to ktoś inny; nie osiągniesz wtedy swoich celów
  7. Odróżniaj fakty od emocji - Niektórzy ludzie mówią o swoich odczuciach związanych z oprogramowaniem; pamiętaj, że opiniom nie przysługuje atrybut prawdy; jeśli będziesz wystarczająco długo zadawał pytanie po czy konkretnie poznasz, że...? (np.: po czym konkretnie poznasz, że GUI jest ładne), to dojdziesz do użytecznych faktów
  8. Bądź wyczulony na relacje międzyludzkie - w każdej grupie ludzi, ktoś kogoś lubi albo nie, ktoś z kimś trzyma albo wojuje, ktoś rządzi, a ktoś słucha; rozpoznając relacje w firmie skuteczniej zidentyfikujesz interesariuszy (osoby, które mają odnieść korzyść z powstania systemu), mocnych interesariuszy (osoby, które mają rzeczywistą moc powiedzieć, że system ma wyglądać i działać tak, a nie inaczej) oraz oponentów (tych, którzy będą negować idę powstania systemu); czasem trafnie rozpoznając relacje międzyludzkie możesz odgadnąć, że właściwie nie masz nic do roboty w tej firmie zanim zapadnie taka decyzja
  9. W miarę możliwości porozmawiaj z każdym - jeśli kogoś pominiesz, to mogą przychodzić mu do głowy różne myśli, np.: a może chcą mnie zwolnić?
  10. Ludzie mają przyzwyczajenia - i prędzej wyjmą twoje serce łyżką niż z nich zrezygnują; jeśli nowy soft nie będzie podobny do czegoś, co już znają albo widzieli, to nie będą go używać
  11. Podczas zbierania wymagań koncentruj się na...zbieraniu wymagań - choć chęć zastanawiania się nad tym jak to zrobić jest bardzo silna; to nie jest jeszcze ten moment
  12. Wysyłaj podsumowania po spotkaniu - po pierwsze uporządkujesz wiedzę, po drugie sprawdzisz, czy dobrze zrozumiałeś, po trzecie dostaniesz dodatkowe informacje (a może ktoś coś sobie przypomni?), po czwarte podkreślisz wagę spotkania, po wtóre to jest odbierane jako oznaka profesjonalizmu
  13. Rób notatki podsumowujące spotkanie - i to jak najszybciej po jego zakończeniu! wtedy masz spostrzeżenia na gorąco; rewelacyjnie sprawdza się w tym zakresie mind mapping
  14. Nie daj się uwieść narzędziom - narzędzia w stylu EA i podobne są pożyteczne jak już dokładnie wiesz czego potrzebuje klient i chcesz to zgrabnie zebrać do kupy; korzystanie z nich na wczesnym etapie (choć twórcy wbudowują zachęcające funkcjonalności) ogranicza i usztywnia kreatywność; zamiast zastanawiać się nad potrzebami klienta, zaczniesz rozgryzać narzędzie (a każde z narzędzi ma inaczej zaprojektowany proces pracy, a tenże proces pracy zupełnie nie pasuje to tego w jaki sposób działają nasz mózgi)
  15. Poznaj procesy biznesowe - przed spotkaniami bardzo korzystnie jest poznać specyfikę pracy i procesy biznesowe, które ma wspierać nowe oprogramowanie

Tuesday, June 24, 2008

Metaprogramy w tworzeniu oprogramowania



Jeśli jesteś programistą albo w jakikolwiek inny sposób związany z branżą IT, to najprawdopodobniej po przeczytaniu tytułu, spodziewałeś się porcji informacji technicznych. Muszę Cię zaskoczyć, artykuł będzie o innych programach i o innym programowaniu niż sobie wyobrażasz.

Ludzie posługują się swoimi myślami w zorganizowany sposób. Dzieje się to często na poziomie nieświadomym. Gdy o czymś myślimy, w umyśle pojawiają się różnego rodzaju obrazy, odczucia czy dźwięki. Choć nie zawsze zdajemy sobie z tego sprawę, w ten właśnie sposób przetwarzamy informacje docierające z zewnątrz (i z wewnątrz).

Psycholingwistyce zawdzięczamy badania nad tą wewnętrzną organizacją codziennych doświadczeń. Okazuje się, że można wyróżnić pewne schematy, że ludzie posługują się pewnymi wzorcami zachowań, które nazwano metaprogramami. Metaprogramy zostały pogrupowane w przeciwstawne, uzupełniające się pary scenariuszy w następujący sposób:
  • Unikanie – Dążenie
  • Autorytet wewnętrzny – Autorytet zewnętrzny
  • Podobieństwa – Różnice
  • Ja – Inni
  • Informacje szczegółowe – Informacje globalne
  • Proaktywne – Reaktywne
  • Opcje – Procedury

Dla osoby skoncentrowanej na unikaniu, bodźcem do działania będzie chęć uniknięcia niepożądanych sytuacji. Przeciwnie, dla osoby posługującej się metaprogramem Dążenie, ważniejsze będzie osiągnięcie wyznaczonego celu. Czytelników zainteresowanych dokładnym poznaniem metaprogramów odsyłam do literatury.

Preferowane metaprogramy


W praktyce nigdy nie jest tak, aby dany scenariusz np. Unikanie występował w czystej formie. Jest tak przede wszystkim dlatego, że procesy myślowe są w swej naturze zbyt skomplikowane (i jeszcze wiele jest do odkrycia), by opisać je za pomocą tak prostego modelu jakim są metaprogramy. Koncept metaprogramów należy traktować zatem jako pewne przybliżenie rzeczywistości o ograniczonym zakresie stosowalności.

Używanie metaprogramu jest zależne od kontekstu (kontekstualizm), środowiska w którym znajduje się człowiek. Ktoś na co dzień skoncentrowany na Dążeniu może radykalnie zmienić sposób myślenia, gdy ucieka przed goniącym go psem – wtedy najprawdopodobniej skupi się na uniknięciu niebezpieczeństwa, bez znaczenia w jaki sposób.

Bardzo istotne jest to, że metaprogramy nie podlegają ewaluacji. Żaden z nich nie jest lepszy lub gorszy – są inne. Jedyne co można powiedzieć to, że dany scenariusz może być mniej lub bardziej użyteczny w określonej sytuacji. Zadaniem artykułu jest, przede wszystkim, pobudzenie do refleksji nad własnym stylem pracy.

Choć obserwując zachowania ludzi, można wskazać pewne przejawy każdego z metaprogramów to jednak poszczególne osoby mają osobiste preferencje. Najczęściej 1 do 3 metaprogramów dominuje, pozostałe pojawiają się sporadycznie. W dalszej części zastanowimy się, które z metaprogramów są najistotniejsze w pracy programisty.

Zbieranie wymagań


Zbieranie wymagań oraz modelowanie systemu są czynnościami o tyle ważnymi, że kierunkują dalsze prace zespołu. Prace nad projektem rozpoczynają się (powinny się rozpoczynać) od stworzenia jego wizji. Wizja, w postaci metafory, jest metacelem, do którego zmierzać będzie projekt w kolejnych fazach rozwoju. Dalej wyłania się zbiór wymagań, zestaw procesów, w których może brać udział użytkownik. Pojawia luźny koncept rozwiązania i będzie uszczegóławiany w dalszych krokach.

W opisanym wyżej procesie projektowania zauważamy, że prace odbywają się na poziomie ogólnym. Programiści/projektanci wykazują w tym miejscu tendencję do skupiania się na konkretnym rozwiązaniu. Podczas rozmowy z potencjalnym użytkownikiem, od którego należy zebrać wymagania, deweloper stara się podążać za tokiem myślowym rozmówcy. Jednocześnie zastanawia się, czy i jak konkretne wymaganie zostanie zrealizowane. Myślenie o rozwiązaniu jest jak najbardziej w porządku tyle, że nie na to jest miejsce podczas zbierania wymagań, gdy należy się skoncentrować na zrozumieniu wyobrażeń użytkownika o sposobie pracy z przyszłym narzędziem. Z tego względu zbieranie wymagań warto przeprowadzać w sesjach, np.: godzinę rozmowy z użytkownikiem, a następnie pół godziny na analizę wymagań i formułowanie dodatkowych pytań.

W artykule Klient, który wie, czego chce rozważałem różnice w sposobie myślenia analityka i klienta. Głównym wnioskiem było to, że klienci jednak wiedzą, czego chcą. Opisują to jednak w postaci procesów, natomiast analityk widzi system jako strukturę. Podążając za procesem łatwiej dokonywać w nim zmian. Z kolei zmiany wprowadzane w strukturze wymagają przeanalizowania całej koncepcji od nowa. Podczas zbierania wymagań klient często zastanawia się nad pożądanym sposobem pracy. Próbuje różnych alternatywnych przebiegów tego samego procesu i oczekuje od analityka pomocy w wyborze najlepszego rozwiązania. Jeśli analityk nie podąża w procesie za klientem, lecz percypuje system jako strukturę, to ma nie lada kłopot. Alternatywne ścieżki procesu klienta zazwyczaj mają istotny wpływ na domniemaną strukturę systemu i/lub implementację.

Dochodzimy do kolejnego, istotnego w pracy programisty, metaprogramu: Opcje – Procedury. Najczęściej klient chce próbować różnych możliwości – jest nastawiony na opcje. Analityk powinien wyjść naprzeciw tym oczekiwaniom. Należy przypomnieć fakt, że nastawienie na opcje może nie być głównym metaprogramem klienta. Jednak w kontekście zbierania wymagań, gdy zastanawia się on nad sposobem pracy z narzędziem i analizuje różne procesy, najczęściej chce mieć możliwość wybrania najlepszego rozwiązania spośród dostępnych.

Podsumowując część o zbieraniu wymagań stwierdzamy, że w tym kontekście pracy programisty ważne jest nastawienie na Ogół oraz na Opcje. Te sposoby myślenia pozwalają pozostać na odpowiednim poziomie abstrakcji i skupić się na wizji i celu istnienia systemu zamiast brnąć w konkretne technologie i rozwiązania tylko po to, aby w następstwie późniejszych decyzji w pośpiechu się z nich wycofywać.

Programowanie


Po zebraniu wymagań i zaplanowaniu prac przychodzi czas na implementację. W chwili obecnej role projektanta oraz programisty przenikają w projekcie. Myślę, że to dobrze, gdyż można w pełni wykorzystać potencjał tkwiący w programistach. W tej sytuacji deweloperzy dostają pewne wytyczne z projektem systemu i mają dość dużą dowolność w implementowaniu poszczególnych klas oraz metod.

Implementacja złożonego systemu informatycznego, gdzie współpracuje ze sobą wiele niezależnych bytów, jest skomplikowanym zadaniem. Na tym etapie programujemy już konkretne zachowania i procesy. Od programisty oczekujemy, że będzie potrafił uzasadnić wybór tego, a nie innego rozwiązania. Dodatkowo należy przestrzegać obowiązujących w zespole konwencji kodowania, zasad projektowania, wytycznych pisania testów, itp. Nie ma tu miejsca na swobodną twórczość albo raczej ma ona miejsce drugorzędne. Ważniejsze jest przestrzeganie określonych zasad – procedur. Ujawnia się nam kolejny scenariusz pomocny programiście: Procedury. Osoba, sprawnie posługująca się procedurami, rozważa rzeczywistość jako ciąg logicznych następstw, gdzie każde zdarzenie ma swoją przyczynę oraz konsekwencje. Intuicyjnie czujemy, że Procedury to jeden największych sprzymierzeńców programistów. Możemy być dumni z faktu, że wykorzystujemy metaprogram do tworzenia wspaniałego oprogramowania.

Warto jeszcze poruszyć jeszcze jeden aspekt programowania, istotny w kontekście rozważania metaprogramów. Mowa o abstrahowaniu. Języki obiektowe dają sposobność budowania złożonych zależności pomiędzy klasami dzięki np. dziedziczeniu, polimorfizmowi, interfejsom. Możliwości te, aż same zachęcają do ich korzystania. Istota kwestii leży w sposobie korzystania z tych udogodnień. Gdy programista implementuje daną funkcjonalność ma tendencję do tworzenia całej gamy abstrakcyjnych bytów „na wyrost”. Efekt jest taki, że w projekcie każda klasa implementuje specyficzny interfejs (nie używany nigdzie indziej) oraz posiada, do niczego nie potrzebną, klasę abstrakcyjną. Z kolei podczas używania danych klas i tak wszędzie następuje rzutowanie na obiekty konkretne. Przyczyną takiego tworzenia kodu jest „zachłyśnięcie się” paradygmatem reużywalności i elastyczności komponentów. Oczywiście paradygmat ten jest jak najbardziej słuszny, lecz sposób jego egzekwowania już nie. Błąd programisty polega na próbie zaprojektowanie stworzenia maksymalnie rozszerzalnego kodu i „zapomina” że każde rozwiązanie ma ściśle określone granice stosowalności. Programista próbuje stworzyć komponenty możliwe do zastosowania wszędzie (Golden Hammer). Popatrzmy na poniższy kod:

public interface Problem {
//...
}
public interface Solution {
//...
}
public interface UniversalProblemSolver {
public Solution solve( Problem problem );
}


Właściwie każda klasa mogłaby implementować interfejs UniversalProblemSolver, prawda? Gdy tworzymy kod, który ma dostarczać określoną funkcjonalność i koncentrujemy się przede wszystkim na jego uniwersalności, zamiast na konkretnym zadaniu które ma wykonać, popadamy w opisaną wyżej pułapkę. W takiej sytuacji myślimy poprzez Ogół i tworząc abstrakcyjne byty, zmierzamy do celu wyjątkowo krętą ścieżką.

Optymalne programowanie wymaga podejścia od strony Szczegółu. Najpierw tworzymy konkretne rozwiązanie implementujące żądaną funkcjonalność. Jeśli w trakcie tworzenia kodu zajdzie potrzeba abstrahowania: wydzielenia hierarchii dziedziczenia, interfejsów – refaktorujemy kod. Praca odbywa się zatem od Szczegółu do Ogółu – w odwrotnym kierunku niż w przypadku zbierania wymagań i modelowania systemu. Ten styl programowania wymaga od deweloperów wewnętrznej samodyscypliny. Warto skorzystać z technik programowania np. Test-Driven Development, które wspomagają ten styl pracy. TDD, dzięki filozofii pisania testu funkcjonalności przed jej implementacją, zabezpiecza przed nadmiarowym „rozdmuchiwaniem” klas i dokładaniem kodu, być może użytecznego, lecz zbędnego z punktu widzenia tworzonego systemu.

Przenoszenie metaprogramów


Powyżej wyróżniłem dwa konteksty pracy programisty, w których pożądane jest posługiwanie się odmiennymi scenariuszami metaprogramów Ogół – Szczegół oraz Opcje – Procedury. Ta właśnie potrzeba przełączania się pomiędzy różnymi scenariuszami rodzi wiele kłopotów i frustracji. Jest tak przeważnie dla tego, że „uruchamianie” odpowiedniego metaprogramu odbywa się w sposób nieświadomy. Drugą przyczyną, jak na ironię, jest zdolność do uczenia się. Przypuśćmy, że ktoś uczy się programowania. Po jakimś czasie wykształca sobie pewien sposób myślenia i sprawnie posługuje się scenariuszami Procedury oraz Szczegół. W umyśle człowieka rodzi się skrót myślowy: jeśli TO zadziałało w TYM przypadku, z pewnością zadziała również w TAMTYM. Ów człowiek, za pomocą metaprogramu, dobrze działającego w jednym kontekście (praca) próbuje wykonywać działanie w zupełnie innym kontekście (np. relacje międzyludzkie). To zjawisko może prowadzić do niepożądanych skutków. Praca nad własnymi metaprogramami uwrażliwia nas na podobne sytuacje i uczy efektywnego funkcjonowania w różnych kontekstach.

Korzyści


Najważniejszą, moim zdaniem, korzyścią ze znajomości i rozwijania określonych metaprogramów jest rozszerzenie spektrum możliwych reakcji na sytuacje pojawiające się podczas prac nad projektem. Umiejętność posługiwania sposobami myślenia innymi niż nasze własne sprawia, że efektywniej współpracujemy z klientami, użytkownikami oraz z innymi członkami zespołu. Poniżej wymieniam dodatkowe korzyści:
  • pomoc w formowaniu zespołu projektowego
  • wyznacznik dla osób rekrutujących programistów
  • skrócenie czasu zbierania wymagań
  • poprawa komunikacji w zespole
  • pomoc podczas projektowania ścieżki rozwoju dla programistów


Podsumowanie


W artykule wyróżniłem metaprogramy Ogół – Szczegół oraz Opcje – Procedury jako bardzo istotne w pracy programisty. Zdaję sobie sprawę, że istnieje wiele punktów w procesie rozwoju oprogramowania, które nie zostały tu wspomniane. W obszarach tych również korzystamy ze specyficznych metaprogramów i wiedza o nich będzie nieocenioną pomocą. Dalszą eksplorację tego zagadnienia rezerwuję sobie na najbliższą przyszłość. Warto wskazać czego potrzeba opracowaniu tego typu, aby stanowiło rzetelną pomoc w pracy dewelopera:
  • kompletny opis procesu wytwarzania oprogramowania z punktu widzenia wykorzystywanych metaprogramów,
  • opis efektywnych technik pracy na każdym z etapów,
  • zestaw ćwiczeń pozwalających rozwijać pożądane metaprogramy.

Każdy krok w kierunku rozwoju własnego warsztatu pracy uświadamia, że istnieje coś poza technologią, coś co porządkuje poszczególne umiejętności i pozwala korzystać z ich jeszcze efektywniej. Odkrywanie tych zasobów jest fascynującą podróżą ku doskonałości.

Tuesday, May 27, 2008

Klient, który wie, czego chce


Powszechnie przyjętym dogmatem wśród analityków, projektantów, architektów, deweloperów i innych osób biorących udział w cyklu wytwarzania oprogramowania jest, że Klient nie wie czego chce. Sytuację rodem z głuchego telefonu przedstawia rysunek (http://philhord.com/phord/wp-content/development.jpg), w którym klient opisuje swoje oczekiwania. Następnie trafiają one do poszczególnych osób zajmujących się tworzeniem systemu i w efekcie biedny klient dostaje coś, co drastycznie mija się z jego potrzebami.

Jak to zatem jest z owym klientem? Czy rzeczywiście nie ma on bladego pojęcia czego naprawdę chce? Jak wiadomo: punkt widzenia zależy od punktu siedzenia. Programiści wiedzą, że klient nie ma bladego pojęcia o swoich potrzebach, natomiast klienci są absolutnie przekonani, że deweloperzy dają im coś innego niż zostało to uzgodnione. Jaka jest więc prawda? Hmmm, żyję na świecie wystarczająco długo, by wiedzieć że każdy ma swoją własną prawdę. Jednakże twierdzę, że klient dokładnie wie, czego chce. Z doświadczenia wiem, że:

  1. Klient wie, czego chce – aktualne oczekiwania wobec systemu wyniknęły z problemów, które doskwierają klientowi w pracy, zatem chce on je rozwiązać i ma na to konkretny pomysł. Klient (metaforycznie rzecz ujmując) jest ekspertem z dziedziny problemu, więc tym bardziej wie, czego chce.

  2. Klient nie zawsze wie, czego potrzebuje – wynika to z jego niewielkiej wiedzy o możliwych technologiach. Często klient sugeruje rozwiązanie (na miarę swojej wiedzy), gdy tym czasem powinien zatrzymać się na sformułowaniu problemu i oczekiwanych rezultatów.

  3. Klient często nie uświadamia sobie konsekwencji własnych oczekiwań – jest to bolesne zwłaszcza, gdy prosi się nas o dodatkową funkcjonalność w systemie.


Przyczyna rozmijania się oczekiwań klient z rezultatem prac programistów koncentruje się wokół następujących faktów:

  1. Klient myśli procesowo – ma bardzo konkretne pomysły na sposób pracy z systemem. Potrafi określić warunki początkowe dla danego procesu oraz określić jego rezultat.

  2. Projektant myśli strukturalnie – porusza się w przestrzeni baz danych, tabel, klas, obiektów. Niejednokrotnie już podczas rozmowy z klientem myśli o implementacji. Z tego względu częste zmiany w wymaganiach oraz modyfikacje sposobów pracy z systemem, które klientowi przychodzą niezwykle łatwo, u projektanta powodują frustrację.


Mit o niewiedzy klienta nt. własnych oczekiwań bierze się powyższych różnić w myśleniu i analizowaniu informacji.

W swojej pracy wykorzystuję następujące praktyki pomagające w ustaleniu potrzeb klienta:

  1. Opisywanie cyklu pracy z systemem – tworzę zestaw procesów, które opisują co użytkownik może zrobić w systemie. Jeden proces to jedna konkretna rzecz, np.: wykonanie przelewu, zalogowanie, wygenerowanie raportu

  2. Rysowanie z klientem ekrany systemu i zaznaczanie przepływu sterowania pomiędzy nimi – puryści mówią, że tym powinien zajmować się projektant UI, natomiast do definiowania wymagań służą UML use cases. Cóż , nie spotkałem jeszcze klienta, który miałby ochotę uczyć się nowych symboli (nawet jeśli jest ich kilka), aby definiować swoje wymagania. Klient doświadcza systemu poprzez to co widzi – ekrany.

  3. Pilnowanie, aby klient precyzował jaki efekt chce uzyskać – klient jest od tego, aby wskazać problem i określić oczekiwane rezultaty. Od rozwiązywania zadania jestem ja. Dobrze jeśli klient może udzielić rad odnośnie implementacji, jednak niekontrolowane mieszanie się tych odpowiedzialności nie raz zapędziło mnie w kozi róg.

  4. Skłanianie klienta do przewidywania konsekwencji swoich oczekiwańduże korzyści przynosi to przy rozbudowanych systemach. Niestety klient patrzy lokalnie na system – skupia się na aktualnym problemie i nie ma wizji całości. Prowadzi to łatania dziur, dodawania funkcyjnie zależnych od siebie usług do systemu i ogólnego bałaganu. Prowokowanie klienta do globalnego spojrzenia na system i przewidywania globalnych konsekwencji swoich oczekiwań ma następujące zalety:

    • ulepszany system jest traktowany jako całość

    • unika się dublowania funkcjonalności

    • czasem okazuje się, że poprawa komfortu pracy o 5% nie jest warta wysiłku programistów