Architecting Alive Apps

Jorge Ortiz
Jorge OrtizOwner at PoWWaU
#Swift3Arch
Architecting Alive
Apps
Jorge D. Ortiz Fuentes
@jdortiz
#Swift3CA
A Canonical
Examples
Production
#Swift3CA
Agenda
★ Advanced Architecture Background
★ Application for Frameworks
★ Real World Example
★ Recommendations
★ Recap
Advanced Architecture
The Classics
#Swift3Arch
Clean Architecture: iOS
App
Delegate
View (VC) Presenter Interactor
Entity
Gateway
Connector
#Swift3Arch
Clean Architecture Layers
UI
DB
Preseters
Gateways
Use
cases
Entities
D
ependencies
#Swift3CA
View
class AddProgrammerViewController: UITableViewController, UITextFieldDelegate {
var presenter: AddProgrammerPresenter!
var connector: AddProgrammerConnector!
@IBOutlet weak var nameTextField: UITextField!
override func viewDidLoad() {
super.viewDidLoad()
presenter.viewReady()
}
@IBAction func cancel(_ sender: Any) { presenter.cancel() }
@IBAction func save(_ sender: Any) { presenter.save() }
}
extension AddProgrammerViewController: AddProgrammerView {
func display(title: String) { self.title = title }
func enableSaveButton(_ enable: Bool) { saveButton.isEnabled = enable }
}
#Swift3CA
Presenter
class AddProgrammerPresenter {
private let useCaseFactory: UseCaseFactory
weak var view: AddProgrammerView!
private var programmer = ProgrammerRequest() {
didSet { updateView() }
}
init(useCaseFactory: UseCaseFactory) { self.useCaseFactory = useCaseFactory }
func viewReady() { configureView() }
private func updateView() {
showTitle()
!// …
configureSaveAbility()
}
private func configureView() {
setUpName()
!// …
updateView()
}
private func showTitle() { view.display(title: programmer.name) }
}
#Swift3CA
Interactor
class AddProgrammerUseCase {
fileprivate let entityGateway: EntityGateway
fileprivate let request: ProgrammerRequest
fileprivate let completion: AddProgrammerCompletion
init(entityGateway: EntityGateway, request: ProgrammerRequest, completion:
@escaping AddProgrammerCompletion) {
self.entityGateway = entityGateway
self.request = request
self.completion = completion
}
}
extension AddProgrammerUseCase: UseCase {
func execute() {
let programmer = Programmer(…)
entityGateway.create(programmer: programmer) {
self.completion()
}
}
}
#Swift3CA
Entity Gateway
class InMemoryRepo {
var fetchNotifier: FetchProgrammersCompletion?
fileprivate var programmers = […]
}
extension InMemoryRepo: EntityGateway {
func create(programmer: Programmer, completion: @escaping
CreateProgrammerCompletion) {
programmers.append(programmer)
completion()
self.fetchNotifier?(programmers)
}
}
#Swift3CA
Connector
class AddProgrammerConnector {
let entityGateway: EntityGateway
init(entityGateway: EntityGateway) {
self.entityGateway = entityGateway
}
func assembleModule(view: AddProgrammerViewController) {
let useCaseFactory = UseCaseFactory(entityGateway: entityGateway)
let presenter = AddProgrammerPresenter(useCaseFactory: useCaseFactory)
view.presenter = presenter
view.connector = self
presenter.view = view
}
}
#Swift3CA
Factory
class UseCaseFactory {
let entityGateway: EntityGateway
init(entityGateway: EntityGateway) {
self.entityGateway = entityGateway
}
func addProgrammerUseCase(request: ProgrammerRequest, completion: @escaping
AddProgrammerCompletion) !-> UseCase {
return AddProgrammerUseCase(entityGateway: entityGateway, request:
request, completion: completion)
}
}
And What If?
#Swift3CA
Interacting with
Frameworks
Accounts
AddressBook
HomeKit
EventKit
HealthKit
Core Audio
Core Location
HomeKit
EventKit
The Secret Sauce
#Swift3CA
Injecting Dependencies
View
Presenter
UseCaseFactory
Entity
Gateway
Connector
Been There, Done
That
Dependency Inversion
Principle
High LowAbstract
Low
#Swift3CA
CloudKit
★ This is data source
using CloudKit
★ CloudKit is an
implementation
detail
★ NO leaky
abstractions
class CloudKitRepo {
let database: CKDatabase
let programmerRecord = "Programmer"
init() {
let container = CKContainer.default()
database = container.database(with: .private)
}
fileprivate func recordFrom(programmer: Programmer) !->
CKRecord {
let programmerID = CKRecordID(recordName:
programmer.id)
let record = CKRecord(recordType: programmerRecord,
recordID: programmerID)
updateRecordProperties(record: record, programmer:
programmer)
return record
}
}
extension CloudKitRepo: EntityGatewayProtocol {
func create(programmer: Programmer, completion:@escaping ()
!-> Void) {
let record = recordFrom(programmer: programmer)
database.save(record) { record, error in
guard error !== nil else {
NSLog("Save error: 
(error!?.localizedDescription)")
return
}
DispatchQueue.main.sync { completion() }
}
}
}
#Swift3CA
Injecting Dependencies 2
View
Presenter
UseCaseFactory
Entity
Gateway
Connector
Framework
Real World Example
A Prototype
#Swift3CA
Meetinator
EventKit
HomeKit
Magic
#Swift3CA
Yes, but…
#Swift3CA
MQTT
Server
Suscribe
“/rooms/meeting1/colorlight”
Device
Raspberry
Pi
Device
Device
#Swift3CA
MQTT
Server
Publish
“/rooms/meeting1/colorlight”
{ “firetime”: …}
Device
Raspberry
Pi
Device
Device
iPhone
#Swift3CA
Another Approach
EventKit
CocoaMQTT MQTT
(JSON)
Mosquitto
Right Abstraction?
#Swift3CA
Any* Abstraction is
Better than No
Abstraction
Hints for Good
Abstractions
#Swift3CA
No References to
Framework
#Swift3CA
Use Your Own Data
Types
#Swift3CA
Events
struct MeetingEvent {
let id: String
var name: String
var startDate: Date
var endDate: Date
var hasLights: Bool
}
#Swift3CA
Use Your Own
Communication
(Delegates/Observer/Rx…)
#Swift3CA
Use Only What You
Need
#Swift3CA
Move Implementation
Details Into
Abstracted Type
Details
#Swift3CA
From Date to JSON
★ MQTT messages
contained JSON
★ firetime is a JSON
format date
let formatter =
ISO8601DateFormatter()
let command: [ String: String ] = [
"firetime":
formatter.string(from: fireDate),
"type": type.mqttActionType(),
]
let jsonData = try!
JSONSerialization.data(withJSONObject
: command, options:
JSONSerialization.WritingOptions())
as Data
#Swift3CA
Picky with Dates
★ HomeKit
HMTimeTrigger only
accepts times with
seconds = 0
private func fixFireDate(_ fireDate:
Date) !-> Date {
let calendar = Calendar.current
let fixedFireDate =
calendar.nextDate(after: fireDate,
matching: DateComponents(second: 0),
matchingPolicy: .nextTime)!
return fixedFireDate
}
#Swift3CA
Browse HomeKit
★ HomeKit offers several
abstractions in a
hierarchy
• Homes
• Rooms
• Accessories
• Services
• Triggers
★ Extract what you need
class HomeKitColorLight: NSObject, LightController
{
var delegate: LightControllerDelegate?
fileprivate let homeManager: HMHomeManager
fileprivate var primaryHome: HMHome?
func homeManagerDidUpdateHomes(_ manager:
HMHomeManager) {
primaryHome = homeManager.primaryHome
delegate!?.lightControllerReady(self)
}
private func searchFirstColorLight() !->
HMService? {
let lightbulbs =
primaryHome!?.servicesWithTypes([HMServiceTypeLightb
ulb])
let colorLightbulb = lightbulbs!?.first
{ (service) in
let characteristics =
service.characteristics.filter { (characteristic)
in
return
characteristic.characteristicType !==
HMCharacteristicTypeHue
}
return characteristics.count > 0
}
return colorLightbulb
}
}
#Swift3CA
Look for Events
★ EventKit allows
multiple calendars
★ Avoid that
complexity
fileprivate func fetchMeetingCalendar() {
guard status !== .ready else { return }
let calendars =
eventStore.calendars(for: .event)
let calendar = calendars.filter { $0.title
!== meetingCalendarTitle } .first
if let calendar = calendar {
meetingCalendar = calendar
} else {
meetingCalendar =
EKCalendar(for: .event, eventStore:
eventStore)
if let meetingCalendar =
meetingCalendar {
meetingCalendar.title =
meetingCalendarTitle
meetingCalendar.source =
eventStore.defaultCalendarForNewEvents.source
do {
try
eventStore.saveCalendar(meetingCalendar,
commit: true)
} catch let error as NSError {
NSLog("Error: (error)")
}
}
}
}
#Swift3CA
Authorization
★ EventKit requires
Authorization to
access the data
class EventKitEventProvider {
enum Status {
case ready, accessDenied, unknown
}
let eventStore: EKEventStore
var status = Status.unknown
init() {
eventStore = EKEventStore()
checkAccessToEvents()
fetchMeetingCalendar()
}
private func checkAccessToEvents() {
switch
EKEventStore.authorizationStatus(for: .event) {
case .authorized:
status = .ready
case .notDetermined: !// First time access
requestAccessToEvents()
case .denied, .restricted:
status = .accessDenied
}
}
private func requestAccessToEvents() {
eventStore.requestAccess(to: .event)
{ (granted: Bool, error: Error?) in
!// …
}
}
}
#Swift3CA
extension LightControllerAction {
func homeKitColor() !-> UIColor {
let color: UIColor
switch(self) {
case .start: color = UIColor.green
case .warn: color =
UIColor.orange
case .end: color = UIColor.red
case .off: color = UIColor.black
}
return color
}
func sceneName() !-> String {
let name: String
switch(self) {
case .start: name = "Go green"
case .warn: name = "Go orange"
case .end: name = "Go red"
case .off: name = "Go off"
}
return name
}
}
Extend like a Boss
extension LightControllerAction {
func mqttActionType() !-> String {
let action: String
switch self {
case .start:
action = "start"
case .warn:
action = "warn"
case .end:
action = "end"
case .off:
action = "off"
}
return action
}
}
Recap
#Swift3CA
Recap
★ IoT is cool!
★ Advanced architectures can also be applied
to apps with frameworks
★ Use abstractions
★ YES, I mean it: Use abstractions
Thank
You!
@jdortiz
#Swift3CA
1 of 48

Recommended

How to send gzipped requests with boto3 by
How to send gzipped requests with boto3How to send gzipped requests with boto3
How to send gzipped requests with boto3Luciano Mammino
185 views58 slides
Introducing Middy, Node.js middleware engine for AWS Lambda (FrontConf Munich... by
Introducing Middy, Node.js middleware engine for AWS Lambda (FrontConf Munich...Introducing Middy, Node.js middleware engine for AWS Lambda (FrontConf Munich...
Introducing Middy, Node.js middleware engine for AWS Lambda (FrontConf Munich...Luciano Mammino
2.8K views18 slides
Serverless, The Middy Way - Workshop by
Serverless, The Middy Way - WorkshopServerless, The Middy Way - Workshop
Serverless, The Middy Way - WorkshopLuciano Mammino
1.3K views80 slides
Middy.js - A powerful Node.js middleware framework for your lambdas​ by
Middy.js - A powerful Node.js middleware framework for your lambdas​ Middy.js - A powerful Node.js middleware framework for your lambdas​
Middy.js - A powerful Node.js middleware framework for your lambdas​ Luciano Mammino
337 views67 slides
Distributed Eventing in OSGi - Carsten Ziegeler by
Distributed Eventing in OSGi - Carsten ZiegelerDistributed Eventing in OSGi - Carsten Ziegeler
Distributed Eventing in OSGi - Carsten Ziegelermfrancis
2.8K views38 slides
Akka persistence == event sourcing in 30 minutes by
Akka persistence == event sourcing in 30 minutesAkka persistence == event sourcing in 30 minutes
Akka persistence == event sourcing in 30 minutesKonrad Malawski
40.1K views137 slides

More Related Content

What's hot

Reduxing like a pro by
Reduxing like a proReduxing like a pro
Reduxing like a proBoris Dinkevich
220 views38 slides
Advanced redux by
Advanced reduxAdvanced redux
Advanced reduxBoris Dinkevich
597 views102 slides
FullStack Reativo com Spring WebFlux + Angular by
FullStack Reativo com Spring WebFlux + AngularFullStack Reativo com Spring WebFlux + Angular
FullStack Reativo com Spring WebFlux + AngularLoiane Groner
4.2K views40 slides
Firebase ng2 zurich by
Firebase ng2 zurichFirebase ng2 zurich
Firebase ng2 zurichChristoffer Noring
1K views52 slides
Azure Durable Functions (2019-03-30) by
Azure Durable Functions (2019-03-30) Azure Durable Functions (2019-03-30)
Azure Durable Functions (2019-03-30) Paco de la Cruz
553 views34 slides
Durable functions 2.0 (2019-10-10) by
Durable functions 2.0 (2019-10-10)Durable functions 2.0 (2019-10-10)
Durable functions 2.0 (2019-10-10)Paco de la Cruz
443 views34 slides

What's hot(19)

FullStack Reativo com Spring WebFlux + Angular by Loiane Groner
FullStack Reativo com Spring WebFlux + AngularFullStack Reativo com Spring WebFlux + Angular
FullStack Reativo com Spring WebFlux + Angular
Loiane Groner4.2K views
Azure Durable Functions (2019-03-30) by Paco de la Cruz
Azure Durable Functions (2019-03-30) Azure Durable Functions (2019-03-30)
Azure Durable Functions (2019-03-30)
Paco de la Cruz553 views
Durable functions 2.0 (2019-10-10) by Paco de la Cruz
Durable functions 2.0 (2019-10-10)Durable functions 2.0 (2019-10-10)
Durable functions 2.0 (2019-10-10)
Paco de la Cruz443 views
Inversion Of Control by Chad Hietala
Inversion Of ControlInversion Of Control
Inversion Of Control
Chad Hietala1.2K views
The Snake and the Butler by Barak Korren
The Snake and the ButlerThe Snake and the Butler
The Snake and the Butler
Barak Korren1.8K views
A Crash Course on Serverless Applications in Python by James Saryerwinnie
A Crash Course on Serverless Applications in PythonA Crash Course on Serverless Applications in Python
A Crash Course on Serverless Applications in Python
James Saryerwinnie182 views
Rntb20200805 by t k
Rntb20200805Rntb20200805
Rntb20200805
t k167 views
Building multi lingual and empatic bots - Sander van den Hoven - Codemotion A... by Codemotion
Building multi lingual and empatic bots - Sander van den Hoven - Codemotion A...Building multi lingual and empatic bots - Sander van den Hoven - Codemotion A...
Building multi lingual and empatic bots - Sander van den Hoven - Codemotion A...
Codemotion1.1K views
Sane Sharding with Akka Cluster by miciek
Sane Sharding with Akka ClusterSane Sharding with Akka Cluster
Sane Sharding with Akka Cluster
miciek1.5K views
Test Driven Documentation with Spring Rest Docs JEEConf2017 by Roman Tsypuk
Test Driven Documentation with Spring Rest Docs JEEConf2017Test Driven Documentation with Spring Rest Docs JEEConf2017
Test Driven Documentation with Spring Rest Docs JEEConf2017
Roman Tsypuk1.1K views
OSCON 2014 - API Ecosystem with Scala, Scalatra, and Swagger at Netflix by Manish Pandit
OSCON 2014 - API Ecosystem with Scala, Scalatra, and Swagger at NetflixOSCON 2014 - API Ecosystem with Scala, Scalatra, and Swagger at Netflix
OSCON 2014 - API Ecosystem with Scala, Scalatra, and Swagger at Netflix
Manish Pandit1.5K views
Akka persistence webinar by patriknw
Akka persistence webinarAkka persistence webinar
Akka persistence webinar
patriknw6.7K views

Similar to Architecting Alive Apps

Azure Durable Functions (2019-04-27) by
Azure Durable Functions (2019-04-27)Azure Durable Functions (2019-04-27)
Azure Durable Functions (2019-04-27)Paco de la Cruz
741 views45 slides
Online Meetup: Why should container system / platform builders care about con... by
Online Meetup: Why should container system / platform builders care about con...Online Meetup: Why should container system / platform builders care about con...
Online Meetup: Why should container system / platform builders care about con...Docker, Inc.
3K views30 slides
DWR, Hibernate and Dojo.E - A Tutorial by
DWR, Hibernate and Dojo.E - A TutorialDWR, Hibernate and Dojo.E - A Tutorial
DWR, Hibernate and Dojo.E - A Tutorialjbarciauskas
2K views34 slides
Track 4 Session 2_MAD03 容器技術和 AWS Lambda 讓您專注「應用優先」.pptx by
Track 4 Session 2_MAD03 容器技術和 AWS Lambda 讓您專注「應用優先」.pptxTrack 4 Session 2_MAD03 容器技術和 AWS Lambda 讓您專注「應用優先」.pptx
Track 4 Session 2_MAD03 容器技術和 AWS Lambda 讓您專注「應用優先」.pptxAmazon Web Services
328 views35 slides
Pharos by
PharosPharos
PharosSeongHyun Jeong
1.3K views21 slides
[NDC 2019] Functions 2.0: Enterprise-Grade Serverless by
[NDC 2019] Functions 2.0: Enterprise-Grade Serverless[NDC 2019] Functions 2.0: Enterprise-Grade Serverless
[NDC 2019] Functions 2.0: Enterprise-Grade ServerlessKatyShimizu
845 views51 slides

Similar to Architecting Alive Apps(20)

Azure Durable Functions (2019-04-27) by Paco de la Cruz
Azure Durable Functions (2019-04-27)Azure Durable Functions (2019-04-27)
Azure Durable Functions (2019-04-27)
Paco de la Cruz741 views
Online Meetup: Why should container system / platform builders care about con... by Docker, Inc.
Online Meetup: Why should container system / platform builders care about con...Online Meetup: Why should container system / platform builders care about con...
Online Meetup: Why should container system / platform builders care about con...
Docker, Inc.3K views
DWR, Hibernate and Dojo.E - A Tutorial by jbarciauskas
DWR, Hibernate and Dojo.E - A TutorialDWR, Hibernate and Dojo.E - A Tutorial
DWR, Hibernate and Dojo.E - A Tutorial
jbarciauskas2K views
Track 4 Session 2_MAD03 容器技術和 AWS Lambda 讓您專注「應用優先」.pptx by Amazon Web Services
Track 4 Session 2_MAD03 容器技術和 AWS Lambda 讓您專注「應用優先」.pptxTrack 4 Session 2_MAD03 容器技術和 AWS Lambda 讓您專注「應用優先」.pptx
Track 4 Session 2_MAD03 容器技術和 AWS Lambda 讓您專注「應用優先」.pptx
[NDC 2019] Functions 2.0: Enterprise-Grade Serverless by KatyShimizu
[NDC 2019] Functions 2.0: Enterprise-Grade Serverless[NDC 2019] Functions 2.0: Enterprise-Grade Serverless
[NDC 2019] Functions 2.0: Enterprise-Grade Serverless
KatyShimizu845 views
[NDC 2019] Enterprise-Grade Serverless by KatyShimizu
[NDC 2019] Enterprise-Grade Serverless[NDC 2019] Enterprise-Grade Serverless
[NDC 2019] Enterprise-Grade Serverless
KatyShimizu118 views
What's New In Laravel 5 by Darren Craig
What's New In Laravel 5What's New In Laravel 5
What's New In Laravel 5
Darren Craig2.2K views
Tasks: you gotta know how to run them by Filipe Ximenes
Tasks: you gotta know how to run themTasks: you gotta know how to run them
Tasks: you gotta know how to run them
Filipe Ximenes221 views
Taming Core Data by Arek Holko, Macoscope by Macoscope
Taming Core Data by Arek Holko, MacoscopeTaming Core Data by Arek Holko, Macoscope
Taming Core Data by Arek Holko, Macoscope
Macoscope498 views
The Developer Conference - CloudKit, entendendo a Cloud da Apple by Rodrigo Leite
The Developer Conference - CloudKit, entendendo a Cloud da AppleThe Developer Conference - CloudKit, entendendo a Cloud da Apple
The Developer Conference - CloudKit, entendendo a Cloud da Apple
Rodrigo Leite744 views
Overview of The Scala Based Lift Web Framework by IndicThreads
Overview of The Scala Based Lift Web FrameworkOverview of The Scala Based Lift Web Framework
Overview of The Scala Based Lift Web Framework
IndicThreads1.9K views
Scala based Lift Framework by vhazrati
Scala based Lift FrameworkScala based Lift Framework
Scala based Lift Framework
vhazrati1.3K views
Symfony2 - from the trenches by Lukas Smith
Symfony2 - from the trenchesSymfony2 - from the trenches
Symfony2 - from the trenches
Lukas Smith3.3K views
Lightbend Lagom: Microservices Just Right by mircodotta
Lightbend Lagom: Microservices Just RightLightbend Lagom: Microservices Just Right
Lightbend Lagom: Microservices Just Right
mircodotta7K views
Battle Of The Microservice Frameworks: Micronaut versus Quarkus edition! by Michel Schudel
Battle Of The Microservice Frameworks: Micronaut versus Quarkus edition! Battle Of The Microservice Frameworks: Micronaut versus Quarkus edition!
Battle Of The Microservice Frameworks: Micronaut versus Quarkus edition!
Michel Schudel1.6K views

More from Jorge Ortiz

Tell Me Quando - Implementing Feature Flags by
Tell Me Quando - Implementing Feature FlagsTell Me Quando - Implementing Feature Flags
Tell Me Quando - Implementing Feature FlagsJorge Ortiz
118 views34 slides
Unit Test your Views by
Unit Test your ViewsUnit Test your Views
Unit Test your ViewsJorge Ortiz
222 views24 slides
Control your Voice like a Bene Gesserit by
Control your Voice like a Bene GesseritControl your Voice like a Bene Gesserit
Control your Voice like a Bene GesseritJorge Ortiz
475 views47 slides
Kata gilded rose en Golang by
Kata gilded rose en GolangKata gilded rose en Golang
Kata gilded rose en GolangJorge Ortiz
391 views50 slides
CYA: Cover Your App by
CYA: Cover Your AppCYA: Cover Your App
CYA: Cover Your AppJorge Ortiz
343 views34 slides
Refactor your way forward by
Refactor your way forwardRefactor your way forward
Refactor your way forwardJorge Ortiz
477 views69 slides

More from Jorge Ortiz(20)

Tell Me Quando - Implementing Feature Flags by Jorge Ortiz
Tell Me Quando - Implementing Feature FlagsTell Me Quando - Implementing Feature Flags
Tell Me Quando - Implementing Feature Flags
Jorge Ortiz118 views
Unit Test your Views by Jorge Ortiz
Unit Test your ViewsUnit Test your Views
Unit Test your Views
Jorge Ortiz222 views
Control your Voice like a Bene Gesserit by Jorge Ortiz
Control your Voice like a Bene GesseritControl your Voice like a Bene Gesserit
Control your Voice like a Bene Gesserit
Jorge Ortiz475 views
Kata gilded rose en Golang by Jorge Ortiz
Kata gilded rose en GolangKata gilded rose en Golang
Kata gilded rose en Golang
Jorge Ortiz391 views
CYA: Cover Your App by Jorge Ortiz
CYA: Cover Your AppCYA: Cover Your App
CYA: Cover Your App
Jorge Ortiz343 views
Refactor your way forward by Jorge Ortiz
Refactor your way forwardRefactor your way forward
Refactor your way forward
Jorge Ortiz477 views
201710 Fly Me to the View - iOS Conf SG by Jorge Ortiz
201710 Fly Me to the View - iOS Conf SG201710 Fly Me to the View - iOS Conf SG
201710 Fly Me to the View - iOS Conf SG
Jorge Ortiz699 views
Home Improvement: Architecture & Kotlin by Jorge Ortiz
Home Improvement: Architecture & KotlinHome Improvement: Architecture & Kotlin
Home Improvement: Architecture & Kotlin
Jorge Ortiz461 views
Architectural superpowers by Jorge Ortiz
Architectural superpowersArchitectural superpowers
Architectural superpowers
Jorge Ortiz195 views
iOS advanced architecture workshop 3h edition by Jorge Ortiz
iOS advanced architecture workshop 3h editioniOS advanced architecture workshop 3h edition
iOS advanced architecture workshop 3h edition
Jorge Ortiz583 views
Android clean architecture workshop 3h edition by Jorge Ortiz
Android clean architecture workshop 3h editionAndroid clean architecture workshop 3h edition
Android clean architecture workshop 3h edition
Jorge Ortiz743 views
To Protect & To Serve by Jorge Ortiz
To Protect & To ServeTo Protect & To Serve
To Protect & To Serve
Jorge Ortiz925 views
Clean architecture workshop by Jorge Ortiz
Clean architecture workshopClean architecture workshop
Clean architecture workshop
Jorge Ortiz732 views
Escape from Mars by Jorge Ortiz
Escape from MarsEscape from Mars
Escape from Mars
Jorge Ortiz350 views
Why the Dark Side should use Swift and a SOLID Architecture by Jorge Ortiz
Why the Dark Side should use Swift and a SOLID ArchitectureWhy the Dark Side should use Swift and a SOLID Architecture
Why the Dark Side should use Swift and a SOLID Architecture
Jorge Ortiz422 views
Dependence day insurgence by Jorge Ortiz
Dependence day insurgenceDependence day insurgence
Dependence day insurgence
Jorge Ortiz848 views
Architectural superpowers by Jorge Ortiz
Architectural superpowersArchitectural superpowers
Architectural superpowers
Jorge Ortiz333 views
TDD for the masses by Jorge Ortiz
TDD for the massesTDD for the masses
TDD for the masses
Jorge Ortiz706 views
7 Stages of Unit Testing in iOS by Jorge Ortiz
7 Stages of Unit Testing in iOS7 Stages of Unit Testing in iOS
7 Stages of Unit Testing in iOS
Jorge Ortiz805 views
Building for perfection by Jorge Ortiz
Building for perfectionBuilding for perfection
Building for perfection
Jorge Ortiz685 views

Recently uploaded

Tridens DevOps by
Tridens DevOpsTridens DevOps
Tridens DevOpsTridens
9 views28 slides
Generic or specific? Making sensible software design decisions by
Generic or specific? Making sensible software design decisionsGeneric or specific? Making sensible software design decisions
Generic or specific? Making sensible software design decisionsBert Jan Schrijver
6 views60 slides
SAP FOR TYRE INDUSTRY.pdf by
SAP FOR TYRE INDUSTRY.pdfSAP FOR TYRE INDUSTRY.pdf
SAP FOR TYRE INDUSTRY.pdfVirendra Rai, PMP
24 views3 slides
DevsRank by
DevsRankDevsRank
DevsRankdevsrank786
11 views1 slide
SUGCON ANZ Presentation V2.1 Final.pptx by
SUGCON ANZ Presentation V2.1 Final.pptxSUGCON ANZ Presentation V2.1 Final.pptx
SUGCON ANZ Presentation V2.1 Final.pptxJack Spektor
22 views34 slides
Advanced API Mocking Techniques by
Advanced API Mocking TechniquesAdvanced API Mocking Techniques
Advanced API Mocking TechniquesDimpy Adhikary
19 views11 slides

Recently uploaded(20)

Tridens DevOps by Tridens
Tridens DevOpsTridens DevOps
Tridens DevOps
Tridens9 views
Generic or specific? Making sensible software design decisions by Bert Jan Schrijver
Generic or specific? Making sensible software design decisionsGeneric or specific? Making sensible software design decisions
Generic or specific? Making sensible software design decisions
SUGCON ANZ Presentation V2.1 Final.pptx by Jack Spektor
SUGCON ANZ Presentation V2.1 Final.pptxSUGCON ANZ Presentation V2.1 Final.pptx
SUGCON ANZ Presentation V2.1 Final.pptx
Jack Spektor22 views
Advanced API Mocking Techniques by Dimpy Adhikary
Advanced API Mocking TechniquesAdvanced API Mocking Techniques
Advanced API Mocking Techniques
Dimpy Adhikary19 views
What Can Employee Monitoring Software Do?​ by wAnywhere
What Can Employee Monitoring Software Do?​What Can Employee Monitoring Software Do?​
What Can Employee Monitoring Software Do?​
wAnywhere21 views
Software evolution understanding: Automatic extraction of software identifier... by Ra'Fat Al-Msie'deen
Software evolution understanding: Automatic extraction of software identifier...Software evolution understanding: Automatic extraction of software identifier...
Software evolution understanding: Automatic extraction of software identifier...
Cycleops - Automate deployments on top of bare metal.pptx by Thanassis Parathyras
Cycleops - Automate deployments on top of bare metal.pptxCycleops - Automate deployments on top of bare metal.pptx
Cycleops - Automate deployments on top of bare metal.pptx
DSD-INT 2023 Simulating a falling apron in Delft3D 4 - Engineering Practice -... by Deltares
DSD-INT 2023 Simulating a falling apron in Delft3D 4 - Engineering Practice -...DSD-INT 2023 Simulating a falling apron in Delft3D 4 - Engineering Practice -...
DSD-INT 2023 Simulating a falling apron in Delft3D 4 - Engineering Practice -...
Deltares6 views
2023-November-Schneider Electric-Meetup-BCN Admin Group.pptx by animuscrm
2023-November-Schneider Electric-Meetup-BCN Admin Group.pptx2023-November-Schneider Electric-Meetup-BCN Admin Group.pptx
2023-November-Schneider Electric-Meetup-BCN Admin Group.pptx
animuscrm13 views
Navigating container technology for enhanced security by Niklas Saari by Metosin Oy
Navigating container technology for enhanced security by Niklas SaariNavigating container technology for enhanced security by Niklas Saari
Navigating container technology for enhanced security by Niklas Saari
Metosin Oy12 views
DSD-INT 2023 Wave-Current Interaction at Montrose Tidal Inlet System and Its ... by Deltares
DSD-INT 2023 Wave-Current Interaction at Montrose Tidal Inlet System and Its ...DSD-INT 2023 Wave-Current Interaction at Montrose Tidal Inlet System and Its ...
DSD-INT 2023 Wave-Current Interaction at Montrose Tidal Inlet System and Its ...
Deltares10 views
MariaDB stored procedures and why they should be improved by Federico Razzoli
MariaDB stored procedures and why they should be improvedMariaDB stored procedures and why they should be improved
MariaDB stored procedures and why they should be improved
Dev-Cloud Conference 2023 - Continuous Deployment Showdown: Traditionelles CI... by Marc Müller
Dev-Cloud Conference 2023 - Continuous Deployment Showdown: Traditionelles CI...Dev-Cloud Conference 2023 - Continuous Deployment Showdown: Traditionelles CI...
Dev-Cloud Conference 2023 - Continuous Deployment Showdown: Traditionelles CI...
Marc Müller37 views
.NET Developer Conference 2023 - .NET Microservices mit Dapr – zu viel Abstra... by Marc Müller
.NET Developer Conference 2023 - .NET Microservices mit Dapr – zu viel Abstra....NET Developer Conference 2023 - .NET Microservices mit Dapr – zu viel Abstra...
.NET Developer Conference 2023 - .NET Microservices mit Dapr – zu viel Abstra...
Marc Müller38 views
DSD-INT 2023 Delft3D FM Suite 2024.01 1D2D - Beta testing programme - Geertsema by Deltares
DSD-INT 2023 Delft3D FM Suite 2024.01 1D2D - Beta testing programme - GeertsemaDSD-INT 2023 Delft3D FM Suite 2024.01 1D2D - Beta testing programme - Geertsema
DSD-INT 2023 Delft3D FM Suite 2024.01 1D2D - Beta testing programme - Geertsema
Deltares17 views
Roadmap y Novedades de producto by Neo4j
Roadmap y Novedades de productoRoadmap y Novedades de producto
Roadmap y Novedades de producto
Neo4j50 views

Architecting Alive Apps