SlideShare a Scribd company logo
Scala in Goozy Alexey Zlobin, e-Legion [email_address] @CheatEx
Index ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
What is Goozy? ,[object Object],[object Object],[object Object],[object Object]
Top-level architecture
Scala's place ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Why scala? ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
The team ,[object Object],[object Object],[object Object],[object Object]
Lift ,[object Object],[object Object],[object Object],[object Object]
Lift: issues ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Goozy API logical structure ,[object Object],[object Object]
Conceptual problems ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
The solution: cake pattern ,[object Object],[object Object],[object Object],[object Object]
Cake pattern: consequences ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
scalaz.Validation ,[object Object],[object Object],[object Object]
Initial solution: domain exceptions ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Error handling: own error type ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Validations and exceptions ,[object Object],[object Object]
Validations and exceptions ,[object Object],[object Object]
One more error for whatever happen ,[object Object],[object Object],[object Object]
The converter ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Useful utils: generic ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Useful utils: specific ,[object Object],[object Object]
Validation: the good thing ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Conversion: the problem ,[object Object]
Not so pretty ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Improved solution ,[object Object],[object Object],[object Object]
Error handling: big picture
Validation: pros and cons ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Lessons ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
References ,[object Object],[object Object],[object Object],[object Object]

More Related Content

What's hot

JavaScript - Chapter 5 - Operators
 JavaScript - Chapter 5 - Operators JavaScript - Chapter 5 - Operators
JavaScript - Chapter 5 - Operators
WebStackAcademy
 
Lab #2: Introduction to Javascript
Lab #2: Introduction to JavascriptLab #2: Introduction to Javascript
Lab #2: Introduction to Javascript
Walid Ashraf
 
Javascript basics for automation testing
Javascript  basics for automation testingJavascript  basics for automation testing
Javascript basics for automation testing
Vikas Thange
 
Xml processing in scala
Xml processing in scalaXml processing in scala
Xml processing in scala
Knoldus Inc.
 
JavaScript 101
JavaScript 101JavaScript 101
JavaScript 101
ygv2000
 
JavaScript - Chapter 9 - TypeConversion and Regular Expressions
 JavaScript - Chapter 9 - TypeConversion and Regular Expressions  JavaScript - Chapter 9 - TypeConversion and Regular Expressions
JavaScript - Chapter 9 - TypeConversion and Regular Expressions
WebStackAcademy
 
Activator and Reactive at Play NYC meetup
Activator and Reactive at Play NYC meetupActivator and Reactive at Play NYC meetup
Activator and Reactive at Play NYC meetup
Henrik Engström
 
jQuery - Chapter 5 - Ajax
jQuery - Chapter 5 -  AjaxjQuery - Chapter 5 -  Ajax
jQuery - Chapter 5 - Ajax
WebStackAcademy
 
Java script -23jan2015
Java script -23jan2015Java script -23jan2015
Java script -23jan2015
Sasidhar Kothuru
 
JavaScript
JavaScriptJavaScript
JavaScript
Reem Alattas
 
JavaScript Basics
JavaScript BasicsJavaScript Basics
JavaScript Basics
Mats Bryntse
 
Basics of JavaScript
Basics of JavaScriptBasics of JavaScript
Basics of JavaScript
Bala Narayanan
 
JavaScript: The Good Parts Or: How A C# Developer Learned To Stop Worrying An...
JavaScript: The Good Parts Or: How A C# Developer Learned To Stop Worrying An...JavaScript: The Good Parts Or: How A C# Developer Learned To Stop Worrying An...
JavaScript: The Good Parts Or: How A C# Developer Learned To Stop Worrying An...
Doug Jones
 
JavaScript - An Introduction
JavaScript - An IntroductionJavaScript - An Introduction
JavaScript - An Introduction
Manvendra Singh
 
Javascript
JavascriptJavascript
Javascript
Gita Kriz
 
JavaScript - Chapter 8 - Objects
 JavaScript - Chapter 8 - Objects JavaScript - Chapter 8 - Objects
JavaScript - Chapter 8 - Objects
WebStackAcademy
 
javascript objects
javascript objectsjavascript objects
javascript objects
Vijay Kalyan
 
Ad java prac sol set
Ad java prac sol setAd java prac sol set
Ad java prac sol set
Iram Ramrajkar
 
From object oriented to functional domain modeling
From object oriented to functional domain modelingFrom object oriented to functional domain modeling
From object oriented to functional domain modeling
Codemotion
 

What's hot (20)

JavaScript - Chapter 5 - Operators
 JavaScript - Chapter 5 - Operators JavaScript - Chapter 5 - Operators
JavaScript - Chapter 5 - Operators
 
Lab #2: Introduction to Javascript
Lab #2: Introduction to JavascriptLab #2: Introduction to Javascript
Lab #2: Introduction to Javascript
 
Javascript basics for automation testing
Javascript  basics for automation testingJavascript  basics for automation testing
Javascript basics for automation testing
 
Xml processing in scala
Xml processing in scalaXml processing in scala
Xml processing in scala
 
JavaScript 101
JavaScript 101JavaScript 101
JavaScript 101
 
JavaScript - Chapter 9 - TypeConversion and Regular Expressions
 JavaScript - Chapter 9 - TypeConversion and Regular Expressions  JavaScript - Chapter 9 - TypeConversion and Regular Expressions
JavaScript - Chapter 9 - TypeConversion and Regular Expressions
 
Activator and Reactive at Play NYC meetup
Activator and Reactive at Play NYC meetupActivator and Reactive at Play NYC meetup
Activator and Reactive at Play NYC meetup
 
jQuery - Chapter 5 - Ajax
jQuery - Chapter 5 -  AjaxjQuery - Chapter 5 -  Ajax
jQuery - Chapter 5 - Ajax
 
Java script -23jan2015
Java script -23jan2015Java script -23jan2015
Java script -23jan2015
 
Intro to JavaScript
Intro to JavaScriptIntro to JavaScript
Intro to JavaScript
 
JavaScript
JavaScriptJavaScript
JavaScript
 
JavaScript Basics
JavaScript BasicsJavaScript Basics
JavaScript Basics
 
