Agile Software Development With Netengine

How we work

We like to be flexible in the way we engage with each client, being accommodating of their individual needs. We’ve found different strengths and weaknesses in a number of project management and development methodology variations, and can help you in selecting a process that will fit the priorities of your project.

Whichever agile variant makes the most sense for your project, we are certain of the following -

  • We will never spend your money building something you don’t need. When a previously agreed task no longer makes sense, we’ll remove it.
  • We will meet you regularly to discuss progress and plan for the upcoming weeks of development. We recommend fortnightly.
  • We will make our project management tools open to you, for visibility and comment. We currently use Trigger.
  • We believe in reducing the cycle of feedback to eliminate waste. When appropriate, we encourage bringing one of your resources in-house to NetEngine, where they may engage in feature planning and provide immediate feedback on new ideas.
  • Between meetings, we answer our phones, and respond to your emails.

We take pride in the quality of our software.

Over the lifespan of a successful piece of software, it will be required to change. Our highest measure of quality is the ability of your product to react to these changes in a painless way.

As stakeholders gain an understanding of new requirements, the consequent changes can be met with resistance that comes from many places. Left unchecked, this resistance to change will cripple your application over its lifespan, and with it, your business.

Resistance to change as a result of the software itself.

There are many ways to solve a given problem in software development. In nearly every situation, the optimal solution is one which is least complicated to understand by humans. There are many “patterns” and “laws” about good object-oriented design. We study them. We argue about them. We practice them.

  • The goal of any given piece of code is not to simply “work”.
  • It must send a very clear message about its intention to the next developer to read it.
  • If it’s big, it should be broken into smaller, understandable, reusable pieces.

Code comments are a common example. They have no place in quality code. They exist only as an indication that code needs to be broken into smaller pieces, with more meaningful names. Any other motivations for code-comments are addressed by our testing style - executable specifications with english descriptions and contexts.

This sounds simple, but it is of course a continuous spectrum of complexity, and your application is effectively the output of thousands of tiny but significant decisions. When a new feature is written and it’s clear that one big “thing” should be two smaller “things”, developers require the confidence to make changes, knowing that nothing will break elsewhere in the application. This confidence comes from tests - an absolutely non-negotiable part of the way we operate.

Resistance to change as a result of the “processes” we put in place.

When you have an idea for a new feature, we don’t start a conversation about “scope”. We don’t put development tasks in time-sandboxes with “sprints” or “deadlines” - these are words that usually accompany excuses about why some task cannot be given priority. We work on exactly whichever task is currently most important to you, and nothing else. To track development tasks, we use Trigger. Higher priority tasks go at the top, and we work on them in order.

Trigger project tasks
Trigger example screen shot - client will have access

We practice continuous deployment

  • We deliver working software in tiny increments, as soon as they’re available.
  • Decisions can be made sooner, when the latest development efforts are always visible.
  • The small size of each increment reduces the risk of individual deploys.
  • Rollbacks, if required, become small.
  • Bugs have nowhere to hide. A new bug came from the only incremental change since the last deploy.
We deploy freely, unceremoniously, multiple times per day.

Continuous integration runs our automated test suite

  • If we’re to deploy freely, the application must always be READY to deploy.
  • Code is ready to deploy when the test suite is green.
  • The test suite is run by an automated service every time code is pushed.
  • A green test suite is deployed without intervention to the staging environment.

Our tools

We firmly believe in using the right tool for the job, and this attitude has seen us collect (and discard) some exciting toys over the years. This is a small collection of our favourites.

We know when to use them, and when not to.

At the project level

Ruby (Programming language)

Ruby is elegant and powerful. There’s a wealth of information online that will compare and contrast Ruby (and Rails) against Python (and Django), or Javascript (and Node.js). These are all excellent choices, and we encourage you to read into the discussions further.

Unsurprisingly, in our opinion, Ruby (and Rails) is the best way to build web applications. Your project will go further, faster. The ruby community has an extreme focus on around best practices, testing and object oriented design, constantly evolving and pushing the state of the art forward.

