Семь смертных грехов...

36
Семь смертных грехов разработчика и как с ними бороться

Upload: others

Post on 14-Jul-2020

1 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Семь смертных грехов разработчикаpublic.jugru.org/jokersd/2015/spb/mandrikov.pdfDisclaimer // TODO: don't forget to add huge disclaimer that all opinions

Семь смертных грехов разработчика

и как с ними бороться

Page 2: Семь смертных грехов разработчикаpublic.jugru.org/jokersd/2015/spb/mandrikov.pdfDisclaimer // TODO: don't forget to add huge disclaimer that all opinions

● Евгений Мандриков● @_godin_● https://github.com/godin

2

Page 3: Семь смертных грехов разработчикаpublic.jugru.org/jokersd/2015/spb/mandrikov.pdfDisclaimer // TODO: don't forget to add huge disclaimer that all opinions

Disclaimer

// TODO: don't forget to add huge disclaimer that all opinions hereinbelow are my own and not my employers (they wish they had them)

3

Page 4: Семь смертных грехов разработчикаpublic.jugru.org/jokersd/2015/spb/mandrikov.pdfDisclaimer // TODO: don't forget to add huge disclaimer that all opinions

В идеале 4

“A well-written program is a program where the cost of implementing a feature is constant throughout the program's lifetime.”

Itay Maman

Page 5: Семь смертных грехов разработчикаpublic.jugru.org/jokersd/2015/spb/mandrikov.pdfDisclaimer // TODO: don't forget to add huge disclaimer that all opinions

На практике

“Чем дальше в лес, тем толще партизаны.”

Народная мудрость

5

Page 6: Семь смертных грехов разработчикаpublic.jugru.org/jokersd/2015/spb/mandrikov.pdfDisclaimer // TODO: don't forget to add huge disclaimer that all opinions

Хочется как лучше, а получается... 6

Page 7: Семь смертных грехов разработчикаpublic.jugru.org/jokersd/2015/spb/mandrikov.pdfDisclaimer // TODO: don't forget to add huge disclaimer that all opinions

Технический долг 7

Page 8: Семь смертных грехов разработчикаpublic.jugru.org/jokersd/2015/spb/mandrikov.pdfDisclaimer // TODO: don't forget to add huge disclaimer that all opinions

Технический долг 8

Page 9: Семь смертных грехов разработчикаpublic.jugru.org/jokersd/2015/spb/mandrikov.pdfDisclaimer // TODO: don't forget to add huge disclaimer that all opinions

7 смертных грехов разработчика

9

Page 10: Семь смертных грехов разработчикаpublic.jugru.org/jokersd/2015/spb/mandrikov.pdfDisclaimer // TODO: don't forget to add huge disclaimer that all opinions

10class SomethingComparator implements Comparator<Something> { public int compare(Something o1, Something o2) { if (o1.f1 < o2.f2) { return -1; } else { if (o1.f1 == o2.f1) { if (o1.f2 < o2.f2) { return -1; } else { if (o1.f2 == o2.f2) { return 0; } else { return 1; } } } else { return 1; } } }}

Page 11: Семь смертных грехов разработчикаpublic.jugru.org/jokersd/2015/spb/mandrikov.pdfDisclaimer // TODO: don't forget to add huge disclaimer that all opinions

Distribution of complexity 11

“Everything should be made as simple as possible. But not simpler.”

“If you can't explain it simply, you don't understand it well enough.”

Albert Einstein

Page 12: Семь смертных грехов разработчикаpublic.jugru.org/jokersd/2015/spb/mandrikov.pdfDisclaimer // TODO: don't forget to add huge disclaimer that all opinions

Distribution of complexity

Keep It

● Simple, Stupid● Short & Simple● Super Simple

12

Page 13: Семь смертных грехов разработчикаpublic.jugru.org/jokersd/2015/spb/mandrikov.pdfDisclaimer // TODO: don't forget to add huge disclaimer that all opinions

Spaghetti design 13

Page 14: Семь смертных грехов разработчикаpublic.jugru.org/jokersd/2015/spb/mandrikov.pdfDisclaimer // TODO: don't forget to add huge disclaimer that all opinions

Comments 14

Page 15: Семь смертных грехов разработчикаpublic.jugru.org/jokersd/2015/spb/mandrikov.pdfDisclaimer // TODO: don't forget to add huge disclaimer that all opinions

Comments 15

/** * Always returns true. * */public boolean isAvailable() { return false;}

/** * Returns the counter. * @return counter */public int getCounter() { return counter;}

Page 16: Семь смертных грехов разработчикаpublic.jugru.org/jokersd/2015/spb/mandrikov.pdfDisclaimer // TODO: don't forget to add huge disclaimer that all opinions

Coding standards 16

Page 17: Семь смертных грехов разработчикаpublic.jugru.org/jokersd/2015/spb/mandrikov.pdfDisclaimer // TODO: don't forget to add huge disclaimer that all opinions

Coding standards 17

“Any fool can write code that a computer can understand. Good programmers write code that humans can understand.”

Martin Fowler

Page 18: Семь смертных грехов разработчикаpublic.jugru.org/jokersd/2015/spb/mandrikov.pdfDisclaimer // TODO: don't forget to add huge disclaimer that all opinions

Coding standards