Basics of JavaScript
Basics of JavaScriptBasics of JavaScript
Basics of JavaScript
 
JavaScript: The Good Parts Or: How A C# Developer Learned To Stop Worrying An...
JavaScript: The Good Parts Or: How A C# Developer Learned To Stop Worrying An...JavaScript: The Good Parts Or: How A C# Developer Learned To Stop Worrying An...
JavaScript: The Good Parts Or: How A C# Developer Learned To Stop Worrying An...
 
JavaScript - An Introduction
JavaScript - An IntroductionJavaScript - An Introduction
JavaScript - An Introduction
 
Javascript
JavascriptJavascript
Javascript
 
JavaScript - Chapter 8 - Objects
 JavaScript - Chapter 8 - Objects JavaScript - Chapter 8 - Objects
JavaScript - Chapter 8 - Objects
 
javascript objects
javascript objectsjavascript objects
javascript objects
 
Ad java prac sol set
Ad java prac sol setAd java prac sol set
Ad java prac sol set
 
From object oriented to functional domain modeling
From object oriented to functional domain modelingFrom object oriented to functional domain modeling
From object oriented to functional domain modeling
 

Similar to "Scala in Goozy", Alexey Zlobin

"Scala in Goozy", Alexey Zlobin
"Scala in Goozy", Alexey Zlobin "Scala in Goozy", Alexey Zlobin
"Scala in Goozy", Alexey Zlobin
Vasil Remeniuk
 
Enhance Web Performance
Enhance Web PerformanceEnhance Web Performance
Enhance Web PerformanceAdam Lu
 
Groovy Introduction - JAX Germany - 2008
Groovy Introduction - JAX Germany - 2008Groovy Introduction - JAX Germany - 2008
Groovy Introduction - JAX Germany - 2008
Guillaume Laforge
 
2008 - TechDays PT: WCF, JSON and AJAX for performance and manageability
2008 - TechDays PT: WCF, JSON and AJAX for performance and manageability2008 - TechDays PT: WCF, JSON and AJAX for performance and manageability
2008 - TechDays PT: WCF, JSON and AJAX for performance and manageability
Daniel Fisher
 
The 90-Day Startup with Google AppEngine for Java
The 90-Day Startup with Google AppEngine for JavaThe 90-Day Startup with Google AppEngine for Java
The 90-Day Startup with Google AppEngine for Java
David Chandler
 
Adventurous Merb
Adventurous MerbAdventurous Merb
Adventurous Merb
Matt Todd
 
SproutCore and the Future of Web Apps
SproutCore and the Future of Web AppsSproutCore and the Future of Web Apps
SproutCore and the Future of Web AppsMike Subelsky
 
J Query The Write Less Do More Javascript Library
J Query   The Write Less Do More Javascript LibraryJ Query   The Write Less Do More Javascript Library
J Query The Write Less Do More Javascript Libraryrsnarayanan
 
Javascript first-class citizenery
Javascript first-class citizeneryJavascript first-class citizenery
Javascript first-class citizenery
toddbr
 
Practical catalyst
Practical catalystPractical catalyst
Practical catalyst
dwm042
 
Laurens Van Den Oever Xopus Presentation
Laurens Van Den Oever Xopus PresentationLaurens Van Den Oever Xopus Presentation
Laurens Van Den Oever Xopus PresentationAjax Experience 2009
 
Javazone 2010-lift-framework-public
Javazone 2010-lift-framework-publicJavazone 2010-lift-framework-public
Javazone 2010-lift-framework-public
Timothy Perrett
 
5 x HTML5 worth using in APEX (5)
5 x HTML5 worth using in APEX (5)5 x HTML5 worth using in APEX (5)
5 x HTML5 worth using in APEX (5)
Christian Rokitta
 
540slidesofnodejsbackendhopeitworkforu.pdf
540slidesofnodejsbackendhopeitworkforu.pdf540slidesofnodejsbackendhopeitworkforu.pdf
540slidesofnodejsbackendhopeitworkforu.pdf
hamzadamani7
 
WebNet Conference 2012 - Designing complex applications using html5 and knock...
WebNet Conference 2012 - Designing complex applications using html5 and knock...WebNet Conference 2012 - Designing complex applications using html5 and knock...
WebNet Conference 2012 - Designing complex applications using html5 and knock...Fabio Franzini
 
Intro To JavaScript Unit Testing - Ran Mizrahi
Intro To JavaScript Unit Testing - Ran MizrahiIntro To JavaScript Unit Testing - Ran Mizrahi
Intro To JavaScript Unit Testing - Ran MizrahiRan Mizrahi
 
the next web now
the next web nowthe next web now
the next web nowzulin Gu
 
Using Task Queues and D3.js to build an analytics product on App Engine
Using Task Queues and D3.js to build an analytics product on App EngineUsing Task Queues and D3.js to build an analytics product on App Engine
Using Task Queues and D3.js to build an analytics product on App Engine
River of Talent
 
#SPSEMEA SharePoint & jQuery - What I wish I would have known a year ago..
#SPSEMEA SharePoint & jQuery - What I wish I would have known a year ago..#SPSEMEA SharePoint & jQuery - What I wish I would have known a year ago..
#SPSEMEA SharePoint & jQuery - What I wish I would have known a year ago..Mark Rackley
 

Similar to "Scala in Goozy", Alexey Zlobin (20)

"Scala in Goozy", Alexey Zlobin
"Scala in Goozy", Alexey Zlobin "Scala in Goozy", Alexey Zlobin
"Scala in Goozy", Alexey Zlobin
 
Enhance Web Performance
Enhance Web PerformanceEnhance Web Performance
Enhance Web Performance
 
Groovy Introduction - JAX Germany - 2008
Groovy Introduction - JAX Germany - 2008Groovy Introduction - JAX Germany - 2008
Groovy Introduction - JAX Germany - 2008
 
2008 - TechDays PT: WCF, JSON and AJAX for performance and manageability
2008 - TechDays PT: WCF, JSON and AJAX for performance and manageability2008 - TechDays PT: WCF, JSON and AJAX for performance and manageability
2008 - TechDays PT: WCF, JSON and AJAX for performance and manageability
 
