SlideShare a Scribd company logo
K3	
Keynote	
6/9/16	8:30	AM	
	
	
	
	
How	to	Do	Kick-Ass	Software	
Development	
	
Presented	by:	
	
Sven	Peters	
Atlassian	
	
	
Brought	to	you	by:		
		
	
	
	
	
350	Corporate	Way,	Suite	400,	Orange	Park,	FL	32073		
888---268---8770	··	904---278---0524	-	info@techwell.com	-	http://www.techwell.com/
Sven	Peters	
Atlassian	
	
Lead	evangelist	for	Atlassian,	Sven	Peters	has	twenty	years	of	experience	writing	
code,	leading	teams,	and	sharing	his	experience	with	thousands	of	developers	in	
more	than	twenty-five	countries.	For	the	past	four	years,	Sven	has	studied	
software	development	trends	inside	and	outside	Atlassian,	discovering	the	most	
important	attributes	that	help	teams	effectively	scale	and	drive	innovation.	Sven	
is	a	regular	contributor	to	Atlassian’s	quarterly	ShipIt	Days—twenty-four	hours	
during	which	developers	are	free	to	work	on	a	passion	project	(designing	a	dream	
feature,	working	with	a	team	not	their	own,	or	replacing	all	the	hot	light	bulbs	in	
Atlassian’s	phone	booths	with	energy	efficient	bulbs).
SVEN PETERS • LEAD EVANGELIST • ATLASSIAN • @SVENPET
Kick-AssSoftware Development
Fast
Best Ideas
Fast
Problem Solver
Fast Best Ideas
Elegant
Fast Best Ideas Problem Solver
Technologies
Fast Best Ideas Problem Solver Elegant
Fast
Rock Star
Best Ideas Problem Solver Elegant Technologies
Fast
The 10x Programmer
Best Ideas Problem Solver Elegant Technologies
How to Do Kick-Ass Software Development
Kick Ass
Sven Peters
Lead Evangelist
@svenpet
Who expects to see some code?
System.out.println
("Sorry, you may leave now");
Who expects to learn a new
methodology?
There is no Kick-Ass manifesto!
...and no certification
Who just wants to kick ass?
THIS IS YOUR TALK
Yes, that's me ;)
Building Kick-ass Things
Ass Kicking Topics
Kick-ass Teams
Kick-ass Collaboration
Kick-ass Automation
Build
Kick-Ass Things
Emma
William
Our customers
Emma
William
FAKE
Our customers
We use
Personas
We stick those on walls
Reminds us who we built the software for
We can’t escape
Fake it
til you
Make it
Speech-to-Text Experiment
before we built things…
Paper
Prototypes
SoftwareConstruction Area - Improving Software
Feedback
Generate a Kick-Ass
Experience
Make it simple
Easy to find
Fast to submit
GOT FEEDBACK?
GOT FEEDBACK?
GOT FEEDBACK?
Got Feedback?
Submit Cancel
What do you like? * Good tools, but this talk doesn't kick @$$ at all!
What needs to be
improved?*
Add more jokes!
Name
BrowseUpload a screenshot
Email
Freddy Eedback
f.eedback@complain.com
Rate the page * Awesome HorribleGood Meh! Bad
GOT FEEDBACK?
Got Feedback?
Submit Cancel
What do you like? * Good tools, but this talk doesn't kick ass at all!
What needs to be
improved?*
Add more jokes!
Name
BrowseUpload a screenshot
Email
Freddy Eedback
f.eedback@complain.com
Rate the page * Awesome HorribleGood Meh! Bad
Make it simple
Easy to find
Fast to submit
Protect
your Developers
The sh*t umbrella
gmail: 100 developers
gmail: 425 million users
But we're not building
Everyone
On The
Front Lines
Close the Loop
Feedback
and get pers nal
Developer
on
Support
Kick-Ass
Teams
Software Development
15 years ago
codespec build
track
code
design
test
code
operate
Who has seen the Gorilla?
Who has seen the curtain changed color?
Who has seen a black shirt player leaving?
We just see things
we expect!
TeamworkCode Reviews
Code Review Sessions
boring
Uncomfortable Situation
Succeeding with
ReviewsCode
Explain the
problem
Review the
code yourself
Share testing
notes
Prepare1
Explain the
problem
Review the
code yourself
Share testing
notes
Prepare1
Invite
reviewers
+ +
branch code merge
too late
At the right time2
Code Reviews
2 At the right time
branch code mergereview
Code Reviews
At the right time
a view into the future
3
Code Reviews
Asynchronously
Reviewer 1 Reviewer 2 Reviewer 3
3
Code Reviews
Asynchronously3
Code Reviews
coding conventions?
test code?
reusable code?
something missing?
Standards4
Keep the flow
0
4
5
Code Reviews
Keep the flow
0
4
12
5
Code Reviews
4
2
Keep the flow
merge when min. approvals
5
Code Reviews
Code Review Tipsmore
removing yourself is alright
be constructive
@mention people
declining is not the end!
be humble accepting feedback
track
code
design
test
code
operate
Testing Software
as a team
Developer
Different Roles
Responsibilities
Tester
The Problems
Bottlenecks : Accountability : Scalability
Developer Tester
DoT
Developer
on
Test
So the developers are
doing all the work?
Qual·i·ty As·sis·tance [kwol-i-tee] [uh-sis-tuh ns]
Quality is everybody's responsibility. QA employees help
and train developers to become better tester, testing the
more complicated stuff, creating test data, investigating
in new test tools and working on test strategies.
QA
7 Tipsfor kick-ass DoTing
1. Training
2. Pairing
3. Blitz Test
DoTing
Advanced
4. Split Sessions*
* advanced doting
5. Test Recipe*
* advanced doting
DoTingParadise
what we’re doing now…
6. Kick-Offs*
*doting paradise
7. Demos*
*doting paradise
Qualityis everybody’s responsibility
track
code
design
test
code
operate
Designing
as a team
Design
Developers
are doing
Design
Developers
are doing
Because we suck!
should we have designers?
Why
Designers?Scaling
Designer Designer ? ?
Designer Designer Developer Developer
Developers FTW!Use
Designers?Scaling
Our developers need some
Design guidance!
Design Guidelines
Tools to test designJust a few controls
Simple rules
https://developer.atlassian.com/design/
Dev Speed
Kick-Ass
DesignWorkshopfor Developers
Designers
Developers
are
DevelopersDesigners
removing friction
Designers
Developers
areare
Designer in code
Kick-Ass
Collaboration
We started small
and grew
One Product
Traffic Rules
are protecting us from accidents
Development Rules
are protecting us from making mistakes
Autonomy Trust
Beginner
Team
Enterprise
Team
Developer
Team
Autonomy Trust
Do-ocracy
Do-ocracy
Autonomy TrustTransparency
to keep them connected
Changing
other team’s code?
Code reviews
There’s no such thing
Who’s the best to check it?
Auto
Suggest
Reviewers
Previously
Changed
File
State of the Development
DemoRegular - Open - Honest
Do-ocracy
Autonomy TrustTransparency
Do-ocracyScales by keeping Development speed
Best way
to collaborate?
Everyone in one room!
Don’t forget to document
Not important for everyone
Difficult for remote team
More important things to do?
Not efficient!
ChatWe use
Connect with the team Chat
team chat rooms
ReConnect
z z z
Chat
chat room history
Connect with others Chat
@mention people
ChatConnect your systems
integration & bots
ΩΩΩΩ
Pull Requests
ΩΩΩΩ
Builds
ΩΩΩΩ
Deployments
ΩΩΩΩ
Exceptions
CHATConnect with Experts
topic chat rooms
get answers from the experts
all the topic experts in one room
the team is already working on it!
Chat
Connect the whole
organization
more transparency
Chat Ops
How to Do Kick-Ass Software Development
We built portals!
Mac mini
TV
Camera
Automation
Kick-Ass
We're helping people
to be faster
by automating their work
How much time do you spend a week
to automate your software development?
We are trying hard to write
beautiful code
package	com.miguelcatalan.materialsearchview;	
import	android.app.Activity;	
import	android.widget.ListView;	
import	android.widget.RelativeLayout;	
import	android.widget.TextView;	
import	java.lang.reflect.Field;	
import	java.util.List;	
/**	
	*	@author	Miguel	Catalan	Bañuls	
	*/	
