13 hundred engineers…

I get a lot of cold-email outreach tech spam. It’s especially insidious because they automate the personalization and do repetitive outreach, so I have to read a little bit before I ignore it.

Without embarrassing anyone, here is one such example I got today…

Good Morning your first name,

I hope this finds you well. I am following up on a note I had written to you last week. I completely understand your busy schedules, wanted to connect with you at your convenient time.

I see great synergies between your company name scraped from LinkedIn and X— and would be glad to explore synergies to work together towards to address your product development /engineering needs.

X— is an engineering team of 1300+ engineers…

After I read the second sentence, I filed it away, but my peripheral vision caught the beginning of the third, and I recalled that message.

1300+ engineers? Holy shit! What sort of business can you build with 1300+ engineers, I wondered. The Mythical Man-Month tells us that “adding manpower to a late software project makes it later” so by this math, you couldn’t even change a lightbulb with so many engineers.

So I had to pull up what this company does, which is my engineering equivalent of slowing down to look at a car wreck. Here is the first bullet point in the previous e-mail.

  • Certify your products through comprehensive Test beds to automate the build and QA cycles

Stop right there. Why the fuck would I want to automate my QA? You have 1300+ engineers, you can make them run all my test suites by hand. It’d probably be better output too because they must be some really shitty engineers.

(If you have 1300+ engineers and you are not one of the FAANGs, you are doing it wrong.)

Some thoughts on Card Drafting

I decided to get back into board gaming, and ended up getting or playing the following games recently:

Last time I tried a board game was 2012. My girlfriend set up a surprise birthday for me over where we played a new game I had bought on a whim, Lords of Waterdeep (BGG Rank #51).

I am mentioning these games because all of those games happen to use a game mechanic I hadn’t seen when I was a serious board gamer in the 1980’s: card drafting. However, card drafting is a very popular mechanic today. In fact, over one third of the top 100 games on Board Game Geek use it!

The first time I had even seen this mechanic was when I ran across an early euro game known as Web of Power from 2000. Someone corrected me and said that, “there’s quite a number of earlier examples of drawing from a pool of face-up cards than WoP.” Well it was new to me in 2000!

Indeed almost 7600 games have been categorized as using the mechanic, and there are some examples in the early 1900’s using it, but nobody has heard of those games. This got me curious as to what are the earliest examples that might have influenced game designers?

Using the top 1000 as the cutoff, it looks like the first game to have this mechanic was El Grande in 1994. The next year, it won the Spiel des Jahres which must be what got people adding it to eurogames. That same year it looks like Wizards of the Coast modified Magic: The Gathering to create their smash hit Pokémon. Soon we find Elfenland, the Spiel des Jahres winner in 1998, Kahuna, a Spiel des Jahres recommended title in 1999. and Union Pacific, a Spiel des Jahres nominee also in 1999. This is followed by the aforementioned Web of Power which shares its birth year with Taj Mahal, Citadels, and  La Città, all four became Spiel des Jahres recommendations. Wow! Thanks, El Grande, and I guess, Pokémon!

Card Drafting, where have you been all these years?

My guess is if Illuminati (1982), a game I played as a kid, were made today, it would have that mechanic in it. But instead it has card drawing and then playing from the hand. In fact, Fog of Love has that same mechanic, and this is not actually card-drafting. And I think this explains is why the card-drafting mechanic is so popular: it adds an element of strategy through public information (you can choose to draft a card instead of drawing by luck). Games have moved into euro mechanics that want more public-facing strategy and less private hand-holding random draws, so we see more and more card-drafting.

Web of Power actually allows a choice/tradeoff: public drafting of a known card or private drawing of a random card. That’s something to keep in mind because I happen to think that balance between random ameritrash and dry eurogame mechanics are needed to make a good game today.

2019-02-08 Uncle Francis’s review on the movie “Roma”

From Uncle Francis:

After thinking the movie over this afternoon, it is a good movie after all. Writer & director Alfonso Cuarón is telling us about a woman’s story – mostly sad without explicitly saying so.

1. mistreatment & abandonment by her boyfriend;
2. pain of losing her baby before birth; and
3. camaraderie of humanity irrespective of the race & age as depicted by saving two children from the sea.

I especially liked the last scene after rescuing two young children abd getting holding shoulder to shoulder with children around the bonfire.


I think it may win the best picture academy award – a beautiful cinematography anyway.

Software engineering surveys are unintentionally hilarious

So… this was in my inbox today…

Most Loved/Hated Programming languages according to Hired
#PythonIsSexyAgain #NowPictureGuidoVanRossumNaked #SEXY? #NowTryGettingThatPictureOutOfYourMind #GlobalInterpreterLockAmIRight?
#EverythingIsAwesome #JavaCanDoEverything #JavaIsAwesome #NoWaitMaybeNot

(There are many other gems in there, like any good tragicomedy.)

What MVC framework for web development?

Answered in Quora:

Q: Why should I learn the combination of Python/Django rather than PHP, JS/Node? I am a web designer moving to web development. What is the scope of Python/Django?

Python/Django is like learning Ruby/Ruby on Rails. The equivalent in the PHP world would be PHP/Drupal or PHP/Laravel. Equivalents in NodeJS is not Node/JS but NodeJS/Meteor or NodeJS/Sails. In all those examples above the first part would be the underlying web language, and the second would be a MVC framework on top of the language.

(There exist web frameworks that do not provide MVC but just the web server and HTTP request-response plumbing. This isn’t common in PHP since it is embedded in a web server such as Apache or nginx, but in Python it would be flask and in NodeJS it would be Express or Koa— these are sometimes referred to as “microframeworks.”)

However, unlike on the front-end with things like Vue.js, React/Redux and AngularJS, full-service MVC web frameworks have increasingly less utility on the back-end. This is because most the the advantage a framework provides is to do heavy-lifting of tedious but repeatable tasks that require a lot of code (very common when building a user interface) the bulk of which has been moved onto the client in web development. What value is a MVC’s templating system and router when both have moved into javascript on the client-side and all interactions are through an API? This becomes more extreme with standardization of the data interface (a la GraphQL) and the prevalence of more service-oriented architecture popularized by microservices or serverless FaaS architectures.

MVC web-frameworks still provide things such as a configuration management, a data object model and abstraction, but even those can get in the way as a website becomes more mature and this pre-fab approach becomes a hinderance to future scalability and optimization.

Also, when not building to scale or building proof-of-concept, a full MVC architecture will help you starting out on server-side web development because it does all the heavy lifting for you. So it might be good to start out with one, though YMMV (your mileage my vary).

Continue reading about the state of web frameworks after the jump

These tweets spark joy

Marie has loved Marie Kondo since her book first hit the US four years ago, so of course last night we watched the first episode of her new show on Netflix.

This morning she’s been sharing with me these tweets.

“There is definitely something unique and fresh about Marie Kondo. That’s why she’s become so popular.” she said.

“I just hope that I continue to spark joy in your life,” I replied.

The Zen of Defriending

Seen on facebook:

Welp. There goes another Facebook friend, who decided facts about the southern border were inconvenient and did not fit her worldview, and decided that as a messenger I must be unfriended.

I’d like to remind people that “unfriending” simply means “retreat into my echo chamber”. If I was disrespectful, vitriolic, or hateful, then sure: unfriending would have a completely different meaning. But that isn’t the case. I don’t call people names. I try to respect others’ views. I don’t yell. I try to stay on-topic.

Unfriending is a retreat from thoughtful discussion. It isolates you from opinions that differ from your own. Stick to your views, respect your friends’ views, and talk to them. We need more talking

People should be free to friend or unfriend whoever they like. Freedom of Speech doesn’t mean I have to read your shit (or you, mine), and it certainly doesn’t apply to the failure pile in a sadness bowl substitute for real social interaction that is Facebook.

I never unfriended anyone on Facebook (or Twitter) until November 2016, but I never had a problem with anyone unfriending me, before or after.

Nor can I relate to those who do. Personally, it’s been quite a relief when I got defriended — my haters are pruning my social network for me! This way they can spout their shit freely without me. If, by some miracle, they have an original thought about a good programming design pattern, someone will eventually point me to it through a different avenue. I use Facebook for the baby pix and death notices and Twitter for the memes.

I suggest you feel the same/similar about being defriended, because being a butthurt snowflake when someone you don’t agree with unfriends you says more about you, then it does them.

If in our social networks we can unfriend others who are useless shits to us, if we can be happy when we are unfriended when we are useless shits to them, not only we, but everyone will profit from it. This is the most basic kind of social work.

You’re welcome. Just call me the Thich Nhat Hanh of your social network.

Vagrant, Time Machine, and waiting forever for a backup

For some reason, moving to the new MacBook Air hasn’t been very successful. My Alfred spotlight is broken, Apple Mail slows to a crawl for no good reason even though everything is in the cloud, and I have a \<50% success rate of backing up my Time Machine during my workday. Basically if it doesn’t complete before lunch, it isn’t going to finish at all.

That last one seems to be well within the realm of what’s feasible. I mean why is it backing up 15GB of new files each day and why is it when I really get working the last 2GB never seems to complete? Not to mention that this 5TB drive I purchased four years ago to back up what is only a 500GB SSD (was smaller in years back) is now starting to appear full.

Well I think I figured it out. I’ve been using Vagrant for the last 5 years to build out virtual machines for development and each of them is a single (very large) virtualbox file that needs to be re-imaged every time and is constantly changing if the machine is up during the backup process.

After some research here are some suggestions on what to exclude from your time machine backups

Working scratch folders:

Things like ~/.Trash and ~/Library/Caches should automatically be excluded by Time Machine in general, but for me, I use ~/Downloads as scratch space for stuff that I don’t care if I lose. If it’s important, I usually drag that to desktop, so I added that. You can add something similar

Cloud files

I added ~/Dropbox because that stuff will be built from Dropbox, and Time Machine or migration restores will just confuse the backup system. If I used Google Drive, I’d probably add that too.

Virtual machines and other dev related environments

For me that’s ~/.vagrant.d and ~/VirtualBox VMs where vagrant downloads the boxes and where, by default, it puts the VirtualBox VMs. The actual boxes that I might image to do Windows/IE development are manually created and imaged in ~/Documents so there is no need to exclude those. If you want to keep your plugins then save ~/.vagrant.d/boxes only.

I also added ~/Library/Containers/com.docker.docker because sometimes I did Docker development and that’s where those instances are.

Also if you have a standard place where you put Python virtual environments with virtualenv you should probably add that too. I don’t develop on localhost anymore so that isn’t the case for me.

Local software caches

I added ~/.gem for Ruby and ~/.npm for NodeJS. I’d probably look into what I can torch from rbenv and rvm but I no longer do local Ruby development, but if you do, add those to your checklist.


I don’t have this on my work computer, but on my home one, I added ~/Library/Application Support Steam/steamapps because those are big files that are downloaded from the internet anyway. When I get home, I’ll have to make sure that sort of thing wasn’t moved into /Users/Shared.

Unknown unknowns

I probably should figure out where Ulysses puts its files because every time I do Migration Assistant I have unresolved conflicts which take forever to clean up. It’s not a big deal though since almost all copies are actually the same file.

Know of any other things I need to add?