If you don’t already know Ruby, we’d like to invite you to try it out. Then..

Rails (Web framework)

Ruby on Rails is an open-source web application framework for the Ruby programming language. The growing demand for Ruby on Rails has been driven by successful companies who benefit from the speed and agility of building applications in Rails, which results in increased productivity and company growth. Many of the companies you all know and love use Ruby in some capacity: Amazon, BBC, Cisco, CNET, IBM, JP Morgan, NASA, and Yahoo!. Many of the fastest-growing web-based companies have been built using Ruby on Rails: Scribd (over 70 million readers each month), Groupon (over 38.5 million subscribers in North America), Basecamp (millions of users). All in all, more than 200,000 web sites are using Ruby on Rails.

RSpec + Capybara (Test frameworks)

RSpec is a Behaviour-Driven Development tool for Ruby programmers. BDD is an approach to software development that combines Test-Driven Development, Domain Driven Design, and Acceptance Test-Driven Planning. RSpec helps you do the TDD part of that equation, focusing on the documentation and design aspects of TDD.

Git (version control)

Git is a free and open source distributed version control system designed to handle everything from small to very large projects with speed and efficiency.

Git is easy to learn and has a tiny footprint with lightning fast performance. It outclasses SCM tools like Subversion, CVS, Perforce, and ClearCase with features like cheap local branching, convenient staging areas, and multiple workflows.

Should someone suggest anything else, run. http://try.github.com/

Github (source code hosting)

Build software better, together.

Powerful collaboration, review, and code management for open source and private development projects.

Braintree (payment gateway)

An online payment gateway is software that allows you to process credit card payments from your website and/or application. Our payment gateway is used by many of the fastest growing and most respected businesses in the world.

Mixpanel (analytics)

Actions speak louder than page views. The most advanced analytics platform ever for mobile and the web. Tracks application actions, and people.

Amazon Web Services

Amazon Web Services offers a complete set of infrastructure and application services that enable you to run virtually everything in the cloud: from enterprise applications and big data projects to social games and mobile apps.

One of the key benefits of cloud computing is the opportunity to replace up-front capital infrastructure expenses with low variable costs that scale with your business.

We are a standard consulting partner, and work closely with their Australian team.

Trigger

Don't ask how projects are going. Watch how they're going in real-time. All development tasks will be tracked here.

New Relic

Complete visibility with application monitoring. View the health and availability of your production app so you can be sure it’s tuned, optimized and running at peak performance – see where your app can be fixed right down to the line of code.

Bugsnag

Real-time bug intelligence. Bugsnag captures errors from your web and mobile applications, helping you to understand and resolve them as fast as possible.

Mandrill

Mandrill is a new way for apps to send transactional email. It runs on the delivery infrastructure that powers MailChimp.Postmark serves the same purpose, and we’re comfortable going forward with either.

Pusher

Pusher is a hosted API for quickly, easily and securely adding scalable realtime functionality to web and mobile apps.

At the system level

Linux (Server operating system)

Anything else is madness.

http://www.oracle.com/au/technologies/linux/overview/index.html or

http://www.ubuntu.com/

PostgreSQL (Database)

Our relational database of choice. A case could be made for MySQL under very specific circumstances (you need Amazon RDS, for example), but in almost all cases, we believe PostgreSQL to be the superior choice.

MongoDB (Database)

Our document database of choice. MongoDB (from "humongous") is a scalable, high-performance, open source NoSQL database.

Redis (Key-value store)

Redis is an open source, advanced key-value store. It is often referred to as a data structure server since keys can contain strings, hashes, lists, sets and sorted sets. Redis acts as a store for our background jobs, and other temporary stores for your application. It’s very fast, and very useful.

Monit (watchdog)

Monit is a free open source utility for managing and monitoring, processes, programs, files, directories and filesystems on a UNIX system. Monit conducts automatic maintenance and repair and can execute meaningful causal actions in error situations.

