What is quality code? From cruft to craft

Preview:

Citation preview

From cruft to CRAFT@nickdenardis #psuweb

@nickdenardis #psuweb

Nick DeNardisMinimalist. UX crafter. Speaker. Realist. Computer scientist. Library scientist.

Wayne State UniversityDirector of Digital Communications

TEDxDetroit, HighEdWeb MI, Laravel Detroit & Refresh DetroitOrganizer

Amateur hardwood floor refinisher

@nickdenardis #psuweb

Housekeeping

Slides onlinespeakerdeck.com/nickdenardis

Music online8tracks.com/nickdenardis/psuweb-woodwork

Extra resources are available on the slides

This is being streamed/recorded

Show of hands…

@nickdenardis #psuweb

How did we produce all this cruft in the first place?

@nickdenardis #psuweb

Simple☐ Creating software is hard ☐ Lots of unknowns ☐ Client changes over time ☐ Changing technology ☐ Growing expectations ☐ Time constraints ☐ Money constraints ☐ Turnover/student workers ☐ Team moral ☐ Development environment ☐ Training

Developer A developer executes. Their talents often focused to a single area. Without need for the “big picture”.

Engineer An engineer designs and plans. Always aware of the “big picture”. With talents in many areas. An engineer can assume the developer role. But an engineer’s core focus lies with architecture.

@nickdenardis #psuweb

Project managementcontributed to this cruft…

@nickdenardis #psuweb

Resources

• https://www.getharvest.com/

@nickdenardis #psuweb

Turnoverproduced all this cruft…

@nickdenardis #psuweb

Documentation

@nickdenardis #psuweb

Team knowledgecreated all this cruft..

@nickdenardis #psuweb

Reading codelevels up everyone on the team

@nickdenardis #psuweb

Code reading 101Pick a function/library/file < 50 lines of code. Set aside 2-3 minutes per line

Try to build and run it.

Don't focus on the details early.

Make sure you understand all the constructs.

Now that you've got a good idea about most of the constructs, it is time to do a couple of random deep-dives.

There were undoubtedly things in the previous step you were confused about, so this is the perfect time to go and read some tests.

No tests you say, sounds like the perfect time to write some.

@nickdenardis #psuweb

Our turn

@nickdenardis #psuweb

Resources• http://devchat.tv/ruby-rogues/031-rr-code-reading

• http://www.codenewbie.org/podcast/ep-2-coding-like-a-boss-w-brian-douglas

• Reading code talk - https://www.youtube.com/watch?v=mW_xKGUKLpk

• http://bloggytoons.com/code-club

• http://www.slideshare.net/saronyitbarek/reading-code-good

• http://www.codewars.com/

• http://www.skorks.com/2010/05/why-i-love-reading-other-peoples-code-and-you-should-too/

• http://www.readingcodegood.com/

@nickdenardis #psuweb

Code reviewsfacilitate discussion around solutions

@nickdenardis #psuweb

Code Review

1. Knowledge transfer

2. Increased team awareness

3. Finding alternative solutions to problems

@nickdenardis #psuweb

What to review in a PR?

• Everyone brings something to the table

• Single responsibility principle

• Naming

• Tests should cover QA, it’s not a reviewer’s responsibility

• “Leave a place better than you found it” ~ Girl Scouts

@nickdenardis #psuweb

Authoring a pull request

• Small atomic changes

• Should take at least 10 minutes

• Provide two paragraphs of context

• Only link to `Fixes #1337` as a command

@nickdenardis #psuweb

Reviewing a pull request

• Ask, don’t tell

• Negativity bias in written communication

• Foster a technical discussion

• Never use the word “just”

• Be positive

@nickdenardis #psuweb

Resources• http://research.microsoft.com/pubs/180283/ICSE

%202013-codereview.pdf

• http://blog.codeclimate.com/blog/2013/10/09/unexpected-outcomes-of-code-reviews/

• Does it need a +1? http://harvesthq.github.io/fias/

• Harvest code reviewshttps://techtime.getharvest.com/blog/code-reviews-at-harvest

@nickdenardis #psuweb

Refactoring

@nickdenardis #psuweb

SOLID PrinciplesSingle Responsibilitya class should have only a single responsibility

Open/closed principleshould be open for extension, but closed for modification

Liskov substitution principleobjects in a program should be replaceable with instances of their subtypes

Interface segregation principle many client-specific interfaces are better than one general-purpose interface.

Dependency inversion principle Depend upon Abstractions. Do not depend upon concretions.

@nickdenardis #psuweb

One pass at a time

@nickdenardis #psuweb

Sandi Metz

• Your class can be no longer than 100 lines of code.

