Indebted code is any code
that is hard to scan.
Technical debt is anything that
increases the difficulty
of reading code.
Slide 3
Slide 3 text
Programmers spend around
60-70%
of their entire programming
time reading code.
Completely made up number based on my last month
Slide 4
Slide 4 text
Cyclomatic complexity
Software metric (measurement),
used to indicate the complexity of a program.
It is a quantitative measure of the number of
linearly independent paths through
a program's source code.
Slide 5
Slide 5 text
Reducing technical debt
Look at
something
Have an
insight
Write it down
Check it in
Slide 6
Slide 6 text
Reducing technical debt
Have an
insight
Slide 7
Slide 7 text
Reducing technical debt
Decide where
to look
Reading
things,
usually names
In a name or
assertion
Name your
commit
De!ne your language
presenter.loadFolders();
presenter.getFolders();
presenter.fetchFolders();
view.presentFolders();
view.showFolders();
view.renderFolders();
Slide 19
Slide 19 text
De!ne your language
Slide 20
Slide 20 text
De!ne your language
view.showFolders(boolean isOnline);
presenter.loadFolders(boolean fromCache);
Slide 21
Slide 21 text
De!ne your language
presenter.loadFolders(boolean fromCache);
view.showFolders();
view.notifyOffline();
Slide 22
Slide 22 text
Name by what it does, not by what it is
@BindView(R.id.password_text_input_layout)
TextInputLayout passwordTextInputLayout;
@BindView(R.id.password_edit_text)
EditText etPassword;
@BindView(R.id.password)
EditText passwordInput;
Slide 23
Slide 23 text
Just say mNo to
Hungarian Notation
http://jakewharton.com/just-say-no-to-hungarian-notation/
Slide 24
Slide 24 text
Say mNo to hungarian notation
Slide 25
Slide 25 text
Your strict naming
conventions are a
liability
https://publicobject.com/2016/01/20/strict-naming-conventions-are-a-liability/
Slide 26
Slide 26 text
Rest API don’t de!ne your language
{
"files": {
"Hello.txt": {
"type": "text/plain",
"content": "Hello World!\n"
}
},
"created_at": "2014-05-27T02:31:35Z",
"updated_at": "2015-08-29T14:01:51Z"
}
Slide 27
Slide 27 text
Rest API don’t de!ne your language
public final class Gist {
Map files;
@SerializedName("created_at") Date createdAt;
@SerializedName("updated_at") Date updatedAt;
}
Slide 28
Slide 28 text
Let’s talk about
testing
Slide 29
Slide 29 text
Naming your tests
@Test
public void
testDraftDialogPresenterShowsMessageAfterClickingSaveButtonAndReloadsData()
DraftDialogPresenter.java
Slide 30
Slide 30 text
Naming your tests
DraftDialogPresenter.java
@Test
public void
testDraftDialogPresenterShowsMessageAfterClickingSaveButtonAndReloadsData()
Slide 31
Slide 31 text
Naming your tests
@Test
public void draftDialogShowsMessageAfterClickingSaveButtonAndReloadsData()
DraftDialogPresenter.java
@Test
public void
testDraftDialogPresenterShowsMessageAfterClickingSaveButtonAndReloadsData()
Slide 32
Slide 32 text
Naming your tests
DraftDialogPresenter.java
@Test
public void
testDraftDialogPresenterShowsMessageAfterClickingSaveButtonAndReloadsData()
@Test
public void draftDialogShowsMessageAfterClickingSaveButtonAndReloadsData()
Slide 33
Slide 33 text
Naming your tests
DraftDialogPresenter.java
@Test
public void showsMessageWhenDraftIsSavedAndReloadsData()
@Test
public void
testDraftDialogPresenterShowsMessageAfterClickingSaveButtonAndReloadsData()
@Test
public void draftDialogShowsMessageAfterClickingSaveButtonAndReloadsData()
Slide 34
Slide 34 text
Naming your tests
DraftDialogPresenter.java
@Test
public void
testDraftDialogPresenterShowsMessageAfterClickingSaveButtonAndReloadsData()
@Test
public void draftDialogShowsMessageAfterClickingSaveButtonAndReloadsData()
@Test
public void showsMessageWhenDraftIsSavedAndReloadsData()
Slide 35
Slide 35 text
Naming your tests
DraftDialogPresenter.java
@Test
public void showsMessageWhenDraftIsSaved()
@Test
public void
testDraftDialogPresenterShowsMessageAfterClickingSaveButtonAndReloadsData()
@Test
public void draftDialogShowsMessageAfterClickingSaveButtonAndReloadsData()
@Test
public void showsMessageWhenDraftIsSavedAndReloadsData()
Slide 36
Slide 36 text
Naming your tests
DraftDialogPresenter.java
@Test
public void
testDraftDialogPresenterShowsMessageAfterClickingSaveButtonAndReloadsData()
@Test
public void draftDialogShowsMessageAfterClickingSaveButtonAndReloadsData()
@Test
public void showsMessageWhenDraftIsSavedAndReloadsData()
@Test
public void showsMessageWhenDraftIsSaved()
Slide 37
Slide 37 text
Naming your tests
DraftDialogPresenter.java
@Test
public void showsSuccessMessageWhenDraftIsSaved()
@Test
public void
testDraftDialogPresenterShowsMessageAfterClickingSaveButtonAndReloadsData()
@Test
public void draftDialogShowsMessageAfterClickingSaveButtonAndReloadsData()
@Test
public void showsMessageWhenDraftIsSavedAndReloadsData()
@Test
public void showsMessageWhenDraftIsSaved()
Slide 38
Slide 38 text
Naming your tests
DraftDialogPresenter.java
@Test
public void
testDraftDialogPresenterShowsMessageAfterClickingSaveButtonAndReloadsData()
@Test
public void draftDialogShowsMessageAfterClickingSaveButtonAndReloadsData()
@Test
public void showsMessageWhenDraftIsSavedAndReloadsData()
@Test
public void showsMessageWhenDraftIsSaved()
@Test
public void showsSuccessMessageWhenDraftIsSaved()
Slide 39
Slide 39 text
Naming your tests
DraftDialogPresenter.java
@Test
public void showsErrorMessageWhenDraftIsNotSaved()
@Test
public void
testDraftDialogPresenterShowsMessageAfterClickingSaveButtonAndReloadsData()
@Test
public void draftDialogShowsMessageAfterClickingSaveButtonAndReloadsData()
@Test
public void showsMessageWhenDraftIsSavedAndReloadsData()
@Test
public void showsMessageWhenDraftIsSaved()
@Test
public void showsSuccessMessageWhenDraftIsSaved()
Slide 40
Slide 40 text
Naming your tests
DraftDialogPresenter.java
@Test
public void
testDraftDialogPresenterShowsMessageAfterClickingSaveButtonAndReloadsData()
@Test
public void draftDialogShowsMessageAfterClickingSaveButtonAndReloadsData()
@Test
public void showsMessageWhenDraftIsSavedAndReloadsData()
@Test
public void showsMessageWhenDraftIsSaved()
@Test
public void showsSuccessMessageWhenDraftIsSaved()
@Test
public void showsErrorMessageWhenDraftIsNotSaved()
Slide 41
Slide 41 text
Naming your tests
DraftDialogPresenter.java
@Test
public void shows_error_mesage_when_draft_is_not_saved()
@Test
public void
testDraftDialogPresenterShowsMessageAfterClickingSaveButtonAndReloadsData()
@Test
public void draftDialogShowsMessageAfterClickingSaveButtonAndReloadsData()
@Test
public void showsMessageWhenDraftIsSavedAndReloadsData()
@Test
public void showsMessageWhenDraftIsSaved()
@Test
public void showsSuccessMessageWhenDraftIsSaved()
@Test
public void showsErrorMessageWhenDraftIsNotSaved()
Slide 42
Slide 42 text
Naming your tests
DraftDialogPresenter.java
@Test
public void
testDraftDialogPresenterShowsMessageAfterClickingSaveButtonAndReloadsData()
@Test
public void draftDialogShowsMessageAfterClickingSaveButtonAndReloadsData()
@Test
public void showsMessageWhenDraftIsSavedAndReloadsData()
@Test
public void showsMessageWhenDraftIsSaved()
@Test
public void showsSuccessMessageWhenDraftIsSaved()
@Test
public void showsErrorMessageWhenDraftIsNotSaved()
@Test
public void shows_error_mesage_when_draft_is_not_saved()
Slide 43
Slide 43 text
Naming your tests
DraftDialogPresenter.java
// Groovy
def "Should show success message after successfully saved a draft"()
// Kotlin
fun `Should show success message after successfully saved a draft`()
Slide 44
Slide 44 text
Naming your tests
@Test
public void showsErrorMessageWhenDraftIsNotSaved()
{}
@Test
public void
shows_error_mesage_when_draft_is_not_saved() {}
// Groovy
def "Should show success message after
successfully saved a draft"()
// Kotlin
fun `Should show success message after
successfully saved a draft`()
Enforce conventions
static-analysis.gradle
apply plugin: 'findbugs'
task findbugsMain(type: FindBugs) {
description 'Uses static analysis to look for bugs in Java code.'
...
}
staticAnalysis.dependsOn findbugsMain
apply plugin: 'pmd'
task pmdMain(type: Pmd) {
description 'Finds common programming flaws throw static analysis of code.'
}
staticAnalysis.dependsOn pmdMain
check.dependsOn staticAnalysis
Slide 72
Slide 72 text
Static analysis
Slide 73
Slide 73 text
Good naming is a process, not a single step
- http://arlobelshee.com/good-naming-is-a-process-not-a-single-step/
1
Resources
Just say hNo to hungarian notation
- http://jakewharton.com/just-say-no-to-hungarian-notation/
How We Rethought our Complete Package Structure for Buffer on Android and
the Awesome Effect It’s Had on Our Workflows
- https://overflow.buffer.com/2016/09/26/android-rethinking-package-structure/
Share the settings with the whole team
- https://tips.seebrock3r.me/share-settings-with-the-team-a-year-later-
e28c24fc07aa#.sihndb3f3
Slide 74
Slide 74 text
Novoda IDE Settings
- https://github.com/novoda/novoda/tree/master/ide-settings
1
Resources
Buffer’s Android Guidelines
- https://github.com/bufferapp/android-guidelines
Vincent Brison’s Static Analysis with Gradle
- https://github.com/vincentbrison/vb-android-app-quality
Slide 75
Slide 75 text
Questions?
David González
@dggonzalez
malmstein@gmail.com