Monthly Archives: October 2018

Full-stack in a fortnight

I learned how to make websites with basic HTML around 1997, plus some basic CSS not long after. I've been riding that for two decades.

No, that's not true. Sometime in the last decade I started riding Google and the Q&A on Stack Overflow to design websites instead. That's all I need.

That's not quite it either—but it feels like it. After that first wall of new skills to learn was scaled and my first sites created—most of them mercifully lost to history—everything blurred together. That interim period involved learning some PHP, SQL, JavaScript, etc. But for the most part, for my own projects, I rely on good ol' HTML and CSS, albeit sometimes put together with Python and output into a static file. Make it as simple as possible, but no simpler.

In about two weeks I'm going to help with a project that's asking for "full-stack developer" skills. I had always ignored things labeled "full-stack", assuming it was a definition for Very Serious coding people. I looked it up. Full-stack seems to only mean front-end web stuff (HTML, CSS, JavaScript) and back-end web stuff (databases, file storage, HTTP, REST). With the exception of REST, that's a list of things that I've been doing for ages. How long have I been walking past open doors?

So, the point: how do I spend two weeks congealing what I've learned through experience and supplementing the missing parts so I can be a productive member of the team or at least be able to have intelligent conversations and ask intelligent answers?

(Side point: small focused sprints like this are good opportunities to hone a system for learning things. And it's helpful to learn how the things-you-know-how-to-do actually work.)

The first, most obvious step is to steal from other people. I skimmed through the top range of Google results and this was my favorite guide: Daniel Borowski, A Guide to Becoming a Full-Stack Developer in 2017, Coderbyte (2017-04-01). There's a simple definition of what it is, broken down into components with recommendations and links to learn more about each. It's well-organized and I'm not going to improve it. My two-week plan is going to be a stripped-down version of that.

Adjusted list of components to consider:

  1. HTML
  2. CSS
  3. JavaScript (Node.js, ReactJS, AngularJS)
  4. SQL
  5. PHP
  6. HTTP
  7. REST

I'm good with 1, 2, and 4; 3, 5, and 6 are OK; 7 is shaky. Re-ordering the list for effort:

  1. Learn: REST
  2. Brush up: JavaScript, REST, PHP
  3. Skim: HTML, CSS, SQL

So out of 14 days from 1 to 14 November, considering volume, prior knowledge, and rank of importance (i.e., how much I care to know about the thing later), here's what I'm planning to do. I probably wouldn't make such a big deal about it, but if there's anyone else out there who wants to do some refresher-grade work on web development, you might want to hop on. I'll keep /now updated with what I'm working on now, and organize my notes somewhere on /ref (probably something like /ref/html, that sort of thing, but we'll sort it out later).

  1. REST - 2 days
  2. HTTP - 2 days
  3. JavaScript - 6 days
  4. SQL - 1 day
  5. HTML/CSS - 1 day
  6. PHP - 1 day

"The ashtray, the paddle game, and the remote control, and that's all I need."

St. Louis-Wuhan connection

When I was at the Cortex last week I noticed a sign on the wall listing the various sister cities of St. Louis (the list on Wikipedia). One that popped out to me was Wuhan, China. That's where my wife studied for her bachelors degree at 华中农业大学 (Central China Agricultural University). It was a nice surprise—I like to keep an eye out for those bridges.

I searched around for more information about the connection, but I haven't found much except that the connection has been there since 2004. The page on the World Trade Center St. Louis site is empty. I haven't searched much on the Chinese side yet. So I guess all we can say is that St. Louis and Wuhan are both river cities, and they both get really hot and humid in the summer. I've sent an enquiry to WTC to see if they have more info about the relationship, or if they'd like some help updating their page, but no word back so far.

I've found a bit more information about the other Chinese St.Louis sister city, Nanjing. This happens to be the first US-China sister city partnership, established in 1979, so I hope there will be some kind of celebration in 2019 to mark the 40th anniversary. That's what I got from this post about the retirement of UMSL professor Joel Glassman, who helps with the Nanjing-St. Louis committee: Jessica Rogen, Director of International Studies and Programs set to retire Nov. 1, leaving legacy of internationalization, UMSL Daily (2018-10-24).

I only started digging in last night, and I haven't been able to find much easily. Here are two other interesting articles:

I hope there's more information out there about the partnerships, or about events related to them, or at least that there's something going on that's not being posted. Either way seems like a bit of a lost opportunity. Either there's nothing or there's something but it's hidden. In 2018, for good or ill, if it doesn't exist online, does it exist? Yes—but in a limited way. I'm going to try to pitch the Nanjing-St. Louis people on a website for their activities. It should be easier than this to find out what's going on, or to find archival or reference information. And if nothing exists for Wuhan-St. Louis? We should create something.

A week in review, 2018-W43





Chef's Table, Season 2, Episode 1: Grant Achatz (2016-05-27)

Season 2 trailer:


One of Chen's partially carved pumpkins


44 degrees of why

I was listening to Tim Ferriss's podcast this week (Nick Kokonas — How to Apply World-Class Creativity to Business, Art, and Life (#341)) and there was a passage with Nick Kokonas that reminded me of some of my favorite days at work. In this passage, he's talking about starting the restaurant Alinea with Grant Achatz:

[75:17, Nick Kokonas] We started talking. We didn't even know where to start, right? He said, "Well, I know one thing. I want to have wooden tables. I want to have bare wood tables." I said, "Why?" He said, "Well why do fancy restaurants have white tablecloths? They literally call it a white tablecloth restaurant if it's fancy. Why?" I couldn't really – I came up with dumb answers. "It feels good. It absorbs a spill," or whatever it may be. He said, "No, it's because the table underneath is a piece of shit." He goes, "And you know that. As soon as you say it, everyone goes, 'Oh, yeah, I knew that.' You've been at weddings and stuff where you feel under the table and you're like, 'Oh, it's plywood.' But if you go to a really fancy restaurant and you feel under the table, guess what? Also plywood, just a little thicker."

He's like, "When you rest your arms on the table, even if it doesn't come forefront in your mind, you subconsciously know that they're fooling you." He's like, "Why can't we have black, beautiful tables? It'll show the food great. It'll show the plateware great." Then I went like, "Well, yeah, but the health department in Chicago doesn't let you put silverware right on the table." If you put a glass there, the condensation will form a little ring, and then you have a wear issue. But you'll save $70,000 a year in laundering linens. We started going, "Well how do we solve the water problem? Well, you create a fridge that's just above the dew point, 44 degrees in the winter, maybe a little warmer in the summer because it's higher humidity in Chicago, and you just get rid of ice."

You have these cascading decisions that become part of the art of the place. Some of them start from a really practical thing like, "Hey, we want to have a quality table." Then all of a sudden you need a little pillow that the silverware goes on that Martin designed, because we didn't want to have placemats; that's too cheap. All of a sudden, we had to design a silverware holder. It just became this cascade of interesting little art projects that were there for good reasons, and really created a unique atmosphere.

Why. Why why why why why.

It's a fantastic question. An annoying question. It's a kind of luxury to be able to ask "Why?" Who can ask "Why?" People with power, and people with time.

And people who aren't just satisfied that things are working, but why they are working, people who will keep digging into a problem after the people with power have asked them to stop and when it's time to leave or sleep or whatever.

When I talk to people about moving from the prototype phase of a project to the production phase of a project, I always urge them to throw away the prototype. Break it, burn it, boot it—whatever you do, don't try to turn the prototype into the production article. It is full of bad assumptions you had to make on the fly to get the prototype to just work, and those assumptions are long since forgotten, if you ever even noticed them as you made them, and sometime down the road those assumptions will make you Hurt.

There are layers of assumptions in any system. There are the assumptions you yourself made. Assumptions your team made to compromise. Assumptions your company made ten years ago on a completely different project that were written into Rules or Laws or Best Practices and, subsequently, the rationale was lost. And maybe the need for the rules is no longer necessary. Or not. It's not clear. But nobody will abandon that particular cargo cult, because what if it's working.

Only asking why can expose that. And asking why can take you past the long-accepted solution and closer to the primitive variables that you really need to solve for. On those days at work when I get to dig into some mess and ask why, why, why, stripping away the layers of junk until only the core remains—those are good, satisfying days. It's a tremendous amount of fun to break things down, see how they work, and make them work better, and include only the things in the final design that have a reason to be there.

That's why I liked listening to that interview. That part about wanting to get rid of the tablecloth and then digging into the chain of things that would happen, and then making solutions for them... yeah, that's systems engineering, being able to model how changes propagate through the system, being able to judge the functional from the junk.

The missing referent in the "we" in the quoted text is Grant Achatz. He appears in season two of Chef's Table on Netflix. Watch it— even more whys, and more irreverent ways to solve the underlying problems exposed by them.

See also: Taiichi Ohno, "Ask 'why' five times about every matter". Also: Richard Feynman: The Pleasure of Finding Things Out, BBC Two - Horizon (1981-11-23). (If you're not in the UK, watch it here.)

About the "week in review" posts

Earlier this year I started publishing a "week in review" post every week (...most weeks...). The reason was mostly just to catch things as they went by—even if there wasn't enough going on in life to LIFO everything you see and hear, the old-but-not-too-important stuff fades, and it's interesting to see it again. There's great and terrible stuff to be mined from the things you've forgotten.

Over the year though, the purpose of the week in review morphed into something else more functional. How to describe it... let's try analogies. When I started my first job, I had a bit of student loan, car loan, and credit card debt to deal with. I never really knocked it out until I set up spreadsheets to list every transaction, model future known transactions (rent, bills, etc.), and model the change in debt/assets over time. It was really tedious stuff. However, it was the tedious listing of everything that made each individual transaction matter. And over the course of two years I sloped debt down to zero, where it belongs.

Week in review posts worked similarly for the information I was consuming. Once I started posting a list of the interesting things I read, podcasts I listened to, things I wrote, etc., there was a change in what I consumed. I started looking for higher quality content, and citing the sources properly—because if I was going to tediously log each transaction, publicly, I wanted to consume and share things that I would want to put my name on. It was a total accident, but it was definitely an improvement.

PS: The process goes something like this:

  1. Discover. Subscribe to sources in Feedly. Subscribe to podcasts in Pocket Casts. Pay attention to the suggested links when I open up a blank tab in Chrome (surprisingly good choices). Read boring journal papers and follow the citations out (from the list of citations) and in (via Google Scholar). There's too much to read at once, so I store the articles in Instapaper and papers to read in CiteULike (which appears to be dying, need to find a new citation manager). I only keep the most recent episode of each subscribed podcast on my phone and have learned to gladly let the ones I miss just pass on by—it's healthier than worrying about missing out on something.
  2. Read/listen.
  3. Note. I keep notes about the interesting stuff in Evernote—if you see any green links on the site, it's going to a publicly shared note. I also push links of podcasts and articles to as I finish them.
  4. Share. Every Sunday: /category/week-in-review

Startup Talent Showcase Fall 2018

The Fall 2008 Startup Talent Showcase is on Friday (2018-10-26) at the Cortex. There's a current of innovative activity like this in St. Louis that's easy to miss if you didn't know where to look. (See also: Startup Connection, 2018-11-07.) That kind of oversight also manifests itself in the reverse direction, where the companies who are doing quite good work can't attract the people who don't know they're there. There's a panel today at Venture Cafe on the topic: Pain Points in the Tech-Talent Pipeline – Employers’ Perspectives. (Is there a shortage or not? I take a skeptical angle at these sorts of cries. But I can believe that even if a country's shortage doesn't exist, the distribution might be pushed to the edges, leaving the middle thin.)

Anyway. Let's use the company list from the event to learn a little more about the small and not-so-small companies trying to engage the entrepreneurial workforce in STL:

Company URL LinkedIn GlassDoor
1904 Labs
Agility Collective
Claim Academy
Coolfire Solutions
DOT Foods
Eaton Corporation
Final Thoughts
Influence & Co.
Ivani LLC
Lean Media
NBS Consulting
Rozzy Learning Company
Ten Peaks Partners
USA Mortgage
Venture Cafe

More info

A method for handling voting in an organization on the cheap

I think much of this is below is common sense—but maybe knowing how to manifest that common sense isn't so easy. Three organizations I work with required a reinvention of voting processes. So this post is as much for me as it is for you.

Services needed:

  • SurveyMonkey
  • Email


  1. Nominations
  2. Ballot preparation
  3. Voting
  4. Validation
  5. Announcement


The function here is easy: send an announcement—email list, Facebook, Twitter, etc.—asking for nominations. Let people nominate or self-nominate via email (a email that forwards to the voting coordinator looks Very Professional). You should already have rules in place for who can run, who can vote, and the time ranges for each step, etc., in your organization's structure.

The hard part of this step is that you should have been planting seeds with your members to become officers from Day One. You can't harvest a crop you planted last week.

Ballot preparation

I use survey software for this: SurveyMonkey. I might have used Google Forms instead, but Google Docs is blocked by many corporate firewalls.

Voter validation

The tricky part is voter validation. The first section of the ballot collects voter info that I can use to validate their vote: name, affiliation (for an alumni group, which year/program), email address (for following up the vote with an email to be sure it was that person who voted).

Nominally validation shouldn't be an issue. One thing I don't like about this solution is that it makes it possible for the voting coordinator to match voting choices to the voter. For a larger organization that has an IT staff and IT budget and user accounts, etc, a member could log into their account and vote and it would be better. But if you have to do it on the cheap, you make a solution in the garage that's Good Enough.

Ballot entries

There are a few setup details on the ballot that I think are important:

  • For each position, make the order of candidates random for each voter (to avoid first entry bias).
  • Require a vote for each position, even if that means voting for None.
  • Leave a comment box at the end for people to provide some advice to whoever becomes the next group of officers. I think it's important to catch that immediately while (a) the officers are abstract and (b) the voter is thinking about the organization.

Here's what it looks like in action: Example ballot

Here's what the setup looks like in SurveyMonkey:

Candidate profiles

Since we don't really do campaigns or live "vote for me" speeches anymore, we have to fake that a little. (Side note: I would argue that this is an example of the older, less-sophisticated way being better. And I thought I told you to get off my lawn.)

Here's an example of an email I recently sent to nominees for an election:

Hi there. Thanks again for running for an office for Organization. Here’s what we need for elections next week. We'll open the voting on Monday, so send it to me any time before then (if you're late, it still works, but you'll just have an empty profile for a bit)

  1. Contact email
  2. One biographical paragraph: your Organization affiliation; what you do at work; other things about you
  3. One candidate statement paragraph: your ideas for the position, why people should vote for you, etc.
  4. (optional) URL to some place with more info (e.g., post on your web site, LinkedIn profile, public Facebook post with more information about your candidacy), etc.

So the final profiles will look something like:
Kirk Kittell (Class of 2006)

About me: graduated in 2006, work at Company, Organization president 2009-2010, etc.
Candidate statement: I enjoy organizing groups, I want to increase Organization participation, I think we should land more alumni on asteroids, etc.

We’ll post the profiles on the Organization website and link all of the election announcements to there for people to vote. (By the way, unless you object, I'll post your email address there during the voting in case people want to ask you questions, then I'll remove it when it's all done.) For positions with more than one candidate I'll occasionally go in and adjust the order of profiles (try to remove some first-person bias). Also, I'll give you all links to where we post the election announcements, in case you want to round up people to vote.

Here's an example of the candidate profiles in action:


Share the link to the survey. Make an announcement.

(Like most things in life, the execution is far easier than the preparation for it.)

I keep track of the voting either on the SurveyMonkey website—

—or, better, on the mobile app.


As each vote comes in, I do the following validation:

  1. Compare the voter info against a database (which is sometimes an informal database, for good or ill). This is good for both proving the voter is a valid voter, and that the email is their email
  2. Email the voter and say "hey, we got your vote, but if you didn't actually vote let us know"

After the voting is completed, SurveyMonkey does the hard work of counting the votes for each position, so that part is easy. (Don't forget to close the survey so that you stop taking votes.) Then I email each of the winning candidates and ask them to confirm that they want the position.


Spread the word the same places you announced the nominations. Then hand off the organization (which is another difficult, uncared-for, prone-to-reinvention-because-there-actually-isn't-a-process thing that needs to be done).


This isn't very good as a template, but hopefully it helps someone out there who just got volunteered to run their group's elections. This should be easier than it is. (Voting by email works Good Enough otherwise.) Feel free to get in touch if you need help setting one up.

PS: The Wikipedia page for WrestleMania III is just incredibly, incredibly detailed.

A week in review, 2018-W42





二更视频, 二更 | 7根面条同时穿针孔,这种面我一口气能吃三碗!, 2017-06-14


Chen's first carved pumpkin


Notes from AI in Business

This week I attended a webinar, AI in Business: Myths, Reality, and How to Reap Value, with Philipp Gerbert from Boston Consulting Group. (I think you can still watch the video if you register.) For the most part, you could just read this and get the gist of it: Artificial Intelligence in Business Gets Real, a research report based on surveys and interviews with executives in businesses employing (or trying to employ or thinking about employing, etc.) AI.

There were two lines from the presentation that caught my ear:

  1. Do you fear that some of your tasks will be automated, or hope that some of your tasks will be automated?
  2. During this reskilling, what's the responsibility of the individual? What's the responsibility of the company? What's the responsibility of society?

The first one I understand. If the robots are coming for your job, learn how to make the robots that are coming for your job, then let them have it, and go on to do something else. The things you can automate at work are often not the things you wanted to be doing anyway.

The second one is a different variation on the question of what to do with people that are going to be displaced by AI. In the US, of course, there is a tendency toward the individual and her/his own problems to sort out. But there are multiple responsible parties in the game. If a mass of people get turned out of work (I doubt that will happen to the extent that the hype suggests), then the problems will be larger than the sum of the individuals who have them. Better to consider that before it happens.

A few other references mentioned:

Venture Cafe

I finally figured out Venture Cafe, after about two years of attending off-and-on.

Venture Cafe is a weekly mingling event in St. Louis's tech center. They use words like "collisions" and "innovators" to describe what they do, which in many contexts can be really annoying, but here it fits. It's a roughly three-hour event, with several concurrent presentations. Sometimes I'll go to the presentations, but not that often. Mostly I go to talk to people out in the halls. I do that because it's interesting to talk to people—but also because it's really hard for me. I find one-on-one or one-on-few conversations to be incredibly difficult, much harder than getting on stage in front of many. So I sometimes go to Venture Cafe to force myself to do that.

I hadn't gone for a few months, in spite of their being a monthly satellite Venture Cafe at the Danforth Plant Science Center which is walking distance from where I live. I want to go, but I don't want to go. It's easy to find excuses not to go. It's too sunny. It's too cloudy. &c.

Last week I figured out a way to hack that: the Venture Cafe organizers were looking for volunteers, especially for this week when they had a regular Tuesday Venture Cafe plus one at the Danforth plus hosting representatives from eight other Venture Cafe organizations around the world. Perfect. I jumped on that—for both events. I got to help the organization and talk to tons of people at check-in and as a bartender. Win-win.

I can't believe I never thought of that before. It's like playing a trick on myself. Whatever hangups I might have about talking to people are irrelevant because it's more or less my job to talk to them. And it doesn't matter if I get self-conscious about having to say anything about myself or what I do or what I work on because while I'm there as a volunteer what I do and what I work on is the event. It's a ludicrously simple trick. I'm sure it has analogues elsewhere. Don't step into the water slowly—dive right into it.

Venture Cafe, 2 (2018-12-13)