Nginx (web server)

Nginx (pronounced engine-x) is a free, open-source, high-performance HTTP server and reverse proxy, as well as an IMAP/POP3 proxy server.

Unicorn (application server)

Unicorn is an HTTP server for Rack applications designed to only serve fast clients on low-latency, high-bandwidth connections and take advantage of features in Unix/Unix-like kernels. Slow clients should only be served by placing a reverse proxy capable of fully buffering both the the request and response in between Unicorn and slow clients.

Whenever (job scheduler)

Whenever is a Ruby gem that provides a clear syntax for writing and deploying cron jobs.

Backup (performs database and asset backups)

Backup is a RubyGem, written for UNIX-like operating systems, that allows you to easily perform backup operations on both your remote, as well as your local environment.

Bundler (dependency management)

Bundler maintains a consistent environment for ruby applications. It tracks an application's code and the rubygems it needs to run, so that an application will always have the exact gems (and versions) that it needs to run.

At the application level

One of the biggest efficiency-gains to developing applications in Ruby is the vibrant community, sharing best-practices, and sharing open source tools.

There’s a wheel out there for everything, and we have no intention of re-inventing any of them.

Provided here is a list of the top-level ruby dependencies from our most recent two projects. Many relate purely to development or test environments, but they all help us do things better and faster.

You can learn more about them, and others, at The Ruby Toolbox (https://www.ruby-toolbox.com/), or by searching for them on Github.

Ruby

  • active_model_serializers

    • JSON serialization for APIs.
  • awesome_print

  • bugsnag

  • cancan

    • Authorization done well
    • who can see this? who can change it?

  • capistrano

    • Industry standard deployment tool.

  • capybara

    • Acceptance test framework for web applications

  • carmen-rails

  • coffee-rails

    • CoffeeScript is a little language that compiles into JavaScript
    • The modern, more human readable javascript syntax.

  • colorize

  • compass-rails

    • An open-source CSS Authoring Framework

  • database_cleaner

  • debugger

  • devise

    • Flexible authentication solution

  • factory_girl_rails

  • faker

  • fakeredis

  • geocoder

    • Complete Ruby geocoding solution
    • [latitude, longitude] to/from street or IP address

  • grit

  • guard-rspec

  • haml-rails

    • Markup should be beautiful
    • html5shiv-rails

  • jquery-rails

    • The write less, do more JavaScript library
  • launchy

  • mongoid

    • Object-Document-Mapper (ODM) for MongoDB

  • mongoid-rspec

  • newrelic_rpm

  • pry

  • pry-rescue

  • rails

  • rb-fsevent

  • redis-rails

  • rspec-rails

  • sass-rails

    • Sass makes CSS fun again

  • sextant

  • sidekiq

    • Highly efficient background worker

  • simplecov

    • SimpleCov is a code coverage analysis tool for Ruby 1.9

  • state_machine

    • State machines make it dead-simple to manage the behavior of a class

  • strong_parameters

    • mass assignment protection, ready for rails 4.0

  • uglifier

Javascript

  • Backbone
    • Backbone.js gives structure to web applications by providing models with key-value binding and custom events, collections with a rich API of enumerable functions, views with declarative event handling, and connects it all to your existing API over a RESTful JSON interface.

  • D3.js
    • D3.js is a JavaScript library for manipulating documents based on data. D3 helps you bring data to life using HTML, SVG and CSS. D3’s emphasis on web standards gives you the full capabilities of modern browsers without tying yourself to a proprietary framework, combining powerful visualization components and a data-driven approach to DOM manipulation.

  • Morris.js
    • Making good-looking graphs shouldn't be hard. Morris.js is a lightweight library that uses jQuery and Raphaël to make drawing simple charts easy.

  • Raphaël.js
    • Raphaël is a small JavaScript library that should simplify your work with vector graphics on the web. If you want to create your own specific chart or image crop and rotate widget, for example, you can achieve it simply and easily with this library.