SlideShare a Scribd company logo
| 1Zaglavljeni u jami katrana
| 2Zaglavljeni u jami katrana
Dragi dnevniče, bilo je to ljeta gospodnjeg 2012 ...
JAVA  ?
| 3Zaglavljeni u jami katrana
LISP
(define (sum-of-squares x y)
(+ (square x)
(square y)))
“onaj sa zagradama”
| 4Zaglavljeni u jami katrana
JVM
| 5Zaglavljeni u jami katrana
LISP + JVM ....
CLOJURE !!!
| 6Zaglavljeni u jami katrana
Malo akademije ...
| 7Zaglavljeni u jami katrana
Problem
“Kompleksnost je glavni uzrok većine
problema u današnjem softveru. [....] to
jednostavno dolazi od činjenice da
razumjevanje sustava je preduvjet za
izbjegavanje problema, a to je upravo ono
što kompleksnost uništava.”
| 8Zaglavljeni u jami katrana
Razumjevanje sustava
• Formalno – specifikacija sustava izvana:
- ključni problem sa testranjem je da testiranje
komponente/sustava sa jednim ulaznim podacima
ništa ne govori o ponašanju te komponente kada joj
se proslijede drugi ulazni podaci
- VIŠE BUGOVA PRONAĐENO
• Neformalno – razumjevanje sustava iznutra (npr.
debugiranje)
- MANJE BUGOVA NAPRAVLJENO (VAŽNIJE!)
| 9Zaglavljeni u jami katrana
Edsger W. Dijkstra (1930-2002)
• “...we have to keep it crisp,
disentangled, and simple if we
refuse to be crushed by the
complexities of our own
making...”
• “Those who want really reliable
software will discover that they
must find means of avoiding
the majority of bugs to start
with.”
| 10Zaglavljeni u jami katrana
Uzroci kompleksnosti
• Stanje
• Kontrola toka
| 11Zaglavljeni u jami katrana
Stanje i razumjevanje sustava
Stanje uništava razumjevanje sustava:
• Formalno (“izvana”) - testiranje sustava u jednom stanju
ništa ne govori o sustavu kada je on u drugom stanju
• Neformalno (“iznutra”) - svako novo stanje u programu
eksponencijalno povećava broj mogućih stanja
programa → mentalni “overload”
Stanje je nužno, ali ga treba maksimalno
smanjiti i izolirati
| 12Zaglavljeni u jami katrana
Workaround za probleme sa stanjem
| 13Zaglavljeni u jami katrana
Stanje i OOP (1)
• Stanje je sakriveno u objektu (private fieldovi)
• Nepredvidivost rezultata poziva metode → ovisi o stanju objekta
public class Incrementer {
private int step; // sakriveno stanje!
// nepredvidiv rezultat za pozivatelja
public int increment(int number) {
return number + step;
}
public void doSomething () {
// promjena stanja ovdje
this.step = new Random().nextInt(1000);
}
}
| 14Zaglavljeni u jami katrana
Stanje i OOP (2)
Incrementer inc = new Incrementer(1);
// DANGER !!
someDeeplyNestedCall(inc);
// da li je rezultat stvarno 7 ?
int result = inc.increment(6);
Promjenjivi objekti se ne mogu sigurno:
• niti primiti, niti proslijediti kao argumenti
• koristiti u hash kolekcijama (Map, Set)
• cachirati
• koristiti u multithreaded okolini
• final keyword (immutability)
• defanzivno kopiranje
| 15Zaglavljeni u jami katrana
Stanje i FP
• Referencijalna transparentnost - svi podaci koji određuju
rezultat funkcije su vidljivi kao ulazni argumenti
• Stanje još uvijek postoji, ali drži se bliže „površini” i prenosi
se „dole” kao argument
public static int increment(int number, int step) {
return number + step;
}
public static User activateUser(User user) {
User newUser = new User();
newUser.name = user.name;
newUser.active = true;
return newUser;
}
| 16Zaglavljeni u jami katrana
Stanje i Javascript UI
• Problem – DOM je „globalna promjenjiva varijabla” (stanje)
• Stanje bi trebalo biti izolirano (idealan slučaj), a DOM funkcija stanja
Server events
UI events
STANJE
Prikaz = DOM = f (STANJE)
<body>
<ul>
<li>John</li>
<li>Bill</li>
</ul>
<div id=” tab2” >...</div>
</body>
{ users: [‘John’, ‘Bill’],
selectedTabIndex: 2 }
| 17Zaglavljeni u jami katrana
React.js
• Programer ne dira pravi DOM - „Virtualni
DOM” se rekreira na svaku promjenu stanja
(poput server side web developmenta)
• Programer brine samo o sadržaju cijelog
(virtualnog) DOM-a u danom trenutku
• React.js u pozadini radi add/update/remove
pojedinih elemenata na pravom DOM-u Performanse ?
Trenutak t( i ):
<body>
<ul>
<li>John</li>
</ul>
</body>
Trenutak t( i + 1 ):
<body>
<ul>
<li>John</li>
<li>Bill</li>  „add” akcija
</ul>
</body>
| 18Zaglavljeni u jami katrana
Kontrola toka
• Red po kojem se stvari događaju – izvor kompleksnosti
• Primjer:
int a = 4;
int b = a + 2;
int c = b * 3;
• Tok u konkurentnom sustavu?
Kako uopće
shvatiti/testirati
nešto gdje ne
znamo kojim
slijedom se
stvari događaju?
| 19Zaglavljeni u jami katrana
Deklarativno programiranje
• „Reci mi što želiš, ne kako” – eliminacija kontrole
• Funkcionalni jezici su više deklarativni (npr. izbjegavanje
petlji – funkcije filter, map...)
• Logično programiranje (npr. Prolog) - ultimativni deklarativni
jezik
• core.logic library (Clojure)
(run* [a b c]
(* b 3 c)
(== a 4)
(+ a 2 b))
=> ([4 6 18])
(run* [a b c]
(* b 3 c)
(membero a [4 5 6])
(+ a 2 b))
=> ([4 6 18] [5 7 21] [6 8 24])
| 20Zaglavljeni u jami katrana

