Professional Documents
Culture Documents
General
These are not to be blindly followed; strive to understand these and ask
when in doubt.
Don't duplicate the functionality of a built-in library.
Don't swallow exceptions or "fail silently."
Don't write code that guesses at future functionality.
Exceptions should be exceptional.
Keep the code simple.
Object-Oriented Design
Ruby
Ruby Gems
Rails
16:05:37")
Use ENV.fetch for environment variables instead of ENV[]so that unset
Testing
Bundler
Postgres
Background Jobs
Store IDs, not ActiveRecord objects for cleaner serialization, then re-find the
Web
JavaScript
Use the latest stable JavaScript syntax with a transpiler, such as babel.
Include a to_param or href attribute when serializing ActiveRecord models,
and use that when constructing URLs client side, rather than the ID.
HTML
CSS
Use Sass.
Use Autoprefixer to generate vendor prefixes based on the project-specific
browser support that is needed.
Sass
Prefer overflow: auto to overflow: scroll, because scroll will always display
scrollbars outside of OS X, even when content fits in the container.
Use image-url and font-url, not url, so the asset pipeline will re-write the
correct paths to assets.
Prefer mixins to @extend.
Browsers
Objective-C
Setup new projects using Liftof and follow provided directory structure.
Prefer categories on Foundation classes to helper methods.
Prefer string constants to literals when providing keys or key paths to
methods.
Shell
Don't parse the output of ls. See here for details and alternatives.
Don't use cat to provide a file on stdin to a process that accepts file
arguments itself.
Don't use echo with options, escapes, or variables (use printf for those cases).
Don't use a /bin/sh shebang unless you plan to test and run your script on at
least: Actual Sh, Dash in POSIX-compatible mode (as it will be run on
Debian), and Bash in POSIX-compatible mode (as it will be run on OSX).
Don't use any non-POSIX features when using a /bin/sh shebang.
If calling cd, have code to handle a failure to change directories.
If calling rm with a variable, ensure the variable is not empty.
Prefer "$@" over "$*" unless you know exactly what you're doing.
Prefer awk '/re/ { ... }' to grep re | awk '{ ... }'.
Prefer find -exec {} + to find -print0 | xargs -0.
Prefer for loops over while read loops.
Prefer grep -c to grep | wc -l.
Prefer mktemp over using $$ to "uniquely" name a temporary file.
Prefer sed '/re/!d; s//.../' to grep re | sed 's/re/.../'.
Prefer sed 'cmd; cmd' to sed -e 'cmd' -e 'cmd'.
Prefer checking exit statuses over output in if statements (if grep -q ...;, not if [
-n "$(grep ...)" ];).
Prefer reading environment variables over process output ($TTY not $(tty),
$PWD not $(pwd), etc).
Use $( ... ), not backticks for capturing command output.
Use $(( ... )), not expr for executing arithmetic expressions.
Use 1 and 0, not true and false to represent boolean variables.
Use find -print0 | xargs -0, not find | xargs.
Use quotes around every "$variable" and "$( ... )" expression unless you want
them to be word-split and/or interpreted as globs.
Use the local keyword with function-scoped variables.
Identify common problems with shellcheck.
Bash
Haskell
Ember
Angular
Avoid manual dependency annotations. Disable mangling or use a preprocessor for annotations.
Prefer factory to service. If you desire a singleton, wrap the singleton class in
a factory function and return a new instance of that class from the factory.
Prefer the translate directive to the translate filter for performance reasons.
Don't use the jQuery or $ global. Access jQuery via angular.element.
Write integration tests for your API endpoints. When the primary consumer of
the API is a JavaScript client maintained within the same code base as the
provider of the API, write feature specs. Otherwise write request specs.
Code Review
A guide for reviewing code and having your code reviewed.
Everyone
Be grateful for the reviewer's suggestions. ("Good call. I'll make that
change.")
Don't take it personally. The review is of the code, not you.
Explain why the code exists. ("It's like that because of these reasons. Would
it be more clear if I rename this class/file/method/variable?")
Extract some changes and refactorings into future tickets/stories.
Link to the code review from the ticket/story. ("Ready for review:
https://github.com/organization/project/pull/1")
Push commits based on earlier rounds of feedback as isolated commits to the
branch. Do not squash until the branch is ready to merge. Reviewers should
be able to read individual updates based on their earlier feedback.
Seek to understand the reviewer's perspective.
Try to respond to every comment.
Wait to merge the branch until Continuous Integration (TDDium, TravisCI,
Reviewing Code
Understand why the change is necessary (fixes a bug, improves the user
experience, refactors the existing code). Then:
Communicate which ideas you feel strongly about and those you don't.
Identify ways to simplify the code while still solving the problem.
If discussions turn too philosophical or academic, move the discussion offline
to a regular Friday afternoon technique discussion. In the meantime, let the
author make the final decision on alternative implementations.
Ofer alternative implementations, but assume the author already considered
them. ("What do you think about using a custom validator here?")
Seek to understand the author's perspective.
Sign of on the pull request with a or "Ready to merge" comment.
Style Comments
Reviewers should comment on missed style guidelines. Example comment:
[Style](../style):
If you disagree with a guideline, open an issue on the guides repo rather
than debating it within the code review. In the meantime, apply the
guideline.
How do I ...
Contents
... start a new Rails app?
... feature-test a Rails app's Javascript?
gem "capybara-webkit"
In spec/support/capybara_webkit.rb (for Rspec):
Capybara.javascript_driver = :webkit
Capybara::Webkit.configure do |config|
config.block_unknown_urls
end
When writing a spec, you must set the :js flag for that test to make use of
capybara-webkit. For example, in spec/features/user_signs_in_spec.rb:
feature "Authentication", :js do
scenario "A user signing in" do
create(:user, email: "me@example.com", password: "sekrit")
sign_in_as email: "me@example.com", password: "sekrit"
expect(page).to have_text("Welcome!")
end
end
Git Protocol
A guide for programming within version control.
Maintain a Repo
Avoid including files in source control that are specific to your development
machine or process.
Delete local and remote feature branches after merging.
Perform work in a feature branch.
Rebase frequently to incorporate upstream changes.
Use a pull request for code reviews.
Write a Feature
Create a local feature branch based of master.
git checkout master
git pull
git checkout -b <branch-name>
Resolve conflicts. When feature is complete and tests pass, stage the
changes.
git add --all
Review Code
A team member other than the author reviews the pull request. They follow
Code Review guidelines to avoid miscommunication.
They make comments and ask questions directly on lines of code in the
GitHub web interface or in the project's chat room.
For changes which they can make themselves, they check out the branch.
git checkout <branch-name>
./bin/setup
git dif staging/master..HEAD
They make small changes right in the branch, test the feature on their
machine, run tests, commit, and push.
When satisfied, they comment on the pull request Ready to merge.
Merge
Rebase interactively. Squash commits like "Fix whitespace" into one or a
small number of valuable commit(s). Edit commit messages to reveal intent.
Run tests.
git fetch origin
git rebase -i origin/master
Force push your branch. This allows GitHub to automatically close your pull
request and mark it as merged when your commit(s) are pushed to master. It
also makes it possible to find the pull request that brought in your changes.
git push --force-with-lease origin <branch-name>
View a list of new commits. View changed files. Merge branch into master.
git log origin/master..<branch-name>
git dif --stat origin/master
git checkout master