• 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!

  • 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.