Home All Posts

What to Learn? continued...

2018-04-28

My bookshelf is overflowing with technical book that I’ve accumulated over the years. A lot that I’ve read and a fair number that have gathered dust only to be flipped through. They have served me well, and those books, some luck, and years of experience and work have afforded me a career in technology without a college degree.

In the past I’ve debated with the idea of finishing my degree in CS, but lately the more I think of it the less I want to do it. Honestly, a large part of not wanting to do it is I don’t want to spend the money on it. Another large part of it is that there aren’t a lot of CS programs that are available online, and dropping 40-50k at a minimum to get a degree that won’t help me a great deal career wise isn’t something I’m jumping at doing.

Having said that, I tend to be something of a compulsive learner with regards to technology. I’m always attracted to the new stuff even if I don’t need it. In general this isn’t really a bad thing, and not withstanding my need to have a nice computer with the latest software on it, it does have a drawback in that I tend to compulsively learn new development stacks. Being somewhat obsessive with staying up to date with the latest frameworks is nice for knowing what’s out there. But I don’t think you need to know three or four different stacks that you can use to build the same type of thing.

So I think instead of spending my free time always learning new technologies because I’m interested in them, I’m going to try to refocus some of my energies, and hopefully, at the same time be able to learn some new technologies too.

I’ve been thinking that I should try to align what to learn with what I might like to build in the future for personal fulfillment. At this point that keeps leading to me wanting to build a reasonably complete interpreter for some as of yet made up language. I’ve been fascinated with computer languages since I was young and learned QBasic. So I’m going to place my energies on learning the fundamentals necessary to do this and study compiler engineering and related subjects.

Compilers and languages before I started even the most basic of studying in it seemed like black magic. Which in reflection is probably a bad thing to think given that I’ve been using computer languages to build things without really understanding how they are parsed and made into executable code or interpreted. In the past year I’ve finally started to look a little more into the “black magic” and it turns out that there is a lot of books and resources on how languages work.

I’ve already started working through the book “Writing an Interpreter in Go” by Thorsten Ball, and it’s great. It definitely makes it easy to see that it doesn’t take a rocket scientist to build an interpreter and I’m excited to work through and finish it.

While reading this I’ve also just started the book “Concrete Mathematics”. This is a extensive text on discrete math which mastery of will help with the analysis and understanding of algorithms and data structures on a much deeper level. In addition to this working through this book will provide the underpinnings for understanding some of the more advanced textbooks on compilers and languages, which I’d also like to work through.

So for the next year or two my target goal is to work through the following books:

Concrete Mathematics and the Introduction to Automata Theory, Languages and Computation are going to take the bulk of my time. I’m going to have to gradually build up my old algebra and math skills to where they were years ago to help here, but I don’t think that will be too hard hopefully. With luck I can avoid having to learn too much Calculus again to work through these books, I’m fairly sure that I don’t really need to know it to build an interpreter.

Which also means that in the next year I would like to have a custom interpreter up and running to show that I have, in fact, learned something. In addition to that I’d like to build a YAML or TOML parser for C# as an additional exercise.