Thursday, August 1, 2013

Uberconf 2013



Taking Software Development to the Next Level by Alan Shalloway

The software industry as a whole has a technology gap between what we know as the right way to do things and the way we currently work. We would get major productivity gains if we would just use techniques like test driven development, behavior driven development, and continuous delivery.

We can leverage various "trim tabs" in our organizations to enact change without major campaigns. These changes are used to change the environment and organizational culture instead of just going straight to pushing for a technology change. Starting lunch and learns (brown bags) lets you cheaply spread new ideas and techniques to attendees. Having different groups (think dev/ops/qa/infosec) talk to each other or eat together helps them to better work together.

Finally follow the "pickup sticks" model. This seemed similar to going after low hanging fruit first, introduce the easiest to implement technical changes first. The more advanced changes usually build on the earlier foundational changes anyway and the large jump would create more push back then the gradual step by step introduction.

The Art of Simplicity by Venkat Subramaniam

Venkat's keynote reminded me of Rich Hickey's Simple Made Easy ( As developers we have to remember that complicated/clever code is much more difficult to read and debug. We want to write code that is easy to understand. The bad part is most of the time simplicity is hard to achieve.

Pure Fun by Stuart Halloway

Stu talked about how to have fun in real life and with computers. He spoke about Jane McGonigal and Reality is Broken. Dancing and singing are things you can do everyday to actually make yourself happier. Positive psychology is incredibly powerful and can make you more productive in everyday life (a TED talk - He also played with a quad copter drone.

The Sessions

There were lots of good sessions. I spent the first day learning a little more about designing REST APIs and how to utilize hypermedia in the RESTful responses. AngularJS looks very cool. I spent the final day learning more about Clojure and its simulant and generative testing frameworks.

Wednesday, January 9, 2013

Developer Resolutions 2013

Since it's the time of the year to create some resolutions. Also I would enjoy reading yours.

Learn a new language - Clojure

Functional programming looks like it will become more and more important, so I want to learn a functional language. I have dabbled with a little Clojure so I'll target it for learning well enough that I'd feel comfortable starting a work project with it.

Improve current skills - Grails, TDD, Estimating, Continuous Delivery

Everyone needs to improve. Specifically I plan to focus on coming to a deeper understanding of Grails 2, continue practicing test driven development (especially working with legacy code), finding more opportunities to estimate tasks on personal projects, and put together some posts and tutorials on continuous delivery.

I've been working with Grails lately and just want to dig into the details a little more and gain a better understanding of what's happening under the hood and the plugin ecosystem.

Test driven development still feels slow when trying to deal with existing code and in languages I'm less familiar with like javascript. But deliberate practice makes better so I'll make sure to do katas and examples to gain experience.

Coming up with accurate estimates is just hard, so more practice it is.

I believe continuous delivery and the build pipeline and surrounding practices lead to huge competitive advantages and generally superior work environments. So this year I hope to convert more projects to using the practices, get better at puppet/chef for setting up infrastructure, and get some practical experience creating automated acceptance tests.

Blog at least once a month

What better way to share knowledge with others, get better at writing, and create some social pressure to stick to the resolutions.

Present to local user groups at least twice

I presented a talk on continuous delivery to the local Java Users Group. I also enjoy presenting talks at work brown bags. So this year I plan to give at least 2 talks to local meetup groups.

Continue learning

Keep with the plan of reading books, blogs, and twitter feeds to keep up with new information, taking interesting classes on CourseraEdX, and Code School

Go to 3 conferences

I'm currently looking at UberConf, Strange Loop, and Clojure/conj.

Get healthier

Standard new years: eat better, exercise more, and work on meditating. So ask me regularly how I'm doing (I might even have graphs).

Sunday, June 3, 2012

NFJS Spring 2012

Another year another No Fluff Just Stuff event. This spring I spent a weekend getting my brain stuffed with ideas to share with colleagues. If you haven't attended one of the events you should seriously consider it

Keynote: How Our Buildings Shape Us by Tim Berglund

Using the metaphor of the forms established in music, architecture, and writing he spoke about how as developers we need to be aware of the various forms are software takes and how that influences how we create it. We need to branch out if all we've done is object-oriented. As programmers we need to understand our different forms: procedural, object-oriented, functional, and the various patterns we use for each.

Sessions Attended

NoSQL Smackdown

A general overview of various non relational databases out there. The major types are BigTable, document based, and graph. My big takeaway was the need to know all of the different kinds so you can make good decisions on which one or set to use when the scale of your problem causes you to need the extra complexity of the new data model.


It's based around BigTable. I need to try it out and blog about it.


Neo4j is a graph database. I need to try this one out as well.

JavaScript Libraries You Aren't Using Yet

This session was about microlibraries trying to get the size below 10k and be more focused than something like jQuery. backbone.js and spine.js looked interesting. jquip.js is a pared down jQuery.

ClojureScript Workshop

ClojureScript allows you to write Clojure which is then compiled into JavaScript. Clojure is on my list of things to learn, so I'll need to try this out to see if it improves on the ease of writing JavaScript for me.

Designing for Mobile

Developers need to consider the limitation of mobile devices. Smaller footprints for libraries become important. The lack of screen real estate forces you to work within constraints and focus on the most important parts of your application. There was also a reminder to consider that a finger is not as precise as a mouse so develop applications with the button size and whitespace in mind.

Mobile App Smackdown: Native vs Mobile Web

We discussed the different choices between taking the time to create 3 different native interfaces (iOS, Android, and web) vs using the mobile web with html5, jQuery mobile, and PhoneGap. The big problem with mobile web currently is the uncanny valley. They look almost like native but leave people feeling like the application is off somehow. My opinion is the best bet is to write native interfaces.

Mac Productivity Tips

Try to think of your computer as a product produced by code and script the setup of your home directory and tools. Learn the keyboard commands to navigate your computer, the mouse is slow. Make aliases and ruthlessly automate everything you can.

Domain Specific Languages

Thinking in Functional Style

RESTful Imaginarium

An overview of RESTlet, NetKernel, and Spring MVC and how to design RESTful web services.

Build Your Own Technology Radar

Based around This is a technique to focus your learning about languages, tools, techniques, and platforms. Neal Ford suggested update a personal one annually and a company wide radar twice a year.

Wednesday, November 9, 2011

NFJS Reston Write Up

I attended the Fall 2011 No Fluff Just Stuff stop in Reston, VA. I really enjoy attending these local conferences. Lots of learning crammed into 3 days and a chance to meet with other enthusiastic developers in the area. The conference also provides the added bonus of giving me at least a couple of new things to learn.

Keynote: The Rise and Fall of Empires: Lessons for Language Designers and Programmers by Venkat Subramaniam

Venkat spoke about what developers can learn by studying history. Empires fall eventually so be prepared by learning and understanding other languages (Java won't be forever: learn Scala, Ruby, Groovy, Objective-C, and/or Clojure). There is a pattern in history where revolutionaries become resistors. For languages this is like people who started in C++ and moved to Java and now resist changing to something else, or Java people who moved to Ruby and act elitist. Be willing to move on and at minimum learn from other languages. He suggested working through Seven Languages in Seven Weeks.

Game Theory for Software Developers

This talk focused on various game theory techniques from economics. You want to be very careful with incentives and metrics so you don't drive the wrong behavior. You want to instill intrinsic motivation rather than extrinsic. Examples offering $50 per resume referred may lead to getting lots of bad candidates or mandating 100% test coverage could get test code with no asserts. There were other interesting stories based on the prisoner's dilemma, Akerlof's "Market for Lemons" as applied to hiring, and the grim trigger as applied to projects with known end dates. Lots of internet searches could come out of this.


Main suggestion from both talks was use the right kind of database for your data model and profile. Possibly use multiple kinds of databases for your project.

CouchDB: Document based datastore that sacrifices immediate consistency for high availability and ability to partition. Good use case looks to be as a store for data used in a massively parallel map reduce type problem.
Neo4J: Graph based datastore has all of the ACID properties of a relational database. Excellent for graph based problems like social networks. Sharding poses a problem as that is an unsolved issue in graph theory. According to the speaker, sharding is not needed unless your graph database has billions of nodes.

Testing with Spock

Spock gives a specification driven bent to automated testing on the JVM. It provides the given, when, then constructs to your tests. It is possible to do the same things in JUnit so my recommendation would be to try out both and pick the one that works best for you. I can see using both in my applications depending on what I'm trying to test/do at the moment. I don't think spock would work as acceptance tests that can also double as requirement documentation for the customer, that's a space for cucumber or easyb.

Functional Thinking

Writing code in a language with functional abilities like Scala or Clojure requires a mental paradigm shift. The speaker showed a program to find perfect numbers in well tested object oriented java, and then showed the differences in thinking needed to make it functional. The end result was the same problem solved using functional java, groovy, scala, and clojure. So even if you don't want to try a new language, try to solve a problem without using mutable state.


The session was hands on coding. Bumped learning Scala higher up on my queue. Scala is statically typed, lets you drop a lot of the cruft that you need in Java, combines functional and object-oriented properties, and looks to be developing a good community.

Testing Javascript

The summary is you can and should unit test your javascript. We did some live coding using js-test-driver to run tests. In my opinion the best self check of the conference came during this talk: my paraphrasing "If you've ever thought, this code I wrote is too hard to test, it means you have designed/written some poor code."

Continuous Delivery

Read Continuous Delivery. Continuous delivery is about reducing the amount of time between having an idea for a feature or discovering a bug and getting the update into production. This is accomplished by automating as many parts of the delivery pipeline as possible. This pipeline includes continuous integration with automated acceptance tests, the ability to automatically setup infrastructure, and capability to automatically or on demand deploy to a testing or production environment.

I'm putting together a brown bag and blog series on this topic. Updates will go out as pieces are finished.

Enterprise Security API w/ OWASP

A library to help solve some of the most common security flaws in applications.

Hacking Your Brain for Fun and Profit

This is a list of ideas from the talk:

  • studies show that missing a night of sleep makes you 30% less efficient and if you need 8 hours of sleep and regularly only get 6 its like missing 2 nights of sleep
  • if you're stuck on a problem play with a cube toy, talk to someone, sleep on it, take a run
  • rare things are hard to notice, have beginner's eyes for a problem
  • keep an external brain - record ideas on a computer or in a notebook
  • exercise releases chemicals that make your brain work more efficiently
  • you can't really multitask, distractions break flow
  • Dreyfus model for skill acquisition
  • Be aware of cognitive biases
  • Dunning-Kruger effect: Incompetent people overestimate their abilities, competent people underestimate their abilities
  • Free is powerful/losses hurt more than gains: Situation you have the option of a $10 gift card for free or a $20 gift card for $7. Most people take the free card.

Reading List

In no particular order:

  • Continuous Delivery by Jez Humble and David Farley
  • Seven Languages in Seven Weeks by Bruce Tate
  • Programming Scala by Venkat Subramaniam
  • Pragmatic Thinking and Learning by Andy Hunt
  • Where Good Ideas Come From by Steven Johnson
  • The Master Switch by Tim Wu

And remember to do something today to make yourself better than yesterday.

Sunday, February 22, 2009


After reading various books and blogs (The Pragmatic Programmer, Fred George), I've come to the conclusion that I'm still an apprentice in my journey through the craft of software development. This blog is going to touch on my thoughts as I try to progress and be a less crappy software developer. I'll be talking about any of my personal projects that are interesting, blogs and books that I'm reading, and just random thoughts on various practices I'm trying.  Hopefully others will find this useful in their own journey as a software developer.