pc.o updates

Now that oldstable is oldoldstable, I bit the bullet and upgraded to jessie from wheezy. The upgrade process was surprisingly smooth. Systemd… well, many megabytes of flames have been written about that before. There isn’t much I can add to it other than a) the idea still disturbs me on some level b) pragmatically, it seems to work ok so far c) I have so many other things to worry about.

Since Debian just dropped a new stable version, I’ll probably upgrade to that in a while (~ a quarter or so, or whenever the first patch release drops) to give fresh bugs time to shake out.

No system capacity changes with this update. When pc.o first migrated to linode, I don’t remember for sure, but I think it was something like 512mb ram and (10? 20?) gb of disk. Now for the same price it’s 4gb of ram and 48gb of disk. The former felt a bit cramped at times, but now … I almost feel embarrassed to have so much capacity for what is fundamentally a personal fuck-around-with-shit server. I’d move to a smaller plan but it seems like a pretty big hassle potentially for a savings of maybe $10/mo.

I’m sure this is interesting to all like four or five of you who use pc.o for anything, but I felt obligated to keep the tradition of saying something about system updates alive. As always if you do use pc.o and notice something weird, let me know and I’ll try to fix it.

a brilliant tweetstorm on hiring/onboarding

@patio11 is worth following on twitter, but in particular recently he posted this tweetstorm talking about the hiring and onboarding process that really struck me as being worth a read:

If there is a talent shortage, it is of people who know how to run a hiring process like it is a business.

— Patrick McKenzie (@patio11) August 31, 2016

I know you like *your* company's hiring process, but your peers'… if your sales team executed like that, you'd fire them in two weeks.

— Patrick McKenzie (@patio11) August 31, 2016

"How many leads did you talk to today?" "I dunno." "Guess for me." "Three? Could have been four."

— Patrick McKenzie (@patio11) August 31, 2016

"What's the status of this lead?" "Oh I DQed them." "Why?" "Culture fit." "What does that mean?" "Fit. For our culture."

— Patrick McKenzie (@patio11) August 31, 2016

"When's the last time you talked to Bob?" "Yesterday." "Show me the email." *shows email from 3 weeks ago promising a callback*

— Patrick McKenzie (@patio11) August 31, 2016

"Where's sell sheet vs Google?" "Our what?" "When they're considering us and Google, what tested message do we repeat?" "I wing it, dawg."

— Patrick McKenzie (@patio11) August 31, 2016

"Suppose an engineer intros you to a warm prospect. What's next action?" "Thank them." "And then?" "I'm thinking call w/ no script or CTA."

— Patrick McKenzie (@patio11) August 31, 2016

"What's our conversion rate?" "What's that word mean?" "How many leads did we get this quarter?" "Ooh, quarter means three months."

— Patrick McKenzie (@patio11) August 31, 2016

"Describe to me how we developed our sales process." "We copied a ten year old blog post repeating Google's third-hand." "Why?" "Google's!"

— Patrick McKenzie (@patio11) August 31, 2016

"Tell me how we do lead nurturing here." "What's that?" "Even if they're not ready to take a job we send them something, right?" "Lol why."

— Patrick McKenzie (@patio11) August 31, 2016

"You still working Amy?" "Yep." "Who can know that she trusts who we can ask to talk us up to Amy?" "That's both useless and impossible."

— Patrick McKenzie (@patio11) August 31, 2016

"How's our pricing compare to competitors?" "Better than market." "I know we tell people that but is. It. True." "Why does it matter?"

— Patrick McKenzie (@patio11) August 31, 2016

"So how did that sales call go?" "I asked an engineer to take it." "… You have a plan." "He flaked. Prospect was alone for an hour." /2

— Patrick McKenzie (@patio11) August 31, 2016

"JESUS CHRIST." "What?" "How do we salvage that prospect?" "He got pissy. Poor culture fit. DQed." "How do we never do this again?" "Why?"

— Patrick McKenzie (@patio11) August 31, 2016

