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

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