Browse Developer
Filters
Code Approval Policies Explained
Professional teams that produce quality software and maintainable systems often employ a lightweight process to safeguard the introduction of new or updated code to their stable branches. A code approval policy is an agreement within a single team or an entire organization to follow a set of rules regarding how and when code is accepted […]
Why you should use Clojure for your next microservice
There are a few reasons teams choose to implement some piece of functionality as a microservice. To me the most important ones are: This post focuses on the third point above. Freedom in technology choice This is a very important property of a microservices oriented architecture. Microservices are meant to be small. How small is […]
Connecting Connect with Spring Boot
Since we wrote this blog post we’ve built a fully supported and more awesome version of a Spring Boot framework. This post is still interesting but describes an early version of a framework, which is no longer supported. Please see Atlassian Connect Spring Boot. To write an Atlassian Connect add-on in Java, the Connect quick […]
Building helpful CLI tools with Go and Kingpin
Building a well documented command line interface is hard. Allowing users to discover functionality and get help without typing –help or looking at the docs is difficult to do. How many times have you found yourself reaching for –help because you couldn’t quite remember the command name you needed? Here at Atlassian, my team maintains […]
Bumpversion is automation for semantic versioning
Semantic versioning (or just semver) is a specification for communicating about changes in code from one version to the next. It targets the problem of dependency hell. Dependency hell is where you are when version lock and/or version promiscuity prevent you from easily and safely moving your project forward. In short, semver specifies the first […]
Building command line tools with Node.js
I’ve written hundreds of Bash scripts over my career, but I still suck at Bash. I have to look up the syntax for simple logical structures every single time. If I want to do anything fancy with curl or sed, I have to go and look up man pages too. I spend hours brute forcing every possible combination […]
Codegeist 2015: Enhance the tools you use
We’re delighted to announce Atlassian’s 8th add-on hackathon. Do you have an idea to make JIRA, Confluence, HipChat, or Bitbucket even better? Build an add-on, launch it in the Atlassian Marketplace, and you could be the next winner of Codegeist. Whether you’re an experienced add-on developer or trying something new, now is the time to build your add-on […]
Codegeist 2015: Enhance the tools you use
We’re delighted to announce Atlassian’s 8th add-on hackathon. Do you have an idea to make JIRA, Confluence, HipChat, or Bitbucket even better? Build an add-on, launch it in the Atlassian Marketplace, and you could be the next winner of Codegeist. Whether you’re an experienced add-on developer or trying something new, now is the time to build your add-on […]
Smaller Java images with Alpine Linux
Sometimes I need to be hit in the head with an axe to find a solution to a problem that has been bugging me forever. A minimal Java container has been on my wish list since I found out about Docker and I’ve been writing about running Java in Docker for sometime already. Official Java images have historically […]
Collating repositories or grafting earlier history with Git
Let’s add another arrow to our already full quiver of version control tools and techniques. Do you know that the Linux kernel you clone normally contains only a part of its entire history? If you need access to its uninterrupted evolution since the first commit you have to “graft” a few separate repositories together chronologically. In this post I’d […]
Static Go binaries with Docker on OSX
Recently I’ve been writing a service in Go to enhance the projects dashboard on Bitbucket – if you haven’t heard we launched Atlassian Connect for Bitbucket as a way for anyone to build add-ons for three millions of Bitbucket users out there. Like many other Gophers I’ve been happily deploying my Go services using Docker. The process is smooth and […]
Learning Go with flashcards and spaced repetition
This year I have been choosing Go for all my coding projects. Go is brilliantly fast, simple to pick up, it has a powerful concurrency model based on message passing, and no forced – always on – object orientation. My impressions are similar to the ones many have previously articulated well – for example see “Go is unapologetically flawed…” […]
The power of Git subtree
Git subtree allows you to insert any repository as a sub-directory of another one. It is one of several ways Git projects can manage project dependencies. People with good memory will remember I wrote about the usage and the advantages of the command in an earlier piece on Git submodule alternatives. The basics of Git subtree Let’s review […]
‘–force considered harmful; understanding git’s –force-with-lease
Git’s push –force is destructive because it unconditionally overwrites the remote repository with whatever you have locally, possibly overwriting any changes that a team member has pushed in the meantime. However there is a better way; the option –force-with-lease can help when you do need to do a forced push but still ensure you don’t overwrite other’s work. It’s […]
Quick Tip: Getting Emacs and IntelliJ to play together
As I’ve mentioned before, I’m gradually working towards my grey-beard badge so for most of my programming I tend to use Emacs. However when I moved into the order-systems team I adopted IntelliJ IDEA, which is our weapon of choice for Java development at Atlassian. This is because while Emacs is a great text editor, IntelliJ takes a holistic and […]