"How'd last call go?" "Crap lead man." "OK, so how would you rate your performance on selling?" "Oh I only do that when excited about lead."

— Patrick McKenzie (@patio11) August 31, 2016

"What's customers purchasing process look like?" "Is that a trick? They use our sales process." "… OK. What's that look like?" "Wing it!"

— Patrick McKenzie (@patio11) August 31, 2016

"Who's the leads economic buyer?" "The lead. Duh." "They make all decisions." "Of course." "They ever ask anyone for input?" "Prob no. Why?"

— Patrick McKenzie (@patio11) August 31, 2016

"What were the deals you were happiest about last year at time of close?" "X, Y, Z." "Which is best one year later?" "What do you mean?"

— Patrick McKenzie (@patio11) August 31, 2016

"Explain to me how you qualify." "I've got hard DQs and soft DQs." "Name a hard DQ." "None exist." "A soft DQ." "Lead's school is subpar."

— Patrick McKenzie (@patio11) August 31, 2016

"What's the difference between a soft DQ and a hard DQ?" "Oh, a DQ is a DQ, unless I've got a vibe." "A vibe." "You know, like passion."

— Patrick McKenzie (@patio11) August 31, 2016

"Where do we source?" "Industry standard is to buy leads from 1 provider and scrape 1 free one." "And where do WE source?" "Like I said."

— Patrick McKenzie (@patio11) August 31, 2016

"What's your job here?" "Protecting the company from bad sales." "… Explain." "One bad deal closed worse than 100 good ones missed."

— Patrick McKenzie (@patio11) August 31, 2016

"Man we lucked out on X." "Yeah." "Where'd they hear about us." "Dunno." "Freebie: it was that blog post from Bob in DevOps." "Cool." /2

— Patrick McKenzie (@patio11) August 31, 2016

"So what are you going to ask Bob in DevOps to do for us?" "I don't follow." "How can we use Bob to accomplish our goals?" "Not on our team"

— Patrick McKenzie (@patio11) August 31, 2016

"I've got good news for you: Bob is writing another post." "Cool." "What are you going to ask Bob to say in that post?" "Uh I don't DevOps."

— Patrick McKenzie (@patio11) August 31, 2016

"Why'd you DQ this lead?" "Spelling mistake in an email to me." "… Explain." "Well that says 'careless.' They know how important I am."

— Patrick McKenzie (@patio11) August 31, 2016

"Why'd you DQ this lead?" "Spelling mistake in an email to me." "… Explain." "Well that says 'careless.' They know how important I am."

— Patrick McKenzie (@patio11) August 31, 2016

"What do we have that Competitor X doesn't have?" "Culture." "Imagine you worked for X and question reversed. Answer?" "Hmm, culture."

— Patrick McKenzie (@patio11) August 31, 2016

"What's an ask you could make of any team in company that would make your sales job easier?" "Dunno." "Make one up." "We could use Ruby?" /2

— Patrick McKenzie (@patio11) August 31, 2016

"GREAT. OK, who do we have to ask internally to start using Ruby?" "Dunno." "Probably VPEng. How would we ask him to?" "Not my job to."

— Patrick McKenzie (@patio11) August 31, 2016

"What happened to Susan?" "Went with a competitor." "Which one?" "She wouldn't tell me." "… So which one?" "What so we hire private eye?"

— Patrick McKenzie (@patio11) August 31, 2016

"Susan went with a competitor." "Sucks, yeah." "So when are you following up with Susan?" "Did you not hear 'went with a competitor' boss?"

— Patrick McKenzie (@patio11) August 31, 2016

"But… what if Susan isn't happy with the competitor?" "Good. She was disloyal. No culture fit." "Why'd she owe us loyalty?" "Well DUH."

— Patrick McKenzie (@patio11) August 31, 2016

"Who out-executes us at sales?" "Competitor X." "Why?" "They're Internet famous." "What does that mean?" "They have a blog." "Do we?" "No."

— Patrick McKenzie (@patio11) August 31, 2016

