poniedziałek, 30 września 2013

Jak wywołać funkcję "Eureka"

Jeśli założymy, że informatycy to pracownicy fizyczni wtedy faktycznie nagradzanie za ilość linii kodu ma sens - bo nagradzany jest fizyczny wysiłek mięśni zginacza palca środkowego i sąsiednich. Ale ponieważ (mam niesamowicie ogromną nadzieję!!!) większość populacji rozumie już, że to jest bzdura i informatyk/programista to pracownik o charakterze intelektualno-kreatywnym, którego praca polega na rozwiązywaniu problemów - toteż ma sens największy aby skupić się właśnie na tym - problemach (i rozwiązaniach).

Problemy (i rozwiązania)

Okazuje się, że problemy możemy rozwiązać na dwa sposoby :

  • Ewolucyjny/Analityczny - do rozwiązania dochodzimy przyrostowo. Mając elementy A,B i C tworzymy liniowo różne kombinacje aż na coś natrafimy. Przypomina to trochę próbę wcelowania po pijaku właściwym kluczem do zamka w drzwiach
  • Rewolucyjny/Kreatywny - mając elementy A,B i C nagle (ni z tego ni z owego) zauważamy pewną naturę rzeczy - element A można podzielić na D i E i zestawić z B tak, że powstanie nieoczekiwana kombinacja (słynny eksperyment ze świeczką)

I co z tego? Podział jak podział... A jednak okazuje się, że w dużej mierze wiadomo co tam się pod czaszką w momencie "Eureka" dzieje

