Sporo gier komputerowych (zresztą nie tylko komputerowych) z elementami RPG stosuje tzw. "skill tree" - czyli drzewko kolejnych umiejętności (zachęcam do wklepania "skill tree" w google images), które dana postać może zdobyć/poznać/posiąść. Drzewko jest zorganizowane w taki sposób, że po poznaniu danej umiejętności odblokowuje się kolejna (lub kolejne) - tak więc aby poznać umiejętność Z, być może trzeba najpierw nabyć umiejętność Y, która wymaga X. Jakieś dwa lata temu wpadłem na pomysł, żeby pomysł ten przenieść do IT (programowania/hackingu/RE) - stworzyłem sobie ogólne drzewko rzeczy które chciałbym poznać (np. architekturę ARM), a potem oddzielne drzewko szczegółowe dla każdej umiejętności z drzewka ogólnego. Co ciekawe, kilku znajomych podłapało pomysł i kilka wieczorów spędziliśmy na projektowaniu takich drzewek i dyskusji jaka kolejność jest dla nauki danej rzeczy najlepsza (lub, jak nam się wydaje która będzie najlepsza ;>).
Ostatnio do pomysłu wróciłem, a to za sprawą kilku osób, które próbowały mnie podpytać czego się uczyć (np. w kontekście C++) i w jakiej kolejności. Pomyślałem, że fajnie byłoby stworzyć trochę takich drzewek i rzucić na sieć, ot tak aby początkujący (z danej tematyki) mieli (prawie) pełen obraz czego powinni się uczyć, i jaka jest proponowana (przez osoby które już przez to przeszły, oraz samych zainteresowanych) kolejność.
Niemniej jednak moja wiedza jest ograniczona, a mój punkt widzenia strikte przyczepiony do mnie (a więc zawężony do moich doświadczeń), więc projekt będzie od początku otwarty i będę zachęcał Was do udziału :)
Na ilustracji po prawej (kilk to zoom) widnieje przykładowe (i tak należy to traktować - jako ilustrację, propozycję formy, a nie gotowe do użycia...) drzewko umiejętności dla języka skryptowego BAT (wybrałem BAT z uwagi na jego stosunkowy brak skomplikowania). Jak widać, nie jest to typowe "drzewko", a raczej (jak słusznie zauważył ged_ podczas dyskusji o pomyśle kilka dni temu) DAG (graf skierowany bez cykli).
W tym przypadku, pierwszą umiejętnością do pozyskania są oczywiście "Podstawy składni" - chciałbym zwrócić tu uwagę, że każda umiejętność i tak jest podzbiorem innych - np. w omawianym przypadku (Podstawy składni) mamy do poznania "kolejność wykonywania poleceń", "skoki bezwarunkowe i etykiety" oraz "komentarze".
Po nabyciu powyższych umiejętności można odhaczyć ten "node" i iść dalej do "Zmiennych środowiskowych".
W drugą stronę - jeśli chcielibyśmy się nauczyć "Funkcji", to musimy poznać przynajmniej "Parametry", "Zmienne środowiskowe" i "Podstawy składni".
Jak widać jest to trywialne :)
A teraz sprawy do przedyskutowania / to do:
1. W jakiej technologii prezentować najlepiej takie drzewka? Osobiście skorzystałem z OpenOffice.org Draw (link do .odg na końcu posta), ponieważ można to wyeksportować do PNG, PDF, itp. Natomiast gdyby chcieć zdynamizować trochę takie drzewa (np. po kliknięciu na dany node miałaby pojawiać się lista materiałów/artykułów/linków/książek/etc) to sprawa ogranicza się do PDF lub HTML. PDF nie koniecznie jest wygodny, a eksport grafów do HTML chyba też nie jest trywialny. SVG byłoby niezłe, ale nie każdy browser jeszcze to natywnie supportuje.
2. W drzewku szczegółowym (tj. o danym języku) - na ile rozbijać umiejętności? Czy tak jak na ilustracji jest OK? Czy może rozbić którejś node'y jeszcze bardziej? A może któreś połączyć? Można również iść o krok dalej i stworzyć jeszcze jeden poziom drzew dla sub-skilli - np. z "Podstaw składni" zrobić malutkie, kilku elementowe, drzewo?
3. Jak tworzyć takie drzewa? Osobiście proponuje spisać najpierw umiejętności i je opisać, a potem myśleć o tym którą "połączyć" z którą, etc. Ale równie dobrze można wziąć jedną umiejętność, taką która wydaje się nam najbardziej podstawowa, i wrzucić ją na górę drzewa, po czym wpisywać kolejne umiejętności które zależą od niej, i tak kontynuować w dół drzewa. A może jakiś mieszany pomysł?
4. Zapomnijmy na chwilę że przykładowe drzewko umiejętności jest rzeczywiście przykładowe. Co w nim zmienić? Jakie rzeczy dodać? Co usunąć? Co rozbić a co połączyć?
5. Jeżeli chodzi o ogólne drzewka, w którym np. dla programisty było by to drzewko z kolejnymi językami (Python, PHP, C++, Assembler, etc), narzędziami (obsługa różnych kompilatorów, debuggerów, profilerów), libami (STL, OpenGL, pthreads), algorytmami (np. wyszukiwanie drogi w grafie) i strukturami danych (linked lista, hash lista/hash mapa/słownik, octree etc)... no właśnie... czy rozbijać je ze względu na "profesje"? Osobne dla programisty, inne dla spec. od bezpieczeństwa, a jeszcze inne dla reversera? A może wziąć jakiegoś gosu i go przepytać w jakiej kolejności się uczył i na podstawie tego stworzyć np. "drzewo lcamtufa"? A może oba :) Taak, sądzę, że oba podejścia są dobre i się nie wykluczają.
Po RECON (pojutrze lecę w związku z nim do Montrealu) postaram się zaproponować kilka drzewek i będę zachęcał do ich przedyskutowania :)
Na koniec - link do "źródła" przykładowego skill tree: st_bat.odg (17 KB) - załóżmy, że plik jest na licencji GNU GPL 3 :)
Zapraszam do dyskusji!
2010-07-05:
Comments:
Takie randomowe myśli w związku z tym.
Co do narzędzi to żadnych .odg i innych GUI-based pierdół za przeproszeniem, bo to jest counter-productive i fajne co najwyżej na raz, dwa. Potrzeba czegoś, co można by prosto opisać tekstowo, łyknęłoby i zrobiło grafik. Być może jakiś preprocessing do LaTeX+PGF/TikZ.
Co do wyjścia to wektorowe rozwiązania to jedynie słuszna. PDF byłby OK, ale SVG jest w porządku, bo każda współczesna normalna przeglądarka obsługuje ten format, więc jako output styka. Proszę, nie mów, że martwisz się np. o IE6. :)
Co do tworzenia, to po krótkim namyślę, dochodzę do wniosku, że najlepsze byłoby coś oparte na LOD, ale to wymagałoby dynamicznej formuły by wygodnie zaglądać do ewentualnych podgrafów w węzłach, czyli SVG i PDF odpadałyby. Najwygodniej byłoby mieć coś własnego (pewnie w Qt) z eksportem bieżącego wyniku do SVG chociażby. Kontrolowany poziom szczegółowości (i to nawet raczej właśnie na poziomie węzłów, a nie całego grafu) pozwalałby uniknąć przeładowania informacji w pierwszym rzucie, wciąż umożliwiając wchodzenie w głąb zagadnień. Taki C++... nie, boję się myśleć nad jego lasem tropikalnym.
Co do spektrum obejmowanego przez poszczególne drzewka, to byłbym przeciwny zawężaniu per profesja. Lepszym rozwiązaniem byłoby dodawanie hintów/tagów. Tu znów własna aplikacja byłaby najlepsza, bo pozwalałaby na jakieś podświetlanie czy nawet filtrowanie drzewa wg jakichś z góry przewidzianych helperów/przewodników.
Co do języków w ogóle. Takie drzewka naprawdę dobrze zrobione byłyby bezcenne. Mamy na początku podstawy składni i ewentualnie jej zaawansowane elementy (w przypadku bardziej złożonych języków). Dalej jednak istotna jest filozofia języka, którą można próbować przedstawiać m.in. za pomocą implementacji podstawowych idei w aspekcie danego języka. Oczywiście, można powiedzieć, że znając, dajmy na to, nieszczęsny wzorzec typu singleton, powinniśmy być w stanie zaimplementować go w każdym języku. Jest to jednak półprawda, bo bardzo łatwo zrealizować to źle, po prostu mało (lub niedostatecznie dużo) wiedząc o języku. Najważniejsza i zarazem najcenniejsza umiejętność do nabycia, to pisanie z duchem danego języka. Można znać składnię języka, rozumieć jego filozofię, a wciąż nie umieć pisać w pełni poprawnych (w warstwie syntaktycznej i semantycznej zarówno na poziomie kodu jak i projektowym) aplikacji.
Może ja po prostu za dużo bym chciał od takich drzewek. ;)
ad. 4 - pseudo OOP bym wykluczył poza główny nurt, bo obfuskować i interpretować kod można i bez tego.
i ogólnie - pomysł listy umiejętności jest ciekawy, ale są rzeczy "nie do opisania" - np. zrozumienie filozofii języka albo po prostu "obycie" w pisaniu.
PS. ale drzewko kolejnych języków to już perwersja. Drzewka mają być pomocą w nauce czy planem na całe życie ;)
Może najpierw zebrać zestaw podstawowych umiejętności, które zawierałyby odnośniki do zasobów pozwalających na ich uzyskanie, a zupełnie osobno składać DAGi według uznania? Wtedy każdy mógłby złożyć własny graf nauki np. do jakiegoś certu, który niekoniecznie zgadzałby się w 100% z umiejętnościami potrzebnymi w naturze i kolejnością ich poznawania?
@technologia wyświetlania
Zgadzam się (z tanatos/przemoc) że pomysł z serwisem internetowym sam się narzuca :)
W zasadzie pozwoliło by to na:
1. podejście w stylu wiki - czyli każdy może stworzyć lub zmodyfikować drzewo
2. idąc o krok dalej - dać możliwość "realizacji" danego drzewa, tj. user mógłby sobie odznaczać co już umie, czego się własnie uczy, jak tam mu idzie, etc; można by też "odznaczanie" na podstawie jakiś testów zrobić (luźna myśl)
3. dynamizacje wszystkiego (linki, etc)
(+ to co zostało przez was wymienione)
Aplikacji (jako .exe/ELF) bym raczej nie robił. Webowo da się to samo osiągnąć (javascript etc), a dostajemy od razu aspekt "multiplayer" prawie że gratis ;)
Co do SVG, to chyba na tym się skończy. To moim zdaniem kapitalne narzędzie, a IE6 miało już pogrzeb, więc... no zombie browser allowed ;p
@technologia tworzenia
Przemoc, imo masz rację co do nie-GUI. Jak przywróciłem ten pomysł do życia parę dni temu, to zacząłem właśnie od klepania w pythonie "kompilatora" takich grafów. Składnia wyglądała mniej więcej tak:
-- code --
title Skill Tree C++
section Język
node 0 SYNTAX Podstawy Składni
c FUNC_USE
node 1 FUNC_USE Korzystanie z funkcji
c VAR_INT
c VAR_FLOAT
node 2 VAR_INT Zmienne integer
c VAR_STRING
c VAR_INT_EX
node 2 VAR_FLOAT Zmienne float
c VAR_FLOAT_EX
node 3 VAR_STRING Łańcuchy znaków
node 5 VAR_INT_EX Zaawansowane detale integerów
desc Integer overflow i underflow, odejmowanie przez dodawanie, dzielenie przez mnożenie.
link http://jakis.tam.link.o.intach/
-- code --
(node poziom_na_ktorym_ma_byc_node identyfikator tytuł)
Póki co kompilator leży z uwagi na RECON, ale pewnie do niego wrócę za parę dni.
Po za tym mam pewną zagwozdkę
Jeśli chodzi o XSL, to mało miałem z nim do czynienia. Rzucę na to okiem potem ;)
@MSM Ad PS.
Szczegółowe drzewko ma pomóc w nauce. Natomiast przyznaje, że jeśli chodzi o ogólne, to ma być planem na dłuższy czas (może nie całe życie, ale jednak).
Oczywiście, nie chodzi mi o to aby zainteresowany takie drzewko realizował od A do Z. Ale zrealizowanie nawet wycinka takiego drzewka może być ciekawe i oszczędzić zastanawiania się "what next" na jakiś czas :)
@drzewka nie tylko do IT (via Jurgi / tanatos)
Popieram! :)
@reklamy google etc
Jeśli byłaby konieczność finansowego wsparcia projektu, to reklamy są dobrym pomysłem. Ale to baaardzo odległa przyszłość ;)
@drzewko BAT
Przyznaje że z tym pseudo OOP miałem zagwozdkę, i w pierwszej wersji było to na równi z interpreterem i obfuskacją. Tak więc przyznaje ci MSM rację i zmienię to w następnej wersji :)
@filozofia programowania, etc (via przemoc)
Bardzo słuszna uwaga. Doświadczenie, ogólne rozumienie danej działki, etc, nie koniecznie jest czymś co można zawszeć w drzewie. Pytanie czy można tak sformułować drzewo, żeby pomagało w nabyciu takowych meta-umiejętności ;)
@przemoc
Ja też bym dużo od nich chciał. Zacznijmy od początku i zobaczymy co z tego wyjdzie :)
Thx, wygląda kapitalnie! Rzucę potem okiem w licencje czy można to w miarę wygodnie używać i modyfikować :)
Również thx za zwrócenie uwagę na ten lib :)
Ah, takie oddzielenie warstwy grafu od umiejętności to kapitalny pomysł :)
Bardzo by to ułatwiło przerabianie drzew. Taaak, tak, stanowczo warte zastosowania :)
BTW można by się pokusić o stworzenie jakichś achievement'ów - tych w stylu World of Warcraft'a. Np:: http://img820.imageshack.us/img820/6288/achivment.png
"zawszeć"
Miej litość nad naszymi duszami. Zawrzeć! :)
"Pytanie czy można tak sformułować drzewo, żeby pomagało w nabyciu takowych meta-umiejętności"
Wierzę, że tak. Z drugiej strony, skoro mało która książka zajmuje się filozofią języka (już prędzej udają, że to robią), a mają do tego zdecydowanie lepsze warunki, to jestem świadom, że w przypadku drzewek będzie to zadanie ekstremalnie trudne i nie ma w tym przesady. Tu mogłyby być pomocne jakieś takie odatutorskie notki do węzłów. Komentarzy do węzłów chyba bym się bał, bo mogłyby iść w niewłaściwym kierunku. Za to te notki mogłyby być na zasadzie community wiki, ale koniecznie moderowane.
@graphviz, dot
Graphviza bezpośrednio nie używałem, ale dota i owszem, dlatego też tak chętnie bym go nie polecał. W graphvizie bodaj cały czas obecny jest absurd polegający na niemożności wygenerowania grafu w pamięci, bo tylko plik może być wyjściem. Dot natomiast jako narzędzie daje naprawdę niewielką kontrolę, która w malutkich grafach nie przeszkadza, a w większych doprowadza do furii. Próbujesz się wtedy ratować overlapami, packami, etc. co różnie się kończy. Nie mówię, że to zła droga z założenia, tylko jestem mocno sceptyczny wobec niej w przypadku skilltrees.
Bo można by np. zrobić tak, że przy każdym elemencie drzewa byłby checkbox do zaznaczania "done" i robić ranking tych którzy mają najwięcej "done", jednak żeby weryfikować, czy ludzie sobie tego nie zaznaczają bezprawnie można by wprowadzić coś w stylu egzaminu: np. napisz poprawny kod w języku xyz wykonujący abc... :)
Hmm. Umiejętność napisania boot loadera, hypervisora, prostego systemu operacyjnego? Złożonego systemu operacyjnego? ;)
Czy bardziej na zasadzie znam, rozumiem, jestem świadom wad i zalet prostszych technik (jak NVI) czy tych ciut bardziej złożonych (jak CRTP)?
Pytanie retoryczne, ale to byłoby też dobre zwyczajnie do odświeżania sobie wiedzy o tym i owym. Nawet jeżeli znamy te advanced & sophisticated techniques, to przecież nie używamy ich nieustannie i o mniejszych lub większych detalach z czasem zapominamy. Normalna sprawa, jak to kiedyś Roland McGrath na IRC-u ujął:
"i do indeed forget and rediscover quarterly more about ptrace than most people ever know"
Osiągnięcia typowo growe sprawdzają się w scentralizowanym środowisku. Może zamiast tego zrobić testy przygotowywane przez poszczególnych użytkowników? Np. "Gynvael's seal of approval - exploiting stack overflows." znaczyłby sporo.
Centralizacja ogranicza o tyle, że w każdej dziedzinie potrzebne byłoby grono sprawdzonych ekspertów, przy rozproszonych egzaminach/osiągnięciach wszystko opierałoby się na reputacji układających test.
@graphviz
Z tego co pamiętam w graphvizie można wykorzystać jeden z kilku silników do zrobienia layoutu, a następnie odczytać położenie poszczególnych węzłów, oczywiście w samej bibliotece, nie wiem czy w samym narzędziu jest to możliwe.
Jasne, że jest kilka "rozkładaczy" grafów, tyle że do skierowanych przeznaczone są praktycznie tylko trzy: dot, twopi i circo, z czego dwa ostatnie wypadają z oczywistych względów. Możesz użyć innych i odczytać ich położenia, ale mogą one być jeszcze bardziej nie po Twojej myśli. To jest problem graphviza, że nie ma jakiejś większej kontroli, a niestety chyba nie ma żadnej sensownej open-source'owej alternatywy. Tzn. pośrednio jest, zaszyta w KCachegrind, i IMO byłaby tu lepsza, tylko trzeba by ją najpierw wyekstrahować i do jakiegoś liba wrzucić. Że też nikt tego jeszcze nie zrobił, albo zrobił a ja o tym nie wiem.
Przyznaje, że też myślałem o achivmentach, natomiast jak słusznie kilka osób zauważyło, trzeba by jakąś weryfikacje zrobić, najlepiej automatyczną. Oczywiście jest to do zrobienia w większości przypadków, natomiast jest to raczej temat "na później".
(btw dd3s ahahah jaki example achivement ;>>> uśmialem się ;>)
@graphviz & KCachegrind & etc
Rzucę na to okiem po reconie.
@Freemind
Też o tym myślałem, ale chyba nie do końca spełnia do założenia z mojego postu (np. opisy w node'ach). Po za tym nie pamiętam czy Freemind umie robić DAG czy tylko drzewa ;) (offtopic - do map myśli jednak niezastąpiona jest kartka papieru he he he)
@UML
Padł jeszcze pomysł (via darkjames) żeby pomyśleć o zastosowaniu UML / narzędzi do tworzenia UML. Też rzucę na to okiem po recon, natomiast hmmm... raczej chciałbym zostać przy tekstowym zapisie drzewek i automagicznym "kompilowaniu" do grafów.
@komentarze do node'ów
Dobry pomysł, na pewno warty przemyślenia ;)
(z moderowaniem też się zgadzam ;>)
Hmmm może kiedyś powstaną gry, które serio będą podnosić skill....
Tzn, umiejętności poznawanych przez bohatera gracz będzie mógł użyć w rzeczywistym życiu...
Dobra, schodzę na ziemię. De facto jak na razie nikt takiej gry nie wykodził. A szkoda, pomysły na fabułę tego typu można mnożyć.
> Tzn, umiejętności poznawanych przez bohatera gracz będzie mógł użyć w rzeczywistym życiu...
Nie uczyłaś/-eś się programowania [1] na Colobocie? *g*
[1] http://pl.wikipedia.org/wiki/Kategoria:Gry_programistyczne
Takie drzewka mocno by pomogły w definiowaniu i stawianiu sobie konkretnych celów, ja jestem bardzo za :) Wygląda to obiecująco ;)
Przejrzałem źródełka KCachegrind i się okazało, że on też używa graphviz:
--code--
_renderProcess = new QProcess(this);
if (_layout == GraphOptions::Circular)
_renderProcess->addArgument( "twopi" );
else
_renderProcess->addArgument( "dot" );
_renderProcess->addArgument(_exporter.filename());
_renderProcess->addArgument( "-Tplain" );
connect( _renderProcess, SIGNAL(readyReadStdout()),
this, SLOT(readDotOutput()) );
connect( _renderProcess, SIGNAL(processExited()),
this, SLOT(dotExited()) );
if (1) kdDebug() << "Running '"
<< _renderProcess->arguments().join(" ")
<< "'..." << endl;
if ( !_renderProcess->start() ) {
QString e = i18n("No call graph is available because the following
"
"command cannot be run:
'%1'
")
.arg(_renderProcess->arguments().join(" "));
e += i18n("Please check that 'dot' is installed (package GraphViz).");
showText(e);
delete _renderProcess;
_renderProcess = 0;
return;
}
--end of code--
Możliwości grpahviz muszę jeszcze przejrzeć (tylko sobie *nixa na VMcę muszę postawić najpierw; pewnie to poczeka parę dni, bo na warsztaty po weekendzie wyjeżdżam, a mam jeszcze trochę materiałów do skończenia).
@gemGreg
Nie. Tak. Jeszcze nie zdecydowałem ;p
@piatkosia
W sensie "klik" i np. właśnie poznałaś 1000 nowych słów po eng ?;)
Ciekawy pomysł, w kilku filmach / książkach już to było ;)
@Leming
A popatrz, nawet nie wiedziałem ;)
@Jurgi
;D Może ze startupem nie przesadzajmy, ale coś w tym kierunku chcę pchnąć ;)
@candm
:) Pewnie nie tylko tobie hehe ;)
Wtopa. Faktycznie, nawet jest to jak byk napisane na stronie: http://kcachegrind.sf.net/
Sorry za kłopot, musiałem KCachegrind pomylić z czymś innym, co na pewno z niego nie korzysta. Tylko nie mogę skojarzyć z czym...
Jest jeszcze jedna aplikacja, o której zapomniałem, a którą warto w tym kontekście wymienić. Jest nią aiSee, program dostępny za darmo do użytku niekomercyjnego. Choć wiem, że i tak będziesz wolał raczej coś otwartego.
http://www.aisee.com/
http://www.absint.com/aisee/
aiSee... hmm, rzucę okiem, thx ;) Nie widziałem tego chyba wcześniej.
Anyway, warsztaty na które miałem jechać jednak się nie odbędą, więc w następnym tyg. rzucę okiem na te graphvizy etc porządnie ;)
@offtopic
Wyobrazilem sobie wykorzystanie tego do stworzenia jakiejs gry. "Gram Gynvaelem!" :D
Pięknie by się komponowało drzewko RE na stronie reverscraftu ;]
Add a comment: