When plans fail repeatedly there are often better bets to make.
Written by @sghill, who works on build, automated change, and continuous integration systems.
By designing development workflows for the work, we can make the output high-quality by default.
The story of Jenkins Plugin Skew. Observe reliably to make consistent progress with big problems.
Deciding against work that aligns with your values is difficult, but blindly saying yes is worse.
Using a git repository's clone uri as a unique identifier can be painful. Try a repository key instead to deal with these common data duplication issues.
We can configure IntelliJ to stop recommending classes we never intend to use.
We can fail the build when unwanted classes (e.g., java.util.Date) are imported through Gradle's built-in checkstyle plugin.
We can fail the build when unwanted packages (e.g., junit.framework) are imported through Gradle's built-in checkstyle plugin.
I picked up PowerShell on my last project and found it could accomplish a lot more than I realized. This small guide covers some of the functions I came to find really useful while working with PowerShell, from the perspective of someone who has grown to rely more and more on the shell (usually bash) over time.
A simple module for serialization can make life a lot easier. When the server and client share the same serialization objects, it eliminates the chance of them getting out sync. I followed this pattern, modeled after the dropwizard recommendation, in my last project and it saved us many headaches.
Plain old Java objects dedicated to serialization help make life easy. This article looks at Jackson's built-in POJO serialization and how to create classes that define a serialization structure without specific library annotations.
The graphic novel about project management and risk that can either be great reinforcement or eye-opening. The book walks through an engaging example, focusing on deferring commitment by creating real options.
Searching through a huge stack of text files for a particular string can take forever with some of the standard Windows search tools. Reach for PowerShell's Select-String to quickly find patterns inside files.
This simple-but-common problem is a perfect candidate for combining PowerShell's Get-ChildItem with Remove-Item, leaving our directory nice and clean.
It's a lot easier to deploy your Java application cross-platform if you consider a few small details like file paths first.
Every clean build on my build server was failing with the message `The "CreateRiaClientFilesTask" task failed unexpectedly`. Usually when a second build ran without a clean, it would pass. Eventually I discovered group policy was forcing a virus scanner to run in the .NET compilation directories, which locked files mid-compilation. This article covers how I solved the mystery.
Sometimes `diff` is the perfect tool for the job. If you're on Windows and cygwin isn't an option, this article shows how PowerShell has your back with `Compare-Object` and `Get-Content`.
PowerShell 3+ brings a really good `curl`-like tool: `Invoke-WebRequest`. This article covers very basic usage and how to get help.
Contributing to open source projects is often hit or miss. This article is about the great experience I had helping out with `gini/puppet-gradle`.
A simple tip to keep in mind while refactoring any code: If you don't need it right now, delete it. Source control is there for referencing old information. Here's my real world example of this in action.
A quick and painless introduction to setting up a gradle project with dependencies in IntelliJ IDEA.
GiftIdea! is an Android app for taking the stress out of giving on birthdays and holidays. It’s available on Google Play in over 10…
Excited about releasing my first app to Google Play, I captured some thoughts from looking at other app screenshots in the store.
This article covers getting up and running with android-maven-plugin. The material is a little dated now that most of the android community has moved on to the official gradle plugin, but the underlying theme of saving time by having a build for your mobile apps still rings true.
After practicing TDD in industry for a few years, I was invited to be a guest lecturer with a coworker at a nearby university. After an intriguing and dismissive comment from the crowd, we had a great discussion about the benefits of TDD.
I wrote about a workaround for a minor issue with GVM a couple weeks back. This article covers how easy it is to contribute to GVM and how that workaround is no longer necessary. Hooray!
I spotted an issue with using milestone versions of grails through GVM and documented the workaround I used. The issue has since been fixed!
Pairing is one of those topics that will always spur debates. I've done a lot of pairing, and I think the clients I've worked for have received great benefit from it. As the original article states, it is harder to be creative and sometimes leaves me tired, but I still think it's a worthwhile pursuit.
The format Jenkins expects for its plugin manager api isn't very easy to find. This article covers a working xml format for installing plugins.
It's a good idea to backup Jenkins periodically. Many plugins exist with different ideas of how to back up Jenkins configuration. The approach covered in this article shows how to create backups with the Jenkins API and my CI-friendly tool grunt-jenkins.
Lessons learned from a migration to gradle that explicitly defined every single dependency, transitive or not, and how we got to transitive dependencies.
My first open data project — a mashup of maps and yelp reviews for Toronto's dog parks. Along the way I encountered more data issues than I would have expected and no real place to report them. Still, open data feels like a giant step forward.
Timezone bugs creep up from time to time. Understanding where timezone bugs will occur is key to preventing them. To get a quick idea of if you have timezone issues, consider running your automated tests in another timezone.
I attended my first Mozilla Dev Derby and had a great time! We learned about multitouch in HTML5 and I put together a memory game playable from a mobile web browser.
With a simple Python web server, it's easy to develop HTML5 apps locally. With GitHub Pages, it's easy to host HTML5 apps. This article covers my experience with both at a Mozilla Dev Derby.
This greasemonkey script will let you paste gradle-formatted dependencies directly into http://search.maven.org. Hooray!
After going over well on a project, I tried coin my very own rule. We'll see how well it's doing in another few decades.
Sometimes `ant` builds run out of memory right in the middle of a task. This article walks through setting up the `ANT_OPTS` environment variable.
Getting started with Jackson in Java could be more straightfoward. This article shows one way to serialize a class with a custom serializer.
When choosing how to break the build in your CI-friendly team, make sure to consider all the possible workarounds and how much they may hurt your overall efforts towards quality. After working on several teams, I've decided I'm firmly on the side of tracking metrics, but not breaking builds because of them.
Some of the worst moments build the best teams. This article covers my experience with missing the same problem in development, qa, and all the way through to a production deployment. In one of my proudest moments to date, our team rallied to solve our huge problem quickly and calmly.
A [now outdated] walkthrough of setting up IntelliJ on OS X, which I found to be a bit overwhelming when I was new to Mac, Java and the IDE.
A super detailed look at the how to DRY up some views in Rails. Walks through the actual code of ExpenseLynx, an open source expense system I built for my last course at Loyola University Chicago.
After pairing with an experienced coworker for a few minutes, I had some great new ideas for how to improve my rails app: ExpenseLynx. This article is an in-depth walkthrough of pushing controller logic down into the model layer.
After importing a mercurial repository into git with full history, I noticed the repo had swelled by 2400%. Repacking with git solved that problem easily.
A few years ago I took a project from mercurial to git in order to put it on github. This article highlights how I solved the biggest problem I ran into along the way.
Back when Rails 3 was new, a unit test helped me uncover just what was wrong with my case-insensitive validation code.
A string-heavy design leads to trouble in the test data when later trying to move to a type-safe design. The story of how my test data invented a month and cost a pair some investigation time later on.
The first development blog post! A small lesson worth reinforcing: if it takes more than a few minutes to understand, it's not good code.