Slide 1

Slide 1 text

The source of all technical debt

Slide 2

Slide 2 text

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

Slide 8

Slide 8 text

7 stages of naming

Slide 9

Slide 9 text

Nonsense preloadDetails();

Slide 10

Slide 10 text

Honest doSomethingEvilToTheDatabaseAndDisplayTheResult();

Slide 11

Slide 11 text

Not just for functions public class DataManager public class DataProvider public class DataRepository public class DataOperations

Slide 12

Slide 12 text

Honest and Complete parseXmlAndStoreFlightToDatabaseAndLocalCacheAndBeginBackgroundProcessing();

Slide 13

Slide 13 text

No content

Slide 14

Slide 14 text

Does the right thing storeFlightToDatabaseAndStartProcessing();

Slide 15

Slide 15 text

Intent beginTrackingFlight();

Slide 16

Slide 16 text

Domain abstraction MonitoringPanel.add(new Flight());

Slide 17

Slide 17 text

Define your language

Slide 18

Slide 18 text

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`()

Slide 45

Slide 45 text

Android package structure

Slide 46

Slide 46 text

No content

Slide 47

Slide 47 text

helpscout api app database

Slide 48

Slide 48 text

app common data domain injection

Slide 49

Slide 49 text

domain conversations folders mailboxes session search settings

Slide 50

Slide 50 text

mailboxes model usecases view MailboxesMVP MailboxesPresenter

Slide 51

Slide 51 text

Android resource management

Slide 52

Slide 52 text

Styles

Slide 53

Slide 53 text

Styles view-convo-preview.xml

Slide 54

Slide 54 text

Styles <item name="android:textSize">@dimen/convo_subject_text</item> <item name="android:ellipsize">end</item> <item name="android:maxLines">1</item> <item name="android:textColor">@color/convo_preview_pending</item> convo-preview-styles.xml

Slide 55

Slide 55 text

Colors <item name="android:textColor">@color/convo_preview_pending</item> convo-preview-styles.xml @color/charcoal_300 convo-preview-colors.xml #72808e colors.xml

Slide 56

Slide 56 text

Dimensions <item name="android:textSize">@dimen/convo_preview_text</item> <item name="android:ellipsize">end</item> <item name="android:maxLines">1</item> convo-preview-styles.xml @dimen/text_subhead convo-preview-dimens.xml 11sp dimens.xml

Slide 57

Slide 57 text

Strings @string/convo_archived @string/convo_restored convo-preview-strings.xml Conversation archived. Conversation status restored. strings-translatable.xml

Slide 58

Slide 58 text

No content

Slide 59

Slide 59 text

Files

Slide 60

Slide 60 text

We are talking about conventions and we should share them with the team

Slide 61

Slide 61 text

https://google.github.io/styleguide/javaguide.html#s5.1-identifier-names

Slide 62

Slide 62 text

http://s.android.com/source/code-style.html#follow-field-naming-conventions

Slide 63

Slide 63 text

No content

Slide 64

Slide 64 text

No content

Slide 65

Slide 65 text

Enforce those conventions

Slide 66

Slide 66 text

Enforce conventions

Slide 67

Slide 67 text

Enforce conventions ... ... ...

Slide 68

Slide 68 text

Enforce conventions team-props/checkstyle/modules.xml

Slide 69

Slide 69 text

Enforce conventions team-props/pmd/ruleset.xml

Slide 70

Slide 70 text

Enforce conventions static-analysis.gradle apply plugin: 'checkstyle' def rulesDir = new File(project.teamPropsDir, 'rules') task checkstyleMain(type: Checkstyle) { description 'Checks whether Java source code complies with coding rules.' ... } staticAnalysis.dependsOn checkstyleMain task verifyNoCheckstyleWarnings { doLast { File warningsFile = file('buildMessage/reports/checkstyle/main.xml') if (warningsFile.exists() && warningsFile.text.contains("

Slide 71

Slide 71 text

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