"So they're out-executing us, on something important, because they have a blog." "Yeah." "So when are you starting to blog?" "I'm busy."

— Patrick McKenzie (@patio11) August 31, 2016

"Why should people join us?" "The mission!" "Who articulates the mission best?" "The CEO." "Do we have her talk to candidates?" "Lol no."

— Patrick McKenzie (@patio11) August 31, 2016

"Why not?" "Because she's the CEO and has important work to do." "OK but we have video of her talking right." "Yeah." "Do we send it?" "Why"

— Patrick McKenzie (@patio11) August 31, 2016

"Explain 'equity' to someone who has never heard it before." *does* "Explain why we use NQSOs to 10 year veteran." *same explanation*

— Patrick McKenzie (@patio11) August 31, 2016

"So you're in the biz of convincing highly mathematical individuals to trade stock for money." "Yep." "How much is our stock worth?" "Lots."

— Patrick McKenzie (@patio11) August 31, 2016

"Your answer on valuation is 'lots.'" "Well 'not lots' clearly wouldn't get it done right?"

— Patrick McKenzie (@patio11) August 31, 2016

"Could we give devs well-designed Excel spreadsheets with valuation calculators." "A good idea." "Do so." "I don't design/Excel sorry."

— Patrick McKenzie (@patio11) August 31, 2016

"You don't do design or Excel." "No." "OK, let me take another tact: who in a software company does design or Excel?" "Lol nobody."

— Patrick McKenzie (@patio11) August 31, 2016

"What we spend on outsourced lead gen last quarter?" "$0." "What do we pay recruiters?" "$25k a placement." "How many placements?" "Ten."

— Patrick McKenzie (@patio11) August 31, 2016

"OK, so imagine you had a $250k budget for making stuff." "They'd never give me a budget." "Play along. What would you make?" "Sounds risky"

— Patrick McKenzie (@patio11) August 31, 2016

"OK, I get that. Imagine its your hated rival at Competitor X. What could *they* get made for $250k?" "Dunno." "How many books/movies/apps?"

— Patrick McKenzie (@patio11) August 31, 2016

"Dunno." "What's a book cost to make?" "Dunno." "I assert it can be done for $50k." "Sounds unlikely." "Can you turn book into candidates?"

— Patrick McKenzie (@patio11) August 31, 2016

"I can't imagine devs read books." "OK, do they use websites?" "Yeah." "Can you get a website made?" "We have a jobs page." "Think bigger."

— Patrick McKenzie (@patio11) August 31, 2016

"Bigger than a jobs page?" "Yeah." "Like, a jobs *listing* page?" "Like something that an engineer outside our company would enjoy using."

— Patrick McKenzie (@patio11) August 31, 2016

"I don't know, that sounds like a Project." "Ever asked any dev in this company what they did over a weekend?" "Apps or some shit I dunno."

— Patrick McKenzie (@patio11) August 31, 2016

"Could your hated rival, with $250k, possibly cause an app that devs would use to exist?" "Buy dev time? Lol. Impossible right."

— Patrick McKenzie (@patio11) August 31, 2016

As the CEO of a company dedicated to improving the technical hiring process, he is to some degree talking his own book here, but his points are incredibly valid. Hiring is fundamentally a sales process, and yet at most companies it is run by people who do not understand that (or, typically, anything about the roles they’re trying to fill, but that’s a rant for a different day).

saying no

One of the harder things I’ve had to do since taking on leadership roles is learn how to say no. This doesn’t seem like it would be hard, but trust me, if you’ve lived a life of wanting to say yes (to make someone happy, to make something new, etc.) it isn’t easy. Saying no comes in many more forms than simply “no.” itself. Maybe you have to tell someone that what they did is not acceptable work (“This is not good, and here is why: …”). Maybe you have to tell someone that the plan they’ve come up with is unrealistic (“We don’t have the resources to do that, and what you want is not higher priority than any of the N things we are doing now.”). Maybe you have to tell a customer that no, what they want not being part of the product is not a defect but rather a request for custom work that will cost extra.

