March 2015
yunspace
yunzhilin
yunspace.com
We live in a Semi-Strong Efficiency market
Stock prices reflect and adjust to all public information
Little room for arbitrage or outrageous profit
Information Efficiency also applies to business & competition:
What you try to do, others are already doing/copying
Your customers are very likely to know more than you
You need to process information fast, but also relevant
Superior technology gives competitive advantage:
Exploiting Market Anomalies such as Momentum trading
Arbitraging tiny inefficiencies: Quantitive, Frequency trading.
Destroying information asymmetry and "experts": RPdata
Disrupting established markets: Uber, Tesla
Providing better UX for boring things: CBA, Simple.com
All we need is good software ...
The era of separating traditional industries and technology industries is over—and those who fail to adapt right now will soon find themselves obsolete.
Now Every Company is A Software Company - Forbes 2011
organizations which design systems ... are constrained to produce designs which are copies of the communication structures of these organizations
Melvin Conway - 1968
Don't Forget Conway's Law - Sarah Novotny (NGinx)
Good Software Design starts off with Orgnisational Design
Information and Capabilities lost in translation between silos
Lead to architecture based around business capabilities
Information are rarely stored in a single place, but integration of systems is hard:
Enterprise Integration Patterns, Gregor Hohpe
Technology can differentiate in a competitive world.
Challenge is to process information more efficiently
But building good software is hard:
Traditional siloed teams hinder collaboration
Integrating applications is painful
Built around 1994. Iconic Monolithic, OS for traders
Enterprise Service Bus
ETF
Cash
Fixed
Equities
Custodians
SWIFT
Counter
Party
early 2000s, Traditional SOA over ESB
That's a lot! Concerned about Separation of Concerns?
Microservices: The resurgence of SOA principles and an alternative to the monolith
- PWC Technology Forecast 2014
Microservices: The resurgence of SOA principles and an alternative to the monolith
- PWC Technology Forecast 2014
Business
UI/UX Design
Front End Dev
Back End
Dev
Infrastructure/DevOps
How do you know when you broke something?
you don't, so write tests!
There is no such thing as untestable code @CodaHale
Highly recommend Uncle Bob's book:
Find out more at:
By Heroku: 12factor.net
Some opinionated points that apply to University work:
repositories {
jcenter()
maven { url "http://dl.bintray.com/trunkplatform/osworkflow" }
}
}
dependencies {
compile group: 'com.trunkplatform', name: 'service', version: '3.1.4'
}
<repositories>
<repository>
<snapshots>
<enabled>false</enabled>
</snapshots>
<id>bintray-trunkplatform</id>
<name>bintray</name>
<url>http://dl.bintray.com/trunkplatform/osworkflow</url>
</repository>
</repositories>
<dependencies>
<dependency>
<groupId>com.trunkplatform.opensymphony</groupId>
<artifactId>service</artifactId>
<version>3.1.4</version>
<scope>compile</scope>
</dependency>
</dependencies>
{
"streetNumber": "80",
"streetName": "Clarence",
"suburb": "Sydney"
}
<?xml version="1.0"?>
<soap:Envelope
xmlns:soap="http://www.w3.org/2001/12/soap-envelope"
soap:encodingStyle="http://www.w3.org/2001/12/soap-encoding">
<soap:Body xmlns:p="http://www.platmasphere.com/createProperty.xsd">
<p:CreateProperty>
<m:Property>
<m:streetNumber>80</m:streetNumber>
<m:streetName>Clarence</m:streetName>
<m:suburb>Sydney</m:suburb>
</p:Property>
</m:CrateProperty>
</soap:Body>
</soap:Envelope>
PUT /hostname/properties/
<definitions name="PropertyService"
targetNamespace="http://namespaces.snowboard-info.com"
xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
xmlns="http://schemas.xmlsoap.org/wsdl/">
<!-- not including model schemas -->
<message name="CreatePropertyRequest">
<part name="body" element="CreatePropertyRquestModel"/>
</message>
<message name="GetPropertyResponse">
<part name="body" element="CreatePropertyResponseModel"/>
</message>
<portType name="Properties_Port">
<operation name="CraeteProperty">
<input message="CreatePropertyRequest"/>
<output message="CreatePropertyResponse"/>
<fault message="CreatePropertyFault"/>
</operation>
</portType>
<binding name="CreateProeprtySoapBinding"
type="GreatePropertytType">
<soap:binding style="document"
transport="http://schemas.xmlsoap.org/soap/http"/>
<operation name="CreateProperty">
<soap:operation
soapAction="http://www.platmasphere.com/CreateProperty"/>
<input>
<soap:body use="literal"
namespace="http://platmasphere.com/CreateProperty.xsd"/>
</input>
<output>
<soap:body use="literal"
namespace="http://platmasphere.com/CreateProperty.xsd"/>
</output>
<fault>
<soap:body use="literal"
namespace="http://platmasphere.com/CreateProperty.xsd"/>
</fault>
</operation>
</binding>
<service name="Properties">
<documentation>WSDL File for PropertyService</documentation>
<port binding="CreateProeprtySoapBinding" name="Properties_Port">
<soap:address location="http://hostname/propeties/" binding="CreatePropertySoapBinding" />
</port>
</service>
</definitions>
Remote Proc Calls over HTTP:
POST /api/getUserById/{id}
POST /api/createUser/
POST /api/updateUser/{id}
POST /api/delUserById/{id}
Resource oriented, http verbs:
GET /api/user/{id}
POST /api/user
DELETE /api/user/{id}
PUT /api/user/{id}
REST Verbs Reference:
Dropwizard makes it easy to do the right thing, allowing you to concentrate on the essential complexity of a problem rather than the plumbing
Getting Started:
http://www.dropwizard.io/getting-started.html
Sample Project with Heroku support:
https://github.com/Trunkplatform/dropwizard-petstore
Our Dropwizard-Turbo LazyBones Template:
https://github.com/Trunkplatform/lazy-bones-dropwizard-turbo
For manual testing: https://www.getpostman.com/
I'll be talking some more at: