Monday, February 13, 2017

Some Helpful Resources

Recently I was prompted to compile a few of the resources that have helped me become a better developer. Below are a some books, blogs, and other odds and ends that I've found helpful. It's not comprehensive by any means, so take what you're able to from it.


Mother. Fucking. Tar.


This doesn't exactly fit in the list, but it's caused me more headaches than I care to admit. No matter how many times I've typed that goddamn command, it took forever to remember it. Here's a reference forever for me and anyone else who needs to know how to get files out of a damn tarball.

Extracting a tarball:

tar -xzf theTarBall.tar.gz
The way I remember it is by saying in my head "extract zee file".

Create a tarball:

tar -czf nameOfTarFile.tar.gz directoryOrFileToCompress
I remember this one with  "compress zee file".

Remember that the 'f' goes at the end because it's always followed by the name of the tarball to be extracted or created.

Helpful Books

Release It! -- Michael T. Nygard
This book is incredible for understanding how to build solid, scalable systems with sensible interactions. It references some dated technology, but has excellent real world examples of how to build flexible APIs and rebust services.
Clean Code -- Robert C. Martin
While not everything in this book is useful, I've found a majority of it suggests some helpful practices for writing good code. At best you'll love it, and at worst you'll spend a lot of time thinking about how you want the code to read.
Head First Design Patterns -- Eric Freeman, Elisabeth Robson, Bert Bates, Kathy Sierra
Honestly, I really hated this book. However, of everyone I've met who has read other design pattern books, they say this is the best. Other books worth looking at are Patterns of Enterprise Application Architecture by Martin Fowler, and the 'Gang of Four' book.
Machine Learning -- Kevin P. Murphy
This is more tangentially related to programming, and nevertheless is an excellent intro to machine learning. It details the theory as well as the practice.

Helpful Blogs/Websites

Call Me Maybe? -- https://aphyr.com/tags/jepsen
I wasn't able to grasp how eventually consistent systems work until I found this blog. 'Aphyr' (Kyle Kingsbury) does an excellent job of explaining why commonly used distributed systems fail and how they should actually work.
Eloquent Javascript -- http://eloquentjavascript.net
This is one of the best 'Intro to Programming' resources I've found. It's simple, detailed, and interactive. It's one I almost always recommend to folks who want to learn the how/what/why of coding.
The Twelve Factor Application -- https://12factor.net/
Awesome resource detailing some best practices for developing modern applications.

New Hotness Technology


This is likely dated, but here are is some tech that's hot right now and that I've found pretty useful:
  • AngularJS (Javascript framework)
  • Bootstrap (CSS framework)
  • Docker
  • Kubernetes
  • Drone
  • Go Lang
  • Riak 
  • Ratpack (https://ratpack.io)
  • Reactive (http://reactivex.io/)
  • Spring 5*
*Caution: Not really done yet... and not really hot. Spring is something that's nice to know but can be a mega pain in the ass.

Also do some googling on 'DevOps'.

Other Misc. Thoughts


Test Test Test


Get good at writing tests. I didn't link any resources because I haven't found any that do an awesome. Here are some things to think about when testing:

  • How will my program respond to unexpected inputs?
  • What is the best way to structure a program so that I'm only ever testing small amounts of code?
  • Will my tests fail if I change the way my code works?

Get comfortable in a linux/unix shell


Knowing how to operate in only a terminal is imperative. When remote connecting to a server to debug something broken, there isn't a GUI. Learn how to use:
  • less
  • cat
  • grep
  • ssh
  • ssh-keygen
  • scp
  • vim (or emacs)
  • cd
  • ls 
  • rm
  • mkdir
And a shitton of others. Spend time in a terminal, and it will make everything easier in the long run. 

Learn a few languages


I've found that, while knowing multiple programming languages isn't necessary, it's incredibly useful. Having multiple languages means there are more tools available to solve a problem. More importantly, it help reveal why one language is used over another. Also, as a former coworker and brilliant person Nate Ashford said, "Solving a problem in one language often reveals the easiest solution in another". Using another language can often force a developer to look at the problem in a different, and better, way.

Build something


Find a problem that's simple in your life that's interesting, and appears to be simple. For example, my new puppy gets homesick when we're gone, and so every day we play her radio. I quickly got sick of manually doing this, and hacked together a crap program called 'autoCaster'. Now everyday at 7 am, my script casts the radio to my chromecast audio, and at 6 turns it off. I recommend doing something hacky, and simple like this -- try using some of the new hotness tech to do it!

Remember that no one really knows how to code


In terms of a discipline, software development is still new. There isn't a right way to solve every problem, and years of development don't always make someone a better developer. It's hard to know that, though, because many developers assert opinions as facts. For example, you'll probably here things like this:

  • "The only way to do this is..."
  • "That's one way to do it, but the right way is to..."
  • "I can't believe anyone would ever right the code in this way..."
They may be correct, but it's important to remember that it might be a load of shit.

Most importantly, it's best to be open to input, to critique others both honestly and kindly, and most importantly to listen, listen, listen.