The 90-Day Startup with Google AppEngine for Java
The 90-Day Startup with Google AppEngine for JavaThe 90-Day Startup with Google AppEngine for Java
The 90-Day Startup with Google AppEngine for Java
 
Adventurous Merb
Adventurous MerbAdventurous Merb
Adventurous Merb
 
SproutCore and the Future of Web Apps
SproutCore and the Future of Web AppsSproutCore and the Future of Web Apps
SproutCore and the Future of Web Apps
 
J Query The Write Less Do More Javascript Library
J Query   The Write Less Do More Javascript LibraryJ Query   The Write Less Do More Javascript Library
J Query The Write Less Do More Javascript Library
 
Javascript first-class citizenery
Javascript first-class citizeneryJavascript first-class citizenery
Javascript first-class citizenery
 
Practical catalyst
Practical catalystPractical catalyst
Practical catalyst
 
Laurens Van Den Oever Xopus Presentation
Laurens Van Den Oever Xopus PresentationLaurens Van Den Oever Xopus Presentation
Laurens Van Den Oever Xopus Presentation
 
Javazone 2010-lift-framework-public
Javazone 2010-lift-framework-publicJavazone 2010-lift-framework-public
Javazone 2010-lift-framework-public
 
5 x HTML5 worth using in APEX (5)
5 x HTML5 worth using in APEX (5)5 x HTML5 worth using in APEX (5)
5 x HTML5 worth using in APEX (5)
 
540slidesofnodejsbackendhopeitworkforu.pdf
540slidesofnodejsbackendhopeitworkforu.pdf540slidesofnodejsbackendhopeitworkforu.pdf
540slidesofnodejsbackendhopeitworkforu.pdf
 
WebNet Conference 2012 - Designing complex applications using html5 and knock...
WebNet Conference 2012 - Designing complex applications using html5 and knock...WebNet Conference 2012 - Designing complex applications using html5 and knock...
WebNet Conference 2012 - Designing complex applications using html5 and knock...
 
Magento code audit
Magento code auditMagento code audit
Magento code audit
 
Intro To JavaScript Unit Testing - Ran Mizrahi
Intro To JavaScript Unit Testing - Ran MizrahiIntro To JavaScript Unit Testing - Ran Mizrahi
Intro To JavaScript Unit Testing - Ran Mizrahi
 
the next web now
the next web nowthe next web now
the next web now
 
Using Task Queues and D3.js to build an analytics product on App Engine
Using Task Queues and D3.js to build an analytics product on App EngineUsing Task Queues and D3.js to build an analytics product on App Engine
Using Task Queues and D3.js to build an analytics product on App Engine
 
#SPSEMEA SharePoint & jQuery - What I wish I would have known a year ago..
#SPSEMEA SharePoint & jQuery - What I wish I would have known a year ago..#SPSEMEA SharePoint & jQuery - What I wish I would have known a year ago..
#SPSEMEA SharePoint & jQuery - What I wish I would have known a year ago..
 

More from Vasil Remeniuk

Product Minsk - РТБ и Программатик
Product Minsk - РТБ и ПрограмматикProduct Minsk - РТБ и Программатик
Product Minsk - РТБ и Программатик
Vasil Remeniuk
 
Работа с Akka Сluster, @afiskon, scalaby#14
Работа с Akka Сluster, @afiskon, scalaby#14Работа с Akka Сluster, @afiskon, scalaby#14
Работа с Akka Сluster, @afiskon, scalaby#14
Vasil Remeniuk
 
Cake pattern. Presentation by Alex Famin at scalaby#14
Cake pattern. Presentation by Alex Famin at scalaby#14Cake pattern. Presentation by Alex Famin at scalaby#14
Cake pattern. Presentation by Alex Famin at scalaby#14
Vasil Remeniuk
 
Scala laboratory: Globus. iteration #3
Scala laboratory: Globus. iteration #3Scala laboratory: Globus. iteration #3
Scala laboratory: Globus. iteration #3
Vasil Remeniuk
 
Testing in Scala by Adform research
Testing in Scala by Adform researchTesting in Scala by Adform research
Testing in Scala by Adform research
Vasil Remeniuk
 
Spark Intro by Adform Research
Spark Intro by Adform ResearchSpark Intro by Adform Research
Spark Intro by Adform ResearchVasil Remeniuk
 
Types by Adform Research, Saulius Valatka
Types by Adform Research, Saulius ValatkaTypes by Adform Research, Saulius Valatka
Types by Adform Research, Saulius ValatkaVasil Remeniuk
 
Types by Adform Research
Types by Adform ResearchTypes by Adform Research
Types by Adform ResearchVasil Remeniuk
 
Scalding by Adform Research, Alex Gryzlov
Scalding by Adform Research, Alex GryzlovScalding by Adform Research, Alex Gryzlov
Scalding by Adform Research, Alex GryzlovVasil Remeniuk
 
Scalding by Adform Research, Alex Gryzlov
Scalding by Adform Research, Alex GryzlovScalding by Adform Research, Alex Gryzlov
Scalding by Adform Research, Alex GryzlovVasil Remeniuk
 
Spark by Adform Research, Paulius
Spark by Adform Research, PauliusSpark by Adform Research, Paulius
Spark by Adform Research, PauliusVasil Remeniuk
 
Scala Style by Adform Research (Saulius Valatka)
Scala Style by Adform Research (Saulius Valatka)Scala Style by Adform Research (Saulius Valatka)
Scala Style by Adform Research (Saulius Valatka)Vasil Remeniuk
 
Spark intro by Adform Research
Spark intro by Adform ResearchSpark intro by Adform Research
Spark intro by Adform ResearchVasil Remeniuk
 
SBT by Aform Research, Saulius Valatka
SBT by Aform Research, Saulius ValatkaSBT by Aform Research, Saulius Valatka
SBT by Aform Research, Saulius ValatkaVasil Remeniuk
 
Scala laboratory: Globus. iteration #2
Scala laboratory: Globus. iteration #2Scala laboratory: Globus. iteration #2
Scala laboratory: Globus. iteration #2
Vasil Remeniuk
 
