Suppose you want to write a simple in-memory JSON store with an equally simple socket based protocol. You want this in-memory store to support parallel and consistent reads. By “parallel reads” what I mean is if 10 clients request to read data from the store then no client should be blocking any other client. By “consistent reads” what I mean is when a client requests some data from the store there is absolutely no way that client gets half of the data before a write and half of it after a write and there is also some kind of ordering for reads and writes. In other words, if we have an array “[1,2,3,4]” that corresponds to the key “ints” in our JSON store then the following sequence of events is impossible: Continue reading
During my job search I came across a lot of job descriptions that were just a waste of space. The same amount of words could have been used to describe the taste of packaged tuna and if you could have cloned yourself then the version of you that read about the taste of packaged tuna would have come out ahead in terms of being a better person. But I’m never one to just criticize so here’s a concrete example of what a technology company’s job description should look like:
At our core we are a technology company. We move fast but we do not break things. Continue reading
If you play around with Ruby long enough you start to notice that Ruby programmers overall tend to prefer small domain specific libraries, Ruby on Rails notwithstanding. There are many good reasons for this kind of approach from a software engineering perspective but the biggest reason is that Ruby makes it extremely easy by providing the right kind of metaprogramming facilities. Continue reading
I consider myself a programmer. What that means is that I solve problems by writing down a set of instructions to be executed by some kind of computation machine. The form of the instructions varies but at the end of the day there is an underlying science to all of it. It can be expressed in many formalisms like type theory, category theory, operational semantics, domain theory, etc. but the essence of it is called computation. It is the application of computation theory that I am truly concerned with. So really you could say as a programmer I solve problems by applying computational theory and thinking. Continue reading
I find information silos unpleasant. I don’t really have a rational reason for it other than it makes me feel icky. I dislike being a product that is marketed to marketers. Google is the biggest information silo out there and the biggest pimp of personal information. Keeping your personal and private information with them is no longer a defensible position to hold because if you are a little bit tech savvy then for a few hours of effort you can have your own personal and private cloud software suite that includes email and all sorts of other goodies. The number of guides to help you is also in no short supply. I highly recommend https://github.com/al3x/sovereign for getting you started. He has already done all the hard work for you and you just need to learn a little bit about ansible to make the whole thing work. You’re gonna need somewhere to host it all but that’s also easy and here’s a digital ocean referral link to get you started: https://www.digitalocean.com/?refcode=1f88dd059926. If I was able to get the whole thing set up then you should be able to as well.
I’m currently reading “An Astronaut’s Guide to Life on Earth: What Going to Space Taught Me About Ingenuity, Determination, and Being Prepared for Anything” and almost everything Chris Hadfield says is not just applicable to life in general but it is applicable to software engineering in particular. Continue reading
Talk title: The Trouble with Types
Speaker: Martin Odersky (Scala, TypeSafe)
Talk title: Programming the Turing Machine
Speaker: Barbara Liskov (Liskov Substitution Principle, CLU, ADTs)
Programming is not about writing code. Syntax changes over time but the fundamental nature of programming remains the same. The true nature of programming is taking abstract machines and putting them together to perform a task. Programming at the end of the day is about those abstract machines and their connections. This is why type theory and category theory should be essential components of any programmer’s education. Once you start viewing programming through those lenses it is impossible to go back to the syntax oriented view of programming. Here are some books and various other resources I have found useful during my education: Understanding Computation: From Simple Machines to Impossible Programs, An Introduction to Mathematical Reasoning, Types and Programming Languages, Nathan’s University, Functional Programming Principles in Scala, Applied Cryptography, Artificial Intelligence for Robotics, r/programming.