Maybe you have to tell someone that no, they no longer have a job on your team, effective immediately. The person who can do that without losing sleep the night before is not someone I’d like to meet. I’m thankful that I haven’t yet had to cross that managerial Rubicon, though I have come close a few times.

But there’s a reason that economics is called the dismal science; its conclusions are as inescapable as they are uncomfortable at times. When you operate in the real world of resource constraints, where time is not unlimited, budgets are not infinite, and you have finite staff, your choices are always on some level OR, not AND. OR means that for every X you say yes to, there are N >= 1 Ys that you must say no to. (OK, to satisfy the pedantry brigade preemptively technically this is XOR not OR, but you lot can go back to reading assembly language manuals now.) That you don’t have a choice about saying no in some way doesn’t make the process feel any better; loss aversion is a powerful thing when what you are losing is the potential of having said yes to something. I can only hope that with practice I’ve gotten better about doing it both more efficiently and more politely.

parenthood and life since 2013

Not that I was doing a great job of keeping this blog updated to begin with, but the birth of our youngest in 2013 essentially turned over every apple cart in our lives. :) It’s odd how parenthood changes you very little in some ways (your eyes still open the next morning and you are still you, provided your name isn’t Gregor Samsa), but completely changes everything in your life at the same time. Perhaps marriage is the same thing, it is on some level whatever you dedicate yourself to putting into it. While I am reluctant to make generalizations about an experience as varied as the human race itself, I feel safe asserting that it is one of the life events which have a clear demarcation of Before and After, regardless of what a person’s particular lived experience might be under that top-level heading. As we’re expecting our second later this year, this blog will probably return to deep hibernation until early 2017.

For myself, I find my life is filled at once with more worries and more hope. I worry every day about whether I’m doing the best thing I can for my family, but at the same time I see our youngest growing and learning and squealing with glee for the joy of being alive (“What’s this? A ‘dog’? DOGS ARE AWESOME!”), and I have hope that things will be OK. I don’t think anything could have possibly prepared me beforehand for the tsunamis of emotion I’ve felt being a parent.

On other fronts, I have a new job leading up the technical organization for the enterprise code/document review platform, Collaborator, made by SmartBear Software. We’ve certainly undergone quite a bit of organizational turmoil since I started in the fall of 2013 (~70% layoff in the spring of 2014, for starters), but we’re still shipping on a relatively regular release schedule, delivering new things to our customers, and all things considered doing much better than I had expected on some of the darkest early days. Being the-buck-stops-here for dev, docs, ops, qa and interfacing with marketing and sales is enough to keep any three people busy and it’s all on my plate. I probably shouldn’t even be writing this but I’m waiting for a really long build process to finish.

With parenting and a very full dance card at work, I haven’t much to share from an academic standpoint. I took a Coursera course on Automata taught by Ullman at Stanford and did well enough to get a pass certificate, for whatever that’s worth, and made an A in Algorithm Analysis from Oregon State’s eCampus (<3 online programs, for all their flaws). I think I presently have the minimal set of pre-reqs to apply to most graduate programs (maybe modulo an upper-level hardware class, depending on the school), but haven't made any real steps in that direction as it seems foolish to embark on that until the second child is at least into toddlerhood.

pc.o updates

For those of you that use services on perilouscodpiece.org, there’ve been some updates:

  • Debian 6 -> 7 OS upgrade
  • Disk space doubled, to ~40gb
  • WordPress and TT-RSS updated to latest revisions

As always, please let me know if you see odd or unexpected behavior. For those of you that don’t use pc.o, if you’re interested let me know; I’m generally pretty open to friends using the machine.

ditching google reader

I’m a huge fan of google reader for keeping up with news (not just headlines a la NYT; it’s also incredibly handy to consolidate security update notices). Unfortunately, they’re spinning it down on July 1st of this year (if somehow you haven’t paid attention to the internets at all this week). Perhaps the best tense to use then is that I was a google reader fan.

