Pivotal Labs » George Deanhttp://pivotallabs.com
Agile DevelopmentWed, 29 Jul 2015 22:44:54 +0000en-UShourly1http://wordpress.org/?v=4.2.3Best practices for designer/developer collaborationhttp://pivotallabs.com/best-practices-for-designerdeveloper-collaboration/
http://pivotallabs.com/best-practices-for-designerdeveloper-collaboration/#commentsMon, 03 Jun 2013 20:06:39 +0000http://pivotallabs.com/?p=19856Successful product development requires effective collaboration between designers and developers. That sounds nice in theory, but what does it mean for your team on a day-to-day basis? Here are some specific practices that you may find valuable: Check-in about design status every day: Designer reviews the backlog after standup with ...

]]>Successful product development requires effective collaboration between designers and developers. That sounds nice in theory, but what does it mean for your team on a day-to-day basis? Here are some specific practices that you may find valuable:

Check-in about design status every day: Designer reviews the backlog after standup with the team to ensure that the team is not blocked by any design-related issues or questions.

Name your components: Designers create objects and name them. Design these in high fidelity and render them on the style guide.

Sit with the team: Designers overhear design conversations that are happening between the product manager and the developers.

Two designers, two projects: Allocate two designers to work together on two projects. They work half time on each, enabling them to collaborate all the time without charging the client for two designers.

Develop interactive wireframes: Designers create clickable prototypes early in the process before locking in the final design. These are used to perform user testing and to evaluate cost with developers.

Communicate layout mechanics on mobile platforms: Developers communicate platform-specific constraints to designers to ensure that designs are not created that cannot be built.

Create and post personas: Start by posting lightweight personas on the wall that are just sheets of paper with names on them. As pieces of the personas become apparent during discussions, update them. This helps to clarify that each feature is being built with a clear idea of its target audience.

Give design practices names: Naming best practices allows them to be codified and referenced as part of a standard, shared vocabulary.

Spike on designs in code: Developers use SASS, HAML, and Ruby to quickly build out potential designs without tests, to be thrown away afterward.

Use persona names in tests: Instead of creating new names for users in tests and fixtures, use the names of personas.

Designers write HTML and CSS: Instead of leaving all of the coding to developers, designers take ownership over the HTML and CSS associated with their designs.

Pair designers and developers: This enables designers to learn about development and developers to learn about design. It is better suited to web development than mobile development since it is easier to iterate rapidly on HTML and CSS than on native code.

Build low-fidelity prototypes with high-fidelity components: Designers don’t build high fidelity designs across the board, because doing so results in some designs going out of date. Instead, they build low fidelity mockups with high fidelity components.

Externalize everything: Make all design decisions visible to the entire team by posting designs around the team’s workspace.

Show evolution of designs: Post historic designs next to their revised counterparts to show the evolution of the team’s designs.

Create an idea board: Build an epic-level reverse-Kanban board with three columns: “Now”, “Next”, and “Later”. Generally you’ll have 2-3 cards in the Now column, another 2-3 in the Next Column, and the rest (~20-40) in the Later column. The idea board externalizes future epics, gives stakeholders a place to park long-term ideas, and gives a big picture view into what the team is working on.

Design studio: Designers from different projects get together to collaborate on each other’s work and provide actionable feedback.

]]>http://pivotallabs.com/best-practices-for-designerdeveloper-collaboration/feed/2A Stately Resquehttp://pivotallabs.com/a-stately-resque/
http://pivotallabs.com/a-stately-resque/#commentsThu, 07 Feb 2013 17:29:12 +0000http://pivotallabs.com/?p=15131Helps ActiveRecord save race condition in Resque We have a Rails app that is saving a new ActiveRecord object, and then immediately afterwards, enqueueing a Resque job that looks up that record by its ID. Sometimes, the lookup inside the resque job fails – it claims no such row with ...

ActiveRecord save race condition in Resque

We have a Rails app that is saving a new ActiveRecord object, and then immediately afterwards, enqueueing a Resque job that looks up that record by its ID. Sometimes, the lookup inside the resque job fails – it claims no such row with that ID exists.

If we put the lookup into a loop that catches that exception and retries the exact same lookup, it always eventually succeeds, usually after 1-2 seconds.

The ID exists on the ActiveRecord object before the job is enqueued, which (I think) means that the save transaction has completed. But the resque job is using a different database connection, so maybe there's some weird caching going on? But here Google has failed us.

Any ideas? We could leave it in a loop that catches the exception, sleeps 1 second, and retries, but: ugh.

Some ideas from the audience:
There is a connection object that can be queried about transaction states.
Wait for transaction count increment/decrement?
Could be a problem with the way that sqlite fakes nested transactions.

Best practices for individual users on GitHub

Usually we have a single GitHub account for a project that contains a key for each of the machines being used on a project. On our project we want to use a separate account for each person on the project. Is there a way to do this without a lot of trouble shuffling SSH keys around?

Pivotal Git Scripts may have some tools for this.
You can also use HTTPS URLs and enter username/password on each commit.

Interestings

Lobot – Now with per-project chef recipes

If you need to write your own chef recipes to install your project's dependencies, you can add a cookbooks directory to the root of your project. Make sure to delete the cookbook_paths section from your lobot.yml (to use the default values), or add ./chef/project-cookbooks to the cookbook_paths section.

So, to have a bacon recipe, you should have cookbooks/pork/recipes/bacon.rb file in your repository.

undefined method `fields' for nil

We keep getting this error across multiple projects & machines, with different versions of the pg gem and the PostgreSQL server, with varying consistency. Switching the tests to sqlite seems to fix it.

Interestings

Homebrew is Kickstarting an automated test bot

Resizing the window to test media queries

If you want to test your media query css as part of your acceptance suite, you can just ask Capybara to resize the firefox window.
Don't use the iframe to do this, because it will be buggy. Note you will need to use min/max-width not min/max-device-width when defining your media queries. Otherwise resizing the browser window will not trigger the media query.

MySQL lock wait timeout exceeded with timecop and parallel test

(Alexander & Matt)

We want to make sure that our fixtures don’t get out of sync with our test suit. So we wrapped everything into timecop. Now we are getting “Mysql2::Error: Lock wait timeout exceeded” when running “rake parallel:spec”. The offending database call is a “Fixture Delete”.

Interestings

RubyMine 5 scary find & replace

Yard

(Matt & Will)

Yard doc is a pretty sweet way to generate some documentation. On our project, we had developed a little system of helper methods for our acceptance test suite (a DSL if you will), and we could not remember the names of everything, so we wanted to organize and expose it. After installing the yard gem (and the redcloth gem), we were able to generate documentation with “yard server –reload”. This runs a web server that we can hit during development that reloads on every request.