11 Ταχεία ανάπτυξη λογισμικού Τεχνολογία Λογισμικού Τμήμα Πληροφορικής & Τηλεπικοινωνιών, ΕΚΠΑ Εαρινό εξάμηνο 2016 17 Δρ. Κώστας Σαΐδης saiko@di.uoa.gr
Πώς αναπτύσσουμε εφαρμογές γρήγορα; Χωρίς να "χάσουμε" σε άλλες παραμέτρους; 2
Δεν υπάρχει ασημένια σφαίρα Οι απαιτήσεις αλλάζουν, απαιτείται ταχεία ανάδραση από τους χρήστες και ταχεία αντίδραση από τους προγραμματιστές Ένας συνδυασμός εργαλείων και μεθοδολογιών που ταιριάζει στην ομάδα και το έργο 3
Περιεχόμενα Ανάπτυξη πρωτοτύπων Εργαλεία και μεθοδολογίες Δυναμικές γλώσσες προγραμματισμού Γλώσσες ειδικού σκοπού 4
Πρωτότυπα prototypes Ενδείκνυται η ανάπτυξη σε εφαρμογές που έχουν χρηστικές διεπαφές Human computer interaction User interfaces User experience Δεν ενδείκνυται σε εφαρμογές με απαιτητικούς υπολογισμούς ή εργασίες δέσμης 5
Είδη Οριζόντια πρωτότυπα Κάθετα πρωτότυπα 6
Διαδικασίες Throw away prototyping Evolutionary prototyping 7
Εξελικτική / επαναληπτική διαδικασία 1 Ανάλυση απαιτήσεων 2 Ανάπτυξη πρωτοτύπου 3 Αποτίμηση 4 Βελτίωση 5 Επανάληψη 8
Πλεονεκτήματα Μείωση χρόνου και κόστους Ανάμειξη των χρηστών 9
Πιθανά προβλήματα Ελλιπής ανάλυση Σύγχυση χρηστών Σύγχυση προγραμματιστών 10
Να είναι σαφής εξαρχής ο ρόλος του πρωτοτύπου στο έργο Προς όλους: χρήστες και προγραμματιστές Throw away vs. evolutionary 11
Μεθοδολογίες ταχείας ανάπτυξης λογισμικού RAD μεθολογία δεκαετία 1980 Ενοποιημένη unified process, δεκαετία 1990 Ευέλικτη μεθοδολογία agile methodology κ.ά 12
Ευέλικτη μεθοδολογία By PierreSelim Own work, CC BY SA 3.0, https://commons.wikimedia.org/w/index.php?curid=17336884 13
Scrum Μικρή ομάδα Δια λειτουργική Αυτο οργάνωση Στον ίδιο χώρο 14
Αξίες Αφοσίωση Θάρρος Συγκέντρωση Ανοικτότητα διαφάνεια Σεβασμός 15
Ρόλοι Product owner Έμφαση στη business πλευρά Development team Αυτο οργάνωση Scrum master Όχι manager 16
Έννοιες και διαδικασίες User story Product backlog Sprint iteration Sprint backlog 17
Sprint backlog Product backlog TODO Doing Done User Story A #1 #2 #3 Story B #4 #6 #5 Story C Story D Story E Story F 18
Εργαλεία Γενικά Αυτοματοποίηση χτισίματος είδαμε σε προηγούμενη διάλεξη Αυτοματοποίηση εκδόσεων/releases είδαμε σε προηγούμενη διάλεξη Αυτοματοποίηση εγκατάστασης Continuous integration & delivery, DevOps 19
Εργαλεία για ανάπτυξη Editors Debuggers CASE tools Computer aided software engineering Model driven development UML, ER diagrams GUI Builders IDEs 20
Επαναχρησιμοποίηση ανοικτού λογισμικού Apache, Eclipse, Google, κτλ. Artifact repositories Dependency management 21
Χρήση γλωσσών/τεχνολογιών ειδικού σκοπού Domain specific Languages Π.χ. SQL Τεχνολογίες ειδικού σκοπού Π.χ. Java Server Pages, Gradle, XSLT 22
Χρήση frameworks & toolkits Back end Spring, Hibernate, Grails, GORM, Restlet, Jersey Front end JS jquery, KnockoutJS, React, AngularJS Front end CSS Bootstrap, Foundation, SemanticUI 23
Χρήση δυναμικών γλωσσών Python Ruby Javascript Groovy 24
Δυναμικές γλώσσες προγραμματισμού Εκτέλεση ελέγχων Στατικές γλώσσες: κατά τη μεταγλώττιση Δυναμικές γλώσσες: κατά την εκτέλεση Επομένως, έμμεσα: Διαφορές και στην επίκληση μεθόδων method dispatch 25
Συστήματα τύπων στις γλώσσες προγραμματισμού a Statically typed language Ο τύπος μιας μεταβλητής θεσπίζεται κατά τη μεταγλώττιση και δε μπορεί να αλλάξει κατά την εκτέλεση. Ο τύπος κάθε έκφρασης αποτιμάται κατά τη μεταγλώττιση. Dynamically typed language Ο τύπος μιας μεταβλητής μπορεί να αλλάξει κατά την εκτέλεση, οι εκφράσεις αποτιμόνται κατά την εκτέλεση. 26
Συστήματα τύπων στις γλώσσες προγραμματισμού b Strongly typed language Η γλώσσα παρέχει εγγυήσεις για τη συμβατότητα των τιμών σε τύπους type conformance Weakly typed language Η γλώσσα δεν παρέχει εγγυήσεις ελλιπείς "αφαιρέσεις" από το σύστημα τύπων 27
Γιατί να επιλέξουμε μια δυναμική γλώσσα; O βασικός λόγος: Αύξηση παραγωγικότητας Πιο γρήγορη ανάπτυξη αν ξέρεις τι κάνεις 28
Το "αδύνατο σημείο" των δυναμικών γλωσσών IDE Support code analysis & completion Code Refactoring Τεχνική για την αναδιάρθρωση του κώδικα Βέλτιστα αποτελέσματα σε στατικές γλώσσες https://github.com/jhug/jhug General Resources/blob/master/presentations/2017/03 March/Refactoring In Practice.pdf 29
Javascript A dynamically typed, interpreted language that was intentionally designed to look like Java supporting Scheme like functions functional paradigm and Self like prototypes object oriented paradigm 30
Example https://github.com/monsur/jscache function Cache(maxSize, debug, storage) { this.maxsize_ = maxsize 1; this.debug_ = debug false; this.storage_ = storage new Cache.BasicCacheStorage(); this.fillfactor_ =.75; } this.stats_ = {}; this.stats_['hits'] = 0; this.stats_['misses'] = 0; 31
JavaScript is the first lambda language to go mainstream. Deep down, JavaScript has more in common with Lisp and Scheme than with Java. It is Lisp in C s clothing. This makes JavaScript a remarkably powerful language. Douglas Crockford 32
Λίστα αναγνωσμάτων 15. Douglas Crockford, "Javascript: The good parts", O'Reilly Media Yahoo Press, 978 0596517748 33
Τα πρώτα είκοσι χρόνια είναι δύσκολα Προσοχή this global variables Scope Hoisting == typeof Arrays 34
Για αρχάριους EcmaScript 6 ES6 ή ES2015 TypeScript 35
Lambdas, Anonymous functions, Closures 36
Code as data Lambdas: function valued expressions Functions as first class objects They can be assigned to variables They can be passed as arguments Higher order functions 37
Function statements, function expressions and anonymous functions function adder(x, y) { return x + y; } // a function statement var adderfunction = adder; //a function assigned to a var foo.onclick = function(event) { //deal with the event } //an anonymous function directly assigned to a var array.foreach(function(element) { //do something with the element }); //an anonymous function directly passed as an argument 38
Closures A closure is the combination of a function and the lexical environment within which that function was declared. This environment consists of any local variables that were in scope at the time that the closure was created. A closure is a persistent local variable scope, holding on to local variables even after the code execution has moved out of the function block. The scope and all its local variables are tied to the function, and will persist as long as that function persists. Closures exist only at runtime. Help accomplish OO encapsulation and information hiding. 39
Example var getterof = function(object) { var counter = 0; return { get: function() { counter = counter + 1; //free variable return object; } count: function() { return counter; //free variable } } } var o = {... }; //an object var getter = getterof(o); getter.get(); //returns the original object getter.count(); //1 40
Another example var adder = function(a, b) { return function(b) { return a + b; } } var addto4 = adder(4); var addto5 = adder(5); addto4(3); //7 addto5(3); //8 41
ES6 Features Modules with import and export Constants with const Block scoped variables with let Arrow functions with => Classes with class and extends and super String interporation with `${var}` 42
ES6 Features Default parameter values, rest & spread operators Desctructuring of objects and arrays Promises Enhanced object literals New collections Set, Map, WeakSet, WeakMap 43
ES6 Features Generators & iterators Various other goodies, such as Symbols Metaprogramming Proxies & Reflection Math, String, Number enhancements Binary and octal literals and more... 44
Example https://github.com/saikos/netbeanses6support 45
Groovy Dynamic with optional typing With static compilation and static type checking capabilities Multi paradigm OO, Functional Smooth integration with Java language and runtime 46
Για περισσότερα groovy lang.org https://www.slideshare.net/kostassaidis/an introduction togroovy for java developers https://www.slideshare.net/kostassaidis/apache groovy thelanguage and the ecosystem 47