• Format XML Files

    Today I found myself looking through hundreds of unformatted XML files. I did some googling and found the following script that makes use of xmllint to format all the files and save copies of them to a ‘formatted’ folder.

    find . -maxdepth 1 -type f -iname "*.xml" -exec xmllint --format '{}' --output formatted/'{}' \;
    

    Worked like a charm (on Mac OS).

  • TXJS 2015

    I had the privilege of attending the Texas Javascript 2015 conference this past week. It had a stellar line up and I’d recommend watching the recorded live stream if you weren’t able to attend.

    The following were the highlights for me:

    Cold War Simulation by Simon Swain

    Simon had both an incredible slide deck and demo. He highlighted some impressive things that can be done with using Canvas. I rarely have an opportunity to use Canvas but his presentation makes me want to take a new, lengthy look at it.

    Client Side Security by Yan Zhu

    This presentation sent chills down my spine. Yan demonstrated some terrifyingly simple security holes that I wasn’t not aware of. But, she also showed some great new additions to browsers that will give developers tools to plug these holes and make the web a safer place.

    Select Box Usability by Alice Bartlett

    I really enjoyed this presentation. Alice explained the significant usability problems with select boxes. She played some videos of people struggling to figure out how to do the most basic tasks simply because of the select box control. It was a real eye opener and highlights that as developers we can’t take for granted our tech savviness and need to analyze every element we add to a site.

    Service Workers by Jake Archibald

    The hilarious Jake Archibald walked us through using Service Workers to build more performant and offline sites. He had a very interesting demo for using Service Workers to help users with spotty connection. I can see a lot of potential Service Workers in the future to load assets in the background and speed up page load time. I’m very excited to try them out!

    There were many more interesting lectures so I’d definitely recommend watching the live stream. But, if you don’t have time to watch the live stream, then at least take a look at G. Scott Olson sketchnotes for the conference.

  • Developers Are in the UX Business

    UX is often thought of as the visual design of software. Though it’s an important part of crafting a great user experience, there is much more that must be considered.

    A great experience for users requires focus on many parts of the software: visual design, reliability, ease of use, and performance, to name a few.

    I’ve often heard programmers say “not my problem” with anything concerning UX. But it’s my opinion that programmers are just as critical in shaping the user experience as any designer, perhaps even more so. Programmers are the ones in the trenches, constructing the user experience and must be on guard at all times for problems.

    If routes fail, performance is horrible, or features are buggy, then the user experience suffers, often horribly. Just ask yourself what your most common complaints about software are. For me it is slow loading pages and mobile pages that don’t behave. These are problems that programmers need to be aware of and work to fix.

    Steve Jobs once said of design:

    Most people make the mistake of thinking design is what it looks like. People think it’s this veneer – that the designers are handed this box and told, ‘Make it look good!’ That’s not what we think design is. It’s not just what it looks like and feels like. Design is how it works.

    We’re in the UX business. We can’t forget that “how it works” part is a big part of that.

  • Code Review Hygiene

    I’ve grown to really appreciate code reviews. Like testing, code reviews allow you to catch bugs and improve code quality. But they also help teams find better, alternative options, and transfer knowledge between team members.

    What follows is a list of non-technical practices to keep in mind for conducting effective code reviews. Some of these I want to start doing, some I already do, some I do but do poorly.

    1. Agree to a standard for reviews with the rest of the team. This is critical. If everyone on the team has different standards then reviews will be tough. A style guide and best practices document that the team creates is a huge help here.
    2. Remember, you are not your code. It is so easy to take criticism personally but do you best to avoid this. Everyone, no matter the skill level, has areas to improve on. Accept that and thankful that you have a team that can teach you things.
    3. Be kind. Don’t let the lack of face-to-face communication cause you to be harsh. It’s easy to fire out “you’re wrong” in a review and be harsher that you would face-to-face. But that is a great way to make someone defensive and not be receptive to criticism.
    4. Look for things people are doing right. Pointing out new an interesting things in a review is good way to encourage learning and build relationships.
    5. Be pragmatic and keep code moving. Sometimes people have differing opinions and no amount of discussion is going to change that. In that case, defer to a third party or take a vote as a team. Don’t let reviews get stuck in the mud.
    6. Give reasoning. Saying “change this” without a reason is not helpful and won’t prevent similar mistakes in the future. This also helps to keep reviews objective. It is too easy to let your personal preference come out in a review as the “right way”. 
    7. Ask questions. I learn a lot through code reviews. Especially when we start using a new library or tool. If you aren’t understanding, ask the team to explain!
    8. Have a good attitude and assume good intent. Remember, you are all on the same team and are trying to create high quality software. Developers aren’t trying to come up with bad solutions. They may just not be aware of a better way.

    If you aren’t conducting reviews yet I highly recommend it. Both Bitbucket and and Github make it incredibly easy. Any any slight slow down you might experience by always doing reviews will be more than made up for in much higher quality code and team members that are far more aware of the what is going on in different areas of the stack.

  • Programming Language Hitlist

    I’m frequently finding new and interesting programming languages I want to learn. I’ve really enjoyed working in Javascript the last few years and find the incredible pace of change in the web world exciting. But, there are some different and fascinating ideas in other languages that web developers generally don’t get exposed to or only get small glimpses of.

    So with that in mind, here are languages that I would love to learn and, in some cases, have already started doing so.

    Clojure / ClojureScript

    Oh Lisp, how wonderful and terrifying! Odd syntax, macros, immutable data. So many unfamiliar concepts on one hand but extremely elegant on the other.

    Clojure, being in the Lisp family, has all those features and runs on the JVM. In particular, I’m currently playing with Clojurescript, which compiles to Javascript.

    My experience thus far has been both fun and frustrating. In Javascript I’ve started writing more functional code and have been using Immutable.js for immutable data structures, so those aren’t that new. I think the syntax is mostly what is holding me back right now. I’m used to object.method and a C-like syntax. But in Clojure I frequently know roughly what I code I want to write but don’t know exactly the syntax/functions to get there. I see things like -> and # and am totally lost. But I’m getting there and it’s exciting.

    One of the coolest parts of Clojurescript is it’s libraries. Om, a React wrapper, demonstrates incredible render efficiency and a model that is simple to understand. In a React-based application I’m currently working on, I’ve been doing something that is similar to what Om does (re-render from the root). I’m using the Flux architecture to accomplish that and while there is a fair amount of boilerplate code involved, there has been a nice simplicity around the code that is easy to understand.

    core.async is another interesting library. I have barely read about it so I’m still very much trying to grok it. But, it seems the basic premise is that rather than have callbacks or promises you have channels. Channels are completely new for me but from reading it seems that they allow you to write you code as if it’s synchronous which simplifies things greatly. This sounds somewhat like the the upcoming async and await in ES7. Again, I have not yet used it and only done some quick reading on this so take it all with a grain of salt (and let me know if I’m wrong because I really want to understand)!

    Rust

    My entire career has been working with high level languages. Javascript, Perl, Ruby, ColdFusion (yes, you read that right) just to name a few. I did some C in college and enjoyed it someone but never really studied hard to understand manual memory management. And quite frankly it just didn’t interest me.

    Now, after being a programmer for many years, lower level languages are more intriguing. After struggling with performance issues and endlessly tweaking code to garbage collect at optimal times and tweaking the JVM, being able to drop down to a lower level is appealing.

    Rust is interesting is that it gives you that low level control if you want it but doesn’t force it on you. In my very very limited experience with Rust, it felt similar to other languages I’ve used, which is great. It’s statically typed but has type inference.

    Rust has an unique idea of “ownership”. From what I understand, variables have an “owner”. Only that owner can ready/modify it. This allows you to guarantee that the variable isn’t modified as you’re trying to do something with it. In Javascript, you can pass objects around and anything can modify it at any time. So you start using Immutable objects or simply copying objects before passing them along. This idea of ownership would seem to simplify things.

    I’m super excited to use Rust with the Tessel 2, coming out this August. The Tessel is similar to Rasberry Pi or Arduino but has a Rust and Node API. It seems like a fun project to play with Rust on.

    Elixir

    Elixir is interesting. It runs on the Erlang VM and has a Ruby inspired syntax. It has pattern matching like Scala, which would seem to eliminate the need to if/else statements. Since it runs on the Erlang VM, Elixir has lightweight threads. My understanding is that you could have hundreds of thousands of threads running at any given time which is crazy to me. My limited experience with threading has been somewhat painful. Managing the state shared between threads was awkward and I never felt comfortable with it. It would seem that Elixir makes threading very easy.

    I never got heavily into Ruby but always liked the syntax of the language and the community around it. Elixir has a very similar syntax to Ruby and it appears that some in the community are gravitating towards Elixir now. My hunch is that this may be the next “big hit” in the programming language world, at least for Ruby developers.

    It’s interesting to see functional languages like Elixir becoming more and more common. While they may not be the norm, I get the feeling that the software industry is sort of “growing up” and looking more and more to functional languages as they have some incredibly powerful (and sometimes very confusing) concepts that can alleviate pain points felts in imperative/object oriented languages.

    Elm

    I know nearly nothing about Elm. It only recently appeared on my radar as a language built specifically for the web. And it has a syntax similar to Haskell. Apparently it compiles to HTML, CSS, and Javascript which blows my mind. In a world where compile to JS languages are common, having something compile to HTML and CSS as well, from the same source language, is something new and exciting.

    These are what’s on my radar for the time being. I’ve played with all except for Elm but hope to rectify that soon. My hope from trying new languages such as these really is to expand my mind and learn about concepts I’ve not seen before.

    I’d encourage everyone to do some research on different languages and try something new out. You have nothing to lose!

  • Résumé

    Lead Software Engineer

    Nextgen Healthcare (July 2014 - Present)

    After a year of working on the Clinical Documentation team I was promoted to Lead Engineer. I have since been coordinating efforts between developers, working with product owners, analysts, and QA engineers in addition to functioning as a tech lead, architect, manager, and Scrum Master.

    I’ve worked to set coding standards which have now been adopted by all developers in the project, scheduled lunch and learns on both technical and healthcare related topics, established code review standards, and designed and prototyped our new React/Flux based front end architecture. I’ve also lead the team to build a Node.js back end that utilizes event sourcing/CQRS and will be used for all clinical documentation functionality.

    Sr. Software Engineer

    NextGen Healthcare (June 2013 – July 2014)

    I worked on the Clinical Documentation team to build the features that enabled doctors and nurses to document clinical information on a patient’s chart. I did both Node.js and Angular JS development. I lead and architected the front end development of a form engine to enable hospitals to build and customize forms. Built a document management solution for the scanning and storing of patient documents. Promoted to team lead after a year on the team.

    Software Engineer

    InVisionApp Inc (May 2012 – February 2013)

    Worked on a distributed team to develop an application used by tens of thousands of people. Developed key components of the application independently using AngularJS and ColdFusion. Was responsible for implementing and testing developed components. Also interacted with customers to fix bugs as they were found.

    Application Analyst

    The Kroger Co (July 2007 – May 2012)

    The primary programmer for ColdFusion development in the division. Along with rest of the team, responsible for development and maintenance of approximately 40 applications. In addition to ColdFusion development, I was responsible for maintaining the web and database servers.

    I led the ColdFusion group to begin using Object Oriented and MVC development techniques for enhanced software quality and maintenance and trained the group accordingly. Also began introducing several development tools such as version control to facilitate our software development.

    Web Designer

    Sodium Halogen (February 2007 – June 2007)

    Designed and developed web sites to meet the needs of our clients. Used Wordpress to create a fully functional CMS for clients.

    IT Administrator

    Steele Martin & Associates (December 2005 – May 2007)

    Responsible for maintaining the Windows 2003 based network of the CPA firm, the PC’s connected to it, and installing and troubleshooting any hardware or software issues.

    Web Design Assistant

    Union University (January 2006 – December 2006)

    Worked in the Office of University Communications, assisting the lead web developer in various projects. Developed and overhauled portions of the university website using Adobe’s ColdFusion MX7 and worked on various other web-based and non web-based projects. Also worked on projects not associated with the school such as the new United Way of West Tennessee website.

  • My (Mostly) Digital Toolbox

    Over the years I’ve established a standard set of apps and tools I always have available. Here is a list of what I use and happily recommend.

    Software Development

    • Vim

    I’m a proud Vim addict. I’ve been using it for several years. My .vimrc file has several hundred lines of config and includes numerous plugins.

    Every once in a while I try out a new editor but every time I come back. Vim is just too ingrained in my muscle memory.

    Right now I’m using Macvim but I’m keeping an eye on Neovim. An active community has risen around it and they seem to be determined to modernize many areas of the Vim sourcecode as well as adding many long standing feature requests.

    • Tmux

    I’ve had a love/hate relationship with Tmux. My first few tries at using it went poorly, mostly around Vim keybindings getting screwed up and weird copy/paste support.

    In the last couple months though I’ve tried it once again and am really digging it. This time it feels different. The way copy & paste works has finally “clicked” and I’ve found a few settings and plugins that make it much more pleasant to use (e.g. Vim Tmux Navigator and Tmux Plugin Manager.

    • iTerm

    My terminal of choice for years. It has a few nice things like split panes and color themes. I’ve used it so long I’ve nearly forgotten why I switched to it in the first place.

    • Homebrew

    Indispensable. One of the first couple things I install on a new Mac. I can’t live without it these days. It is almost always the first place I look when I want to install a new utility.

    Organization

    • Evernote

    My love for Evernote has waned in recent years as new features are added I don’t care much about and weird bugs and crashes. I’d love to see a really beautiful, minimalist interface that has beautiful typography and simple file support. Maybe one day. That said, it is still a great place to store files and notes and have it accessible anywhere.

    • Google Docs

    Who needs Microsoft Office anymore when you have this? Plus the multi editor support is fantastic. I regularly have my entire team all typing in a single document/spreadsheet.

    • Google Hangouts

    I use this every day. At my office I began to rely on this so much that I disconnected my physical desk phone. Google Hangouts is better in nearly every way.

    • Omnifocus

    The 800lb gorilla of task managers. I honestly don’t know how I managed to keep track of everything before this. While pricey, if you’re going to use it I’d absolutely recommend it. I’ve tried dozens of task managers and this is the best.

    • BusyCal

    Both Outlook and Apple Calendar are terrible. I’d use the Google Calendar interface if I could but unfortunately I’m stuck with Exchange. So that leaves BusyCal. It handles Exchange and Google Calendar very very well. It may not have the beautiful interface of Fantastical 2 but it’s reliable and has all the features I need (like availability checking).

    • Dropbox

    I mostly use Dropbox without even realizing it as many of the apps I have sync settings and whatnot between my Macbooks and iPhone/iPad.

    • You Need a Budget

    Until the last year my wife and I were “casual budgeters”. We’d log into Mint periodically and check the balance and how much we had spent in different categories, cutting back if necessary. But we didn’t really budget. But YNAB changed that. My wife and I decided to start being more intentional with our finances and it has since paid off. It takes some effort but now we have a better idea where our money goes and are saving more than we previously had done.

    • 1Password

    The best password manager around. I used LastPass for a long time and it was functional but at the time was pretty ugly and had poor mobile support. 1Password is a much better all around.

    • MindNode

    For the occasional planning/brainstorming session.

    • Lightroom

    Lightroom doesn’t get used as often as it once did but it is still loved nevertheless. It is a great all around photo manager and editor. The one problem that has popped up in recent years is its lack of syncing to other devices without exporting the photos manually to something like Dropbox. Now that Google Photos is out, I’m looking at setting up some kind of semi-automated process for exporting there so I can always have access to my photos.

    • Pen & Paper

    A couple years ago I was all digital, all the time. But I’ve found I really like writing with a nice pen and notebook. It has a nice tactile feel that I don’t get from a computer and is often far, far quicker to use.

    Automation

    • TextExpander

    TextExpander is very handy. I have snippets that I use every day. Things like team member emails, markdown links, and common phrases. It really saves me a lot of time.

    • Keyboard Maestro

    Similar to TextExpander, it does a few nice things. I have a shortcut to make whatever text is in the clipboard into plain text and a few automated reminders that go off throughout the day (e.g. to stretch and go to a recurring meeting).

    • Alfred

    I barely use the Dock, Launchpad, or Finder to launch things any more because of Alfred. Plus I am always checking word spellings, looking up definitions, and doing simple math with it.

    Utilities

    • Dash

    For all your programming documentation needs. I have it hooked into Alfred so I can type lodash omit, hit enter, and it’ll open the app right to the documentation for that method.

    • Crashplan

    Letting a hard drive fail without a backup is a mistake you only make only once. Crashplan is an online backup solution that is easy, cheap, and offsite. You know, in case there is a fire or flood. It has saved my bacon numerous times. Do yourself a favor and sign up.

    • Authy

    You can’t be too careful online this days. With news of new hacks happening every day, it seems smart to enable two factor authentication on anything you can. Authy is a great place to centralize that.

    • Bartender

    As you can tell from this post, I have a lot installed on my Mac. Many of those apps like to install icons in the menu bar which result in a cluttered interface where I can’t see everything I need. Bartender allows you to hide those icon and place them in a popup menu.

  • Making Sense of Stream Processing

    Martin Kleppmann posted an article on his blog sometime ago about Stream processing, Event sourcing, Reactive, CEP. In it he gives an intro into stream processing and demystifies some of the terminology/buzzwords you may have heard before.

    People in different fields use different vocabulary to refer to the same thing. I think this is mainly because the techniques originated in different communities of people, and people seem to often stick within their own community and not look at what their neighbours are doing.

    I find this topic incredibly fascinating and have recently had the opportunity to apply them to a project. So far I’m impressed with flexibility it allows for.

    I’d strongly recommend giving it a read.

    Above image from Kleppmann’s article.

  • Elixir

    Lately I’ve been playing around with a progranming language called Elixir. It is a functional language built on top of Erlang and has a Ruby like syntax. I’ve been really surprised at how easy it’s been to get into.

    The longer I’m a programmer the more I like functional languages and some of its concepts like immutability so Elixir has been a joy to use.

    If you’d like to learn more then I’d recommend you watch the following introduction or check out the Elixir docs.

  • Podcasts I Enjoy

    Being a software engineer, my job isn’t one where I can easily listen to podcasts and work. I find it too hard to focus. However, I’ve recently been listening to them more on my short commute and when I have a few minutes here and there.

    Here are the ones I’ve been enjoying the most:

    I subscribe to a several more but these are my favorites. If you’ve never listened to any podcasts I’d highly recommend it. There are thousands of podcasts available covering almost any topic you can think of.