(I tutaj małe ostrzeżenie - jeśli czytelnik wyznaje klasyczny tu i ówdzie pogląd, że programistę trzeba zajechać aby "zoptymalizować" jego produktywność to niech przestanie czytać i pójdzie pooglądać Kubę Wojewódzkiego czy coś w tym stylu bo to co napiszę poniżej nie przypasuje mu do światopoglądu :( )

Neurologia olśnienia

(zrodlo : http://openi.nlm.nih.gov/detailedresult.php?img=387268_pbio.0020097.g002&req=4

Bohaterem historyjki jest niejaki Mark Jung-Beeman - neurolog z ważnego uniwersytetu w USA, którego nazwa fajnie by brzmiała, dodała powagi tekstowi ale nikt i tak je nie zapamieta. Jako spec od prawej półkuli mózgowej pewnego dnia sam przeżył olśnienie (plus masa wiedzy i paredziesiąt lat doświadczenia) iż skomplikowana natura języka wymusza jego procesowanie przez obydwie półkulę a nie tylko lewą - zwaną analityczną.

Beeman zaprojektował eksperyment, który polegał na tym aby znaleźć związek pomiędzy grupą wyrazów. Zakładał, że dla prostej grupy algorytm rozwiązywania będzie miał charakter analityczny ale już dla niecodziennego zestawu mózg będzie musiał zastosować jakąś sztuczkę. (Np zestaw {droga,przystanek, pasażer} - dosyć prosto - autobus | ale już dla {książka,spodnie,oklaski} - tak łatwo związku znaleźć się nie da - mól - zwłaszcza przy ograniczonym czasie)

A że na szczęście technologia jest coraz lepsza to można wykonywać takie fajne foty mózgu(fMRI), z kolorowaniem fragmentów pracujących. Plan był taki, że ludzie będą rozwiązywali zagadki siiedząc w komorze do robienia skanów. Niestety fMRI ma kilka sekund opóźnienia przez co nie udawało się zarejestrować "Eureki". Wtedy Beeman skumał się z kolesiem zwanym John Kounios, który to eksperymentował z inną technologią badania mózgu - EEG. Ta technologia dawała natychmiastowy wynik ale bez informacji, który rejon mózgu działał.

Postanowili połączyć te dwie technologie a wynik widzimy na obrazku trzy akapity powyżej:

Eksperyment

Chwile przed olśnieniem wyglądają tak :
  1. Faza przygotowawcza - wysoka aktywność płata czołowego. Moc obliczeniowa przekazana jest na szukanie rozwiązania problemu. Zmysły wydają się być uciszone (a przynajmniej obszary mózgu odpowiedzialne za ich obsługę - umysł nie chce być rozpraszany)
  2. Faza szukania - początkowo skupienie jest utrzymane. Aktywna jest lewa półkula (ośrodek mowy) ale gdy przez kilka sekund nie udaje się nagle wykres EEG wykazuje duża aktywność fal gamma (25-100Hz). W teorii falę gamma w naszym mózgu towarzyszą powstawaniu nowych sieci neuronalnych. I Wułala - właśnie został rozbudowany nasz mózg i siedzimy tak zastanawiając się "dlaczego wcześniej na to nie wpadliśmy" - przecież to (teraz) takie oczywiste!

Co się Co się co się stało

Badacze zauważyli to co widać na obrazku - aktywność w prawej półkuli. W teorii prawa półkula lepiej łączy różne koncepcje ale robi to mniej dokładnie niż półkula lewa. Na początku mózg skupia się na problemie ale później musi przerwać tę uwagę aby dać działać prawej półkuli.

Jakieś dziwne umysły mogłyby powyższy akapić odczytać w sposób - "aha czyli należy rozpraszać programistów" Nie, ku*wa nieee. Poniższy filmik odpowie dokładniej na to pytanie:

A to dlatego, że zanim pojawi się krótka aktywność gamma scalająca sieci neuronowe - swoją obecność zaznacza inna mózgowa "fala". Mózg działa w częstotliwości alfa (8-12HZ) w stanie relaksu. Medytacja, trans, relaks, spacer do Żabki - to wtedy mózg jest w stanie skanować pamięć w celu znalezienia kreatywnego rozwiązania. Hen hen czasu temu czytałem, że przy tej częstotliwości najefektywniej zachodzi wymiana informacji pomiędzy półkulami jakkolwiek teraz nie chce mi się szukać badań.

Swoje trzy grosze dołożył tutaj niejaki Joy Bhattacharya (a psychologist at Goldsmiths, University of London - kolejna fajna nic nie znacząca nazwa uniwersytetu). W trakcie swoich badań zaobserwował na wykresie EEG wzrost natężenia fal alfa na 8 sekund przed "olśnieniem". Kilka fajnych cytatów z tych badań:

"unless subjects have sufficient alpha-wave activity they won’t be able to make use of hints the researchers give them."

To poniżej jest zajebiste!

"If you’re in an environment that forces you to produce and produce, and you feel very stressed, then you’re not going to have any insights."
"If you want to encourage insights, then you’vegot to also encourage people to relax.”

Cholera znowu coś co stoi w sprzeczności ze szkołą zarządzania "optymalizacji użycia klawiatury". Czyżby jednak wyciskanie ludzi i szlifowanie dedlajnów mogło nie być najlepszym środkiem do zwiększenia produktywności w IT? Za każdym razem gdy znajduję takie badanie boję się, że gdzieś tam w krainie wyssanych z dupy harmnonogramów ginie gantowa wróżka

Ciekawy przypadek

Tak dla przypomnienia - istnieje jeszcze częstotliwość beta (16-20hz). W tym stanie mózg działa w trakcie "nie-relaksacji" i wyostrzonego skupienia. Jakkolwiek tutaj na ciekawy przypadek natrafił Kounios (to ten od EGG) w trakcie swoich badań. Otóż pewnego dnia uczestniczył w nich mistrz ZEN (to taka forma medytacji). Koleś nie był w stanie rozwiązać żadnych z puzzli - aż za nadto panował nad swoim umysłem w pełni skupiając się na problemie.

I nagle - w chwili pewnej - ZEN koleś zamienił się w prawdziwą maszynę do kreatywnego rozwiązywania zagadek. Generalnie tak zajebiście panował nad umysłem, że był w stanie skupić się na tym aby na niczym się nie skupiać. (To jest generalnie jedno z fajnych ćwiczeń w medytacji. Spróbujcie zamknąć oczy i nie myśleć o niczym - na samym początku można w tym stanie przesiedzieć maks kilka-kilkanaście sekund.

Do wspaniałych rzeczy jakie może dać medytacja w IT jeszcze kiedyś wrócimy.

Pracuje/niepracuje

Jestem na siłce i nagle do głowy przychodzi mi pewne rozwiązanie problemu z pracy. Najczęściej są to małe rzeczy związane designem komponentów/klas/funkcji w aplikacji ale czasami zdarzają się rzeczy relatywnie "przełomowe" jak np. ostatnio pomysł na wyciągnięcie części funkcjonalności do generowania raportów wewnętrznych do osobnej aplikacji co znacznie usprawniło rilisy (niby takie oczywiste a jednak przez ponad rok żaden mózg od pacyfiku poprzez stawy Jana w Łodzi o tym nie pomyślał). Początkowo myślałem, że to kwestia ukrwienia móżgu w trakcie ćwiczeń ale teraz widzę ogromny wpływ "stanu psychologicznego"

I teraz pytanie - jak to liczyć do czasu pracy? Rozwiązuje problemy z pracy to jestem w pracy? A jeśli siedzę przy klawiaturze i zastanawiam się czy zamknąłem drzwi od domu - to jest w pracy ale nie w pracy? I jak w kontekście tych rozważań ma się to zalecenie aby siedzieć 8 godzin przy klawiaturze? I czy czytniki przy drzwiach mają sens czy może raczej jakieś skanery mózgu?

Czy jeśli coś cokolwiek co napisałem powyżej ma sens to czy "optymalizacja czasu przy klawiaturze" driven development ma jakiś sen? Czy logowanie godzin i inne takie mają jakiś sens jeśli takie zbiory jak {"umysł","kreatywność","olśnienie","rozwiązanie"} {"liniowość","przewidywalność","plan","determinism"} lubią być zajebiście rozłączne?

Oczywiście cały czas gdzieś tam istnieje frakcja, według której jakiś zajebisty koleś w zajebiście brzmiącej roli wszystko wymyśli a małp.. znaczy programiści maja nie myśleć tylko robić. No cóż, był kiedyś taki odcinek przygód Tytusa gdzieś pewnej grupie ziomków wlali dosłownie olej do głowy - polecam lniany tłoczony na zimno - podobno ma dużo omega-3 .

Eureka i scala

Ostatnio mam relatywnie często olśnienia w trakcie rozkminy koncepcji ze scali. Covariance i Contravariance zczaiłem pomiędzy seriami na mięsień dwugłowy ramienia (zwany na dyskach osiedlowych "Bajcem"). Natomiast olśnienie odnośnie ostatniego zadania drugiego tygodnia kursu funkcyjnej scali (implementacja mapowania na symbolicznej reprezentacji zbiorów) przyszła z falą teścia po treningu nóg.

A no i kiedyś jak biegałem z ulotkami to nagle zaczaiłem jak powstaje drganie w układzie kondensator-cewka.

LINKI

niedziela, 15 września 2013

Jak stres w IT zabija kreatywność

Jak poruszyć anty-mainstreamowy temat i nie doprowadzić do jałowego trollowania?

Na przykład stwierdzenie "warto prowadzić zdrowy tryb życia" ma ogromny "potencjał strollowania" (np. "można żyć bez papierosów - tylko po co?" czy coś w tym stylu). Dużo trudniej trollować fakt - "mięśnie składają się z włókien białych i czerwonych" - chociaż może jakiś mistrz ciętej riposty i tutaj się wykaże.

Podobnie taka oto teza "stres w każdej postaci szkodzi produktywności w IT" może łatwo przerodzić się w trollo dyskusje ot chociażby poprzez stwierdzenie - "o nie nie, ja mam doświadczenie i jak raz przycisnąłem ludzi to produkt był w dwa tygodnie gotowy". No i zaczyna się problem ponieważ nasze subiektywne opinie i wspomnienia zazwyczaj mają mało wspólnego z rzeczywistością - i na ten temat są tysiące stron literatury naukowej.

Znacznie lepiej przenieść dyskusję na poziom bardziej ...mechaniczny.

Jak stres wyłącza neurogenezę

Bodziec

Najpierw pojawia się bodziec dla rozpoczęcia procesu - zagrożenie. Generalnie my - jako ludzie - mamy taki oficjalny "zbiór rzeczy stresowych" jak np. "to uczucie kiedy biegnie na ciebie coś dużego z 20 centymetrowymi kłami" czy też głośny dźwięk lub nagła utrata równowagi. Oczywiście każdy człowiek poprzez swoje niepowtarzalne życie tworzy wariację tego zbioru i tak np. hycel może się uodpornić na warczenie psa a ktoś inny nabędzie strachu przed zamkniętymi pomieszczeniami (czyli np. idziesz o dwunastej do sklepu i boisz się, że będzie zamknięty)

Są dwa bardzo interesujące bodźce korporacyjne do których powrócimy później.

Kortykotropina (ACTH)

O tym punkcie wspominam w zasadzie tylko dlatego, że słowo "Kortykotropina" zajebiście nadaje się do ćwiczenia wysławiania się. Sam mam wadę wymowy, więc mi pomaga - także wszyscy na trzy- cztery

  • Kortykotropina
  • Kortykotropina
  • Kortykotropina

Kortykotropina syntetyzowana przez przysadkę mózgową wali w nadnercza co zmusza je do produkcji hormonu stresu - kortyzolu (a nednercze to tutaj --> Nadnercze)

Tryb - "walcz lub uciekaj"

Kortyzol to taki globalny sygnał dla organizmu "Mamy kłopoty - koniec zabawy".

Kortyzol zatrzymuje "development organizmu". Mięśnie przechodzą w stan katabolizmu (rozpad), spowolnione zostaje działanie układu odpornościowego (nie czas na zwalczanie wirusów - za chwile coś może nam odrąbać głowę.

Bardzo ciekawe rzeczy dzieją się gdy kortyzol uderza w mózg - ciekawe zwłaszcza dla zawodów wymagających kreatywności

Zakręt zębaty i neurogeneza

Zakręt zębaty (Dentate_gyrus) to zajebisty kawałeczek mózgu. Do niedawna (przynajmniej relatywnego niedawna) uważano, że mózg rozwija się tylko w dzieciństwie i jeśli rodzicie spieprzą nam ten okres życia to już nie ma ratunku. Okazuje się, że proces tworzenia nowych neuronów,połączeń i struktur jest kontynuowany nawet w dorosłym mózgu a jedną z centralnych rol w tym procesie pełni właśnie zakręt zębaty.

"Zakręt zębaty" generuje nowe neurony i wspomaga tworzenie nowych struktur na potrzeby tworzenia nowych wspomnień związanych z eksploracją nowych środowisk czy też odnajdywaniem nowych zależności pomiędzy starymi koncepcjami - kreatywność? Brzmi jak kreatywność. A co z tym obszarem mózgu robi kortyzol? --- W Y Ł Ą C Z A !----

Tak oto doszliśmy do tego jak stres wyłącza kreatywność. Oczywiście nie mam swojego laboratorium i to co tutaj napisałem to moja własna interpretacja przeglądu literatury fachowej. Ale jeśli to prawda to powyższe dane rzucają nowe światło na psudo-techniki managerskie pod tytułem "wywrę na nich presję kłamiąc, że deadline jest dwa tygodnie wcześniej" (a słyszałem o takich). Oczywiście jest jeszcze jedno ale - czy programowanie to bardziej praca kreatywna czy mechaniczna?

Oczywiście, że kreatywna...

... a wcześniejsze pytanie było tylko retoryczne. Niestety nadal na rynku istnieją ludzie wierzący w industrialny podział na tych co myślą i na tych co robią. Właśnie taki totalny fail jak waterfall zakładał, że mądrzy ludzie zaprojektują a programiści "przeklepią". Cóż, jeśli jeszcze gdzieś jakiś beton w to wierzy to powyższe go nie przekona.

Natomiast jeśli ktoś uważa, że projekt IT to epickie zmagania z niezwykłą złożonością i że bez względu na metodykę i rolę w projekcie, każdy poprzez kontakt z innym wycinkiem tej złożoności jest w stanie użyć swojej kreatywnej mocy aby poprzez wartościowy feedback i pro aktywną postawę usprawnić stan projektu - wtedy witam w krainie mądrości i rozumu.

a i jeszcze jedno...

Oksytocyna

Oksytocyna to antagonista kortyzolu. To jest w sumie temat na osobny wpis ale tutaj wspomnę, że oksytocyna to tzw. "hormon więzi międzyludzkiej" - a nawet nie tylko międzyludzkiej. Dlatego właśnie gdy czujemy stres i ktoś okaże nam wsparcie to wtedy tak jakby czujemy się bezpieczniej. A jeśli komuś potrzeba bardziej naukowego przykładu - młode szczury oddzielone od matek w ciągu 48 godzin tracą dwa razy więcej komórek mózgowych w korze mózgu niż te nie oddzielone.

Korporacyjne źródła stresu

Dedlajn dedlajnem ale są dwie inne ciekawe kwestie, które mogą wpłynąć na nasz poziom stresu i naszą produktywność :

  1. Co ma wspólnego : wyprzedaż w MediaMarkt, ostatnie wolne miejsce w autobusie i dwie babcie, ostatni spadochron w spadającym samolocie i korporacyjny system bonusowy oparty o krzywą Gaussa? - są to ograniczone zasoby
  2. Czy jeśli macie znerwicowanego przełożonego, którego w kuchni mianowali odpowiednikiem męskiej części ciała i taki oto ktoś stoi wam za plecami to czujecie się bardziej czy mniej kreatywnie? W nasŧępnym odcinku(lub odcinkach) opowiemy sobie o teorii osobowości A i B - a także czy sama obecność przełożonego, lidera czy autorytetu może wzmocnić stres i wyłączyć kreatywność

A na koniec kilka linków oraz doskonale zagrany fragment filmu - gdzie możecie sobie zobaczyć jak płynnie zmienia się centrum "statusu i siły" poprzez zachowanie i jak wpływa ono na procesy osób uczestniczących w scence (procesy oczywiście udawane przez aktorów ale właśnie za to trzepią tyle kasy, że tak dobrze to udają)

niedziela, 11 sierpnia 2013

Covariance i Contravariance dla prostych ludzi jak ja

Temat jest bardzo ciekawy ale przy pierwszej styczności istnieje duże prawdopodobieństwo przepalenia zwojów mózgowych jeśli nie byłeś/byłaś nań wcześniej eksponowany. Warto jednak przyjrzeć się mu bliżej gdyż występuje kilku relatywnie nowych językach ale trudno napotkań nań w Javie - przez co znowu ludzie mogą pewnego dnia zostać zaskoczeni nowtym ficzerem Javy 13 podczas gdy cały świat na około będzie miał już to od dawna. Także nie ma co czekać.

W Javie relacje pomiędzy typami prostymi i typami wyższego rzędu możemy skonfigurować tylko w jeden sposób - brak jakiejkolwiek relacji - to się nazywa Invariance . Możliwe są jeszcze inne typy zależności

  • Covariance gdzie List[Object] jest faktycznie rodzicem List[String]
  • Contravariance gdzie List[Object] jest - uwaga !- dzieckiem List[String] co jest trochę na pierwszy rzut oka bez sensu ale w sumie bezsens wynika z napromieniowania mózgu imperatywną Java bo w przypadku funkcji covariance szybko staje się naturalne.

Oczywiście jeśli ktoś zarabia na kolejną ratę kredytu pisząc w Javie i mu z tym dobrze może wyrazić wątpliwość : "ale po co mi to? Ja nie chcę scali!"

Już nie tylko scala

Otóż sytuacja trochę zmieniła się od czasu gdy ten artykuł powstał w 2013 .Gdy go aktualizuję za oknem jest maj 2016 a świat ujrzała pierwsza oficjalna wersja języka Kotlin. Kotlin jest produktem JetBrains - firmy powszechniej kochanej i uwielbianej za ich IDE (to bez ironii - Intellij jest bardzo dobre). Ponieważ owa firma słucha developerów i dopasowuje się w ich gusta od kilkunastu lat to można śmiało stwierdzić, że wiedzą co robią.

No i jak tak spojrzymy na składnię Kotlin-a - Kod wprost z dokumentacji to naszym oczom ukaże się :

val a: Int = 10000
print(a === a) // Prints 'true'
val boxedA: Int? = a
val anotherBoxedA: Int? = a
print(boxedA === anotherBoxedA) // !!!Prints 'false'!!!
Ten kod tak w 90% wygląda jak Scala... Tak drogi czytelniku - firma, która od kilkunastu lat robi jedno z lepszych IDE dla programistów Javy i zna ten język an wylot. Z jakiegoś powodu postanowiła zerwać z dotychczasowa składnią Javy na rzecz składni "scalopodobnej".

Ale co ważne w kontekście tego artykułu to informacja, że i tam pojawia się jakaś forma contravariance i covariance. Może więc czas obok funkcji praktycznej zauważyć funkcję edukacyjna nowych języków? Niestety wygląda na to, że Java pomimo swej dojrzałości zostaje w tyle za innym językami i warto zadbać o swoją edukację "poza Javą".

A oto link do przykładu : https://kotlinlang.org/docs/reference/generics.html#declaration-site-variance

abstract class Source<out T> {
  abstract fun nextT(): T
}

abstract class Comparable<in T> {
  abstract fun compareTo(other: T): Int
}

Poniżej dla porównania kawałek .Net. Wygląda podobnie do tego kotlinowego kodu i znów pokazuje, że te koncepcje ogólnie nie są nowe. Nowe sa jedynie dla Javy.

public delegate TResult Func<in T, out TResult>(
    T arg
)

Przykłady obyczajowe

Generalnie aby nauka szła gładko warto sprząc przyswajaną wiedzę z wiedzą już posiadaną. A do tego jeśli owa posiadana wiedza ma charakter towarzysko - obyczajowy to powinno być i pożytecznie i zabawnie. Dlatego też tematem przewodnim w poniższych przykładach będzie wóda.

Ale o soooo chozzii...

W trakcie nauki programowania funkcyjnego tu i ówdzie napotyka się zestaw słówek: contrvariance,contravariance i invariance . W zasadzie to przy okazji lektury Javy też można na nie natrafić - najczęściej przy okazji generyków - ale ponieważ w Javie nie ma czegoś takiego jak declaration site variance dlatego też ów temat schodzi na poboczny tor.

Convariance i Contravariance są szczególnie ważne w kontekście funkcji, które wejście mają contravariant a wyjście covariant - oczywiście funkcje w większości języków bo jest jeden który tego tam nie ma i pozostawię czytelnikom do zgadnięcia który...

Generalnie w Javie można zadeklarować pewne zależności pomiędzy typami a listami jedynie przy deklaracji referencji do listy a nie listy samej w sobie.

List<String> strings=new LinkedList<>();
//List<Object> objects=strings; //compilation error

List<? extends Object> objectsAndChilds=strings;

Podobnego problemu nie ma Scala w przypadku listy "immutable".

val strings:List[java.lang.String]=List("1","2","3")
val objects:List[java.lang.Object]=strings

Jak i w kotlinie możemy to zrobić bezproblemowo

val list: List<String> =listOf("1","2","3")
val anys:List<Any> = list

Gdzież jest źródło tego oto zachowania?

Deklaracje

Deklaracja Listy w Scali i w Kotlinie mają obok generyka dodatkowe znaczki.

sealed abstract class List[+A] 
public interface List<out E> 

Własnie owe magiczne znaki sprawiają, że zachodzi odpowiednia relacja pomiędzy listą a przechowywanym wewnątrz jej typem. Warunek : Lista musi być "po angielsku immutable". Jeśli to był szok to co się stanie gdy zerkniemy do funkcji?

trait Function1[-T1,+R]

O ile Covariance (to z plusem) jeszcze jest jakoś intuicyjne o tyle Contravariance(to z minusem) już może czesać bańke. Dlatego też zilustrujemy mechanizm przykładem (obyczajowym)

Przyklad życiowy

Poniżej hierarchia klas, która posłuży nam do wytłumaczenia tematu. Domeną jest zestaw młodego chemika-smakosza :

class Alkohol
class Metanol extends Alkohol
class Etanol extends Alkohol
class Browar extends Etanol
class RozwodnionyBrowar extends Browar
class Wóda extends Etanol

Teraz jeszcze jakie haj order funkszyn w kontekście sklepu osiedlowego :

class SklepOsiedlowy{
 val browar=new Browar

 def realizujUsluge(usluga:Browar => String) = usluga(browar)
}

I nadchodzi teraz Clu wpisu na którym swego czasu zdzierałem sobie zwoje. Pamiętając, że cały czas obowiązuje zasada, iż do funkcji można przekazać albo deklarowany typ albo coś co z niego dziedziczy (jak w Javie) to które funkcje z poniższych można przekazać do "sklepu osiedlowego"?

val uslugaSpozywcza=(napój: Browar)=> "piję "+ napój //bramka nr 1
val kiepskaUslugaSpozywcza=(rozwodnionyNapój: RozwodnionyBrowar)=> "piję "+rozwodnionyNapój //bramka nr 2
val generycznaUslugaSpozywcza=(jakiśNapój: Alkohol) => "piję "+jakiśNapój //bramka nr 3

Pierwszy mindfuck przez jaki musiałem przebrnąć to "czucie" funkcji jako typu. Po latach siedzenia w Javie mój mózg cały czas próbuje widzieć je jako metody a nie dane same w sobie i cała koncepcję funkcji sprowadza do wywołania. Na szczęście znajomość javascriptu trochę tu pomaga ( ale i trochę przeszkadza). W każdym razie sklep osiedlowy ma metodę, która przyjmuje funkcję typu : TYP na wejściu Browar , TYP na wyjściu String. Na pewno do tego typu pasuje uslugaSpozywcza bo na wejściu ma Browar a na wyjściu String.

I właśnie tutaj pojawia się arcy ciekawe pytanie: która funkcja jest podtypem funkcji uslugaSpozywcza ? Paradoksalnie okazuje się, że podtypem jest... generycznaUslugaSpozywcza - tak to co przyjmuje "nadtyp" - jako funkcja staje się "podtypem".

Skąd ten potencjalny mindfuck? Być może w mózgu dzieje się coś takiego : jak RozwodnionyBrowar jest podtypem Browaru to zwoje kory szarej chcą aby funkcja, która przyjmuje RozwodnionyBrowar była tez podtypem funkcji, która przyjmuje Browar - ale jest odwrotnie! - dlatego pewnie nazywa się to CONTRAvariance (i ten minusik trait Function1[-T1,+R]).

Wytłumaczenie - podejście pierwsze

Wróćmy do kawałka kodu :

val browar=new Browar
def realizujUsluge(usluga:Browar => String) = usluga(browar)

A w szczególności tego fragmentu usluga(browar). Generalnie chodzi o to, żeby funkcja jakiej tutaj użyjemy mogła przyjąć TYP Browar.

  • val uslugaSpozywcza=(napój: Browar)=> "piję "+ napój - MOŻE
  • val generycznaUslugaSpozywcza=(jakiśNapój: Alkohol) => "piję "+jakiśNapój - MOŻE BO BROWAR TO ALKOHOL
  • val kiepskaUslugaSpozywcza=(rozwodnionyNapój: RozwodnionyBrowar)=> "piję "+rozwodnionyNapój - NIE MOŻE BO BROWAR TO NIEKONIECZNIE ROZWODNIONY BROWAR

Wytłumaczenie - podejście Drugie

Dla odmiany inna hierarchia

    class Kulturysta
    class Koksu extends Kulturysta
    class KoksuZMikrofonem extends Koksu

    val napierdalanie=(k: Kulturysta)=>"napierdalanie"
    val wywiady=(k:Koksu)=>"wywiady"
    val koksuSpiewaZgwiazdami=(k: KoksuZMikrofonem)=>"spiewanie"

    val telewizja = (fk:Koksu=>String)=>"dzisiaj w  telewizji" + fk(new Koksu)

    telewizja(wywiady)                                //> res1: String = dzisiaj w  telewizji wywiady
    telewizja(napierdalanie)                          //> res2: String = dzisiaj w  telewizji napierdalanie
    //telewizja(koksuSpiewaZgwiazdami) - to się nie kompiluje

Mamy tutaj standardowego koksa jako argument przekazywany do funkcji, która to funkcja (z racji tego, że sama jest typem) została przekazana do funkcji wyższego rzędu. Nasz standardowy koks może wziąć udział w wywiadach bo ta funkcja oczekuje właśnie koksa. Może wziąć udział w napierdalaniu (czyli ćwiczeniach), gdyż ta funkcja oczekuje dowolnego kulturysty czyli jest podtypem każdej funkcji, która przyjmuje koksa bo można ją zawsze przekazać w jej miejsce. Ostatnia funkcja oczekuje specyficznego koksa z mikrofonem i tutaj niestety kod się nie kompiluje.

A teraz to drugie z plusem

Teraz druga część - COVARIANCE. To jest bardziej intuicyjne bo tutaj typy idą niejako w tym samym kierunku co funkcje : trait Function1[-T1,+R]). Ponownie użyjemy znanej struktury typów

class Alkohol
class Metanol extends Alkohol
class Etanol extends Alkohol
class Browar extends Etanol
class RozwodnionyBrowar extends Browar
class Wóda extends Etanol

I do tego metodki :

val generycznaReceptaSpozywcza=()=>new Etanol
val receptaNaBrowar= ()=> new Browar
val receptaNAWódęZMety=() => new Metanol

class Wytwornia{
 def realizuje(recepta:() => Etanol) = recepta()
}

Mamy klasę wytwórnia, która spodziewa się bezparametrowej funkcji zwracającej Etanol. Czyli na bank do wywołania pasuje generycznaReceptaSpozywcza. No i dalej już powinno być jaśniej, że nie można tykać metody z Metanolem bo ludzie poumierają. Idzie taki Zdzisław do sklepu i zamiast produktu do konsumpcji spożywczej dostaje paliwo rakietowe (nie mylić z rocket fuel). Ale jak zamiast dowolnego Etanolu dostanie Browara to jest ok. Czyli tutaj funkcja, która jest podtypem również zwraca podtyp - to powinno być łatwiejsze do zrozumienia.

Post Scriptum o przykładzie

Pomimo, że przykład alkoholowy używa mainstrimowej analogii to jednocześnie pragnę przypomnieć, że alkohol w dużych dawkach jest niezdrowy.

Dalsza Lektura

Doskonałą lekturą uzupełniającą jest tenże link == o tutaj ==> Covariance_and_contravariance_(computer_science). I chociaż czasem ludzie podchodzą trochę nieufnie do artykułów na wikipedii to jednak informacje techniczne moim zdaniem są tam umieszczony w sposób obiektywny, zorganizowany i łatwy w nawigacji.

niedziela, 4 sierpnia 2013

W stronę kultury "wartości" - zrozumienie wartości grupy

Co ma wspólnego niszczenie lasów z projektami IT? Istnieje bardzo ciekawe badanie odnośnie tego pierwszego zagadnienia, które powinno wymusić ciekawe przemyślenia odnośnie naszego IT - i co najważniejsze pokazać jasno, że kierunek samoorganizacji jest słusznym kierunkiem towarzysze!

Eksperyment był zorganizowany przez ekonomistkę Elinor Ostrom i odbył się w 1994 roku. Początek jest niepozorny :

  • Mamy ośmiu studentów
  • Każdy ma 25 żetonów (które mają być po eksperymencie zamienione na prawdziwe pieniądze)
  • Żetony inwestować można na dwóch rynkach
    • Rynek pierwszy oferuje stały mały zysk
    • Rynek drugi jest ciekawszy. Inwestując w ten rynek zyskujemy wiele - ale jest jedno ale - im więcej osób inwestuje w ten rynek tym mniejszy zysk otrzymujemy, aż w pewnym momencie inwestycje zaczynają przynosić straty

Być może jeszcze nie widać naturalnego powiązania z gównem w projektach IT ale to nic nie szkodzi. Sytuację pomogą zrozumieć nam mamuty ( a w zasadzie ich mięso)

Jak się robiło projekty 10 000BC

Wesoła gromadka jaskiniowców liczy 5 osobników. Biegaja oni codziennie na polowanie i starają się kamieniem czy dzidą trafić mamuta. Nawet jeśli pomiędzy naszymi jaskiniowcami istnieją jakieś różnice w zdolnościach myśliwskich to i tak intuicyjnie wiedzą, że polując w grupie każdy z nich ma większe szanse zasnąć dziś z pełnym brzuchem.

Mamut jest dosyć nieprzewidywalny. Nie da się zrobić wykresu Gantta z planem polowania. Roadmapa też zbytnio się nie przydaje. W całym procesie jest dużo miejsca na przypadkowość i szczęście/nieszczęście. Tego dnia Mamuta upolował akurat Roman. Teoretycznie to Roman powinien dostać awans... znaczy największy kawał mięsa (całego mamuta i tak nie zje). Ale Roman jeszcze nie był na szkoleniu managerskim i intuicyjnie przeczuwa, że za jakiś czas to on będzie miał mniej szczęścia i będzie potrzebował pomocy swoich towarzyszy. Postanawia się równoprawnie podzielić mięsem (chociaż sam zatrzymał dla siebie kieł żeby mieć +5 do lansu we wiosce - 100tys lat później jego potomkowie będą w tym celu używać certyfikatów).

Pytanie czy Roman postępuje rozsądnie dzieląc się mięsem ze wszystkimi. Wiesiek już raz go uratował od głodu gdy ten miał skręconą nogę ale z sprawa z Bytomirem wygląda inaczej. Bytomir ostatnio jakośnic nie upolował. Niby coś tam biegał ale nic z tego nie wynikało. Roman ma dylemat czy robi aby na pewno dobrze dzieląc się mięsem z Boromirem. Ponieważ system karny jeszcze się nie rozwinął w wiosce Romana, więc nie wie on, że dylemat, który przeżywa to dylemat więźnia...

Dylemat więźnia - symulacja w scali

Jeśli ktoś nie słyszał to dylemat więźnia to coś takiego : Złapano dwóch więźniów - jeśli obydwoje milczą - dostają 6 miesięcy , jeśli obydwoje sypią - to dostają po 2 lata a jeśli jeden sypie a drugi milczy to ten co sypał wychodzi na wolność a milczący dostaje 5 lat.

\ X Y
X 6 miechów 5 lat
Y 0 2 lata

Więźniowie tak jak i nasi jaskiniowcy mogą przyjąć pewne taktyki. Poniżej mała wypocona symulacja w scali, która powinna pomóc zrozumieć pewne konsekwencje wyborów

 
class Caveman(val id: Int) {
  private var value = 10;

  def updateValue(addition: Int) = { value = value + addition }

  override def toString = id + " : " + value
}

Każdy jaskiniowiec zaczyna grę z określoną ilością "wartości". Wartości będzie przybywać lub ubywać w zależności od przyjętej strategii interakcji. Zdefiniujmy dwa typy interakcji

 
abstract class Interaction() {
  def result(otherResponse: Interaction): (Int, Int)
}

object Positive extends Interaction {
  override def result(otherResponse: Interaction): (Int, Int) = {
    otherResponse match {
      case Positive => (2, 2)
      case Negative => (-5, 5)
    }
  }
}
object Negative extends Interaction {
  override def result(otherResponse: Interaction): (Int, Int) = {
    otherResponse match {
      case Positive => (5, -5)
      case Negative => (-2, -2)
    }
  }
}
\ Positive Negative
Positive 2 -5
Negative 5 -2

Więc jeśli obydwaj jaskiniowcy współpracują zyskują wartość 2. Jeśli obydwoje się próbują oszukać tracą 2. Zaś jeśli jeden wydyma drugiego to ten pierwszy otrzymuje nagrodę 5 a drugi karę -5. Jak więc zagrają nasi jaskiniowcy? Na początek mają do wyboru dwie strategie

 
abstract trait InteractionStrategy {
  protected val interactionHistory = Map[Int, Interaction]()
  val id: Int
  def interact(other: InteractionStrategy): (Int, Int)
  def interactionType(cavemanID: Int): Interaction
}

trait Naive extends InteractionStrategy {
  override def interactionType(cavemanID: Int) = Positive

  override def interact(other: InteractionStrategy): (Int, Int) = {
    Positive.result(other.interactionType(this.id))
  }
}

trait Aggresive extends InteractionStrategy {
  override def interactionType(cavemanID: Int) = Negative

  override def interact(response: InteractionStrategy): (Int, Int) = {
    Negative.result(response.interactionType(id))
  }
}

Strategia Naiwna zawsze oczekuje współpracy a strategia Negatywna zawsze chce wydymać partnera.

 

 def main(args: Array[String]): Unit = {
    val hungerValue = -1
    val caveman1 = new Caveman(1) with Naive
    val caveman2 = new Caveman(2) with Naive
    val caveman3 = new Caveman(3) with Naive
    val caveman4 = new Caveman(4) with Naive
    val caveman5 = new Caveman(5) with Naive

    val group = List(caveman1, caveman2, caveman3, caveman4, caveman5)

    for (i <- 1 to 10; firstCaveman <- group; secondCaveman <- group if firstCaveman.id != secondCaveman.id) {
      val interactionResult = firstCaveman.interact(secondCaveman)
      firstCaveman.updateValue(interactionResult._1)
      secondCaveman.updateValue(interactionResult._2)

      firstCaveman.updateValue(hungerValue)
      firstCaveman.updateValue(hungerValue)
    }

    group.foreach(println(_))
  }

Uwagi i wnioski do sprawozdania

Na początek niech każdy jaskiniowiec reprezentuje naiwną strategię - zaczynamy od wartości=10.

1 : 90
2 : 90
3 : 90
4 : 90
5 : 90

Całkiem nieźle - w trakcie 10 rund i interakcji każdego z każdym nasi jaskiniowcy zyskali po 80 jednostek wartości. No ale co gdy w końcu pojawi się ktoś kto zechce dymać frajerów?

    val caveman1 = new Caveman(1) with Naive
    val caveman2 = new Caveman(2) with Aggresive
    val caveman3 = new Caveman(3) with Naive
    val caveman4 = new Caveman(4) with Naive
    val caveman5 = new Caveman(5) with Naive

1 : -50
2 : 330
3 : -50
4 : -50
5 : -50

No i wydymał ich - koniec snów o Utopii - co się stanie jak coraz więcej osób przyjmie taką postawę?

    val caveman1 = new Caveman(1) with Naive
    val caveman2 = new Caveman(2) with Aggresive
    val caveman3 = new Caveman(3) with Naive
    val caveman4 = new Caveman(4) with Aggresive
    val caveman5 = new Caveman(5) with Naive

1 : -190
2 : 190
3 : -190
4 : 190
5 : -190

Frajerzy są coraz bardziej dymani ale z drugiej strony cwaniacy muszą się dzielić zyskiem. A co gdy każdy przycwaniaczy?

    val caveman1 = new Caveman(1) with Aggresive
    val caveman2 = new Caveman(2) with Aggresive
    val caveman3 = new Caveman(3) with Aggresive
    val caveman4 = new Caveman(4) with Aggresive
    val caveman5 = new Caveman(5) with Aggresive

1 : -230
2 : -230
3 : -230
4 : -230
5 : -230

Nasza populacja wymarła. Okazuje się, że bycie kimś naiwnym opłaca się gdy wszyscy są naiwni. Z drugiej strony bycie cwaniakiem opłaca się najbardziej wśród frajerów. Miałem kiedyś kolegę, który jeździł na mecze i napierdalał kogo się da. Opowiadał, że raz na meczu pucharowym grali gdzieś na wsi i tam miejscowi przywitali ich z uśmiechem chlebem i solą na zawodach. No i ci z widzewa się cieszyli, że w 20 wpie***olili tam 100 osobom. Etyka postępowania była zakorzeniona tak w jednych jak i w drugich. Wielu ludzi, którzy ustanawiają procedury w korporacjach błędnie zakładają, że ludzie przyjmują strategie logicznie i świadomie - dlatego procesy i procedury lubią nie działać - ale o tym za chwilę. Zobaczmy inną ciekawą strategię.

Tit for tat

Tit for tat w spełnia jedno prawoo - "czyń bliźniemu swemu co on tobie uczynił" - w kodzie to będzie wyglądało mniej więcej tak :


trait TitForTat extends InteractionStrategy {
  override def interactionType(cavemanID: Int): Interaction = {
    interactionHistory.get(cavemanID).getOrElse(Positive)
  }

  override def interact(response: InteractionStrategy): (Int, Int) = {
    val otherInteraction = response.interactionType(id)
    val interactionResult = interactionType(response.id).result(response.interactionType(id))
    interactionHistory.put(response.id, otherInteraction)
    interactionResult
  }
}

Tutaj kod robi się bardziej skomplikowany (chociaż nie wiem czy tylko dlatego, że strategia jest bardziej złożona czy dlatego, że dopiero raczkuję w scali). Tutaj nie ma przebaczenia - pamiętamy co nam zrobili inni i odwdzięczamy się im tym samym. Strategia wydaje się być idealna - będziemy niszczyć cwaniaków i współpracować z tymi, którzy chcą współpracować. Zobaczmy.

    val caveman1 = new Caveman(1) with Naive
    val caveman2 = new Caveman(2) with TitForTat
    val caveman3 = new Caveman(3) with Naive
    val caveman4 = new Caveman(4) with Naive
    val caveman5 = new Caveman(5) with Naive

1 : 90
2 : 90
3 : 90
4 : 90
5 : 90

To było do przewidzenia - wszyscy współpracują

    val caveman1 = new Caveman(1) with Naive
    val caveman2 = new Caveman(2) with TitForTat
    val caveman3 = new Caveman(3) with Naive
    val caveman4 = new Caveman(4) with Aggresive
    val caveman5 = new Caveman(5) with Naive

1 : -50
2 : 7
3 : -50
4 : 197
5 : -50

Cwaniak ma się dobrze ale TitforTat przetrwał jednocześnie wspierając współpracę.

    val caveman1 = new Caveman(1) with TitForTat
    val caveman2 = new Caveman(2) with TitForTat
    val caveman3 = new Caveman(3) with Naive
    val caveman4 = new Caveman(4) with Aggresive
    val caveman5 = new Caveman(5) with TitForTat

1 : 7
2 : 7
3 : -50
4 : -62
5 : 4

Przy trzech TitforTat cwaniak został spacyfikowany ale nie ma jeszcze widocznego zysku. Zwiększmy trochę gromadę.

    val caveman1 = new Caveman(1) with TitForTat
    val caveman2 = new Caveman(2) with TitForTat
    val caveman3 = new Caveman(3) with TitForTat
    val caveman4 = new Caveman(4) with Aggresive
    val caveman5 = new Caveman(5) with TitForTat
    val caveman6 = new Caveman(6) with TitForTat
    val caveman7 = new Caveman(7) with TitForTat
    val caveman8 = new Caveman(8) with TitForTat

1 : 67
2 : 67
3 : 67
4 : -333
5 : 64
6 : 64
7 : 64
8 : 64

No i cwaniak jest totalnie zmasakrowany a grupa kwitnie. Gdzie jest haczyk? haczyk jest w tej linijce kodu :

interactionHistory.get(cavemanID).getOrElse(Positive)

Ta implementacja TitForTat zakłada optymistyczny początek - a co jeśli np. zaczynamy z kimś współpracę i źle odczytamy jego intencje?

interactionHistory.get(cavemanID).getOrElse(Negative)

    val caveman1 = new Caveman(1) with TitForTat
    val caveman2 = new Caveman(2) with TitForTat
    val caveman3 = new Caveman(3) with TitForTat
    val caveman4 = new Caveman(4) with Aggresive
    val caveman5 = new Caveman(5) with TitForTat
    val caveman6 = new Caveman(6) with TitForTat
    val caveman7 = new Caveman(7) with TitForTat
    val caveman8 = new Caveman(8) with TitForTat

1 : -410
2 : -410
3 : -410
4 : -410
5 : -410
6 : -410
7 : -410
8 : -410

Totalna rozpierducha. Czy można coś dalej z tym zrobić? Przydałoby się dać jakoś druga szansę spróbować szukać porozumienia. Okazuje się, że istnieje dosyć prosta strategia, która jest w stanie przeskoczyć ten problem ale istnieje też jeden mały warunek...

Entering Pavlov

Z tego co zrozumiałem chodzi o innego Pavlova niż tego do psa. Idea strategi Pavlova jest prosta - jeśli nie zyskałeś nic w tej interakcji to następnym razem spróbuj czegoś innego.

Taktyka wygląda tak (TitforTat cały czas ustawione na negatyw) :


trait Pavlov extends InteractionStrategy {

  override def interactionType(cavemanID: Int): Interaction = {
    interactionHistory.get(cavemanID).getOrElse(Negative)
  }

  override def interact(response: InteractionStrategy): (Int, Int) = {
    val otherInteraction = response.interactionType(id)
    val myInteraction = interactionType(response.id)
    val interactionResult = interactionType(response.id).result(response.interactionType(id))
    updateHistory(response, myInteraction, interactionResult)
    interactionResult
  }

  def complementaryInteraction(interaction: Interaction) = {
    interaction match {
      case Positive => Negative
      case Negative => Positive
    }
  }

  private def updateHistory(response: InteractionStrategy, myInteraction: Interaction, interactionResult: (Int, Int)): Option[com.wlodar.virtues.Interaction] = {
    if (interactionResult._1 > 0)
      interactionHistory.put(response.id, myInteraction)
    else
      interactionHistory.put(response.id, complementaryInteraction(myInteraction))
  }
}

    val caveman1 = new Caveman(1) with TitForTat
    val caveman2 = new Caveman(2) with TitForTat
    val caveman3 = new Caveman(3) with TitForTat
    val caveman4 = new Caveman(4) with Pavlov
    val caveman5 = new Caveman(5) with TitForTat

1 : -155
2 : -155
3 : -155
4 : 34
5 : -151

Nie zadziała to tylko w jednym przypadku - jeśli TitForTat nie zajęły się cwaniakami

    val caveman1 = new Caveman(1) with Pavlov
    val caveman2 = new Caveman(2) with Aggresive
    val caveman3 = new Caveman(3) with Pavlov
    val caveman4 = new Caveman(4) with Pavlov
    val caveman5 = new Caveman(5) with Pavlov

1 : -197
2 : 50
3 : -187
4 : -177
5 : -167

Między podsumowanie

Wygląda na to, że najlepiej dla grupy będzie gdy najpierw odpowiednia liczba osób przyjmie strategie TitForTat by wyeliminować cwaniaków a następnie zmienią rolę na bardziej "pro-współpracującą".

Ok co mamy :

  • Eksperyment z żetonami - do tego jeszcze wrócimy
  • Podział dóbr wspólnych stanowił podstawę przetrwania struktur pierwotnych
  • W przypadku interakcji możemy przyjąć wiele strategii - to co tutaj opisałem to jedynie amatorskie muśnięcie po teorii gier
  • Wraz z ewolucja systemu zmienia się skuteczność poszczególnych ról
No i ważne pytanie - czy współpracę mamy we krwi czy raczej jest to coś sztucznie wytworzonego?

Cialdini i Teoria wpływu na ludzi

http://lubimyczytac.pl/ksiazka/66811/wywieranie-wplywu-na-ludzi-teoria-i-praktyka - to pozycja, którą podnieca się masa wanna-be managerów od pralek wydobywających z niej pseudotechniki wpływu i pseudo-zarzadzania. Co nie zmienia faktu, że książka jest w istocie swoistą skarbnicą wiedzy psychologicznej. Pamiętam kiedy pierwszy raz ja przeczytałem miałem tzw. moment "brainfuck" - "Jakim to ku*wa prawem moje zachowania kontrolują jakieś instynkty?".

A jednak. Książka porusza kilka ciekawych "praw" (zasada autorytetu - to trzeba zneutralizować jak najszybciej jeśli chce się eksplozji kreatywności w zespole). Jednym z nich jest Zasada wzajemności - która to tłumaczy dlaczego w tesco stoją sobie młode laski zapraszając na degustację. Jednym ze słynnych przypadków wspomnianych w książce jest akcja Hari kriszna (czy jak to się tam pisze) z dawaniem kwiatków na lotnisku i oczekiwaniem w zamian datku. Co by nie mówić zasada wzajemności a w zasadzie zasada współpracy jest zakorzeniona w ludziach i więle technik manipulacyjnych ją wykorzystuje.

Zresztą nie tyczy się to tylko ludzi. W książce "Origins of virtue", której okładka powinna być widoczna po lewej stronie, znajduje się masa przykładów ze świata zwierząt. Nietoperze, które pamiętają jaki osobnik podzielił się z nimi jedzeniem, poprzez małpy wchodzące w sojusze a kończąc na delfinach. I to jest ciekawy przykład zawarty w książce bo według autora istnieje podgatunek delfina o bardzo rozwiniętej strukturze społecznej (i relatywnie rozwiniętym mózgu). Osobniki tego gatunku nie tylko pamiętają, które jednostki z nimi dobrze współpracowały ale generalnie które grupy jako takie przysłużyły im się pomocą. A wynik współpracy też jest ciekawy bo polega na pomocy przy porywaniu i gwałceniu samic delfinów. To taki ukłon w kierunku tych co to mówią, że ludzie są źli a królestwo zwierząt to utopia.

Ok czyli mamy taki oto obraz : współpraca to naturalny stan grupy ale co jakiś czas pojawi się cwaniak ze strategią eksploatacji zasobów grupy. I ludzie wymyślili prawo aby temu przeciwdziałać - czy prawo działa? Na pewnow pewnych przypadkach może działać lepiej.

Cwaniak aka Free Rider aka Wesoły Czesiek i problem "wspólnego pastwiska"

W 1968 niejaki ekolog Garrett Hardin opisał następujący problem - mamy ogólnie dostępne pastwisko - gdy każdy z mieszkańców wsi będzie maksymalizował swój zysk i wypasał wszystkie swoje krowy to trawa nie odrośnie i wszyscy stracą. W tym przypadku najlepiej wyjdzie jedna osoba, która łamie reguły podczas gdy inni ich przestrzegają.

Więc może ustalić odgórne prawa, które będą przestrzegane i wszystko będzie super. Jedna osoba wypasa jedną krowę i już. I dupa - zdjęcie obok przedstawia przykład przestrzegania prawa. To okolice dworca PKP Widzew. Generalnie tam leży masa śmieci i jakoś ludzie mają w dupie prawo. I może jakieś trole beda mówić, ze to tylko w Polsce ale wspomniana na samym początku Elinor Ostrom twierdziła inaczej. (Zresztą w książce "Origins of virtue" można znaleźć masę przykładów z całego świata jak nacjonalizacja dóbr wspólnych doprowadziła do ich masowej eksploatacji)

Przypomnijmy zasady eksperymentu :

  • Mamy ośmiu studentów
  • Każdy ma 25 żetonów (które mają być po eksperymencie zamienione na prawdziwe pieniądze)
  • Żetony inwestować można na dwóch rynkach
    • Rynek pierwszy oferuje stały mały zysk
    • Rynek drugi jest ciekawszy. Inwestując w ten rynek zyskujemy wiele - ale jest jedno ale - im więcej osób inwestuje w ten rynek tym mniejszy zysk otrzymujemy, aż w pewnym momencie inwestycje zaczynają przynosić straty

Jest to symulacja eksploatacji pastwiska. Gdy tylko jedna osoba to robi zyskuje ale gdy więcej osób zaczyna brać w tym udział tracą wszyscy. Eksperyment był bardzo ciekawy i można o nim sobie poczytać więcej :

Wnioski z eksperymentu
  • Gdy studenci inwestowali niezależnie bez komunikacji - osiągnęli 21% możliwego zysku
  • Gdy pozwolono im się komunikować 55% - przy jednej komunikacji , 73% - przy nielimitowanej komunikacji
  • 37% - gdy zabroniono komunikacji ale postawiono jakieś odgórnie narzucone zasady karania free riderów- czyli tych którzy ciągle inwestowali w drugi rynek
  • I uwaga! Gdy studenci mogli komunikować się dowolnie i mieli możliwość opracowania swoich własnych zasad kar - 93%!
Wniosek jaki wysnuła Ostrom - był następujący : Problemy dóbr wspólnych należy rozwiązywać lokalnie i pozostawić moc (uwaga ważne słowo) samo organizacji w społecznościach lokalnych. A tak po ludzku - Jest sobie małą wieś z jeziorkiem i jak jeden Żdzichu postanowi wywalić swoje śmieci do jeziorka to przecież lokalna społecznosć go spacyfikuje za zaśmiecanie ich jeziorka. właśnie "ich" jeziorka. Badania Ostrom pokazały, że po nacjonalizacji jeziorka ludzie pomału zaczną mieć to wszystko w dupie

Wnioski dla IT

I teraz poprzez analogię. Mamy sobie projekt IT, który jest oficjalnie własnością firmy. Firma sankcjonuje prawa, które są tak naprawdę ogólnikami "dbać o jakość", "dbać o dobro projektu". Można kontrolować każdy aspekt życia projektu podobnie jak można patrolować 24/7 każdy hektar lasu policyjnym helikopterem. Ani jedno ani drugie nie jest efektywne.

Przekazanie teamowi własności do projektu (oczywiście nie prawnej własności ale wykonawczej - czyli jakiej użyć technologii, jakiego repo itd) to początek. Inną kwestia jest edukacja. Jeśli np. Mamy populację kaczek, która jest traktowana jako własność lokalnej społeczności i faktycznie społeczność się nią opiekuje ale nie wie, że kaczek nie można karmić chlebem (słyszałem, że to im pęcznieje tam w brzuchu i zdychają) to pomimo, że każdy wykazuje strategię dobra ogółu to dojdzie do tragedii poprzez brak wiedzy. Podobnie gdy np. team nie rozumie konsekwencji wyboru konkretnej technologii wtedy potrzebuje zewnętrznej wiedzy - ale nie mylić tego z zewnętrznym kontrolowaniem!

To trochę tak jak przypadek kolesia, o którym ostatnio czytałem. Nie pamiętam nazwiska ale generalnie chodziło o to, ze w latach 70 poprzedniego wieku pojechał do wietnamu edukować ludzi w zakresie racjonalnego żywienia. Zamiast narzucać rozwiązania znalazł rodziny, które już być może nieświadomie respektowały reguły poprawnego żywienia i zadbał o to aby poprzez te rodziny odbyła się edukacja większej populacji. W korpo to by odbyło się poprzez zwołanie meetingu i wystosowanie nowych praw i regulaminów co w praktyce średnio działa. Kiedyś był u nas koleś, który chciał na siłę wprowadzić scalę - jedyne co mu się udało to skutecznie obrzydzić każdemu ten język. Kluczem tutaj jest racjonalna edukacja a nie nacisk.

Przekazanie mocy zespołowi może rozwiązać problem free riderów w grupie - czyli takich małych opierdalaczy gdy team pracuje - (no chyba, że wszyscy są nerdami jaskiniowymi i pojawi się jeden cwaniaczek z wysokim EQ - problem jaki może wyniknąć w przypadku tzw. zjawiska naturalnego lidera). Problem gdy grupa działa w narzuconej strukturze hierarchii i free riderem okaże się tzw manager czy tzw. lider. Tutaj nawet nie chodzi o opierdalanie się ale o maksymalizowanie zysków własnych kosztem grupy. Czyli np. wymuszanie na ludziach napieprzania po nocach dla realizacji jakiegoś nierealnego deadlinu. Manager ma premie, kod jest zjebany a ludzie wypaleni - jeśli to nie jest projekt z cyklu "tych złotych" to długookresowo firma traci.

Dodatkowe linki

niedziela, 14 lipca 2013

W stronę kultury "wartości" - część pierwsza - pojęcie kultury

Model - Tribal Lidership

Lubie, po prostu uwielbiam szczerze teorie, które starają się zgłębić pełen kontekst danego zjawiska zamiast częstować czytelników prostymi pseudo-rozwiązaniami w stylu "oto nasza niezwyciężona praktyka" albo "oto narzędzie ostatecznej chwały!".

W tym odcinku zobaczymy bardzo ciekawy model kultury a jak zwykle podczas opisywania modelu bywa, warto przypomnieć co oznacza słowo "model". Otóż (poza kolesiem reklamującym nowy model pantalonów na sklepowej wystawie) jest to zazwyczaj pewne uproszczenie rzeczywistości, które pomaga z czymś tak złożonym jak rzeczywistość pracować. A mówię o tym dlatego, że w przypadku każdego uproszczenia łatwo znaleźć jakiś jeden przypadek i trolować "niee, niee ja znam taki przypadek..." (oczywiście model staje się niezwykle nieskuteczny gdy znajdziemy więcej przypadków, które mu zaprzeczają niż go potwierdzają - patrz np. "wodospadowy model rozwoju oprogramowania" ;))

Tribal Lidership to model stworzony przez profesora Davida Logana (nie, że fakt iż jest profesorem ma jakieś znaczenie). Prowadził on razem ze swoimi naukowymi ziomkami badania w wielu firmach w okresie ładnych kilkunastu lat a tematem jego pracy były tak wyszukiwane efektywność i produktywność. To co wyróżnia jego podejście od podejść, które do tej pory spotykałem to koncentracja na ludziach a nie bezpośrednio na procesach czy narzędziach. A zwrot "tribal" nie powinien się kojarzyć z bojownikami o wolność wybrzeża kości słoniowej a jedynie jest to takie marketingowe sformułowanie dla grupy społecznej.

Model wyróżnia 5 faz rozwoju kultury, które można szybko podchwycić w obrazkach zapożyczonych poniżej. (jak ktoś chce niech przewinie na sam dół - są tam dwa ciekawe videła z objaśnieniem która faza jest co i po co)


No dobra to pojedli, popili, popatrzyli na tabelki - tera jedziemy zobaczyć..

faza 2 i 3 w naszych kochanych korporacjach

"Moje życie jest do dupy" - " ja jestem zajebisty a ty nie". - akurat te dwie fazy znakomicie koegzystują obok siebie w niektórych firmach. Np. jak często słyszymy takie oto cytaty :

  • "Pracujemy w totalnym syfie"
  • "Nikt poza mną nie martwi się o jakość kodu"
  • "Mój zespół jest niedojrzały"
  • "Gdybym tylko miał lepszych ludzi" - do tego przykrego sformułowania "moi ludzie" jeszcze wrócimy
  • "Pracujemy w chujowych technologiach" - tego akurat ja często używałem w zamierzchłych czasach
  • "{Ktoś tam} jest debilem"
  • itd

Faza dwa i trzy tak doskonale istnieją obok siebie ponieważ doskonale wpisują się w popularny w korpo model zatytułowany "chwalebny lider (i te risorsy co tam klepią w klawiature)"

I tera tak strzałka z D oznacza delegacje - tak łądnie nazywa się w korpo rozkazyweanie. Strzałka z V oznacza wartość - czyli sytuacje, w której pracownik coś faktycznie wyprodukował. Tzw. "lider" agreguje wartość i raportują ją dalej. Model zakłada, że całość kreatywności i planowania leży po jego stronie. Można tutaj wskazywać na wiele wad tego modelu (jego prostota ma też pewne pozorne zalety - pozwala stosować uproszczone modele zarządzania - resoursa łatwo przerzucić pomiędzy kratkami w excelu - nieliniowy element grupy społecznej już nie) ale tutaj skupmy się na relacjach społecznych.

Równie dobrze wspomniany model można rozrysować używając Diad - czyli najmniejszego z możliwych zbiorów społecznych.

Taki związek doskonale wpasowuje się w model "I'm great (but you are not)". Osoba obsadzona w pozycji lidera dostaje od organizacji narzędzia do wydzielania organizacyjnej wartości - pochwały, bonusy itd - osoba na drugim końcu ma zadania "wykazywać się". Jeśli wartość od kropki czerwonej to tylko wartość organizacyjna to wtedy mamy klasyczny "model najemnika", czyli zrobić to co trzeba i do domu.

Oczywiście tak nie zawsze musi być. Osoba "niebieska" może czerpać także wartość z nauki ciekawych technologii (tak to jest element świata IT, z którego zrozumieniem management wychowany na pruskich fabrykach ma ogromny kłopot). Również osoba czerwona może podzielić się wartością, którą otrzymał od organizacji - być może od czasu do czasu można usłyszeć "to nie moja zasługa to oni odwalili kawał dobrej roboty".

Innymi mniej etycznymi sposobami na złamanie syndromu "najemnika" przy zachowaniu klasycznej struktury hierarchicznej są tzw. techniki zarządzania. Tutaj mamy cały wachlarz chwytów w stylu "zapierdalaj a będziesz doceniony" - czasem to prawda a czasem nie - albo manipulowanie emocjami pracownika aby uzyskać tzw. commitmenmt. Inną cechą rozpoznawalną takich struktur jest obecność techniki w stylu "kanapki" - czyli opakowywanie gówna w małe komplementy. Mamy tutaj typowe nastawienie na manipulację emocjami słuchacza. Również w środowisku resoursowo-manipulacyjnym często pojawiają się te zwroty w stylu "moi ludzie, twoi ludzie, wasi ludzie" (autor tutaj pragnie czytelnikowi skromnie przypomnieć, że niewolnictwo jest ustawowo zakazane - chyba)

Oczywiście taki model przynosi rezultaty. Znam kilka firm, które doskonale sobie radzą finansowo kultywując wspomniane struktury. Ich koncept organizacyjny zazwyczaj polega na zatrzymaniu "rdzenia" pracowniczego i wymiany muchomorków jak zaczną za dużo narzekać. Może także pojawić się sytuacja gdzie w pozycji liderującej będzie faktycznie ktoś zajebisty, że akurat taki model okaże się niezwykle efektywny. Cóż trudno dyskutować z czymś co w zestawieniach finansowych wydaje się działać i przynosić zysk. Nie każda firma chce i musi zmieniać świat. ale jeśli już..

Faza 4 - jesteśmy zajebiści

Do tego tanga trzeba przynajmniej trojga. W przypadku Diady bardzo trudno jest osiągnąć sytuację gdzie obydwie osoby są na tym samym poziomie wartości. W przypadku trzech osób szansa, że będą się wzajemnie uzupełniać rośnie. Ze swoich młodych lat na zleceniach przez net pamiętam, że często było tak iż albo grafik zlecał coś programiście albo programista grafikowi. Dopiero gdy pojawiała się triada programista,grafik i jakiś tam handlowiec - wtedy pojawia się szansa, że każde dwie osoby mają większą wartość niż osoba trzecia. (wiem, że trochę przekombinowany przykłąd ale jak byłem młody to dużo piłem i tylko tyle pamiętam)

Podobnie jak w procesie zamarzania lodu tworzą się tzw. zarodki (czy coś takiego wokół czego narastają bryły lodu) - tak i tutaj wokół zarodka narasta kultura czwartego poziomu. I specjalnie piszę o kulturze czwartego poziomu a nie o kulturze "MY" bo kurwa już te słowa "we,team,our" są tak nadużywane w korpo, że o niczym nie mówią. To tak jakby kazać strażnikom w więzieniu kazać mówić "miłość" i udawać, że zakład karny zamienił się w rajską wyspę.

A wracając do naszego teamu...

Ostatni obrazek specjalnie nie zawiera samych słodkości aby pokazać, że team w całości nie musi być idealny aby zapoczątkować w jego części kulturę 4 poziomu. I zobaczymy np. że

  • Ludzie sobie nawzajem pomagają aby osiągnąć wspólny cel i wspomóc grupę w rozwoju. I teraz ważna rzecz. W kulturze 2/3 poziomów jak ktoś dostanie przykaz, żeby pomagał to będzie pomagać - ale jedynie dla swoich egoistycznych potrzeb spełnienia celów krótkoterminowych. Czyli pojawi nam się znowu model najemnika - tym razem w kontekście pracy zespołowej. Różnica może nie wydawać się duża ale jest kolosalna - tylko w pierwszym przypadku dana osoba zrezygnuje z własnego krótkoterminowego zysku dla zysku grupy/projektu/organizacji ( a w przyszłym odcinku dowiemy się dlaczego mimo wszystko osoba na 4 poziomie kieruje się nadal osobistymi korzyściami ;) )
  • W przypadku triad i kultury 4 poziomu rośnie szansa na zjawisko tzw "emergence" (niestety żadne polskie tłumaczenie nie brzmi tak fajnie jak angielskie słówko) czyli sytuacja gdzie system modyfikuje swoje zachowanie niezależnie od układu sterującego - chociaż bardziej zrozumiałe może być zjawisko "inicjatywy oddolnej" czyli np. ludzie sami z siebie zaczynają dbać o jakość kodu a nie dlatego, ze im ktoś kazał. Ludzie sami się dokształcają a nie dlatego, że ktoś im kazał. Ludzie sami, wprowadzają nowe rozwiązania a nie dlatego, że ktoś im kazał (niebezpieczne acz chwalebne). Ludzie sami wychodzą a z inicjatywą a nie dlatego, że im ktoś kazał itd.
Na razie są obiecanki cacanki a gdzie jakieś konkrety! Nie bez powodu w tytule jest "część pierwsza ". Apetyt mam nadzieję nabrany a już niedługo...

  • Jak wycinka lasów państwowych może zaprowadzić nas do czytelnego kodu
  • Jak mamuty doprowadziły do narodzin ekonomii
  • Jak delfiny gwałciciele opracowały użyteczny model współpracy
  • Jak walczyć z wesołymi Cześkami (a.k.a "free rider")
  • I najważniejsze - jak zbudować zespół wokół pojęcia "wartości"

Materiały

niedziela, 7 lipca 2013

Złożoność kodu w realnym świecie - opowiadanie

Przedmowa

Poniżej umieszczam opowiadanie, które napisałem jakiś czas temu pod wpływem impulsu gdy na jednym z forów natrafiłem na kolejny temat z cyklu "mam receptę na idealny świat IT". Zasady działania świata nie wydaje się proste ani tym bardziej logiczne a dla tych którzy w to nie wierzą, polecam poszukać sobie w necie dokumentu (ok 70 stron) o Prawie Parkinsona .

A co do opowiadania to dodałem trochę treści gdzie starałem się opisać rozleglej stany wewnętrzne i motywy bohaterów. Ponadto dodałem zajebistą grafikę. No i wniosek na zakończenie - obok problemów, które opisywałem w kilku poprzednich odcinkach - niestety złożoność kodu rodzi się najszybciej z powodu ludzkiej głupoty i ignorancji...

PROLOG - MROCZNE WIDMO

Rysiek - prezes największego w mieście warsztatu samochodowego - stał lekko pochylony na przeciw wielkiej przeszklonej ściany, którą kazał zbudować w swoim biurze aby móc podziwiać rozległą panorame miasta. Ale nie budynki czy też zachodzące słońce przyciagnęło uwagę Ryśka tego wieczoru. Z poziomu 23 piętra jego budynku spacerujący ludzie wyglądali niczym małe mrówki, małe punkciki próbojące dostać się z jednego miejsca do drugiego bez wydawałoby się żadnego konkretnego celu. W głębi duszy Rysiek trochę im zazdrościł. Każdy z punkcików wydawał się żyć w swojej małej mikro-rzeczywistości odizolowanej mentalną ścianą od praw rządzących tym prawdziwym światem. Nieważne. Na jego twarzy pojawił się uśmiech gdy tak jak miliony razy wcześniej do świadomości przebiła się myśl, że przecież on jest tutaj na górze a oni tam na dole.

- Panie Romanie, przeszedł Stefan, ten ze spółdzielni - Głos pani Ilonki - sekretarki Ryśka - wyrwał go z głębokich rozmyślań.
- Niech wejdzie

To będzie dobry dzień. Rysiek lubił kiedy przychodził do niego worek pieniędzy rozmawiać o kolejnym projekcie motoryzacyjnym. W świecie gdzie o pieniądzach decydują ludzie, którzy o motoryzacji słyszeli tylko z książek i prezentacji handlowych, Rysiek umiał sprawić aby wszystkie drogi prowadziły do niego...

ROZDZIAŁ 1 - ODLEGŁE MARZENIA

- Proszę za mną panie Stefanie, prezes może teraz pana przyjąć.

Głos pani Ilonki wzbudziły w Stefanie uczucie lekkiego podniecenia. Stefan był o krok od otrzymania pokaźnej premii od prezesa spółdzielni i zakupu swojego wymarzonego dębowego kredensu na werandę, którego na pewno będą zazdrościć mu wszyscy sąsiedzi. Marzenie o kredensie zrodziło się w głowie Stefana bardzo dawno. Być może jego źródło lezały gdzieś w jego młodości gdy koledzy nie chcieli grać z nim w piłkę z pwoodu jego dziurawych trampek?

A może przyczyną było to, że nigdy nie stać go było na bardziej wytrawne wina co prawie przypłacił utratą życia i płukaniem żołądka.

Wszystko zaczęło się dwa lata temu kiedy Zbyszek - prezes spółdzielni mieszkaniowej im. Bohaterów Stadionu Narodowego - wezwał do siebie Stefana i przedstawił mu wizję swojego nietuzinkowego projektu.


- panie Stefanie przedstawię teraz panu wizję swojego nietuzinkowego projektu. Otóż po ostatnich podwyżkach czynszu nasz komornik Wacław nie wyrabia się ze zbieraniem zaległości. Wacław w przyszłym tygodniu kończy 60 lat i niestety nie ma już tych sił co kiedyś gdy mógł eksmitować trzy rodziny dziennie. A, że Wacka wymienić nie możemy bo Wacek to wie dobrze jak u nas w spółdzielni rzeczy działają to wymyśliłem, że zbudujemy mu wózek - wie pan taki elektryczny bo benzyna jest droga - wydatki podciągniemy jakoś pod budżet na ochronę środowiska i będzie git. I tutaj na scenę wchodzi pan panie Stefanie. Znajdzie pan jakiś porządny warsztat i niech no nam zbudują taki wózek a jak mnie pan panie Stefanie nie zawiedzie to i jakaś nagroda się znajdzie.

Stefan popytał tu i ówdzie, poszukał w ogłoszeniach i znalazł solidnego wykonawcę - „Mech Ryszard Solutions” - duża, więc na pewno solidna firma bo duża. I chociaż początki nie były łatwe bo przez pierwsze pół roku pracownicy Ryśka pokazywali mu jakieś bloczki, rysunki kółek i jakichś dziwnie pokręconych śrubek. Po co mu to pokazywali? nie wiedział. Gówno go interesowały jakieś śrubki. Koniec końców gdy zobaczył pierwszy jeżdżący model wysłał fotę do prezesa, który ostatnio robił się coraz bardziej nerwowy. Stefan pamiętał ten dzień gdyż właśnie wtedy po raz pierwszy w wyobraźni

poczuł zazdrość sąsiadów na widok jego zajebistego kredensu...

ROZDZIAŁ 2 - PLANY A RZECZYWISTOŚĆ

Masywne drzwi gabinetu pana Ryszarda otworzyły się ukazując wszechstronne wnętrze wykończone w stylu gotycko-greckim.


- Panie Stefanie zapraszam do środka, co pana do mnie dzisiaj sprowadza? Jak sprawuje się nasz wózek.

- Dzień dobry panie Ryśku. Wózek? Wózek sprawuje się świetnie ale nastąpiło coś czego nie przewidzieliśmy. Ostatnio gdy pan Wacek wracał sobie spokojnie po uczciwie przepracowanym dniu z zebranymi pieniędzmi - nie uwierzy pan co się stało - jakieś niecne draby wpadły na wózek pana Wieśka i wyrwały mu torbę z pieniędzmi. Rozmawiałem z prezesem i stwierdziliśmy, że musimy zamontować na wózek jakiś system ochrony dla pana Wieśka , wie pan jakieś miotacze ognia czy coś w tym stylu.
- Świetnie panie Stefanie, świetnie. Zawołam Cześka, naszego specjalistę od skręcania i wkręcania tego i owego.

Stefan znał Cześka. To ten, który zawsze mówił, że wszystko jest pod kontrolą nawet wtedy gdy termin oddania wózka przesuwali po raz trzeci. Znał go i trochę nawet obawiał się rozmowy z nim. Nie chodziło o jakieś kłótnie czy coś podobnego. Wręcz przeciwnie. Czesiek umiał opisać bardzo plastycznie jak wszystkie części pojazdu będą współdziałać gdy osiągnie on ostateczną wersję. Stefan się go bardzo obawiał gdyż zawsze po rozmowie z nim wychodził pełen spokoju ale zawsze tak gdzies po godzinie przypominał sobie, że przecież nie ma pojęcia o motoryzacji, częściach i jak to wszystko działa.

W drzwiach pojawił się pewny siebie jak zwykle Czesiek. Przez 5 minut nasłuchiwał się opowieścią Stefana i nowym wymaganiom co do miotaczy ognia.

- rozumiem panie Stefanie , to będzie kosztować bańkę.

Stefan przypomniał sobie o zaległych badaniach u laryngologa, przez chwilę wydawało mu się, że usłyszał "bańkę".

- ile to będzie kosztować?
- bańkę!

Stefan opadł na fotel. Wyobrażenie kredensu zaczęły przesłaniać twarze kolegów wyśmiewających jego dziurawe trampki.

- czy was coś popierdoliło!
- o co panu chodzi panie Stefanie?
- jak to bańkę?
- ano tak to. Pana wózek nie jest przystosowany do montowania miotaczy ognia. W zasadzie pana wózek nie jest przystosowany do żadnego systemu obrony.
- (prezes mnie zajebie) ludzie czy was pojebało. Myślałem, że pracuję z profesjonalistami!
- niech się pan uspokoi, pierwotna specyfikacja nie zakładała montowania żadnego systemu obrony.
- skąd miałem wiedzieć, że będzie potrzebne coś takiego. Myślałem, że to wy jesteście specjalistami od wózków.
- cóż miotacze ognia to nie jest standardowe wyposażenie wózków...
- ale bańka?!?
- panie Stefanie terminy były mocno napięte. Mechanicy musieli na szybko powkręcać śrubki tu i ówdzie. Teraz będzie trudno to poodkręcać.
- co?!
- gdyby tylko zapłacił pan za pełną 5 letnią analizę to mielibyśmy czas porządnie zaplanować każdy gwint panie Stefanie

kurwa, kurwa, kurwa - myśli Stefana były dosyć prostolinijne w tym momencie. Jak prezes się dowie to go zajebie! Nie ma mowy żeby zamówić nowy samochód - drugi raz wałek z dotacjami unijnymi nie przejdzie. Zresztą nie ma czasu. Ale zaraz zaraz, dlaczego wkręcanie śrubek to taki problem. Stefan widział kiedyś jak mechanicy siedzieli w swoich boksach i skręcali śrubki - nie wydawało się to trudne. To Rysiek! Ta pijawka chce zedrzeć z niego ostatni grosz. Trzeba poszukać kogoś innego - na pewno jest ktoś inny...

ROZDZIAŁ 3 - OKRUTNY ŚWIAT

"Firma Mietek Mechanics Consulting to pewny partner z bogatymi tradycjami". Taki napis zauważył Stefan nad drzwiami zakładu mechanicznego, który polecił mu znajomy na forum. To byłą ostatnia deska ratunku dla Stefana - ostatnia nadzieja na kredens.

Opinie, które słyszał o Mietku napawały go nadzieją przemieszaną jednak z pewnymi obawami. Pomimo, że Mietek miał opinie "złotej rączki" to jednak znajomi wspominali, że lubi on strasznie filozofować komplikując proste rzeczy. Stefan nie chciał wysłuchiwać o jakichś kodeksach, super wydajnych sposobach pracy czy innych takich. Centralnie go to pierdoliło. Chce mieć swój wózek i swój kredens.


- panie Stefanie - głos Mietka nie przejawiał oznak entuzjazmu - niestety nie mam dobrych wiadomości. Pojazd, który nam pan przesłał to istny labirynt. Gdy próbowaliśmy odkręcić lewy reflektor włączyły się wycieraczki a próba wymiany bezpieczników spowodowała wyparowanie płynu hamulcowego.
-(Stefan nie wiele rozumiał z tych słów)

-Ponadto te śrubki. Nie wiem kto wpadł na to aby tak to poskręcać. A tutaj widzi pan tę śrubkę - nikt nie używa takiej technologii wkręcania śrubek od 15 lat. O a żeby odkręcić tę tutaj potrzebny będzie klucz 69 - niestety licencja na klucz 69 kosztuje masę pieniędzy.

-(Stefan nadal nie wiele rozumiał z tych słów)

- A teraz najgorsze. Gdy moi pracownicy dotarli do silnika to kombinacja śróbek jaką napotkali sprawiła, że jeden oznajmił iż pierdoli tę robotę i odchodzi aby założyć punkt skręcania długopisów. Drugi zaś zamknął się w magazynie i od dwóch godzin pomimo próśb nie chce otworzyć drzwi.

-Czy.. da.. się.. coś .. zrobić..

- Cóż przyznam szczerze, że będziemy musieli porozkręcać i poprzekręcać jakieś 80%-90% wózka.

- Ile...

- dwie bańki

Stefan opadł na podłogę. Nawet było mu wszystko jedno czy podjedzie po niego Łódzkie pogotowie...

ROZDZIAŁ 4 - OCALENIE

Być może Stefan potrzebował odpoczynku a być może to uderzenie o podłogę sprawiło, że jego umysł sam odnalazł rozwiązanie. "Spółdzielczy budżet na nowe technologie". Trzeba tylko zamontować dodatkowy monitor, który będzie sterował miotaczem ognia, nazwie się to "ochrona 2.0" i rada spółdzielni na pewno to kupi!


- panie Stefanie cieszę się, że pan do nas wrócił - Rysiek w głębi duszy śmiał się szyderczo gdyż wiedział, że oni zawsze wracają - nie mają wyboru Zapoznaliśmy się z pana koncepcja monitora sterującego - teraz to będzie kosztować półtorej bańki
- nie ważne. Uzbieramy kasę - podniesiemy czynsz albo wymyślimy jakieś opłaty za wywóz śmieci czy coś takiego. Róbcie, róbcie jak najszybciej , Wacław nie może zbierać odsetek
- tylko tutaj jeden podpis i zaczynamy
- czy tym razem będę mógł wcześniej wypróbować wózek?
- my tak nie pracujemy panie Stefanie...

Stefan nie miał wyjścia. To będzie długa współpraca. Nie wiadomo jakie jeszcze niebezpieczeństwa niesie ze sobą świat rzeczywisty, świat tak bardzo nieprzewidywalny. Stefan zrozumiał, ze to będzie długa współpraca....

EPILOG

Rysiek spoglądał zadowolony poprzez szklaną ścianę na spacerujace 20 pięte3r niżej punkty. Ten cały Stefan z tym dziwnym pomysłem na wózek. To będzie kolejny długoletni klient – oni wracają zawsze wracają.


- panie prezesie – Rozmyślania przerwał Czesiek – mamy mały problem. Okazało się, że blachy nie da się nagwintować tak jak planowaliśmy.
- To niech kręcą jak mogą
- Tak też im powiedziałem
- Więc w czym jest problem?
- Bolek z dziewiątki ma znowu rozterki natury moralnej. Narzeka, na bajzel wśród śrubek i chce wprowadzać jakieś dziwne narzędzia czy praktyki do kontroli jakości wkręcania.
- Hoho kurwa jeszcze co! Jak ma aspiracje do układania procesów wytwórczych to może powinien sobie poszukać nowej pracy
- Wydaje mi się, że Bolek ma w tym temacie duże doświadczenie może warto by się chociaż tym razem trochę temu przyjrzeć?
- Czesław, Czesław kiedy ty się nauczysz. Oni są tutaj od napierdalania a nie od myślenia. To najniższa kasta, oni maja się słuchać i nie marudzić. Weź go wyjeb.
- Bolka? A kto go zastąpi?
- Czesław – standardowo - zastąpi go skończona liczba praktykantów. Powiedz Ilonce żeby wrzuciła jakieś ogłoszenie o rekrutacji do młodej dynamicznej firmy pełnej wyzwań i rozwijającej się.

Czesław obrócił się na pięcie i wyszedł realizować zalecenia prezesa. Rysiek odetchnął i spoglądając na panoramę miasta przykrytą łuną zachodzącego słońca pomyślał w zadumie – ciekawe czy oni kiedyś zrozumieją, ciekawe czy kiedyś zrozumieją...