Testing in Scala. Adform Research
Testing in Scala. Adform ResearchTesting in Scala. Adform Research
Testing in Scala. Adform Research
Vasil Remeniuk
 
Scala laboratory. Globus. iteration #1
Scala laboratory. Globus. iteration #1Scala laboratory. Globus. iteration #1
Scala laboratory. Globus. iteration #1
Vasil Remeniuk
 
Cassandra + Spark + Elk
Cassandra + Spark + ElkCassandra + Spark + Elk
Cassandra + Spark + Elk
Vasil Remeniuk
 
Опыт использования Spark, Основано на реальных событиях
Опыт использования Spark, Основано на реальных событияхОпыт использования Spark, Основано на реальных событиях
Опыт использования Spark, Основано на реальных событиях
Vasil Remeniuk
 
ETL со Spark
ETL со SparkETL со Spark
ETL со Spark
Vasil Remeniuk
 

More from Vasil Remeniuk (20)

Product Minsk - РТБ и Программатик
Product Minsk - РТБ и ПрограмматикProduct Minsk - РТБ и Программатик
Product Minsk - РТБ и Программатик
 
Работа с Akka Сluster, @afiskon, scalaby#14
Работа с Akka Сluster, @afiskon, scalaby#14Работа с Akka Сluster, @afiskon, scalaby#14
Работа с Akka Сluster, @afiskon, scalaby#14
 
Cake pattern. Presentation by Alex Famin at scalaby#14
Cake pattern. Presentation by Alex Famin at scalaby#14Cake pattern. Presentation by Alex Famin at scalaby#14
Cake pattern. Presentation by Alex Famin at scalaby#14
 
Scala laboratory: Globus. iteration #3
Scala laboratory: Globus. iteration #3Scala laboratory: Globus. iteration #3
Scala laboratory: Globus. iteration #3
 
Testing in Scala by Adform research
Testing in Scala by Adform researchTesting in Scala by Adform research
Testing in Scala by Adform research
 
Spark Intro by Adform Research
Spark Intro by Adform ResearchSpark Intro by Adform Research
Spark Intro by Adform Research
 
Types by Adform Research, Saulius Valatka
Types by Adform Research, Saulius ValatkaTypes by Adform Research, Saulius Valatka
Types by Adform Research, Saulius Valatka
 
Types by Adform Research
Types by Adform ResearchTypes by Adform Research
Types by Adform Research
 
Scalding by Adform Research, Alex Gryzlov
Scalding by Adform Research, Alex GryzlovScalding by Adform Research, Alex Gryzlov
Scalding by Adform Research, Alex Gryzlov
 
Scalding by Adform Research, Alex Gryzlov
Scalding by Adform Research, Alex GryzlovScalding by Adform Research, Alex Gryzlov
Scalding by Adform Research, Alex Gryzlov
 
Spark by Adform Research, Paulius
Spark by Adform Research, PauliusSpark by Adform Research, Paulius
Spark by Adform Research, Paulius
 
Scala Style by Adform Research (Saulius Valatka)
Scala Style by Adform Research (Saulius Valatka)Scala Style by Adform Research (Saulius Valatka)
Scala Style by Adform Research (Saulius Valatka)
 
Spark intro by Adform Research
Spark intro by Adform ResearchSpark intro by Adform Research
Spark intro by Adform Research
 
SBT by Aform Research, Saulius Valatka
SBT by Aform Research, Saulius ValatkaSBT by Aform Research, Saulius Valatka
SBT by Aform Research, Saulius Valatka
 
Scala laboratory: Globus. iteration #2
Scala laboratory: Globus. iteration #2Scala laboratory: Globus. iteration #2
Scala laboratory: Globus. iteration #2
 
Testing in Scala. Adform Research
Testing in Scala. Adform ResearchTesting in Scala. Adform Research
Testing in Scala. Adform Research
 
Scala laboratory. Globus. iteration #1
Scala laboratory. Globus. iteration #1Scala laboratory. Globus. iteration #1
Scala laboratory. Globus. iteration #1
 
Cassandra + Spark + Elk
Cassandra + Spark + ElkCassandra + Spark + Elk
Cassandra + Spark + Elk
 
Опыт использования Spark, Основано на реальных событиях
Опыт использования Spark, Основано на реальных событияхОпыт использования Spark, Основано на реальных событиях
Опыт использования Spark, Основано на реальных событиях
 
ETL со Spark
ETL со SparkETL со Spark
ETL со Spark
 

Recently uploaded

Smart TV Buyer Insights Survey 2024 by 91mobiles.pdf
Smart TV Buyer Insights Survey 2024 by 91mobiles.pdfSmart TV Buyer Insights Survey 2024 by 91mobiles.pdf
Smart TV Buyer Insights Survey 2024 by 91mobiles.pdf
91mobiles
 
Accelerate your Kubernetes clusters with Varnish Caching
Accelerate your Kubernetes clusters with Varnish CachingAccelerate your Kubernetes clusters with Varnish Caching
Accelerate your Kubernetes clusters with Varnish Caching
Thijs Feryn
 
Assuring Contact Center Experiences for Your Customers With ThousandEyes
Assuring Contact Center Experiences for Your Customers With ThousandEyesAssuring Contact Center Experiences for Your Customers With ThousandEyes
Assuring Contact Center Experiences for Your Customers With ThousandEyes
ThousandEyes
 
Search and Society: Reimagining Information Access for Radical Futures
Search and Society: Reimagining Information Access for Radical FuturesSearch and Society: Reimagining Information Access for Radical Futures
Search and Society: Reimagining Information Access for Radical Futures
Bhaskar Mitra
 
IOS-PENTESTING-BEGINNERS-PRACTICAL-GUIDE-.pptx
IOS-PENTESTING-BEGINNERS-PRACTICAL-GUIDE-.pptxIOS-PENTESTING-BEGINNERS-PRACTICAL-GUIDE-.pptx
IOS-PENTESTING-BEGINNERS-PRACTICAL-GUIDE-.pptx
Abida Shariff
 