public	class	MaterialSearchView	extends	FrameLayout	implements	Filter.FilterListener	{	
				private	MenuItem	mMenuItem;	
				private	boolean	mIsSearchOpen	=	false;	
				public	MaterialSearchView(Context	context)	{	
								this(context,	null);	
				}	
				public	MaterialSearchView(Context	context,	AttributeSet	attrs)	{	
								this(context,	attrs,	0);	
				@Override	
				public	void	onTextChanged(CharSequence	s,	int	start,	int	before,	int	count)	{	
									mUserQuery	=	s;	
									startFilter(s);	
										MaterialSearchView.this.onTextChanged(s);	
					}	
			}	
LOC: 32
MyAwesomeClass
One month later
package	com.miguelcatalan.materialsearchview;	
import	android.app.Activity;	
import	android.content.Context;	
import	android.content.Intent;	
import	android.content.pm.PackageManager;	
import	android.content.pm.ResolveInfo;	
import	android.content.res.TypedArray;	
import	android.graphics.Rect;	
import	android.graphics.drawable.Drawable;	
import	android.os.Build;	
import	android.os.Parcel;	
import	android.os.Parcelable;	
import	android.speech.RecognizerIntent;	
import	android.text.Editable;	
import	android.text.TextUtils;	
import	android.text.TextWatcher;	
import	android.util.AttributeSet;	
import	android.util.Log;	
import	android.view.KeyEvent;	
import	android.view.LayoutInflater;	
import	android.view.MenuItem;	
import	android.view.View;	
import	android.view.inputmethod.InputMethodManager;	
import	android.widget.AdapterView;	
import	android.widget.EditText;	
import	android.widget.Filter;	
import	android.widget.Filterable;	
import	android.widget.FrameLayout;	
import	android.widget.ImageButton;	
import	android.widget.ListAdapter;	
import	android.widget.ListView;	
import	android.widget.RelativeLayout;	
import	android.widget.TextView;	
import	com.miguelcatalan.materialsearchview.utils.AnimationUtil;	
import	java.lang.reflect.Field;	
import	java.util.List;	
…one month later
LOC: counting….
MyAwesomeClass
@Override	
																public	boolean	onAnimationCancel(View	view)	{	
																				return	false;	
																}	
												});	
								}	else	{	
												mSearchLayout.setVisibility(VISIBLE);	
												if	(mSearchViewListener	!=	null)	{	
																mSearchViewListener.onSearchViewShown();	
												}	
								}	
								mIsSearchOpen	=	true;	
				}	
				/**	
					*	Close	search	view.	
					*/	
				public	void	closeSearch()	{	
								if	(!isSearchOpen())	{	
												return;	
								}	
								mSearchSrcTextView.setText(null);	
								dismissSuggestions();	
								clearFocus();	
								mSearchLayout.setVisibility(GONE);	
								if	(mSearchViewListener	!=	null)	{	
												mSearchViewListener.onSearchViewClosed();	
								}	
								mIsSearchOpen	=	false;	
				}	
				/**	
					*	Set	this	listener	to	listen	to	Query	Change	events.	
					*	
					*	@param	listener	
…one month later
LOC: 986
MyAwesomeClass
Code quality
86%
20
1045
27
test coverage
deprecated methods
old unit test framework
compiler warnings
83% test coverage
23 deprecated methods
1136
36 compiler warnings
old unit test framework
Code quality
75% test coverage
32 deprecated methods
1289
45 compiler warnings
old unit test framework
Code quality
Developers are trying to
solve problems
Developers don’t write
bad code on purpose
Calling
Dr. Codemeasure constantly the engineering health
measure constantly the engineering health
Calling
Dr. Code
jira.stats.tests.junit.3.count
No more JUnit 3 tests!
JUnit 3 JUnit 4
jira.stats.bundled.jars.in.plugins
Inspect all the things
jira.stats.tests.junit.3.count
Hall of Shame!
You’ll enter the
JS not minified
API compatibility :(
New JUnit3 test
Caught by Dr Code?
Hall of Shame!
You’ll enter the
Wallboard - so everyone sees it!
Hall of Fame!
You’ll enter the
Fixed a matrix?
build status
build status
build status
Flaky Test Detector
Flaky Test Detector
failing
test
rerun test
successful
test
test in
quarantaine
continue build
create
issue
817
quarantined
tests
Kick-ass
Are you ready to
?
This Way
This Way
This Way
Maybe there are
better ways
Building Kick-ass Things
Ass Kicking Topics
Kick-ass Teams
Kick-ass Collaboration
Kick-ass Automation
Be excellent
in everything you do
Step out of your comfort zone
and be more awesome
Did you
kick ass
today?
Thanks
@svenpet
Find slides here
svenpet.com/talks

More Related Content

How to Do Kick-Ass Software Development