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.

Codermetrics sounds like old bullshit in new form

So O’Reilly is publishing a new book, called Codermetrics. The sample first chapter is linked from the product page there. I read over that and some initial thoughts made their way into irc:

 3:08 PM < volkadav> haha so there's some new oreilly 
book called Codermetrics
 3:08 PM < volkadav> which appears to be some sort of 
"we can track and quantify people and yay!!!" for the 
manager set
 3:08 PM < volkadav> i read the first chapter online 
(sample via ora's website)
 3:09 PM < volkadav> it's depressing how well it fits 
into the stereotypes i have of idiot frat boy managers
 3:09 PM < volkadav> a) lots of sports analogies
 3:09 PM <@BSDCat> stop.
 3:09 PM < volkadav> b) desperate attempts to 
quantify the unquantifiable
 3:09 PM <@BSDCat> oh please let there not be more 
than a+b
 3:10 PM < volkadav> c) main example [given in the 
first chapter] is of a team that had a series of serious 
setbacks so OF COURSE it's the fault of the two junior 
members who quit after the first year
 3:10 PM < volkadav> with METRICS and NUMBERS to prove
it couldn't POSSIBLY be management's fault
 3:10 PM < volkadav> HURRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRR
RRRRRRRRRRRRRRRR
 3:11 PM < volkadav> sigh.
 3:11 PM < volkadav> i mean, yes, sure it's great that
you hired people better able to answer their own questions
 3:12 PM < volkadav> buuuuut i doubt two junior people
on a team of six+ could have run the whole thing off the 
rails by themselves, brah!
 3:12 PM < volkadav> it's like every generation has to 
discover for themselves that "Scientific Management" is and
ALWAYS HAS BEEN complete and total BULLSHIT 

[Seriously, Taylor’s methods were deeply flawed to the point of it being fraudulent to even call them science. Go read up on this stuff because it expands beyond my desire to replicate here. Then cry yourself to sleep because that egregious codswallop has been cited thousands of times in scholarly works and is the basis for a lot of so-called modern management.]

Then I got off on another rant about the differences between leadership and management that probably deserves a longer blog post at a later date. Suffice to say “frantic casting about for simple measuring tools, however desperately flawed” is a perfect hallmark of a pure-strain Manager woefully unsuited to leading human beings in any ultimately productive enterprise.

“You lead people, you manage things.” ~ Grace Hopper

Logitech Quickcam 3000 For Business, PulseAudio, and Skype (Ubuntu 11.04 x86-64)

After fighting with various parts of ALSA, PulseAudio, Skype and so forth trying to figure out why my webcam microphone wasn’t picking up any sound when trying to make test calls, I finally figured out the answer: when PulseAudio’s mixer for the input level on this is 100%, the device is actually muted (the why of that I haven’t gotten around to figuring out). If you leave the “Allow Skype to automatically adjust my mixer levels” box checked in the sound devices dialog of its options pane, it will set the input level to 100%, hence muting the mic.

To restore (or enable) sound recording, all you have to do is open up PulseAudio’s settings to set the input level on the webcam’s microphone to something less than 100% and make sure the checkbox mentioned above is unchecked/disabled. How you get to your PulseAudio configs may vary by distribution; there is a shortcut to them on the Skype preference pane and you can bring up the dialog from the command line by entering “pavucontrol”. The microphone settings will be on the “Input Devices” tab, and the mixer level for the webcam mic is the slider located in that device entry.