PHP Frameworks: I want to break free (IPC Berlin 2024)
PHP Frameworks: I want to break free (IPC Berlin 2024)PHP Frameworks: I want to break free (IPC Berlin 2024)
PHP Frameworks: I want to break free (IPC Berlin 2024)
Ralf Eggert
 
The Future of Platform Engineering
The Future of Platform EngineeringThe Future of Platform Engineering
The Future of Platform Engineering
Jemma Hussein Allen
 
"Impact of front-end architecture on development cost", Viktor Turskyi
"Impact of front-end architecture on development cost", Viktor Turskyi"Impact of front-end architecture on development cost", Viktor Turskyi
"Impact of front-end architecture on development cost", Viktor Turskyi
Fwdays
 
To Graph or Not to Graph Knowledge Graph Architectures and LLMs
To Graph or Not to Graph Knowledge Graph Architectures and LLMsTo Graph or Not to Graph Knowledge Graph Architectures and LLMs
To Graph or Not to Graph Knowledge Graph Architectures and LLMs
Paul Groth
 
FIDO Alliance Osaka Seminar: Passkeys at Amazon.pdf
FIDO Alliance Osaka Seminar: Passkeys at Amazon.pdfFIDO Alliance Osaka Seminar: Passkeys at Amazon.pdf
FIDO Alliance Osaka Seminar: Passkeys at Amazon.pdf
FIDO Alliance
 
Dev Dives: Train smarter, not harder – active learning and UiPath LLMs for do...
Dev Dives: Train smarter, not harder – active learning and UiPath LLMs for do...Dev Dives: Train smarter, not harder – active learning and UiPath LLMs for do...
Dev Dives: Train smarter, not harder – active learning and UiPath LLMs for do...
UiPathCommunity
 
Transcript: Selling digital books in 2024: Insights from industry leaders - T...
Transcript: Selling digital books in 2024: Insights from industry leaders - T...Transcript: Selling digital books in 2024: Insights from industry leaders - T...
Transcript: Selling digital books in 2024: Insights from industry leaders - T...
BookNet Canada
 
GDG Cloud Southlake #33: Boule & Rebala: Effective AppSec in SDLC using Deplo...
GDG Cloud Southlake #33: Boule & Rebala: Effective AppSec in SDLC using Deplo...GDG Cloud Southlake #33: Boule & Rebala: Effective AppSec in SDLC using Deplo...
GDG Cloud Southlake #33: Boule & Rebala: Effective AppSec in SDLC using Deplo...
James Anderson
 
From Daily Decisions to Bottom Line: Connecting Product Work to Revenue by VP...
From Daily Decisions to Bottom Line: Connecting Product Work to Revenue by VP...From Daily Decisions to Bottom Line: Connecting Product Work to Revenue by VP...
From Daily Decisions to Bottom Line: Connecting Product Work to Revenue by VP...
Product School
 
From Siloed Products to Connected Ecosystem: Building a Sustainable and Scala...
From Siloed Products to Connected Ecosystem: Building a Sustainable and Scala...From Siloed Products to Connected Ecosystem: Building a Sustainable and Scala...
From Siloed Products to Connected Ecosystem: Building a Sustainable and Scala...
Product School
 
JMeter webinar - integration with InfluxDB and Grafana
JMeter webinar - integration with InfluxDB and GrafanaJMeter webinar - integration with InfluxDB and Grafana
JMeter webinar - integration with InfluxDB and Grafana
RTTS
 
FIDO Alliance Osaka Seminar: The WebAuthn API and Discoverable Credentials.pdf
FIDO Alliance Osaka Seminar: The WebAuthn API and Discoverable Credentials.pdfFIDO Alliance Osaka Seminar: The WebAuthn API and Discoverable Credentials.pdf
FIDO Alliance Osaka Seminar: The WebAuthn API and Discoverable Credentials.pdf
FIDO Alliance
 
GraphRAG is All You need? LLM & Knowledge Graph
GraphRAG is All You need? LLM & Knowledge GraphGraphRAG is All You need? LLM & Knowledge Graph
GraphRAG is All You need? LLM & Knowledge Graph
Guy Korland
 
FIDO Alliance Osaka Seminar: Passkeys and the Road Ahead.pdf
FIDO Alliance Osaka Seminar: Passkeys and the Road Ahead.pdfFIDO Alliance Osaka Seminar: Passkeys and the Road Ahead.pdf
FIDO Alliance Osaka Seminar: Passkeys and the Road Ahead.pdf
FIDO Alliance
 
ODC, Data Fabric and Architecture User Group
ODC, Data Fabric and Architecture User GroupODC, Data Fabric and Architecture User Group
ODC, Data Fabric and Architecture User Group
CatarinaPereira64715
 

Recently uploaded (20)

Smart TV Buyer Insights Survey 2024 by 91mobiles.pdf
Smart TV Buyer Insights Survey 2024 by 91mobiles.pdfSmart TV Buyer Insights Survey 2024 by 91mobiles.pdf
Smart TV Buyer Insights Survey 2024 by 91mobiles.pdf
 
Accelerate your Kubernetes clusters with Varnish Caching
Accelerate your Kubernetes clusters with Varnish CachingAccelerate your Kubernetes clusters with Varnish Caching
Accelerate your Kubernetes clusters with Varnish Caching
 
Assuring Contact Center Experiences for Your Customers With ThousandEyes
Assuring Contact Center Experiences for Your Customers With ThousandEyesAssuring Contact Center Experiences for Your Customers With ThousandEyes
Assuring Contact Center Experiences for Your Customers With ThousandEyes
 
Search and Society: Reimagining Information Access for Radical Futures
Search and Society: Reimagining Information Access for Radical FuturesSearch and Society: Reimagining Information Access for Radical Futures
Search and Society: Reimagining Information Access for Radical Futures
 
IOS-PENTESTING-BEGINNERS-PRACTICAL-GUIDE-.pptx
IOS-PENTESTING-BEGINNERS-PRACTICAL-GUIDE-.pptxIOS-PENTESTING-BEGINNERS-PRACTICAL-GUIDE-.pptx
IOS-PENTESTING-BEGINNERS-PRACTICAL-GUIDE-.pptx
 