More Related Content

PDF
JavaCro'15 - Utilize the full power of the web with Restlet - Matija Dujmović
PDF
JavaCro'15 - Snappy Ubuntu Core - Gordan Krešić
PDF
JavaCro'15 - BOOTylicious Spring - Karlo Novak
PDF
JavaCro'15 - Single mail client for Lotus Domino and MS Exchange with Liferay...
PDF
JavaCro'15 - Slick database library - Ivan Senji
PDF
PDF
Java cro'21 the best tools for java developers in 2021 - hujak
PDF
JavaCro'21 - Java is Here To Stay - HUJAK Keynote
JavaCro'15 - Utilize the full power of the web with Restlet - Matija Dujmović
JavaCro'15 - Snappy Ubuntu Core - Gordan Krešić
JavaCro'15 - BOOTylicious Spring - Karlo Novak
JavaCro'15 - Single mail client for Lotus Domino and MS Exchange with Liferay...
JavaCro'15 - Slick database library - Ivan Senji
Java cro'21 the best tools for java developers in 2021 - hujak
JavaCro'21 - Java is Here To Stay - HUJAK Keynote

More from HUJAK - Hrvatska udruga Java korisnika / Croatian Java User Association (20)

PDF
Javantura v7 - Behaviour Driven Development with Cucumber - Ivan Lozić
PPTX
Javantura v7 - The State of Java - Today and Tomowwow - HUJAK's Community Key...
PPTX
Javantura v7 - Learning to Scale Yourself: The Journey from Coder to Leader -...
PDF
JavaCro'19 - The State of Java and Software Development in Croatia - Communit...
PDF
Javantura v6 - Java in Croatia and HUJAK - Branko Mihaljević, Aleksander Radovan
PDF
Javantura v6 - On the Aspects of Polyglot Programming and Memory Management i...
PPTX
Javantura v6 - Case Study: Marketplace App with Java and Hyperledger Fabric -...
PDF
Javantura v6 - How to help customers report bugs accurately - Miroslav Čerkez...
PDF
Javantura v6 - When remote work really works - the secrets behind successful ...
PDF
Javantura v6 - Kotlin-Java Interop - Matej Vidaković
PDF
Javantura v6 - Spring HATEOAS hypermedia-driven web services, and clients tha...
PDF
Javantura v6 - End to End Continuous Delivery of Microservices for Kubernetes...
PPTX
Javantura v6 - Istio Service Mesh - The magic between your microservices - Ma...
PDF
Javantura v6 - How can you improve the quality of your application - Ioannis ...
PDF
Javantura v6 - Automation of web apps testing - Hrvoje Ruhek
PDF
Javantura v6 - Master the Concepts Behind the Java 10 Challenges and Eliminat...
PDF
Javantura v6 - Building IoT Middleware with Microservices - Mario Kusek
PDF
Javantura v6 - JDK 11 & JDK 12 - Dalibor Topic
PDF
Javantura v6 - Java SE, Today and Tomorrow - Dalibor Topic
PDF
Javantura v6 - Future of the Humankind and the Universe - Ivica Puljak
Javantura v7 - Behaviour Driven Development with Cucumber - Ivan Lozić
Javantura v7 - The State of Java - Today and Tomowwow - HUJAK's Community Key...
Javantura v7 - Learning to Scale Yourself: The Journey from Coder to Leader -...
JavaCro'19 - The State of Java and Software Development in Croatia - Communit...
Javantura v6 - Java in Croatia and HUJAK - Branko Mihaljević, Aleksander Radovan
Javantura v6 - On the Aspects of Polyglot Programming and Memory Management i...
Javantura v6 - Case Study: Marketplace App with Java and Hyperledger Fabric -...
Javantura v6 - How to help customers report bugs accurately - Miroslav Čerkez...
Javantura v6 - When remote work really works - the secrets behind successful ...
Javantura v6 - Kotlin-Java Interop - Matej Vidaković
Javantura v6 - Spring HATEOAS hypermedia-driven web services, and clients tha...
Javantura v6 - End to End Continuous Delivery of Microservices for Kubernetes...
Javantura v6 - Istio Service Mesh - The magic between your microservices - Ma...
Javantura v6 - How can you improve the quality of your application - Ioannis ...
Javantura v6 - Automation of web apps testing - Hrvoje Ruhek
Javantura v6 - Master the Concepts Behind the Java 10 Challenges and Eliminat...
Javantura v6 - Building IoT Middleware with Microservices - Mario Kusek
Javantura v6 - JDK 11 & JDK 12 - Dalibor Topic
Javantura v6 - Java SE, Today and Tomorrow - Dalibor Topic
Javantura v6 - Future of the Humankind and the Universe - Ivica Puljak
Ad

