Howdy internet friend, and welcome back!
Salutations internet friend and welcome back to my blog! In this post I am going to talk about my experiences with the Go programming language. For about the past six months or so I’ve been investing my morning time teaching myself this very interesting language.1 That changed last week when I made the decision to move on and I want to write about the reasons why, including what I like and what I don’t like about Go. I am also going to share some of the resources I used to expand my knowledge and programming skills with Go, and what led me to the decision to move on. Finally, I am going to discuss some languages I am interested in learning next and will close with what I selected. Without any further adieu, let’s dive right in!
Why am I moving on from Go?
For the last few months I’ve learned heaps about programming through teaching myself Go. One of my favorite things about the language was the way it forced me to learn complicated concepts in computer science from the start. Allow me to explain by way of a practical example. One of the things that pushed me over the edge to start learning Go was a book I’ve frequently mentioned in this blog called, Black Hat Go from No Starch Press. Some of the first code examples in this book feature the concept I mentioned earlier called concurrency. Despite having a few years of teaching myself programming, I had split this time most recently between Python and Ruby and I hadn’t even heard of concurrency. Another thing I noticed quickly about Go that was immediately a problem was that I found it very hard to read. Initially I attributed this to the language being new to me and thought it would get better the more experience I got with it. Unfortunately, the opposite turned out to be true, and the more I learned the less readable the code turned out to be.
In addition to my problem struggling to read Go code, there was a bigger ethical problem that kept hounding me. If you haven’t read the about me section or don’t know me that well, it is important for you to know that I am a huge advocate of and for free software. In addition to running Linux full time for the last decade, I even have a tattoo of the Linux mascot Tux on my right forearm in a very visible place. This isn’t because I think the animal is great or particularly attractive (although Tux is cute, to be sure) nor is it because I had a space that needed to be filled, though that was also true. It’s because I believe that software licensing is an ethical issue and free software is preferable to proprietary and closed source software. Making people pay twice for something, in this case a computer, seems wrong to me. I should clarify that I understand the business case for selling software. I do not have a problem with people selling software (I work for a company that sells software, so it should be clear to the astute reader that I obviously don’t have qualms about that). Rather, my problem is when you have to pay for your computer, then pay Microsoft again in the form of a tax on your machine. This seems wrong to me when I will never even boot in a Windows system to make me pay for it, but that isn’t the point of this article. For one final point on the, “paying for software” discussion, the GNU GPL, one of the most famous free software licenses, allows people to sell software, they just have a caveat that the source code must be available. All of this is to say that I do not believe there is anything inherently unethical about selling software, my problem is the lack of choice! While Go is licensed under a BSD-style license has changed things at The Goog and they ditched the motto. At the end of the day, I do not want to invest more of my time and energy in a programming language that I could not make real changes to without joining The Goog.
“Dave, you wouldn’t actually have to join Google in order to submit updates or influence change(s) or direction(s) in the language.” Indeed I would not, disembodied voice, you are most likely correct. However, it would still require investing time and energy to help a giant corporation, and I would much rather contribute and write code in a more free and less corporate-linked programming language. That having been said, for people who disagree with this position, or for those who don’t have a problem with The Goog, or are frankly not persuaded by my objections, you are in luck! Because before I move on to teaching myself the next language, in the sections below I’m going to share a few resources that helped me get up to speed with Go. I should also admit that I didn’t really do any cool projects and spent my time learning, so I can’t speak to how quickly you can start writing tools with Go. However, I suspect from the few chapters of the book I went through that you could pretty quickly write code to start doing cool stuff in Go!
What did I use to expand my knowledge/skills with Go
As I’ve mentioned above, Black Hat Go was a really big chunk of my learning experience. However, it doesn’t start at the beginning and I found myself quickly putting it down and looking for a much more basic tutorial. It is pretty frequently recommended, including by the authors of the book, to check out A tour of Go, which ended up being a really great starting point that allows you to dive right in and start coding immediately. You can even grab the binary and use it offline if you prefer! I have to give kudos to the Go team for making entry to the language accessable to anyone with an internet connection. After pushing through “The Tour” for a bit, someone on Twitter (I wish I could remember who so I could thank them!) recommended this Udemy course, and I found it to be really helpful! Perhaps my favorite thing about the course was that it was geared towards people coming from other programming languages, so I didn’t feel like I was starting from scratch. That’s one thing I have found really surprising about learning new programming languages, and that is the concepts you learn along the way rarely disappear, they just change slightly depending on the language. Whether you are using an object oriented or functional language, there seems to frequently have a large overlap between concepts, and that is really reassuring to me! One of my biggest pet peeves is having my time wasted, and it is good to know that learning stuff in one language can almost always be applied in other languages!
Once I finished the Udemy course I felt ready to go back to Black Hat Go and search the internet for concepts I found confusing. Both the book and the Udemy course stress the value and importance of reading documentation, and by this I mean the official documentation provided by a project. I didn’t realize that this allows you to look up how to do things, probably because most of my learning has been through tutorials and just following the steps in the order I am told to. I have read that many programmers fight against reading the documentation and instead will do anything and everything they can to avoid reading it. In my limited experience, spending the time to read the docs really helped me understand how to implement my ideas with code. One of my biggest takeaways from learning Go has been that much frustration, time, and gnashing of teeth can be saved by STARTING with the documentation, rather than grudgingly reading it after not finding what I am looking for on Stack Overflow or Google/DuckDuckGo.
Ultimately all these objections got to me and the struggling to read the Go code was too much - the time had come to move on to my next language!
What languages were on the short list to learn next?
Since I’ve only been hacking on code seriously for the last few years, I wasn’t really sure what to try or where to go next. So far I’ve learned the following languages roughly in this order, starting with my first programming class in junior high:2
Also please note that Comrade Eevee is correct that HTML is a programming language and I have no patience for gatekeeping. Everyone who wants to boop computers can boop them, and if you think that HTML isn’t a programming language, than don’t view any websites! Alright, I know that doesn’t make any sense, but to me neither does gatekeeping! I hate gatekeeping, it seems to me to be a form of bullying and I hate bullying!
With that quick tangent aside, I had a choice to make about what to learn next so I asked every programmer that I knew, starting with one of my best friends Acetolyne. Then I turned to the random slack channel at work and asked the professional programmers to share some suggestions with me. There were many interesting ones, but my favorite was to learn many different languages to do different projects/jobs/tasks. This person suggested learning Lisp and Scala as well as others. I’ve read about Lisp but never considered working with it until that suggestion. I did a little research and found a cool book but it was a bit more than I wanted to spend right now. Acetolyne mentioned to me that he had considered Rust, which was also on my short list to learn next, so I did a bit more digging. Watching the fuzzing stream I mentioned on Monday had further persuaded me of the benefits of Rust as well.
Ultimately, what did I decide on next?
If you hadn’t been able to tell from where the last paragraph was leading, the winner is Rust! Originally designed at Mozilla Research and sporting a MIT or Apache 2.0 license according to their Wikipedia page, Rust has much of what I was looking for including speed! I have interest in one day messing around with writing my own kernel and operating system and Rust looks like a great choice for systems programming. It also doesn’t seem as hard to read (at least at first) as Go (mostly by this I am referring to single name variables as convention, which always really bugged me about Go).
While I am still persuaded about the benefits of learning other languages, and I am absolutely going to revisit Lisp in six months or so, (perhaps around the holidays), I am going to focus my energy in the near future on learning Rust. I found some great resources available for free online to get started, in particular Rustlings made it really easy to install Rust on my machine, and Rust By Example has been really great as an initial learning tool. I feel like I am starting from a good place, and the Rust community seems to be very helpful and welcoming so far.
I should also add in closing that I am very interested in additional learning resources as well. If you have a book that you found really helpful when you learned Rust, don’t hesitate to reach out to me via Twitter with your suggestion! I’m always looking to reduce the space on my bookshelves!
- I’ve mentioned it pretty frequently, but on weekdays I wake up at five. Monday and Friday I spend that time writing and Tuesday-Thursday I teach myself programming. [return]
- Hat tip to this website for the Markdown cheat sheet, since I forgot how to do bullet points and never knew how to do footnotes until five minutes ago. Thanks cheat sheet! Also, Greetz to Mrs. Ploof, my first programming teacher! [return]