PHP Frameworks: I want to break free (IPC Berlin 2024)
PHP Frameworks: I want to break free (IPC Berlin 2024)PHP Frameworks: I want to break free (IPC Berlin 2024)
PHP Frameworks: I want to break free (IPC Berlin 2024)
 
The Future of Platform Engineering
The Future of Platform EngineeringThe Future of Platform Engineering
The Future of Platform Engineering
 
"Impact of front-end architecture on development cost", Viktor Turskyi
"Impact of front-end architecture on development cost", Viktor Turskyi"Impact of front-end architecture on development cost", Viktor Turskyi
"Impact of front-end architecture on development cost", Viktor Turskyi
 
To Graph or Not to Graph Knowledge Graph Architectures and LLMs
To Graph or Not to Graph Knowledge Graph Architectures and LLMsTo Graph or Not to Graph Knowledge Graph Architectures and LLMs
To Graph or Not to Graph Knowledge Graph Architectures and LLMs
 
FIDO Alliance Osaka Seminar: Passkeys at Amazon.pdf
FIDO Alliance Osaka Seminar: Passkeys at Amazon.pdfFIDO Alliance Osaka Seminar: Passkeys at Amazon.pdf
FIDO Alliance Osaka Seminar: Passkeys at Amazon.pdf
 
Dev Dives: Train smarter, not harder – active learning and UiPath LLMs for do...
Dev Dives: Train smarter, not harder – active learning and UiPath LLMs for do...Dev Dives: Train smarter, not harder – active learning and UiPath LLMs for do...
Dev Dives: Train smarter, not harder – active learning and UiPath LLMs for do...
 
Transcript: Selling digital books in 2024: Insights from industry leaders - T...
Transcript: Selling digital books in 2024: Insights from industry leaders - T...Transcript: Selling digital books in 2024: Insights from industry leaders - T...
Transcript: Selling digital books in 2024: Insights from industry leaders - T...
 
GDG Cloud Southlake #33: Boule & Rebala: Effective AppSec in SDLC using Deplo...
GDG Cloud Southlake #33: Boule & Rebala: Effective AppSec in SDLC using Deplo...GDG Cloud Southlake #33: Boule & Rebala: Effective AppSec in SDLC using Deplo...
GDG Cloud Southlake #33: Boule & Rebala: Effective AppSec in SDLC using Deplo...
 
From Daily Decisions to Bottom Line: Connecting Product Work to Revenue by VP...
From Daily Decisions to Bottom Line: Connecting Product Work to Revenue by VP...From Daily Decisions to Bottom Line: Connecting Product Work to Revenue by VP...
From Daily Decisions to Bottom Line: Connecting Product Work to Revenue by VP...
 
From Siloed Products to Connected Ecosystem: Building a Sustainable and Scala...
From Siloed Products to Connected Ecosystem: Building a Sustainable and Scala...From Siloed Products to Connected Ecosystem: Building a Sustainable and Scala...
From Siloed Products to Connected Ecosystem: Building a Sustainable and Scala...
 
JMeter webinar - integration with InfluxDB and Grafana
JMeter webinar - integration with InfluxDB and GrafanaJMeter webinar - integration with InfluxDB and Grafana
JMeter webinar - integration with InfluxDB and Grafana
 
FIDO Alliance Osaka Seminar: The WebAuthn API and Discoverable Credentials.pdf
FIDO Alliance Osaka Seminar: The WebAuthn API and Discoverable Credentials.pdfFIDO Alliance Osaka Seminar: The WebAuthn API and Discoverable Credentials.pdf
FIDO Alliance Osaka Seminar: The WebAuthn API and Discoverable Credentials.pdf
 
GraphRAG is All You need? LLM & Knowledge Graph
GraphRAG is All You need? LLM & Knowledge GraphGraphRAG is All You need? LLM & Knowledge Graph
GraphRAG is All You need? LLM & Knowledge Graph
 
FIDO Alliance Osaka Seminar: Passkeys and the Road Ahead.pdf
FIDO Alliance Osaka Seminar: Passkeys and the Road Ahead.pdfFIDO Alliance Osaka Seminar: Passkeys and the Road Ahead.pdf
FIDO Alliance Osaka Seminar: Passkeys and the Road Ahead.pdf
 
ODC, Data Fabric and Architecture User Group
ODC, Data Fabric and Architecture User GroupODC, Data Fabric and Architecture User Group
ODC, Data Fabric and Architecture User Group
 

"Scala in Goozy", Alexey Zlobin