Having a cloud-based solution is nice, and there are a few out there that offer RSS/Atom/etc. aggregation as a service (I’ve heard about Feedly a fair amount, for example). Since I already have a host, though, and a fair amount of willingness to wrench on things if need be, I thought I’d look into running my own web-based feed viewer. Two options jumped out immediately, Selfoss and Tiny Tiny RSS (aka tt-rss). Notably, both support OPML import so that it is not difficult to get your feeds imported from Google.

Selfoss is probably the simpler of the two, and has had more attention paid to visual design. I noticed that as it stood, the project supported mysql and sqlite as storage engines. So I forked it on github, worked in a first cut at postgresql support, and sent the author a pull request. It’s the first time I can recall doing that via github, and he sent me a nice note thanking me for the additional DB engine support after he merged it in. It’s a good feeling to contribute to something! Selfoss is pretty cool in that by design it would allow you to aggregate more than RSS/Atom (e.g. I saw IMAP support), and adding more “spouts” (source types) looked fairly modular. The drawback, in as much as it is one, is that the system presently only seems to support single user mode. You may also have to do some fiddling with .htaccess and similar to get it stood up. But if you have a reasonable amount of savvy and want something for yourself alone, it’s a decent option.

TT-RSS is a larger and more complicated beast that is a bit more plain in design, but it is also more feature-ful. Postgres is supported out of the box, and there is an Android client that can sync with your tt-rss install as well. The big selling point is that it supports multi-user mode. I have an install of it working on this host; if you are a fellow greader refugee and want to give it a spin let me know. My only real gripe with it at the moment is that it presents a three-pane interface (at least by default, I have not looked too hard into changing it) similar to Outlook Web Access if you’ve used that. I’d prefer a more consolidated two-pane layout (similar to greader) but I’ll live. I probably spend more time reading RSS et al. via my phone anyway, and the Android client is nice. Note that if you wish to use it with a tt-rss install, you have to set the external API access preference in your user preferences to true.

All of this does make me think about what it would take to replace google entirely with things I host. Mail is not an issue. Calendaring is something that I probably could figure out, but haven’t felt the need to just yet (maybe I ought to, if this trend continues). Reader is already replaced. GDocs, or Drive, or whatever they’re calling it this week would be hard to replace in the sense of seamless concurrent editing, but it’s not like LibreOffice+git/svn or a wiki couldn’t serve in a pinch. Search and maps seem like the real boogers to replace with entirely self-sufficient infrastructure. If it came to it, I suppose a standalone GPS device would serve for most of what I need maps for, or I could look into OpenStreetMaps I guess (similarly to what Craigslist has done). Search is something that would be hard to replace as an individual simply due to the storage requirements of the data involved in a whole-web crawl I imagine. The tools are there with something like Nutch, but… yikes. I’ll likely continue to use Google products when they are convenient, and will have to hope they don’t decide to axe anything else I use routinely.

another semi-annual update, heh

The big news is that Kirsti and I are expecting our first child in August of this year. :D Getting to where we are now and guaranteeing that our child won’t have to deal with the genetic condition that I carry has been quite a story, a far more lengthy one than probably serves to tell in a random blog post. It’s been a real roller coaster, but things are smooth now and we’re both terribly excited for August to arrive. Getting a reasonable (not too big, not too small) tax refund this year courtesy of work-related courses being tax advantaged has helped considerably to defray some of the start up expenses of having a kid.

Compilers last fall was crazy awesome. Great professor, exciting material, ended up doing very well. My only regret is that we didn’t get farther into things like implementing GC, interpreters, VMs, etc. I guess that’s what an advanced or graduate course would serve for. Operating systems this spring is a little less enthralling. I’m still enjoying learning new things, but the book isn’t quite as good and the professor has never taught a course before. So far I’m doing well regardless, but I also haven’t had many grades come back yet so I’m not counting my chickens just yet.

