Software Architecture - Principles Patterns and Practices - OSI Days Workshop - 2016
-
Upload
bangalore-container-conference-2017 -
Category
Software
-
view
565 -
download
0
Transcript of Software Architecture - Principles Patterns and Practices - OSI Days Workshop - 2016
Ganesh Samarthyam [email protected]
www.codeops.tech
Software Architecture: Principles, Patterns, and Practices
Why do you want to become an architect?
What skills are required for an
architect?
Who is an architect?
What essential knowledge is required
for an architect?
What is software architecture?
How to evolve an architecture?
What is the software architecture
development process?
What factors influences software architecture?
Generalist
Specialist
Source: Software Architecture for Developers, Simon Brown, LeanPub, 2014
What is software architecture?
“The software architecture of a program or computing system is the structure or structures of the system, which comprise software elements, the externally visible properties of those elements, and the
relationships among them”
Source:So)wareArchitectureinPrac2ce(2ndedi2on),Bass,Clements,Kazman;Addison-Wesley2003:
“Architecture is a set of principal design decisions about a software system”
Source: R. N. Taylor, N. Medvidovic, and E. M. Dashofy. 2009. Software Architecture: Foundations, Theory, and Practice. Wiley Publishing.
“The architecture of a deployed software is
determined by those aspects that are hardest to change”
Source: R. N. Taylor, N. Medvidovic, and E. M. Dashofy. 2009. Software Architecture: Foundations, Theory, and Practice. Wiley Publishing.
Architecture represents the significant design decisions that shape a
system, where significant is measured by cost of change.
- Grady Booch (2006)
NFRs
Constraints
TechnologyCross-cutting concerns
Others (e.g.: overall
structure)
Dimensions of ADs
Cross-cutting concerns
Error/Exception handling
ConcurrencyPersistence
Event handling
Interaction and presentation
Source: SWEBOK v3
Architecture?**
Network*architecture*
Solu2on*architecture*
Applica2on*architecture*
Pla6orm*architecture*
…*
Data*architecture*
Hardware*architecture*
Web*architecture**
Source: Software Architecture for Developers, Simon Brown, LeanPub, 2014
Architecture/design determines qualities
Understandability Changeability Extensibility
Reusability Testability Reliability
Arch/Design
impactsimpacts
impacts
Architecture principles and styles
Architectural principles: Axis, symmetry, rhythm, datum, hierarchy, transformation
Dravidian styleRenaissance style
Mughal style
Post-modern style
What architectural style is this?
Image source: http://ashokbasnet.com.np/wp-content/uploads/2011/03/wx_thumb-5B1-5D.jpg
Example: Abstracting for portability using layering
• Helps'abstract'pla-orm0specific'details'abstrac4ng'hardware'specific'aspects''
Hardware'Abstrac4on'Layer'(HAL)'
• Abstracts'OS'specific'func4onality'and'provides'a'generic'interface'to'underlying'OS'
Opera4ng'System'
Abstrac4on'Layer'(OSAL)'
• Hides'database'specific'aspects'by'providing'a'generic'interface''
Database'Abstrac4on'Layer'(DAL)'
Layering style: Benefits
+ Reuse of layers
+ Support for standardization
+ Dependencies are kept local
+ Exchangeability
Frank Buschmann, Regine Meunier, Hans Rohnert, Peter Sommerlad, and Michael Stal. 1996. Pattern-Oriented Software Architecture: A System of Patterns. John Wiley & Sons, Inc., NY, USA.
Layering style: Liabilities
- Cascades of changing behavior
- Lower efficiency
- Unnecessary work
- Difficulty in establishing the correct granularity of layers
Frank Buschmann, Regine Meunier, Hans Rohnert, Peter Sommerlad, and Michael Stal. 1996. Pattern-Oriented Software Architecture: A System of Patterns. John Wiley & Sons, Inc., NY, USA.
What architectural style is this?
$ cat limerick.txt There was a young lady of Niger Who smiled as she rode on a tiger. They returned from the ride With the lady inside And a smile on the face of the tiger.
$ cat limerick.txt | tr -cs "[:alpha:]" "\n" | awk '{print length(), $0}' | sort | uniq1 a 2 as 2 of 2 on 3 And 3 Who 3 she 3 the 3 was 4 They 4 With 4 face 4 from 4 lady 4 ride 4 rode 5 Niger 5 There 5 smile 5 tiger 5 young 6 inside 6 smiled 8 returned
List<String> lines = Files.readAllLines(Paths.get("./limerick.txt"), Charset.defaultCharset());
Map<Integer, List<String>> wordGroups = lines.stream() .map(line -> line.replaceAll("\\W", "\n").split("\n")) .flatMap(Arrays::stream) .sorted() .distinct() .collect(Collectors.groupingBy(String::length));
wordGroups.forEach( (count, words) -> { words.forEach(word -> System.out.printf("%d %s %n", count, word)); });
1 a 2 as 2 of 2 on 3 And 3 Who 3 she 3 the 3 was 4 They 4 With 4 face 4 from 4 lady 4 ride 4 rode 5 Niger 5 There 5 smile 5 tiger 5 young 6 inside 6 smiled 8 returned
Real-world pipes-and-filters
sediment pre-carbon ultra-filter post-
carbonFiltered water
Pipe-and-filter: Benefits
+ Flexibility by filter exchange
+ Flexibility by recombination
+ Reuse of filter components
+ Rapid prototyping of pipelines
Frank Buschmann, Regine Meunier, Hans Rohnert, Peter Sommerlad, and Michael Stal. 1996. Pattern-Oriented Software Architecture: A System of Patterns. John Wiley & Sons, Inc., NY, USA.
Pipe-and-filter: Liabilities
- Sharing state information is expensive or inflexible
- Efficiency gain by parallel processing is often an illusion
- Data transformation overhead
- Difficult to handle errors
Frank Buschmann, Regine Meunier, Hans Rohnert, Peter Sommerlad, and Michael Stal. 1996. Pattern-Oriented Software Architecture: A System of Patterns. John Wiley & Sons, Inc., NY, USA.
POSA - before and after
Layered
Pipe-and-Filter
Broker
Client-Server
Peer-to-Peer
Blackboard
What is the architecture
style followed by World Wide Web (WWW)?
SOA (Service Oriented Architecture)
Lambda Style
Microservices
REST (Representational State Transfer)
Map-Reduce
CQRS (Command-Query Responsibility Segregation )
Software Containers
Event Sourcing
Command Query Responsibility Segregation (CQRS) pattern
source: https://msdn.microsoft.com/en-us/library/jj591573.da82141c6f9950d64c1263fa4da825ec(l=en-us).png
Event Sourcing pattern
source: https://msdn.microsoft.com/en-us/library/dn589792.aspx
Map-Reduce patternInput
Sara Booch Thayer Merlin Sara Ralph Merlin Tim Sara
Christian Ralph
Cormen …
Computer Cluster
map
map
map
Sara, 1 Ralph, 1 Merlin, 1 Tim, 1
Sara, 1 Booch, 1 Thayer, 1 Merlin, 1
Sara, 1 Christian, 1
Ralph, 1 Cormen, 1
reduce
reduce
Sara, 3 Booch, 1 Thayer,1 Merlin, 2 Ralph, 2 Tim, 1
Christian, 1 Cormen, 1
…
Output Sara, 1 Sara, 1 Sara, 1
Booch, 1 Thayer, 1
Merlin, 1 Merlin, 1 Ralph, 1 Ralph, 1 Tim, 1
Christian, 1 Cormen, 1
What style is this?
Batch layer
Serving layerSpeed layer
Lambda style
source: https://spark-summit.org/2014/wp-content/uploads/2014/07/Lambda-Architecture-Jim-Scott..pdf
Microservices is an architectural style
Complex application = composed of tiny services
Communicate over REST API
HTTP GET
HTTP PUT
HTTP POST
HTTP DELETE
Underlying philosophy
“do one thing and do it well”
Monolithic
Microservices
Conway’s law“Any organization that designs a system… will inevitably produce
a design whose structure is a copy of the organization's communication structure”
Conway’s lawTeam 1
Team 2Team 3
Team 4
Conway’s law
Team 1 Team 2
Team 3
Team 4
Monolithic to microservices
Monolithic to microservices
Service = manageable by “two pizza” team
Amazon’s rules for teams• All teams will henceforth expose their data and functionality
through service interfaces. • Teams must communicate with each other through these
interfaces. • There will be no other form of inter-service/team communication
allowed: no direct linking, no direct reads of another team’s datastore, no shared memory model, no backdoors whatsoever. • The only communication allowed is via service interface calls
over the network. • It doesn’t matter what technology they [other services] use. • All service interfaces, without exception, must be designed from
the ground up to be externalizable. • That is to say, the team must plan and design to be able to
expose the interface to developers in the outside world.
Service = a team can DURS (Deploy, Update, Replace, Scale)
Microservices = Damn U R Sexy
Amazon case study
2-tier architecture SOA Microservices
Triggering microservices
Source: DevOps: A Software Architect's Perspective, Len Bass, Ingo Weber, Liming Zhu, Addison-Wesley Professional, 2015
Separate data stores
A process for architecting using scenarios
Source: http://msdn.microsoft.com/en-us/library/ee658084.aspx
Strategies and tacticsA tactic is a design decision that influences the control of a quality
attribute response
A collection of tactics is known as “strategies”
Source: Len Bass, Paul Clements, and Rick Kazman. 2003. Software Architecture in Practice (2 ed.). Addison-Wesley Longman Publishing Co., Inc., Boston, MA, USA.
Example: Security tactics
Security
Resisting Attacks
Detecting Attacks
Recovering From attack
! Authenticate users ! Authorize users ! Maintain data
confidentiality ! Maintain integrity ! Limit exposure ! Limit access
Restoration Identification
Stimulus:
Attack Response:
System detects, resists, or recovers from attacks
See “Availability“ Audit Trail
Intrusion Detection
Source: Len Bass, Paul Clements, and Rick Kazman. 2003. Software Architecture in Practice (2 ed.). Addison-Wesley Longman Publishing Co., Inc., Boston, MA, USA.
Exercise: Tactics for achieving qualities
Availability The property of software that it there and ready to carry out its task when you need it to be
Testability The ease with which software can be made to demonstrate its faults through (typically execution-based) testing
SecurityMeasure of the system’s ability to protect data and
information from unauthorised access while still providing access to people and systems that are authorized
Performance The software’s ability to meet timing requirements
Modifiability The ease with which the software can be modified (with minimal risk and cost)
Source: Len Bass, Paul Clements, and Rick Kazman. 2003. Software Architecture in Practice (2 ed.). Addison-Wesley Longman Publishing Co., Inc., Boston, MA, USA.
Tactics for availabilityUse$fault$detec,on$tac,cs$such$as$
ping/echo,$heartbeat,$,me$stamping,$sanity$checking,$
condi,on$monitoring,$and$self:test$
Use$fault$recovery$tac,cs$such$as$rollback$(to$a$previous$known$
good$state),$providing$“spares”$for$redundancy,$retry$the$opera,on,$ignoring$faulty$behavior,$and$
degrade$(gracefully$reduce$system$func,onality)$
Use$fault$preven,on$tac,cs$such$as$removal$from$service$
(temporarily$remove$the$faulty$component),$use$transac,onal$seman,cs$(ACID$proper,es),$
prevent$system$excep,ons$from$occurring.$
Source: Len Bass, Paul Clements, and Rick Kazman. 2003. Software Architecture in Practice (2 ed.). Addison-Wesley Longman Publishing Co., Inc., Boston, MA, USA.
Tactics for modifiabilityReduce&size&of&the&module,&for&example&by&spli7ng&module&(to&reduce&the&average&cost&of&future&
changes)&
Increase&seman>c&cohesion&of&the&module&(by&ensuring&that&the&a&responsibili>es&serving&the&same&purpose&are&placed&in&the&same&
module)&
Reduce&coupling&through&encapsula>on&(by&providing&explicit&interfaces&and&hiding&internal&details),&
introducing&intermediate&dependencies&(e.g.,&introduce&
dynamic&lookup&of&services&with&SOA&using&directory&as&an&intermediary)&&&
Source: Len Bass, Paul Clements, and Rick Kazman. 2003. Software Architecture in Practice (2 ed.). Addison-Wesley Longman Publishing Co., Inc., Boston, MA, USA.
Tactics for performanceControl'resource'demand'through'requiring'smaller'demand'on'resources'to'service'the'events;'for'instance,'reducing'the'sampling'
frequency'(for'capturing'environmental'data),'limi;ng'event'response'(by'queuing'the'events),'
priori;zing'events'(by'ranking'the'events'according'to'their'importance'and'processing'
them),'reducing'overheads'(by'consuming'lesser'resources),'bound'execu;on';mes,'and'increase'
resource'efficiency.'
Manage'the'resources'more'effec;vely'by'increasing'resources,'introducing'concurrency,'maintaining'mul;ple'copies'of'computa;on,'
bounding'queue'sizes,'and'scheduling'resources.''
Source: Len Bass, Paul Clements, and Rick Kazman. 2003. Software Architecture in Practice (2 ed.). Addison-Wesley Longman Publishing Co., Inc., Boston, MA, USA.
Tactics for securityDetect%a'acks%by%looking%for%known%pa'erns%of%intrusion,%detec8ng%service%denial,%
verifying%message%integrity%before%using%them,%detec8ng%message%delay%(to%detect%man=
in=the=middle%a'acks).%
Resist%a'acks%by%iden8fying,%authen8ca8ng,%and%authorizing%actors%(note:%actors%are%sources%of%external%input%to%the%system),%limi8ng%access%to%resources,%and%limi8ng%exposure%of%the%system.%
React%to%a'acks%when%an%a'ack%is%underway%by%revoking%access,%
lock%computer,%or%inform%relevant%actors.%%
Source: Len Bass, Paul Clements, and Rick Kazman. 2003. Software Architecture in Practice (2 ed.). Addison-Wesley Longman Publishing Co., Inc., Boston, MA, USA.
Tactics for testabilityControl'and'observe'system'state'by'
providing'specializing'interfaces,'record/playback'faults,'localize'state'storage'(instead'of'distribu;ng'the'state),'
abstract'input'data'sources,'sandbox'(by'isola;ng'the'system'from'the'real'world),'and'introduce'executable'asser;ons'(to'check'if'the'program'is'in'a'faulty'state)'
Limit'complexity'(by'reducing'cyclic'dependencies,'limi;ng'dependencies'to'
external'components,'etc;'in'OO'systems,'limit'depth'of'inheritance'tree,'reduce'dynamic'calls;'and'having'high'
cohesion,'low'coupling'and'separa;on'of'concerns);'also'limit'nonCdeterminism.'
Source: Len Bass, Paul Clements, and Rick Kazman. 2003. Software Architecture in Practice (2 ed.). Addison-Wesley Longman Publishing Co., Inc., Boston, MA, USA.
InFusion/InCode
PMD CPD
ArchiMate
Source: http://www.archimatetool.com/img/archi_out.png
Sonarqube
Sonarqubehttp://www.sonarqube.org
ArgoUML
Source: http://a.fsdn.com/con/app/proj/argouml/screenshots/52103.jpg
Nitric
“Cities grow, cities evolve, cities have parts that simply die while other
parts flourish; each city has to be renewed in order to meet the needs of its populace… Software-intensive systems
are like that. They grow, they evolve, sometimes they wither away, and
sometimes they flourish…”
Grady Booch in the foreword for “Refactoring for Software Design Smells: Managing Technical Debt”, Girish Suryanarayana, Ganesh Samarthyam, Tushar Sharma, Morgan Kaufmann/Elsevier, 2014.
CodeCity tool
Code Query Language (NDepend, Architect, …)
Look at the world differently for creative design solutions
Who coined the term
“code smell”?
Hint: He also originated the
terms TDD and XP
Kent Beck
Who coined the acronym “SOLID”?
(as in SOLID principles)
Hint: He is the author of the book
“Working effectively with legacy code”
Michael Feathers
S Single Responsibility Principle
Every object should have a single responsibility and that should be encapsulated by the class
O Open Closed Principle Software should be open for extension, but closed for modification
L Liskov’s Substitution Principle
Any subclass should always be usable instead of its parent class
I Interface Segregation Principle
Many client specific interfaces are better than one general purpose interface
D Dependency Inversion Principle
Abstractions should not depend upon details. Details should depend upon abstractions
Who coined the term “technical
debt”?
Hint: He is the creator of “wiki”
Ward Cunningham
When,duetoconstraints,Idesignquicklyanddirty,myprojectisloadedwithtechnicaldebt
NumberofAccessedVariables
CyclomaticComplexity
NewlyAddedService
PercentageofNewlyAddedService
Infusionwww.intooitus.com/products/infusion
Violates Single Responsibility Principle (SRP)
PublishedinJournalofObjectTechnology(Vol.12,No.2,2013) SGGanesh,TusharSharma,GirishSuryanarayana.TowardsaPrinciple-basedClassifica4onofStructuralDesignSmells.InJournalofObjectTechnology,vol.12,no.2,2013,pages1:1–29.doi:10.5381/jot.2013.12.2.a1 URL:hLp://www.jot.fm/issues/issue_2013_06/arPcle1.pdf(openaccess)
"This is a good book about ‘Design Smells’ – actually a great book – nicely organized - clearly written with
plenty of examples and a fair sprinkling of anecdotes."
- Will Tracz (Principal Research Scientist & Fellow, Lockheed Martin)
(review in ACM SIGSOFT Software Engineering Notes)
Believe in your ideas: how small or “insignificant” it may
appear to be!
"The critical design tool for software development is a mind well educated in design principles"
- Craig Larman
Interface Segregation Principle (ISP)
Clients should not be forced to depend upon interfaces they do not use
Example of ISP violation
// using java.util.Date Date today = new Date(); System.out.println(today);
$ java DateUse Wed Dec 02 17:17:08 IST 2015
Why should we get the time and timezone details if
I only want a date (e.g., date of birth)? Can I get rid
of these parts? No!
JSR 310: Java Date and Time API
Stephen Colebourne
Example of a fix (java.time)
// using java.time.LocalDate LocalDate today = LocalDate.now();System.out.println(today);
$ java DateUse 2015-12-02
I can use (and hence depend upon) only date related functionality (not
time, zone, etc)
Example of a fix (java.time)You can use only date, time, or even timezone, and combine them as needed (in java.time)!
LocalDate today = LocalDate.now(); System.out.println(today); LocalTime now = LocalTime.now(); System.out.println(now);
LocalDateTime todayAndNow = LocalDateTime.now(); System.out.println(todayAndNow);
ZonedDateTime todayAndNowInTokyo = ZonedDateTime.now(ZoneId.of("Asia/Tokyo")); System.out.println(todayAndNowInTokyo);
2015-12-02 17:37:22.647 2015-12-02T17:37:22.648 2015-12-02T21:07:22.649+09:00[Asia/Tokyo]
More types from java.time
Principles*
Abstrac/on*
Encapsula/on*
Modulariza/on*
Hierarchy*
Know and apply design principles
How to separate:a) code generation logic
from node types?b) how to support different
target types?
class Plus extends Expr { private Expr left, right; public Plus(Expr arg1, Expr arg2) { left = arg1; right = arg2; } public void genCode() { left.genCode(); right.genCode(); if(t == Target.JVM) { System.out.println("iadd"); } else { // DOTNET System.out.println("add"); } }}
class Plus extends Expr { private Expr left, right; public Plus(Expr arg1, Expr arg2) { left = arg1; right = arg2; } public Expr getLeft() { return left; } public Expr getRight() { return right; } public void accept(Visitor v) { v.visit(this); }}
class DOTNETVisitor extends Visitor { public void visit(Constant arg) { System.out.println("ldarg " + arg.getVal()); } public void visit(Plus plus) { genCode(plus.getLeft()); genCode(plus.getRight()); System.out.println("add"); } public void visit(Sub sub) { genCode(sub.getLeft()); genCode(sub.getRight()); System.out.println("sub"); } public void genCode(Expr expr) { expr.accept(this); }}
Source: “Design Patterns: Elements of Reusable Object-Oriented Software”, Erich Gamma, Richard Helm, Ralph Johnson and John Vlissides, Addison-Wesley,1994
❖ Many distinct and unrelated operations need to be performed on objects in an object structure, and you want to avoid “polluting” their classes with these operations
Represent an operation to be performed on the elements of an object structure. Visitor lets you define a new operation without changing the classes of the
elements on which it operations
❖ Create two class hierarchies: ❖ One for the elements
being operated on❖ One for the visitors that
define operations on the elements
{ mv = cw.visitMethod(ACC_PUBLIC + ACC_STATIC, "printOne", "()V", null, null); mv.visitCode();
mv.visitFieldInsn(GETSTATIC, "java/lang/System", "err", "Ljava/io/PrintStream;"); mv.visitLdcInsn("CALL println"); mv.visitMethodInsn(INVOKEVIRTUAL, "java/io/PrintStream", "println", "(Ljava/lang/String;)V", false);
mv.visitFieldInsn(GETSTATIC, "java/lang/System", "out", "Ljava/io/PrintStream;"); mv.visitLdcInsn("Hello World"); mv.visitMethodInsn(INVOKEVIRTUAL, "java/io/PrintStream", "println", "(Ljava/lang/String;)V", false);
mv.visitFieldInsn(GETSTATIC, "java/lang/System", "err", "Ljava/io/PrintStream;"); mv.visitLdcInsn("RETURN println"); mv.visitMethodInsn(INVOKEVIRTUAL, "java/io/PrintStream", "println", "(Ljava/lang/String;)V", false);
mv.visitInsn(RETURN); mv.visitMaxs(2, 0); mv.visitEnd(); }
Use of visitor pattern in ASM tool (coding example of usage)
source: http://web.cs.ucla.edu/~msb/cs239-tutorial/
Apply relevant design patterns for creating high-quality designs
Extract Superclass
Modularize JDK & JRE
Hide platform internal details such as sun.misc
Provide a module system for Java developers
Reference: http://paulbakker.io/java/java-9-modularity/
Perform periodic refactoring (floss or root canal)
When,&due&to&constraints,&I&design&quickly&and&dirty,&my&project&is&loaded&with&technical&debt&
Sonarqubehttp://www.sonarqube.org
Use technical debt approach to get buy-in for refactoring
Desirable relationship between architect and manager: partnership
Steve Jobs is viewed as an excellent speaker, business person, and leader. But
not much as an architect. He is an excellent architect.
Why?
In the movie Steve Jobs, he gives an example of a music composer. The composer directs the
people and focuses on the orchestra.
That is the case with a software architect as well.
So, what’s next?
Examples from Open Source architectures
• Architecture descriptions from well-known open source software from key contributors
• You can get insights on the architecture from practical illustrations
http://www.aosabook.org/en/index.html
Practical book on SA
• Useful to get an overview of software architecture
• Especially useful if you are a programmer
• Complete presentation available here.
Good first book on SA
• Shares practical experiences in architecting enterprise IT systems
• If you want to learn about enterprise architecture, read this
SEI’s book on SA
• Good coverage of Attribute Driven Design, Architecture Trade-off Analysis Method, Quality Attributes, etc
• If you want an in-depth understanding, read this
In-depth treatment on SA• Covers a wide range of
topics in detail (stypes, modelling, visualisation, analysis, etc)
• Perhaps the most comprehensive/in-depth discussion on important SA topics
• Slides available online here
THE book on design patterns
• One of the earliest and best books on design patterns
• Presents a catalog of 23 design patterns • Classified as creational,
structural, and behavioral patterns
THE book on architectural patterns
• One of the earliest and best books on architectural patterns
• Presents a catalog of architectural patterns with detailed discussion • Referred to as POSA
book • First book in the series
of books on patterns/styles
Anti-patterns in development,
architecture, …• A practical book that
covers anti-patterns in software architectures as well as projects
• Important to know anti-patterns so that we can avoid them
Architectural refactoring is
tough!• The focus is on refactoring
techniques, tools, and processes in the large-scale (i.e., architectural level)
• Covers architectural smells as well
Getting a systems
perspective • Emphasises on working with
stakeholders, and using viewpoints and perspectives
• Read this if you are looking for gaining an in-depth understanding of working with stakeholders and using viewpoints and perspectives
An early take on SA
• Provides a good overview of architectural patterns
• If you are interested in architectural styles, tools, languages and notations, etc, read this
Tips/techniques
perspective on SA
• Provides a collection of advices from working architects
• If you are already an architect and want to know best practices, read this
And don’t forget ours!Forewords by
Grady Booch and Dr. Stephane Ducasse
Upcoming bootcamps
Mod. Sw. Arch (5 Nov) SOLID Principles (19 Nov)IoT (26 Nov)S/w Arch (10 Oct)
What were your key takeaways?
Image Credits• http://it-ebooks.info/images/ebooks/3/restful_web_services_cookbook.jpg • http://southfloridaclassicalreview.com/wp-content/uploads/
2012/11/03THECLEVELANDORCHESTRA-CPJ.jpg • http://www.ndepend.com/NS/images/CodeQuery.jpg • https://www.toadworld.com/cfs-file/__key/communityserver-blogs-components-
weblogfiles/00-00-00-00-57/DN_2D00_4a.jpg • http://d152tffy3gbaeg.cloudfront.net/2015/02/AIBA-World-Boxing-
Championships.jpg • http://www.lucidica.com/wp-content/uploads/2014/03/www.jpg • http://restfulwebapis.org/images/rws-cover.jpg • http://akamaicovers.oreilly.com/images/0636920021575/cat.gif • http://it-ebooks.info/images/ebooks/6/pro_rest_api_development_with_node.js.jpg • https://www.packtpub.com/sites/default/files/9781783285754.jpg • https://www.packtpub.com/sites/default/files/
B04843_RESTful%20Web%20Services%20with%20Scala_.jpg • http://i.ndtvimg.com/i/2015-02/sholay-still_640x480_61423213425.jpg
[email protected] @GSamarthyam
www.codeops.tech slideshare.net/sgganesh
+91 98801 64463 bit.ly/sgganesh