Editor's Notes

  1. Данном докладе я расскажу о нашем с Юрой опыте использования Scala в живом проекте. Я не буду пытаться давать обзоры использованных технологий, в место этого доклад будет сконцентрирован на встреченных и найденных решениях.
  2. Мой доклад будет проходить по следующему плану: 1. Сначала я кратко расскажу о сервисе который мы собственно разрабатываем. 2. Потом я рассмотрю место которое занимает Scala, точнее написанные на ней компоненты в проекте. И расскажу почему именно она была выбрана для их реализации. 3. Далее расскажу о том как в проекте используется известный фреймворк lift. 4. В четвёртой части я дам обзор логического устройства и того как на его становление повлиял широко разрекламированный cake pattern. 5. В пятой части будет рассказано про использовани библиотеки Scalaz в проекте. Закончу я  тем, что расскажу про основные усвоенные из этого проекта уроки.
  3. Итак, наш проект Goozy - социальная сеть, построенная вокруг концепции стикеров дял интернет-страниц. Основаня идея в том, что пользователь может оставлять в сети заметки с помощью браузерных плагинов и делиться имим со своими друзьями. Тут важно заметить, что помимо собственно оставления и просмотра стикера центральной концепцией интерфейса сервиса является так называемая "лента" - поток стикеров и комментариев от друзей данного пользователя. Проект уже достаточно пожилой и пережил несколько итераций разработки. Текущая итерация началась зимой с амбициозной целью построения бэкэнда для этого сервиса, способного обслуживать до миллиона активных пользователей. Современная архитектура проета выглядит так:...
  4. Хранение данных доверено популярной ныне MongoDB. Это документоориентированаая БД, со встроенной поддержкой шардинга и репликации. Непосредственно с ней общаются так анзываемые сервера API. Они экспортируют REST интервейсы доступа к данным. Кроме того они отвечают за взаимодействие с внешними сервисами, такими как S3 и системы полнотекстового поиска. Несколько серверов подключаются к балансировщику нагрузки. К нему же подключаютс сервера с развернутым порталом проекта. Портал не общается напряму с БД и делегирует большинство взаимодействий с внешними сервисами API. Во внешний мир смотрит специально настроенный интерфейс балансера, открывающий доступ к порталу и предназначенным для этого методам API. Клиентские приложения прозрачно общаются с API и порталом по протоколу HTTP.
  5. Основные функции, которые он на себя берёт это: 1. Управление доступом к хранилищам данных. 2. Выполнение части задач обработки данных в фоне. 3. Отсылка писем. 4. Направление необходимых данных в текстовые индексы. Тут встаёт вопрос: почему же для его реализации был выбран язык Scala? У меня есть следующие ответы...
  6. Во-первых программы на нём быстры. Плохой алгоритм он не выправит, но написанный хорошо скорее всего будет работать со скоростью не очень далёкой от максимальной. Во-вторых он краток. Он не выедает время на ввод текста и поиск по нему. Более менее целостный компонент приложения обычно умещается на одном экране. Это очень положительно влияет на скорость работы. Он выразиетен. Если на нём нужно что-то сказать можно взять и сказать именно это. С ним нужда в ритуалах, не связанных с решаемой проблемой, минимальна. В есть целый ряд инструментов отсутствующих в других ОО-языках. Многие из них радикально упрощают решение архитектурных проблем. В первую очередь это traits (Кстати где-то видел их перевод как "типажи". Кто-нибудь им пользуется?). Кроме того более глубокая поддержка обобщённых типов положительно влияет ан стандартную библиотеку и соответственно почти на весь код. В ней есть развитая поддержка функционального программирования. В первую очередь это простая работа с константами. Как следствие значительно проще, чем в Java пистаь корректный многопоточный код. Ну и наконец нам доступен весь огромный арсенах библиотек, написанных на Java. Прежде чем углубиться в технические моменты пара слов о том, что вызывает наибольшие страхи перед переходом на Scala. Это люди, которые ан ней должны писать...
  7. Итак, команда наша состояла из 2 человек. Все имели заметный опыт работы с Java в самых разнообразных направлениях. Ну и что важно все фанаты своего дела и любят новые технологические игрушки. Как следствие вопросы вроде разобраться с новой штукой или продраться через трёхэтажную ругань компилятора на несходящиеся типы никогда не превращались в проблемы. Теперь можно переходить и к технической стороне вопроса. Первое о чём хочется рассказать - это опыт применения Lift'а для создания REST-сервиса.
  8. В связи с узостью решаемой задачи из всего огромного вреймворка импользуется буквально два модуля. Это поддержка REST сервисов и автоматическая сериализация case классов в JSON. Несмотря на скромность используемого функционала мы натолкнулись на несколько проблем.
  9. Две связаны с производительностью и одна эстетического плана. Во первых мы столкнулись с очень низкой производительностью встроенного механизма интернационализации. Большие критические секции в его коде привели к тому, что на топовом EC2 инстансе мы могли обрабатывать порядка 20 запросов в секунду. Надо сказать, что это был очень грустный момент. Крутая модная БД, быстрый язык, ооочень много ядер и 20 запросов :( Но проблема нашлась быстро, код был переведён на на стандартные ResourceBundles, что увиличило пропускную способность в 4 раза. Вторая проблема выявленная, но не решённая - это потребление памяти при сериализации в JSON. Если не вдаваться в детали, то одни и те-же данные там переупаковываются 3 раза,, что накладывает определённые ограничения на производительность... Ну и последнее это сложный исходный код самого Lift. Местами просто сборник худших стереотипов о Scala. На этапе освоения невозможность быстро читать исходный код сильно тормозила разработку.
  10. Теперь давайте немного рассмотрим архитектуру нашего API сервера. Логически она разнесена на честные (кстати впервые в моей практике) три уровня. Контролер - это код непосредственно связанный с лифтом и осуществляющий преобразование данных из HTTP во внутренние модели данных и обратно. Сервисы это фасады для операций, реализуемых сервером. Ещё целостные в терминах API (одна экспортируемая наружу операция - один метод), но уже оперирующие внутренними моделями данных. Внутри себя они координируют работу нескольких служб более низкого уровня, таких как рассылка почты,текстовый поиск, взаимодействие с внешними сервисами. Сложные операции с данными делегируются третьему уровню. Он отвечает за сохранение моделей данных в БД и их загрузку оттуда. Каждый уровень состоит из нескольких компонентов, образованных операциями над близкими классами моделей: пользователями, стикерами, лентой и т.д. Обеспечение поддерживаемости всего этого хозяйства имеет определённые трудности...
  11. Во-первых компоненты каждого уровня обычно зависят друг от друга. Скажем загрузка объекта стикера требует загрузки объекта пользователя, который его оставил и т.п. Вторая проблема сотоит в том, и от предыдущего уровня компоненты имеют несколько зависимостей. Кроме того внутри одного уровня обычно имеется большое количество разделяемых данных и объектов. Например сконфигурированный пул соединений с БД или сервисом поиска.
  12. Решение этих труднойстей мы попробовали найти в популярном в сообществе cake pattern. (Уточнить нужны ли пояснения) Я попробую сформулировать основные результаты этого решения...
  13. Из положительного мы имеем: 1. Архитектура приложения выражена непосредственно в коде объёмом около 100 строк. Имеется в виду собственно конструирование рантайм компонентом и описанием всех зависимостей между ними. 2. Корректность описания зависимостей проверяется компилятором. 3. Сами компоненты получились сравнительно компактными. Размер отдельных классов в основном не превышает 100 строк. Основные проблемы которые при этом наблюдаются: 1. Длинные (иногда очень длинные) списки зависимостей у отдельных компонентов. Видимо это проблема нашего дизайна, но при использовании например Spring её можно спрятать подальше. 2. Неявная зависимость от порядка перечисления примесей в описании рантайм конфигурации. Случайное изменение этого порядка рефакторинг связанный с переносом функционала между компонентами часто видёт к падению приложения при старте. К счастью этот класс ошибок гарантированно отлавливается простейшим тестом. 3. Не понятно что делать, если у нас есть несколько одинаковых по типу зависимостей, которые однако должны иметь разные имплементации в рантайме. Например у нас есть две очереди сообщений и компонент должен уметь обращаться к обоим. Создание отдельного класса для каждого назначения одного и того же интерфейса не кажется хорошей идеей. Теперь пора рассказать про нашу любимую игрушку в проекте:
  14. Одной из проблем вставшей на ранней стадии разработки проекта был корректные ответы клиенту при ошибках. То есть ответ должен был содержать краткое её описание, например "входной параметр вне допустимого диапазона" и правильный http-код. Естественно если у нас обнаруживалось несколько проблем доложить хотелось обо всех, что крайне осложняло использование исключений для этой цели. В то время я как раз наткнулся на пост известного скала-блоггера Дебашиша Гоша. И однажды я бросил Юре ссылку на блогпост с описанием обработки ошибок с помощью апликативных функторов. День спокойно проработал над какой-то фичёй, а уже следующим утром при обновлении и общего репозитария получил код из того поста...
  15. Как собственно осуществлялся переход. В начале у нас был набор наших исключений которые при случае выбрасывались. И некоторые из них преобразовывались в ответы клиенту. Выглядели они так.
  16. Собственно первым шагом для использования валидаций всегда должно становится определение типа ошибки. Так как конечной целью всей этой затеи было отправлять корректные ответы по http, то были созданы вот такие вот классы (их естественно было много больше) которые несли в себе данные об ошибке и нужный http-код. Всё было хорошо мы начали использоать вот такие вот структуры для сообщений об ошибках в параметрах запросов. Потихоньку распространяли это вглубь, на логику работы с БД... Но тут до нас дошло
  17. В JVM бывают исключения. Они бывают по разным причинам, именно их используют многие замечательные библиотеки вроде casbah. И оборачивать каждое обращение к ним в try/catch абсолютно нереально. Мало того, кода бросающего наши исключения уже было немало.
  18. Для решения проблемы была выбрана следующая стратегия: определить функцию конвертер из всех исключений в наши ошибки. Написать небольшую бибилотеку которая упростила бы обращение к этой функции из нашего кода.
  19. В первую очередь мы добавили ещё одну унверсальную ошибку. Полагая что непредвиденное и не имеющее соответствующего маппинга исключение - это наш косяк и его надо рапортавать 500 кодом.
  20. Написали такой вот простой конвертер.
  21. И маленький набор утилит. Свой алиас для валидаций с подставленным типом ошибки. Обратите внимание что это очень удобно делать в любом проекте, так как мы получаем kind с 1 параметром, что в силу особенностей scala радикально упрощает написание некоторых сигнатур. Посмотрите на пример использования sequence - 80% этого ужаса уходит если есть такой алиас. Здесь я использовал очень интересную и очень малоизвестную часть стандартной библиотеки scala.control.Exceptions. Она демонстрирует интересный подход к проблеме функциональной обработки исключений, советую посмотреть.
  22. Ещё была написана куча утилит для безопасного парсинга разных типов данных, работы с mongo объектами и ещё чем-то... Я их сюда не вставлял, так как перед новым годом накатал изрядный текст не тему как их писать, они достаточно тривиальны.
  23. Имея весть этот арсенал мы начали плавно двигать валидации глбже и глубже в наш код... Получилось вполне себе мило, была куча вот такого вот симпатичного кода. Хаскелисты должны прослезится...
  24. Но в процессе появлялся и другой код...
  25. Вот такой вот... Возможно причина его появления в моём низком мастерстве использования этого аппарата. Но мне кажется что это фундаментальная проблема: есть класс кода который значительно читабельнее в старой доброй императивной форме с исключениями.
  26. Так это или нет, нов итоге сформировался такой подход. Нов итоге сформировался такой подход: там где это проще мы пользуемся исключениями. Но стараемся переходить на валидации как можно раньше (на более низких уровнях логики) для того чтобы высокоуровневая логика могла следовать букве ФП.
  27. Итак, код, совершающий много всякого ввода-вывода из сображений производительности и читабельности живёт с исключениями. интерфейсные методы небезопасных компонентов заворачиваются в специальные обёртки. Они перехватывают исключения и преобразуют их по определённым правилам в ошибки валидации. Правила задаются в одном месте глобально для всего приложения. Кстати при этом использовался стандартный пакет control.exceptions. Уровень сервисов и контроллеры оперируют более менее надёжными значениями, однако и они не застрахованы от выброса исключений. Для того чтобы обеспечить надёжную обработки и репортинг об ошибках не уровне лифта встроен дополнительный обработчик исключений, который делегирует всё к тому-же методу преобразования. На переходе между контроллерами и лифтом встроен код, который знает как из ошибок строить корректные с точки зрения HTTP ответы. В общем данная схема показала свою работоспособность. И более того устойчивость к отдельным нарушениям описанных соглашений (в том смысле, что отчёты об ошибках становятся менее точны, но не сводятся к метаю в пользователя стэктрейсами).
  28. Итак, каков наш опыт использования валидаций. Во-первых положительные моменты: 1. Более менее понятный способ аггрегации ошибок валидации. 2. Мало того это практически единственный способ который может работать в условиях нескольких десятков параметров с 2-3 ограничениями на каждый. 3. Также нам удолась выстроить достаточно унифицированный подход к рапортам об ошибках как во входящих параметрах, так и об ошибках времени выполнения. 4. Ну и корректность обработки ошибок проверяется автоматически компилятором. Из проблемных моментов можно выделить: 1. Монады и функторы требуют долгой медитации, которая не проходит бесследно для сознания. 2. Иногда бывает сложно найти общий язык с компилятором. 3. Ну и наиболее сложная для преодоления проблема...