1st Career
2nd Career
3rd Career?
Or simply,
This talk is about application architecture, not as much enterprise architecture.
The important stuff, whatever that happens to be.
Ralph Johnson
http://bit.ly/1SdTRYG
Marcus Lemonis
serial entrepreneur
gazillionaire
Project
Developers are generally engaged in tactical thinking about solving a problem in front of them...
without regard to the enterprise and architectural concerns
They should be thinking tactically while minding strategic goals
HBO's Silicon Valley
Create a culture of learning to foster a passion for our craft
Create a collegial culture where everyone contributes and benefits
Construct a persona for a typical user
We should always prefer a group of real users to personas
even though real users can be a pain in the backside!
http://bit.ly/1Sp3nby
Favor an
evolutionary architecture
Defer architectural decisions until the last responsible moment
Venkat Subramaniam
Even if you are the smartest person in the room, don't keep trying to prove it to everyone
Decision fatigue refers to the deteriorating quality of decisions made by an individual, after a long session of decision making. It is now understood as one of the causes of irrational trade-offs in decision making.
https://en.wikipedia.org/wiki/Decision_fatigue
The risk of a wrong decision is preferable to the terror of indecision.
Maimonides
Technical debt’s effect on software development is roughly analogous to friction in mechanical devices.
https://www.computer.org/csdl/mags/so/2016/01/mso2016010066.pdf
When you keep hitting walls of resistance in life, the universe is trying to tell you that you are going the wrong way. It's like driving a bumper car at an amusement park. Each time you slam into another car or the edge of the track, you are forced to change direction.
If it hurts, do it more frequently, and bring the pain forward.
Testing leads to failure, and failure leads to understanding.
Burt Rutan
Like writing tests
and pair programming
Your job is to help make each developer successful.
In return, they'll help make you successful.
Don't sweat it.
Minimum of three: Dev, QA, Prod
Four would be better: Dev, QA, Staging/UAT, Prod
Discipline and feature toggles can alleviate need for staging
https://www.openmakesoftware.com/images/ReleaseEngineer/CI-CD.png
reduces decision fatigue and lowers friction through automation of the mundane
Web services not UI
Dev
We'll assume we'll start with a layered monolith for now
Defer what you can and try to keep the cost to change low
Stage
QA
Prod
class HelloWorld {
static final String DATE_FORMAT_PATTERN = 'MM-dd-yyyy'
LocalDate currentDate
String dateFormat
String greet(String name) {
name = name ?: 'there'
currentDate = currentDate ?: LocalDate.now()
dateFormatP = dateFormat ?: DATE_FORMAT_PATTERN
String dateStr = currentDate.format(DateTimeFormatter.ofPattern(dateFormat)
name ? "Hello $name. Today's date is $dateStr"
}
}
class HelloWorldSpec extends Specification {
HelloWorld helloWorld
void setup() {
helloWorld = new HelloWorld()
helloWorld.dateFormat = 'MM-dd-yyyy'
helloWorld.currentDate = LocalDate.of(2016, Month.APRIL, 15)
}
@Unroll
void "When providing a name, Hello #name will be output as #output"(String name,
String output) {
expect:
output == helloWorld.greet(name)
where:
name || output
Jack || "Hello Jack. Today's date is 04-15-2016"
null || "Hello there. Today's date is 04-15-2016"
'' || "Hello there. Today's date is 04-15-2016"
}
// more tests omitted
}
class HelloWorldIntSpec extends Specification {
static ApplicationContext appCtx
HelloWorld helloWorld
void setupSpec() {
appCtx = new GenericGroovyApplicationContext("classpath:Spring/Beans.groovy")
}
void setup() {
helloWorld = appCtx.getBean(HelloWorld)
helloWorld.currentDate = LocalDate.of(2016, Month.APRIL, 15)
}
void "verify Spring injected default pattern"() {
when:
String output == helloWorld.greet(name)
then:
helloWorld.dateFormat
output == "Hello Jack. Today's date is 04-15-2016"
}
}
from the essential The Lean Startup by Eric Ries
The MVP [minimum viable product] is that version of the product that enables a full turn of the Build-Measure-Learn loop with a minimum amount of effort and the least amount of development time.
Eric Ries, The Lean Startup
What architectural pattern should we use?
This is typically a monolithic app
This is the antithesis to the monolithic app
Architecture Agility
The ability to respond quickly to a constantly changing environment
http://martinfowler.com/bliki/MonolithFirst.html
Martin Fowler, http://martinfowler.com/bliki/MonolithFirst.html
Process. Performance. Failure rates. Everything.
You will have earned it.
All animated GIFs from giphy.com
Feel free to connect with me