Kirsti is working as an adjunct professor at the local community college, teaching two classes. Thankfully the commute is trivial, less than a mile, and her pay will serve to cover her dissertation tuition for the fall and spring as she will likely not be working. Her students sound like the usual mix; some are promising and some … are special. Naturally due to the applicable regulations I don’t know personal details about the kids in question, but some suitably anonymous stories are too ridiculous not to share I suppose. The one who thought continental drift was responsible for climate changes during human history was noteworthy.

I’m tackling a new project at work which is fairly interesting; it almost reminds me of the java I was working on for the ibank back in the day, but in a completely different domain and using a fairly radically different technology stack (Akka, Play, etc. vs. J2EE). I’ve also been learning a bit about Hadoop and its related ecosystem with a possible eye towards offering that as a service from our consultancy as well, which is pretty awesome. Sometimes I feel like there’s just not enough hours in the day to cram everything I want to learn into my head, but I realize that as problems go, that’s a good one to have.

semi-annual update, heh

I seem to be badly neglecting this blog. Mostly I’ve been posting random short things on facebook or twitter (mostly fb); it’s been such a busy year that I haven’t really had time to think up anything longer form that would go here. I’m afraid this update might be pretty boring too. :) Since January, eh… work is about the same. Kirsti passed her PhD comprehensive exams so she is now effectively done with everything except the dissertation. I’ve made two more As, one in computer organization (low-level programming, basically) this spring and one in programming languages (design, theory, etc.) this summer; really looking forward to compiler design this fall and the second part of the Roughgarden-taught algorithms course on Coursera (oh, made a 90% in the first part of that one too, in as much as that counts as grade). We moved to a new place in Columbia, MD that is nicer than our old apartment in almost every conceivable way; the only downside is that the hot water heater is smaller so the shower goes cold faster than I’d like.

wordpress admin note: w3 total cache and wordpress update process

I’m not 100% sure it’s the root cause, but it seems like having the W3 Total Cache plugin enabled messes with upgrades to 3.3/3.3.1. At least, when I had it enabled upgrades would present a blank screen in the admin UI, and disabling it allowed them to proceed as normal. (On the whole I am happy with W3TC for performance reasons; this host is a fairly small Xen-hosted virtualized environment so it’s not the brawniest machine ever.)

developer half-life

“Developer half-life” is a rough term for how long, on average, it takes for someone at that company to burn out and quit (technically, for the quit-rate for a given cohort to be 50%). It’s possible to get salary data from places like glassdoor, salary.com, etc. but sometimes I wish there was a way to get this metric too. During my tenure at NYTD it seemed like the senior engineering people tended to last two, maybe three years before moving on to greener, less stressful pastures. I made it to about two and a half years. Some shops it’s more, some places it’s less, but it seems there are constants of organizational behavior that are relatively invariant and add up to a “fuck you, I’m out” at predictable intervals for everyone in a given cohort. Like radioactive decay, it’s a random process that still has a certain mechanistic predictability to it in aggregate (really hoping I’m remembering the science right there; it’s been a long time). I sometimes wonder what it might be like to work at a place where people reach “escape velocity” and orbit forever without tracing an eventual bright trail back down the gravity well of demoralization.

(I should footnote here that I’m reasonably happy with my current gig. The only thing that bugs me about the company doesn’t have much to do with them, just that we’re in a soulless office park with no particularly good lunch options around. On the other hand, I’ll take “management I don’t want to throw off the 8th floor” over “the cafeteria serves excellent sushi” any day of the week.)

Conversely, as engineering management, it pays huge dividends to keep an eye on your average tenure because recruiters are screamingly expensive and finding good people is hard — all the moreso if you have a reputation (*cough* Zynga. EA. ShitiGroup.) for being a meatgrinder for technical talent — to say nothing of the harder to quantify long-term benefits of organization continuity. I haven’t progressed far enough up the ladder to be managing managers yet, but if/when I do, you can bet I’ll notice if turnover under manager A is 0% for a given year and 60% for manager B.