OSStatus SSLVerifySignedServerKeyExchange(...) { if ((err = SSLHashSHA1.update(&hashCtx, &signedParams)) != 0) goto fail; goto fail; // other checks... fail: // cleanup... return err;}

18

Page 19: Семь смертных грехов разработчикаpublic.jugru.org/jokersd/2015/spb/mandrikov.pdfDisclaimer // TODO: don't forget to add huge disclaimer that all opinions

Code coverage 19

Page 20: Семь смертных грехов разработчикаpublic.jugru.org/jokersd/2015/spb/mandrikov.pdfDisclaimer // TODO: don't forget to add huge disclaimer that all opinions

Code coverage 20

class MyMath { static int sum(int a, int b) { return a - b; }}

class MyMathTest { @Test public void test() { MyMath.sum(0,0); }}

Page 21: Семь смертных грехов разработчикаpublic.jugru.org/jokersd/2015/spb/mandrikov.pdfDisclaimer // TODO: don't forget to add huge disclaimer that all opinions

package java.util;

public final class Formatter { // ... public String toString() { StringBuilder sb = new StringBuilder(‘%’); // 11 lines... return sb.toString(); } // ...}

Potential bugs 21

Page 22: Семь смертных грехов разработчикаpublic.jugru.org/jokersd/2015/spb/mandrikov.pdfDisclaimer // TODO: don't forget to add huge disclaimer that all opinions

Duplicated code 22

Page 23: Семь смертных грехов разработчикаpublic.jugru.org/jokersd/2015/spb/mandrikov.pdfDisclaimer // TODO: don't forget to add huge disclaimer that all opinions

Duplicated code 23

namespace Microsoft.CodeAnalysis.CSharp.Syntax{private bool NeedsSeparator(SyntaxToken token, SyntaxToken next) { // ... if (IsXmlTextToken(token.Kind()) || IsXmlTextToken(token.Kind())) { return false; } // ...}}

Page 24: Семь смертных грехов разработчикаpublic.jugru.org/jokersd/2015/spb/mandrikov.pdfDisclaimer // TODO: don't forget to add huge disclaimer that all opinions

7 смертных грехов разработчика 24

1. distribution of complexity2. spaghetti design3. not enough or too many comments4. coding standards not respected5. not enough tests6. potential bugs7. duplicated code

Page 25: Семь смертных грехов разработчикаpublic.jugru.org/jokersd/2015/spb/mandrikov.pdfDisclaimer // TODO: don't forget to add huge disclaimer that all opinions

Теория разбитых окон 25

Page 26: Семь смертных грехов разработчикаpublic.jugru.org/jokersd/2015/spb/mandrikov.pdfDisclaimer // TODO: don't forget to add huge disclaimer that all opinions

“You can't manage what you can't measure.”

W. Edwards Deming

26

Page 27: Семь смертных грехов разработчикаpublic.jugru.org/jokersd/2015/spb/mandrikov.pdfDisclaimer // TODO: don't forget to add huge disclaimer that all opinions

27

Page 28: Семь смертных грехов разработчикаpublic.jugru.org/jokersd/2015/spb/mandrikov.pdfDisclaimer // TODO: don't forget to add huge disclaimer that all opinions

28Метрики

● Size (NCLoC, …)● Complexity (cyclomatic, essential, …)● Coverage (lines, branches, conditions, ...)● Duplications (lines, blocks, …)● Design (LCOM, …)● …

Page 29: Семь смертных грехов разработчикаpublic.jugru.org/jokersd/2015/spb/mandrikov.pdfDisclaimer // TODO: don't forget to add huge disclaimer that all opinions

Динамический анализ 29

http://jacoco.org/ http://pitest.org/

Page 30: Семь смертных грехов разработчикаpublic.jugru.org/jokersd/2015/spb/mandrikov.pdfDisclaimer // TODO: don't forget to add huge disclaimer that all opinions

Статический анализ 30

https://pmd.github.io/

http://findbugs.sourceforge.net/

http://checkstyle.sourceforge.net/

Page 31: Семь смертных грехов разработчикаpublic.jugru.org/jokersd/2015/spb/mandrikov.pdfDisclaimer // TODO: don't forget to add huge disclaimer that all opinions

Ок, применяем 31

Page 32: Семь смертных грехов разработчикаpublic.jugru.org/jokersd/2015/spb/mandrikov.pdfDisclaimer // TODO: don't forget to add huge disclaimer that all opinions

Water leak 32

Page 33: Семь смертных грехов разработчикаpublic.jugru.org/jokersd/2015/spb/mandrikov.pdfDisclaimer // TODO: don't forget to add huge disclaimer that all opinions

Непрерывная инспекция 33

http://sonarqube.org/

Page 34: Семь смертных грехов разработчикаpublic.jugru.org/jokersd/2015/spb/mandrikov.pdfDisclaimer // TODO: don't forget to add huge disclaimer that all opinions

Правило бойскаута 34

“Always code as if the person who ends up maintaining your code is a violent psychopath who knows where you live.”

John F. Woods

Leave the code cleaner than you found it.

Page 35: Семь смертных грехов разработчикаpublic.jugru.org/jokersd/2015/spb/mandrikov.pdfDisclaimer // TODO: don't forget to add huge disclaimer that all opinions

35

Page 36: Семь смертных грехов разработчикаpublic.jugru.org/jokersd/2015/spb/mandrikov.pdfDisclaimer // TODO: don't forget to add huge disclaimer that all opinions

36