10 years ago, I started looking at the available languages, with an eye towards potentially adding them to my toolkit. I narrowed it down to 27 and then didn’t get any further. I’m going to reboot this project on a similarly exhaustive scope, but with a more relaxed schedule (i.e. this is going to take a while).
What hasn’t changed in the past 10 years is that I’m still not a language geek, and I’d be happy to solve most of my problems with one or two well-rounded languages.
What has changed is that I haven’t written Java professionally for over 4 years. The average number of languages I deal with in a given week between work and personal projects, has gone from slightly more than one to at least 5 (Go, C++, Python, JS, Java), not to mention any number of DSLs and things like SQL or bash.
The goal at the end of this, is simply to have (and share) a list of candidate languages that someone could find a practical use for in 2021, and some starting points for each.
Part 1 will re-compile the original list, adding new languages (like Rust, which technically existed at the time but was pretty invisible) and removing any that have fallen by the wayside since it was created. After that, I’ll start to dig into each one and make cuts where appropriate.
As promised, here is my progress update on my OKRs. Without about 8 weeks to go, I’d say success has been good but less than hoped for. I can’t really pin it all on COVID-19, while that has been very disruptive I don’t think it’s really impacted these goals. What working from home for two months has done has shifted my computer work to some shop work, since I am at home for longer periods more since I have no commute.
Note: Scoring is simple unweighted average of the component pieces, rounded to 0.1.
0.3 – OKR 2020A: Reclaim Technical Familiarity
0.3 – KR1: Get a full stack project “running”
I’ve tinkered here and there but am not sure I’m going to have something running in the next 8 weeks, though that might happen if I make some tradeoffs.
0.0 – KR2: Publish 15 Technical Blog Posts
Not a one! Can I do two per week? Doubtful, but I’ll refocus and try to get at least one per week done.
0.5 – KR3: Learn (and do something useful with) a new language
I’ve done a bit of Go, but nothing useful. This is on the schedule though so I’d say I’m on track.
0.8 – OKR 2020B: Finish More of What I Started
0.8 – KR1: “Finish” my Woodshop
0.8 – Finish Painting There’s a few spots left but they are not really blocking anything, and are better left for when I redo the stairs (which is next half).
0.8 – Wiring – Subpanel is in, table saw has a dedicated circuit, and lighting is 95% done. There are a few circuits left to install (by the electrician) but I’m reconsidering making the investment at the moment.
0.5 – Dust Collection – I got the larger (2HP) unit, but haven’t done any ducting yet, partly because the new sheet good project is in the way of it.
Bonus: +0.7 – I’m in the process of adding some sheet good and small-piece storage, which will go a long way to keeping things tidy.
Bonus: 1.0 – I finally pulled the trigger on getting the SawStop, which I’ve wanted for many years, and is now the centerpiece of the shop.
0.7 – KR2: “Finish” my Home Office
The space is much improved. There is very little random junk strewn about, though there are a number of bins/boxes that need to be sorted, but if I ended the half as things are now I’d be pretty happy with the progress.
0.5 – OKR 2020C: Improve My Health
What personal improvement list would be complete without some health goals? These are not easy but seem to strike a balance of achievability and meaningfulness.
0.4 – KR1: Lose 20lbs
I’m down about 10, which is still pretty solid as a sustainable loss for 4 months, but I’d really like to stretch and hit that 20.
0.7 – KR2: Hit 150 Move Goals in Apple Watch
As of May 1, I’m currently at 111 with an active streak of 65 days, so I’m 11 ahead of schedule. It has raised my calorie requirement twice, due to the streak, from the starting 890, first to 970 and now at 1,060.
I am annoyed because I didn’t get my “Perfect Month” badge for March or April, I suspect there is a bug where you don’t get it if it raises your target and you didn’t hit that new target every day.
0.0 – KR3: Do 5,000 Pushups
I’ve basically done none of these, but partly because I’ve been using our new home gym and really enjoying it, when I’m not too tired from doing other physical work (e.g. the workshop).
Bonus: +1.0 – Set up the home gym
I didn’t expect to get this finished this half, but things worked out and we have a nice little spot with some barbells, dumbells, and an elliptical. I’ve been doing some circuit training and really enjoying it, perhaps even more than at a gym. We’ve also been taking family walks 3-4 times per week which has been great for everyone.
I think the adjustments have stayed within the theme, perhaps even moreso than the things that have fallen out. I have actually conciously thought about this as I’ve been going so I think this is a good part of the plan to keep for future versions.
0.5 – Final Score
I’m reasonably happy with the progress and if I keep tracking I should end up near a nice green 0.7, perhaps higher if I can make progress on the zeroes.
Be back in a couple of months with final results and new goals!
Gideon the Ninth is an anachronistic blend of murder mystery and adventure that has a confident lack of genre boundaries. The writing is fast-paced despite suffering from adjective overload and the dialogue is shamelessly and endearingly snarky. The unwieldy cast and clueless twists are redeemed by an exciting, vivid and satisfying ending.
I’ve been tinkering with OKRs since before I joined Google, and there are aspects of it that I really like. I’ve tried a few personal ones over 2019 but they have not been successfully tracked and/or completed. I’m going to do this round publicly and see if that helps.
A few notes:
I’m not including family things here because spending quality time with them is table stakes.
These are all basically 100% goals, so they are not *too* aspirational, and I intend to hit them all.
I wrote these up at the end of last year, and have been working on them, but haven’t gotten around to posting them!
The target date on these is June 30, 2020 (hence the H1 – Half One).
OKR 2020A: Reclaim Technical Familiarity
I’ve spent the past few years exploring new areas (maps, networks, C++) and want to brush up on what I was doing prior to that. I also want to do a better job staying better informed of new developments outside the comfy walls of Google.
KR1: Get a full stack project “running”
Running here means that someone (almost certainly not the public) can log in and do stuff, probably play a game although there are other candidates.
KR2: Publish 15 Technical Blog Posts
Media reviews and personal updates (like this post) don’t count, I’m unofficially shooting for about 15 of those too.
KR3: Learn (and do something useful with) a new language
Spoiler alert: this will probably be Go.
OKR 2020B: Finish More of What I Started
I like finishing things, but I love starting things. If I’ve not finished something it’s rarely because I didn’t want to* and almost always because I’ve started something else. I’d like to improve my discipline and wrap up a few things that will unlock starting lots of new things.
* Although I have gotten better in recent years about quitting some things earlier, like TV series that go downhill.
KR1: “Finish” my Woodshop
Like software, no workshop is ever really finished, there’s always room for improvement, but I’m pretty close to having no unfinished setup/projects in my shop. Some specific goals are:
Finish Painting – It’s an unfinished basement and the walls were mortared by not painted and the floor is concrete, none of which was painted.
Install New Wiring – The wiring is actually pretty easy, but a prerequisite is (an electrician) installing a new subpanel, which requires building a wall to put it on.
Install Dust Collection – I have a small unit now with a flex hose, but I’d like to get a larger unit with some fixed ductwork.
KR2: “Finish” my Home Office
We moved about 18 months ago and while all (or very close to it) of the moving boxes have been unpacked, my office has yet to really come together. This is in large part due to the fact that I don’t work from home much anymore, so it may be up to 2 or 3 weeks where I don’t even set foot in it, but I would like to maximize the time I do spend there by having it be a pleasant space.
OKR 2020C: Improve My Health
What personal improvement list would be complete without some health goals? These are not easy but seem to strike a balance of achievability and meaningfulness.
KR1: Lose 20lbs
I’ve been doing intermittent fasting over the past 6 months and have slow but steady success with it and am on the verge of classifying it as a permanent thing. More to come on this later.
KR2: Hit 150 Move Goals in Apple Watch
That basically means hitting it slightly more than 5 times per week, which seems pretty doable. A perfect streak is pretty difficult considering my job is at a desk, with occasional travel, and the occasional cold my son has been bringing home now that he’s going to school.
I accept what The Algorithm decides my target is, it’s been as high as 1200 calories and as low as 800. It’s currently at 890 since I was slacking over the holidays.
KR3: Do 5,000 Pushups
That’s 25-30 per day averaged out, but that’s a little high right now, and I’m hoping by the end of this I’m doing 50-100 per day.
I recently came across a video by CGP Grey about new years resolutions and I liked his idea of themes. I admit that having specific targets like these kind of goes against the whole idea of holistic themes, and I didn’t really have a theme in mind when drafting the OKRs, but I think they can actually work well together. It appears that there is a latent one here that is about laying the groundwork for future improvements. If all goes well:
I’ll have a little side project going, which always gives me a boost at my day job.
I’ll have two great workspaces from which to tackle new projects, software and otherwise.
I’ll be in better health and have more energy and drive to do those projects. Bonus: The onsite gym at work re-opens in May and I should be a much better position to use it well!
Therefore, I will declare the theme of 2020H1 to be Infrastructure.
Watchmen Season One metamorphosed from a set of intriguing stories that were scattered in a way I was afraid Lindelof (Lost) would bring, to a tight, coherent and moving conclusion that was smaller but superior to the books (read them first) or movie. The season stands alone, though I would like another.
So the side project I mentioned a few posts ago is still just an idea, before I start building it I will need to pick a stack. I’ve been out of the non-big-tech loop for a while (one of the main drivers for this project) so this may take a while, but should be a fun experience.
The last time I picked a fresh stack was late 2013. We were building Mondogoal and needed to get to market very fast on a limited budget. We started in late November 2013 and needed to be in beta by March, and ready to launch (and get a gaming license!) in time for the 2014 World Cup that started in June. With two developers.
Somehow, we made it, and I think that one of the main factors was in how we picked our stack. In short, we kept things as boring as possible. The backend was all stuff I could do in my sleep: Java 7 with MySQL, using Maven and Spring, running on Tomcat in a mix of AWS and Continent 8. The only significant piece that I didn’t know well was Obsidian Scheduler, which is a fairly lightweight job scheduler, and we added Firebase later on. The frontend was backbone with a grunt build, which had been out for a while. This stability and going down well-trod paths let us focus on executing the business and product instead of tinkering and I doubt we would have been able to hit our deadline if we’d opted to explore some of the cool new stuff that was coming out. While the business didn’t succeed long-term, I have no regrets about those choices and can assign no blame to what we built it on.
Luckily, this new project has no deadline! It’s mainly a vehicle of exploration for me. I would definitely like to launch it, but if that takes months (unlikely) or years that’s OK. Let’s recap the “requirements” of this project:
Learn how to build a modern front end.
Give me a reason to explore the Google Cloud offerings (since those products are effectively my customers for my day job).
Get back up to speed on things like analytics.
Scratch an itch I’ve had for a long time (a nerdy economy-based game).
Doesn’t risk any conflict with my day job.
Give me something to blog about!
#2 is going to make some of these decisions easy. As a loyal dogfooder and company man (despite the lack of employee discount…), I will default to Google Cloud where possible. A quick check puts most of the basics on par with Amazon as far as cost goes. If GCP doesn’t offer it, then it’s up for grabs. Let’s start picking!
But wait…what is and isn’t part of The Stack?
I take a broad view of the term, to me The Stack is basically everything in the shop. You could (and I might in a future post) break this down into groups (tech stack, marketing stack, etc.), but to me if it’s a part of making the business run and it’s something you didn’t build yourself that you expect employees to get or be skilled at, then it’s part of The Stack. This includes everything from Java or Python to Salesforce and Gmail.
Winner: Google Domains
Status: Up and Running
I’ve got domains hosted at lots of places. GoDaddy, Namecheap, Hover, OpenSRS, I even still have one at Network Solutions. Compared to those, registering on Google was a pretty painless process. The pricing is more transparent than most other places (no first-year rates that go way up later). They also didn’t upsell junk I don’t need too hard. Setting up G Suite was also pretty easy (as you’d hope), I had it all running in like 15 minutes without touching any DNS entries.
To dogfood even deeper, I’m using a .app TLD, which Google owns, and was a few bucks cheaper than the other registrars.
Winner: G Suite
Status: Up and Running
As most of us are, I’m pretty familiar with all of these tools, and I’m pretty sure most surveys would have Gmail at the top of people’s preferred email services. As a bonus, setting this up was super easy since the domain is also with Google.
Winner: Kubernetes/Compute Engine
There were two things that came up in virtually every conversation/interview I had during my last job search, React and Kubernetes (AKA K8s). Virtually everyone was using these or trying to move to them. I’ve never touched K8s, so combined with #2 above, I feel like I should play with it.
I have used App Engine, and I assume non-K8s Compute Engine is pretty similar to AWS’s EC2 which I’ve used quite a bit, so I will fall back to those when it makes sense to do so.
Java was my primary language from probably 2000 through 2016. Since then I’ve mostly been writing C++. I’ve grown to like the language, it is lightyears better than it was when I started writing Java, but I’ve never worked in it outside of the padded walls of FB/Google’s infrastructure, and to be honest, am not terribly interested in doing so.
While we upgraded our runtimes to Java 8 at Mondogoal after a bit, we never got around to really using any of the features, so I’m effectively only up-to-date through Java 7, and would like to explore the recent additions. There are also some new parts of the Java ecosystem that are worth exploring, like Quarkus and GraalVM.
Also, I just kind of miss working in it.
There are two languages I am interested in tinkering with, once I’ve warmed back up on Java: Kotlin and Rust. They both have had a pretty good reception and have some attractive features. Kotlin as a JVM language should be easy enough to experiment with. If I can find a task that would benefit from Rust I will probably give it a shot.
Winner: IntelliJ IDEA Ultimate
Cost: $149/$119/$89 for years 1/2/3+
I initially wrote Java in emacs, then JCreator, then switched to Eclipse c2002 and used it through 2016. I’ve tried IntelliJ a few times over the years but never really got the hang of it or saw a lot of value in it.
However, Google does quite a bit of Java work, and their primary and only fully supported IDE for it is IntelliJ. I’ve also been using CLion (basically IntelliJ for C++) and it’s been OK.
The “Ultimate” edition of IntelliJ includes support for other languages and even React so that’s a strong argument in favor of trying it out. I’m not opposed to ultimately landing on using different tools to work in different languages (e.g. I often used Eclipse for Java and Sublime for JS), but if you can do it all in one, that’s nice.
My Eclipse muscle memory is very strong, so I expect this to be somewhat painful transition, but I will give it as fair a shot as I can manage.
There are only two real choices here: Maven and Gradle. And given that Gradle uses Maven-style repositories, they aren’t even that different in many respects.
I’ve used Maven for many years, since Ant, and like most people had some struggles with it initially. I eventually learned to coexist with it, or at least avoid its sharp edges, and would just copy/paste my pom from one project to next and had minimal issues.
Gradle has three main “advantages” over Maven that people seem to crow about.
One is that it’s written in Groovy, and you can therefore script your build and do advanced stuff more easily than writing a Maven plugin. I would put this in the Probably a Bad Idea category, like stored procedures. I bet there are some cases where this is useful, but probably far more where it’s a kludgy workaround to some other problem people don’t want to solve.
The second is that it’s written in Groovy, which is not XML. I always thought XML was nice when used properly, and that config files were one of those proper uses. However, something about it causes a primal aversion in many people and they convince themselves that things that are not XML are inherently better than things that are.
The third is that you can do different build versions more easily, and this one I get, especially in the context of things like Android apps. Given that I might be targetting different JVMs (regular and GraalVM) this might be useful, but probably won’t be.
So I’m not really impressed with Gradle either, but given that there are literally only two choices, I might as well know both. It’s pretty trivial for a small project to switch back or even run both, so this is a pretty low-risk experiment.
Winner: Git + Monorepo
Cost: Free (plus hosting)
Status: Up and Running
I think there are only 3 real options these days for version control that don’t fall into the “never heard of it” category for most people.
The dominant force, and the only one that many developers know these days.
I have grown to prefer Mercurial in a code-review + monorepo environment since starting to use it at Facebook. Implicit branches and easy commit management map very well to the “commits should do one thing” best practices as opposed to the pull request pattern where mainline commits should favor comprehensiveness. For a solo project this isn’t relevant and it’s basically the same thing as Git.
For solo/small teams, SVN is totally fine, it’s basically how you’d be using a DVCS anyways, but if you don’t have a server running already then it’s probably not worth setting one up.
Mono vs. Multi Repo
For large organizations, monorepo is the clear way to go for reasons I can discuss elsewhere. For solo/small teams, it doesn’t really matter, and it *might* be better to split up your repos if you have a *very* clear separation (e.g. front/back end), which is how we did it at Mondogoal, but I would say to start with a monorepo and only split if there is a compelling reason to do so (e.g. regulations, licensing).
I’m going to call this a toss-up between Git and Mercurial and give Git the edge due to the fact that it’s massively more popular and more likely to integrate well with other things like IDEs and deployment tools.
Source Control Host
Winner: Google Cloud Source Repositories
Cost: Free to 5 users & 50GB storage/egress, then $1/user/month and $0.10/GB/month
Given that I’ve chosen Git, GitHub is the obvious first choice here, but since Google has a product we’ll invoke requirement #2. This also might integrate better with the other services I’ll be using, though I have barely researched that beyond the marketing.
One of the nice things with Git is that it’s trivial to multi-host, so if I ever find a compelling reason to also use GitHub, I can use both or just switch.
There’s a lot left to do here, databases, frontend, and more. Stay tuned!
When starting a new company or project, one of the most daunting phases is selecting a stack. There are lots of things that factor into the decision, and anyone who has done this before will attest that you will make some bad choices, and some of those will be nearly impossible to undo, especially if you’re successful. Some questions to consider:
What do you already know/love/hate?
When considering your options for some piece of the stack, it is totally reasonable to award points to things you know and love, and deduct points from things you know and hate. It is, however, not a good idea for this to be the principal factor. You should be able to defend your favorite choice against the others objectively and quantitatively, not solely on the basis of “it feels better” or “I know it already”.
Are you just trying to execute a business/goal or are you trying to explore and learn something new?
One of my two virtues of engineering is curiosity. Throughout your career, you should always be looking for opportunities to explore new ideas, new tools, new methods. If this is some moonlight or passion project, actively try to weight new and unfamiliar things higher. If this is a major venture with lots of other people’s time and money, there is just as much to be gained from leveraging your experience and going for flawless execution of things you’ve already worked out the kinks on.
If you have teammates, what do they know/love/hate?
This is a case where you should set the hierarchy aside and try to get everyone’s opinion. If you’re a senior engineer or architect you can bring experience to the table but don’t discount the novel approaches and backgrounds of your teammates, regardless of their experience. We so often get stuck in our ways, even after only a few years, and avoid novelty and diversity in the name of risk.
Are you going to need to hire/outsource the work?
If your plan involves getting dozens or hundreds of people on board in the near future, you’re going to want to lean to the more popular/vanilla options. Trying to hire 300 people in the next 12 months to work on your Erlang/Neo4J stack running on an Arduino cluster is going to be much harder than getting people to do Java/MySQL on AWS.
Are you building a prototype, an MVP, or a “real” version.
Deciding, and more importantly understanding what you’re building is a topic worth exploring on it’s own, but roughly speaking you’re building one of three things:
You just need to get something “working” to explain your idea or your solution. Unless you’re doing something truly revolutionary (p99.999 confidence spoiler alert: you aren’t), try to prototype your idea/business/product OR your technology, not both at the same time. Also really commit to throwing this away and starting over with a proper plan if there is promise. I’ve seen/had too many prototypes turn into projects that have a pile of technical debt before they even really start.
I feel the MVP is overused, and too often is an excuse for a poor quality product or a starved team/budget. You obviously want to iterate, and if you want to call your first release an MVP for buzzword sake, go ahead, but don’t write throwaway code unless you’re committed to throwing it away (see prototype above). I’ve lost count of the number of companies and projects I’ve talked to that are rewriting their Rails or Django app because those seemed like easier paths to an MVP and “now we just need to scale”. That’s like saying “I’m going to get a job, but then I’m going to go and get a completely different job that actually pays my bills.”
If you are truly building an MVP, then your process for stack selection is no different than building the real version, it’s just prioritized more aggressively.
The “Real” Version
The first step here is to figure out, as best as you and your team can, what the successful (often AKA profitable) version of your app/system looks like. Do you need 100 users to break even? Do you need a million? If you need a million, don’t spend a single minute building something that only works for hundreds. If you need 100, don’t spend any time building it for 1 billion (unless you get that for no additional work, E.G. something like Amazon S3).
What features are truly required to hit that goal? Make sure there is a place for them in your architecture even if you don’t plan to build them right away. Do you need support and sales teams to be successful? Make sure you’re putting hooks in for the tools they will need (E.G. CRM, ticketing, admin consoles).
What can you get “for free”?
Everything has a cost, in terms of time, money, people, etc. but those costs are not always the same across companies and projects. Your team’s experience can discount learning curves, your company may already have investments or licenses for things. Never use something just because it’s free, but make sure that is a part of your decision.
If you’re at a larger organization with a number of teams, consider if there is a team supporting certain aspects of what you might use. If there is a logging system that is in place and ready to go and has its own support, it’s should be a hard sell to build or buy or set up a new one just because of a few features. Often that team will even build what you need!
What are your competitors using?
Competitive analysis can be difficult, most software companies don’t go too deep on what they are using for any given situation, but that information can play a large part in your decision. If you find a conference talk where they talk about what they tried and had good or bad results from, you’ve possibly just saved yourself a lot of pain. You will often just get a lot of good ideas (“I never considered using X to do Y”), or pointers to things you’ve never heard of.
You might also find some competitive advantage. If they are using something you know is difficult to change or won’t scale well, make sure yours can beat them in those aspects. By the time they realize you’re about to pass them it might be too late for them to adjust.
What will fail first?
As you’re building your stack, know where the weak points are, and don’t be shy about circulating that information. If you can’t get to your target latency because some component will use 90% of that budget, try to find a replacement early rather than assuming you can plug something else in later. You should be confident that all of your core components can hit your targets, and if you aren’t sure, validate that now. You’ll find that the interconnected nature of systems will often lead you to replacing more than one piece at a time, which only makes it less like you’ll be able to do it, and more likely to fail.
Picking a stack is harder, and takes more time, than most people realize. I’m sure there are other things to consider and I’ve love to hear your thoughts on this in the comments.