• Your methods can be no longer than five lines of code.

• You can pass no more than four parameters and you can’t just make it one big hash.

• When a call comes into your (Rails) controller, you can only instantiate one object to do whatever it is that needs to be done. And your view can only know about one instance variable.

@nickdenardis #psuweb

Resources• Sandi Metz - Refactoring

https://www.youtube.com/watch?v=8bZh5LMaSmE

• Eye tracking originalhttps://www.youtube.com/watch?v=VtuO9un2Vyg

• Eye tracking refactorhttps://www.youtube.com/watch?v=Jc8M9-LoEuo

• How big should a function be?http://cleancoders.com/episode/clean-code-episode-3/show

• Rules for good software development - http://gist.io/4567190

@nickdenardis #psuweb

Style guidesbecause you don’t have to think about a default

@nickdenardis #psuweb

PSR-2 Standards Highlights• Code MUST use 4 spaces for indenting, not tabs.

• Opening braces for classes MUST go on the next line, and closing braces MUST go on the next line after the body.

• Opening braces for methods MUST go on the next line, and closing braces MUST go on the next line after the body.

• Opening parentheses for control structures MUST NOT have a space after them, and closing parentheses for control structures MUST NOT have a space before.

@nickdenardis #psuweb

Resources• http://www.php-fig.org/psr/psr-2/

• https://en.wiktionary.org/wiki/bikeshedding

• http://www.nngroup.com/articles/the-power-of-defaults/

• http://blog.codinghorror.com/the-power-of-defaults/

• https://github.com/waynestate/web-guides

• https://github.com/bbatsov/ruby-style-guide

• https://www.drupal.org/coding-standards

• http://isobar-idev.github.io/code-standards/

@nickdenardis #psuweb

Your processcreated all this cruft…

@nickdenardis #psuweb

Resources

• http://danielkummer.github.io/git-flow-cheatsheet/

• https://github.com/blog/2019-how-to-undo-almost-anything-with-git

@nickdenardis #psuweb

Retrospectivesallow you to improve each week

@nickdenardis #psuweb

Weekly maintenanceis everyone’s job

@nickdenardis #psuweb

Automationbecause ain’t no body got time to do it by hand

@nickdenardis #psuweb

Generators

@nickdenardis #psuweb

Resources

• http://vagrantup.com

• http://yeoman.io

• http://gulpjs.com

@nickdenardis #psuweb

Code formatting

@nickdenardis #psuweb

Editorconfig# http://editorconfig.org root = true

[*] indent_style = space indent_size = 4 end_of_line = lf charset = utf-8 trim_trailing_whitespace = true insert_final_newline = true

[*.md] trim_trailing_whitespace = false

[makefile] indent_style = tab

composer global require fabpot/php-cs-fixer @stable

php-cs-fixer fix src/ --level="psr2" --dry-run -v --diff

PHP CS Fixer

Run it against your code

@nickdenardis #psuweb

Resources

• https://houndci.com/

• http://editorconfig.org/

• https://codeclimate.com/

• https://github.com/FriendsOfPHP/PHP-CS-Fixer

@nickdenardis #psuweb

GIT hooks

# pre-commit.sh git stash -q --keep-index ./run_tests.sh RESULT=$? git stash pop -q [ $RESULT -ne 0 ] && exit 1 exit 0

ln -s ../../pre-commit.sh .git/hooks/pre-commit

Symlink in your hooks

Stash before running

# ~/.bash_aliases alias gc='git commit' alias gcv='git commit --no-verify'

How to skip the hook

@nickdenardis #psuweb

Resources

• https://git-scm.com/book/en/v2/Customizing-Git-Git-Hooks

• http://githooks.com/

• https://www.digitalocean.com/community/tutorials/how-to-use-git-hooks-to-automate-development-and-deployment-tasks

• http://codeinthehole.com/writing/tips-for-using-a-git-pre-commit-hook/

• https://github.com/codegram/pelusa

@nickdenardis #psuweb

Measuring resultsin the real world

@nickdenardis #psuweb

Before…

@nickdenardis #psuweb

Growing pains.

@nickdenardis #psuweb

Now that’s about right

@nickdenardis #psuweb

Tiny habitswill bring your cruft to craft

@nickdenardis #psuweb

Kaizen• Good processes bring good results

• Go see for yourself to grasp the current situation

• Speak with data, manage by facts

• Take action to contain and correct root causes of problems

• Work as a team

• Kaizen is everybody’s business

@nickdenardis #psuweb

Resources

• http://www.kaizen.com/about-us/definition-of-kaizen.html

@nickdenardis #psuweb

Thank you@nickdenardis

Recommended