JavaCro'15 - Stuck in a tar pit - Vjeran Marčinko

  • 1. | 1Zaglavljeni u jami katrana
  • 2. | 2Zaglavljeni u jami katrana Dragi dnevniče, bilo je to ljeta gospodnjeg 2012 ... JAVA  ?
  • 3. | 3Zaglavljeni u jami katrana LISP (define (sum-of-squares x y) (+ (square x) (square y))) “onaj sa zagradama”
  • 4. | 4Zaglavljeni u jami katrana JVM
  • 5. | 5Zaglavljeni u jami katrana LISP + JVM .... CLOJURE !!!
  • 6. | 6Zaglavljeni u jami katrana Malo akademije ...
  • 7. | 7Zaglavljeni u jami katrana Problem “Kompleksnost je glavni uzrok većine problema u današnjem softveru. [....] to jednostavno dolazi od činjenice da razumjevanje sustava je preduvjet za izbjegavanje problema, a to je upravo ono što kompleksnost uništava.”
  • 8. | 8Zaglavljeni u jami katrana Razumjevanje sustava • Formalno – specifikacija sustava izvana: - ključni problem sa testranjem je da testiranje komponente/sustava sa jednim ulaznim podacima ništa ne govori o ponašanju te komponente kada joj se proslijede drugi ulazni podaci - VIŠE BUGOVA PRONAĐENO • Neformalno – razumjevanje sustava iznutra (npr. debugiranje) - MANJE BUGOVA NAPRAVLJENO (VAŽNIJE!)
  • 9. | 9Zaglavljeni u jami katrana Edsger W. Dijkstra (1930-2002) • “...we have to keep it crisp, disentangled, and simple if we refuse to be crushed by the complexities of our own making...” • “Those who want really reliable software will discover that they must find means of avoiding the majority of bugs to start with.”
  • 10. | 10Zaglavljeni u jami katrana Uzroci kompleksnosti • Stanje • Kontrola toka
  • 11. | 11Zaglavljeni u jami katrana Stanje i razumjevanje sustava Stanje uništava razumjevanje sustava: • Formalno (“izvana”) - testiranje sustava u jednom stanju ništa ne govori o sustavu kada je on u drugom stanju • Neformalno (“iznutra”) - svako novo stanje u programu eksponencijalno povećava broj mogućih stanja programa → mentalni “overload” Stanje je nužno, ali ga treba maksimalno smanjiti i izolirati
  • 12. | 12Zaglavljeni u jami katrana Workaround za probleme sa stanjem
  • 13. | 13Zaglavljeni u jami katrana Stanje i OOP (1) • Stanje je sakriveno u objektu (private fieldovi) • Nepredvidivost rezultata poziva metode → ovisi o stanju objekta public class Incrementer { private int step; // sakriveno stanje! // nepredvidiv rezultat za pozivatelja public int increment(int number) { return number + step; } public void doSomething () { // promjena stanja ovdje this.step = new Random().nextInt(1000); } }
  • 14. | 14Zaglavljeni u jami katrana Stanje i OOP (2) Incrementer inc = new Incrementer(1); // DANGER !! someDeeplyNestedCall(inc); // da li je rezultat stvarno 7 ? int result = inc.increment(6); Promjenjivi objekti se ne mogu sigurno: • niti primiti, niti proslijediti kao argumenti • koristiti u hash kolekcijama (Map, Set) • cachirati • koristiti u multithreaded okolini • final keyword (immutability) • defanzivno kopiranje
  • 15. | 15Zaglavljeni u jami katrana Stanje i FP • Referencijalna transparentnost - svi podaci koji određuju rezultat funkcije su vidljivi kao ulazni argumenti • Stanje još uvijek postoji, ali drži se bliže „površini” i prenosi se „dole” kao argument public static int increment(int number, int step) { return number + step; } public static User activateUser(User user) { User newUser = new User(); newUser.name = user.name; newUser.active = true; return newUser; }
  • 16. | 16Zaglavljeni u jami katrana Stanje i Javascript UI • Problem – DOM je „globalna promjenjiva varijabla” (stanje) • Stanje bi trebalo biti izolirano (idealan slučaj), a DOM funkcija stanja Server events UI events STANJE Prikaz = DOM = f (STANJE) <body> <ul> <li>John</li> <li>Bill</li> </ul> <div id=” tab2” >...</div> </body> { users: [‘John’, ‘Bill’], selectedTabIndex: 2 }
  • 17. | 17Zaglavljeni u jami katrana React.js • Programer ne dira pravi DOM - „Virtualni DOM” se rekreira na svaku promjenu stanja (poput server side web developmenta) • Programer brine samo o sadržaju cijelog (virtualnog) DOM-a u danom trenutku • React.js u pozadini radi add/update/remove pojedinih elemenata na pravom DOM-u Performanse ? Trenutak t( i ): <body> <ul> <li>John</li> </ul> </body> Trenutak t( i + 1 ): <body> <ul> <li>John</li> <li>Bill</li>  „add” akcija </ul> </body>
  • 18. | 18Zaglavljeni u jami katrana Kontrola toka • Red po kojem se stvari događaju – izvor kompleksnosti • Primjer: int a = 4; int b = a + 2; int c = b * 3; • Tok u konkurentnom sustavu? Kako uopće shvatiti/testirati nešto gdje ne znamo kojim slijedom se stvari događaju?
  • 19. | 19Zaglavljeni u jami katrana Deklarativno programiranje • „Reci mi što želiš, ne kako” – eliminacija kontrole • Funkcionalni jezici su više deklarativni (npr. izbjegavanje petlji – funkcije filter, map...) • Logično programiranje (npr. Prolog) - ultimativni deklarativni jezik • core.logic library (Clojure) (run* [a b c] (* b 3 c) (== a 4) (+ a 2 b)) => ([4 6 18]) (run* [a b c] (* b 3 c) (membero a [4 5 6]) (+ a 2 b)) => ([4 6 18] [5 7 21] [6 8 24])
  • 20. | 20Zaglavljeni u jami katrana